From 9399c662f36c385b0c705eb34e636a9aec450282 Mon Sep 17 00:00:00 2001 From: Jens-Heiner Rechtien Date: Mon, 18 Sep 2000 14:18:43 +0000 Subject: initial import --- registry/inc/registry/reflread.hxx | 499 ++++ registry/inc/registry/refltype.hxx | 266 ++ registry/inc/registry/reflwrit.hxx | 422 +++ registry/inc/registry/registry.h | 456 +++ registry/inc/registry/registry.hxx | 1220 ++++++++ registry/inc/registry/regtype.h | 185 ++ registry/prj/d.lst | 20 + registry/source/keyimpl.cxx | 1260 ++++++++ registry/source/keyimpl.hxx | 215 ++ registry/source/makefile.mk | 97 + registry/source/reflcnst.hxx | 268 ++ registry/source/reflread.cxx | 1602 ++++++++++ registry/source/reflwrit.cxx | 1452 ++++++++++ registry/source/regimpl.cxx | 2172 ++++++++++++++ registry/source/regimpl.hxx | 266 ++ registry/source/registry.cxx | 793 +++++ registry/source/regkey.cxx | 1298 +++++++++ registry/source/regmap.hxx | 117 + registry/test/makefile.mk | 133 + registry/test/testmerge.cxx | 492 ++++ registry/test/testregcpp.cxx | 738 +++++ registry/tools/makefile.mk | 111 + registry/tools/regmerge.cxx | 217 ++ registry/tools/regview.cxx | 144 + registry/util/makefile.mk | 199 ++ registry/version.mk | 74 + registry/workben/makefile.mk | 134 + registry/workben/regspeed.cxx | 307 ++ registry/workben/regtest.cxx | 376 +++ registry/workben/test.cxx | 85 + sal/inc/osl/conditn.h | 127 + sal/inc/osl/conditn.hxx | 145 + sal/inc/osl/diagnose.h | 163 ++ sal/inc/osl/file.h | 1066 +++++++ sal/inc/osl/file.hxx | 1408 +++++++++ sal/inc/osl/interlck.h | 93 + sal/inc/osl/module.h | 165 ++ sal/inc/osl/mutex.h | 145 + sal/inc/osl/mutex.hxx | 232 ++ sal/inc/osl/pipe.h | 148 + sal/inc/osl/process.h | 375 +++ sal/inc/osl/profile.h | 205 ++ sal/inc/osl/profile.hxx | 276 ++ sal/inc/osl/security.h | 263 ++ sal/inc/osl/semaphor.h | 146 + sal/inc/osl/semaphor.hxx | 152 + sal/inc/osl/signal.h | 182 ++ sal/inc/osl/socket.h | 1001 +++++++ sal/inc/osl/thread.h | 329 +++ sal/inc/osl/time.h | 212 ++ sal/inc/osl/util.h | 130 + sal/inc/rtl/alloc.h | 116 + sal/inc/rtl/byteseq.h | 330 +++ sal/inc/rtl/byteseq.hxx | 155 + sal/inc/rtl/cipher.h | 275 ++ sal/inc/rtl/crc.h | 100 + sal/inc/rtl/digest.h | 224 ++ sal/inc/rtl/locale.h | 182 ++ sal/inc/rtl/locale.hxx | 316 ++ sal/inc/rtl/memory.h | 87 + sal/inc/rtl/process.h | 89 + sal/inc/rtl/random.h | 139 + sal/inc/rtl/strbuf.h | 152 + sal/inc/rtl/strbuf.hxx | 682 +++++ sal/inc/rtl/string.h | 588 ++++ sal/inc/rtl/string.hxx | 827 ++++++ sal/inc/rtl/tencinfo.h | 166 ++ sal/inc/rtl/textcvt.h | 174 ++ sal/inc/rtl/textenc.h | 274 ++ sal/inc/rtl/ustrbuf.h | 176 ++ sal/inc/rtl/ustrbuf.hxx | 736 +++++ sal/inc/rtl/ustring.h | 717 +++++ sal/inc/rtl/ustring.hxx | 140 + sal/inc/rtl/uuid.h | 231 ++ sal/inc/sal/config.h | 124 + sal/inc/sal/types.h | 225 ++ sal/inc/systools/win32/StrConvert.h | 80 + sal/inc/systools/win32/advapi9x.h | 198 ++ sal/inc/systools/win32/comdlg9x.h | 102 + sal/inc/systools/win32/kernel9x.h | 205 ++ sal/inc/systools/win32/shell9x.h | 122 + sal/inc/systools/win32/user9x.h | 132 + sal/osl/all/makefile.mk | 115 + sal/osl/os2/conditn.c | 157 + sal/osl/os2/diagnose.c | 155 + sal/osl/os2/dllentry.c | 109 + sal/osl/os2/interlck.c | 95 + sal/osl/os2/makefile.mk | 165 ++ sal/osl/os2/module.c | 125 + sal/osl/os2/mutex.c | 142 + sal/osl/os2/process.c | 1320 +++++++++ sal/osl/os2/procimpl.h | 86 + sal/osl/os2/profile.c | 1872 ++++++++++++ sal/osl/os2/secimpl.h | 96 + sal/osl/os2/security.c | 371 +++ sal/osl/os2/semaphor.c | 218 ++ sal/osl/os2/signal.c | 272 ++ sal/osl/os2/socket.c | 68 + sal/osl/os2/sockimpl.h | 101 + sal/osl/os2/system.h | 147 + sal/osl/os2/thread.c | 702 +++++ sal/osl/os2/time.c | 90 + sal/osl/os2/util.c | 76 + sal/osl/unx/conditn.c | 394 +++ sal/osl/unx/diagnose.c | 133 + sal/osl/unx/interlck.c | 97 + sal/osl/unx/makefile.mk | 151 + sal/osl/unx/module.c | 875 ++++++ sal/osl/unx/mutex.c | 326 +++ sal/osl/unx/pipe.c | 530 ++++ sal/osl/unx/process.c | 2483 ++++++++++++++++ sal/osl/unx/procimpl.h | 84 + sal/osl/unx/profile.c | 2896 +++++++++++++++++++ sal/osl/unx/secimpl.h | 84 + sal/osl/unx/security.c | 1101 +++++++ sal/osl/unx/semaphor.c | 360 +++ sal/osl/unx/signal.c | 490 ++++ sal/osl/unx/socket.c | 2795 ++++++++++++++++++ sal/osl/unx/sockimpl.h | 87 + sal/osl/unx/system.c | 454 +++ sal/osl/unx/system.h | 555 ++++ sal/osl/unx/thread.c | 1073 +++++++ sal/osl/unx/time.c | 234 ++ sal/osl/unx/util.c | 323 +++ sal/osl/w32/MAKEFILE.MK | 117 + sal/osl/w32/conditn.c | 173 ++ sal/osl/w32/diagnose.c | 155 + sal/osl/w32/dllentry.c | 224 ++ sal/osl/w32/interlck.c | 144 + sal/osl/w32/libutil.c | 94 + sal/osl/w32/module.c | 187 ++ sal/osl/w32/mutex.c | 261 ++ sal/osl/w32/pipe.c | 1063 +++++++ sal/osl/w32/process.c | 918 ++++++ sal/osl/w32/procimpl.h | 100 + sal/osl/w32/profile.c | 3019 +++++++++++++++++++ sal/osl/w32/secimpl.h | 116 + sal/osl/w32/security.c | 1155 ++++++++ sal/osl/w32/semaphor.c | 196 ++ sal/osl/w32/signal.c | 323 +++ sal/osl/w32/sockimpl.h | 168 ++ sal/osl/w32/system.h | 159 + sal/osl/w32/thread.c | 820 ++++++ sal/osl/w32/time.c | 256 ++ sal/osl/w32/util.c | 94 + sal/prj/d.lst | 42 + sal/rtl/source/alloc.c | 187 ++ sal/rtl/source/byteseq.c | 263 ++ sal/rtl/source/cipher.c | 1177 ++++++++ sal/rtl/source/crc.c | 203 ++ sal/rtl/source/digest.c | 1464 ++++++++++ sal/rtl/source/locale.c | 367 +++ sal/rtl/source/makefile.mk | 131 + sal/rtl/source/memory.c | 124 + sal/rtl/source/random.c | 383 +++ sal/rtl/source/rtl_process.c | 83 + sal/rtl/source/strbuf.c | 192 ++ sal/rtl/source/string.c | 1015 +++++++ sal/rtl/source/ustrbuf.c | 234 ++ sal/rtl/source/ustring.c | 1774 ++++++++++++ sal/test/makefile.mk | 123 + sal/textenc/makefile.mk | 98 + sal/textenc/tcvtarb1.tab | 1078 +++++++ sal/textenc/tcvtbyte.c | 407 +++ sal/textenc/tcvteas1.tab | 353 +++ sal/textenc/tcvtest1.tab | 4862 +++++++++++++++++++++++++++++++ sal/textenc/tcvtjp1.tab | 1590 ++++++++++ sal/textenc/tcvtjp2.tab | 3961 +++++++++++++++++++++++++ sal/textenc/tcvtjp3.tab | 2921 +++++++++++++++++++ sal/textenc/tcvtjp4.tab | 3548 +++++++++++++++++++++++ sal/textenc/tcvtjp5.tab | 3384 ++++++++++++++++++++++ sal/textenc/tcvtjp6.tab | 2769 ++++++++++++++++++ sal/textenc/tcvtkr1.tab | 3344 +++++++++++++++++++++ sal/textenc/tcvtkr2.tab | 5449 +++++++++++++++++++++++++++++++++++ sal/textenc/tcvtkr4.tab | 71 + sal/textenc/tcvtkr5.tab | 71 + sal/textenc/tcvtkr6.tab | 708 +++++ sal/textenc/tcvtlat1.tab | 2130 ++++++++++++++ sal/textenc/tcvtmb.c | 745 +++++ sal/textenc/tcvtscn1.tab | 3884 +++++++++++++++++++++++++ sal/textenc/tcvtscn2.tab | 4205 +++++++++++++++++++++++++++ sal/textenc/tcvtscn3.tab | 1536 ++++++++++ sal/textenc/tcvtscn4.tab | 3104 ++++++++++++++++++++ sal/textenc/tcvtscn5.tab | 3269 +++++++++++++++++++++ sal/textenc/tcvtscn6.tab | 2994 +++++++++++++++++++ sal/textenc/tcvtsym1.tab | 108 + sal/textenc/tcvttcn1.tab | 2926 +++++++++++++++++++ sal/textenc/tcvttcn2.tab | 3749 ++++++++++++++++++++++++ sal/textenc/tcvttcn6.tab | 1819 ++++++++++++ sal/textenc/tcvtuni1.tab | 159 + sal/textenc/tcvtutf7.c | 622 ++++ sal/textenc/tcvtutf8.c | 433 +++ sal/textenc/tenchelp.c | 732 +++++ sal/textenc/tenchelp.h | 366 +++ sal/textenc/tencinfo.c | 972 +++++++ sal/textenc/textcvt.c | 301 ++ sal/unosdk.mk | 82 + sal/util/makefile.mk | 229 ++ sal/version.mk | 75 + sal/workben/makefile.mk | 288 ++ sal/workben/t_cipher.c | 309 ++ sal/workben/t_digest.c | 279 ++ sal/workben/t_layer.c | 353 +++ sal/workben/t_random.c | 99 + sal/workben/t_tls.c | 301 ++ sal/workben/t_zip.c | 223 ++ sal/workben/test.cxx | 103 + sal/workben/testfile.cxx | 2816 ++++++++++++++++++ sal/workben/testpip2.cxx | 128 + sal/workben/testpipe.cxx | 199 ++ sal/workben/testproc.cxx | 108 + sal/workben/tgetpwnam.cxx | 279 ++ store/inc/store/filelckb.hxx | 209 ++ store/inc/store/lockbyte.hxx | 169 ++ store/inc/store/memlckb.hxx | 197 ++ store/inc/store/object.hxx | 118 + store/inc/store/store.h | 377 +++ store/inc/store/store.hxx | 267 ++ store/inc/store/store.inl | 472 +++ store/inc/store/types.h | 194 ++ store/prj/d.lst | 8 + store/source/filelckb.cxx | 936 ++++++ store/source/makefile.mk | 107 + store/source/memlckb.cxx | 396 +++ store/source/object.cxx | 103 + store/source/storbase.cxx | 1944 +++++++++++++ store/source/storbase.hxx | 916 ++++++ store/source/storcach.cxx | 696 +++++ store/source/storcach.hxx | 231 ++ store/source/stordata.cxx | 1754 +++++++++++ store/source/stordata.hxx | 934 ++++++ store/source/store.cxx | 817 ++++++ store/source/storlckb.cxx | 872 ++++++ store/source/storlckb.hxx | 296 ++ store/source/storpage.cxx | 1562 ++++++++++ store/source/storpage.hxx | 276 ++ store/source/stortree.cxx | 608 ++++ store/source/stortree.hxx | 451 +++ store/util/makefile.mk | 113 + store/util/sto.dxp | 25 + store/util/sto.map | 30 + store/version.mk | 75 + store/workben/makefile.mk | 135 + store/workben/t_base.cxx | 376 +++ store/workben/t_file.cxx | 166 ++ store/workben/t_store.cxx | 634 ++++ 246 files changed, 161159 insertions(+) create mode 100644 registry/inc/registry/reflread.hxx create mode 100644 registry/inc/registry/refltype.hxx create mode 100644 registry/inc/registry/reflwrit.hxx create mode 100644 registry/inc/registry/registry.h create mode 100644 registry/inc/registry/registry.hxx create mode 100644 registry/inc/registry/regtype.h create mode 100644 registry/prj/d.lst create mode 100644 registry/source/keyimpl.cxx create mode 100644 registry/source/keyimpl.hxx create mode 100644 registry/source/makefile.mk create mode 100644 registry/source/reflcnst.hxx create mode 100644 registry/source/reflread.cxx create mode 100644 registry/source/reflwrit.cxx create mode 100644 registry/source/regimpl.cxx create mode 100644 registry/source/regimpl.hxx create mode 100644 registry/source/registry.cxx create mode 100644 registry/source/regkey.cxx create mode 100644 registry/source/regmap.hxx create mode 100644 registry/test/makefile.mk create mode 100644 registry/test/testmerge.cxx create mode 100644 registry/test/testregcpp.cxx create mode 100644 registry/tools/makefile.mk create mode 100644 registry/tools/regmerge.cxx create mode 100644 registry/tools/regview.cxx create mode 100644 registry/util/makefile.mk create mode 100644 registry/version.mk create mode 100644 registry/workben/makefile.mk create mode 100644 registry/workben/regspeed.cxx create mode 100644 registry/workben/regtest.cxx create mode 100644 registry/workben/test.cxx create mode 100644 sal/inc/osl/conditn.h create mode 100644 sal/inc/osl/conditn.hxx create mode 100644 sal/inc/osl/diagnose.h create mode 100644 sal/inc/osl/file.h create mode 100644 sal/inc/osl/file.hxx create mode 100644 sal/inc/osl/interlck.h create mode 100644 sal/inc/osl/module.h create mode 100644 sal/inc/osl/mutex.h create mode 100644 sal/inc/osl/mutex.hxx create mode 100644 sal/inc/osl/pipe.h create mode 100644 sal/inc/osl/process.h create mode 100644 sal/inc/osl/profile.h create mode 100644 sal/inc/osl/profile.hxx create mode 100644 sal/inc/osl/security.h create mode 100644 sal/inc/osl/semaphor.h create mode 100644 sal/inc/osl/semaphor.hxx create mode 100644 sal/inc/osl/signal.h create mode 100644 sal/inc/osl/socket.h create mode 100644 sal/inc/osl/thread.h create mode 100644 sal/inc/osl/time.h create mode 100644 sal/inc/osl/util.h create mode 100644 sal/inc/rtl/alloc.h create mode 100644 sal/inc/rtl/byteseq.h create mode 100644 sal/inc/rtl/byteseq.hxx create mode 100644 sal/inc/rtl/cipher.h create mode 100644 sal/inc/rtl/crc.h create mode 100644 sal/inc/rtl/digest.h create mode 100644 sal/inc/rtl/locale.h create mode 100644 sal/inc/rtl/locale.hxx create mode 100644 sal/inc/rtl/memory.h create mode 100644 sal/inc/rtl/process.h create mode 100644 sal/inc/rtl/random.h create mode 100644 sal/inc/rtl/strbuf.h create mode 100644 sal/inc/rtl/strbuf.hxx create mode 100644 sal/inc/rtl/string.h create mode 100644 sal/inc/rtl/string.hxx create mode 100644 sal/inc/rtl/tencinfo.h create mode 100644 sal/inc/rtl/textcvt.h create mode 100644 sal/inc/rtl/textenc.h create mode 100644 sal/inc/rtl/ustrbuf.h create mode 100644 sal/inc/rtl/ustrbuf.hxx create mode 100644 sal/inc/rtl/ustring.h create mode 100644 sal/inc/rtl/ustring.hxx create mode 100644 sal/inc/rtl/uuid.h create mode 100644 sal/inc/sal/config.h create mode 100644 sal/inc/sal/types.h create mode 100644 sal/inc/systools/win32/StrConvert.h create mode 100644 sal/inc/systools/win32/advapi9x.h create mode 100644 sal/inc/systools/win32/comdlg9x.h create mode 100644 sal/inc/systools/win32/kernel9x.h create mode 100644 sal/inc/systools/win32/shell9x.h create mode 100644 sal/inc/systools/win32/user9x.h create mode 100644 sal/osl/all/makefile.mk create mode 100644 sal/osl/os2/conditn.c create mode 100644 sal/osl/os2/diagnose.c create mode 100644 sal/osl/os2/dllentry.c create mode 100644 sal/osl/os2/interlck.c create mode 100644 sal/osl/os2/makefile.mk create mode 100644 sal/osl/os2/module.c create mode 100644 sal/osl/os2/mutex.c create mode 100644 sal/osl/os2/process.c create mode 100644 sal/osl/os2/procimpl.h create mode 100644 sal/osl/os2/profile.c create mode 100644 sal/osl/os2/secimpl.h create mode 100644 sal/osl/os2/security.c create mode 100644 sal/osl/os2/semaphor.c create mode 100644 sal/osl/os2/signal.c create mode 100644 sal/osl/os2/socket.c create mode 100644 sal/osl/os2/sockimpl.h create mode 100644 sal/osl/os2/system.h create mode 100644 sal/osl/os2/thread.c create mode 100644 sal/osl/os2/time.c create mode 100644 sal/osl/os2/util.c create mode 100644 sal/osl/unx/conditn.c create mode 100644 sal/osl/unx/diagnose.c create mode 100644 sal/osl/unx/interlck.c create mode 100644 sal/osl/unx/makefile.mk create mode 100644 sal/osl/unx/module.c create mode 100644 sal/osl/unx/mutex.c create mode 100644 sal/osl/unx/pipe.c create mode 100644 sal/osl/unx/process.c create mode 100644 sal/osl/unx/procimpl.h create mode 100644 sal/osl/unx/profile.c create mode 100644 sal/osl/unx/secimpl.h create mode 100644 sal/osl/unx/security.c create mode 100644 sal/osl/unx/semaphor.c create mode 100644 sal/osl/unx/signal.c create mode 100644 sal/osl/unx/socket.c create mode 100644 sal/osl/unx/sockimpl.h create mode 100644 sal/osl/unx/system.c create mode 100644 sal/osl/unx/system.h create mode 100644 sal/osl/unx/thread.c create mode 100644 sal/osl/unx/time.c create mode 100644 sal/osl/unx/util.c create mode 100644 sal/osl/w32/MAKEFILE.MK create mode 100644 sal/osl/w32/conditn.c create mode 100644 sal/osl/w32/diagnose.c create mode 100644 sal/osl/w32/dllentry.c create mode 100644 sal/osl/w32/interlck.c create mode 100644 sal/osl/w32/libutil.c create mode 100644 sal/osl/w32/module.c create mode 100644 sal/osl/w32/mutex.c create mode 100644 sal/osl/w32/pipe.c create mode 100644 sal/osl/w32/process.c create mode 100644 sal/osl/w32/procimpl.h create mode 100644 sal/osl/w32/profile.c create mode 100644 sal/osl/w32/secimpl.h create mode 100644 sal/osl/w32/security.c create mode 100644 sal/osl/w32/semaphor.c create mode 100644 sal/osl/w32/signal.c create mode 100644 sal/osl/w32/sockimpl.h create mode 100644 sal/osl/w32/system.h create mode 100644 sal/osl/w32/thread.c create mode 100644 sal/osl/w32/time.c create mode 100644 sal/osl/w32/util.c create mode 100644 sal/prj/d.lst create mode 100644 sal/rtl/source/alloc.c create mode 100644 sal/rtl/source/byteseq.c create mode 100644 sal/rtl/source/cipher.c create mode 100644 sal/rtl/source/crc.c create mode 100644 sal/rtl/source/digest.c create mode 100644 sal/rtl/source/locale.c create mode 100644 sal/rtl/source/makefile.mk create mode 100644 sal/rtl/source/memory.c create mode 100644 sal/rtl/source/random.c create mode 100644 sal/rtl/source/rtl_process.c create mode 100644 sal/rtl/source/strbuf.c create mode 100644 sal/rtl/source/string.c create mode 100644 sal/rtl/source/ustrbuf.c create mode 100644 sal/rtl/source/ustring.c create mode 100644 sal/test/makefile.mk create mode 100644 sal/textenc/makefile.mk create mode 100644 sal/textenc/tcvtarb1.tab create mode 100644 sal/textenc/tcvtbyte.c create mode 100644 sal/textenc/tcvteas1.tab create mode 100644 sal/textenc/tcvtest1.tab create mode 100644 sal/textenc/tcvtjp1.tab create mode 100644 sal/textenc/tcvtjp2.tab create mode 100644 sal/textenc/tcvtjp3.tab create mode 100644 sal/textenc/tcvtjp4.tab create mode 100644 sal/textenc/tcvtjp5.tab create mode 100644 sal/textenc/tcvtjp6.tab create mode 100644 sal/textenc/tcvtkr1.tab create mode 100644 sal/textenc/tcvtkr2.tab create mode 100644 sal/textenc/tcvtkr4.tab create mode 100644 sal/textenc/tcvtkr5.tab create mode 100644 sal/textenc/tcvtkr6.tab create mode 100644 sal/textenc/tcvtlat1.tab create mode 100644 sal/textenc/tcvtmb.c create mode 100644 sal/textenc/tcvtscn1.tab create mode 100644 sal/textenc/tcvtscn2.tab create mode 100644 sal/textenc/tcvtscn3.tab create mode 100644 sal/textenc/tcvtscn4.tab create mode 100644 sal/textenc/tcvtscn5.tab create mode 100644 sal/textenc/tcvtscn6.tab create mode 100644 sal/textenc/tcvtsym1.tab create mode 100644 sal/textenc/tcvttcn1.tab create mode 100644 sal/textenc/tcvttcn2.tab create mode 100644 sal/textenc/tcvttcn6.tab create mode 100644 sal/textenc/tcvtuni1.tab create mode 100644 sal/textenc/tcvtutf7.c create mode 100644 sal/textenc/tcvtutf8.c create mode 100644 sal/textenc/tenchelp.c create mode 100644 sal/textenc/tenchelp.h create mode 100644 sal/textenc/tencinfo.c create mode 100644 sal/textenc/textcvt.c create mode 100644 sal/unosdk.mk create mode 100644 sal/util/makefile.mk create mode 100644 sal/version.mk create mode 100644 sal/workben/makefile.mk create mode 100644 sal/workben/t_cipher.c create mode 100644 sal/workben/t_digest.c create mode 100644 sal/workben/t_layer.c create mode 100644 sal/workben/t_random.c create mode 100644 sal/workben/t_tls.c create mode 100644 sal/workben/t_zip.c create mode 100644 sal/workben/test.cxx create mode 100644 sal/workben/testfile.cxx create mode 100644 sal/workben/testpip2.cxx create mode 100644 sal/workben/testpipe.cxx create mode 100644 sal/workben/testproc.cxx create mode 100644 sal/workben/tgetpwnam.cxx create mode 100644 store/inc/store/filelckb.hxx create mode 100644 store/inc/store/lockbyte.hxx create mode 100644 store/inc/store/memlckb.hxx create mode 100644 store/inc/store/object.hxx create mode 100644 store/inc/store/store.h create mode 100644 store/inc/store/store.hxx create mode 100644 store/inc/store/store.inl create mode 100644 store/inc/store/types.h create mode 100644 store/prj/d.lst create mode 100644 store/source/filelckb.cxx create mode 100644 store/source/makefile.mk create mode 100644 store/source/memlckb.cxx create mode 100644 store/source/object.cxx create mode 100644 store/source/storbase.cxx create mode 100644 store/source/storbase.hxx create mode 100644 store/source/storcach.cxx create mode 100644 store/source/storcach.hxx create mode 100644 store/source/stordata.cxx create mode 100644 store/source/stordata.hxx create mode 100644 store/source/store.cxx create mode 100644 store/source/storlckb.cxx create mode 100644 store/source/storlckb.hxx create mode 100644 store/source/storpage.cxx create mode 100644 store/source/storpage.hxx create mode 100644 store/source/stortree.cxx create mode 100644 store/source/stortree.hxx create mode 100644 store/util/makefile.mk create mode 100644 store/util/sto.dxp create mode 100644 store/util/sto.map create mode 100644 store/version.mk create mode 100644 store/workben/makefile.mk create mode 100644 store/workben/t_base.cxx create mode 100644 store/workben/t_file.cxx create mode 100644 store/workben/t_store.cxx diff --git a/registry/inc/registry/reflread.hxx b/registry/inc/registry/reflread.hxx new file mode 100644 index 000000000000..352cf7980dfe --- /dev/null +++ b/registry/inc/registry/reflread.hxx @@ -0,0 +1,499 @@ +/************************************************************************* + * + * $RCSfile: reflread.hxx,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:18:42 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +/************************************************************************* + + Source Code Control System - Update + + $Log: not supported by cvs2svn $ + Revision 1.20 2000/09/17 12:30:32 willem.vandorp + OpenOffice header added. + + Revision 1.19 2000/08/04 15:31:39 jsc + extend biniary type format + + Revision 1.18 2000/07/26 17:44:32 willem.vandorp + Headers/footers replaced + + Revision 1.17 2000/05/02 06:06:21 jsc + insert LIBRARY_VERSION for dynamic loading + + Revision 1.16 2000/04/18 10:09:48 jsc + modified for unicode changes + + Revision 1.15 2000/03/24 15:00:36 jsc + modified for unicode changes + + Revision 1.14 1999/10/19 16:13:55 kr + Parameter for Version 1 of Registry added. + + Revision 1.13 1999/09/06 08:33:00 jsc + insert IDL filename in registry + + Revision 1.12 1999/07/02 09:25:39 jsc + #67179# Binaerblop der CoreReflection ist erweitert worden + + Revision 1.11 1999/03/12 14:16:38 jsc + #61011# Anpassung an osl-Typen + + Revision 1.10 1999/02/05 09:44:33 jsc + #61011# Typanpassung + + Revision 1.9 1998/12/11 11:57:42 jsc + Anpassung an ODynamicLoader + + Revision 1.8 1998/08/06 09:43:43 jsc + #54698# Anpassung an DynamicLoader + + Revision 1.7 1998/07/06 17:00:31 jsc + Calltype von InitRegistryTypeReader_Api gesetzt + + Revision 1.6 1998/07/03 11:20:07 ts + prefixen von typen + + Revision 1.5 1998/07/03 08:41:02 ts + bugs und set/getUik() + + Revision 1.4 1998/07/02 11:58:29 jsc + Typ Anpassung, Schnittstelle frei von solar.h + + Revision 1.3 1998/07/01 13:39:01 ts + bugs, bugs, bugs + + Revision 1.2 1998/06/30 13:42:27 ts + Anpassung an SOLARIS + + Revision 1.1.1.1 1998/06/30 11:17:45 jsc + neu + + +*************************************************************************/ + +#ifndef __REGISTRY_REFLREAD_HXX__ +#define __REGISTRY_REFLREAD_HXX__ + +#ifndef _REGISTRY_REFLTYPE_HXX_ +#include +#endif +#ifndef _REGISTRY_REGTYPE_H_ +#include +#endif +#ifndef _VOS_DYNLOAD_HXX_ +#include +#endif + +// Implememetation handle +typedef void* TypeReaderImpl; + +/**************************************************************************** + + C-Api for load on call + +*****************************************************************************/ + +#ifdef __cplusplus +extern "C" { +#endif + +struct RegistryTypeReader_Api +{ + TypeReaderImpl (TYPEREG_CALLTYPE *createEntry) (const sal_uInt8*, sal_uInt32, sal_Bool); + void (TYPEREG_CALLTYPE *acquire) (TypeReaderImpl); + void (TYPEREG_CALLTYPE *release) (TypeReaderImpl); + sal_uInt16 (TYPEREG_CALLTYPE *getMinorVersion) (TypeReaderImpl); + sal_uInt16 (TYPEREG_CALLTYPE *getMajorVersion) (TypeReaderImpl); + RTTypeClass (TYPEREG_CALLTYPE *getTypeClass) (TypeReaderImpl); + void (TYPEREG_CALLTYPE *getUik) (TypeReaderImpl, RTUik*); + void (TYPEREG_CALLTYPE *getDoku) (TypeReaderImpl, rtl_uString**); + void (TYPEREG_CALLTYPE *getFileName) (TypeReaderImpl, rtl_uString**); + void (TYPEREG_CALLTYPE *getTypeName) (TypeReaderImpl, rtl_uString**); + void (TYPEREG_CALLTYPE *getSuperTypeName) (TypeReaderImpl, rtl_uString**); + sal_uInt32 (TYPEREG_CALLTYPE *getFieldCount) (TypeReaderImpl); + void (TYPEREG_CALLTYPE *getFieldName) (TypeReaderImpl, rtl_uString**, sal_uInt16); + void (TYPEREG_CALLTYPE *getFieldType) (TypeReaderImpl, rtl_uString**, sal_uInt16); + RTFieldAccess (TYPEREG_CALLTYPE *getFieldAccess) (TypeReaderImpl, sal_uInt16); + RTValueType (TYPEREG_CALLTYPE *getFieldConstValue) (TypeReaderImpl, sal_uInt16, RTConstValueUnion*); + void (TYPEREG_CALLTYPE *getFieldDoku) (TypeReaderImpl, rtl_uString**, sal_uInt16); + void (TYPEREG_CALLTYPE *getFieldFileName) (TypeReaderImpl, rtl_uString**, sal_uInt16); + sal_uInt32 (TYPEREG_CALLTYPE *getMethodCount) (TypeReaderImpl); + void (TYPEREG_CALLTYPE *getMethodName) (TypeReaderImpl, rtl_uString**, sal_uInt16); + sal_uInt32 (TYPEREG_CALLTYPE *getMethodParamCount) (TypeReaderImpl, sal_uInt16); + void (TYPEREG_CALLTYPE *getMethodParamType) (TypeReaderImpl, rtl_uString**, sal_uInt16, sal_uInt16); + void (TYPEREG_CALLTYPE *getMethodParamName) (TypeReaderImpl, rtl_uString**, sal_uInt16, sal_uInt16); + RTParamMode (TYPEREG_CALLTYPE *getMethodParamMode) (TypeReaderImpl, sal_uInt16, sal_uInt16); + sal_uInt32 (TYPEREG_CALLTYPE *getMethodExcCount) (TypeReaderImpl, sal_uInt16); + void (TYPEREG_CALLTYPE *getMethodExcType) (TypeReaderImpl, rtl_uString**, sal_uInt16, sal_uInt16); + void (TYPEREG_CALLTYPE *getMethodReturnType) (TypeReaderImpl, rtl_uString**, sal_uInt16); + RTMethodMode (TYPEREG_CALLTYPE *getMethodMode) (TypeReaderImpl, sal_uInt16); + void (TYPEREG_CALLTYPE *getMethodDoku) (TypeReaderImpl, rtl_uString**, sal_uInt16); + + sal_uInt32 (TYPEREG_CALLTYPE *getReferenceCount) (TypeReaderImpl); + void (TYPEREG_CALLTYPE *getReferenceName) (TypeReaderImpl, rtl_uString**, sal_uInt16); + RTReferenceType (TYPEREG_CALLTYPE *getReferenceType) (TypeReaderImpl, sal_uInt16); + void (TYPEREG_CALLTYPE *getReferenceDoku) (TypeReaderImpl, rtl_uString**, sal_uInt16); + RTFieldAccess (TYPEREG_CALLTYPE *getReferenceAccess) (TypeReaderImpl, sal_uInt16); +}; + +typedef RegistryTypeReader_Api* (TYPEREG_CALLTYPE *InitRegistryTypeReader_Api)(void); + +#define REGISTRY_TYPE_READER_INIT_FUNCTION_NAME "initRegistryTypeReader_Api" + +#ifdef __cplusplus +} +#endif + + +/** RegistryTypeReaderLoader load the needed DLL for a RegistryTypeReader. + The loader can be checked if the DLL is loaded. If the DLL is loaded the + loader provides a valid Api for the RegistryTypeReader. +*/ +class RegistryTypeReaderLoader + : public ::vos::ODynamicLoader +{ +public: + RegistryTypeReaderLoader() + : ::vos::ODynamicLoader + (::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("reg") ), + ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM(REGISTRY_TYPE_READER_INIT_FUNCTION_NAME) ), + sal_True, LIBRARY_VERSION, sal_False) + {} + + ~RegistryTypeReaderLoader() + {} +}; + + +/** RegistryTypeReader reads type informations from a blop. + Class is inline and use a load on call C-Api. +*/ +class RegistryTypeReader +{ +public: + + inline RegistryTypeReader(const RegistryTypeReader_Api* pApi, + const sal_uInt8* buffer, + sal_uInt32 bufferLen, + sal_Bool copyData); + inline RegistryTypeReader(const RegistryTypeReaderLoader& rLoader, + const sal_uInt8* buffer, + sal_uInt32 bufferLen, + sal_Bool copyData); + inline RegistryTypeReader(const RegistryTypeReader& toCopy); + inline ~RegistryTypeReader(); + + inline RegistryTypeReader& operator == (const RegistryTypeReader& toAssign); + + inline sal_Bool isValid() const; + + inline sal_uInt16 getMinorVersion() const; + inline sal_uInt16 getMajorVersion() const; + inline RTTypeClass getTypeClass() const; + inline ::rtl::OUString getTypeName() const; + inline ::rtl::OUString getSuperTypeName() const; + inline void getUik(RTUik& uik) const; + inline ::rtl::OUString getDoku() const; + inline ::rtl::OUString getFileName() const; + inline sal_uInt32 getFieldCount() const; + inline ::rtl::OUString getFieldName( sal_uInt16 index ) const; + inline ::rtl::OUString getFieldType( sal_uInt16 index ) const; + inline RTFieldAccess getFieldAccess( sal_uInt16 index ) const; + inline RTConstValue getFieldConstValue( sal_uInt16 index ) const; + inline ::rtl::OUString getFieldDoku( sal_uInt16 index ) const; + inline ::rtl::OUString getFieldFileName( sal_uInt16 index ) const; + inline sal_uInt32 getMethodCount() const; + inline ::rtl::OUString getMethodName( sal_uInt16 index ) const; + inline sal_uInt32 getMethodParamCount( sal_uInt16 index ) const; + inline ::rtl::OUString getMethodParamType( sal_uInt16 index, sal_uInt16 paramIndex ) const; + inline ::rtl::OUString getMethodParamName( sal_uInt16 index, sal_uInt16 paramIndex ) const; + inline RTParamMode getMethodParamMode( sal_uInt16 index, sal_uInt16 paramIndex ) const; + inline sal_uInt32 getMethodExcCount( sal_uInt16 index ) const; + inline ::rtl::OUString getMethodExcType( sal_uInt16 index, sal_uInt16 excIndex ) const; + inline ::rtl::OUString getMethodReturnType( sal_uInt16 index ) const; + inline RTMethodMode getMethodMode( sal_uInt16 index ) const; + inline ::rtl::OUString getMethodDoku( sal_uInt16 index ) const; + + inline sal_uInt32 getReferenceCount() const; + inline ::rtl::OUString getReferenceName( sal_uInt16 index ) const; + inline RTReferenceType getReferenceType( sal_uInt16 index ) const; + inline ::rtl::OUString getReferenceDoku( sal_uInt16 index ) const; + inline RTFieldAccess getReferenceAccess( sal_uInt16 index ) const; + +protected: + + const RegistryTypeReader_Api* m_pApi; + const NAMESPACE_VOS(ODynamicLoader) m_Api; + TypeReaderImpl m_hImpl; +}; + + + +inline RegistryTypeReader::RegistryTypeReader(const RegistryTypeReader_Api* pApi, + const sal_uInt8* buffer, + sal_uInt32 bufferLen, + sal_Bool copyData) + : m_pApi(pApi) + , m_Api() + , m_hImpl(NULL) + { + m_hImpl = m_pApi->createEntry(buffer, bufferLen, copyData); + } + + +inline RegistryTypeReader::RegistryTypeReader(const RegistryTypeReaderLoader& rLoader, + const sal_uInt8* buffer, + sal_uInt32 bufferLen, + sal_Bool copyData) + : m_pApi(NULL) + , m_Api(rLoader) + , m_hImpl(NULL) + { + m_pApi = m_Api.getApi(); + m_hImpl = m_pApi->createEntry(buffer, bufferLen, copyData); + } + + +inline RegistryTypeReader::RegistryTypeReader(const RegistryTypeReader& toCopy) + : m_pApi(toCopy.m_pApi) + , m_Api(toCopy.m_Api) + , m_hImpl(toCopy.m_hImpl) + { m_pApi->acquire(m_hImpl); } + + +inline RegistryTypeReader::~RegistryTypeReader() + { m_pApi->release(m_hImpl); } + +inline RegistryTypeReader& RegistryTypeReader::operator == (const RegistryTypeReader& toAssign) +{ + if (m_hImpl != toAssign.m_hImpl) + { + m_pApi->release(m_hImpl); + m_hImpl = toAssign.m_hImpl; + m_pApi->acquire(m_hImpl); + } + + return *this; +} + +inline sal_uInt16 RegistryTypeReader::getMinorVersion() const + { return m_pApi->getMinorVersion(m_hImpl); } + +inline sal_Bool RegistryTypeReader::isValid() const + { return (m_hImpl != NULL); } + +inline sal_uInt16 RegistryTypeReader::getMajorVersion() const + { return m_pApi->getMajorVersion(m_hImpl); } + +inline RTTypeClass RegistryTypeReader::getTypeClass() const + { return m_pApi->getTypeClass(m_hImpl); } + +inline ::rtl::OUString RegistryTypeReader::getTypeName() const + { + ::rtl::OUString sRet; + m_pApi->getTypeName(m_hImpl, &sRet.pData); + return sRet; + } + +inline ::rtl::OUString RegistryTypeReader::getSuperTypeName() const + { + ::rtl::OUString sRet; + m_pApi->getSuperTypeName(m_hImpl, &sRet.pData); + return sRet; + } + +inline void RegistryTypeReader::getUik(RTUik& uik) const + { m_pApi->getUik(m_hImpl, &uik); } + +inline ::rtl::OUString RegistryTypeReader::getDoku() const + { + ::rtl::OUString sRet; + m_pApi->getDoku(m_hImpl, &sRet.pData); + return sRet; + } + +inline ::rtl::OUString RegistryTypeReader::getFileName() const + { + ::rtl::OUString sRet; + m_pApi->getFileName(m_hImpl, &sRet.pData); + return sRet; + } + +inline sal_uInt32 RegistryTypeReader::getFieldCount() const + { return m_pApi->getFieldCount(m_hImpl); } + +inline ::rtl::OUString RegistryTypeReader::getFieldName( sal_uInt16 index ) const + { + ::rtl::OUString sRet; + m_pApi->getFieldName(m_hImpl, &sRet.pData, index); + return sRet; + } + +inline ::rtl::OUString RegistryTypeReader::getFieldType( sal_uInt16 index ) const + { + ::rtl::OUString sRet; + m_pApi->getFieldType(m_hImpl, &sRet.pData, index); + return sRet; + } + +inline RTFieldAccess RegistryTypeReader::getFieldAccess( sal_uInt16 index ) const + { return m_pApi->getFieldAccess(m_hImpl, index); } + +inline RTConstValue RegistryTypeReader::getFieldConstValue( sal_uInt16 index ) const + { + RTConstValue ret; + ret.m_type = m_pApi->getFieldConstValue(m_hImpl, index, &ret.m_value); + return ret; + } + +inline ::rtl::OUString RegistryTypeReader::getFieldDoku( sal_uInt16 index ) const + { + ::rtl::OUString sRet; + m_pApi->getFieldDoku(m_hImpl, &sRet.pData, index); + return sRet; + } + +inline ::rtl::OUString RegistryTypeReader::getFieldFileName( sal_uInt16 index ) const + { + ::rtl::OUString sRet; + m_pApi->getFieldFileName(m_hImpl, &sRet.pData, index); + return sRet; + } + +inline sal_uInt32 RegistryTypeReader::getMethodCount() const + { return m_pApi->getMethodCount(m_hImpl); } + +inline ::rtl::OUString RegistryTypeReader::getMethodName( sal_uInt16 index ) const + { + ::rtl::OUString sRet; + m_pApi->getMethodName(m_hImpl, &sRet.pData, index); + return sRet; + } + +inline sal_uInt32 RegistryTypeReader::getMethodParamCount( sal_uInt16 index ) const + { return m_pApi->getMethodParamCount(m_hImpl, index); } + +inline ::rtl::OUString RegistryTypeReader::getMethodParamType( sal_uInt16 index, sal_uInt16 paramIndex ) const + { + ::rtl::OUString sRet; + m_pApi->getMethodParamType(m_hImpl, &sRet.pData, index, paramIndex); + return sRet; + } + +inline ::rtl::OUString RegistryTypeReader::getMethodParamName( sal_uInt16 index, sal_uInt16 paramIndex ) const + { + ::rtl::OUString sRet; + m_pApi->getMethodParamName(m_hImpl, &sRet.pData, index, paramIndex); + return sRet; + } + +inline RTParamMode RegistryTypeReader::getMethodParamMode( sal_uInt16 index, sal_uInt16 paramIndex ) const + { return m_pApi->getMethodParamMode(m_hImpl, index, paramIndex); } + +inline sal_uInt32 RegistryTypeReader::getMethodExcCount( sal_uInt16 index ) const + { return m_pApi->getMethodExcCount(m_hImpl, index); } + +inline ::rtl::OUString RegistryTypeReader::getMethodExcType( sal_uInt16 index, sal_uInt16 excIndex ) const + { + ::rtl::OUString sRet; + m_pApi->getMethodExcType(m_hImpl, &sRet.pData, index, excIndex); + return sRet; + } + +inline ::rtl::OUString RegistryTypeReader::getMethodReturnType( sal_uInt16 index ) const + { + ::rtl::OUString sRet; + m_pApi->getMethodReturnType(m_hImpl, &sRet.pData, index); + return sRet; + } + +inline RTMethodMode RegistryTypeReader::getMethodMode( sal_uInt16 index ) const + { return m_pApi->getMethodMode(m_hImpl, index); } + +inline ::rtl::OUString RegistryTypeReader::getMethodDoku( sal_uInt16 index ) const + { + ::rtl::OUString sRet; + m_pApi->getMethodDoku(m_hImpl, &sRet.pData, index); + return sRet; + } + +inline sal_uInt32 RegistryTypeReader::getReferenceCount() const + { return m_pApi->getReferenceCount(m_hImpl); } + +inline ::rtl::OUString RegistryTypeReader::getReferenceName( sal_uInt16 index ) const + { + ::rtl::OUString sRet; + m_pApi->getReferenceName(m_hImpl, &sRet.pData, index); + return sRet; + } + +inline RTReferenceType RegistryTypeReader::getReferenceType( sal_uInt16 index ) const + { return m_pApi->getReferenceType(m_hImpl, index); } + +inline ::rtl::OUString RegistryTypeReader::getReferenceDoku( sal_uInt16 index ) const + { + ::rtl::OUString sRet; + m_pApi->getReferenceDoku(m_hImpl, &sRet.pData, index); + return sRet; + } + +inline RTFieldAccess RegistryTypeReader::getReferenceAccess( sal_uInt16 index ) const + { return m_pApi->getReferenceAccess(m_hImpl, index); } + +#endif diff --git a/registry/inc/registry/refltype.hxx b/registry/inc/registry/refltype.hxx new file mode 100644 index 000000000000..7e217e7e84f7 --- /dev/null +++ b/registry/inc/registry/refltype.hxx @@ -0,0 +1,266 @@ +/************************************************************************* + * + * $RCSfile: refltype.hxx,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:18:42 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +/************************************************************************* + + Source Code Control System - Update + + $Log: not supported by cvs2svn $ + Revision 1.19 2000/09/17 12:30:32 willem.vandorp + OpenOffice header added. + + Revision 1.18 2000/08/04 15:31:39 jsc + extend biniary type format + + Revision 1.17 2000/07/26 17:44:32 willem.vandorp + Headers/footers replaced + + Revision 1.16 2000/03/24 15:00:36 jsc + modified for unicode changes + + Revision 1.15 2000/02/08 16:01:09 hr + #70473# changes for unicode ( patched by automated patchtool ) + + Revision 1.14 1999/10/22 09:58:47 jsc + TYPEREG_CALLTYPE = SAL_CALL + + Revision 1.13 1999/10/21 15:48:50 jsc + optional flag now in registry + + Revision 1.12 1999/10/15 11:05:51 dbo + short RTConstValue from sal_uInt16 to sal_Int16 + + Revision 1.11 1999/07/02 09:25:40 jsc + #67179# Binaerblop der CoreReflection ist erweitert worden + + Revision 1.10 1999/03/12 14:16:38 jsc + #61011# Anpassung an osl-Typen + + Revision 1.9 1998/07/03 12:36:16 ts + added SERVICE and OBJECT + + Revision 1.8 1998/07/03 11:20:07 ts + prefixen von typen + + Revision 1.7 1998/07/03 10:55:41 ts + added RT_TYPE_TYPEDEF + + Revision 1.6 1998/07/03 08:41:02 ts + bugs und set/getUik() + + Revision 1.5 1998/07/02 11:58:47 jsc + Typ Anpassung, Schnittstelle frei von solar.h + + Revision 1.4 1998/07/01 16:55:19 ts + alignment unter soaris beachten + + Revision 1.3 1998/07/01 13:39:01 ts + bugs, bugs, bugs + + Revision 1.2 1998/06/30 13:42:27 ts + Anpassung an SOLARIS + + Revision 1.1.1.1 1998/06/30 11:17:45 jsc + neu + + +*************************************************************************/ + +#ifndef __REGISTRY_REFLTYPE_HXX__ +#define __REGISTRY_REFLTYPE_HXX__ + +#ifdef SOLARIS +#include +#else +#include +#endif + +#ifndef _SAL_TYPES_H_ +#include +#endif + +enum RTTypeClass +{ + RT_TYPE_INVALID, + RT_TYPE_INTERFACE, + RT_TYPE_MODULE, + RT_TYPE_STRUCT, + RT_TYPE_ENUM, + RT_TYPE_EXCEPTION, + RT_TYPE_TYPEDEF, + RT_TYPE_SERVICE, + RT_TYPE_OBJECT, + RT_TYPE_CONSTANTS +}; + +typedef sal_uInt16 RTFieldAccess; + +#define RT_ACCESS_INVALID 0x0000 +#define RT_ACCESS_READONLY 0x0001 +#define RT_ACCESS_OPTIONAL 0x0002 +#define RT_ACCESS_MAYBEVOID 0x0004 +#define RT_ACCESS_BOUND 0x0008 +#define RT_ACCESS_CONSTRAINED 0x0010 +#define RT_ACCESS_TRANSIENT 0x0020 +#define RT_ACCESS_MAYBEAMBIGUOUS 0x0040 +#define RT_ACCESS_MAYBEDEFAULT 0x0080 +#define RT_ACCESS_REMOVEABLE 0x0100 +#define RT_ACCESS_ATTRIBUTE 0x0200 +#define RT_ACCESS_PROPERTY 0x0400 +#define RT_ACCESS_CONST 0x0800 +#define RT_ACCESS_READWRITE 0x1000 +/* +enum RTFieldAccess +{ + RT_ACCESS_INVALID, + RT_ACCESS_CONST, + RT_ACCESS_READONLY, + RT_ACCESS_WRITEONLY, + RT_ACCESS_READWRITE, + RT_ACCESS_READONLY_OPTIONAL, + RT_ACCESS_WRITEONLY_OPTIONAL, + RT_ACCESS_READWRITE_OPTIONAL +}; +*/ +enum RTReferenceType +{ + RT_REF_INVALID, + RT_REF_SUPPORTS, + RT_REF_OBSERVES, + RT_REF_EXPORTS, + RT_REF_NEEDS +}; + +enum RTMethodMode +{ + RT_MODE_INVALID, + RT_MODE_ONEWAY, + RT_MODE_ONEWAY_CONST, + RT_MODE_TWOWAY, + RT_MODE_TWOWAY_CONST +}; + +enum RTParamMode +{ + RT_PARAM_INVALID, + RT_PARAM_IN, + RT_PARAM_OUT, + RT_PARAM_INOUT +}; + +enum RTValueType +{ + RT_TYPE_NONE, + RT_TYPE_BOOL, + RT_TYPE_BYTE, + RT_TYPE_INT16, + RT_TYPE_UINT16, + RT_TYPE_INT32, + RT_TYPE_UINT32, + RT_TYPE_INT64, + RT_TYPE_UINT64, + RT_TYPE_FLOAT, + RT_TYPE_DOUBLE, + RT_TYPE_STRING +}; + +union RTConstValueUnion +{ + sal_Bool aBool; + sal_uInt8 aByte; + sal_Int16 aShort; + sal_uInt16 aUShort; + sal_Int32 aLong; + sal_uInt32 aULong; +// sal_Int64 aHyper; +// sal_UInt64 aUHyper; + float aFloat; + double aDouble; + const sal_Unicode* aString; +}; + +class RTConstValue +{ +public: + RTValueType m_type; + RTConstValueUnion m_value; + + RTConstValue() + : m_type(RT_TYPE_NONE) + { + m_value.aDouble = 0.0; + } + + ~RTConstValue() {}; +}; + +struct RTUik +{ + sal_uInt32 m_Data1; + sal_uInt16 m_Data2; + sal_uInt16 m_Data3; + sal_uInt32 m_Data4; + sal_uInt32 m_Data5; +}; + +#define TYPEREG_CALLTYPE SAL_CALL + +#endif diff --git a/registry/inc/registry/reflwrit.hxx b/registry/inc/registry/reflwrit.hxx new file mode 100644 index 000000000000..ae96e0284776 --- /dev/null +++ b/registry/inc/registry/reflwrit.hxx @@ -0,0 +1,422 @@ +/************************************************************************* + * + * $RCSfile: reflwrit.hxx,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:18:42 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +/************************************************************************* + + Source Code Control System - Update + + $Log: not supported by cvs2svn $ + Revision 1.20 2000/09/17 12:30:32 willem.vandorp + OpenOffice header added. + + Revision 1.19 2000/08/04 15:31:39 jsc + extend biniary type format + + Revision 1.18 2000/07/26 17:44:32 willem.vandorp + Headers/footers replaced + + Revision 1.17 2000/05/02 06:06:21 jsc + insert LIBRARY_VERSION for dynamic loading + + Revision 1.16 2000/04/18 10:09:48 jsc + modified for unicode changes + + Revision 1.15 2000/03/24 15:00:36 jsc + modified for unicode changes + + Revision 1.14 1999/10/19 16:14:49 kr + Version parameter for dynload added + + Revision 1.13 1999/09/06 08:33:00 jsc + insert IDL filename in registry + + Revision 1.12 1999/07/02 09:25:40 jsc + #67179# Binaerblop der CoreReflection ist erweitert worden + + Revision 1.11 1999/03/12 14:16:38 jsc + #61011# Anpassung an osl-Typen + + Revision 1.10 1999/02/05 09:44:33 jsc + #61011# Typanpassung + + Revision 1.9 1998/12/11 11:57:42 jsc + Anpassung an ODynamicLoader + + Revision 1.8 1998/08/06 09:43:44 jsc + #54698# Anpassung an DynamicLoader + + Revision 1.7 1998/07/06 17:02:03 jsc + Calltype von InitRegistryTypeWriter_Api gesetzt + + Revision 1.6 1998/07/03 11:20:08 ts + prefixen von typen + + Revision 1.5 1998/07/03 08:41:03 ts + bugs und set/getUik() + + Revision 1.4 1998/07/02 11:58:39 jsc + Typ Anpassung, Schnittstelle frei von solar.h + + Revision 1.3 1998/07/01 16:55:19 ts + alignment unter soaris beachten + + Revision 1.2 1998/07/01 13:39:01 ts + bugs, bugs, bugs + + Revision 1.1.1.1 1998/06/30 11:17:45 jsc + neu + + +*************************************************************************/ + +#ifndef __REGISTRY_REFLWRIT_HXX__ +#define __REGISTRY_REFLWRIT_HXX__ + +#ifndef _REGISTRY_REFLTYPE_HXX_ +#include +#endif +#ifndef _REGISTRY_REGTYPE_H_ +#include +#endif +#ifndef _VOS_DYNLOAD_HXX_ +#include +#endif + +// Implememetation handle +typedef void* TypeWriterImpl; + +/**************************************************************************** + + C-Api for load on call + +*****************************************************************************/ + +#ifdef __cplusplus +extern "C" { +#endif + +struct RegistryTypeWriter_Api +{ + TypeWriterImpl (TYPEREG_CALLTYPE *createEntry) (RTTypeClass, rtl_uString*, rtl_uString*, sal_uInt16, sal_uInt16, sal_uInt16); + void (TYPEREG_CALLTYPE *acquire) (TypeWriterImpl); + void (TYPEREG_CALLTYPE *release) (TypeWriterImpl); + void (TYPEREG_CALLTYPE *setUik) (TypeWriterImpl, const RTUik*); + void (TYPEREG_CALLTYPE *setDoku) (TypeWriterImpl, rtl_uString*); + void (TYPEREG_CALLTYPE *setFileName) (TypeWriterImpl, rtl_uString*); + void (TYPEREG_CALLTYPE *setFieldData) (TypeWriterImpl, sal_uInt16, rtl_uString*, rtl_uString*, rtl_uString*, rtl_uString*, RTFieldAccess, RTValueType, RTConstValueUnion); + void (TYPEREG_CALLTYPE *setMethodData) (TypeWriterImpl, sal_uInt16, rtl_uString*, rtl_uString*, RTMethodMode, sal_uInt16, sal_uInt16, rtl_uString*); + void (TYPEREG_CALLTYPE *setParamData) (TypeWriterImpl, sal_uInt16, sal_uInt16, rtl_uString*, rtl_uString*, RTParamMode); + void (TYPEREG_CALLTYPE *setExcData) (TypeWriterImpl, sal_uInt16, sal_uInt16, rtl_uString*); + const sal_uInt8* (TYPEREG_CALLTYPE *getBlop) (TypeWriterImpl); + sal_uInt32 (TYPEREG_CALLTYPE *getBlopSize) (TypeWriterImpl); + + void (TYPEREG_CALLTYPE *setReferenceData) (TypeWriterImpl, sal_uInt16, rtl_uString*, RTReferenceType, rtl_uString*, RTFieldAccess); +}; + +typedef RegistryTypeWriter_Api* (TYPEREG_CALLTYPE *InitRegistryTypeWriter_Api)(void); + +#define REGISTRY_TYPE_WRITER_INIT_FUNCTION_NAME "initRegistryTypeWriter_Api" + +#ifdef __cplusplus +} +#endif + + +/** RegistryTypeWriterLoader load the needed DLL for a RegistryTypeWriter. + The loader can be checked if the DLL is loaded. If the DLL is loaded the + loader provides a valid Api for the RegistryTypeWriter. +*/ +class RegistryTypeWriterLoader + : public ::vos::ODynamicLoader +{ +public: + RegistryTypeWriterLoader() + : ::vos::ODynamicLoader + (::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("reg") ), + ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM(REGISTRY_TYPE_WRITER_INIT_FUNCTION_NAME) ), + sal_True, LIBRARY_VERSION, sal_False) + {} + + ~RegistryTypeWriterLoader() + {} +}; + + +/** RegistryTypeWriter writes type informations into a blop. + Class is inline and use a load on call C-Api. +*/ +class RegistryTypeWriter +{ +public: + + inline RegistryTypeWriter(const RegistryTypeWriter_Api* pApi, + RTTypeClass RTTypeClass, + const ::rtl::OUString& typeName, + const ::rtl::OUString& superTypeName, + sal_uInt16 fieldCount, + sal_uInt16 methodCount, + sal_uInt16 referenceCount); + + inline RegistryTypeWriter(const RegistryTypeWriterLoader& rLoader, + RTTypeClass RTTypeClass, + const ::rtl::OUString& typeName, + const ::rtl::OUString& superTypeName, + sal_uInt16 fieldCount, + sal_uInt16 methodCount, + sal_uInt16 referenceCount); + + inline RegistryTypeWriter(const RegistryTypeWriter& toCopy); + inline ~RegistryTypeWriter(); + + inline RegistryTypeWriter& operator == (const RegistryTypeWriter& toAssign); + + inline void setUik(const RTUik& uik); + + inline void setDoku(const ::rtl::OUString& doku); + + inline void setFileName(const ::rtl::OUString& fileName); + + inline void setFieldData( sal_uInt16 index, + const ::rtl::OUString& name, + const ::rtl::OUString& typeName, + const ::rtl::OUString& doku, + const ::rtl::OUString& fileName, + RTFieldAccess access, + RTConstValue constValue = RTConstValue()); + + inline void setMethodData(sal_uInt16 index, + const ::rtl::OUString& name, + const ::rtl::OUString& returnTypeName, + RTMethodMode mode, + sal_uInt16 paramCount, + sal_uInt16 excCount, + const ::rtl::OUString& doku); + + inline void setParamData(sal_uInt16 index, + sal_uInt16 paramIndex, + const ::rtl::OUString& type, + const ::rtl::OUString& name, + RTParamMode mode); + + inline void setExcData(sal_uInt16 index, + sal_uInt16 excIndex, + const ::rtl::OUString& type); + + inline const sal_uInt8* getBlop(); + inline sal_uInt32 getBlopSize(); + + inline void setReferenceData( sal_uInt16 index, + const ::rtl::OUString& name, + RTReferenceType refType, + const ::rtl::OUString& doku, + RTFieldAccess access = RT_ACCESS_INVALID); + +protected: + + const RegistryTypeWriter_Api* m_pApi; + const NAMESPACE_VOS(ODynamicLoader) m_Api; + TypeWriterImpl m_hImpl; +}; + + + +inline RegistryTypeWriter::RegistryTypeWriter(const RegistryTypeWriter_Api* pApi, + RTTypeClass RTTypeClass, + const ::rtl::OUString& typeName, + const ::rtl::OUString& superTypeName, + sal_uInt16 fieldCount, + sal_uInt16 methodCount, + sal_uInt16 referenceCount) + : m_pApi(pApi) + , m_Api() + , m_hImpl(NULL) +{ + m_hImpl = m_pApi->createEntry(RTTypeClass, + typeName.pData, + superTypeName.pData, + fieldCount, + methodCount, + referenceCount); +} + + +inline RegistryTypeWriter::RegistryTypeWriter(const RegistryTypeWriterLoader& rLoader, + RTTypeClass RTTypeClass, + const ::rtl::OUString& typeName, + const ::rtl::OUString& superTypeName, + sal_uInt16 fieldCount, + sal_uInt16 methodCount, + sal_uInt16 referenceCount) + : m_pApi(NULL) + , m_Api(rLoader) + , m_hImpl(NULL) +{ + m_pApi = m_Api.getApi(); + m_hImpl = m_pApi->createEntry(RTTypeClass, + typeName.pData, + superTypeName.pData, + fieldCount, + methodCount, + referenceCount); +} + + +inline RegistryTypeWriter::RegistryTypeWriter(const RegistryTypeWriter& toCopy) + : m_pApi(toCopy.m_pApi) + , m_Api(toCopy.m_Api) + , m_hImpl(toCopy.m_hImpl) +{ + m_Api->acquire(m_hImpl); +} + +inline RegistryTypeWriter::~RegistryTypeWriter() +{ + m_pApi->release(m_hImpl); +} + +inline RegistryTypeWriter& RegistryTypeWriter::operator == (const RegistryTypeWriter& toAssign) +{ + if (m_hImpl != toAssign.m_hImpl) + { + m_pApi->release(m_hImpl); + m_hImpl = toAssign.m_hImpl; + m_pApi->acquire(m_hImpl); + } + + return *this; +} + +inline void RegistryTypeWriter::setFieldData( sal_uInt16 index, + const ::rtl::OUString& name, + const ::rtl::OUString& typeName, + const ::rtl::OUString& doku, + const ::rtl::OUString& fileName, + RTFieldAccess access, + RTConstValue constValue) +{ + m_pApi->setFieldData(m_hImpl, index, name.pData, typeName.pData, doku.pData, fileName.pData, access, constValue.m_type, constValue.m_value); +} + + +inline void RegistryTypeWriter::setMethodData(sal_uInt16 index, + const ::rtl::OUString& name, + const ::rtl::OUString& returnTypeName, + RTMethodMode mode, + sal_uInt16 paramCount, + sal_uInt16 excCount, + const ::rtl::OUString& doku) +{ + m_pApi->setMethodData(m_hImpl, index, name.pData, returnTypeName.pData, mode, paramCount, excCount, doku.pData); +} + + +inline void RegistryTypeWriter::setUik(const RTUik& uik) +{ + m_pApi->setUik(m_hImpl, &uik); +} + +inline void RegistryTypeWriter::setDoku(const ::rtl::OUString& doku) +{ + m_pApi->setDoku(m_hImpl, doku.pData); +} + +inline void RegistryTypeWriter::setFileName(const ::rtl::OUString& doku) +{ + m_pApi->setFileName(m_hImpl, doku.pData); +} + +inline void RegistryTypeWriter::setParamData(sal_uInt16 index, + sal_uInt16 paramIndex, + const ::rtl::OUString& type, + const ::rtl::OUString& name, + RTParamMode mode) +{ + m_pApi->setParamData(m_hImpl, index, paramIndex, type.pData, name.pData, mode); +} + +inline void RegistryTypeWriter::setExcData(sal_uInt16 index, + sal_uInt16 excIndex, + const ::rtl::OUString& type) +{ + m_pApi->setExcData(m_hImpl, index, excIndex, type.pData); +} + +inline const sal_uInt8* RegistryTypeWriter::getBlop() +{ + return m_pApi->getBlop(m_hImpl); +} + +inline sal_uInt32 RegistryTypeWriter::getBlopSize() +{ + return m_pApi->getBlopSize(m_hImpl); +} + + +inline void RegistryTypeWriter::setReferenceData( sal_uInt16 index, + const ::rtl::OUString& name, + RTReferenceType refType, + const ::rtl::OUString& doku, + RTFieldAccess access) +{ + m_pApi->setReferenceData(m_hImpl, index, name.pData, refType, doku.pData, access); +} + +#endif diff --git a/registry/inc/registry/registry.h b/registry/inc/registry/registry.h new file mode 100644 index 000000000000..392fb8b82fe2 --- /dev/null +++ b/registry/inc/registry/registry.h @@ -0,0 +1,456 @@ +/************************************************************************* + * + * $RCSfile: registry.h,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:18:42 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +#ifndef _REGISTRY_REGISTRY_H_ +#define _REGISTRY_REGISTRY_H_ + +#include + +#ifndef _RTL_USTRING_H_ +#include +#endif +#ifndef _REGISTRY_REGTYPE_H_ +#include +#endif + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +/** This function creates the specified key. If the key already exists in the registry, + the function opens it. + @param hKey Identifies a currently open key. The key opened or created by this function + is a subkey of the key identified by hKey. + @param keyName Points to a null terminated string specifying the name of a key that this + function opens or creates. + @param phNewKey Points to a variable that receives the handle of the opened or created key. + Memory to store this variable is allocated and is freed with the function + closeRegKey. If the function fails, phNewKey is NULL. + @return REG_NO_ERROR if succeeds else an error code. +*/ +RegError REGISTRY_CALLTYPE reg_createKey(RegKeyHandle hKey, + rtl_uString* keyName, + RegKeyHandle* phNewKey); + + +/** This function opens the specified key. + @param hKey Identifies a currently open key. The key opened by this function + is a subkey of the key identified by hKey + @param keyName Points to a null terminated string specifying the name of a key that this + function opens. + @param phNewKey Points to a variable that receives the handle of the opened key. + Memory to store this variable is allocated and is freed with the function + reg_closeKey. If the function fails, phNewKey is NULL. + @return REG_NO_ERROR if succeeds else an error code. +*/ +RegError REGISTRY_CALLTYPE reg_openKey(RegKeyHandle hKey, + rtl_uString* keyName, + RegKeyHandle* phOpenKey); + + + +/** This function opens all subkeys of the specified key. + @param hKey Identifies a currently open key. The key that subkeys opened by this + function is a subkey of the key identified by hKey + @param keyName Points to a null terminated string specifying the name of a key that subkeys + this function opens. + @param pphSubKeys Points to a variable that receives an array of of all opened subkeys. + Memory to store this variable is allocated and is freed with the function + reg_closeSubKeys. If the function fails, pphSubKeys is NULL. + @param pnSubKeys Specified the length of the array (the number of open subkeys). + @return REG_NO_ERROR if succeeds else an error code. +*/ +RegError REGISTRY_CALLTYPE reg_openSubKeys(RegKeyHandle hKey, + rtl_uString* keyName, + RegKeyHandle** pphSubKeys, + sal_uInt32* pnSubKeys); + + +/** This function close all subkeys specified in the array. + @param phSubKeys Points to a variable that containss an array of of all opened subkeys. + The allocated memory of pphSubKeys and all open subkeys is freed. + @param nSubKeys Specified the length of the array (the number of subkeys to closed). + @return REG_NO_ERROR if succeeds else an error code. +*/ +RegError REGISTRY_CALLTYPE reg_closeSubKeys(RegKeyHandle* phSubKeys, + sal_uInt32 nSubKeys); + + +/** This function deletes the specified key. + @param hKey Identifies a currently open key. The key deleted by this function + is a subkey of the key identified by hKey + @param keyName Points to a null terminated string specifying the name of a key that this + function deletes. + @return REG_NO_ERROR if succeeds else an error code. +*/ +RegError REGISTRY_CALLTYPE reg_deleteKey(RegKeyHandle hKey, + rtl_uString* keyName); + + +/** This function closes the specified key. + @param hKey Identifies a currently open key. The key is closed by this function. + The memory of the variable specifying the key is freeing. + @return REG_NO_ERROR if succeeds else an error code. +*/ +RegError REGISTRY_CALLTYPE reg_closeKey(RegKeyHandle hKey); + + +/** This function returns the name of the key. + @param hKey Identifies a currently open key which name will returned. + @param pKeyName contains the keyname if succeeds else an empty string. +*/ +const RegError REGISTRY_CALLTYPE reg_getKeyName(RegKeyHandle hKey, rtl_uString** pKeyName); + + +/** This function sets an value under the specified key. + @param hKey Identifies a currently open key. The key which value is setted by this + function is a subkey of the key identified by hKey. + @param keyName Points to a null terminated string specifying the name of a key which value + is set by this function. If keyName is NULL, the value is set for the key + specified by hKey. + @param valueType Specified the type of the value. + @param pData Points to a memory block containing the current data for the value. + @param valueSize Specified the size of pData in bytes + @return REG_NO_ERROR if succeeds else an error code. +*/ +RegError REGISTRY_CALLTYPE reg_setValue(RegKeyHandle hKey, + rtl_uString* keyName, + RegValueType valueType, + RegValue pData, + sal_uInt32 valueSize); + + +/** This function sets an long list value under the key. + @param keyName Points to a null terminated string specifying the name of a key which value + is set by this function. If keyName is NULL, the value is set for the key + specified by hKey. + @param pValueList Points to an array of longs containing the current data for the value. + @param len Specified the len of pValueList. + @return REG_NO_ERROR if succeeds else an error code. +*/ +RegError REGISTRY_CALLTYPE reg_setLongListValue(RegKeyHandle hKey, + rtl_uString* keyName, + sal_Int32* pValueList, + sal_uInt32 len); + + +/** This function sets an ascii list value under the key. + @param keyName Points to a null terminated string specifying the name of a key which value + is set by this function. If keyName is NULL, the value is set for the key + specified by hKey. + @param pValueList Points to an array of sal_Char* containing the current data for the value. + @param len Specified the len of pValueList. + @return REG_NO_ERROR if succeeds else an error code. +*/ +RegError REGISTRY_CALLTYPE reg_setStringListValue(RegKeyHandle hKey, + rtl_uString* keyName, + sal_Char** pValueList, + sal_uInt32 len); + + +/** This function sets an unicode string list value under the key. + @param keyName Points to a null terminated string specifying the name of a key which value + is set by this function. If keyName is NULL, the value is set for the key + specified by hKey. + @param pValueList Points to an array of sal_Unicode* containing the current data for the value. + @param len Specified the len of pValueList. + @return REG_NO_ERROR if succeeds else an error code. +*/ +RegError REGISTRY_CALLTYPE reg_setUnicodeListValue(RegKeyHandle hKey, + rtl_uString* keyName, + sal_Unicode** pValueList, + sal_uInt32 len); + + +/** This function gets info about type and size of the value. + @param hKey Identifies a currently open key. The key which value info is getted by this + function is a subkey of the key identified by hKey. + @param keyName Points to a null terminated string specifying the name of a key which value + is get by this function. If keyName is NULL, the value info is get from the + key specified by hKey. + @param pValueType Specified the type of the value. + @param pValueSize Specified the size of pData in bytes + @return REG_NO_ERROR if succeeds else an error code. +*/ +RegError REGISTRY_CALLTYPE reg_getValueInfo(RegKeyHandle hKey, + rtl_uString* keyName, + RegValueType* pValueType, + sal_uInt32* pValueSize); + + +/** This function gets the value under the specified key. + @param hKey Identifies a currently open key. The key which value is getted by this + function is a subkey of the key identified by hKey. + @param keyName Points to a null terminated string specifying the name of a key which value + is get by this function. If keyName is NULL, the value is get from the key + specified by hKey. + @param pData Points to an allocated memory block receiving the current data for the value. + @return REG_NO_ERROR if succeeds else an error code. +*/ +RegError REGISTRY_CALLTYPE reg_getValue(RegKeyHandle hKey, + rtl_uString* keyName, + RegValue pData); + + +/** This function gets the value under the specified key. + @param keyName Points to a null terminated string specifying the name of a key which value + is get by this function. If keyName is NULL, the value is get from the key + specified by hKey. + @param pValueList A Pointer to a long value list. + @param pLen Specifies the length of the value list. + @return REG_NO_ERROR if succeeds else an error code. +*/ +RegError REGISTRY_CALLTYPE reg_getLongListValue(RegKeyHandle hKey, + rtl_uString* keyName, + sal_Int32** pValueList, + sal_uInt32* pLen); + + +/** This function gets the value under the specified key. + @param keyName Points to a null terminated string specifying the name of a key which value + is get by this function. If keyName is NULL, the value is get from the key + specified by hKey. + @param pValueList A Pointer to a ascii value list. + @param pLen Specifies the length of the value list. + @return REG_NO_ERROR if succeeds else an error code. +*/ +RegError REGISTRY_CALLTYPE reg_getStringListValue(RegKeyHandle hKey, + rtl_uString* keyName, + sal_Char*** pValueList, + sal_uInt32* pLen); + + +/** This function gets the value under the specified key. + @param keyName Points to a null terminated string specifying the name of a key which value + is get by this function. If keyName is NULL, the value is get from the key + specified by hKey. + @param pValueList A Pointer to a unicode value list. + @param pLen Specifies the length of the value list. + @return REG_NO_ERROR if succeeds else an error code. +*/ +RegError REGISTRY_CALLTYPE reg_getUnicodeListValue(RegKeyHandle hKey, + rtl_uString* keyName, + sal_Unicode*** pValueList, + sal_uInt32* pLen); + + +/** This function free a value list. + @param valueType Specifies the type of the list members. + @param pValueList A Pointer to value list. + @param pLen Specifies the length of the value list. + @return REG_NO_ERROR if succeeds else an error code. +*/ +RegError REGISTRY_CALLTYPE reg_freeValueList(RegValueType valueType, + RegValue pValueList, + sal_uInt32 len); + +RegError REGISTRY_CALLTYPE reg_createLink(RegKeyHandle hKey, + rtl_uString* linkName, + rtl_uString* linkTarget); + +RegError REGISTRY_CALLTYPE reg_deleteLink(RegKeyHandle hKey, + rtl_uString* linkName); + +RegError REGISTRY_CALLTYPE reg_getKeyType(RegKeyHandle hKey, + rtl_uString* keyName, + RegKeyType* pKeyType); + +RegError REGISTRY_CALLTYPE reg_getLinkTarget(RegKeyHandle hKey, + rtl_uString* linkName, + rtl_uString** pLinkTarget); + +/** This function will resolved all or only the first link of a keyname + and returns the resolved keyName in pResolvedName. + @param hKey Identifies a currently open key. + @param keyName Points to a null terminated string specifying the relativ name of a key. + The name of rKey together with keyName will be resolved from links. + If keyName is NULL the registry information under the key specified by rKey + is saved in the specified file. + @return REG_NO_ERROR if succeeds else an error code. + */ +RegError REGISTRY_CALLTYPE reg_getResolvedKeyName(RegKeyHandle hKey, + rtl_uString* keyName, + sal_Bool firstLinkOnly, + rtl_uString** pResolvedName); + +/** This function loads registry information from a specified file and save it under the + specified keyName. + @param hKey Specifies the key where the subkey will be created. + @param keyName Points to a null terminated string specifying the name of the created subkey. + If keyName is NULL the registry information is saved under the key specified + by hKey. + @param regFileName Points to a null terminated string specifying the file containing the + registry information. + @return REG_NO_ERROR if succeeds else an error code. +*/ +RegError REGISTRY_CALLTYPE reg_loadKey(RegKeyHandle hKey, + rtl_uString* keyName, + rtl_uString* regFileName); + + +/** This function saves the registry information from the specified key and all subkeys and save + it in the specified file. + @param hKey Identifies a currently open key. The key which inforamtion is saved by this + function is a subkey of the key identified by hKey. + @param keyName Points to a null terminated string specifying the name of the subkey. + If keyName is NULL the registry information under the key specified by hKey + is saved in the specified file. + @param regFileName Points to a null terminated string specifying the file containing the + registry information. + @return REG_NO_ERROR if succeeds else an error code. +*/ +RegError REGISTRY_CALLTYPE reg_saveKey(RegKeyHandle hKey, + rtl_uString* keyName, + rtl_uString* regFileName); + + +/** This function merges the registry information from the specified key and the registry + information of the specified file. Existing keys will extended. + @param hKey Identifies a currently open key. The key which inforamtion is merged by this + function is a subkey of the key identified by hKey. + @param keyName Points to a null terminated string specifying the name of the subkey. + If keyName is NULL the registry information under the key specified by hKey + is merged with the information from the specified file. + @param regFileName Points to a null terminated string specifying the file containing the + registry information. + @param bWarnings if TRUE the function returns an error if a key already exists. + @param bReport if TRUE the function reports warnings on stdout if a key already exists. + @return REG_NO_ERROR if succeeds else an error code. +*/ +RegError REGISTRY_CALLTYPE reg_mergeKey(RegKeyHandle hKey, + rtl_uString* keyName, + rtl_uString* regFileName, + sal_Bool bWarnings, + sal_Bool bReport); + + +/** This function creates a new registry with the specified name and creates a root key. + @param registryName Points to a null terminated string specifying the name of the new registry. + @param phRegistry Points to a variable that receives the handle of the created registry. + @return REG_NO_ERROR if succeeds else an error code. +*/ +RegError REGISTRY_CALLTYPE reg_createRegistry(rtl_uString* registryName, + RegHandle* phRegistry); + + +/** This function opens the root key of the sepcified registry. + @param hReg Identifies a currently open registry which rootKey will returned. + @param phRootKey Points to a variable that receives the handle of the open root key. + @return REG_NO_ERROR if succeeds else an error code. +*/ +RegError REGISTRY_CALLTYPE reg_openRootKey(RegHandle hRegistry, + RegKeyHandle* phRootKey); + + +/** This function returns the name of the registry. + @param hReg Identifies a currently open registry which name will returned. + @param pName name if succeeds else an empty string. +*/ +const RegError REGISTRY_CALLTYPE reg_getName(RegHandle hRegistry, rtl_uString** pName); + + +/** This function returns the access mode of the registry. + @param hReg Identifies a currently open registry. + @return TRUE if accessmode is read only else FALSE. +*/ +sal_Bool REGISTRY_CALLTYPE reg_isReadOnly(RegHandle hReg); + + +/** This function opens a registry with the specified name. + @param registryName Identifies a registry name. + @param phRegistry Points to a variable that receives the handle of the opened registry. + @param accessMode specify the accessmode for the registry, REG_READONLY or REG_READWRITE. + @return REG_NO_ERROR if succeeds else an error code. +*/ +RegError REGISTRY_CALLTYPE reg_openRegistry(rtl_uString* registryName, + RegHandle* phRegistry, + RegAccessMode accessMode); + + +/** This function close the specified registry. + @param hRegistry Identifies a currently open registry. + @return REG_NO_ERROR if succeeds else an error code. +*/ +RegError REGISTRY_CALLTYPE reg_closeRegistry(RegHandle hRegistry); + + +/** This function destroy the specified registry. + @param hRegistry Identifies a currently open registry. + @param registryName Identifies a registry name, if the name is NULL the registry + itselfs will be destroyed. + @return REG_NO_ERROR if succeeds else an error code. +*/ +RegError REGISTRY_CALLTYPE reg_destroyRegistry(RegHandle hRegistry, + rtl_uString* registryName); + + +/** This function dump the content under the open key to stdout + @param hKey Identifies a currently open key which subtree is dumped. + @return REG_NO_ERROR if succeeds else an error code. +*/ +RegError REGISTRY_CALLTYPE reg_dumpRegistry(RegKeyHandle hKey); + +#ifdef __cplusplus +} +#endif + +#endif + diff --git a/registry/inc/registry/registry.hxx b/registry/inc/registry/registry.hxx new file mode 100644 index 000000000000..bc4acd25b3ad --- /dev/null +++ b/registry/inc/registry/registry.hxx @@ -0,0 +1,1220 @@ +/************************************************************************* + * + * $RCSfile: registry.hxx,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:18:42 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +#ifndef _REGISTRY_REGISTRY_HXX_ +#define _REGISTRY_REGISTRY_HXX_ + +#ifndef _REGISTRY_REGTYPE_H_ +#include +#endif +#ifndef _VOS_DYNLOAD_HXX_ +#include +#endif + +#ifndef _VOS_MACROS_HXX_ +#include +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +struct Registry_Api +{ + void (REGISTRY_CALLTYPE *acquire) (RegHandle); + void (REGISTRY_CALLTYPE *release) (RegHandle); + sal_Bool (REGISTRY_CALLTYPE *isReadOnly) (RegHandle); + RegError (REGISTRY_CALLTYPE *openRootKey) (RegHandle, RegKeyHandle*); + RegError (REGISTRY_CALLTYPE *getName) (RegHandle, rtl_uString**); + RegError (REGISTRY_CALLTYPE *createRegistry) (rtl_uString*, RegHandle*); + RegError (REGISTRY_CALLTYPE *openRegistry) (rtl_uString*, RegHandle*, RegAccessMode); + RegError (REGISTRY_CALLTYPE *closeRegistry) (RegHandle); + RegError (REGISTRY_CALLTYPE *destroyRegistry) (RegHandle, rtl_uString*); + RegError (REGISTRY_CALLTYPE *loadKey) (RegHandle, RegKeyHandle, rtl_uString*, rtl_uString*); + RegError (REGISTRY_CALLTYPE *saveKey) (RegHandle, RegKeyHandle, rtl_uString*, rtl_uString*); + RegError (REGISTRY_CALLTYPE *mergeKey) (RegHandle, RegKeyHandle, rtl_uString*, rtl_uString*, sal_Bool, sal_Bool); + RegError (REGISTRY_CALLTYPE *dumpRegistry) (RegHandle, RegKeyHandle); + void (REGISTRY_CALLTYPE *acquireKey) (RegKeyHandle); + void (REGISTRY_CALLTYPE *releaseKey) (RegKeyHandle); + sal_Bool (REGISTRY_CALLTYPE *isKeyReadOnly) (RegKeyHandle); + RegError (REGISTRY_CALLTYPE *getKeyName) (RegKeyHandle, rtl_uString**); + RegError (REGISTRY_CALLTYPE *createKey) (RegKeyHandle, rtl_uString*, RegKeyHandle*); + RegError (REGISTRY_CALLTYPE *openKey) (RegKeyHandle, rtl_uString*, RegKeyHandle*); + RegError (REGISTRY_CALLTYPE *openSubKeys) (RegKeyHandle, rtl_uString*, RegKeyHandle**, sal_uInt32*); + RegError (REGISTRY_CALLTYPE *closeSubKeys) (RegKeyHandle*, sal_uInt32); + RegError (REGISTRY_CALLTYPE *deleteKey) (RegKeyHandle, rtl_uString*); + RegError (REGISTRY_CALLTYPE *closeKey) (RegKeyHandle); + RegError (REGISTRY_CALLTYPE *setValue) (RegKeyHandle, rtl_uString*, RegValueType, RegValue, sal_uInt32); + RegError (REGISTRY_CALLTYPE *setLongListValue) (RegKeyHandle, rtl_uString*, sal_Int32*, sal_uInt32); + RegError (REGISTRY_CALLTYPE *setStringListValue) (RegKeyHandle, rtl_uString*, sal_Char**, sal_uInt32); + RegError (REGISTRY_CALLTYPE *setUnicodeListValue)(RegKeyHandle, rtl_uString*, sal_Unicode**, sal_uInt32); + RegError (REGISTRY_CALLTYPE *getValueInfo) (RegKeyHandle, rtl_uString*, RegValueType*, sal_uInt32*); + RegError (REGISTRY_CALLTYPE *getValue) (RegKeyHandle, rtl_uString*, RegValue); + RegError (REGISTRY_CALLTYPE *getLongListValue) (RegKeyHandle, rtl_uString*, sal_Int32**, sal_uInt32*); + RegError (REGISTRY_CALLTYPE *getStringListValue) (RegKeyHandle, rtl_uString*, sal_Char***, sal_uInt32*); + RegError (REGISTRY_CALLTYPE *getUnicodeListValue)(RegKeyHandle, rtl_uString*, sal_Unicode***, sal_uInt32*); + RegError (REGISTRY_CALLTYPE *freeValueList) (RegValueType, RegValue, sal_uInt32); + RegError (REGISTRY_CALLTYPE *createLink) (RegKeyHandle, rtl_uString*, rtl_uString*); + RegError (REGISTRY_CALLTYPE *deleteLink) (RegKeyHandle, rtl_uString*); + RegError (REGISTRY_CALLTYPE *getKeyType) (RegKeyHandle, rtl_uString*, RegKeyType*); + RegError (REGISTRY_CALLTYPE *getLinkTarget) (RegKeyHandle, rtl_uString*, rtl_uString**); + RegError (REGISTRY_CALLTYPE *getResolvedKeyName) (RegKeyHandle, rtl_uString*, sal_Bool, rtl_uString**); + RegError (REGISTRY_CALLTYPE *getKeyNames) (RegKeyHandle, rtl_uString*, rtl_uString***, sal_uInt32*); + RegError (REGISTRY_CALLTYPE *freeKeyNames) (rtl_uString**, sal_uInt32); +}; + +typedef Registry_Api* (REGISTRY_CALLTYPE *InitRegistry_Api)(void); + +#define REGISTRY_INIT_FUNCTION_NAME "initRegistry_Api" + +#ifdef __cplusplus +} +#endif + + +class RegistryKey; + +//----------------------------------------------------------------------------- + +/** RegistryLoader load the needed DLL for the registry. + The loader can be checked if the DLL is loaded. If the DLL is loaded the + loader provides a valid Api for the registry. +*/ +class RegistryLoader : public ::vos::ODynamicLoader +{ +public: + /// Default constructor, try to load the registry DLL and initialize the needed api. + RegistryLoader() + : ::vos::ODynamicLoader + (::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("reg") ), + ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM(REGISTRY_INIT_FUNCTION_NAME) ), + sal_True, LIBRARY_VERSION, sal_False) + {} + + /// Destructor, decrease the refcount and unload the DLL if the refcount is 0. + ~RegistryLoader() + {} +}; + +/** Registry read and write information in a registry file. + Class is inline and use a load on call C-Api. +*/ +class Registry +{ +public: + /** Constructor. + This constructor is called with a valid api for the registry. + The constructor is used if the api is known. Use open() or create() + to initialize the registry with a valid registry data file. + */ + inline Registry(const Registry_Api* pApi); + + /** Constructor. + This constructor is called with a RegisterLoader for the registry. + The RegistryLoader load the needed DLL and provide the needed api for + the registry. Use open() or create() to initialize the registry with a + valid registry data file. + */ + inline Registry(const RegistryLoader& rLoader); + + /// Copy constructcor + inline Registry(const Registry& toCopy); + + /// Destructor. The Destructor close the registry if it is open. + inline ~Registry(); + + /// Assign operator + inline Registry& operator = (const Registry& toAssign); + + /// isValid checks if the registry points to a valid registry data file. + inline sal_Bool isValid() const; + + /** isReadOnly returns the access mode of the registry. + @return TRUE if accessmode is readonly else FALSE. + */ + inline sal_Bool isReadOnly() const; + + /** openRootKey opens the root key of the registry. + @param rRootKey reference on a RegistryKey which is filled with the rootkey. + @return REG_NO_ERROR if succeeds else an error code. + */ + inline RegError openRootKey(RegistryKey& rRootKey); + + /// getName returns the name of the current registry data file. + inline ::rtl::OUString getName(); + + /** This function creates a new registry with the specified name and creates a root key. + @param registryName specifies the name of the new registry. + @return REG_NO_ERROR if succeeds else an error code. + */ + inline RegError create(const ::rtl::OUString& registryName); + + /** This function opens a registry with the specified name. If the registry alreday points + to a valid registry, the old regitry will be closed. + @param registryName Identifies a registry name. + @param accessMode Specifies the accessmode for the registry, REG_READONLY or REG_READWRITE. + @return REG_NO_ERROR if succeeds else an error code. + */ + inline RegError open(const ::rtl::OUString& registryName, + RegAccessMode accessMode); + + /// close explicitly the current registry data file + inline RegError close(); + + /** This function destroy the specified registry. + @param registryName Identifies a registry name, if the name is an empty string the registry + itselfs will be destroyed. + @return REG_NO_ERROR if succeeds else an error code. + */ + inline RegError destroy(const ::rtl::OUString& registryName); + + /** This function loads registry information from a specified file and save it under the + specified keyName. + @param rKey Specifies the key where the subkey will be created. + @param keyName specifies the name of the subkey. + If keyName is an empty string the registry information is saved under the key + specified by rKey. + @param regFileName specifies the file containing the registry information. + @return REG_NO_ERROR if succeeds else an error code. + */ + inline RegError loadKey(RegistryKey& rKey, + const ::rtl::OUString& keyName, + const ::rtl::OUString& regFileName); + + /** This function saves the registry information from the specified key and all subkeys and save + it in the specified file. + @param rKey Identifies a currently open key. The key which inforamtion is saved by this + function is a subkey of the key identified by hKey. + @param keyName specifies the name of the subkey. + If keyName is an empty string the registry information under the key specified + by rKey is saved in the specified file. + @param regFileName specifies the file containing the registry information. + @return REG_NO_ERROR if succeeds else an error code. + */ + inline RegError saveKey(RegistryKey& rKey, + const ::rtl::OUString& keyName, + const ::rtl::OUString& regFileName); + + /** This function merges the registry information from the specified key and the registry + information of the specified file. Existing keys will extended. + @param rKey Identifies a currently open key. The key which inforamtion is merged by this + function is a subkey of the key identified by hKey. + @param keyName specifies the name of the subkey. + If keyName is an empty string the registry information under the key specified + by rKey is merged with the information from the specified file. + @param regFileName specifies the file containing the registry information. + @param bWarnings if TRUE the function returns an error if a key already exists. + @param bReport if TRUE the function reports warnings on stdout if a key already exists. + @return REG_NO_ERROR if succeeds else an error code. If returns an error the registry will + restore the state before merging. + */ + inline RegError mergeKey(RegistryKey& rKey, + const ::rtl::OUString& keyName, + const ::rtl::OUString& regFileName, + sal_Bool bWarnings = sal_False, + sal_Bool bReport = sal_False); + + /** This function dump the content under the open key to stdout + @param rKey Identifies a currently open key which subtree is dumped. + @return REG_NO_ERROR if succeeds else an error code. + */ + inline RegError dumpRegistry(RegistryKey& rKey); + + friend class RegistryKey; + friend class RegistryKeyArray; + friend class RegistryKeyNames; + + const Registry_Api* getApi() { return m_pApi; } +protected: + + const Registry_Api* m_pApi; + NAMESPACE_VOS(ODynamicLoader) m_Api; + RegHandle m_hImpl; +}; + + +//----------------------------------------------------------------------------- + +/** RegistryKeyArray presents an array of open keys. + RegistryKeyArray is a helper class to work with an array of subkeys. +*/ +class RegistryKeyArray +{ +public: + /// Default constructor + inline RegistryKeyArray(); + + /// Destructor + inline ~RegistryKeyArray(); + + /// This function returns the open key sepecified with index. + inline RegistryKey getElement(sal_uInt32 index); + + /// This function returns the length of the array. + inline sal_uInt32 getLength(); + + friend class RegistryKey; +protected: + inline void setKeyHandles(Registry& registry, RegKeyHandle* phKeys, sal_uInt32 length); + inline RegError closeKeyHandles(); + + sal_uInt32 m_length; + RegKeyHandle* m_phKeys; + Registry m_registry; +}; + + +/** RegistryKeyNames presents an array of subkey names. + RegistryKeyNames is a helper class to work with an array of subkeys. +*/ +class RegistryKeyNames +{ +public: + /// Default constructor + inline RegistryKeyNames(); + + /// Destructor + inline ~RegistryKeyNames(); + + /// This function returns the name of the key sepecified with index. + inline ::rtl::OUString getElement(sal_uInt32 index); + + /// This function returns the length of the array. + inline sal_uInt32 getLength(); + + friend class RegistryKey; +protected: + inline void setKeyNames(Registry& registry, rtl_uString** pKeyNames, sal_uInt32 length); + inline RegError freeKeyNames(); + + sal_uInt32 m_length; + rtl_uString** m_pKeyNames; + Registry m_registry; +}; + +//----------------------------------------------------------------------------- + +/** RegistryValueList presents an value list of the specified type. + RegistryValueList is a helper class to work with a list value. +*/ +template +class RegistryValueList +{ +public: + /// Default constructor + RegistryValueList() + : m_length(0) + , m_pValueList(NULL) + , m_registry(NULL) + {} + + /// Destructor + ~RegistryValueList() + { + if (m_pValueList) + { + m_registry.getApi()->freeValueList(m_valueType, m_pValueList, m_length); + } + } + + /// This function returns the value of the list with the sepecified index. + ValueType getElement(sal_uInt32 index) + { + if (m_registry.isValid() && index < m_length) + { + return m_pValueList[index]; + } else + { + return 0; + } + } + + /// This function returns the length of the list. + sal_uInt32 getLength() + { + return m_length; + } + + friend class RegistryKey; +protected: + void setValueList(Registry& registry, RegValueType valueType, + ValueType* pValueList, sal_uInt32 length) + { + m_length = length; + m_pValueList = pValueList; + m_valueType = valueType; + m_registry = registry; + } + + sal_uInt32 m_length; + ValueType* m_pValueList; + RegValueType m_valueType; + Registry m_registry; +}; + +//----------------------------------------------------------------------------- + +/** RegistryKey read and write information for the specified key in a registry. + Class is inline and use a load on call C-Api. +*/ +class RegistryKey +{ +public: + /// Default constructor + inline RegistryKey(); + + /// Copy constructor + inline RegistryKey(const RegistryKey& toCopy); + + /// Destructor. The Destructor close the key if it is open. + inline ~RegistryKey(); + + /// Assign operator + inline RegistryKey& operator = (const RegistryKey& toAssign); + + /// isValid checks if the key points to a valid registry key. + inline sal_Bool isValid() const; + + /** isReadOnly returns the access mode of the key. + @return TRUE if accessmode is read only else FALSE. + */ + inline sal_Bool isReadOnly() const; + + /// getName returns the full name of the key beginning with the rootkey. + inline ::rtl::OUString getName(); + + /** This function creates the specified key. If the key already exists in the registry, + the function opens it. + @param keyName specifies the name of the key which will be opened or created. + @param rNewKey Reference a RegistryKey which will be filled with the new or open key. + @return REG_NO_ERROR if succeeds else an error code. + */ + inline RegError createKey(const ::rtl::OUString& keyName, + RegistryKey& rNewKey); + + /** This function opens the specified key. + @param keyName Points to a null terminated string specifying the name of a key that this + function opens. + @param rOpenKey Reference a RegistryKey which will be filled with the open key. + @return REG_NO_ERROR if succeeds else an error code. + */ + inline RegError openKey(const ::rtl::OUString& keyName, + RegistryKey& rOpenKey); + + /** This function returns the names of all subkeys of the key. + @param keyName Points to a null terminated string specifying the name of a key. + @param rSubKeys Reference a RegistryKeyArray which will be filled with the names of the subkeys. + @return REG_NO_ERROR if succeeds else an error code. + */ + inline RegError openSubKeys(const ::rtl::OUString& keyName, + RegistryKeyArray& rSubKeys); + + /** This function opens all subkeys of the key. + @param keyName Points to a null terminated string specifying the name of a key that subkeys + this function opens. + @param rSubKeyNames Reference a RegistryKeyNames array which will be filled with the open subkeys. + @return REG_NO_ERROR if succeeds else an error code. + */ + inline RegError getKeyNames(const ::rtl::OUString& keyName, + RegistryKeyNames& rSubKeyNames); + + /** This function close all subkeys specified in the array. + @param rSubKeys Reference a RegistryKeyArray which contains the open subkeys. + @return REG_NO_ERROR if succeeds else an error code. + */ + inline RegError closeSubKeys(RegistryKeyArray& rSubKeys); + + /** This function deletes the specified key. + @param keyName specifies the name of the key which will be deleted. + @return REG_NO_ERROR if succeeds else an error code. + */ + inline RegError deleteKey(const ::rtl::OUString& keyName); + + /// close explicitly the current key + inline RegError closeKey(); + + /** This function sets an value under the key. + @param keyName specifies the name of the key which value is set by this function. + If keyName is an empty string, the value is set for the key + specified by hKey. + @param valueType Specified the type of the value. + @param pData Points to a memory block containing the current data for the value. + @param valueSize Specified the size of pData in bytes + @return REG_NO_ERROR if succeeds else an error code. + */ + inline RegError setValue(const ::rtl::OUString& keyName, + RegValueType valueType, + RegValue pValue, + sal_uInt32 valueSize); + + /** This function sets an long list value under the key. + @param keyName specifies the name of the key which value is set by this function. + If keyName is an empty string, the value is set for the key + specified by hKey. + @param pValueList Points to an array of longs containing the current data for the value. + @param len Specified the len of pValueList. + @return REG_NO_ERROR if succeeds else an error code. + */ + inline RegError setLongListValue(const ::rtl::OUString& keyName, + sal_Int32* pValueList, + sal_uInt32 len); + + /** This function sets an ascii list value under the key. + @param keyName specifies the name of the key which value is set by this function. + If keyName is an empty string, the value is set for the key + specified by hKey. + @param pValueList Points to an array of sal_Char* containing the current data for the value. + @param len Specified the len of pValueList. + @return REG_NO_ERROR if succeeds else an error code. + */ + inline RegError setStringListValue(const ::rtl::OUString& keyName, + sal_Char** pValueList, + sal_uInt32 len); + + /** This function sets an unicode string list value under the key. + @param keyName specifies the name of the key which value is set by this function. + If keyName is an empty string, the value is set for the key + specified by hKey. + @param pValueList Points to an array of sal_Unicode* containing the current data for the value. + @param len Specified the len of pValueList. + @return REG_NO_ERROR if succeeds else an error code. + */ + inline RegError setUnicodeListValue(const ::rtl::OUString& keyName, + sal_Unicode** pValueList, + sal_uInt32 len); + + /** This function gets info about type and size of the value. + @param keyName specifies the name of the key which value is set by this function. + If keyName is an empty string, the value is set for the key + specified by hKey. + @param pValueType Specified the type of the value. + @param pValueSize Specified the size of pData in bytes or the length of a list value. + @return REG_NO_ERROR if succeeds else an error code. + */ + inline RegError getValueInfo(const ::rtl::OUString& keyName, + RegValueType* pValueType, + sal_uInt32* pValueSize); + + /** This function gets the value under the specified key. + @param keyName specifies the name of the key which value is get by this function. + If keyName is an empty string, the value is get from the key + specified by hKey. + @param pValue Points to an allocated memory block receiving the current data for the value. + @return REG_NO_ERROR if succeeds else an error code. + */ + inline RegError getValue(const ::rtl::OUString& keyName, + RegValue pValue); + + /** This function gets the value under the specified key. + @param keyName specifies the name of the key which value is get by this function. + If keyName is an empty string, the value is get from the key + specified by hKey. + @param rValueList Reference a RegistryValueList which will be filled with the ascii values. + @return REG_NO_ERROR if succeeds else an error code. + */ + inline RegError getLongListValue(const ::rtl::OUString& keyName, + RegistryValueList& rValueList); + + /** This function gets the value under the specified key. + @param keyName specifies the name of the key which value is get by this function. + If keyName is an empty string, the value is get from the key + specified by hKey. + @param rValueList Reference a RegistryValueList which will be filled with the ascii values. + @return REG_NO_ERROR if succeeds else an error code. + */ + inline RegError getStringListValue(const ::rtl::OUString& keyName, + RegistryValueList& rValueList); + + /** This function gets the value under the specified key. + @param keyName specifies the name of the key which value is get by this function. + If keyName is an empty string, the value is get from the key + specified by hKey. + @param rValueList Reference a RegistryValueList which will be filled with the unicode values. + @return REG_NO_ERROR if succeeds else an error code. + */ + inline RegError getUnicodeListValue(const ::rtl::OUString& keyName, + RegistryValueList& rValueList); + + + inline RegError createLink(const ::rtl::OUString& linkName, + const ::rtl::OUString& linkTarget); + + inline RegError deleteLink(const ::rtl::OUString& linkName); + + inline RegError getKeyType(const ::rtl::OUString& name, + RegKeyType* pKeyType) const; + + inline RegError getLinkTarget(const ::rtl::OUString& linkName, + ::rtl::OUString& rLinkTarget) const; + + /** This function will resolved all or only the first link of a keyname + and returns the resolved keyName in rResolvedName. + @param keyName specifies the relativ name of the key which name will be resolved. + @return REG_NO_ERROR if succeeds else an error code. + */ + inline RegError getResolvedKeyName(const ::rtl::OUString& keyName, + sal_Bool firstLinkOnly, + ::rtl::OUString& rResolvedName) const; + + /** getRegistryName returns the name of the current registry in which + the key is defined. + */ + inline ::rtl::OUString getRegistryName(); + + /// getRegistry returns the registry in which the key is defined. + Registry getRegistry() const { return m_registry; } + + friend class Registry; +public: + inline RegistryKey(Registry& registry, + RegKeyHandle hKey); + + RegKeyHandle getKeyHandle() const { return m_hImpl; } + +protected: + inline void setRegistry(Registry& registry); + + Registry m_registry; + RegKeyHandle m_hImpl; +}; + + +//----------------------------------------------------------------------------- + +inline RegistryKeyArray::RegistryKeyArray() + : m_length(0) + , m_phKeys(NULL) + , m_registry(NULL) +{ +} + +inline RegistryKeyArray::~RegistryKeyArray() +{ + if (m_phKeys) + m_registry.m_pApi->closeSubKeys(m_phKeys, m_length); +} + +inline RegistryKey RegistryKeyArray::getElement(sal_uInt32 index) +{ + if (m_registry.isValid() && index < m_length) + return RegistryKey(m_registry, m_phKeys[index]); + else + return RegistryKey(); +} + +inline sal_uInt32 RegistryKeyArray::getLength() +{ + return m_length; +} + +inline void RegistryKeyArray::setKeyHandles(Registry& registry, + RegKeyHandle* phKeys, + sal_uInt32 length) +{ + m_phKeys = phKeys; + m_length = length; + m_registry = registry; +} + +inline RegError RegistryKeyArray::closeKeyHandles() +{ + if (m_registry.isValid() && m_phKeys) + { + RegError ret; + ret = m_registry.m_pApi->closeSubKeys(m_phKeys, m_length); + m_registry = Registry(m_registry.m_pApi); + m_length = 0; + m_phKeys = NULL; + return ret; + } else + return(REG_INVALID_KEY); +} + +//----------------------------------------------------------------------------- + +inline RegistryKeyNames::RegistryKeyNames() + : m_length(0) + , m_pKeyNames(NULL) + , m_registry(NULL) +{ +} + +inline RegistryKeyNames::~RegistryKeyNames() +{ + if (m_pKeyNames) + m_registry.m_pApi->freeKeyNames(m_pKeyNames, m_length); +} + +inline ::rtl::OUString RegistryKeyNames::getElement(sal_uInt32 index) +{ + + if (m_pKeyNames && index < m_length) + return m_pKeyNames[index]; + else + return ::rtl::OUString(); +} + +inline sal_uInt32 RegistryKeyNames::getLength() +{ + return m_length; +} + +inline void RegistryKeyNames::setKeyNames(Registry& registry, + rtl_uString** pKeyNames, + sal_uInt32 length) +{ + m_pKeyNames = pKeyNames; + m_length = length; + m_registry = registry; +} + +inline RegError RegistryKeyNames::freeKeyNames() +{ + if (m_registry.isValid() && m_pKeyNames) + { + RegError ret = REG_NO_ERROR; + ret = m_registry.m_pApi->freeKeyNames(m_pKeyNames, m_length); + m_registry = Registry(m_registry.m_pApi); + m_length = 0; + m_pKeyNames = NULL; + return ret; + } else + return REG_INVALID_KEY; +} + +//----------------------------------------------------------------------------- + +inline RegistryKey::RegistryKey() + : m_registry(NULL) + , m_hImpl(NULL) + { } + +inline RegistryKey::RegistryKey(Registry& registry, RegKeyHandle hKey) + : m_registry(registry) + , m_hImpl(hKey) + { + if (m_hImpl) + m_registry.m_pApi->acquireKey(m_hImpl); + } + +inline RegistryKey::RegistryKey(const RegistryKey& toCopy) + : m_registry(toCopy.m_registry) + , m_hImpl(toCopy.m_hImpl) + { + if (m_hImpl) + m_registry.m_pApi->acquireKey(m_hImpl); + } + +inline void RegistryKey::setRegistry(Registry& registry) + { + m_registry = registry; + } + +inline RegistryKey::~RegistryKey() + { + if (m_hImpl) + m_registry.m_pApi->closeKey(m_hImpl); + } + +inline RegistryKey& RegistryKey::operator = (const RegistryKey& toAssign) +{ + m_registry = toAssign.m_registry; + + if (m_hImpl != toAssign.m_hImpl) + { + m_registry.m_pApi->releaseKey(m_hImpl); + m_hImpl = toAssign.m_hImpl; + m_registry.m_pApi->acquireKey(m_hImpl); + } + + return *this; +} + +inline sal_Bool RegistryKey::isValid() const + { return (m_hImpl != NULL); } + +inline sal_Bool RegistryKey::isReadOnly() const + { + if (m_registry.isValid()) + return (m_registry.m_pApi)->isKeyReadOnly(m_hImpl); + else + return sal_False; + } + +inline ::rtl::OUString RegistryKey::getName() + { + ::rtl::OUString sRet; + if (m_registry.isValid()) + m_registry.m_pApi->getKeyName(m_hImpl, &sRet.pData); + return sRet;; + } + +inline RegError RegistryKey::createKey(const ::rtl::OUString& keyName, + RegistryKey& rNewKey) + { + if (rNewKey.isValid()) rNewKey.closeKey(); + if (m_registry.isValid()) + { + RegError ret = m_registry.m_pApi->createKey(m_hImpl, keyName.pData, &rNewKey.m_hImpl); + if (!ret) rNewKey.setRegistry(m_registry); + return ret; + } else + return REG_INVALID_KEY; + } + +inline RegError RegistryKey::openKey(const ::rtl::OUString& keyName, + RegistryKey& rOpenKey) + { + if (rOpenKey.isValid()) rOpenKey.closeKey(); + if (m_registry.isValid()) + { + RegError ret = m_registry.m_pApi->openKey(m_hImpl, keyName.pData, + &rOpenKey.m_hImpl); + if (!ret) rOpenKey.setRegistry(m_registry); + return ret; + } else + return REG_INVALID_KEY; + } + +inline RegError RegistryKey::openSubKeys(const ::rtl::OUString& keyName, + RegistryKeyArray& rSubKeys) + { + if (m_registry.isValid()) + { + RegError ret = REG_NO_ERROR; + RegKeyHandle* pSubKeys; + sal_uInt32 nSubKeys; + if (ret = m_registry.m_pApi->openSubKeys(m_hImpl, keyName.pData, + &pSubKeys, &nSubKeys)) + { + return ret; + } else + { + rSubKeys.setKeyHandles(m_registry, pSubKeys, nSubKeys); + return ret; + } + } else + return REG_INVALID_KEY; + } + +inline RegError RegistryKey::getKeyNames(const ::rtl::OUString& keyName, + RegistryKeyNames& rSubKeyNames) + { + if (m_registry.isValid()) + { + RegError ret = REG_NO_ERROR; + rtl_uString** pSubKeyNames; + sal_uInt32 nSubKeys; + if (ret = m_registry.m_pApi->getKeyNames(m_hImpl, keyName.pData, + &pSubKeyNames, &nSubKeys)) + { + return ret; + } else + { + rSubKeyNames.setKeyNames(m_registry, pSubKeyNames, nSubKeys); + return ret; + } + } else + return REG_INVALID_KEY; + } + +inline RegError RegistryKey::closeSubKeys(RegistryKeyArray& rSubKeys) + { + if (m_registry.isValid()) + return rSubKeys.closeKeyHandles(); + else + return REG_INVALID_KEY; + } + +inline RegError RegistryKey::deleteKey(const ::rtl::OUString& keyName) + { + if (m_registry.isValid()) + return m_registry.m_pApi->deleteKey(m_hImpl, keyName.pData); + else + return REG_INVALID_KEY; + } + +inline RegError RegistryKey::closeKey() + { + if (m_registry.isValid()) + { + RegError ret = m_registry.m_pApi->closeKey(m_hImpl); + if (!ret) + { + m_hImpl = NULL; + m_registry = Registry(m_registry.m_pApi); + } + return ret; + } else + return REG_INVALID_KEY; + } + +inline RegError RegistryKey::setValue(const ::rtl::OUString& keyName, + RegValueType valueType, + RegValue pValue, + sal_uInt32 valueSize) + { + if (m_registry.isValid()) + return m_registry.m_pApi->setValue(m_hImpl, keyName.pData, valueType, + pValue, valueSize); + else + return REG_INVALID_KEY; + } + +inline RegError RegistryKey::setLongListValue(const ::rtl::OUString& keyName, + sal_Int32* pValueList, + sal_uInt32 len) + { + if (m_registry.isValid()) + return m_registry.m_pApi->setLongListValue(m_hImpl, keyName.pData, + pValueList, len); + else + return REG_INVALID_KEY; + } + +inline RegError RegistryKey::setStringListValue(const ::rtl::OUString& keyName, + sal_Char** pValueList, + sal_uInt32 len) + { + if (m_registry.isValid()) + return m_registry.m_pApi->setStringListValue(m_hImpl, keyName.pData, + pValueList, len); + else + return REG_INVALID_KEY; + } + +inline RegError RegistryKey::setUnicodeListValue(const ::rtl::OUString& keyName, + sal_Unicode** pValueList, + sal_uInt32 len) + { + if (m_registry.isValid()) + return m_registry.m_pApi->setUnicodeListValue(m_hImpl, keyName.pData, + pValueList, len); + else + return REG_INVALID_KEY; + } + +inline RegError RegistryKey::getValueInfo(const ::rtl::OUString& keyName, + RegValueType* pValueType, + sal_uInt32* pValueSize) + { + if (m_registry.isValid()) + return m_registry.m_pApi->getValueInfo(m_hImpl, keyName.pData, pValueType, pValueSize); + else + return REG_INVALID_KEY; + } + +inline RegError RegistryKey::getValue(const ::rtl::OUString& keyName, + RegValue pValue) + { + if (m_registry.isValid()) + return m_registry.m_pApi->getValue(m_hImpl, keyName.pData, pValue); + else + return REG_INVALID_KEY; + } + +inline RegError RegistryKey::getLongListValue(const ::rtl::OUString& keyName, + RegistryValueList& rValueList) + { + if (m_registry.isValid()) + { + RegError ret = REG_NO_ERROR; + sal_Int32* pValueList; + sal_uInt32 length; + if (ret = m_registry.m_pApi->getLongListValue(m_hImpl, keyName.pData, + &pValueList, &length)) + { + return ret; + } else + { + rValueList.setValueList(m_registry, RG_VALUETYPE_LONGLIST, + pValueList, length); + return ret; + } + } else + return REG_INVALID_KEY; + } + +inline RegError RegistryKey::getStringListValue(const ::rtl::OUString& keyName, + RegistryValueList& rValueList) + { + if (m_registry.isValid()) + { + RegError ret = REG_NO_ERROR; + sal_Char** pValueList; + sal_uInt32 length; + if (ret = m_registry.m_pApi->getStringListValue(m_hImpl, keyName.pData, + &pValueList, &length)) + { + return ret; + } else + { + rValueList.setValueList(m_registry, RG_VALUETYPE_STRINGLIST, + pValueList, length); + return ret; + } + } else + return REG_INVALID_KEY; + } + +inline RegError RegistryKey::getUnicodeListValue(const ::rtl::OUString& keyName, + RegistryValueList& rValueList) + { + if (m_registry.isValid()) + { + RegError ret = REG_NO_ERROR; + sal_Unicode** pValueList; + sal_uInt32 length; + if (ret = m_registry.m_pApi->getUnicodeListValue(m_hImpl, keyName.pData, + &pValueList, &length)) + { + return ret; + } else + { + rValueList.setValueList(m_registry, RG_VALUETYPE_UNICODELIST, + pValueList, length); + return ret; + } + } else + return REG_INVALID_KEY; + } + +inline RegError RegistryKey::createLink(const ::rtl::OUString& linkName, + const ::rtl::OUString& linkTarget) + { + if (m_registry.isValid()) + return m_registry.m_pApi->createLink(m_hImpl, linkName.pData, linkTarget.pData); + else + return REG_INVALID_KEY; + } + +inline RegError RegistryKey::deleteLink(const ::rtl::OUString& linkName) + { + if (m_registry.isValid()) + return m_registry.m_pApi->deleteLink(m_hImpl, linkName.pData); + else + return REG_INVALID_KEY; + } + +inline RegError RegistryKey::getKeyType(const ::rtl::OUString& keyName, + RegKeyType* pKeyType) const + { + if (m_registry.isValid()) + return m_registry.m_pApi->getKeyType(m_hImpl, keyName.pData, pKeyType); + else + return REG_INVALID_KEY; + } + +inline RegError RegistryKey::getLinkTarget(const ::rtl::OUString& linkName, + ::rtl::OUString& rLinkTarget) const + { + if (m_registry.isValid()) + { + return m_registry.m_pApi->getLinkTarget(m_hImpl, + linkName.pData, + &rLinkTarget.pData); + } else + return REG_INVALID_KEY; + } + + +inline RegError RegistryKey::getResolvedKeyName(const ::rtl::OUString& keyName, + sal_Bool firstLinkOnly, + ::rtl::OUString& rResolvedName) const + { + if (m_registry.isValid()) + return m_registry.m_pApi->getResolvedKeyName(m_hImpl, + keyName.pData, + firstLinkOnly, + &rResolvedName.pData); + else + return REG_INVALID_KEY; + } + +inline ::rtl::OUString RegistryKey::getRegistryName() + { + if (m_registry.isValid()) + { + return m_registry.getName(); + } else + return ::rtl::OUString(); + } + +//----------------------------------------------------------------------------- + +inline Registry::Registry(const Registry_Api* pApi) + : m_pApi(pApi) + , m_Api() + , m_hImpl(NULL) + { } + +inline Registry::Registry(const RegistryLoader& rLoader) + : m_pApi(NULL) + , m_Api(rLoader) + , m_hImpl(NULL) + { + m_pApi = m_Api.getApi(); + } + +inline Registry::Registry(const Registry& toCopy) + : m_pApi(toCopy.m_pApi) + , m_Api(toCopy.m_Api) + , m_hImpl(toCopy.m_hImpl) + { + if (m_hImpl) + m_pApi->acquire(m_hImpl); + } + + +inline Registry::~Registry() + { + if (m_pApi && m_hImpl) + m_pApi->release(m_hImpl); + } + +inline Registry& Registry::operator = (const Registry& toAssign) +{ + + if (m_hImpl != toAssign.m_hImpl) + { + if (m_pApi) m_pApi->release(m_hImpl); + m_pApi = toAssign.m_pApi; + m_Api = toAssign.m_Api; + m_hImpl = toAssign.m_hImpl; + } + if (m_hImpl && m_pApi) + m_pApi->acquire(m_hImpl); + + return *this; +} + +inline sal_Bool Registry::isValid() const + { return ( m_hImpl != NULL && m_pApi != NULL ); } + +inline sal_Bool Registry::isReadOnly() const + { return m_pApi->isReadOnly(m_hImpl); } + +inline RegError Registry::openRootKey(RegistryKey& rRootKey) + { + rRootKey.setRegistry(*this); + return m_pApi->openRootKey(m_hImpl, &rRootKey.m_hImpl); + } + +inline ::rtl::OUString Registry::getName() + { + ::rtl::OUString sRet; + m_pApi->getName(m_hImpl, &sRet.pData); + return sRet; + } + +inline RegError Registry::create(const ::rtl::OUString& registryName) + { + if (m_hImpl) + m_pApi->release(m_hImpl); + return m_pApi->createRegistry(registryName.pData, &m_hImpl); + } + +inline RegError Registry::open(const ::rtl::OUString& registryName, + RegAccessMode accessMode) + { + if (m_hImpl) + m_pApi->release(m_hImpl); + return m_pApi->openRegistry(registryName.pData, &m_hImpl, accessMode); + } + +inline RegError Registry::close() + { + RegError ret = m_pApi->closeRegistry(m_hImpl); + if (!ret) + m_hImpl = NULL; + return ret; + } + +inline RegError Registry::destroy(const ::rtl::OUString& registryName) + { + RegError ret = m_pApi->destroyRegistry(m_hImpl, registryName.pData); + if ( !ret && (registryName.getLength() == 0) ) + m_hImpl = NULL; + return ret; + } + +inline RegError Registry::loadKey(RegistryKey& rKey, + const ::rtl::OUString& keyName, + const ::rtl::OUString& regFileName) + { return m_pApi->loadKey(m_hImpl, rKey.m_hImpl, keyName.pData, regFileName.pData); } + +inline RegError Registry::saveKey(RegistryKey& rKey, + const ::rtl::OUString& keyName, + const ::rtl::OUString& regFileName) + { return m_pApi->saveKey(m_hImpl, rKey.m_hImpl, keyName.pData, regFileName.pData); } + +inline RegError Registry::mergeKey(RegistryKey& rKey, + const ::rtl::OUString& keyName, + const ::rtl::OUString& regFileName, + sal_Bool bWarnings, + sal_Bool bReport) + { return m_pApi->mergeKey(m_hImpl, rKey.m_hImpl, keyName.pData, regFileName.pData, bWarnings, bReport); } + +inline RegError Registry::dumpRegistry(RegistryKey& rKey) + { return m_pApi->dumpRegistry(m_hImpl, rKey.m_hImpl); } + + +#endif diff --git a/registry/inc/registry/regtype.h b/registry/inc/registry/regtype.h new file mode 100644 index 000000000000..42f8643e3fa7 --- /dev/null +++ b/registry/inc/registry/regtype.h @@ -0,0 +1,185 @@ +/************************************************************************* + * + * $RCSfile: regtype.h,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:18:42 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +#ifndef _REGISTRY_REGTYPE_H_ +#define _REGISTRY_REGTYPE_H_ + +#ifndef _SAL_TYPES_H_ +#include +#endif + +// version number of the library. This number is used for the load on call +// mechanism and must be modifed when the library will be upgraded to a new version. +#define LIBRARY_VERSION 2 + +typedef void* RegHandle; + +typedef void* RegKeyHandle; + +typedef void* RegValue; + +typedef sal_uInt16 RegAccessMode; + +#define REG_READONLY 0x0001 // allow read accesses only +#define REG_READWRITE 0x0002 // allow read and write accesses + +/// RegKeyType specify the type of the key, if it is a real key or a link +enum RegKeyType +{ + /// The key is a real key + RG_KEYTYPE, + /// The key is a link + RG_LINKTYPE +}; + +/// RegValueType specify the type of the value of a key +enum RegValueType +{ + /// The key has no value + RG_VALUETYPE_NOT_DEFINED, + /// The key has a value of type long + RG_VALUETYPE_LONG, + /// The key has a value of type ascii + RG_VALUETYPE_STRING, + /// The key has a value of type unicode + RG_VALUETYPE_UNICODE, + /// The key has a value of type binary + RG_VALUETYPE_BINARY, + /// The key has a value of type long list + RG_VALUETYPE_LONGLIST, + /// The key has a value of type ascii list + RG_VALUETYPE_STRINGLIST, + /// The key has a value of type unicode list + RG_VALUETYPE_UNICODELIST +}; + +/// RegError specify the possible error codes +enum RegError +{ + /// no error + REG_NO_ERROR, + /// internal registry error + REG_INTERNAL_ERROR, + + /// registry is not open + REG_REGISTRY_NOT_OPEN, + /// registry does not exists + REG_REGISTRY_NOT_EXISTS, + /// registry is readonly + REG_REGISTRY_READONLY, + /// destroy registry failed. Ther are may be any open keys. + REG_DESTROY_REGISTRY_FAILED, + /** registry cannot open for readwrite because the registry is already + open for readwrite anywhere. + */ + REG_CANNOT_OPEN_FOR_READWRITE, + /** registry is in a invalid state or the registry does not point to + a valid registry data file + */ + REG_INVALID_REGISTRY, + + /// The key is not open + REG_KEY_NOT_OPEN, + /// The key not exists + REG_KEY_NOT_EXISTS, + /// The key cannot created + REG_CREATE_KEY_FAILED, + /// The key cannot not deleted + REG_DELETE_KEY_FAILED, + /** The keyname is invalid. This error will return if the keyname + is NULL but should not be NULL in the context of called function. + */ + REG_INVALID_KEYNAME, + /// The key is not in a valid state + REG_INVALID_KEY, + + /// key has no value + REG_VALUE_NOT_EXISTS, + /// + REG_SET_VALUE_FAILED, + /// + REG_DELETE_VALUE_FAILED, + /// + REG_INVALID_VALUE, + + /// + REG_MERGE_ERROR, + /// + REG_MERGE_CONFLICT, + + /// + REG_DETECT_RECURSION, + /// + REG_INVALID_LINK, + /// + REG_INVALID_LINKNAME, + /// + REG_INVALID_LINKTARGET, + /// + REG_LINKTARGET_NOT_EXIST, + /// + REG_BUFFERSIZE_TOSMALL +}; + + +#define REGISTRY_CALLTYPE SAL_CALL + +#endif diff --git a/registry/prj/d.lst b/registry/prj/d.lst new file mode 100644 index 000000000000..e3086d058171 --- /dev/null +++ b/registry/prj/d.lst @@ -0,0 +1,20 @@ +dos: mkdir %_DEST%\inc%_EXT%\registry +mkdir: %_DEST%\lib%_EXT%\libreg2.dylib.framework + +..\inc\registry\*.h %_DEST%\inc%_EXT%\registry\*.h +..\inc\registry\*.hxx %_DEST%\inc%_EXT%\registry\*.hxx + +..\%__SRC%\lib\ireg.lib %_DEST%\lib%_EXT%\ireg.lib +..\%__SRC%\lib\libreg*.so %_DEST%\lib%_EXT%\libreg*.so +..\%__SRC%\lib\libreg*.so.* %_DEST%\lib%_EXT%\libreg*.so.* +..\%__SRC%\bin\reg*.dll %_DEST%\bin%_EXT%\reg*.dll +..\%__SRC%\lib\libreg*.dylib %_DEST%\lib%_EXT%\libreg*.dylib +..\%__SRC%\lib\libreg2.dylib.framework\libreg*.dylib %_DEST%\lib%_EXT%\libreg2.dylib.framework\libreg*.dylib + +..\%__SRC%\bin\regmerge.exe %_DEST%\bin%_EXT%\regmerge.exe +..\%__SRC%\bin\regview.exe %_DEST%\bin%_EXT%\regview.exe +..\%__SRC%\bin\regmerge %_DEST%\bin%_EXT%\regmerge +..\%__SRC%\bin\regview %_DEST%\bin%_EXT%\regview +..\version.mk %_DEST%\inc%_EXT%\registry\version.mk + + diff --git a/registry/source/keyimpl.cxx b/registry/source/keyimpl.cxx new file mode 100644 index 000000000000..88ab180472c7 --- /dev/null +++ b/registry/source/keyimpl.cxx @@ -0,0 +1,1260 @@ +/************************************************************************* + * + * $RCSfile: keyimpl.cxx,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:18:42 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +#ifndef __REFLCNST_HXX__ +#include "reflcnst.hxx" +#endif + +#include "keyimpl.hxx" + +#ifndef _RTL_ALLOC_H_ +#include +#endif + +#ifndef _RTL_MEMORY_H_ +#include +#endif + +//********************************************************************* +// ORegKey() +// +ORegKey::ORegKey(const OUString& keyName, const OStoreDirectory& rStoreDir, ORegistry* pReg) + : m_refCount(1) + , m_name(keyName) + , m_bDeleted(sal_False) + , m_isLink(sal_False) + , m_pRegistry(pReg) +{ + if (pReg) + { + m_storeFile = pReg->getStoreFile(); + } + + checkLink(); +} + +//********************************************************************* +// ORegKey() +// +ORegKey::ORegKey(const OUString& keyName, const OUString& linkName, + const OStoreDirectory& rStoreDir, ORegistry* pReg) + : m_refCount(1) + , m_name(keyName) + , m_bDeleted(sal_False) + , m_pRegistry(pReg) +{ + if (linkName.getLength()) + { + m_link = linkName; + m_isLink = sal_True; + + setValue(OUString( RTL_CONSTASCII_USTRINGPARAM("LINK_TARGET") ), RG_VALUETYPE_UNICODE, + (RegValue*)linkName.pData->buffer, linkName.getLength()+1); + } else + { + m_isLink = sal_False; + } +} + +//********************************************************************* +// ORegKey() +// +ORegKey::ORegKey() + : m_refCount(1) + , m_bDeleted(sal_False) + , m_isLink(sal_False) + , m_pRegistry(NULL) +{ +} + + +//********************************************************************* +// ~ORegKey() +// +ORegKey::~ORegKey() +{ +} + + +//********************************************************************* +// createKey +// +RegError ORegKey::createKey(const OUString& keyName, RegKeyHandle* phNewKey) +{ + return m_pRegistry->createKey(this, keyName, phNewKey); +} + + +//********************************************************************* +// openKey +// +RegError ORegKey::openKey(const OUString& keyName, RegKeyHandle* phOpenKey, RESOLVE eResolve) +{ + return (m_pRegistry->openKey(this, keyName, phOpenKey, eResolve)); +} + + +//********************************************************************* +// openSubKeys +// +RegError ORegKey::openSubKeys(const OUString& keyName, RegKeyHandle** phOpenSubKeys, sal_uInt32* pnSubKeys) +{ + ORegKey* pKey; + OUString sFullKeyName, sSubKeyName; + RegKeyHandle hSKey, hSubKey; + RegError _ret = REG_NO_ERROR; + sal_uInt32 nSubKeys; + ORegKey* *subKeys; + + if ( keyName.getLength() ) + { + if ((_ret = openKey(keyName, &hSKey))) + { + *phOpenSubKeys = NULL; + *pnSubKeys = 0; + return _ret; + } + + pKey = (ORegKey*)hSKey; + } else + { + pKey = this; + } + + nSubKeys = pKey->countSubKeys(); + + *pnSubKeys = nSubKeys; + subKeys = (ORegKey**)rtl_allocateZeroMemory(nSubKeys * sizeof(ORegKey*)); + + OStoreDirectory::iterator iter; + OStoreDirectory rStoreDir(pKey->getStoreDir()); + storeError _err = rStoreDir.first(iter); + + nSubKeys = 0; + while ( _err == store_E_None ) + { + if ( iter.m_nAttrib & STORE_ATTRIB_ISDIR ) + { + sSubKeyName = iter.m_pszName; + sFullKeyName = pKey->getName(); + if (sFullKeyName.getLength() > 1) + sFullKeyName += m_pRegistry->ROOT; + sFullKeyName += sSubKeyName; + + if (_ret = pKey->openKey(sSubKeyName, &hSubKey)) + { + *phOpenSubKeys = NULL; + *pnSubKeys = 0; + rtl_freeMemory(subKeys); + return _ret; + } + + subKeys[nSubKeys] = ((ORegKey*)hSubKey); + + nSubKeys++; + } + + _err = rStoreDir.next(iter); + } + + *phOpenSubKeys = (RegKeyHandle*)subKeys; + if (keyName.getLength()) + { + closeKey(hSKey); + } + return REG_NO_ERROR; +} + + +//********************************************************************* +// getKeyNames +// +RegError ORegKey::getKeyNames(const OUString& keyName, + rtl_uString*** pSubKeyNames, + sal_uInt32* pnSubKeys) +{ + ORegKey* pKey; + OUString sFullKeyName, sSubKeyName; + RegError _ret = REG_NO_ERROR; + sal_uInt32 nSubKeys; + rtl_uString** pSubKeys; + + if (keyName.getLength()) + { + if (_ret = openKey(keyName, (RegKeyHandle*)&pKey, RESOLVE_PART)) + { + *pSubKeyNames = NULL; + *pnSubKeys = 0; + return _ret; + } + } else + { + pKey = this; + } + + nSubKeys = pKey->countSubKeys(); + + *pnSubKeys = nSubKeys; + pSubKeys = (rtl_uString**)rtl_allocateZeroMemory(nSubKeys * sizeof(rtl_uString*)); + + OStoreDirectory::iterator iter; + OStoreDirectory rStoreDir(pKey->getStoreDir()); + storeError _err = rStoreDir.first(iter); + OUString subKey; + + nSubKeys = 0; + + while ( _err == store_E_None ) + { + if ( iter.m_nAttrib & STORE_ATTRIB_ISDIR) + { + sSubKeyName = iter.m_pszName; + sFullKeyName = pKey->getName(); + if (sFullKeyName.getLength() > 1) + sFullKeyName += m_pRegistry->ROOT; + sFullKeyName += sSubKeyName; + + subKey = sFullKeyName; + rtl_uString_newFromString(&pSubKeys[nSubKeys], subKey.pData); + + nSubKeys++; + } + + _err = rStoreDir.next(iter); + } + + *pSubKeyNames = pSubKeys; + if (keyName.getLength()) + { + closeKey((RegKeyHandle)pKey); + } + return REG_NO_ERROR; +} + + +//********************************************************************* +// closeSubKeys +// +RegError ORegKey::closeSubKeys(RegKeyHandle* phSubKeys, sal_uInt32 nSubKeys) +{ + RegError _ret = REG_NO_ERROR; + + for (int i=0; i < nSubKeys; i++) + { + _ret = closeKey(phSubKeys[i]); + } + + rtl_freeMemory(phSubKeys); + return _ret; +} + + +//********************************************************************* +// closeKey +// +RegError ORegKey::closeKey(RegKeyHandle hKey) +{ + return (m_pRegistry->closeKey(hKey)); +} + + +//********************************************************************* +// deleteKey +// +RegError ORegKey::deleteKey(const OUString& keyName) +{ + return (m_pRegistry->deleteKey(this, keyName)); +} + + +//********************************************************************* +// getValueType +// +RegError ORegKey::getValueInfo(const OUString& valueName, RegValueType* pValueType, sal_uInt32* pValueSize) const +{ + OStoreStream rValue; + sal_uInt8* pBuffer; + storeAccessMode accessMode = VALUE_MODE_OPEN; + + if (m_pRegistry->isReadOnly()) + { + accessMode = VALUE_MODE_OPENREAD; + } + + OUString sImplValueName( RTL_CONSTASCII_USTRINGPARAM(VALUE_PREFIX) ); + sImplValueName += valueName; + + REG_GUARD(m_pRegistry->m_mutex); + + if ( rValue.create(m_storeFile, m_name + m_pRegistry->ROOT, sImplValueName, accessMode) ) + { + *pValueType = RG_VALUETYPE_NOT_DEFINED; + *pValueSize = 0; + return REG_VALUE_NOT_EXISTS; + } + + pBuffer = (sal_uInt8*)rtl_allocateMemory(VALUE_HEADERSIZE); + + sal_uInt32 readBytes; + if ( rValue.readAt(0, pBuffer, VALUE_HEADERSIZE, readBytes) ) + { + rtl_freeMemory(pBuffer); + return REG_INVALID_VALUE; + } + if (readBytes != VALUE_HEADERSIZE) + { + rtl_freeMemory(pBuffer); + return REG_INVALID_VALUE; + } + + sal_uInt32 size; + sal_uInt8 type = *((sal_uInt8*)pBuffer); + readUINT32(pBuffer+VALUE_TYPEOFFSET, size); + + *pValueType = (RegValueType)type; +// if (*pValueType == RG_VALUETYPE_UNICODE) +// { +// *pValueSize = (size / 2) * sizeof(sal_Unicode); +// } else +// { + if (*pValueType > 4) + { + rtl_freeMemory(pBuffer); + pBuffer = (sal_uInt8*)rtl_allocateMemory(4); + rValue.readAt(VALUE_HEADEROFFSET, pBuffer, 4, readBytes); + + readUINT32(pBuffer, size); + } + + *pValueSize = size; +// } + + rtl_freeMemory(pBuffer); + return REG_NO_ERROR; +} + + +//********************************************************************* +// setValue +// +RegError ORegKey::setValue(const OUString& valueName, RegValueType vType, RegValue value, sal_uInt32 vSize) +{ + OStoreStream rValue; + sal_uInt8* pBuffer; + + if (m_pRegistry->isReadOnly()) + { + return REG_REGISTRY_READONLY; + } + + if (vType > 4) + { + return REG_INVALID_VALUE; + } + + OUString sImplValueName( RTL_CONSTASCII_USTRINGPARAM(VALUE_PREFIX) ); + sImplValueName += valueName; + + REG_GUARD(m_pRegistry->m_mutex); + + if ( rValue.create(m_storeFile, m_name + m_pRegistry->ROOT , sImplValueName, VALUE_MODE_CREATE) ) + { + return REG_SET_VALUE_FAILED; + } + + sal_uInt32 size = vSize; + +// if (vType == RG_VALUETYPE_UNICODE) +// { +// size = (rtl_ustr_getLength((sal_Unicode*)value)+1) * 2; +// } + + sal_uInt8 type = (sal_uInt8)vType; + pBuffer = (sal_uInt8*)rtl_allocateMemory(VALUE_HEADERSIZE + size); + rtl_copyMemory(pBuffer, &type, 1); + + writeUINT32(pBuffer+VALUE_TYPEOFFSET, size); + + switch (vType) + { + case RG_VALUETYPE_NOT_DEFINED: + rtl_copyMemory(pBuffer+VALUE_HEADEROFFSET, value, size); + break; + case RG_VALUETYPE_LONG: + writeINT32(pBuffer+VALUE_HEADEROFFSET, *((sal_Int32*)value)); + break; + case RG_VALUETYPE_STRING: + writeUtf8(pBuffer+VALUE_HEADEROFFSET, (const sal_Char*)value); + break; + case RG_VALUETYPE_UNICODE: + writeString(pBuffer+VALUE_HEADEROFFSET, (const sal_Unicode*)value); + break; + case RG_VALUETYPE_BINARY: + rtl_copyMemory(pBuffer+VALUE_HEADEROFFSET, value, size); + break; + } + + + sal_uInt32 writenBytes; + if ( rValue.writeAt(0, pBuffer, VALUE_HEADERSIZE+size, writenBytes) ) + { + rtl_freeMemory(pBuffer); + return REG_SET_VALUE_FAILED; + } + if (writenBytes != (VALUE_HEADERSIZE+size)) + { + rtl_freeMemory(pBuffer); + return REG_SET_VALUE_FAILED; + } + + rtl_freeMemory(pBuffer); + return REG_NO_ERROR; +} + +//********************************************************************* +// setLongListValue +// +RegError ORegKey::setLongListValue(const OUString& valueName, sal_Int32* pValueList, sal_uInt32 len) +{ + OStoreStream rValue; + sal_uInt8* pBuffer; + + if (m_pRegistry->isReadOnly()) + { + return REG_REGISTRY_READONLY; + } + + OUString sImplValueName( RTL_CONSTASCII_USTRINGPARAM(VALUE_PREFIX) ); + sImplValueName += valueName; + + REG_GUARD(m_pRegistry->m_mutex); + + if (rValue.create(m_storeFile, m_name + m_pRegistry->ROOT, sImplValueName, VALUE_MODE_CREATE) ) + { + return REG_SET_VALUE_FAILED; + } + + sal_uInt32 size = 4; // 4 Bytes (sal_uInt32) fuer die Laenge + + size += len * 4; + + sal_uInt8 type = (sal_uInt8)RG_VALUETYPE_LONGLIST; + pBuffer = (sal_uInt8*)rtl_allocateMemory(VALUE_HEADERSIZE + size); + rtl_copyMemory(pBuffer, &type, 1); + + writeUINT32(pBuffer+VALUE_TYPEOFFSET, size); + writeUINT32(pBuffer+VALUE_HEADEROFFSET, len); + + sal_uInt32 offset = 4; // initial 4 Bytes fuer die Laenge des Arrays + + for (int i=0; i < len; i++) + { + writeINT32(pBuffer+VALUE_HEADEROFFSET+offset, pValueList[i]); + offset += 4; + } + + sal_uInt32 writenBytes; + if ( rValue.writeAt(0, pBuffer, VALUE_HEADERSIZE+size, writenBytes) ) + { + rtl_freeMemory(pBuffer); + return REG_SET_VALUE_FAILED; + } + if (writenBytes != (VALUE_HEADEROFFSET+size)) + { + rtl_freeMemory(pBuffer); + return REG_SET_VALUE_FAILED; + } + + rtl_freeMemory(pBuffer); + return REG_NO_ERROR; +} + +//********************************************************************* +// setStringListValue +// +RegError ORegKey::setStringListValue(const OUString& valueName, sal_Char** pValueList, sal_uInt32 len) +{ + OStoreStream rValue; + sal_uInt8* pBuffer; + + if (m_pRegistry->isReadOnly()) + { + return REG_REGISTRY_READONLY; + } + + OUString sImplValueName( RTL_CONSTASCII_USTRINGPARAM(VALUE_PREFIX) ); + sImplValueName += valueName; + + REG_GUARD(m_pRegistry->m_mutex); + + if (rValue.create(m_storeFile, m_name + m_pRegistry->ROOT, sImplValueName, VALUE_MODE_CREATE) ) + { + return REG_SET_VALUE_FAILED; + } + + sal_uInt32 size = 4; // 4 Bytes (sal_uInt32) fuer die Laenge + + int i; + for (i=0; i < len; i++) + { + size += 4 + strlen(pValueList[i]) + 1; + } + + sal_uInt8 type = (sal_uInt8)RG_VALUETYPE_STRINGLIST; + pBuffer = (sal_uInt8*)rtl_allocateMemory(VALUE_HEADERSIZE + size); + rtl_copyMemory(pBuffer, &type, 1); + + writeUINT32(pBuffer+VALUE_TYPEOFFSET, size); + writeUINT32(pBuffer+VALUE_HEADEROFFSET, len); + + sal_uInt32 offset = 4; // initial 4 Bytes fuer die Laenge des Arrays; + sal_uInt32 sLen = 0; + + for (i=0; i < len; i++) + { + sLen = strlen(pValueList[i]) + 1; + writeUINT32(pBuffer+VALUE_HEADEROFFSET+offset, sLen); + + offset += 4; + writeUtf8(pBuffer+VALUE_HEADEROFFSET+offset, pValueList[i]); + offset += sLen; + } + + sal_uInt32 writenBytes; + if ( rValue.writeAt(0, pBuffer, VALUE_HEADERSIZE+size, writenBytes) ) + { + rtl_freeMemory(pBuffer); + return REG_SET_VALUE_FAILED; + } + if (writenBytes != (VALUE_HEADERSIZE+size)) + { + rtl_freeMemory(pBuffer); + return REG_SET_VALUE_FAILED; + } + + rtl_freeMemory(pBuffer); + return REG_NO_ERROR; +} + +//********************************************************************* +// setUnicodeListValue +// +RegError ORegKey::setUnicodeListValue(const OUString& valueName, sal_Unicode** pValueList, sal_uInt32 len) +{ + OStoreStream rValue; + sal_uInt8* pBuffer; + + if (m_pRegistry->isReadOnly()) + { + return REG_REGISTRY_READONLY; + } + + OUString sImplValueName( RTL_CONSTASCII_USTRINGPARAM(VALUE_PREFIX) ); + sImplValueName += valueName; + + REG_GUARD(m_pRegistry->m_mutex); + + if (rValue.create(m_storeFile, m_name + m_pRegistry->ROOT, sImplValueName, VALUE_MODE_CREATE) ) + { + return REG_SET_VALUE_FAILED; + } + + sal_uInt32 size = 4; // 4 Bytes (sal_uInt32) fuer die Laenge + + int i; + for (i=0; i < len; i++) + { + size += 4 + ((rtl_ustr_getLength(pValueList[i]) +1) * 2); + } + + sal_uInt8 type = (sal_uInt8)RG_VALUETYPE_UNICODELIST; + pBuffer = (sal_uInt8*)rtl_allocateMemory(VALUE_HEADERSIZE + size); + rtl_copyMemory(pBuffer, &type, 1); + + writeUINT32(pBuffer+VALUE_TYPEOFFSET, size); + writeUINT32(pBuffer+VALUE_HEADEROFFSET, len); + + sal_uInt32 offset = 4; // initial 4 Bytes fuer die Laenge des Arrays; + sal_uInt32 sLen = 0; + + for (i=0; i < len; i++) + { + sLen = (rtl_ustr_getLength(pValueList[i]) + 1) * 2; + writeUINT32(pBuffer+VALUE_HEADEROFFSET+offset, sLen); + + offset += 4; + writeString(pBuffer+VALUE_HEADEROFFSET+offset, pValueList[i]); + offset += sLen; + } + + sal_uInt32 writenBytes; + if ( rValue.writeAt(0, pBuffer, VALUE_HEADERSIZE+size, writenBytes) ) + { + rtl_freeMemory(pBuffer); + return REG_SET_VALUE_FAILED; + } + if (writenBytes != (VALUE_HEADERSIZE+size)) + { + rtl_freeMemory(pBuffer); + return REG_SET_VALUE_FAILED; + } + + rtl_freeMemory(pBuffer); + return REG_NO_ERROR; +} + +//********************************************************************* +// getValue +// +RegError ORegKey::getValue(const OUString& valueName, RegValue value) const +{ + OStoreStream rValue; + sal_uInt8* pBuffer; + RegValueType valueType; + sal_uInt32 valueSize; + storeAccessMode accessMode = VALUE_MODE_OPEN; + + if (m_pRegistry->isReadOnly()) + { + accessMode = VALUE_MODE_OPENREAD; + } + + OUString sImplValueName( RTL_CONSTASCII_USTRINGPARAM(VALUE_PREFIX) ); + sImplValueName += valueName; + + REG_GUARD(m_pRegistry->m_mutex); + + if (rValue.create(m_storeFile, m_name + m_pRegistry->ROOT, sImplValueName, accessMode) ) + { + return REG_VALUE_NOT_EXISTS; + } + + pBuffer = (sal_uInt8*)rtl_allocateMemory(VALUE_HEADERSIZE); + + sal_uInt32 readBytes; + if ( rValue.readAt(0, pBuffer, VALUE_HEADERSIZE, readBytes) ) + { + rtl_freeMemory(pBuffer); + return REG_INVALID_VALUE; + } + if (readBytes != VALUE_HEADERSIZE) + { + rtl_freeMemory(pBuffer); + return REG_INVALID_VALUE; + } + + sal_uInt8 type = *((sal_uInt8*)pBuffer); + valueType = (RegValueType)type; + readUINT32(pBuffer+VALUE_TYPEOFFSET, valueSize); + + rtl_freeMemory(pBuffer); + + if (valueType > 4) + { + return REG_INVALID_VALUE; + } + + pBuffer = (sal_uInt8*)rtl_allocateMemory(valueSize); + + if ( rValue.readAt(VALUE_HEADEROFFSET, pBuffer, valueSize, readBytes) ) + { + rtl_freeMemory(pBuffer); + return REG_INVALID_VALUE; + } + if (readBytes != valueSize) + { + rtl_freeMemory(pBuffer); + return REG_INVALID_VALUE; + } + +// rtl_copyMemory(value, pBuffer, valueSize); + switch (valueType) + { + case RG_VALUETYPE_NOT_DEFINED: + rtl_copyMemory(value, pBuffer, valueSize); + break; + case RG_VALUETYPE_LONG: + readINT32(pBuffer, *((sal_Int32*)value)); + break; + case RG_VALUETYPE_STRING: + readUtf8(pBuffer, (sal_Char*)value, valueSize); + break; + case RG_VALUETYPE_UNICODE: + readString(pBuffer, (sal_Unicode*)value, valueSize); + break; + case RG_VALUETYPE_BINARY: + rtl_copyMemory(value, pBuffer, valueSize); + break; + case RG_VALUETYPE_LONGLIST: + case RG_VALUETYPE_STRINGLIST: + case RG_VALUETYPE_UNICODELIST: + rtl_copyMemory(value, pBuffer, valueSize); + break; + } + + + rtl_freeMemory(pBuffer); + return REG_NO_ERROR; +} + +//********************************************************************* +// getLongListValue +// +RegError ORegKey::getLongListValue(const OUString& valueName, sal_Int32** pValueList, sal_uInt32* pLen) const +{ + OStoreStream rValue; + sal_uInt8* pBuffer; + RegValueType valueType; + sal_uInt32 valueSize; + storeAccessMode accessMode = VALUE_MODE_OPEN; + + if (m_pRegistry->isReadOnly()) + { + accessMode = VALUE_MODE_OPENREAD; + } + + OUString sImplValueName( RTL_CONSTASCII_USTRINGPARAM(VALUE_PREFIX) ); + sImplValueName += valueName; + + REG_GUARD(m_pRegistry->m_mutex); + + if (rValue.create(m_storeFile, m_name + m_pRegistry->ROOT, sImplValueName, accessMode) ) + { + pValueList = NULL; + *pLen = 0; + return REG_VALUE_NOT_EXISTS; + } + + pBuffer = (sal_uInt8*)rtl_allocateMemory(VALUE_HEADERSIZE); + + sal_uInt32 readBytes; + if ( rValue.readAt(0, pBuffer, VALUE_HEADERSIZE, readBytes) ) + { + pValueList = NULL; + *pLen = 0; + rtl_freeMemory(pBuffer); + return REG_INVALID_VALUE; + } + if (readBytes != VALUE_HEADERSIZE) + { + pValueList = NULL; + *pLen = 0; + rtl_freeMemory(pBuffer); + return REG_INVALID_VALUE; + } + + sal_uInt8 type = *((sal_uInt8*)pBuffer); + valueType = (RegValueType)type; + + if (valueType != RG_VALUETYPE_LONGLIST) + { + pValueList = NULL; + *pLen = 0; + rtl_freeMemory(pBuffer); + return REG_INVALID_VALUE; + } + + readUINT32(pBuffer+VALUE_TYPEOFFSET, valueSize); + + rtl_freeMemory(pBuffer); + + pBuffer = (sal_uInt8*)rtl_allocateMemory(valueSize); + + if ( rValue.readAt(VALUE_HEADEROFFSET, pBuffer, valueSize, readBytes) ) + { + pValueList = NULL; + *pLen = 0; + rtl_freeMemory(pBuffer); + return REG_INVALID_VALUE; + } + if (readBytes != valueSize) + { + pValueList = NULL; + *pLen = 0; + rtl_freeMemory(pBuffer); + return REG_INVALID_VALUE; + } + + sal_uInt32 len = 0; + readUINT32(pBuffer, len); + + *pLen = len; + sal_Int32* pVList = (sal_Int32*)rtl_allocateZeroMemory(len * sizeof(sal_Int32)); + + sal_uInt32 offset = 4; // initial 4 Bytes fuer die Laenge des Arrays; + + for (int i=0; i < len; i++) + { + readINT32(pBuffer+offset, pVList[i]); + offset += 4; + } + + *pValueList = pVList; + rtl_freeMemory(pBuffer); + return REG_NO_ERROR; +} + +//********************************************************************* +// getStringListValue +// +RegError ORegKey::getStringListValue(const OUString& valueName, sal_Char*** pValueList, sal_uInt32* pLen) const +{ + OStoreStream rValue; + sal_uInt8* pBuffer; + RegValueType valueType; + sal_uInt32 valueSize; + storeAccessMode accessMode = VALUE_MODE_OPEN; + + if (m_pRegistry->isReadOnly()) + { + accessMode = VALUE_MODE_OPENREAD; + } + + OUString sImplValueName( RTL_CONSTASCII_USTRINGPARAM(VALUE_PREFIX) ); + sImplValueName += valueName; + + REG_GUARD(m_pRegistry->m_mutex); + + if ( rValue.create(m_storeFile, m_name + m_pRegistry->ROOT, sImplValueName, accessMode) ) + { + pValueList = NULL; + *pLen = 0; + return REG_VALUE_NOT_EXISTS; + } + + pBuffer = (sal_uInt8*)rtl_allocateMemory(VALUE_HEADERSIZE); + + sal_uInt32 readBytes; + if ( rValue.readAt(0, pBuffer, VALUE_HEADERSIZE, readBytes) ) + { + pValueList = NULL; + *pLen = 0; + rtl_freeMemory(pBuffer); + return REG_INVALID_VALUE; + } + if (readBytes != VALUE_HEADERSIZE) + { + pValueList = NULL; + *pLen = 0; + rtl_freeMemory(pBuffer); + return REG_INVALID_VALUE; + } + + sal_uInt8 type = *((sal_uInt8*)pBuffer); + valueType = (RegValueType)type; + + if (valueType != RG_VALUETYPE_STRINGLIST) + { + pValueList = NULL; + *pLen = 0; + rtl_freeMemory(pBuffer); + return REG_INVALID_VALUE; + } + + readUINT32(pBuffer+VALUE_TYPEOFFSET, valueSize); + + rtl_freeMemory(pBuffer); + + pBuffer = (sal_uInt8*)rtl_allocateMemory(valueSize); + + if ( rValue.readAt(VALUE_HEADEROFFSET, pBuffer, valueSize, readBytes) ) + { + pValueList = NULL; + *pLen = 0; + rtl_freeMemory(pBuffer); + return REG_INVALID_VALUE; + } + if (readBytes != valueSize) + { + pValueList = NULL; + *pLen = 0; + rtl_freeMemory(pBuffer); + return REG_INVALID_VALUE; + } + + sal_uInt32 len = 0; + readUINT32(pBuffer, len); + + *pLen = len; + sal_Char** pVList = (sal_Char**)rtl_allocateZeroMemory(len * sizeof(sal_Char*)); + + sal_uInt32 offset = 4; // initial 4 Bytes fuer die Laenge des Arrays; + sal_uInt32 sLen = 0; + + sal_Char *pValue; + for (int i=0; i < len; i++) + { + readUINT32(pBuffer+offset, sLen); + + offset += 4; + + pValue = (sal_Char*)rtl_allocateMemory(sLen); + readUtf8(pBuffer+offset, pValue, sLen); + pVList[i] = pValue; + + offset += sLen; + } + + *pValueList = pVList; + rtl_freeMemory(pBuffer); + return REG_NO_ERROR; +} + +//********************************************************************* +// getUnicodeListValue +// +RegError ORegKey::getUnicodeListValue(const OUString& valueName, sal_Unicode*** pValueList, sal_uInt32* pLen) const +{ + OStoreStream rValue; + sal_uInt8* pBuffer; + RegValueType valueType; + sal_uInt32 valueSize; + storeAccessMode accessMode = VALUE_MODE_OPEN; + + if (m_pRegistry->isReadOnly()) + { + accessMode = VALUE_MODE_OPENREAD; + } + + OUString sImplValueName( RTL_CONSTASCII_USTRINGPARAM(VALUE_PREFIX) ); + sImplValueName += valueName; + + REG_GUARD(m_pRegistry->m_mutex); + + if ( rValue.create(m_storeFile, m_name + m_pRegistry->ROOT, sImplValueName, accessMode) ) + { + pValueList = NULL; + *pLen = 0; + return REG_VALUE_NOT_EXISTS; + } + + pBuffer = (sal_uInt8*)rtl_allocateMemory(VALUE_HEADERSIZE); + + sal_uInt32 readBytes; + if ( rValue.readAt(0, pBuffer, VALUE_HEADERSIZE, readBytes) ) + { + pValueList = NULL; + *pLen = 0; + rtl_freeMemory(pBuffer); + return REG_INVALID_VALUE; + } + if (readBytes != VALUE_HEADERSIZE) + { + pValueList = NULL; + *pLen = 0; + rtl_freeMemory(pBuffer); + return REG_INVALID_VALUE; + } + + sal_uInt8 type = *((sal_uInt8*)pBuffer); + valueType = (RegValueType)type; + + if (valueType != RG_VALUETYPE_UNICODELIST) + { + pValueList = NULL; + *pLen = 0; + rtl_freeMemory(pBuffer); + return REG_INVALID_VALUE; + } + + readUINT32(pBuffer+VALUE_TYPEOFFSET, valueSize); + + rtl_freeMemory(pBuffer); + + pBuffer = (sal_uInt8*)rtl_allocateMemory(valueSize); + + if ( rValue.readAt(VALUE_HEADEROFFSET, pBuffer, valueSize, readBytes) ) + { + pValueList = NULL; + *pLen = 0; + rtl_freeMemory(pBuffer); + return REG_INVALID_VALUE; + } + if (readBytes != valueSize) + { + pValueList = NULL; + *pLen = 0; + rtl_freeMemory(pBuffer); + return REG_INVALID_VALUE; + } + + sal_uInt32 len = 0; + readUINT32(pBuffer, len); + + *pLen = len; + sal_Unicode** pVList = (sal_Unicode**)rtl_allocateZeroMemory(len * sizeof(sal_Unicode*)); + + sal_uInt32 offset = 4; // initial 4 Bytes fuer die Laenge des Arrays; + sal_uInt32 sLen = 0; + + sal_Unicode *pValue; + for (int i=0; i < len; i++) + { + readUINT32(pBuffer+offset, sLen); + + offset += 4; + + pValue = (sal_Unicode*)rtl_allocateMemory((sLen / 2) * sizeof(sal_Unicode)); + readString(pBuffer+offset, pValue, sLen); + pVList[i] = pValue; + + offset += sLen; + } + + *pValueList = pVList; + rtl_freeMemory(pBuffer); + return REG_NO_ERROR; +} + +//********************************************************************* +// getKeyType() +// +RegError ORegKey::getKeyType(const OUString& name, RegKeyType* pKeyType) const +{ + ORegKey* pKey; + RegError _ret = REG_NO_ERROR; + + *pKeyType = RG_KEYTYPE; + + REG_GUARD(m_pRegistry->m_mutex); + + if ( name.getLength() ) + { + if ((_ret = ((ORegKey*)this)->openKey(name, (RegKeyHandle*)&pKey, RESOLVE_PART))) + return _ret; + + if (pKey->isLink()) + *pKeyType = RG_LINKTYPE; + + ((ORegKey*)this)->closeKey((RegKeyHandle)pKey); + return _ret; + } else + { + if (m_isLink) + *pKeyType = RG_LINKTYPE; + + return _ret; + } +} + +//********************************************************************* +// createLink() +// +RegError ORegKey::createLink(const OUString& linkName, const OUString& linkTarget) +{ + ORegKey* pKey; + RegError _ret = REG_NO_ERROR; + + if ( !linkName.getLength() ) + return REG_INVALID_LINKNAME; + + if ( !linkTarget.getLength() ) + return REG_INVALID_LINKTARGET; + + REG_GUARD(m_pRegistry->m_mutex); + + if (m_pRegistry->openKey(this, linkName, (RegKeyHandle*)&pKey, RESOLVE_PART)) + { + if (_ret = m_pRegistry->createKey(this, linkName, (RegKeyHandle*)&pKey)) + return _ret; + } else + { + if (!pKey->isLink()) + { + m_pRegistry->closeKey(pKey); + return REG_INVALID_LINK; + } + } + + if (_ret = pKey->setValue(OUString( RTL_CONSTASCII_USTRINGPARAM("LINK_TARGET") ), + RG_VALUETYPE_UNICODE, (RegValue)linkTarget.getStr(), (linkTarget.getLength()+1)*2)) + { + m_pRegistry->closeKey(pKey); + _ret = m_pRegistry->deleteKey(this, linkName); + return _ret; + } + + return m_pRegistry->closeKey(pKey); +} + +//********************************************************************* +// deleteLink() +// +RegError ORegKey::deleteLink(const OUString& linkName) +{ + return (m_pRegistry->deleteLink(this, linkName)); +} + +//********************************************************************* +// getLinkTarget() +// +RegError ORegKey::getLinkTarget(const OUString& linkName, OUString& linkTarget) const +{ + ORegKey* pKey; + RegError _ret = REG_NO_ERROR; + + REG_GUARD(m_pRegistry->m_mutex); + + if ( linkName.getLength() ) + { + if (_ret = ((ORegKey*)this)->openKey(linkName, (RegKeyHandle*)&pKey, RESOLVE_PART)) + return REG_INVALID_LINK; + + _ret = pKey->getLinkTarget(OUString(), linkTarget); + ((ORegKey*)this)->closeKey((RegKeyHandle)pKey); + return _ret; + } else + { + if (m_isLink) + { + linkTarget = m_link; + return REG_NO_ERROR; + } else + return REG_LINKTARGET_NOT_EXIST; + } +} + +RegError ORegKey::getResolvedKeyName(const OUString& keyName, + OUString& resolvedName, + sal_Bool firstLinkOnly) +{ + return m_pRegistry->getResolvedKeyName((ORegKey*)this, keyName, resolvedName, firstLinkOnly); +} + +//********************************************************************* +// countSubKeys() +// +sal_uInt32 ORegKey::countSubKeys() +{ + REG_GUARD(m_pRegistry->m_mutex); + + OStoreDirectory::iterator iter; + OStoreDirectory rStoreDir = getStoreDir(); + storeError _err = rStoreDir.first(iter); + sal_uInt32 count = 0; + + while ( _err == store_E_None ) + { + if ( iter.m_nAttrib & STORE_ATTRIB_ISDIR ) + { + count++; + } + + _err = rStoreDir.next(iter); + } + + return count; +} + + +//********************************************************************* +// checkLink() +// +sal_Bool ORegKey::checkLink() +{ + RegValueType valueType = RG_VALUETYPE_NOT_DEFINED; + sal_uInt32 valueSize = 0; + + OUString linkTarget( OUString( RTL_CONSTASCII_USTRINGPARAM("LINK_TARGET") )); + if (!((ORegKey*)this)->getValueInfo( linkTarget, &valueType, &valueSize)) + { + sal_Unicode* value = (sal_Unicode*)rtl_allocateMemory(valueSize); + if (!((ORegKey*)this)->getValue( linkTarget, value)) + { + m_link = OUString(value); + m_isLink = sal_True; + } + + rtl_freeMemory(value); + + return sal_True; + } + + return sal_False; +} + +OStoreDirectory ORegKey::getStoreDir() +{ + OStoreDirectory rStoreDir; + OUString fullPath; + OUString relativName; + storeAccessMode accessMode = KEY_MODE_OPEN; + + if ( m_name.equals(m_pRegistry->ROOT) ) + { + fullPath = OUString(); + relativName = OUString(); + } else + { + fullPath = m_name.copy(0, m_name.lastIndexOf('/') + 1); + relativName = m_name.copy(m_name.lastIndexOf('/') + 1); + } + + if (m_pRegistry->isReadOnly()) + { + accessMode = KEY_MODE_OPENREAD; + } + + rStoreDir.create(m_storeFile, fullPath, relativName, accessMode); + + return rStoreDir; +} + diff --git a/registry/source/keyimpl.hxx b/registry/source/keyimpl.hxx new file mode 100644 index 000000000000..17a638026980 --- /dev/null +++ b/registry/source/keyimpl.hxx @@ -0,0 +1,215 @@ +/************************************************************************* + * + * $RCSfile: keyimpl.hxx,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:18:42 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +#ifndef _KEYIMPL_HXX_ +#define _KEYIMPL_HXX_ + +#ifndef _REGISTRY_REGISTRY_H_ +#include +#endif + +#ifndef _REGIMPL_HXX_ +#include "regimpl.hxx" +#endif + +#ifndef _RTL_STRING_HXX_ +#include +#endif + +using namespace rtl; +using namespace store; + +class ORegKey +{ +public: + + ORegKey(const OUString& keyName, const OStoreDirectory& rStoreDir, ORegistry* pReg); + ORegKey(const OUString& keyName, const OUString& linkName, + const OStoreDirectory& rStoreDir, ORegistry* pReg); + + sal_uInt32 acquire() + { return ++m_refCount; } + + sal_uInt32 release() + { return --m_refCount; } + + RegError createKey(const OUString& keyName, RegKeyHandle* phNewKey); + + RegError openKey(const OUString& keyName, RegKeyHandle* phOpenKey, + RESOLVE eResolve=RESOLVE_FULL); + + RegError openSubKeys(const OUString& keyName, + RegKeyHandle** phOpenSubKeys, + sal_uInt32* pnSubKeys); + + RegError getKeyNames(const OUString& keyName, + rtl_uString*** pSubKeyNames, + sal_uInt32* pnSubKeys); + + RegError closeSubKeys(RegKeyHandle* phSubKeys, sal_uInt32 len); + + RegError closeKey(RegKeyHandle hKey); + + RegError deleteKey(const OUString& keyName); + + RegError getValueInfo(const OUString& valueName, + RegValueType* pValueTye, + sal_uInt32* pValueSize) const; + + RegError setValue(const OUString& valueName, + RegValueType vType, + RegValue value, + sal_uInt32 vSize); + + RegError setLongListValue(const OUString& valueName, + sal_Int32* pValueList, + sal_uInt32 len); + + RegError setStringListValue(const OUString& valueName, + sal_Char** pValueList, + sal_uInt32 len); + + RegError setUnicodeListValue(const OUString& valueName, + sal_Unicode** pValueList, + sal_uInt32 len); + + RegError getValue(const OUString& valueName, RegValue value) const; + + RegError getLongListValue(const OUString& valueName, + sal_Int32** pValueList, + sal_uInt32* pLen) const; + + RegError getStringListValue(const OUString& valueName, + sal_Char*** pValueList, + sal_uInt32* pLen) const; + + RegError getUnicodeListValue(const OUString& valueName, + sal_Unicode*** pValueList, + sal_uInt32* pLen) const; + + RegError createLink(const OUString& linkName, const OUString& linkTarget); + + RegError deleteLink(const OUString& linkName); + + RegError getKeyType(const OUString& name, + RegKeyType* pKeyType) const; + + RegError getLinkTarget(const OUString& linkName, + OUString& pLinkTarget) const; + + RegError getResolvedKeyName(const OUString& keyName, + OUString& resolvedName, + sal_Bool firstLinkOnly=sal_False); + +public: + ORegKey(); + virtual ~ORegKey(); + + + sal_Bool isDeleted() const + { return m_bDeleted; } + + void setDeleted(sal_Bool bKeyDeleted) + { m_bDeleted = bKeyDeleted; } + + sal_Bool isReadOnly() const + { return m_pRegistry->isReadOnly(); } + + sal_uInt32 countSubKeys(); + + sal_Bool isLink() const + { return m_isLink; } + + const OUString& getLinkTarget() const + { return m_link; } + + ORegistry* getRegistry() const + { return m_pRegistry; } + + const OStoreFile& getStoreFile() const + { return m_storeFile; } + + OStoreDirectory getStoreDir(); + + const OUString& getName() const + { return m_name; } + + sal_uInt32 getRefCount() const + { return m_refCount; } + + friend class ORegistry; +protected: + sal_Bool checkLink(); + + sal_uInt32 m_refCount; + OUString m_name; + OUString m_link; + sal_Bool m_bDeleted; + sal_Bool m_isLink; + ORegistry* m_pRegistry; + OStoreFile m_storeFile; +}; + + + +#endif + + diff --git a/registry/source/makefile.mk b/registry/source/makefile.mk new file mode 100644 index 000000000000..93a3ba530111 --- /dev/null +++ b/registry/source/makefile.mk @@ -0,0 +1,97 @@ +#************************************************************************* +# +# $RCSfile: makefile.mk,v $ +# +# $Revision: 1.1.1.1 $ +# +# last change: $Author: hr $ $Date: 2000-09-18 15:18:42 $ +# +# The Contents of this file are made available subject to the terms of +# either of the following licenses +# +# - GNU Lesser General Public License Version 2.1 +# - Sun Industry Standards Source License Version 1.1 +# +# Sun Microsystems Inc., October, 2000 +# +# GNU Lesser General Public License Version 2.1 +# ============================================= +# Copyright 2000 by Sun Microsystems, Inc. +# 901 San Antonio Road, Palo Alto, CA 94303, USA +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License version 2.1, as published by the Free Software Foundation. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, +# MA 02111-1307 USA +# +# +# Sun Industry Standards Source License Version 1.1 +# ================================================= +# The contents of this file are subject to the Sun Industry Standards +# Source License Version 1.1 (the "License"); You may not use this file +# except in compliance with the License. You may obtain a copy of the +# License at http://www.openoffice.org/license.html. +# +# Software provided under this License is provided on an "AS IS" basis, +# WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, +# WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, +# MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. +# See the License for the specific provisions governing your rights and +# obligations concerning the Software. +# +# The Initial Developer of the Original Code is: Sun Microsystems, Inc. +# +# Copyright: 2000 by Sun Microsystems, Inc. +# +# All Rights Reserved. +# +# Contributor(s): _______________________________________ +# +# +# +#************************************************************************* + +PRJ=.. + +PRJNAME=registry +TARGET=regcpp + +# --- Settings ----------------------------------------------------- + +.INCLUDE : svpre.mk +.INCLUDE : settings.mk +.INCLUDE : sv.mk +.INCLUDE : ..$/version.mk + +# ------------------------------------------------------------------ + +SLOFILES= \ + $(SLO)$/regimpl.obj \ + $(SLO)$/regkey.obj \ + $(SLO)$/registry.obj \ + $(SLO)$/keyimpl.obj \ + $(SLO)$/reflread.obj \ + $(SLO)$/reflwrit.obj + + +# NETBSD: somewhere we have to instantiate the static data members. +# NETBSD-1.2.1 doesn't know about weak symbols so the default mechanism for GCC won't work. +# SCO and MACOSX: the linker does know about weak symbols, but we can't ignore multiple defined symbols +.IF "$(OS)"=="NETBSD" || "$(OS)"=="SCO" || "$(OS)$(COM)"=="OS2GCC" || "$(OS)"=="MACOSX" +SLOFILES+=$(SLO)$/staticmb.obj +OBJFILES+=$(OBJ)$/staticmb.obj +.ENDIF + +# ------------------------------------------------------------------ + +.INCLUDE : target.mk + diff --git a/registry/source/reflcnst.hxx b/registry/source/reflcnst.hxx new file mode 100644 index 000000000000..a57addcce1cc --- /dev/null +++ b/registry/source/reflcnst.hxx @@ -0,0 +1,268 @@ +/************************************************************************* + * + * $RCSfile: reflcnst.hxx,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:18:42 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +#ifndef __REFLCNST_HXX__ +#define __REFLCNST_HXX__ + +#ifndef __REGISTRY_REFLTYPE_HXX__ +#include +#endif + +#include +#include + +#define REGTYPE_IEEE_NATIVE 1 + +extern const sal_uInt32 magic; +extern const sal_uInt16 minorVersion; +extern const sal_uInt16 majorVersion; + +#define OFFSET_MAGIC 0 +#define OFFSET_SIZE (OFFSET_MAGIC + sizeof(magic)) +#define OFFSET_MINOR_VERSION (OFFSET_SIZE + sizeof(sal_uInt32)) +#define OFFSET_MAJOR_VERSION (OFFSET_MINOR_VERSION + sizeof(minorVersion)) +#define OFFSET_TYPE_CLASS (OFFSET_MAJOR_VERSION + sizeof(majorVersion)) +#define OFFSET_THIS_TYPE (OFFSET_TYPE_CLASS + sizeof(sal_uInt16)) +#define OFFSET_SUPER_TYPE (OFFSET_THIS_TYPE + sizeof(sal_uInt16)) +#define OFFSET_UIK (OFFSET_SUPER_TYPE + sizeof(sal_uInt16)) +#define OFFSET_DOKU (OFFSET_UIK + sizeof(sal_uInt16)) +#define OFFSET_FILENAME (OFFSET_DOKU + sizeof(sal_uInt16)) +#define OFFSET_CP_SIZE (OFFSET_FILENAME + sizeof(sal_uInt16)) +#define OFFSET_CP (OFFSET_CP_SIZE + sizeof(sal_uInt16)) + +#define CP_OFFSET_ENTRY_SIZE 0 +#define CP_OFFSET_ENTRY_TAG (CP_OFFSET_ENTRY_SIZE + sizeof(sal_uInt16)) +#define CP_OFFSET_ENTRY_DATA (CP_OFFSET_ENTRY_TAG + sizeof(sal_uInt16)) +#define CP_OFFSET_ENTRY_UIK1 CP_OFFSET_ENTRY_DATA +#define CP_OFFSET_ENTRY_UIK2 (CP_OFFSET_ENTRY_UIK1 + sizeof(sal_uInt32)) +#define CP_OFFSET_ENTRY_UIK3 (CP_OFFSET_ENTRY_UIK2 + sizeof(sal_uInt16)) +#define CP_OFFSET_ENTRY_UIK4 (CP_OFFSET_ENTRY_UIK3 + sizeof(sal_uInt16)) +#define CP_OFFSET_ENTRY_UIK5 (CP_OFFSET_ENTRY_UIK4 + sizeof(sal_uInt32)) + +#define FIELD_OFFSET_ACCESS 0 +#define FIELD_OFFSET_NAME (FIELD_OFFSET_ACCESS + sizeof(sal_uInt16)) +#define FIELD_OFFSET_TYPE (FIELD_OFFSET_NAME + sizeof(sal_uInt16)) +#define FIELD_OFFSET_VALUE (FIELD_OFFSET_TYPE + sizeof(sal_uInt16)) +#define FIELD_OFFSET_DOKU (FIELD_OFFSET_VALUE + sizeof(sal_uInt16)) +#define FIELD_OFFSET_FILENAME (FIELD_OFFSET_DOKU + sizeof(sal_uInt16)) +#define FIELD_ENTRY_SIZE (FIELD_OFFSET_FILENAME + sizeof(sal_uInt16)) + +#define PARAM_OFFSET_TYPE 0 +#define PARAM_OFFSET_MODE (PARAM_OFFSET_TYPE + sizeof(sal_uInt16)) +#define PARAM_OFFSET_NAME (PARAM_OFFSET_MODE + sizeof(sal_uInt16)) +#define PARAM_ENTRY_SIZE (PARAM_OFFSET_NAME + sizeof(sal_uInt16)) + +#define METHOD_OFFSET_SIZE 0 +#define METHOD_OFFSET_MODE (METHOD_OFFSET_SIZE + sizeof(sal_uInt16)) +#define METHOD_OFFSET_NAME (METHOD_OFFSET_MODE + sizeof(sal_uInt16)) +#define METHOD_OFFSET_RETURN (METHOD_OFFSET_NAME + sizeof(sal_uInt16)) +#define METHOD_OFFSET_DOKU (METHOD_OFFSET_RETURN + sizeof(sal_uInt16)) +#define METHOD_OFFSET_PARAM_COUNT (METHOD_OFFSET_DOKU + sizeof(sal_uInt16)) +#define METHOD_OFFSET_PARAM(i) (METHOD_OFFSET_PARAM_COUNT + sizeof(sal_uInt16) + (i * PARAM_ENTRY_SIZE)) + +#define REFERENCE_OFFSET_TYPE 0 +#define REFERENCE_OFFSET_NAME (REFERENCE_OFFSET_TYPE + sizeof(sal_uInt16)) +#define REFERENCE_OFFSET_DOKU (REFERENCE_OFFSET_NAME + sizeof(sal_uInt16)) +#define REFERENCE_OFFSET_ACCESS (REFERENCE_OFFSET_DOKU + sizeof(sal_uInt16)) +#define REFERENCE_ENTRY_SIZE (REFERENCE_OFFSET_ACCESS + sizeof(sal_uInt16)) + +enum CPInfoTag +{ + CP_TAG_INVALID = RT_TYPE_NONE, + CP_TAG_CONST_BOOL = RT_TYPE_BOOL, + CP_TAG_CONST_BYTE = RT_TYPE_BYTE, + CP_TAG_CONST_INT16 = RT_TYPE_INT16, + CP_TAG_CONST_UINT16 = RT_TYPE_UINT16, + CP_TAG_CONST_INT32 = RT_TYPE_INT32, + CP_TAG_CONST_UINT32 = RT_TYPE_UINT32, + CP_TAG_CONST_INT64 = RT_TYPE_INT64, + CP_TAG_CONST_UINT64 = RT_TYPE_UINT64, + CP_TAG_CONST_FLOAT = RT_TYPE_FLOAT, + CP_TAG_CONST_DOUBLE = RT_TYPE_DOUBLE, + CP_TAG_CONST_STRING = RT_TYPE_STRING, + CP_TAG_UTF8_NAME, + CP_TAG_UIK +}; + +inline sal_uInt32 writeBYTE(sal_uInt8* buffer, sal_uInt8 v) +{ + buffer[0] = v; + + return sizeof(sal_uInt8); +} + +inline sal_uInt16 readBYTE(const sal_uInt8* buffer, sal_uInt8& v) +{ + v = buffer[0]; + + return sizeof(sal_uInt8); +} + +inline sal_uInt32 writeINT16(sal_uInt8* buffer, sal_Int16 v) +{ + buffer[0] = (sal_uInt8)((v >> 8) & 0xFF); + buffer[1] = (sal_uInt8)((v >> 0) & 0xFF); + + return sizeof(sal_Int16); +} + +inline sal_uInt32 readINT16(const sal_uInt8* buffer, sal_Int16& v) +{ + v = ((buffer[0] << 8) | (buffer[1] << 0)); + + return sizeof(sal_Int16); +} + +inline sal_uInt32 writeUINT16(sal_uInt8* buffer, sal_uInt16 v) +{ + buffer[0] = (sal_uInt8)((v >> 8) & 0xFF); + buffer[1] = (sal_uInt8)((v >> 0) & 0xFF); + + return sizeof(sal_uInt16); +} + +inline sal_uInt32 readUINT16(const sal_uInt8* buffer, sal_uInt16& v) +{ + v = ((buffer[0] << 8) | (buffer[1] << 0)); + + return sizeof(sal_uInt16); +} + +inline sal_uInt32 writeINT32(sal_uInt8* buffer, sal_Int32 v) +{ + buffer[0] = (sal_uInt8)((v >> 24) & 0xFF); + buffer[1] = (sal_uInt8)((v >> 16) & 0xFF); + buffer[2] = (sal_uInt8)((v >> 8) & 0xFF); + buffer[3] = (sal_uInt8)((v >> 0) & 0xFF); + + return sizeof(sal_Int32); +} + +inline sal_uInt32 readINT32(const sal_uInt8* buffer, sal_Int32& v) +{ + v = ( + (buffer[0] << 24) | + (buffer[1] << 16) | + (buffer[2] << 8) | + (buffer[3] << 0) + ); + + return sizeof(sal_Int32); +} + +inline sal_uInt32 writeUINT32(sal_uInt8* buffer, sal_uInt32 v) +{ + buffer[0] = (sal_uInt8)((v >> 24) & 0xFF); + buffer[1] = (sal_uInt8)((v >> 16) & 0xFF); + buffer[2] = (sal_uInt8)((v >> 8) & 0xFF); + buffer[3] = (sal_uInt8)((v >> 0) & 0xFF); + + return sizeof(sal_uInt32); +} + +inline sal_uInt32 readUINT32(const sal_uInt8* buffer, sal_uInt32& v) +{ + v = ( + (buffer[0] << 24) | + (buffer[1] << 16) | + (buffer[2] << 8) | + (buffer[3] << 0) + ); + + return sizeof(sal_uInt32); +} + +inline sal_uInt32 writeUtf8(sal_uInt8* buffer, const sal_Char* v) +{ + sal_uInt32 size = strlen(v) + 1; + + memcpy(buffer, v, size); + + return (size); +} + +inline sal_uInt32 readUtf8(const sal_uInt8* buffer, sal_Char* v, sal_uInt32 maxSize) +{ + sal_uInt32 size = VOS_MIN(strlen((const sal_Char*) buffer) + 1, maxSize); + + memcpy(v, buffer, size); + + if (size == maxSize) v[size - 1] = '\0'; + + return (size); +} + + +sal_uInt32 writeFloat(sal_uInt8* buffer, float v); +sal_uInt32 readFloat(const sal_uInt8* buffer, float& v); +sal_uInt32 writeDouble(sal_uInt8* buffer, double v); +sal_uInt32 readDouble(const sal_uInt8* buffer, double& v); +sal_uInt32 writeString(sal_uInt8* buffer, const sal_Unicode* v); +sal_uInt32 readString(const sal_uInt8* buffer, sal_Unicode* v, sal_uInt32 maxSize); + +sal_uInt32 UINT16StringLen(const sal_uInt8* wstring); + +#endif + + + + + diff --git a/registry/source/reflread.cxx b/registry/source/reflread.cxx new file mode 100644 index 000000000000..cb462132db24 --- /dev/null +++ b/registry/source/reflread.cxx @@ -0,0 +1,1602 @@ +/************************************************************************* + * + * $RCSfile: reflread.cxx,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:18:42 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +#ifndef MAC +#include +#endif +#include + +#include +#include "reflcnst.hxx" + +using namespace vos; + +static CPInfoTag aTag; + +static sal_Char NULL_STRING[1] = { 0 }; +static sal_Unicode NULL_WSTRING[1] = { 0 }; + +const sal_uInt32 magic = 0x12345678; +const sal_uInt16 minorVersion = 0x0000; +const sal_uInt16 majorVersion = 0x0001; + +#if defined ( GCC ) && ( defined ( SCO ) || defined ( NETBSD ) ) +ORealDynamicLoader* ODynamicLoader::m_pLoader = NULL; +#endif + +/************************************************************************** + + class BlopObject + + holds any data in a flat memory buffer + +**************************************************************************/ + +class BlopObject +{ +public: + const sal_uInt8* m_pBuffer; + sal_uInt32 m_bufferLen; + sal_Bool m_isCopied; + + BlopObject(const sal_uInt8* buffer, sal_uInt32 len, sal_Bool copyBuffer); + ~BlopObject(); + + inline sal_uInt8 readBYTE(sal_uInt32 index) const + { + return m_pBuffer[index]; + } + + inline sal_Int16 readINT16(sal_uInt32 index) const + { + return ((m_pBuffer[index] << 8) | (m_pBuffer[index+1] << 0)); + } + + inline sal_uInt16 readUINT16(sal_uInt32 index) const + { + return ((m_pBuffer[index] << 8) | (m_pBuffer[index+1] << 0)); + } + + inline sal_Int32 readINT32(sal_uInt32 index) const + { + return ( + (m_pBuffer[index] << 24) | + (m_pBuffer[index+1] << 16) | + (m_pBuffer[index+2] << 8) | + (m_pBuffer[index+3] << 0) + ); + } + + inline sal_uInt32 readUINT32(sal_uInt32 index) const + { + return ( + (m_pBuffer[index] << 24) | + (m_pBuffer[index+1] << 16) | + (m_pBuffer[index+2] << 8) | + (m_pBuffer[index+3] << 0) + ); + } +}; + +BlopObject::BlopObject(const sal_uInt8* buffer, sal_uInt32 len, sal_Bool copyBuffer) + : m_isCopied(copyBuffer) + , m_bufferLen(len) +{ + if (m_isCopied) + { + sal_uInt8* newBuffer = new sal_uInt8[len]; + memcpy(newBuffer, buffer, len); + m_pBuffer = newBuffer; + } + else + { + m_pBuffer = buffer; + } +} + +BlopObject::~BlopObject() +{ + if (m_isCopied && m_pBuffer) + { +#ifdef OS2 + delete (sal_uInt8 *)m_pBuffer; +#else + delete[] const_cast(m_pBuffer); +#endif + } +} + +/************************************************************************** + + class StringCache + +**************************************************************************/ + +class StringCache +{ +public: + sal_Unicode** m_stringTable; + sal_uInt16 m_numOfStrings; + sal_uInt16 m_stringsCopied; + + StringCache(sal_uInt16 size); + ~StringCache(); + + const sal_Unicode* getString(sal_uInt16 index); + sal_uInt16 createString(const sal_uInt8* buffer); +}; + +StringCache::StringCache(sal_uInt16 size) + : m_numOfStrings(size) + , m_stringsCopied(0) + , m_stringTable(NULL) +{ + m_stringTable = new sal_Unicode*[m_numOfStrings]; + + for (sal_uInt16 i = 0; i < m_numOfStrings; i++) + { + m_stringTable[i] = NULL; + } +} + +StringCache::~StringCache() +{ + if (m_stringTable) + { + for (sal_uInt16 i = 0; i < m_stringsCopied; i++) + { + delete[] m_stringTable[i]; + } + + delete[] m_stringTable; + } +} + +const sal_Unicode* StringCache::getString(sal_uInt16 index) +{ + if ((index > 0) && (index <= m_stringsCopied)) + return m_stringTable[index - 1]; + else + return NULL; +} + +sal_uInt16 StringCache::createString(const sal_uInt8* buffer) +{ + if (m_stringsCopied < m_numOfStrings) + { + sal_uInt32 len = UINT16StringLen(buffer); + + m_stringTable[m_stringsCopied] = new sal_Unicode[len + 1]; + + readString(buffer, m_stringTable[m_stringsCopied], (len + 1) * sizeof(sal_Unicode)); + + return ++m_stringsCopied; + } + else + return 0; +} + +/************************************************************************** + + class ConstantPool + +**************************************************************************/ + +class ConstantPool : public BlopObject +{ +public: + + sal_uInt16 m_numOfEntries; + sal_Int32* m_pIndex; // index values may be < 0 for cached string constants + + StringCache* m_pStringCache; + + ConstantPool(const sal_uInt8* buffer, sal_uInt16 numEntries) + : BlopObject(buffer, 0, sal_False) + , m_numOfEntries(numEntries) + , m_pIndex(NULL) + , m_pStringCache(NULL) + { + } + + ~ConstantPool(); + + sal_uInt32 parseIndex(); + + CPInfoTag readTag(sal_uInt16 index); + + const sal_Char* readUTF8NameConstant(sal_uInt16 index); + sal_Bool readBOOLConstant(sal_uInt16 index); + sal_uInt8 readBYTEConstant(sal_uInt16 index); + sal_Int16 readINT16Constant(sal_uInt16 index); + sal_uInt16 readUINT16Constant(sal_uInt16 index); + sal_Int32 readINT32Constant(sal_uInt16 index); + sal_uInt32 readUINT32Constant(sal_uInt16 index); + float readFloatConstant(sal_uInt16 index); + double readDoubleConstant(sal_uInt16 index); + const sal_Unicode* readStringConstant(sal_uInt16 index); + void readUIK(sal_uInt16 index, RTUik* uik); +}; + +ConstantPool::~ConstantPool() +{ + if (m_pIndex) delete[] m_pIndex; + + if (m_pStringCache) + { + delete m_pStringCache; + } +} + +sal_uInt32 ConstantPool::parseIndex() +{ + if (m_pIndex) + { + delete[] m_pIndex; + m_pIndex = NULL; + } + + if (m_pStringCache) + { + delete m_pStringCache; + m_pStringCache = NULL; + } + + sal_uInt32 offset = 0; + sal_uInt16 numOfStrings = 0; + + if (m_numOfEntries) + { + m_pIndex = new sal_Int32[m_numOfEntries]; + + for (int i = 0; i < m_numOfEntries; i++) + { + m_pIndex[i] = (sal_Int32) offset; + + offset += readUINT16(offset); + + if ( + ((CPInfoTag) readUINT16(m_pIndex[i] + CP_OFFSET_ENTRY_TAG)) == + CP_TAG_CONST_STRING + ) + { + numOfStrings++; + } + + } + } + + if (numOfStrings) + { + m_pStringCache = new StringCache(numOfStrings); + } + + m_bufferLen = offset; + + return offset; +} + +CPInfoTag ConstantPool::readTag(sal_uInt16 index) +{ + CPInfoTag tag = CP_TAG_INVALID; + + if (m_pIndex && (index > 0) && (index <= m_numOfEntries)) + { + tag = (CPInfoTag) readUINT16(m_pIndex[index - 1] + CP_OFFSET_ENTRY_TAG); + } + + return tag; +} + +const sal_Char* ConstantPool::readUTF8NameConstant(sal_uInt16 index) +{ + const sal_Char* aName = NULL_STRING; + + if (m_pIndex && (index > 0) && (index <= m_numOfEntries)) + { + if (readUINT16(m_pIndex[index - 1] + CP_OFFSET_ENTRY_TAG) == CP_TAG_UTF8_NAME) + { + aName = (const sal_Char*) (m_pBuffer + m_pIndex[index - 1] + CP_OFFSET_ENTRY_DATA); + } + } + + return aName; +} + +sal_Bool ConstantPool::readBOOLConstant(sal_uInt16 index) +{ + sal_Bool aBool = sal_False; + + if (m_pIndex && (index> 0) && (index <= m_numOfEntries)) + { + if (readUINT16(m_pIndex[index - 1] + CP_OFFSET_ENTRY_TAG) == CP_TAG_CONST_BOOL) + { + aBool = (sal_Bool) readBYTE(m_pIndex[index - 1] + CP_OFFSET_ENTRY_DATA); + } + } + + return aBool; +} + +sal_uInt8 ConstantPool::readBYTEConstant(sal_uInt16 index) +{ + sal_uInt8 aByte = sal_False; + + if (m_pIndex && (index> 0) && (index <= m_numOfEntries)) + { + if (readUINT16(m_pIndex[index - 1] + CP_OFFSET_ENTRY_TAG) == CP_TAG_CONST_BYTE) + { + aByte = readBYTE(m_pIndex[index - 1] + CP_OFFSET_ENTRY_DATA); + } + } + + return aByte; +} + +sal_Int16 ConstantPool::readINT16Constant(sal_uInt16 index) +{ + sal_Int16 aINT16 = sal_False; + + if (m_pIndex && (index> 0) && (index <= m_numOfEntries)) + { + if (readUINT16(m_pIndex[index - 1] + CP_OFFSET_ENTRY_TAG) == CP_TAG_CONST_INT16) + { + aINT16 = readINT16(m_pIndex[index - 1] + CP_OFFSET_ENTRY_DATA); + } + } + + return aINT16; +} + +sal_uInt16 ConstantPool::readUINT16Constant(sal_uInt16 index) +{ + sal_uInt16 asal_uInt16 = sal_False; + + if (m_pIndex && (index> 0) && (index <= m_numOfEntries)) + { + if (readUINT16(m_pIndex[index - 1] + CP_OFFSET_ENTRY_TAG) == CP_TAG_CONST_UINT16) + { + asal_uInt16 = readUINT16(m_pIndex[index - 1] + CP_OFFSET_ENTRY_DATA); + } + } + + return asal_uInt16; +} + +sal_Int32 ConstantPool::readINT32Constant(sal_uInt16 index) +{ + sal_Int32 aINT32 = sal_False; + + if (m_pIndex && (index> 0) && (index <= m_numOfEntries)) + { + if (readUINT16(m_pIndex[index - 1] + CP_OFFSET_ENTRY_TAG) == CP_TAG_CONST_INT32) + { + aINT32 = readINT32(m_pIndex[index - 1] + CP_OFFSET_ENTRY_DATA); + } + } + + return aINT32; +} + +sal_uInt32 ConstantPool::readUINT32Constant(sal_uInt16 index) +{ + sal_uInt32 aUINT32 = sal_False; + + if (m_pIndex && (index> 0) && (index <= m_numOfEntries)) + { + if (readUINT16(m_pIndex[index - 1] + CP_OFFSET_ENTRY_TAG) == CP_TAG_CONST_UINT32) + { + aUINT32 = readUINT32(m_pIndex[index - 1] + CP_OFFSET_ENTRY_DATA); + } + } + + return aUINT32; +} + +float ConstantPool::readFloatConstant(sal_uInt16 index) +{ + union + { + float v; + sal_uInt32 b; + } x; + + if (m_pIndex && (index> 0) && (index <= m_numOfEntries)) + { + if (readUINT16(m_pIndex[index - 1] + CP_OFFSET_ENTRY_TAG) == CP_TAG_CONST_FLOAT) + { +#ifdef REGTYPE_IEEE_NATIVE + x.b = readUINT32(m_pIndex[index - 1] + CP_OFFSET_ENTRY_DATA); +#else +# error no IEEE +#endif + } + } + + return x.v; +} + +double ConstantPool::readDoubleConstant(sal_uInt16 index) +{ + union + { + double v; + struct + { + sal_uInt32 b1; + sal_uInt32 b2; + } b; + } x; + + if (m_pIndex && (index> 0) && (index <= m_numOfEntries)) + { + if (readUINT16(m_pIndex[index - 1] + CP_OFFSET_ENTRY_TAG) == CP_TAG_CONST_DOUBLE) + { + +#ifdef REGTYPE_IEEE_NATIVE +# ifdef OSL_BIGENDIAN + x.b.b1 = readUINT32(m_pIndex[index - 1] + CP_OFFSET_ENTRY_DATA); + x.b.b2 = readUINT32(m_pIndex[index - 1] + CP_OFFSET_ENTRY_DATA + sizeof(sal_uInt32)); +# else + x.b.b1 = readUINT32(m_pIndex[index - 1] + CP_OFFSET_ENTRY_DATA + sizeof(sal_uInt32)); + x.b.b2 = readUINT32(m_pIndex[index - 1] + CP_OFFSET_ENTRY_DATA); +# endif +#else +# error no IEEE +#endif + } + } + + return x.v; +} + +const sal_Unicode* ConstantPool::readStringConstant(sal_uInt16 index) +{ + const sal_Unicode* aString = NULL_WSTRING; + + if (m_pIndex && (index> 0) && (index <= m_numOfEntries) && m_pStringCache) + { + if (m_pIndex[index - 1] >= 0) + { + // create cached string now + + if (readUINT16(m_pIndex[index - 1] + CP_OFFSET_ENTRY_TAG) == CP_TAG_CONST_STRING) + { + m_pIndex[index - 1] = -1 * m_pStringCache->createString(m_pBuffer + m_pIndex[index - 1] + CP_OFFSET_ENTRY_DATA); + } + } + + aString = m_pStringCache->getString((sal_uInt16) (m_pIndex[index - 1] * -1)); + } + + return aString; +} + +void ConstantPool::readUIK(sal_uInt16 index, RTUik* uik) +{ + if (index == 0) + { + uik->m_Data1 = 0; + uik->m_Data2 = 0; + uik->m_Data3 = 0; + uik->m_Data4 = 0; + uik->m_Data5 = 0; + } + else if (m_pIndex && (index <= m_numOfEntries)) + { + if (readUINT16(m_pIndex[index - 1] + CP_OFFSET_ENTRY_TAG) == CP_TAG_UIK) + { + uik->m_Data1 = readUINT32(m_pIndex[index - 1] + CP_OFFSET_ENTRY_UIK1); + uik->m_Data2 = readUINT16(m_pIndex[index - 1] + CP_OFFSET_ENTRY_UIK2); + uik->m_Data3 = readUINT16(m_pIndex[index - 1] + CP_OFFSET_ENTRY_UIK3); + uik->m_Data4 = readUINT32(m_pIndex[index - 1] + CP_OFFSET_ENTRY_UIK4); + uik->m_Data5 = readUINT32(m_pIndex[index - 1] + CP_OFFSET_ENTRY_UIK5); + } + } +} + +/************************************************************************** + + class FieldList + +**************************************************************************/ + +class FieldList : public BlopObject +{ +public: + + sal_uInt16 m_numOfEntries; + ConstantPool* m_pCP; + + FieldList(const sal_uInt8* buffer, sal_uInt16 numEntries, ConstantPool* pCP) + : BlopObject(buffer, 0, sal_False) + , m_numOfEntries(numEntries) + , m_pCP(pCP) + { + } + + sal_uInt32 parseIndex(); + + const sal_Char* getFieldName(sal_uInt16 index); + const sal_Char* getFieldType(sal_uInt16 index); + RTFieldAccess getFieldAccess(sal_uInt16 index); + RTValueType getFieldConstValue(sal_uInt16 index, RTConstValueUnion* value); + const sal_Char* getFieldDoku(sal_uInt16 index); + const sal_Char* getFieldFileName(sal_uInt16 index); +}; + +sal_uInt32 FieldList::parseIndex() +{ + return (m_numOfEntries * (sizeof(sal_uInt16) * 6)); +} + +const sal_Char* FieldList::getFieldName(sal_uInt16 index) +{ + const sal_Char* aName = NULL; + + if (index <= m_numOfEntries) + { + aName = m_pCP->readUTF8NameConstant(readUINT16((index * FIELD_ENTRY_SIZE) + FIELD_OFFSET_NAME)); + } + + return aName; +} + +const sal_Char* FieldList::getFieldType(sal_uInt16 index) +{ + const sal_Char* aName = NULL; + + if (index <= m_numOfEntries) + { + aName = m_pCP->readUTF8NameConstant(readUINT16((index * FIELD_ENTRY_SIZE) + FIELD_OFFSET_TYPE)); + } + + return aName; +} + +RTFieldAccess FieldList::getFieldAccess(sal_uInt16 index) +{ + RTFieldAccess aAccess; + + if (index <= m_numOfEntries) + { + aAccess = (RTFieldAccess) readUINT16((index * FIELD_ENTRY_SIZE) + FIELD_OFFSET_ACCESS); + } + + return aAccess; +} + +RTValueType FieldList::getFieldConstValue(sal_uInt16 index, RTConstValueUnion* value) +{ + RTValueType ret = RT_TYPE_NONE; + + if (index <= m_numOfEntries) + { + sal_uInt16 cpIndex = readUINT16((index * FIELD_ENTRY_SIZE) + FIELD_OFFSET_VALUE); + + switch (m_pCP->readTag(cpIndex)) + { + case CP_TAG_CONST_BOOL: + value->aBool = m_pCP->readBOOLConstant(cpIndex); + ret = RT_TYPE_BOOL; + break; + case CP_TAG_CONST_BYTE: + value->aByte = m_pCP->readBYTEConstant(cpIndex); + ret = RT_TYPE_BYTE; + break; + case CP_TAG_CONST_INT16: + value->aShort = m_pCP->readINT16Constant(cpIndex); + ret = RT_TYPE_INT16; + break; + case CP_TAG_CONST_UINT16: + value->aUShort = m_pCP->readUINT16Constant(cpIndex); + ret = RT_TYPE_UINT16; + break; + case CP_TAG_CONST_INT32: + value->aLong = m_pCP->readINT32Constant(cpIndex); + ret = RT_TYPE_INT32; + break; + case CP_TAG_CONST_UINT32: + value->aULong = m_pCP->readUINT32Constant(cpIndex); + ret = RT_TYPE_UINT32; + break; + case CP_TAG_CONST_INT64: +// value->aHyper = m_pCP->readINT64Constant(cpIndex); + ret = RT_TYPE_INT64; + break; + case CP_TAG_CONST_UINT64: +// value->aUHyper = m_pCP->readUINT64Constant(cpIndex); + ret = RT_TYPE_UINT64; + break; + case CP_TAG_CONST_FLOAT: + value->aFloat = m_pCP->readFloatConstant(cpIndex); + ret = RT_TYPE_FLOAT; + break; + case CP_TAG_CONST_DOUBLE: + value->aDouble = m_pCP->readDoubleConstant(cpIndex); + ret = RT_TYPE_DOUBLE; + break; + case CP_TAG_CONST_STRING: + value->aString = m_pCP->readStringConstant(cpIndex); + ret = RT_TYPE_STRING; + break; + default: + break; + } + } + + return ret; +} + +const sal_Char* FieldList::getFieldDoku(sal_uInt16 index) +{ + const sal_Char* aDoku = NULL; + + if (index <= m_numOfEntries) + { + aDoku = m_pCP->readUTF8NameConstant(readUINT16((index * FIELD_ENTRY_SIZE) + FIELD_OFFSET_DOKU)); + } + + return aDoku; +} + +const sal_Char* FieldList::getFieldFileName(sal_uInt16 index) +{ + const sal_Char* aFileName = NULL; + + if (index <= m_numOfEntries) + { + aFileName = m_pCP->readUTF8NameConstant(readUINT16((index * FIELD_ENTRY_SIZE) + FIELD_OFFSET_FILENAME)); + } + + return aFileName; +} + +/************************************************************************** + + class ReferenceList + +**************************************************************************/ + +class ReferenceList : public BlopObject +{ +public: + + sal_uInt16 m_numOfEntries; + ConstantPool* m_pCP; + + ReferenceList(const sal_uInt8* buffer, sal_uInt16 numEntries, ConstantPool* pCP) + : BlopObject(buffer, 0, sal_False) + , m_numOfEntries(numEntries) + , m_pCP(pCP) + { + } + + sal_uInt32 parseIndex(); + + const sal_Char* getReferenceName(sal_uInt16 index); + RTReferenceType getReferenceType(sal_uInt16 index); + const sal_Char* getReferenceDoku(sal_uInt16 index); + RTFieldAccess getReferenceAccess(sal_uInt16 index); +}; + +sal_uInt32 ReferenceList::parseIndex() +{ + return (m_numOfEntries * (sizeof(sal_uInt16) * 4)); +} + +const sal_Char* ReferenceList::getReferenceName(sal_uInt16 index) +{ + const sal_Char* aName = NULL; + + if (index <= m_numOfEntries) + { + aName = m_pCP->readUTF8NameConstant(readUINT16((index * REFERENCE_ENTRY_SIZE) + REFERENCE_OFFSET_NAME)); + } + + return aName; +} + +RTReferenceType ReferenceList::getReferenceType(sal_uInt16 index) +{ + RTReferenceType refType; + + if (index <= m_numOfEntries) + { + refType = (RTReferenceType) readUINT16((index * REFERENCE_ENTRY_SIZE) + REFERENCE_OFFSET_TYPE); + } + + return refType; +} + +const sal_Char* ReferenceList::getReferenceDoku(sal_uInt16 index) +{ + const sal_Char* aDoku = NULL; + + if (index <= m_numOfEntries) + { + aDoku = m_pCP->readUTF8NameConstant(readUINT16((index * REFERENCE_ENTRY_SIZE) + REFERENCE_OFFSET_DOKU)); + } + + return aDoku; +} + +RTFieldAccess ReferenceList::getReferenceAccess(sal_uInt16 index) +{ + RTFieldAccess aAccess; + + if (index <= m_numOfEntries) + { + aAccess = (RTFieldAccess) readUINT16((index * REFERENCE_ENTRY_SIZE) + REFERENCE_OFFSET_ACCESS); + } + + return aAccess; +} + +/************************************************************************** + + class MethodList + +**************************************************************************/ + +class MethodList : public BlopObject +{ +public: + + sal_uInt16 m_numOfEntries; + sal_uInt32* m_pIndex; + ConstantPool* m_pCP; + + MethodList(const sal_uInt8* buffer, sal_uInt16 numEntries, ConstantPool* pCP) + : BlopObject(buffer, 0, sal_False) + , m_numOfEntries(numEntries) + , m_pIndex(NULL) + , m_pCP(pCP) + { + } + + ~MethodList(); + + sal_uInt32 parseIndex(); + + const sal_Char* getMethodName(sal_uInt16 index); + sal_uInt16 getMethodParamCount(sal_uInt16 index); + const sal_Char* getMethodParamType(sal_uInt16 index, sal_uInt16 paramIndex); + const sal_Char* getMethodParamName(sal_uInt16 index, sal_uInt16 paramIndex); + RTParamMode getMethodParamMode(sal_uInt16 index, sal_uInt16 paramIndex); + sal_uInt16 getMethodExcCount(sal_uInt16 index); + const sal_Char* getMethodExcType(sal_uInt16 index, sal_uInt16 excIndex); + const sal_Char* getMethodReturnType(sal_uInt16 index); + RTMethodMode getMethodMode(sal_uInt16 index); + const sal_Char* getMethodDoku(sal_uInt16 index); +}; + +MethodList::~MethodList() +{ + if (m_pIndex) delete[] m_pIndex; +} + +sal_uInt32 MethodList::parseIndex() +{ + if (m_pIndex) + { + delete[] m_pIndex; + m_pIndex = NULL; + } + + sal_uInt32 offset = 0; + + if (m_numOfEntries) + { + m_pIndex = new sal_uInt32[m_numOfEntries]; + + for (int i = 0; i < m_numOfEntries; i++) + { + m_pIndex[i] = offset; + + offset += readUINT16(offset); + } + } + + return offset; +} + +const sal_Char* MethodList::getMethodName(sal_uInt16 index) +{ + const sal_Char* aName = NULL; + + if (index <= m_numOfEntries) + { + aName = m_pCP->readUTF8NameConstant(readUINT16(m_pIndex[index] + METHOD_OFFSET_NAME)); + } + + return aName; +} + +sal_uInt16 MethodList::getMethodParamCount(sal_uInt16 index) +{ + sal_uInt16 aCount = 0; + + if (index <= m_numOfEntries) + { + aCount = readUINT16(m_pIndex[index] + METHOD_OFFSET_PARAM_COUNT); + } + + return aCount; +} + +const sal_Char* MethodList::getMethodParamType(sal_uInt16 index, sal_uInt16 paramIndex) +{ + const sal_Char* aName = NULL; + + if ((index <= m_numOfEntries) && (paramIndex <= readUINT16(m_pIndex[index] + METHOD_OFFSET_PARAM_COUNT))) + { + aName = m_pCP->readUTF8NameConstant( + readUINT16( + m_pIndex[index] + + METHOD_OFFSET_PARAM(paramIndex) + + PARAM_OFFSET_TYPE)); + } + + return aName; +} + +const sal_Char* MethodList::getMethodParamName(sal_uInt16 index, sal_uInt16 paramIndex) +{ + const sal_Char* aName = NULL; + + if ((index <= m_numOfEntries) && (paramIndex <= readUINT16(m_pIndex[index] + METHOD_OFFSET_PARAM_COUNT))) + { + aName = m_pCP->readUTF8NameConstant( + readUINT16( + m_pIndex[index] + + METHOD_OFFSET_PARAM(paramIndex) + + PARAM_OFFSET_NAME)); + } + + return aName; +} + +RTParamMode MethodList::getMethodParamMode(sal_uInt16 index, sal_uInt16 paramIndex) +{ + RTParamMode aMode = RT_PARAM_INVALID; + + if ((index <= m_numOfEntries) && (paramIndex <= readUINT16(m_pIndex[index] + METHOD_OFFSET_PARAM_COUNT))) + { + aMode = (RTParamMode) readUINT16( + m_pIndex[index] + + METHOD_OFFSET_PARAM(paramIndex) + + PARAM_OFFSET_MODE); + } + + return aMode; +} + +sal_uInt16 MethodList::getMethodExcCount(sal_uInt16 index) +{ + sal_uInt16 aCount = 0; + + if (index <= m_numOfEntries) + { + aCount = readUINT16(m_pIndex[index] + METHOD_OFFSET_PARAM(readUINT16(m_pIndex[index] + METHOD_OFFSET_PARAM_COUNT))); + } + + return aCount; +} + +const sal_Char* MethodList::getMethodExcType(sal_uInt16 index, sal_uInt16 excIndex) +{ + const sal_Char* aName = NULL; + + if (index <= m_numOfEntries) + { + sal_uInt32 excOffset = m_pIndex[index] + METHOD_OFFSET_PARAM(readUINT16(m_pIndex[index] + METHOD_OFFSET_PARAM_COUNT)); + + if (excIndex <= readUINT16(excOffset)) + { + aName = m_pCP->readUTF8NameConstant( + readUINT16( + excOffset + + sizeof(sal_uInt16) + + (excIndex * sizeof(sal_uInt16)))); + } + } + + return aName; +} + +const sal_Char* MethodList::getMethodReturnType(sal_uInt16 index) +{ + const sal_Char* aName = NULL; + + if (index <= m_numOfEntries) + { + aName = m_pCP->readUTF8NameConstant(readUINT16(m_pIndex[index] + METHOD_OFFSET_RETURN)); + } + + return aName; +} + +RTMethodMode MethodList::getMethodMode(sal_uInt16 index) +{ + RTMethodMode aMode = RT_MODE_INVALID; + + if (index <= m_numOfEntries) + { + aMode = (RTMethodMode) readUINT16(m_pIndex[index] + METHOD_OFFSET_MODE); + } + + return aMode; +} + +const sal_Char* MethodList::getMethodDoku(sal_uInt16 index) +{ + const sal_Char* aDoku = NULL; + + if (index <= m_numOfEntries) + { + aDoku = m_pCP->readUTF8NameConstant(readUINT16(m_pIndex[index] + METHOD_OFFSET_DOKU)); + } + + return aDoku; +} + +/************************************************************************** + + class TypeRegistryEntry + +**************************************************************************/ + +class TypeRegistryEntry : public BlopObject +{ + +public: + + ConstantPool* m_pCP; + FieldList* m_pFields; + MethodList* m_pMethods; + ReferenceList* m_pReferences; + sal_uInt32 m_refCount; + + TypeRegistryEntry(const sal_uInt8* buffer, sal_uInt32 len, sal_Bool copyBuffer) + : BlopObject(buffer, len, copyBuffer) + , m_pCP(NULL) + , m_pFields(NULL) + , m_pMethods(NULL) + , m_pReferences(NULL) + , m_refCount(1) + { + } + + ~TypeRegistryEntry(); + + void init() const; + +}; + +TypeRegistryEntry::~TypeRegistryEntry() +{ + if (m_pCP) delete m_pCP; + if (m_pFields) delete m_pFields; + if (m_pMethods) delete m_pMethods; + if (m_pReferences) delete m_pReferences; +} + + +void TypeRegistryEntry::init() const +{ +#ifdef OS2 + TypeRegistryEntry* _This = (TypeRegistryEntry*)(this); +#else + TypeRegistryEntry* _This = const_cast(this); +#endif + + if (m_pCP) + { + delete _This->m_pCP; + _This->m_pCP = NULL; + } + + _This->m_pCP = new ConstantPool(m_pBuffer + OFFSET_CP, readUINT16(OFFSET_CP_SIZE)); + + sal_uInt32 offset = OFFSET_CP + _This->m_pCP->parseIndex(); + + _This->m_pFields = new FieldList(m_pBuffer + offset + sizeof(sal_uInt16), readUINT16(offset), _This->m_pCP); + + offset += sizeof(sal_uInt16) + _This->m_pFields->parseIndex(); + + _This->m_pMethods = new MethodList(m_pBuffer + offset + sizeof(sal_uInt16), readUINT16(offset), _This->m_pCP); + + offset += sizeof(sal_uInt16) + _This->m_pMethods->parseIndex(); + + _This->m_pReferences = new ReferenceList(m_pBuffer + offset + sizeof(sal_uInt16), readUINT16(offset), _This->m_pCP); + + offset += sizeof(sal_uInt16) + _This->m_pReferences->parseIndex(); +} + + +/************************************************************************** + + C-API + +**************************************************************************/ + +static TypeReaderImpl TYPEREG_CALLTYPE createEntry(const sal_uInt8* buffer, sal_uInt32 len, sal_Bool copyBuffer) +{ + TypeRegistryEntry* ret = NULL; + + if (len >= OFFSET_CP) + { + ret = new TypeRegistryEntry(buffer, len, copyBuffer); + + if ( + (ret->readUINT32(OFFSET_MAGIC) != magic) || + (ret->readUINT32(OFFSET_SIZE) > len) + ) + { + delete ret; + ret = NULL; + } + } + + return ret; +} + +static void TYPEREG_CALLTYPE acquire(TypeReaderImpl hEntry) +{ + TypeRegistryEntry* pEntry = (TypeRegistryEntry*) hEntry; + + if (pEntry != NULL) + pEntry->m_refCount++; +} + +static void TYPEREG_CALLTYPE release(TypeReaderImpl hEntry) +{ + TypeRegistryEntry* pEntry = (TypeRegistryEntry*) hEntry; + + if (pEntry != NULL) + { + if (--pEntry->m_refCount == 0) + delete pEntry; + } +} + +static sal_uInt16 TYPEREG_CALLTYPE getMinorVersion(TypeReaderImpl hEntry) +{ + TypeRegistryEntry* pEntry = (TypeRegistryEntry*) hEntry; + + if (pEntry == NULL) return 0; + + return pEntry->readUINT16(OFFSET_MINOR_VERSION); +} + +static sal_uInt16 TYPEREG_CALLTYPE getMajorVersion(TypeReaderImpl hEntry) +{ + TypeRegistryEntry* pEntry = (TypeRegistryEntry*) hEntry; + + if (pEntry == NULL) return 0; + + return pEntry->readUINT16(OFFSET_MAJOR_VERSION); +} + +static RTTypeClass TYPEREG_CALLTYPE getTypeClass(TypeReaderImpl hEntry) +{ + TypeRegistryEntry* pEntry = (TypeRegistryEntry*) hEntry; + + if (pEntry == NULL) return RT_TYPE_INVALID; + + return (RTTypeClass) pEntry->readUINT16(OFFSET_TYPE_CLASS); +} + +static void TYPEREG_CALLTYPE getTypeName(TypeReaderImpl hEntry, rtl_uString** pTypeName) +{ + TypeRegistryEntry* pEntry = (TypeRegistryEntry*) hEntry; + + if (pEntry == NULL) + { + rtl_uString_new(pTypeName); + return; + } + + if (pEntry->m_pCP == NULL) pEntry->init(); + + const sal_Char* pTmp = pEntry->m_pCP->readUTF8NameConstant(pEntry->readUINT16(OFFSET_THIS_TYPE)); + if ( pTmp ) + rtl_string2UString( pTypeName, pTmp, rtl_str_getLength(pTmp), RTL_TEXTENCODING_UTF8, OUSTRING_TO_OSTRING_CVTFLAGS); +} + +static void TYPEREG_CALLTYPE getSuperTypeName(TypeReaderImpl hEntry, rtl_uString** pSuperTypeName) +{ + TypeRegistryEntry* pEntry = (TypeRegistryEntry*) hEntry; + + if (pEntry == NULL) + { + rtl_uString_new(pSuperTypeName); + return; + } + + if (pEntry->m_pCP == NULL) pEntry->init(); + + const sal_Char* pTmp = pEntry->m_pCP->readUTF8NameConstant(pEntry->readUINT16(OFFSET_SUPER_TYPE)); + if ( pTmp ) + rtl_string2UString( pSuperTypeName, pTmp, rtl_str_getLength(pTmp), RTL_TEXTENCODING_UTF8, OUSTRING_TO_OSTRING_CVTFLAGS); +} + +static void TYPEREG_CALLTYPE getUik(TypeReaderImpl hEntry, RTUik* uik) +{ + TypeRegistryEntry* pEntry = (TypeRegistryEntry*) hEntry; + + if (pEntry != NULL) + { + if (pEntry->m_pCP == NULL) pEntry->init(); + + pEntry->m_pCP->readUIK(pEntry->readUINT16(OFFSET_UIK), uik); + } +} + +static void TYPEREG_CALLTYPE getDoku(TypeReaderImpl hEntry, rtl_uString** pDoku) +{ + TypeRegistryEntry* pEntry = (TypeRegistryEntry*) hEntry; + + if (pEntry == NULL) + { + rtl_uString_new(pDoku); + return; + } + + if (pEntry->m_pCP == NULL) pEntry->init(); + + const sal_Char* pTmp = pEntry->m_pCP->readUTF8NameConstant(pEntry->readUINT16(OFFSET_DOKU)); + if ( pTmp ) + rtl_string2UString( pDoku, pTmp, rtl_str_getLength(pTmp), RTL_TEXTENCODING_UTF8, OUSTRING_TO_OSTRING_CVTFLAGS); +} + +static void TYPEREG_CALLTYPE getFileName(TypeReaderImpl hEntry, rtl_uString** pFileName) +{ + TypeRegistryEntry* pEntry = (TypeRegistryEntry*) hEntry; + + if (pEntry == NULL) + { + rtl_uString_new(pFileName); + return; + } + + if (pEntry->m_pCP == NULL) pEntry->init(); + + const sal_Char* pTmp = pEntry->m_pCP->readUTF8NameConstant(pEntry->readUINT16(OFFSET_FILENAME)); + if ( pTmp ) + rtl_string2UString( pFileName, pTmp, rtl_str_getLength(pTmp), RTL_TEXTENCODING_UTF8, OUSTRING_TO_OSTRING_CVTFLAGS); +} + +static sal_uInt32 TYPEREG_CALLTYPE getFieldCount(TypeReaderImpl hEntry) +{ + TypeRegistryEntry* pEntry = (TypeRegistryEntry*) hEntry; + + if (pEntry == NULL) return 0; + + if (pEntry->m_pCP == NULL) pEntry->init(); + + return pEntry->m_pFields->m_numOfEntries; +} + +static void TYPEREG_CALLTYPE getFieldName(TypeReaderImpl hEntry, rtl_uString** pFieldName, sal_uInt16 index) +{ + TypeRegistryEntry* pEntry = (TypeRegistryEntry*) hEntry; + + if (pEntry == NULL) + { + rtl_uString_new(pFieldName); + return; + } + if (pEntry->m_pCP == NULL) pEntry->init(); + + const sal_Char* pTmp = pEntry->m_pFields->getFieldName(index); + if ( pTmp ) + rtl_string2UString( pFieldName, pTmp, rtl_str_getLength(pTmp), RTL_TEXTENCODING_UTF8, OUSTRING_TO_OSTRING_CVTFLAGS); +} + +static void TYPEREG_CALLTYPE getFieldType(TypeReaderImpl hEntry, rtl_uString** pFieldType, sal_uInt16 index) +{ + TypeRegistryEntry* pEntry = (TypeRegistryEntry*) hEntry; + + if (pEntry == NULL) + { + rtl_uString_new(pFieldType); + return; + } + + if (pEntry->m_pCP == NULL) pEntry->init(); + + const sal_Char* pTmp = pEntry->m_pFields->getFieldType(index); + if ( pTmp ) + rtl_string2UString( pFieldType, pTmp, rtl_str_getLength(pTmp), RTL_TEXTENCODING_UTF8, OUSTRING_TO_OSTRING_CVTFLAGS); +} + +static RTFieldAccess TYPEREG_CALLTYPE getFieldAccess(TypeReaderImpl hEntry, sal_uInt16 index) +{ + TypeRegistryEntry* pEntry = (TypeRegistryEntry*) hEntry; + + if (pEntry == NULL) return RT_ACCESS_INVALID; + + if (pEntry->m_pCP == NULL) pEntry->init(); + + return pEntry->m_pFields->getFieldAccess(index); +} + +static RTValueType TYPEREG_CALLTYPE getFieldConstValue(TypeReaderImpl hEntry, sal_uInt16 index, RTConstValueUnion* value) +{ + TypeRegistryEntry* pEntry = (TypeRegistryEntry*) hEntry; + + if (pEntry == NULL) return RT_TYPE_NONE; + + if (pEntry->m_pCP == NULL) pEntry->init(); + + return pEntry->m_pFields->getFieldConstValue(index, value); +} + +static void TYPEREG_CALLTYPE getFieldDoku(TypeReaderImpl hEntry, rtl_uString** pDoku, sal_uInt16 index) +{ + TypeRegistryEntry* pEntry = (TypeRegistryEntry*) hEntry; + + if (pEntry == NULL) + { + rtl_uString_new(pDoku); + return; + } + + if (pEntry->m_pCP == NULL) pEntry->init(); + + const sal_Char* pTmp = pEntry->m_pFields->getFieldDoku(index); + if ( pTmp ) + rtl_string2UString( pDoku, pTmp, rtl_str_getLength(pTmp), RTL_TEXTENCODING_UTF8, OUSTRING_TO_OSTRING_CVTFLAGS); +} + +static void TYPEREG_CALLTYPE getFieldFileName(TypeReaderImpl hEntry, rtl_uString** pFieldFileName, sal_uInt16 index) +{ + TypeRegistryEntry* pEntry = (TypeRegistryEntry*) hEntry; + + if (pEntry == NULL) + { + rtl_uString_new(pFieldFileName); + return; + } + + if (pEntry->m_pCP == NULL) pEntry->init(); + + const sal_Char* pTmp = pEntry->m_pFields->getFieldFileName(index); + if ( pTmp ) + rtl_string2UString( pFieldFileName, pTmp, rtl_str_getLength(pTmp), RTL_TEXTENCODING_UTF8, OUSTRING_TO_OSTRING_CVTFLAGS); +} + +static sal_uInt32 TYPEREG_CALLTYPE getMethodCount(TypeReaderImpl hEntry) +{ + TypeRegistryEntry* pEntry = (TypeRegistryEntry*) hEntry; + + if (pEntry == NULL) return 0; + + if (pEntry->m_pCP == NULL) pEntry->init(); + + return pEntry->m_pMethods->m_numOfEntries; +} + +static void TYPEREG_CALLTYPE getMethodName(TypeReaderImpl hEntry, rtl_uString** pMethodName, sal_uInt16 index) +{ + TypeRegistryEntry* pEntry = (TypeRegistryEntry*) hEntry; + + if (pEntry == NULL) + { + rtl_uString_new(pMethodName); + return; + } + + if (pEntry->m_pCP == NULL) pEntry->init(); + + const sal_Char* pTmp = pEntry->m_pMethods->getMethodName(index); + if ( pTmp ) + rtl_string2UString( pMethodName, pTmp, rtl_str_getLength(pTmp), RTL_TEXTENCODING_UTF8, OUSTRING_TO_OSTRING_CVTFLAGS); +} + +static sal_uInt32 TYPEREG_CALLTYPE getMethodParamCount(TypeReaderImpl hEntry, sal_uInt16 index) +{ + TypeRegistryEntry* pEntry = (TypeRegistryEntry*) hEntry; + + if (pEntry == NULL) return 0; + + if (pEntry->m_pCP == NULL) pEntry->init(); + + return pEntry->m_pMethods->getMethodParamCount(index); +} + +static void TYPEREG_CALLTYPE getMethodParamType(TypeReaderImpl hEntry, rtl_uString** pMethodParamType, sal_uInt16 index, sal_uInt16 paramIndex) +{ + TypeRegistryEntry* pEntry = (TypeRegistryEntry*) hEntry; + + if (pEntry == NULL) + { + rtl_uString_new(pMethodParamType); + return; + } + + if (pEntry->m_pCP == NULL) pEntry->init(); + + const sal_Char* pTmp = pEntry->m_pMethods->getMethodParamType(index, paramIndex); + if ( pTmp ) + rtl_string2UString( pMethodParamType, pTmp, rtl_str_getLength(pTmp), RTL_TEXTENCODING_UTF8, OUSTRING_TO_OSTRING_CVTFLAGS); +} + +static void TYPEREG_CALLTYPE getMethodParamName(TypeReaderImpl hEntry, rtl_uString** pMethodParamName, sal_uInt16 index, sal_uInt16 paramIndex) +{ + TypeRegistryEntry* pEntry = (TypeRegistryEntry*) hEntry; + + if (pEntry == NULL) + { + rtl_uString_new(pMethodParamName); + return; + } + + if (pEntry->m_pCP == NULL) pEntry->init(); + + const sal_Char* pTmp = pEntry->m_pMethods->getMethodParamName(index, paramIndex); + if ( pTmp ) + rtl_string2UString( pMethodParamName, pTmp, rtl_str_getLength(pTmp), RTL_TEXTENCODING_UTF8, OUSTRING_TO_OSTRING_CVTFLAGS); +} + +static RTParamMode TYPEREG_CALLTYPE getMethodParamMode(TypeReaderImpl hEntry, sal_uInt16 index, sal_uInt16 paramIndex) +{ + TypeRegistryEntry* pEntry = (TypeRegistryEntry*) hEntry; + + if (pEntry == NULL) return RT_PARAM_INVALID; + + if (pEntry->m_pCP == NULL) pEntry->init(); + + return pEntry->m_pMethods->getMethodParamMode(index, paramIndex); +} + +static sal_uInt32 TYPEREG_CALLTYPE getMethodExcCount(TypeReaderImpl hEntry, sal_uInt16 index) +{ + TypeRegistryEntry* pEntry = (TypeRegistryEntry*) hEntry; + + if (pEntry == NULL) return 0; + + if (pEntry->m_pCP == NULL) pEntry->init(); + + return pEntry->m_pMethods->getMethodExcCount(index); +} + +static void TYPEREG_CALLTYPE getMethodExcType(TypeReaderImpl hEntry, rtl_uString** pMethodExcpType, sal_uInt16 index, sal_uInt16 excIndex) +{ + TypeRegistryEntry* pEntry = (TypeRegistryEntry*) hEntry; + + if (pEntry == NULL) + { + rtl_uString_new(pMethodExcpType); + return; + } + + if (pEntry->m_pCP == NULL) pEntry->init(); + + const sal_Char* pTmp = pEntry->m_pMethods->getMethodExcType(index, excIndex); + if ( pTmp ) + rtl_string2UString( pMethodExcpType, pTmp, rtl_str_getLength(pTmp), RTL_TEXTENCODING_UTF8, OUSTRING_TO_OSTRING_CVTFLAGS); +} + +static void TYPEREG_CALLTYPE getMethodReturnType(TypeReaderImpl hEntry, rtl_uString** pMethodReturnType, sal_uInt16 index) +{ + TypeRegistryEntry* pEntry = (TypeRegistryEntry*) hEntry; + + if (pEntry == NULL) + { + rtl_uString_new(pMethodReturnType); + return; + } + + if (pEntry->m_pCP == NULL) pEntry->init(); + + const sal_Char* pTmp = pEntry->m_pMethods->getMethodReturnType(index); + if ( pTmp ) + rtl_string2UString( pMethodReturnType, pTmp, rtl_str_getLength(pTmp), RTL_TEXTENCODING_UTF8, OUSTRING_TO_OSTRING_CVTFLAGS); +} + +static RTMethodMode TYPEREG_CALLTYPE getMethodMode(TypeReaderImpl hEntry, sal_uInt16 index) +{ + TypeRegistryEntry* pEntry = (TypeRegistryEntry*) hEntry; + + if (pEntry == NULL) return RT_MODE_INVALID; + + if (pEntry->m_pCP == NULL) pEntry->init(); + + return pEntry->m_pMethods->getMethodMode(index); +} + +static void TYPEREG_CALLTYPE getMethodDoku(TypeReaderImpl hEntry, rtl_uString** pMethodDoku, sal_uInt16 index) +{ + TypeRegistryEntry* pEntry = (TypeRegistryEntry*) hEntry; + + if (pEntry == NULL) + { + rtl_uString_new(pMethodDoku); + return; + } + if (pEntry->m_pCP == NULL) pEntry->init(); + + const sal_Char* pTmp = pEntry->m_pMethods->getMethodDoku(index); + if ( pTmp ) + rtl_string2UString( pMethodDoku, pTmp, rtl_str_getLength(pTmp), RTL_TEXTENCODING_UTF8, OUSTRING_TO_OSTRING_CVTFLAGS); +} + +static sal_uInt32 TYPEREG_CALLTYPE getReferenceCount(TypeReaderImpl hEntry) +{ + TypeRegistryEntry* pEntry = (TypeRegistryEntry*) hEntry; + + if (pEntry == NULL) return 0; + + if (pEntry->m_pCP == NULL) pEntry->init(); + + return pEntry->m_pReferences->m_numOfEntries; +} + +static void TYPEREG_CALLTYPE getReferenceName(TypeReaderImpl hEntry, rtl_uString** pReferenceName, sal_uInt16 index) +{ + TypeRegistryEntry* pEntry = (TypeRegistryEntry*) hEntry; + + if (pEntry == NULL) + { + rtl_uString_new(pReferenceName); + return; + } + + if (pEntry->m_pCP == NULL) pEntry->init(); + + const sal_Char* pTmp = pEntry->m_pReferences->getReferenceName(index); + if ( pTmp ) + rtl_string2UString( pReferenceName, pTmp, rtl_str_getLength(pTmp), RTL_TEXTENCODING_UTF8, OUSTRING_TO_OSTRING_CVTFLAGS); +} + +static RTReferenceType TYPEREG_CALLTYPE getReferenceType(TypeReaderImpl hEntry, sal_uInt16 index) +{ + TypeRegistryEntry* pEntry = (TypeRegistryEntry*) hEntry; + + if (pEntry == NULL) return RT_REF_INVALID; + + if (pEntry->m_pCP == NULL) pEntry->init(); + + return pEntry->m_pReferences->getReferenceType(index); +} + +static void TYPEREG_CALLTYPE getReferenceDoku(TypeReaderImpl hEntry, rtl_uString** pReferenceDoku, sal_uInt16 index) +{ + TypeRegistryEntry* pEntry = (TypeRegistryEntry*) hEntry; + + if (pEntry == NULL) + { + rtl_uString_new(pReferenceDoku); + return; + } + + if (pEntry->m_pCP == NULL) pEntry->init(); + + const sal_Char* pTmp = pEntry->m_pReferences->getReferenceDoku(index); + if ( pTmp ) + rtl_string2UString( pReferenceDoku, pTmp, rtl_str_getLength(pTmp), RTL_TEXTENCODING_UTF8, OUSTRING_TO_OSTRING_CVTFLAGS); +} + +static RTFieldAccess TYPEREG_CALLTYPE getReferenceAccess(TypeReaderImpl hEntry, sal_uInt16 index) +{ + TypeRegistryEntry* pEntry = (TypeRegistryEntry*) hEntry; + + if (pEntry == NULL) return RT_ACCESS_INVALID; + + if (pEntry->m_pCP == NULL) pEntry->init(); + + return pEntry->m_pReferences->getReferenceAccess(index); +} + + +extern "C" RegistryTypeReader_Api* TYPEREG_CALLTYPE initRegistryTypeReader_Api(void) +{ + static RegistryTypeReader_Api aApi= {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; + if (!aApi.acquire) + { + aApi.createEntry = &createEntry; + aApi.acquire = &acquire; + aApi.release = &release; + aApi.getMinorVersion = &getMinorVersion; + aApi.getMajorVersion = &getMajorVersion; + aApi.getTypeClass = &getTypeClass; + aApi.getTypeName = &getTypeName; + aApi.getSuperTypeName = &getSuperTypeName; + aApi.getUik = &getUik; + aApi.getDoku = &getDoku; + aApi.getFileName = &getFileName; + aApi.getFieldCount = &getFieldCount; + aApi.getFieldName = &getFieldName; + aApi.getFieldType = &getFieldType; + aApi.getFieldAccess = &getFieldAccess; + aApi.getFieldConstValue = &getFieldConstValue; + aApi.getFieldDoku = &getFieldDoku; + aApi.getFieldFileName = &getFieldFileName; + aApi.getMethodCount = &getMethodCount; + aApi.getMethodName = &getMethodName; + aApi.getMethodParamCount = &getMethodParamCount; + aApi.getMethodParamType = &getMethodParamType; + aApi.getMethodParamName = &getMethodParamName; + aApi.getMethodParamMode = &getMethodParamMode; + aApi.getMethodExcCount = &getMethodExcCount; + aApi.getMethodExcType = &getMethodExcType; + aApi.getMethodReturnType = &getMethodReturnType; + aApi.getMethodMode = &getMethodMode; + aApi.getMethodDoku = &getMethodDoku; + aApi.getReferenceCount = &getReferenceCount; + aApi.getReferenceName = &getReferenceName; + aApi.getReferenceType = &getReferenceType; + aApi.getReferenceDoku = &getReferenceDoku; + aApi.getReferenceAccess = &getReferenceAccess; + + return (&aApi); + } + else + { + return (&aApi); + } +} + + + diff --git a/registry/source/reflwrit.cxx b/registry/source/reflwrit.cxx new file mode 100644 index 000000000000..d8e1e2c74350 --- /dev/null +++ b/registry/source/reflwrit.cxx @@ -0,0 +1,1452 @@ +/************************************************************************* + * + * $RCSfile: reflwrit.cxx,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:18:42 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ +#include + +#include +#include + +#include "reflcnst.hxx" + +using namespace rtl; +using namespace vos; + +#ifdef MAC +#define strdup(str) strcpy((sal_Char*)malloc(strlen(str)+1),str) +#endif + +static sal_Char NULL_STRING[1] = { 0 }; +static sal_Unicode NULL_WSTRING[1] = { 0 }; + +#if defined ( GCC ) && ( defined ( SCO ) || defined ( NETBSD ) || defined ( OS2 ) ) +ORealDynamicLoader* ODynamicLoader::m_pLoader = NULL; +#endif + +#define BLOP_OFFSET_MAGIC 0 +#define BLOP_OFFSET_SIZE (BLOP_OFFSET_MAGIC + sizeof(sal_uInt32)) +#define BLOP_OFFSET_MINOR (BLOP_OFFSET_SIZE + sizeof(sal_uInt32)) +#define BLOP_OFFSET_MAJOR (BLOP_OFFSET_MINOR + sizeof(sal_uInt16)) +#define BLOP_OFFSET_TYPE_CLASS (BLOP_OFFSET_MAJOR + sizeof(sal_uInt16)) +#define BLOP_OFFSET_THIS (BLOP_OFFSET_TYPE_CLASS + sizeof(sal_uInt16)) +#define BLOP_OFFSET_SUPER (BLOP_OFFSET_THIS + sizeof(sal_uInt16)) +#define BLOP_OFFSET_UIK (BLOP_OFFSET_SUPER + sizeof(sal_uInt16)) +#define BLOP_OFFSET_DOKU (BLOP_OFFSET_UIK + sizeof(sal_uInt16)) +#define BLOP_OFFSET_FILENAME (BLOP_OFFSET_DOKU + sizeof(sal_uInt16)) +#define BLOP_HEADER_SIZE (BLOP_OFFSET_FILENAME + sizeof(sal_uInt16)) + + +#define BLOP_FIELD_ENTRY_ACCESS 0 +#define BLOP_FIELD_ENTRY_NAME (BLOP_FIELD_ENTRY_ACCESS + sizeof(sal_uInt16)) +#define BLOP_FIELD_ENTRY_TYPE (BLOP_FIELD_ENTRY_NAME + sizeof(sal_uInt16)) +#define BLOP_FIELD_ENTRY_VALUE (BLOP_FIELD_ENTRY_TYPE + sizeof(sal_uInt16)) +#define BLOP_FIELD_ENTRY_DOKU (BLOP_FIELD_ENTRY_VALUE + sizeof(sal_uInt16)) +#define BLOP_FIELD_ENTRY_FILENAME (BLOP_FIELD_ENTRY_DOKU + sizeof(sal_uInt16)) +#define BLOP_FIELD_ENTRY_SIZE (BLOP_FIELD_ENTRY_FILENAME + sizeof(sal_uInt16)) + +#define BLOP_METHOD_SIZE 0 +#define BLOP_METHOD_MODE (BLOP_METHOD_SIZE + sizeof(sal_uInt16)) +#define BLOP_METHOD_NAME (BLOP_METHOD_MODE + sizeof(sal_uInt16)) +#define BLOP_METHOD_RETURN (BLOP_METHOD_NAME + sizeof(sal_uInt16)) +#define BLOP_METHOD_DOKU (BLOP_METHOD_RETURN + sizeof(sal_uInt16)) +#define BLOP_METHOD_HEADER_SIZE (BLOP_METHOD_DOKU + sizeof(sal_uInt16)) + +#define BLOP_PARAM_TYPE 0 +#define BLOP_PARAM_MODE (BLOP_PARAM_TYPE + sizeof(sal_uInt16)) +#define BLOP_PARAM_NAME (BLOP_PARAM_MODE + sizeof(sal_uInt16)) +#define BLOP_PARAM_ENTRY_SIZE (BLOP_PARAM_NAME + sizeof(sal_uInt16)) + +#define BLOP_REFERENCE_TYPE 0 +#define BLOP_REFERENCE_NAME (BLOP_REFERENCE_TYPE + sizeof(sal_uInt16)) +#define BLOP_REFERENCE_DOKU (BLOP_REFERENCE_NAME + sizeof(sal_uInt16)) +#define BLOP_REFERENCE_ACCESS (BLOP_REFERENCE_DOKU + sizeof(sal_uInt16)) +#define BLOP_REFERENCE_ENTRY_SIZE (BLOP_REFERENCE_ACCESS + sizeof(sal_uInt16)) + +sal_uInt32 UINT16StringLen(const sal_uInt8* wstring) +{ + if (!wstring) return 0; + + const sal_uInt8* b = wstring; + + while (b[0] || b[1]) b += sizeof(sal_uInt16); + + return ((b - wstring) / sizeof(sal_uInt16)); +} + +sal_uInt32 writeString(sal_uInt8* buffer, const sal_Unicode* v) +{ + sal_uInt32 len = rtl_ustr_getLength(v) + 1; + sal_uInt32 i; + sal_uInt8* buff = buffer; + + for (i = 0; i < len; i++) + { + buff += writeUINT16(buff, (sal_uInt16) v[i]); + } + + return (buff - buffer); +} + +sal_uInt32 readString(const sal_uInt8* buffer, sal_Unicode* v, sal_uInt32 maxSize) +{ + sal_uInt32 len = VOS_MIN(UINT16StringLen(buffer) + 1, maxSize / 2); + sal_uInt32 i; + sal_uInt8* buff = (sal_uInt8*)buffer; + + for (i = 0; i < (len - 1); i++) + { + sal_uInt16 aChar; + + buff += readUINT16(buff, aChar); + + v[i] = (sal_Unicode) aChar; + } + + v[len - 1] = L'\0'; + + return (buff - ((sal_uInt8*)buffer)); +} + +sal_uInt32 writeFloat(sal_uInt8* buffer, float v) +{ + union + { + float v; + sal_uInt32 b; + } x; + + x.v = v; + +#ifdef REGTYPE_IEEE_NATIVE + writeUINT32(buffer, x.b); +#else +# error no IEEE +#endif + + return sizeof(sal_uInt32); +} + +sal_uInt32 readFloat(const sal_uInt8* buffer, float& v) +{ + union + { + float v; + sal_uInt32 b; + } x; + +#ifdef REGTYPE_IEEE_NATIVE + readUINT32(buffer, x.b); +#else +# error no IEEE +#endif + + v = x.v; + + return sizeof(sal_uInt32); +} + +sal_uInt32 writeDouble(sal_uInt8* buffer, double v) +{ + union + { + double v; + struct + { + sal_uInt32 b1; + sal_uInt32 b2; + } b; + } x; + + x.v = v; + +#ifdef REGTYPE_IEEE_NATIVE +# ifdef OSL_BIGENDIAN + writeUINT32(buffer, x.b.b1); + writeUINT32(buffer + sizeof(sal_uInt32), x.b.b2); +# else + writeUINT32(buffer, x.b.b2); + writeUINT32(buffer + sizeof(sal_uInt32), x.b.b1); +# endif +#else +# error no IEEE +#endif + + return (sizeof(sal_uInt32) + sizeof(sal_uInt32)); +} + +sal_uInt32 readDouble(const sal_uInt8* buffer, double& v) +{ + union + { + double v; + struct + { + sal_uInt32 b1; + sal_uInt32 b2; + } b; + } x; + +#ifdef REGTYPE_IEEE_NATIVE +# ifdef OSL_BIGENDIAN + readUINT32(buffer, x.b.b1); + readUINT32(buffer + sizeof(sal_uInt32), x.b.b2); +# else + readUINT32(buffer, x.b.b2); + readUINT32(buffer + sizeof(sal_uInt32), x.b.b1); +# endif +#else +# error no IEEE +#endif + + v = x.v; + + return (sizeof(sal_uInt32) + sizeof(sal_uInt32)); +} + +/************************************************************************** + + buffer write functions + +**************************************************************************/ + + +/************************************************************************** + + struct CPInfo + +**************************************************************************/ + +struct CPInfo +{ + CPInfoTag m_tag; + union + { + const sal_Char* aUtf8; + RTUik* aUik; + RTConstValueUnion aConst; +/* sal_Bool aBool; + sal_uInt8 aByte; + sal_Int16 aShort; + sal_uInt16 aUShort; + sal_Int32 aLong; + sal_uInt32 aULong; +// INT64 aHyper; +// UINT64 aUHyper; + float aFloat; + double aDouble; + const sal_Unicode* aString;*/ + } m_value; + + sal_uInt16 m_index; + struct CPInfo* m_next; + + CPInfo(CPInfoTag tag, struct CPInfo* prev); + + sal_uInt32 getBlopSize(); + + sal_uInt32 toBlop(sal_uInt8* buffer, sal_uInt32 maxLen); +}; + +CPInfo::CPInfo(CPInfoTag tag, struct CPInfo* prev) + : m_tag(tag) + , m_index(0) + , m_next(NULL) +{ + if (prev) + { + m_index = prev->m_index + 1; + prev->m_next = this; + } +} + +sal_uInt32 CPInfo::getBlopSize() +{ + sal_uInt32 size = sizeof(sal_uInt16) /* size */ + sizeof(sal_uInt16) /* tag */; + + switch (m_tag) + { + case CP_TAG_CONST_BOOL: + size += sizeof(sal_uInt8); + break; + case CP_TAG_CONST_BYTE: + size += sizeof(sal_uInt8); + break; + case CP_TAG_CONST_INT16: + size += sizeof(sal_Int16); + break; + case CP_TAG_CONST_UINT16: + size += sizeof(sal_uInt16); + break; + case CP_TAG_CONST_INT32: + size += sizeof(sal_Int32); + break; + case CP_TAG_CONST_UINT32: + size += sizeof(sal_uInt32); + break; + case CP_TAG_CONST_INT64: +// size += sizeof(sal_Int64); + break; + case CP_TAG_CONST_UINT64: +// size += sizeof(sal_uInt64); + break; + case CP_TAG_CONST_FLOAT: + size += sizeof(sal_uInt32); + break; + case CP_TAG_CONST_DOUBLE: + size += sizeof(sal_uInt32) + sizeof(sal_uInt32); + break; + case CP_TAG_CONST_STRING: + size += (rtl_ustr_getLength(m_value.aConst.aString) + 1) * sizeof(sal_uInt16); + break; + case CP_TAG_UTF8_NAME: + size += strlen(m_value.aUtf8) + 1; + break; + case CP_TAG_UIK: + size += sizeof(sal_uInt32) + sizeof(sal_uInt16) + sizeof(sal_uInt16) + sizeof(sal_uInt32) + sizeof(sal_uInt32); + break; + default: + break; + } + + return size; +} + + +sal_uInt32 CPInfo::toBlop(sal_uInt8* buffer, sal_uInt32 maxLen) +{ + sal_uInt8* buff = buffer; + + buff += writeUINT16(buff, (sal_uInt16) getBlopSize()); + buff += writeUINT16(buff, (sal_uInt16) m_tag); + + switch (m_tag) + { + case CP_TAG_CONST_BOOL: + buff += writeBYTE(buff, (sal_uInt8) m_value.aConst.aBool); + break; + case CP_TAG_CONST_BYTE: + buff += writeBYTE(buff, m_value.aConst.aByte); + break; + case CP_TAG_CONST_INT16: + buff += writeINT16(buff, m_value.aConst.aShort); + break; + case CP_TAG_CONST_UINT16: + buff += writeINT16(buff, m_value.aConst.aUShort); + break; + case CP_TAG_CONST_INT32: + buff += writeINT32(buff, m_value.aConst.aLong); + break; + case CP_TAG_CONST_UINT32: + buff += writeUINT32(buff, m_value.aConst.aULong); + break; + case CP_TAG_CONST_INT64: +// buff += writeUINT64(buff, m_value.aConst.aHyper); + break; + case CP_TAG_CONST_UINT64: +// buff += writeUINT64(buff, m_value.aConst.aUHyper); + break; + case CP_TAG_CONST_FLOAT: + buff += writeFloat(buff, m_value.aConst.aFloat); + break; + case CP_TAG_CONST_DOUBLE: + buff += writeDouble(buff, m_value.aConst.aDouble); + break; + case CP_TAG_CONST_STRING: + buff += writeString(buff, m_value.aConst.aString); + break; + case CP_TAG_UTF8_NAME: + buff += writeUtf8(buff, m_value.aUtf8); + break; + case CP_TAG_UIK: + buff += writeUINT32(buff, m_value.aUik->m_Data1); + buff += writeUINT16(buff, m_value.aUik->m_Data2); + buff += writeUINT16(buff, m_value.aUik->m_Data3); + buff += writeUINT32(buff, m_value.aUik->m_Data4); + buff += writeUINT32(buff, m_value.aUik->m_Data5); + break; + default: + break; + } + + return (buff - buffer); +} + + +/************************************************************************** + + class FieldEntry + +**************************************************************************/ + +class FieldEntry +{ + +public: + + OString m_name; + OString m_typeName; + OString m_doku; + OString m_fileName; + RTFieldAccess m_access; + RTValueType m_constValueType; + RTConstValueUnion m_constValue; + + FieldEntry(); + ~FieldEntry(); + + void setData(const OString& name, + const OString& typeName, + const OString& doku, + const OString& fileName, + RTFieldAccess access, + RTValueType constValueType, + RTConstValueUnion constValue); +}; + +FieldEntry::FieldEntry() + : m_access(RT_ACCESS_INVALID) + , m_constValueType(RT_TYPE_NONE) +{ +} + +FieldEntry::~FieldEntry() +{ + if ( + (m_constValueType == RT_TYPE_STRING) && + m_constValue.aString && + (m_constValue.aString != NULL_WSTRING) + ) + { + delete[] (sal_Unicode*)m_constValue.aString; + } +} + +void FieldEntry::setData(const OString& name, + const OString& typeName, + const OString& doku, + const OString& fileName, + RTFieldAccess access, + RTValueType constValueType, + RTConstValueUnion constValue) +{ + m_name = name; + m_typeName = typeName; + m_doku = doku; + m_fileName = fileName; + + if ( + (m_constValueType == RT_TYPE_STRING) && + m_constValue.aString && + (m_constValue.aString != NULL_WSTRING) + ) + { + delete[] (sal_Unicode*)m_constValue.aString; + } + + m_access = access; + m_constValueType = constValueType; + + if (m_constValueType == RT_TYPE_STRING) + { + if (constValue.aString == NULL) + m_constValue.aString = NULL_WSTRING; + else + { + sal_uInt32 len = rtl_ustr_getLength(constValue.aString); + + m_constValue.aString = new sal_Unicode[len + 1]; + rtl_copyMemory( (sal_Unicode*)m_constValue.aString, constValue.aString, (len+1) * sizeof(sal_Unicode) ); + } + } + else + { + m_constValue = constValue; + } +} + +/************************************************************************** + + class ParamEntry + +**************************************************************************/ + +class ParamEntry +{ +public: + + OString m_typeName; + OString m_name; + RTParamMode m_mode; + + ParamEntry(); + ~ParamEntry(); + + void setData(const OString& typeName, + const OString& name, + RTParamMode mode); +}; + +ParamEntry::ParamEntry() + : m_mode(RT_PARAM_INVALID) +{ +} + +ParamEntry::~ParamEntry() +{ +} + +void ParamEntry::setData(const OString& typeName, + const OString& name, + RTParamMode mode) +{ + m_name = name; + m_typeName = typeName; + m_mode = mode; +} + +/************************************************************************** + + class ReferenceEntry + +**************************************************************************/ + +class ReferenceEntry +{ +public: + + OString m_name; + OString m_doku; + RTReferenceType m_type; + RTFieldAccess m_access; + + ReferenceEntry(); + ~ReferenceEntry(); + + void setData(const OString& name, + RTReferenceType refType, + const OString& doku, + RTFieldAccess access); +}; + +ReferenceEntry::ReferenceEntry() + : m_type(RT_REF_INVALID) + , m_access(RT_ACCESS_INVALID) +{ +} + +ReferenceEntry::~ReferenceEntry() +{ +} + +void ReferenceEntry::setData(const OString& name, + RTReferenceType refType, + const OString& doku, + RTFieldAccess access) +{ + m_name = name; + m_doku = doku; + m_type = refType; + m_access = access; +} + +/************************************************************************** + + class MethodEntry + +**************************************************************************/ + +class MethodEntry +{ +public: + + OString m_name; + OString m_returnTypeName; + RTMethodMode m_mode; + sal_uInt16 m_paramCount; + ParamEntry* m_params; + sal_uInt16 m_excCount; + OString* m_excNames; + OString m_doku; + + MethodEntry(); + ~MethodEntry(); + + void setData(const OString& name, + const OString& returnTypeName, + RTMethodMode mode, + sal_uInt16 paramCount, + sal_uInt16 excCount, + const OString& doku); + + void setExcName(sal_uInt16 excIndex, const OString& name); + +protected: + + void reallocParams(sal_uInt16 size); + void reallocExcs(sal_uInt16 size); +}; + +MethodEntry::MethodEntry() + : m_mode(RT_MODE_INVALID) + , m_paramCount(0) + , m_params(NULL) + , m_excCount(0) + , m_excNames(NULL) +{ +} + +MethodEntry::~MethodEntry() +{ + if (m_params) + delete[] m_params; + + if (m_excNames) + delete[] m_excNames; +} + +void MethodEntry::setData(const OString& name, + const OString& returnTypeName, + RTMethodMode mode, + sal_uInt16 paramCount, + sal_uInt16 excCount, + const OString& doku) +{ + m_name = name; + m_returnTypeName = returnTypeName; + m_doku = doku; + + m_mode = mode; + + reallocParams(paramCount); + reallocExcs(excCount); +} + +void MethodEntry::setExcName(sal_uInt16 excIndex, const OString& name) +{ + if (excIndex < m_excCount) + { + m_excNames[excIndex] = name; + } +} + +void MethodEntry::reallocParams(sal_uInt16 size) +{ + ParamEntry* newParams; + + if (size) + newParams = new ParamEntry[size]; + else + newParams = NULL; + + if (m_paramCount) + { + sal_uInt16 i; + + for (i = 0; i < VOS_MIN(size, m_paramCount); i++) + { + newParams[i].setData(m_params[i].m_typeName, m_params[i].m_name, m_params[i].m_mode); + } + + delete[] m_params; + } + + m_paramCount = size; + m_params = newParams; +} + +void MethodEntry::reallocExcs(sal_uInt16 size) +{ + OString* newExcNames; + + if (size) + newExcNames = new OString[size]; + else + newExcNames = NULL; + + sal_uInt16 i; + + for (i = 0; i < VOS_MIN(size, m_excCount); i++) + { + newExcNames[i] = m_excNames[i]; + } + + delete[] m_excNames; + + m_excCount = size; + m_excNames = newExcNames; +} + + +/************************************************************************** + + class TypeRegistryEntry + +**************************************************************************/ + +class TypeWriter +{ + +public: + + sal_uInt32 m_refCount; + RTTypeClass m_typeClass; + OString m_typeName; + OString m_superTypeName; + RTUik* m_pUik; + OString m_doku; + OString m_fileName; + sal_uInt16 m_fieldCount; + FieldEntry* m_fields; + sal_uInt16 m_methodCount; + MethodEntry* m_methods; + sal_uInt16 m_referenceCount; + ReferenceEntry* m_references; + + sal_uInt8* m_blop; + sal_uInt32 m_blopSize; + + TypeWriter(RTTypeClass RTTypeClass, + const OString& typeName, + const OString& superTypeName, + sal_uInt16 FieldCount, + sal_uInt16 methodCount, + sal_uInt16 referenceCount); + + ~TypeWriter(); + + void createBlop(); +}; + +TypeWriter::TypeWriter(RTTypeClass RTTypeClass, + const OString& typeName, + const OString& superTypeName, + sal_uInt16 fieldCount, + sal_uInt16 methodCount, + sal_uInt16 referenceCount) + : m_refCount(1) + , m_typeClass(RTTypeClass) + , m_typeName(typeName) + , m_superTypeName(superTypeName) + , m_fieldCount(fieldCount) + , m_methodCount(methodCount) + , m_referenceCount(referenceCount) + , m_blop(NULL) + , m_blopSize(0) + , m_pUik(NULL) +{ + if (m_fieldCount) + m_fields = new FieldEntry[fieldCount]; + + if (m_methodCount) + m_methods = new MethodEntry[methodCount]; + + if (m_referenceCount) + m_references = new ReferenceEntry[referenceCount]; +} + +TypeWriter::~TypeWriter() +{ + if (m_blop) + delete[] m_blop; + + if (m_fieldCount) + delete[] m_fields; + + if (m_methodCount) + delete[] m_methods; + + if (m_referenceCount) + delete[] m_references; + + if (m_pUik) + delete m_pUik; +} + +void TypeWriter::createBlop() +{ + sal_uInt8* pBlopFields = NULL; + sal_uInt8* pBlopMethods = NULL; + sal_uInt8* pBlopReferences = NULL; + sal_uInt8* pBuffer = NULL; + sal_uInt32 blopFieldsSize = 0; + sal_uInt32 blopMethodsSize = 0; + sal_uInt32 blopReferenceSize = 0; + sal_uInt16 i; + + if (m_blop) + delete[] m_blop; + + CPInfo root(CP_TAG_INVALID, NULL); + sal_uInt16 cpIndexThisName = 0; + sal_uInt16 cpIndexSuperName = 0; + sal_uInt16 cpIndexUik = 0; + sal_uInt16 cpIndexDoku = 0; + sal_uInt16 cpIndexFileName = 0; + CPInfo* pInfo = NULL; + + m_blopSize = BLOP_HEADER_SIZE; + + // create CP entry for this name + pInfo = new CPInfo(CP_TAG_UTF8_NAME, &root); + pInfo->m_value.aUtf8 = m_typeName.getStr(); + cpIndexThisName = pInfo->m_index; + + // create CP entry for super name + if (m_superTypeName.getLength()) + { + pInfo = new CPInfo(CP_TAG_UTF8_NAME, pInfo); + pInfo->m_value.aUtf8 = m_superTypeName.getStr(); + cpIndexSuperName = pInfo->m_index; + } + + // create CP entry for uik + if (m_pUik != NULL) + { + pInfo = new CPInfo(CP_TAG_UIK, pInfo); + pInfo->m_value.aUik = m_pUik; + cpIndexUik = pInfo->m_index; + } + + // create CP entry for doku + if (m_doku.getLength()) + { + pInfo = new CPInfo(CP_TAG_UTF8_NAME, pInfo); + pInfo->m_value.aUtf8 = m_doku.getStr(); + cpIndexDoku = pInfo->m_index; + } + + // create CP entry for idl source filename + if (m_fileName.getLength()) + { + pInfo = new CPInfo(CP_TAG_UTF8_NAME, pInfo); + pInfo->m_value.aUtf8 = m_fileName.getStr(); + cpIndexFileName = pInfo->m_index; + } + + // fields blop + + m_blopSize += sizeof(sal_uInt16); // fieldCount + + if (m_fieldCount) + { + sal_uInt16 cpIndexName = 0; + sal_uInt16 cpIndexTypeName = 0; + sal_uInt16 cpIndexValue = 0; + sal_uInt16 cpIndexDoku = 0; + sal_uInt16 cpIndexFileName = 0; + + blopFieldsSize = m_fieldCount * BLOP_FIELD_ENTRY_SIZE; + + m_blopSize += blopFieldsSize; + + pBlopFields = new sal_uInt8[blopFieldsSize]; + pBuffer = pBlopFields; + + for (i = 0; i < m_fieldCount; i++) + { + cpIndexName = 0; + cpIndexTypeName = 0; + cpIndexValue = 0; + cpIndexDoku = 0; + cpIndexFileName = 0; + + pBuffer += writeUINT16(pBuffer, m_fields[i].m_access); + + if (m_fields[i].m_name.getLength()) + { + pInfo = new CPInfo(CP_TAG_UTF8_NAME, pInfo); + pInfo->m_value.aUtf8 = m_fields[i].m_name.getStr(); + cpIndexName = pInfo->m_index; + } + pBuffer += writeUINT16(pBuffer, cpIndexName); + + if (m_fields[i].m_typeName.getLength()) + { + pInfo = new CPInfo(CP_TAG_UTF8_NAME, pInfo); + pInfo->m_value.aUtf8 = m_fields[i].m_typeName.getStr(); + cpIndexTypeName = pInfo->m_index; + } + pBuffer += writeUINT16(pBuffer, cpIndexTypeName); + + if (m_fields[i].m_constValueType != RT_TYPE_NONE) + { + pInfo = new CPInfo((CPInfoTag)m_fields[i].m_constValueType, pInfo); + pInfo->m_value.aConst = m_fields[i].m_constValue; + cpIndexValue = pInfo->m_index; + } + pBuffer += writeUINT16(pBuffer, cpIndexValue); + + if (m_fields[i].m_doku.getLength()) + { + pInfo = new CPInfo(CP_TAG_UTF8_NAME, pInfo); + pInfo->m_value.aUtf8 = m_fields[i].m_doku.getStr(); + cpIndexDoku = pInfo->m_index; + } + pBuffer += writeUINT16(pBuffer, cpIndexDoku); + + if (m_fields[i].m_fileName.getLength()) + { + pInfo = new CPInfo(CP_TAG_UTF8_NAME, pInfo); + pInfo->m_value.aUtf8 = m_fields[i].m_fileName.getStr(); + cpIndexFileName = pInfo->m_index; + } + pBuffer += writeUINT16(pBuffer, cpIndexFileName); + } + } + + // methods blop + + m_blopSize += sizeof(sal_uInt16); // methodCount + + if (m_methodCount) + { + sal_uInt16* pMethodEntrySize = new sal_uInt16[m_methodCount]; + sal_uInt16 cpIndexName = 0; + sal_uInt16 cpIndexReturn = 0; + sal_uInt16 cpIndexDoku = 0; + + blopMethodsSize = 0; + + for (i = 0; i < m_methodCount; i++) + { + pMethodEntrySize[i] = + BLOP_METHOD_HEADER_SIZE + // header + sizeof(sal_uInt16) + // parameterCount + (m_methods[i].m_paramCount * BLOP_PARAM_ENTRY_SIZE) + // exceptions + sizeof(sal_uInt16) + // exceptionCount + (m_methods[i].m_excCount * sizeof(sal_uInt16)); // exceptions + + blopMethodsSize += pMethodEntrySize[i]; + } + + pBlopMethods = new sal_uInt8[blopMethodsSize]; + + m_blopSize += blopMethodsSize; + + pBuffer = pBlopMethods; + + for (i = 0; i < m_methodCount; i++) + { + cpIndexReturn = 0; + cpIndexDoku = 0; + + pBuffer += writeUINT16(pBuffer, pMethodEntrySize[i]); + pBuffer += writeUINT16(pBuffer, m_methods[i].m_mode); + + if (m_methods[i].m_name.getLength()) + { + pInfo = new CPInfo(CP_TAG_UTF8_NAME, pInfo); + pInfo->m_value.aUtf8 = m_methods[i].m_name.getStr(); + cpIndexName = pInfo->m_index; + } + pBuffer += writeUINT16(pBuffer, cpIndexName); + cpIndexName = 0; + + if (m_methods[i].m_returnTypeName.getLength()) + { + pInfo = new CPInfo(CP_TAG_UTF8_NAME, pInfo); + pInfo->m_value.aUtf8 = m_methods[i].m_returnTypeName.getStr(); + cpIndexReturn = pInfo->m_index; + } + pBuffer += writeUINT16(pBuffer, cpIndexReturn); + + if (m_methods[i].m_doku.getLength()) + { + pInfo = new CPInfo(CP_TAG_UTF8_NAME, pInfo); + pInfo->m_value.aUtf8 = m_methods[i].m_doku.getStr(); + cpIndexDoku = pInfo->m_index; + } + pBuffer += writeUINT16(pBuffer, cpIndexDoku); + + sal_uInt16 j; + + pBuffer += writeUINT16(pBuffer, m_methods[i].m_paramCount); + + for (j = 0; j < m_methods[i].m_paramCount; j++) + { + if (m_methods[i].m_params[j].m_typeName.getLength()) + { + pInfo = new CPInfo(CP_TAG_UTF8_NAME, pInfo); + pInfo->m_value.aUtf8 = m_methods[i].m_params[j].m_typeName.getStr(); + cpIndexName = pInfo->m_index; + } + pBuffer += writeUINT16(pBuffer, cpIndexName); + cpIndexName = 0; + + pBuffer += writeUINT16(pBuffer, m_methods[i].m_params[j].m_mode); + + if (m_methods[i].m_params[j].m_name.getLength()) + { + pInfo = new CPInfo(CP_TAG_UTF8_NAME, pInfo); + pInfo->m_value.aUtf8 = m_methods[i].m_params[j].m_name.getStr(); + cpIndexName = pInfo->m_index; + } + pBuffer += writeUINT16(pBuffer, cpIndexName); + cpIndexName = 0; + } + + pBuffer += writeUINT16(pBuffer, m_methods[i].m_excCount); + + for (j = 0; j < m_methods[i].m_excCount; j++) + { + if (m_methods[i].m_excNames[j].getLength()) + { + pInfo = new CPInfo(CP_TAG_UTF8_NAME, pInfo); + pInfo->m_value.aUtf8 = m_methods[i].m_excNames[j].getStr(); + cpIndexName = pInfo->m_index; + } + pBuffer += writeUINT16(pBuffer, cpIndexName); + cpIndexName = 0; + } + } + + delete[] pMethodEntrySize; + } + + // reference blop + + m_blopSize += sizeof(sal_uInt16); // referenceCount + + if (m_referenceCount) + { + sal_uInt16 cpIndexName = 0; + sal_uInt16 cpIndexDoku = 0; + + blopReferenceSize = m_referenceCount * BLOP_REFERENCE_ENTRY_SIZE; + + m_blopSize += blopReferenceSize; + + pBlopReferences = new sal_uInt8[blopReferenceSize]; + pBuffer = pBlopReferences; + + for (i = 0; i < m_referenceCount; i++) + { + pBuffer += writeUINT16(pBuffer, m_references[i].m_type); + + cpIndexName = 0; + cpIndexDoku = 0; + + if (m_references[i].m_name.getLength()) + { + pInfo = new CPInfo(CP_TAG_UTF8_NAME, pInfo); + pInfo->m_value.aUtf8 = m_references[i].m_name.getStr(); + cpIndexName = pInfo->m_index; + } + pBuffer += writeUINT16(pBuffer, cpIndexName); + + if (m_references[i].m_doku.getLength()) + { + pInfo = new CPInfo(CP_TAG_UTF8_NAME, pInfo); + pInfo->m_value.aUtf8 = m_references[i].m_doku.getStr(); + cpIndexDoku = pInfo->m_index; + } + pBuffer += writeUINT16(pBuffer, cpIndexDoku); + + pBuffer += writeUINT16(pBuffer, m_references[i].m_access); + } + } + + + // CP infos blop-laenge holen + pInfo = root.m_next; + sal_uInt32 cpBlopSize = 0; + sal_uInt16 cpCount = 0; + + while (pInfo) + { + cpBlopSize += pInfo->getBlopSize(); + cpCount++; + pInfo = pInfo->m_next; + } + + m_blopSize += cpBlopSize; + m_blopSize += sizeof(sal_uInt16); // constantPoolCount + + // write all in flat buffer + + m_blop = new sal_uInt8[m_blopSize]; + + pBuffer = m_blop; + + pBuffer += writeUINT32(pBuffer, magic); + pBuffer += writeUINT32(pBuffer, m_blopSize); + pBuffer += writeUINT16(pBuffer, minorVersion); + pBuffer += writeUINT16(pBuffer, majorVersion); + pBuffer += writeUINT16(pBuffer, (sal_uInt16)m_typeClass); + pBuffer += writeUINT16(pBuffer, cpIndexThisName); + pBuffer += writeUINT16(pBuffer, cpIndexSuperName); + pBuffer += writeUINT16(pBuffer, cpIndexUik); + pBuffer += writeUINT16(pBuffer, cpIndexDoku); + pBuffer += writeUINT16(pBuffer, cpIndexFileName); + pBuffer += writeUINT16(pBuffer, cpCount); + + // write and delete CP infos + pInfo = root.m_next; + + while (pInfo) + { + CPInfo* pNextInfo = pInfo->m_next; + + pBuffer += pInfo->toBlop(pBuffer, m_blopSize - (pBuffer - m_blop)); + delete pInfo; + + pInfo = pNextInfo; + } + + // write fields + pBuffer += writeUINT16(pBuffer, m_fieldCount); + if (blopFieldsSize) + { + memcpy(pBuffer, pBlopFields, blopFieldsSize); + pBuffer += blopFieldsSize; + } + + // write methods + pBuffer += writeUINT16(pBuffer, m_methodCount); + if (blopMethodsSize) + { + memcpy(pBuffer, pBlopMethods, blopMethodsSize); + pBuffer += blopMethodsSize; + } + + // write references + pBuffer += writeUINT16(pBuffer, m_referenceCount); + if (blopReferenceSize) + { + memcpy(pBuffer, pBlopReferences, blopReferenceSize); + pBuffer += blopReferenceSize; + } + + delete[] pBlopFields; + delete[] pBlopMethods; + delete[] pBlopReferences; +} + + +/************************************************************************** + + C-API + +**************************************************************************/ + +static TypeWriterImpl TYPEREG_CALLTYPE createEntry(RTTypeClass RTTypeClass, + rtl_uString* typeName, + rtl_uString* superTypeName, + sal_uInt16 FieldCount, + sal_uInt16 methodCount, + sal_uInt16 referenceCount) +{ + OString rTypeName, rSuperTypeName; + + rtl_uString2String( &rTypeName.pData, typeName->buffer, typeName->length, RTL_TEXTENCODING_UTF8, OUSTRING_TO_OSTRING_CVTFLAGS); + rtl_uString2String( &rSuperTypeName.pData, superTypeName->buffer, superTypeName->length, RTL_TEXTENCODING_UTF8, OUSTRING_TO_OSTRING_CVTFLAGS); + + return new TypeWriter(RTTypeClass, + rTypeName, + rSuperTypeName, + FieldCount, + methodCount, + referenceCount); +} + +static void TYPEREG_CALLTYPE acquire(TypeWriterImpl hEntry) +{ + TypeWriter* pEntry = (TypeWriter*) hEntry; + + if (pEntry != NULL) + pEntry->m_refCount++; +} + +static void TYPEREG_CALLTYPE release(TypeWriterImpl hEntry) +{ + TypeWriter* pEntry = (TypeWriter*) hEntry; + + if (pEntry != NULL) + { + if (--pEntry->m_refCount == 0) + delete pEntry; + } +} + +static void TYPEREG_CALLTYPE setUik(TypeWriterImpl hEntry, const RTUik* uik) +{ + TypeWriter* pEntry = (TypeWriter*) hEntry; + + if (pEntry != NULL) + { + if (pEntry->m_pUik) + { + pEntry->m_pUik->m_Data1 = uik->m_Data1; + pEntry->m_pUik->m_Data2 = uik->m_Data2; + pEntry->m_pUik->m_Data3 = uik->m_Data3; + pEntry->m_pUik->m_Data4 = uik->m_Data4; + pEntry->m_pUik->m_Data5 = uik->m_Data5; + } + else + pEntry->m_pUik = new RTUik(*uik); + } +} + +static void TYPEREG_CALLTYPE setDoku(TypeWriterImpl hEntry, rtl_uString* doku) +{ + TypeWriter* pEntry = (TypeWriter*) hEntry; + + if (pEntry != NULL) + { + if (doku) + { + OString rDoku; + rtl_uString2String( &rDoku.pData, doku->buffer, doku->length, RTL_TEXTENCODING_UTF8, OUSTRING_TO_OSTRING_CVTFLAGS); + pEntry->m_doku = rDoku; + } else + { + pEntry->m_doku = NULL_STRING; + } + } +} + +static void TYPEREG_CALLTYPE setFileName(TypeWriterImpl hEntry, rtl_uString* fileName) +{ + TypeWriter* pEntry = (TypeWriter*) hEntry; + + if (pEntry != NULL) + { + if (fileName) + { + OString rFileName; + rtl_uString2String( &rFileName.pData, fileName->buffer, fileName->length, RTL_TEXTENCODING_UTF8, OUSTRING_TO_OSTRING_CVTFLAGS); + pEntry->m_fileName = rFileName; + } else + { + pEntry->m_fileName = NULL_STRING; + } + } +} + +static void TYPEREG_CALLTYPE setFieldData(TypeWriterImpl hEntry, + sal_uInt16 index, + rtl_uString* name, + rtl_uString* typeName, + rtl_uString* doku, + rtl_uString* fileName, + RTFieldAccess access, + RTValueType valueType, + RTConstValueUnion constValue) +{ + TypeWriter* pEntry = (TypeWriter*) hEntry; + + if ((pEntry != NULL) && (index < pEntry->m_fieldCount)) + { + OString rName, rTypeName, rDoku, rFileName; + rtl_uString2String( &rName.pData, name->buffer, name->length, RTL_TEXTENCODING_UTF8, OUSTRING_TO_OSTRING_CVTFLAGS); + rtl_uString2String( &rTypeName.pData, typeName->buffer, typeName->length, RTL_TEXTENCODING_UTF8, OUSTRING_TO_OSTRING_CVTFLAGS); + rtl_uString2String( &rDoku.pData, doku->buffer, doku->length, RTL_TEXTENCODING_UTF8, OUSTRING_TO_OSTRING_CVTFLAGS); + rtl_uString2String( &rFileName.pData, fileName->buffer, fileName->length, RTL_TEXTENCODING_UTF8, OUSTRING_TO_OSTRING_CVTFLAGS); + + pEntry->m_fields[index].setData(rName, rTypeName, rDoku, rFileName, access, valueType, constValue); + } +} + +static void TYPEREG_CALLTYPE setMethodData(TypeWriterImpl hEntry, + sal_uInt16 index, + rtl_uString* name, + rtl_uString* returnTypeName, + RTMethodMode mode, + sal_uInt16 paramCount, + sal_uInt16 excCount, + rtl_uString* doku) +{ + TypeWriter* pEntry = (TypeWriter*) hEntry; + + if ((pEntry != NULL) && (index < pEntry->m_methodCount)) + { + OString rName, rReturnTypeName, rDoku; + rtl_uString2String( &rName.pData, name->buffer, name->length, RTL_TEXTENCODING_UTF8, OUSTRING_TO_OSTRING_CVTFLAGS); + rtl_uString2String( &rReturnTypeName.pData, returnTypeName->buffer, returnTypeName->length, RTL_TEXTENCODING_UTF8, OUSTRING_TO_OSTRING_CVTFLAGS); + rtl_uString2String( &rDoku.pData, doku->buffer, doku->length, RTL_TEXTENCODING_UTF8, OUSTRING_TO_OSTRING_CVTFLAGS); + + pEntry->m_methods[index].setData(rName, rReturnTypeName, mode, paramCount, excCount, rDoku); + } +} + +static void TYPEREG_CALLTYPE setParamData(TypeWriterImpl hEntry, + sal_uInt16 index, + sal_uInt16 paramIndex, + rtl_uString* type, + rtl_uString* name, + RTParamMode mode) +{ + TypeWriter* pEntry = (TypeWriter*) hEntry; + + if ((pEntry != NULL) && + (index < pEntry->m_methodCount) && + (paramIndex < pEntry->m_methods[index].m_paramCount)) + { + OString rName, rType; + rtl_uString2String( &rName.pData, name->buffer, name->length, RTL_TEXTENCODING_UTF8, OUSTRING_TO_OSTRING_CVTFLAGS); + rtl_uString2String( &rType.pData, type->buffer, type->length, RTL_TEXTENCODING_UTF8, OUSTRING_TO_OSTRING_CVTFLAGS); + + pEntry->m_methods[index].m_params[paramIndex].setData(rType, rName, mode); + } +} + +static void TYPEREG_CALLTYPE setExcData(TypeWriterImpl hEntry, + sal_uInt16 index, + sal_uInt16 excIndex, + rtl_uString* type) +{ + TypeWriter* pEntry = (TypeWriter*) hEntry; + + if ((pEntry != NULL) && (index < pEntry->m_methodCount)) + { + OString rType; + rtl_uString2String( &rType.pData, type->buffer, type->length, RTL_TEXTENCODING_UTF8, OUSTRING_TO_OSTRING_CVTFLAGS); + + pEntry->m_methods[index].setExcName(excIndex, rType); + } +} + +static const sal_uInt8* TYPEREG_CALLTYPE getBlop(TypeWriterImpl hEntry) +{ + const sal_uInt8* blop = NULL; + + TypeWriter* pEntry = (TypeWriter*) hEntry; + + if (pEntry != NULL) + { + if (!pEntry->m_blop) + pEntry->createBlop(); + + blop = pEntry->m_blop; + } + + return blop; +} + +static sal_uInt32 TYPEREG_CALLTYPE getBlopSize(TypeWriterImpl hEntry) +{ + sal_uInt32 aSize = 0; + + TypeWriter* pEntry = (TypeWriter*) hEntry; + + if (pEntry != NULL) + { + if (!pEntry->m_blop) + pEntry->createBlop(); + + aSize = pEntry->m_blopSize; + } + + return aSize; +} + +static void TYPEREG_CALLTYPE setReferenceData(TypeWriterImpl hEntry, + sal_uInt16 index, + rtl_uString* name, + RTReferenceType refType, + rtl_uString* doku, + RTFieldAccess access) +{ + TypeWriter* pEntry = (TypeWriter*) hEntry; + + if ((pEntry != NULL) && (index < pEntry->m_referenceCount)) + { + OString rName, rDoku; + rtl_uString2String( &rName.pData, name->buffer, name->length, RTL_TEXTENCODING_UTF8, OUSTRING_TO_OSTRING_CVTFLAGS); + rtl_uString2String( &rDoku.pData, doku->buffer, doku->length, RTL_TEXTENCODING_UTF8, OUSTRING_TO_OSTRING_CVTFLAGS); + + pEntry->m_references[index].setData(rName, + refType, + rDoku, + access); + } +} + + +extern "C" RegistryTypeWriter_Api* TYPEREG_CALLTYPE initRegistryTypeWriter_Api(void) +{ + static RegistryTypeWriter_Api aApi= {0,0,0,0,0,0,0,0,0,0,0,0,0}; + if (!aApi.acquire) + { + aApi.createEntry = &createEntry; + aApi.acquire = &acquire; + aApi.release = &release; + aApi.setUik = &setUik; + aApi.setDoku = &setDoku; + aApi.setFileName = &setFileName; + aApi.setFieldData = &setFieldData; + aApi.setMethodData = &setMethodData; + aApi.setParamData = &setParamData; + aApi.setExcData = &setExcData; + aApi.getBlop = &getBlop; + aApi.getBlopSize = &getBlopSize; + aApi.setReferenceData = &setReferenceData; + + return (&aApi); + } + else + { + return (&aApi); + } +} + + + + + diff --git a/registry/source/regimpl.cxx b/registry/source/regimpl.cxx new file mode 100644 index 000000000000..af8c3809c51a --- /dev/null +++ b/registry/source/regimpl.cxx @@ -0,0 +1,2172 @@ +/************************************************************************* + * + * $RCSfile: regimpl.cxx,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:18:42 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +#include +#include +#ifdef MAC +#include +#define strdup(str) strcpy((sal_Char*)malloc(strlen(str)+1),str) +#endif +#ifdef UNX +#include +#endif + +#include "regimpl.hxx" + +#ifndef __REGISTRY_REFLREAD_HXX__ +#include +#endif + +#ifndef __REGISTRY_REFLWRIT_HXX__ +#include +#endif + +#ifndef __REFLCNST_HXX__ +#include "reflcnst.hxx" +#endif + +#ifndef _KEYIMPL_HXX_ +#include "keyimpl.hxx" +#endif + +#ifndef _RTL_ALLOC_H_ +#include +#endif + +#ifndef _RTL_MEMORY_H_ +#include +#endif + +#ifndef _RTL_USTRING_HXX_ +#include +#endif +#ifndef _RTL_USTRBUF_HXX_ +#include +#endif + +#if defined ( GCC ) && ( defined ( SCO ) || defined ( NETBSD ) || defined ( OS2 ) ) +NAMESPACE_VOS(ORealDynamicLoader)* NAMESPACE_VOS(ODynamicLoader)::m_pLoader = NULL; +#endif + + +extern "C" RegistryTypeReader_Api* TYPEREG_CALLTYPE initRegistryTypeReader_Api(); +extern "C" RegistryTypeWriter_Api* TYPEREG_CALLTYPE initRegistryTypeWriter_Api(); + + +//********************************************************************* +// dumpType() +// +static sal_Bool dumpType(RegistryTypeReader& reader, const OString& sIndent) +{ + sal_uInt16 i, j; + sal_Bool ret = sal_True; + const sal_Char* indent = sIndent; + + if (reader.isValid()) + { + fprintf(stdout, "minor version: %d\n", reader.getMinorVersion()); + fprintf(stdout, "%smajor version: %d\n", indent, reader.getMajorVersion()); + fprintf(stdout, "%s" ,indent); + switch (reader.getTypeClass()) + { + case RT_TYPE_INVALID: + fprintf(stdout, "type: 'invalid'\n"); + break; + case RT_TYPE_INTERFACE: + { + fprintf(stdout, "type: 'interface'\n"); + RTUik uik; + + reader.getUik(uik); + + fprintf(stdout, "%suik: { 0x%.8x-0x%.4x-0x%.4x-0x%.8x-0x%.8x }\n", + indent, uik.m_Data1, uik.m_Data2, uik.m_Data3, uik.m_Data4, uik.m_Data5); + } + break; + case RT_TYPE_MODULE: + fprintf(stdout, "type: 'module'\n"); + break; + case RT_TYPE_STRUCT: + fprintf(stdout, "type: 'struct'\n"); + break; + case RT_TYPE_ENUM: + fprintf(stdout, "type: 'enum'\n"); + break; + case RT_TYPE_EXCEPTION: + fprintf(stdout, "type: 'exception'\n"); + break; + case RT_TYPE_TYPEDEF: + fprintf(stdout, "type: 'typedef'\n"); + break; + case RT_TYPE_SERVICE: + fprintf(stdout, "type: 'service'\n"); + break; + case RT_TYPE_CONSTANTS: + fprintf(stdout, "type: 'constants'\n"); + break; + default: + fprintf(stdout, "type: \n"); + break; + } + + fprintf(stdout, "%sname: '%s'\n", indent, OUStringToOString(reader.getTypeName(), RTL_TEXTENCODING_UTF8).getStr()); + fprintf(stdout, "%ssuper name: '%s'\n", indent, OUStringToOString(reader.getSuperTypeName(), RTL_TEXTENCODING_UTF8).getStr()); + fprintf(stdout, "%sDoku: \"%s\"\n", indent, OUStringToOString(reader.getDoku(), RTL_TEXTENCODING_UTF8).getStr()); + fprintf(stdout, "%sIDL source file: \"%s\"\n", indent, OUStringToOString(reader.getFileName(), RTL_TEXTENCODING_UTF8).getStr()); + fprintf(stdout, "%snumber of fields: %d\n", indent, reader.getFieldCount()); + sal_uInt16 fieldAccess = RT_ACCESS_INVALID; + for (i = 0; i < reader.getFieldCount(); i++) + { + fprintf(stdout, "%sfield #%d:\n%s name='%s'\n%s type='%s'\n", indent, + i, indent, OUStringToOString(reader.getFieldName(i), RTL_TEXTENCODING_UTF8).getStr(), + indent, OUStringToOString(reader.getFieldType(i), RTL_TEXTENCODING_UTF8).getStr()); + + fieldAccess = reader.getFieldAccess(i); + if ( fieldAccess == RT_ACCESS_INVALID ) + { + fprintf(stdout, "%s access=INVALID\n", indent); + } + if ( (fieldAccess & RT_ACCESS_CONST) == RT_ACCESS_CONST ) + { + fprintf(stdout, "%s access=CONST\n", indent); + RTConstValue constVal = reader.getFieldConstValue(i); + + fprintf(stdout, "%s value = ", indent); + + switch (constVal.m_type) + { + case RT_TYPE_BOOL: + if (constVal.m_value.aBool) + fprintf(stdout, "TRUE"); + else + fprintf(stdout, "FALSE"); + break; + case RT_TYPE_BYTE: + fprintf(stdout, "%d", (int)constVal.m_value.aByte); + break; + case RT_TYPE_INT16: + fprintf(stdout, "%d", constVal.m_value.aShort); + break; + case RT_TYPE_UINT16: + fprintf(stdout, "%u", constVal.m_value.aUShort); + break; + case RT_TYPE_INT32: + fprintf(stdout, "%d", constVal.m_value.aLong); + break; + case RT_TYPE_UINT32: + fprintf(stdout, "%u", constVal.m_value.aULong); + break; + case RT_TYPE_FLOAT: + fprintf(stdout, "%f", constVal.m_value.aFloat); + break; + case RT_TYPE_DOUBLE: + fprintf(stdout, "%f", constVal.m_value.aDouble); + break; + case RT_TYPE_STRING: + fprintf(stdout, "%s", OUStringToOString(constVal.m_value.aString, RTL_TEXTENCODING_UTF8).getStr()); + break; + default: + break; + } + } + if ( (fieldAccess & RT_ACCESS_READONLY) == RT_ACCESS_READONLY ) + { + fprintf(stdout, "%s access=READONLY\n", indent); + } + if ( (fieldAccess & RT_ACCESS_READWRITE) == RT_ACCESS_READWRITE ) + { + fprintf(stdout, "%s access=READWRITE\n", indent); + } + if ( (fieldAccess & RT_ACCESS_OPTIONAL) == RT_ACCESS_OPTIONAL ) + { + fprintf(stdout, "%s access=OPTIONAL\n", indent); + } + if ( (fieldAccess & RT_ACCESS_MAYBEVOID) == RT_ACCESS_MAYBEVOID ) + { + fprintf(stdout, "%s access=MAYBEVOID\n", indent); + } + if ( (fieldAccess & RT_ACCESS_BOUND) == RT_ACCESS_BOUND ) + { + fprintf(stdout, "%s access=BOUND\n", indent); + } + if ( (fieldAccess & RT_ACCESS_CONSTRAINED) == RT_ACCESS_CONSTRAINED ) + { + fprintf(stdout, "%s access=CONSTRAINED\n", indent); + } + if ( (fieldAccess & RT_ACCESS_TRANSIENT) == RT_ACCESS_TRANSIENT ) + { + fprintf(stdout, "%s access=TRANSIENT\n", indent); + } + if ( (fieldAccess & RT_ACCESS_MAYBEAMBIGUOUS) == RT_ACCESS_MAYBEAMBIGUOUS ) + { + fprintf(stdout, "%s access=MAYBEAMBIGUOUS\n", indent); + } + if ( (fieldAccess & RT_ACCESS_MAYBEDEFAULT) == RT_ACCESS_MAYBEDEFAULT ) + { + fprintf(stdout, "%s access=MAYBEDEFAULT\n", indent); + } + if ( (fieldAccess & RT_ACCESS_REMOVEABLE) == RT_ACCESS_REMOVEABLE ) + { + fprintf(stdout, "%s access=REMOVEABLE\n", indent); + } + +/* + switch (reader.getFieldAccess(i)) + { + case RT_ACCESS_INVALID: + fprintf(stdout, "%s access=INVALID\n", indent); + break; + case RT_ACCESS_CONST: + { + fprintf(stdout, "%s access=CONST\n", indent); + RTConstValue constVal = reader.getFieldConstValue(i); + + fprintf(stdout, "%s value = ", indent); + + switch (constVal.m_type) + { + case RT_TYPE_BOOL: + if (constVal.m_value.aBool) + fprintf(stdout, "TRUE"); + else + fprintf(stdout, "FALSE"); + break; + case RT_TYPE_BYTE: + fprintf(stdout, "%d", (int)constVal.m_value.aByte); + break; + case RT_TYPE_INT16: + fprintf(stdout, "%d", constVal.m_value.aShort); + break; + case RT_TYPE_UINT16: + fprintf(stdout, "%u", constVal.m_value.aUShort); + break; + case RT_TYPE_INT32: + fprintf(stdout, "%d", constVal.m_value.aLong); + break; + case RT_TYPE_UINT32: + fprintf(stdout, "%u", constVal.m_value.aULong); + break; + case RT_TYPE_FLOAT: + fprintf(stdout, "%f", constVal.m_value.aFloat); + break; + case RT_TYPE_DOUBLE: + fprintf(stdout, "%f", constVal.m_value.aDouble); + break; + case RT_TYPE_STRING: + fprintf(stdout, "%s", OUStringToOString(constVal.m_value.aString, RTL_TEXTENCODING_UTF8).getStr()); + break; + default: + break; + } + } + break; + case RT_ACCESS_READONLY: + fprintf(stdout, "%s access=READONLY ", indent); + break; + case RT_ACCESS_WRITEONLY: + fprintf(stdout, "%s access=WRITEONLY ", indent); + break; + case RT_ACCESS_READWRITE: + fprintf(stdout, "%s access=READWRITE ", indent); + break; + case RT_ACCESS_READONLY_OPTIONAL: + fprintf(stdout, "%s access=READONLY, OPTIONAL ", indent); + break; + case RT_ACCESS_WRITEONLY_OPTIONAL: + fprintf(stdout, "%s access=WRITEONLY, OPTIONAL ", indent); + break; + case RT_ACCESS_READWRITE_OPTIONAL: + fprintf(stdout, "%s access=READWRITE, OPTIONAL ", indent); + break; + default: + fprintf(stdout, "%s access= ", indent); + break; + } +*/ + fprintf(stdout, "\n%s Doku: \"%s\"", indent, OUStringToOString(reader.getFieldDoku(i), RTL_TEXTENCODING_UTF8).getStr()); + fprintf(stdout, "\n%s IDL source file: \"%s\"\n", indent, OUStringToOString(reader.getFieldFileName(i), RTL_TEXTENCODING_UTF8).getStr()); + } + + fprintf(stdout, "%snumber of methods: %d\n", indent, reader.getMethodCount()); + for (i = 0; i < reader.getMethodCount(); i++) + { + fprintf(stdout, "%smethod #%d: ", indent, i); + + switch (reader.getMethodMode(i)) + { + case RT_MODE_INVALID: + fprintf(stdout, " "); + break; + case RT_MODE_ONEWAY: + fprintf(stdout, "[oneway] "); + break; + case RT_MODE_ONEWAY_CONST: + fprintf(stdout, "[oneway, const] "); + break; + case RT_MODE_TWOWAY: + break; + case RT_MODE_TWOWAY_CONST: + fprintf(stdout, "[const] "); + break; + default: + fprintf(stdout, " "); + break; + } + + fprintf(stdout, "%s %s(", + OUStringToOString(reader.getMethodReturnType(i), RTL_TEXTENCODING_UTF8).getStr(), + OUStringToOString(reader.getMethodName(i), RTL_TEXTENCODING_UTF8).getStr()); + + for (j = 0; j < reader.getMethodParamCount(i); j++) + { + switch (reader.getMethodParamMode(i, j)) + { + case RT_PARAM_INVALID: + fprintf(stdout, " "); + break; + case RT_PARAM_IN: + fprintf(stdout, "[in] "); + break; + case RT_PARAM_OUT: + fprintf(stdout, "[out] "); + break; + case RT_PARAM_INOUT: + fprintf(stdout, "[inout] "); + break; + default: + fprintf(stdout, " "); + break; + } + + fprintf(stdout, "%s %s", + OUStringToOString(reader.getMethodParamType(i, j), RTL_TEXTENCODING_UTF8).getStr(), + OUStringToOString(reader.getMethodParamName(i, j), RTL_TEXTENCODING_UTF8).getStr()); + + if (j != reader.getMethodParamCount(i) - 1) + fprintf(stdout, ", "); + } + + fprintf(stdout, ") "); + + if (reader.getMethodExcCount(i)) + { + fprintf(stdout, "raises "); + for (j = 0; j < reader.getMethodExcCount(i); j++) + { + fprintf(stdout, "%s", + OUStringToOString(reader.getMethodExcType(i, j), RTL_TEXTENCODING_UTF8).getStr()); + if (j != reader.getMethodExcCount(i) - 1) + fprintf(stdout, ", "); + } + } + + fprintf(stdout, "\n%s Doku: \"%s\"\n", indent, + OUStringToOString(reader.getMethodDoku(i), RTL_TEXTENCODING_UTF8).getStr()); + } + + fprintf(stdout, "%snumber of references: %d\n", indent, reader.getReferenceCount()); + for (i = 0; i < reader.getReferenceCount(); i++) + { + fprintf(stdout, "%sreference #%d:\n%s name='%s'\n", indent, i, indent, + OUStringToOString(reader.getReferenceName(i), RTL_TEXTENCODING_UTF8).getStr()); + switch (reader.getReferenceType(i)) + { + case RT_REF_INVALID: + fprintf(stdout, "%s type=INVALID\n", indent); + break; + case RT_REF_SUPPORTS: + { + fprintf(stdout, "%s type=supported interface\n", indent); + if (reader.getReferenceAccess(i) == RT_ACCESS_OPTIONAL) + { + fprintf(stdout, "%s access=optional\n", indent); + } + } + break; + case RT_REF_OBSERVES: + fprintf(stdout, "%s type=observed interface\n", indent); + break; + case RT_REF_EXPORTS: + fprintf(stdout, "%s type=exported service\n", indent); + break; + case RT_REF_NEEDS: + fprintf(stdout, "%s type=needed service\n", indent); + break; + default: + fprintf(stdout, "%s type=\n", indent); + break; + } + + fprintf(stdout, "%s Doku: \"%s\"\n", indent, + OUStringToOString(reader.getReferenceDoku(i), RTL_TEXTENCODING_UTF8).getStr()); + } + } + else + { + ret = sal_False; + } + + return ret; +} + + +//********************************************************************* +// ORegistry() +// +ORegistry::ORegistry() + : m_refCount(1) + , m_readOnly(sal_False) + , m_isOpen(sal_False) + , ROOT( RTL_CONSTASCII_USTRINGPARAM("/") ) +{ +} + +//********************************************************************* +// ~ORegistry() +// +ORegistry::~ORegistry() +{ + if (m_openKeyTable.count(ROOT) > 0) + { + m_openKeyTable[ROOT]->release(); + delete(m_openKeyTable[ROOT]); + } + + if (m_file.isValid()) + m_file.close(); +} + + +//********************************************************************* +// initRegistry +// +RegError ORegistry::initRegistry(const OUString& regName, RegAccessMode accessMode) +{ + OStoreFile rRegFile; + storeAccessMode sAccessMode = REG_MODE_OPEN; + storeError errCode; + + if (accessMode & REG_CREATE) + { + sAccessMode = REG_MODE_CREATE; + } else + if (accessMode & REG_READONLY) + { + sAccessMode = REG_MODE_OPENREAD; + m_readOnly = sal_True; + } + + if (errCode = rRegFile.create(regName, sAccessMode, REG_PAGESIZE)) + { + switch (errCode) + { + case store_E_NotExists: + return REG_REGISTRY_NOT_EXISTS; + break; + case store_E_LockingViolation: + return REG_CANNOT_OPEN_FOR_READWRITE; + break; + default: + return REG_INVALID_REGISTRY; + break; + } + } else + { + OStoreDirectory rStoreDir; + storeError _err = rStoreDir.create(rRegFile, OUString(), OUString(), sAccessMode); + + if ( _err == store_E_None ) + { + m_file = rRegFile; + m_name = regName; + m_isOpen = sal_True; + + + m_openKeyTable[ROOT] = new ORegKey(ROOT, rStoreDir, this); + return REG_NO_ERROR; + } else + return REG_INVALID_REGISTRY; + } +} + + +//********************************************************************* +// closeRegistry +// +RegError ORegistry::closeRegistry() +{ + REG_GUARD(m_mutex); + + if (m_file.isValid()) + { + closeKey(m_openKeyTable[ROOT]); + m_file.close(); + m_isOpen = sal_False; + return REG_NO_ERROR; + } else + { + return REG_REGISTRY_NOT_EXISTS; + } +} + + +//********************************************************************* +// destroyRegistry +// +RegError ORegistry::destroyRegistry(const OUString& regName) +{ + REG_GUARD(m_mutex); + + if (regName.getLength()) + { + ORegistry* pReg = new ORegistry(); + + if (!pReg->initRegistry(regName, REG_READWRITE)) + { + delete pReg; + + OString name( OUStringToOString(regName, RTL_TEXTENCODING_UTF8) ); + if (unlink(name) != 0) + { + return REG_DESTROY_REGISTRY_FAILED; + } + } else + { + return REG_DESTROY_REGISTRY_FAILED; + } + } else + { + if (m_refCount != 1 || isReadOnly()) + { + return REG_DESTROY_REGISTRY_FAILED; + } + + if (m_file.isValid()) + { + closeKey(m_openKeyTable[ROOT]); + m_file.close(); + m_isOpen = sal_False; + + OString name( OUStringToOString(m_name, RTL_TEXTENCODING_UTF8) ); + if (unlink(name) != 0) + { + return REG_DESTROY_REGISTRY_FAILED; + } + } else + { + return REG_REGISTRY_NOT_EXISTS; + } + } + + return REG_NO_ERROR; +} + +//********************************************************************* +// createKey +// +RegError ORegistry::createKey(RegKeyHandle hKey, const OUString& keyName, + RegKeyHandle* phNewKey) +{ + ORegKey* pKey; + + *phNewKey = NULL; + + if ( !keyName.getLength() ) + return REG_INVALID_KEYNAME; + + REG_GUARD(m_mutex); + + if (hKey) + pKey = (ORegKey*)hKey; + else + pKey = m_openKeyTable[ROOT]; + + OUString sFullKeyName = resolveLinks(pKey, keyName); + + if ( !sFullKeyName.getLength() ) + return REG_DETECT_RECURSION; + + if (m_openKeyTable.count(sFullKeyName) > 0) + { + *phNewKey = m_openKeyTable[sFullKeyName]; + ((ORegKey*)*phNewKey)->acquire(); + ((ORegKey*)*phNewKey)->setDeleted(sal_False); + return REG_NO_ERROR; + } + + OStoreDirectory rStoreDir; + OUStringBuffer sFullPath(sFullKeyName.getLength()); + sal_Int32 tokenCount = sFullKeyName.getTokenCount('/'); + OUString token; + + sFullPath.append((sal_Unicode)'/'); + + for (sal_Int32 i=0; i < tokenCount; i++) + { + token = sFullKeyName.getToken(i, '/'); + if (token.getLength()) + { + if (rStoreDir.create(pKey->getStoreFile(), sFullPath.getStr(), token, KEY_MODE_CREATE)) + { + return REG_CREATE_KEY_FAILED; + } + + sFullPath.append(token); + sFullPath.append((sal_Unicode)'/'); + } + } + + pKey = new ORegKey(sFullKeyName, rStoreDir, this); + *phNewKey = pKey; + m_openKeyTable[sFullKeyName] = pKey; + + return REG_NO_ERROR; +} + + +//********************************************************************* +// openKey +// +RegError ORegistry::openKey(RegKeyHandle hKey, const OUString& keyName, + RegKeyHandle* phOpenKey, RESOLVE eResolve) +{ + ORegKey* pKey; + storeAccessMode accessMode = KEY_MODE_OPEN; + + *phOpenKey = NULL; + + if ( !keyName.getLength() ) + { + return REG_INVALID_KEYNAME; + } + + if ( isReadOnly() ) + { + accessMode = KEY_MODE_OPENREAD; + } + + REG_GUARD(m_mutex); + + if (hKey) + pKey = (ORegKey*)hKey; + else + pKey = m_openKeyTable[ROOT]; + + OUString sFullKeyName; + OUString sFullPath; + OUString sRelativKey; + + switch (eResolve) + { + case RESOLVE_FULL: + { + sFullKeyName = resolveLinks(pKey, keyName); + + if ( !sFullKeyName.getLength() ) + return REG_DETECT_RECURSION; + + sal_Int32 lastIndex = sFullKeyName.lastIndexOf('/'); + sRelativKey = sFullKeyName.copy(lastIndex + 1); + sFullPath = sFullKeyName.copy(0, lastIndex + 1); + } + break; + case RESOLVE_PART: + { + sal_Int32 lastIndex = keyName.lastIndexOf('/'); + if ( lastIndex >= 0 ) + { + OUString sRelativ(keyName.copy(lastIndex)); + OUString tmpKey(keyName.copy(0, lastIndex + 1)); + sFullKeyName = resolveLinks(pKey, tmpKey); + + sFullPath = sFullKeyName; + sFullPath += ROOT; + sFullKeyName += sRelativ; + sRelativKey = sRelativ.copy(1); + } else + { + sFullKeyName = pKey->getName(); + sFullPath = sFullKeyName; + + sRelativKey = keyName; + + if ( sFullKeyName.getLength() > 1 ) + sFullKeyName += ROOT; + + sFullKeyName += keyName; + + if ( sFullPath.getLength() > 1 ) + sFullPath += ROOT; + } + } + break; + case RESOLVE_NOTHING: + { + sFullKeyName = pKey->getName(); + sFullPath = sFullKeyName; + + if (sFullKeyName.getLength() > 1) + sFullKeyName += ROOT; + + sal_Int32 lastIndex = keyName.lastIndexOf('/'); + if ( lastIndex >= 0 && lastIndex < keyName.getLength() ) + { + OUString sRelativ(keyName.copy(lastIndex+1)); + sRelativKey = sRelativ; + sFullKeyName += keyName.copy(1); + + sFullPath = sFullKeyName.copy(0, keyName.lastIndexOf('/') + 1); + } else + { + + sRelativKey += keyName; + sFullKeyName += keyName; + + if ( sFullPath.getLength() > 1 ) + sFullPath += ROOT; + } + } + break; + } + + if (m_openKeyTable.count(sFullKeyName) > 0) + { + m_openKeyTable[sFullKeyName]->acquire(); + *phOpenKey = m_openKeyTable[sFullKeyName]; + return REG_NO_ERROR; + } + + OStoreDirectory rStoreDir; + storeError _err = rStoreDir.create(pKey->getStoreFile(), sFullPath, sRelativKey, accessMode); + + if (_err == store_E_NotExists) + return REG_KEY_NOT_EXISTS; + else + if (_err == store_E_WrongFormat) + return REG_INVALID_KEY; + + pKey = new ORegKey(sFullKeyName, rStoreDir, this); + + *phOpenKey = pKey; + m_openKeyTable[sFullKeyName] = pKey; + + return REG_NO_ERROR; +} + + +//********************************************************************* +// closeKey +// +RegError ORegistry::closeKey(RegKeyHandle hKey) +{ + ORegKey* pKey = (ORegKey*)hKey; + + REG_GUARD(m_mutex); + + if (m_openKeyTable.count(pKey->getName()) > 0) + { + if (pKey->getRefCount() == 1) + { + m_openKeyTable.erase(pKey->getName()); + delete(pKey); + hKey = NULL; + } else + { + pKey->release(); + } + + return REG_NO_ERROR; + } else + { + return REG_KEY_NOT_OPEN; + } +} + + +//********************************************************************* +// deleteKey +// +RegError ORegistry::deleteKey(RegKeyHandle hKey, const OUString& keyName) +{ + ORegKey* pKey; + RegError _ret = REG_NO_ERROR; + + if ( !keyName.getLength() ) + { + return REG_INVALID_KEYNAME; + } + + REG_GUARD(m_mutex); + + if (hKey) + pKey = (ORegKey*)hKey; + else + pKey = m_openKeyTable[ROOT]; + + OUString sFullKeyName = resolveLinks(pKey, keyName); + + if ( !sFullKeyName.getLength() ) + return REG_DETECT_RECURSION; + + pKey = m_openKeyTable[ROOT]; + _ret = eraseKey(pKey, sFullKeyName, RESOLVE_NOTHING); + + return _ret; +} + +RegError ORegistry::eraseKey(ORegKey* pKey, const OUString& keyName, RESOLVE eResolve) +{ + RegError _ret = REG_NO_ERROR; + + if ( !keyName.getLength() ) + { + return REG_INVALID_KEYNAME; + } + + OUString sFullKeyName(pKey->getName()); + OUString sFullPath(sFullKeyName); + OUString sRelativKey; + sal_Int32 lastIndex = keyName.lastIndexOf('/'); + + if ( lastIndex >= 0 ) + { + sRelativKey += keyName.copy(lastIndex + 1); + + if (sFullKeyName.getLength() > 1) + sFullKeyName += keyName; + else + sFullKeyName += (keyName+1); + + sFullPath = sFullKeyName.copy(0, keyName.lastIndexOf('/') + 1); + } else + { + if (sFullKeyName.getLength() > 1) + sFullKeyName += ROOT; + + sRelativKey += keyName; + sFullKeyName += keyName; + + if (sFullPath.getLength() > 1) + sFullPath += ROOT; + } + + RegKeyHandle hOldKey; + if (_ret = pKey->openKey(keyName, &hOldKey, eResolve)) + { + return _ret; + } + + if (_ret = deleteSubkeysAndValues((ORegKey*)hOldKey, eResolve)) + { + pKey->closeKey(hOldKey); + return _ret; + } + + OUString tmpName(sRelativKey); + tmpName += ROOT; + + OStoreFile sFile(pKey->getStoreFile()); + + if ( sFile.isValid() && sFile.remove(sFullPath, tmpName) ) + { + return REG_DELETE_KEY_FAILED; + } + + // set flag deleted !!! + ((ORegKey*)hOldKey)->setDeleted(sal_True); + + if (_ret = pKey->closeKey(hOldKey)) + { + return _ret; + } + + return REG_NO_ERROR; +} + + +//********************************************************************* +// deleteSubKeys +// +RegError ORegistry::deleteSubkeysAndValues(ORegKey* pKey, RESOLVE eResolve) +{ + OStoreDirectory::iterator iter; + OUString keyName; + RegError _ret = REG_NO_ERROR; + OStoreDirectory rStoreDir(pKey->getStoreDir()); + storeError _err = rStoreDir.first(iter); + + while ( _err == store_E_None ) + { + keyName = iter.m_pszName; + + if (iter.m_nAttrib & STORE_ATTRIB_ISDIR) + { + if ((_ret = eraseKey(pKey, keyName, eResolve))) + return _ret; + } else + { + OUString sFullPath(pKey->getName()); + + if (sFullPath.getLength() > 1) + sFullPath += ROOT; + + if ( ((OStoreFile&)pKey->getStoreFile()).remove(sFullPath, keyName) ) + { + return REG_DELETE_VALUE_FAILED; + } + } + + _err = rStoreDir.next(iter); + } + + return REG_NO_ERROR; +} + + +//********************************************************************* +// loadKey +// +RegError ORegistry::loadKey(RegKeyHandle hKey, const OUString& regFileName, + sal_Bool bWarnings, sal_Bool bReport) +{ + RegError _ret = REG_NO_ERROR; + ORegistry* pReg; + ORegKey *pKey, *pRootKey; + + pReg = new ORegistry(); + if (_ret = pReg->initRegistry(regFileName, REG_READONLY)) + { + return _ret; + } + + pKey = (ORegKey*)hKey; + pRootKey = pReg->getRootKey(); + + REG_GUARD(m_mutex); + + OStoreDirectory::iterator iter; + OUString keyName; + OStoreDirectory rStoreDir(pRootKey->getStoreDir()); + storeError _err = rStoreDir.first(iter); + + while ( _err == store_E_None ) + { + keyName = iter.m_pszName; + + if ( iter.m_nAttrib & STORE_ATTRIB_ISDIR ) + { + _ret = loadAndSaveKeys(pKey, pRootKey, keyName, 0, bWarnings, bReport); + } else + { + _ret = loadAndSaveValue(pKey, pRootKey, keyName, 0, bWarnings, bReport); + } + + if (_ret == REG_MERGE_ERROR || + (_ret == REG_MERGE_CONFLICT && bWarnings)) + { + rStoreDir = OStoreDirectory(); + pRootKey->release(); + delete(pReg); + return _ret; + } + + _err = rStoreDir.next(iter); + } + + rStoreDir = OStoreDirectory(); + pRootKey->release(); + delete(pReg); + return _ret; +} + + +//********************************************************************* +// loadKey +// +RegError ORegistry::saveKey(RegKeyHandle hKey, const OUString& regFileName, + sal_Bool bWarnings, sal_Bool bReport) +{ + RegError _ret = REG_NO_ERROR; + ORegistry* pReg; + ORegKey *pKey, *pRootKey; + + pReg = new ORegistry(); + if (_ret = pReg->initRegistry(regFileName, REG_CREATE)) + { + return _ret; + } + + pKey = (ORegKey*)hKey; + pRootKey = pReg->getRootKey(); + + REG_GUARD(m_mutex); + + OStoreDirectory::iterator iter; + OUString keyName; + OStoreDirectory rStoreDir(pKey->getStoreDir()); + storeError _err = rStoreDir.first(iter); + + while ( _err == store_E_None ) + { + keyName = iter.m_pszName; + + if ( iter.m_nAttrib & STORE_ATTRIB_ISDIR ) + { + _ret = loadAndSaveKeys(pRootKey, pKey, keyName, + pKey->getName().getLength(), + bWarnings, bReport); + } else + { + _ret = loadAndSaveValue(pRootKey, pKey, keyName, + pKey->getName().getLength(), + bWarnings, bReport); + } + + if (_ret) + { + pRootKey->release(); + delete(pReg); + return _ret; + } + + _err = rStoreDir.next(iter); + } + + pRootKey->release(); + delete(pReg); + return REG_NO_ERROR; +} + + +//********************************************************************* +// isKeyOpen() +// +sal_Bool ORegistry::isKeyOpen(const OUString& keyName) const +{ + return(m_openKeyTable.count(keyName) > 0); +} + + + +//********************************************************************* +// countSubKeys() +// +sal_uInt32 ORegistry::countSubKeys(ORegKey* pKey) +{ + REG_GUARD(m_mutex); + + OStoreDirectory::iterator iter; + sal_uInt32 count = 0; + OStoreDirectory rStoreDir(pKey->getStoreDir()); + storeError _err = rStoreDir.first(iter); + + while ( _err == store_E_None) + { + if (iter.m_nAttrib & STORE_ATTRIB_ISDIR) + { + count++; + } + + _err = rStoreDir.next(iter); + } + + return count; +} + + +//********************************************************************* +// loadValue() +// +RegError ORegistry::loadAndSaveValue(ORegKey* pTargetKey, + ORegKey* pSourceKey, + const OUString& valueName, + sal_uInt32 nCut, + sal_Bool bWarnings, + sal_Bool bReport) +{ + OStoreStream rValue; + sal_uInt8* pBuffer; + RegValueType valueType; + sal_uInt32 valueSize; + sal_uInt32 nSize; + storeAccessMode sourceAccess = VALUE_MODE_OPEN; + OUString sTargetPath(pTargetKey->getName()); + OUString sSourcePath(pSourceKey->getName()); + + if (pSourceKey->isReadOnly()) + { + sourceAccess = VALUE_MODE_OPENREAD; + } + + if (nCut) + { + sTargetPath = sSourcePath.copy(nCut); + } else + { + if (sTargetPath.getLength() > 1) + { + if (sSourcePath.getLength() > 1) + sTargetPath += sSourcePath; + } else + sTargetPath = sSourcePath; + } + + if (sTargetPath.getLength() > 1) sTargetPath += ROOT; + if (sSourcePath.getLength() > 1) sSourcePath += ROOT; + + if (rValue.create(pSourceKey->getStoreFile(), sSourcePath, valueName, sourceAccess)) + { + return REG_VALUE_NOT_EXISTS; + } + + pBuffer = (sal_uInt8*)rtl_allocateMemory(VALUE_HEADERSIZE); + + sal_uInt32 rwBytes; + if (rValue.readAt(0, pBuffer, VALUE_HEADERSIZE, rwBytes)) + { + rtl_freeMemory(pBuffer); + return REG_INVALID_VALUE; + } + if (rwBytes != VALUE_HEADERSIZE) + { + rtl_freeMemory(pBuffer); + return REG_INVALID_VALUE; + } + + RegError _ret = REG_NO_ERROR; + sal_uInt8 type = *((sal_uInt8*)pBuffer); + valueType = (RegValueType)type; + readUINT32(pBuffer+VALUE_TYPEOFFSET, valueSize); + rtl_freeMemory(pBuffer); + + nSize = VALUE_HEADERSIZE + valueSize; + pBuffer = (sal_uInt8*)rtl_allocateMemory(nSize); + + if (rValue.readAt(0, pBuffer, nSize, rwBytes)) + { + rtl_freeMemory(pBuffer); + return REG_INVALID_VALUE; + } + if (rwBytes != nSize) + { + rtl_freeMemory(pBuffer); + return REG_INVALID_VALUE; + } + + OStoreFile rTargetFile(pTargetKey->getStoreFile()); + + if (!rValue.create(rTargetFile, sTargetPath, valueName, VALUE_MODE_OPEN)) + { + if (valueType == RG_VALUETYPE_BINARY) + { + if (_ret = checkBlop(rValue, pTargetKey, sTargetPath, + valueName, valueSize, pBuffer+VALUE_HEADEROFFSET, + bReport)) + { + if (_ret == REG_MERGE_ERROR || + (_ret == REG_MERGE_CONFLICT && bWarnings)) + { + rtl_freeMemory(pBuffer); + return _ret; + } + } else + { + rtl_freeMemory(pBuffer); + return _ret; + } + } + } + + // write + if (rValue.create(rTargetFile, sTargetPath, valueName, VALUE_MODE_CREATE)) + { + rtl_freeMemory(pBuffer); + return REG_INVALID_VALUE; + } + if (rValue.writeAt(0, pBuffer, nSize, rwBytes)) + { + rtl_freeMemory(pBuffer); + return REG_INVALID_VALUE; + } + + if (rwBytes != nSize) + { + rtl_freeMemory(pBuffer); + return REG_INVALID_VALUE; + } + + rtl_freeMemory(pBuffer); + return _ret; +} + + +//********************************************************************* +// checkblop() +// +RegError ORegistry::checkBlop(OStoreStream& rValue, + ORegKey* pTargetKey, + const OUString& sTargetPath, + const OUString& valueName, + sal_uInt32 srcValueSize, + sal_uInt8* pSrcBuffer, + sal_Bool bReport) +{ + RegistryTypeReader_Api* pReaderApi; + + pReaderApi = initRegistryTypeReader_Api(); + + RegistryTypeReader reader(pReaderApi, pSrcBuffer, srcValueSize, sal_False); + + if (reader.getTypeClass() == RT_TYPE_INVALID) + { + return REG_INVALID_VALUE; + } + + sal_uInt8* pBuffer = (sal_uInt8*)rtl_allocateMemory(VALUE_HEADERSIZE); + RegValueType valueType; + sal_uInt32 valueSize; + sal_uInt32 rwBytes; + OString targetPath( OUStringToOString(sTargetPath, RTL_TEXTENCODING_UTF8) ); + + if (!rValue.readAt(0, pBuffer, VALUE_HEADERSIZE, rwBytes) && + (rwBytes == VALUE_HEADERSIZE)) + { + sal_uInt8 type = *((sal_uInt8*)pBuffer); + valueType = (RegValueType)type; + readUINT32(pBuffer+VALUE_TYPEOFFSET, valueSize); + rtl_freeMemory(pBuffer); + + if (valueType == RG_VALUETYPE_BINARY) + { + pBuffer = (sal_uInt8*)rtl_allocateMemory(valueSize); + if (!rValue.readAt(VALUE_HEADEROFFSET, pBuffer, valueSize, rwBytes) && + (rwBytes == valueSize)) + { + RegistryTypeReader reader2(pReaderApi, pBuffer, valueSize, sal_False); + + if ((reader.getTypeClass() != reader2.getTypeClass()) + || reader2.getTypeClass() == RT_TYPE_INVALID) + { + rtl_freeMemory(pBuffer); + + if (bReport) + { + fprintf(stdout, "ERROR: values of blop from key \"%s\" has different types.\n", + targetPath.getStr()); + } + return REG_MERGE_ERROR; + } + + if (reader.getTypeClass() == RT_TYPE_MODULE) + { + if (reader.getFieldCount() > 0 && + reader2.getFieldCount() > 0) + { + mergeModuleValue(rValue, pTargetKey, sTargetPath, + valueName, reader, reader2); + + rtl_freeMemory(pBuffer); + return REG_NO_ERROR; + } else + if (reader2.getFieldCount() > 0) + { + rtl_freeMemory(pBuffer); + return REG_NO_ERROR; + } else + { + rtl_freeMemory(pBuffer); + return REG_MERGE_CONFLICT; + } + } else + { + rtl_freeMemory(pBuffer); + + if (bReport) + { + fprintf(stdout, "WARNING: value of key \"%s\" already exists.\n", + targetPath.getStr()); + } + return REG_MERGE_CONFLICT; + } + } else + { + rtl_freeMemory(pBuffer); + if (bReport) + { + fprintf(stdout, "ERROR: values of key \"%s\" contains bad data.\n", + targetPath.getStr()); + } + return REG_MERGE_ERROR; + } + } else + { + rtl_freeMemory(pBuffer); + if (bReport) + { + fprintf(stdout, "ERROR: values of key \"%s\" has different types.\n", + targetPath.getStr()); + } + return REG_MERGE_ERROR; + } + } else + { + rtl_freeMemory(pBuffer); + return REG_INVALID_VALUE; + } +} + +static sal_uInt32 checkTypeReaders(RegistryTypeReader& reader1, + RegistryTypeReader& reader2, + StringSet& nameSet) +{ + sal_uInt32 count=0; + sal_uInt32 i; + for (i=0 ; i < reader1.getFieldCount(); i++) + { + nameSet.insert(reader1.getFieldName(i)); + count++; + } + for (i=0 ; i < reader2.getFieldCount(); i++) + { + if (nameSet.find(reader2.getFieldName(i)) == nameSet.end()) + { + nameSet.insert(reader2.getFieldName(i)); + count++; + } + } + return count; +} + +//********************************************************************* +// mergeModuleValue() +// +RegError ORegistry::mergeModuleValue(OStoreStream& rTargetValue, + ORegKey* pTargetKey, + const OUString& sTargetPath, + const OUString& valueName, + RegistryTypeReader& reader, + RegistryTypeReader& reader2) +{ + sal_uInt16 index = 0; + RegistryTypeWriter_Api* pWriterApi; + + StringSet nameSet; + sal_uInt32 count = checkTypeReaders(reader, reader2, nameSet); + + if (count != reader.getFieldCount()) + { + pWriterApi = initRegistryTypeWriter_Api(); + + RegistryTypeWriter writer(pWriterApi, + reader.getTypeClass(), + reader.getTypeName(), + reader.getSuperTypeName(), + count, + 0, + 0); + + int i; + for (i=0 ; i < reader.getFieldCount(); i++) + { + writer.setFieldData(index, + reader.getFieldName(i), + reader.getFieldType(i), + reader.getFieldDoku(i), + reader.getFieldFileName(i), + reader.getFieldAccess(i), + reader.getFieldConstValue(i)); + index++; + } + for (i=0 ; i < reader2.getFieldCount(); i++) + { + if (nameSet.find(reader2.getFieldName(i)) == nameSet.end()) + { + writer.setFieldData(index, + reader2.getFieldName(i), + reader2.getFieldType(i), + reader2.getFieldDoku(i), + reader2.getFieldFileName(i), + reader2.getFieldAccess(i), + reader2.getFieldConstValue(i)); + index++; + } + } + + const sal_uInt8* pBlop = writer.getBlop(); + sal_uInt32 aBlopSize = writer.getBlopSize(); + + sal_uInt8 type = (sal_uInt8)RG_VALUETYPE_BINARY; + sal_uInt8* pBuffer = (sal_uInt8*)rtl_allocateMemory(VALUE_HEADERSIZE + aBlopSize); + + rtl_copyMemory(pBuffer, &type, 1); + writeUINT32(pBuffer+VALUE_TYPEOFFSET, aBlopSize); + rtl_copyMemory(pBuffer+VALUE_HEADEROFFSET, pBlop, aBlopSize); + + sal_uInt32 rwBytes; + if (rTargetValue.writeAt(0, pBuffer, VALUE_HEADERSIZE+aBlopSize, rwBytes)) + { + rtl_freeMemory(pBuffer); + return REG_INVALID_VALUE; + } + + if (rwBytes != VALUE_HEADERSIZE+aBlopSize) + { + rtl_freeMemory(pBuffer); + return REG_INVALID_VALUE; + } + + rtl_freeMemory(pBuffer); + } + return REG_NO_ERROR; +} + +//********************************************************************* +// loadKeys() +// +RegError ORegistry::loadAndSaveKeys(ORegKey* pTargetKey, + ORegKey* pSourceKey, + const OUString& keyName, + sal_uInt32 nCut, + sal_Bool bWarnings, + sal_Bool bReport) +{ + ORegKey* pTmpKey; + RegError _ret = REG_NO_ERROR; + OUString sRelPath(pSourceKey->getName().copy(nCut)); + OUString sFullPath; + + if(pTargetKey->getName().getLength() > 1) + sFullPath += pTargetKey->getName(); + sFullPath += sRelPath; + if (sRelPath.getLength() > 1 || sFullPath.getLength() == 0) + sFullPath += ROOT; + + OUString sFullKeyName = sFullPath; + OStoreDirectory rStoreDir; + + sFullKeyName += keyName; + + if (rStoreDir.create(pTargetKey->getStoreFile(), sFullPath, keyName, KEY_MODE_CREATE)) + { + return REG_CREATE_KEY_FAILED; + } + + if (m_openKeyTable.count(sFullKeyName) > 0) + { + m_openKeyTable[sFullKeyName]->setDeleted(sal_False); + } + + + if (_ret = pSourceKey->openKey(keyName, (RegKeyHandle*)&pTmpKey, RESOLVE_NOTHING)) + { + return _ret; + } + + OStoreDirectory::iterator iter; + OUString sName; + OStoreDirectory rTmpStoreDir(pTmpKey->getStoreDir()); + storeError _err = rTmpStoreDir.first(iter); + + while ( _err == store_E_None) + { + sName = iter.m_pszName; + + if (iter.m_nAttrib & STORE_ATTRIB_ISDIR) + { + _ret = loadAndSaveKeys(pTargetKey, pTmpKey, + sName, nCut, bWarnings, bReport); + } else + { + _ret = loadAndSaveValue(pTargetKey, pTmpKey, + sName, nCut, bWarnings, bReport); + } + + if (_ret == REG_MERGE_ERROR || + (_ret == REG_MERGE_CONFLICT && bWarnings)) + { + pSourceKey->closeKey(pTmpKey); + return _ret; + } + + _err = rTmpStoreDir.next(iter); + } + + pSourceKey->closeKey(pTmpKey); + return _ret; +} + + +//********************************************************************* +// getRootKey() +// +ORegKey* ORegistry::getRootKey() +{ + m_openKeyTable[ROOT]->acquire(); + return m_openKeyTable[ROOT]; +} + + +//********************************************************************* +// getResolvedKeyName() +// +RegError ORegistry::getResolvedKeyName(RegKeyHandle hKey, + const OUString& keyName, + OUString& resolvedName, + sal_Bool firstLinkOnly) +{ + ORegKey* pKey; + + if ( !keyName.getLength() ) + return REG_INVALID_KEYNAME; + + REG_GUARD(m_mutex); + + if (hKey) + pKey = (ORegKey*)hKey; + else + pKey = m_openKeyTable[ROOT]; + + resolvedName = resolveLinks(pKey, keyName, firstLinkOnly); + + if ( resolvedName.getLength() ) + return REG_NO_ERROR; + else + return REG_DETECT_RECURSION; +} + +//********************************************************************* +// dumpRegistry() +// +RegError ORegistry::dumpRegistry(RegKeyHandle hKey) const +{ + ORegKey *pKey = (ORegKey*)hKey; + OUString sName; + RegError _ret = REG_NO_ERROR; + OStoreDirectory::iterator iter; + OStoreDirectory rStoreDir(pKey->getStoreDir()); + storeError _err = rStoreDir.first(iter); + + OString regName( OUStringToOString( getName(), RTL_TEXTENCODING_UTF8 ) ); + OString keyName( OUStringToOString( pKey->getName(), RTL_TEXTENCODING_UTF8 ) ); + fprintf(stdout, "Registry \"%s\":\n\n%s\n", regName.getStr(), keyName.getStr()); + + while ( _err == store_E_None ) + { + sName = iter.m_pszName; + + if (iter.m_nAttrib & STORE_ATTRIB_ISDIR) + { + _ret = dumpKey(pKey->getName(), sName, 1); + } else + { + _ret = dumpValue(pKey->getName(), sName, 1); + } + + if (_ret) + { + return _ret; + } + + _err = rStoreDir.next(iter); + } + + return REG_NO_ERROR; +} + + +//********************************************************************* +// dumpValue() +// +RegError ORegistry::dumpValue(const OUString& sPath, const OUString& sName, sal_Int16 nSpc) const +{ + OStoreStream rValue; + sal_uInt8* pBuffer; + sal_uInt32 valueSize; + RegValueType valueType; + OUString sFullPath(sPath); + OString sIndent; + storeAccessMode accessMode = VALUE_MODE_OPEN; + sal_Bool bLinkValue = sal_False; + + if (isReadOnly()) + { + accessMode = VALUE_MODE_OPENREAD; + } + + for (int i= 0; i < nSpc; i++) sIndent += " "; + + if (sFullPath.getLength() > 1) + { + sFullPath += ROOT; + } + if (rValue.create(m_file, sFullPath, sName, accessMode)) + { + return REG_VALUE_NOT_EXISTS; + } + + OUString tmpName( RTL_CONSTASCII_USTRINGPARAM(VALUE_PREFIX) ); + tmpName += OUString( RTL_CONSTASCII_USTRINGPARAM("LINK_TARGET") ); + if (sName == tmpName) + { + bLinkValue = sal_True; + } + pBuffer = (sal_uInt8*)rtl_allocateMemory(VALUE_HEADERSIZE); + + sal_uInt32 rwBytes; + if (rValue.readAt(0, pBuffer, VALUE_HEADERSIZE, rwBytes)) + { + rtl_freeMemory(pBuffer); + return REG_INVALID_VALUE; + } + if (rwBytes != (VALUE_HEADERSIZE)) + { + rtl_freeMemory(pBuffer); + return REG_INVALID_VALUE; + } + + sal_uInt8 type = *((sal_uInt8*)pBuffer); + valueType = (RegValueType)type; + readUINT32(pBuffer+VALUE_TYPEOFFSET, valueSize); + + pBuffer = (sal_uInt8*)rtl_allocateMemory(valueSize); + if (rValue.readAt(VALUE_HEADEROFFSET, pBuffer, valueSize, rwBytes)) + { + rtl_freeMemory(pBuffer); + return REG_INVALID_VALUE; + } + if (rwBytes != valueSize) + { + rtl_freeMemory(pBuffer); + return REG_INVALID_VALUE; + } + + const sal_Char* indent = sIndent.getStr(); + switch (valueType) + { + case 0: + fprintf(stdout, "%sValue: Type = VALUETYPE_NOT_DEFINED\n", indent); + break; + case 1: + { + fprintf(stdout, "%sValue: Type = RG_VALUETYPE_LONG\n", indent); + fprintf(stdout, "%s Size = %d\n", indent, valueSize); + fprintf(stdout, "%s Data = ", indent); + + sal_Int32 value; + readINT32(pBuffer, value); + fprintf(stdout, "%d\n", value); + } + break; + case 2: + { + sal_Char* value = (sal_Char*)rtl_allocateMemory(valueSize); + readUtf8(pBuffer, value, valueSize); + + if (bLinkValue) + { + fprintf(stdout, "%sKEY: Type = RG_LINKTYPE\n", indent); + fprintf(stdout, "%s LinkTarget = \"%s\"\n", indent, value); + } else + { + fprintf(stdout, "%sValue: Type = RG_VALUETYPE_STRING\n", indent); + fprintf(stdout, "%s Size = %d\n", indent, valueSize); + fprintf(stdout, "%s Data = \"%s\"\n", indent, value); + } + + rtl_freeMemory(value); + } + break; + case 3: + { + sal_uInt32 size = (valueSize / 2) * sizeof(sal_Unicode); + fprintf(stdout, "%sValue: Type = RG_VALUETYPE_UNICODE\n", indent); + fprintf(stdout, "%s Size = %d\n", indent, valueSize); + fprintf(stdout, "%s Data = ", indent); + + sal_Unicode* value = new sal_Unicode[size]; + readString(pBuffer, value, size); + + OString uStr = OUStringToOString(value, RTL_TEXTENCODING_UTF8); + fprintf(stdout, "L\"%s\"\n", uStr.getStr()); + delete[] value; + } + break; + case 4: + { + fprintf(stdout, "%sValue: Type = RG_VALUETYPE_BINARY\n", indent); + fprintf(stdout, "%s Size = %d\n", indent, valueSize); + fprintf(stdout, "%s Data = ", indent); + + RegistryTypeReader_Api* pReaderApi; + + pReaderApi = initRegistryTypeReader_Api(); + + RegistryTypeReader reader(pReaderApi, pBuffer, valueSize, sal_False); + + sIndent += " "; + if (!dumpType(reader, sIndent)) + { + fprintf(stdout, "\n"); + } + + } + break; + case 5: + { + sal_uInt32 offset = 4; // initial 4 Bytes fuer die Laenge des Arrays + sal_uInt32 len = 0; + + readUINT32(pBuffer, len); + + fprintf(stdout, "%sValue: Type = RG_VALUETYPE_LONGLIST\n", indent); + fprintf(stdout, "%s Size = %d\n", indent, valueSize); + fprintf(stdout, "%s Len = %d\n", indent, len); + fprintf(stdout, "%s Data = ", indent); + + sal_Int32 longValue; + for (int i=0; i < len; i++) + { + readINT32(pBuffer+offset, longValue); + + if (offset > 4) + fprintf(stdout, "%s ", indent); + + fprintf(stdout, "%d = %d\n", i, longValue); + offset += 4; // 4 Bytes fuer sal_Int32 + } + } + break; + case 6: + { + sal_uInt32 offset = 4; // initial 4 Bytes fuer die Laenge des Arrays + sal_uInt32 sLen = 0; + sal_uInt32 len = 0; + + readUINT32(pBuffer, len); + + fprintf(stdout, "%sValue: Type = RG_VALUETYPE_STRINGLIST\n", indent); + fprintf(stdout, "%s Size = %d\n", indent, valueSize); + fprintf(stdout, "%s Len = %d\n", indent, len); + fprintf(stdout, "%s Data = ", indent); + + sal_Char *pValue; + for (int i=0; i < len; i++) + { + readUINT32(pBuffer+offset, sLen); + + offset += 4; // 4 Bytes (sal_uInt32) fuer die Groesse des strings in Bytes + + pValue = (sal_Char*)rtl_allocateMemory(sLen); + readUtf8(pBuffer+offset, pValue, sLen); + + if (offset > 8) + fprintf(stdout, "%s ", indent); + + fprintf(stdout, "%d = \"%s\"\n", i, pValue); + offset += sLen; + } + } + break; + case 7: + { + sal_uInt32 offset = 4; // initial 4 Bytes fuer die Laenge des Arrays + sal_uInt32 sLen = 0; + sal_uInt32 len = 0; + + readUINT32(pBuffer, len); + + fprintf(stdout, "%sValue: Type = RG_VALUETYPE_UNICODELIST\n", indent); + fprintf(stdout, "%s Size = %d\n", indent, valueSize); + fprintf(stdout, "%s Len = %d\n", indent, len); + fprintf(stdout, "%s Data = ", indent); + + sal_Unicode *pValue; + OString uStr; + for (int i=0; i < len; i++) + { + readUINT32(pBuffer+offset, sLen); + + offset += 4; // 4 Bytes (sal_uInt32) fuer die Groesse des strings in Bytes + + pValue = (sal_Unicode*)rtl_allocateMemory((sLen / 2) * sizeof(sal_Unicode)); + readString(pBuffer+offset, pValue, sLen); + + if (offset > 8) + fprintf(stdout, "%s ", indent); + + uStr = OUStringToOString(pValue, RTL_TEXTENCODING_UTF8); + fprintf(stdout, "%d = L\"%s\"\n", i, uStr.getStr()); + + offset += sLen; + + rtl_freeMemory(pValue); + } + } + break; + } + + fprintf(stdout, "\n"); + + rtl_freeMemory(pBuffer); + return REG_NO_ERROR; +} + +//********************************************************************* +// dumpKey() +// +RegError ORegistry::dumpKey(const OUString& sPath, const OUString& sName, sal_Int16 nSpace) const +{ + OStoreDirectory rStoreDir; + OUString sFullPath(sPath); + OString sIndent; + storeAccessMode accessMode = KEY_MODE_OPEN; + RegError _ret = REG_NO_ERROR; + + if (isReadOnly()) + { + accessMode = KEY_MODE_OPENREAD; + } + + for (int i= 0; i < nSpace; i++) sIndent += " "; + + if (sFullPath.getLength() > 1) + sFullPath += ROOT; + + storeError _err = rStoreDir.create(m_file, sFullPath, sName, accessMode); + + if (_err == store_E_NotExists) + return REG_KEY_NOT_EXISTS; + else + if (_err == store_E_WrongFormat) + return REG_INVALID_KEY; + + fprintf(stdout, "%s/ %s\n", sIndent.getStr(), OUStringToOString(sName, RTL_TEXTENCODING_UTF8).getStr()); + + OUString sSubPath(sFullPath); + OUString sSubName; + sSubPath += sName; + + OStoreDirectory::iterator iter; + + _err = rStoreDir.first(iter); + + while ( _err == store_E_None) + { + sSubName = iter.m_pszName; + + if ( iter.m_nAttrib & STORE_ATTRIB_ISDIR ) + { + _ret = dumpKey(sSubPath, sSubName, nSpace+2); + } else + { + _ret = dumpValue(sSubPath, sSubName, nSpace+2); + } + + if (_ret) + { + return _ret; + } + + _err = rStoreDir.next(iter); + } + + return REG_NO_ERROR; +} + +//********************************************************************* +// createLink() +// +RegError ORegistry::createLink(RegKeyHandle hKey, + const OUString& linkName, + const OUString& linkTarget) +{ + ORegKey* pKey; + + if ( !linkName.getLength() ) + { + return REG_INVALID_LINKNAME; + } + + REG_GUARD(m_mutex); + + if (hKey) + pKey = (ORegKey*)hKey; + else + pKey = m_openKeyTable[ROOT]; + + OUString sFullLinkName = resolveLinks(pKey, linkName, sal_True); + + if (sFullLinkName.getLength() == 0) + return REG_DETECT_RECURSION; + + OStoreDirectory rStoreDir; + OUString sFullPath(ROOT); + + sal_uInt32 tokenCount = sFullLinkName.getTokenCount('/'); + sal_uInt32 actToken = 0; + OUString token; + + token = sFullLinkName.getToken(actToken, '/'); + + while ( actToken < tokenCount && token.getLength() > 0 ) + { + if (rStoreDir.create(pKey->getStoreFile(), sFullPath, token, KEY_MODE_CREATE)) + { + return REG_CREATE_KEY_FAILED; + } + + sFullPath += token; + sFullPath += ROOT; + + token = sFullLinkName.getToken(++actToken, '/'); + } + + pKey = new ORegKey(sFullLinkName, linkTarget, rStoreDir, this); + delete pKey; + + return REG_NO_ERROR; +} + +//********************************************************************* +// deleteLink() +// +RegError ORegistry::deleteLink(RegKeyHandle hKey, const OUString& linkName) +{ + ORegKey* pKey; + + if ( !linkName.getLength() ) + { + return REG_INVALID_LINKNAME; + } + + REG_GUARD(m_mutex); + + if (hKey) + pKey = (ORegKey*)hKey; + else + pKey = m_openKeyTable[ROOT]; + + OUString tmpPath(linkName); + OUString tmpName; + OUString resolvedPath; + sal_Int32 lastIndex = tmpPath.lastIndexOf('/'); + + if ( lastIndex > 0 && tmpPath.getStr()[0] == '/') + { + tmpName = tmpPath.copy(lastIndex); + + OUString linkPath = tmpPath.copy(0, lastIndex); + + resolvedPath = resolveLinks(pKey, linkPath); + + if ( !resolvedPath.getLength() ) + { + return REG_DETECT_RECURSION; + } + + resolvedPath += tmpName; + } else + { + resolvedPath = pKey->getName(); + + if (lastIndex != 0 && resolvedPath.getLength() > 1) + resolvedPath += ROOT; + + resolvedPath += linkName; + } + + pKey = m_openKeyTable[ROOT]; + + RegKeyType keyType; + RegError ret = REG_NO_ERROR; + if (ret = pKey->getKeyType(resolvedPath, &keyType)) + return ret; + + if (keyType != RG_LINKTYPE) + return REG_INVALID_LINK; + + return eraseKey(pKey, resolvedPath, RESOLVE_PART); +} + +//********************************************************************* +// resolveLinks() +// +OUString ORegistry::resolveLinks(ORegKey* pKey, const OUString& path, sal_Bool firstLinkOnly) +{ + OUString resolvedPath(pKey->getName()); + sal_uInt32 tokenCount = path.getTokenCount('/'); + sal_uInt32 actToken = 0; + OUString token; + ORegKey* pLink = NULL; + + if (resolvedPath.getLength() > 1) + resolvedPath += ROOT; + + if ( path.getStr()[0] == '/' ) + token = path.getToken(++actToken, '/'); + else + token = path.getToken(actToken, '/'); + + while ( actToken < tokenCount && token.getLength() > 0 ) + { + pLink = resolveLink(pKey, resolvedPath, token); + + if (pLink) + { + OUString tmpName; + sal_Int32 lastIndex; + + while(pLink) + { + if (!insertRecursionLink(pLink)) + { + resetRecursionLinks(); + delete pLink; + return OUString(); + } + + + lastIndex = resolvedPath.lastIndexOf('/'); + tmpName = resolvedPath.copy(lastIndex + 1); + resolvedPath = resolvedPath.copy(0, lastIndex + 1); + + pLink = resolveLink(pKey, resolvedPath, tmpName); + } + + resetRecursionLinks(); + } + + token = path.getToken(++actToken, '/'); + if ( token.getLength() ) + resolvedPath += ROOT; + } + + return resolvedPath; +} + +//********************************************************************* +// resolveLink() +// +ORegKey* ORegistry::resolveLink(ORegKey* pKey, OUString& resolvedPath, const OUString& name) +{ + OStoreDirectory rStoreDir; + ORegKey* pTmpKey = NULL; + + if ( !rStoreDir.create(pKey->getStoreFile(), resolvedPath, + name, KEY_MODE_OPENREAD) ) + { + resolvedPath += name; + pTmpKey = new ORegKey(resolvedPath, rStoreDir, pKey->getRegistry()); + RegKeyType keyType; + sal_Bool bIsLink=sal_False; + if (!pTmpKey->getKeyType(OUString(), &keyType) && (keyType == RG_LINKTYPE)) + { + resolvedPath = pTmpKey->getLinkTarget(); + return pTmpKey; + } + + delete pTmpKey; + return NULL; + } else + { + resolvedPath += name; + return NULL; + } +} + +sal_Bool ORegistry::insertRecursionLink(ORegKey* pLink) +{ + if (m_recursionList.empty()) + { + m_recursionList.push_back(pLink); + } else + { + LinkList::iterator iter = m_recursionList.begin(); + + while (iter != m_recursionList.end()) + { + if ((*iter)->getName() == pLink->getName()) + return sal_False; + + iter++; + } + m_recursionList.push_back(pLink); + } + + return sal_True; +} + +sal_Bool ORegistry::resetRecursionLinks() +{ + LinkList::iterator iter = m_recursionList.begin(); + + while (iter != m_recursionList.end()) + { + delete *iter; + iter++; + } + + m_recursionList.erase(m_recursionList.begin(), m_recursionList.end()); + + return sal_True; +} + + diff --git a/registry/source/regimpl.hxx b/registry/source/regimpl.hxx new file mode 100644 index 000000000000..458766bafe17 --- /dev/null +++ b/registry/source/regimpl.hxx @@ -0,0 +1,266 @@ +/************************************************************************* + * + * $RCSfile: regimpl.hxx,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:18:42 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +#ifndef _REGIMPL_HXX_ +#define _REGIMPL_HXX_ + +#include + +#ifndef _REGMAP_HXX_ +#include "regmap.hxx" +#endif + +#ifndef _OSL_MUTEX_HXX_ +#include +#endif + +#ifndef _STORE_STORE_HXX_ +#include +#endif + +#define REG_PAGESIZE 512 + +#define REG_MODE_CREATE store_AccessCreate +#define REG_MODE_OPEN store_AccessReadWrite +#define REG_MODE_OPENREAD store_AccessReadOnly + +#define KEY_MODE_CREATE store_AccessCreate +#define KEY_MODE_OPEN store_AccessReadWrite +#define KEY_MODE_OPENREAD store_AccessReadOnly + + +#define VALUE_MODE_CREATE store_AccessCreate +#define VALUE_MODE_OPEN store_AccessReadWrite +#define VALUE_MODE_OPENREAD store_AccessReadOnly + +#define VALUE_PREFIX "$VL_" +#define VALUE_LINKTARGET "$VL_LINK_TARGET" + +// 5 Bytes = 1 (Byte fuer den Typ) + 4 (Bytes fuer die Groesse der Daten) +#define VALUE_HEADERSIZE 5 +#define VALUE_TYPEOFFSET 1 +#define VALUE_HEADEROFFSET 5 + +#define REG_CREATE 0x0004 // allow write accesses + +#define REG_GUARD(mutex) \ + Guard< Mutex > aGuard( mutex ); + +using namespace rtl; +using namespace osl; +using namespace store; + +enum RESOLVE +{ + // alle Links werden aufgeloest + RESOLVE_FULL, + // alles bis zum letzten TeilStueck wird aufgeloest + RESOLVE_PART, + // kein Link wird aufgeloest + RESOLVE_NOTHING +}; + +class ORegManager; +class RegistryTypeReader; + +class ORegistry +{ +public: + ORegistry(); + + sal_uInt32 acquire() + { return ++m_refCount; } + + sal_uInt32 release() + { return --m_refCount; } + + RegError initRegistry(const OUString& name, + RegAccessMode accessMode); + + RegError closeRegistry(); + + RegError destroyRegistry(const OUString& name); + + RegError createKey(RegKeyHandle hKey, + const OUString& keyName, + RegKeyHandle* phNewKey); + + RegError openKey(RegKeyHandle hKey, + const OUString& keyName, + RegKeyHandle* phOpenKey, + RESOLVE eResolve=RESOLVE_FULL); + + RegError closeKey(RegKeyHandle hKey); + + RegError deleteKey(RegKeyHandle hKey, const OUString& keyName); + + RegError loadKey(RegKeyHandle hKey, + const OUString& regFileName, + sal_Bool bWarings=sal_False, + sal_Bool bReport=sal_False); + + RegError saveKey(RegKeyHandle hKey, + const OUString& regFileName, + sal_Bool bWarings=sal_False, + sal_Bool bReport=sal_False); + + RegError dumpRegistry(RegKeyHandle hKey) const; + + RegError createLink(RegKeyHandle hKey, + const OUString& linkName, + const OUString& linkTarget); + + RegError deleteLink(RegKeyHandle hKey, + const OUString& linkName); + +public: + virtual ~ORegistry(); + + sal_Bool isKeyOpen(const OUString& keyName) const; + sal_Bool isReadOnly() const + { return m_readOnly; } + + sal_Bool isOpen() const + { return m_isOpen; } + + ORegKey* getRootKey(); + + const OStoreFile& getStoreFile() + { return m_file; } + + const OUString& getName() const + { return m_name; } + + RegError getResolvedKeyName(RegKeyHandle hKey, + const OUString& keyName, + OUString& resolvedName, + sal_Bool firstLinkOnly=sal_False); + + friend class ORegKey; +protected: + RegError eraseKey(ORegKey* pKey, + const OUString& keyName, + RESOLVE eResolve=RESOLVE_FULL); + + RegError deleteSubkeysAndValues(ORegKey* pKey, + RESOLVE eResolve=RESOLVE_FULL); + + sal_uInt32 countSubKeys(ORegKey* pKey); + + RegError loadAndSaveValue(ORegKey* pTargetKey, + ORegKey* pSourceKey, + const OUString& valueName, + sal_uInt32 nCut, + sal_Bool bWarnings=sal_False, + sal_Bool bReport=sal_False); + + RegError checkBlop(OStoreStream& rValue, + ORegKey* pTargetKey, + const OUString& sTargetPath, + const OUString& valueName, + sal_uInt32 srcValueSize, + sal_uInt8* pSrcBuffer, + sal_Bool bReport=sal_False); + + RegError mergeModuleValue(OStoreStream& rTargetValue, + ORegKey* pTargetKey, + const OUString& sTargetPath, + const OUString& valueName, + RegistryTypeReader& reader, + RegistryTypeReader& reader2); + + RegError loadAndSaveKeys(ORegKey* pTargetKey, + ORegKey* pSourceKey, + const OUString& keyName, + sal_uInt32 nCut, + sal_Bool bWarnings=sal_False, + sal_Bool bReport=sal_False); + + RegError dumpValue(const OUString& sPath, + const OUString& sName, + sal_Int16 nSpace) const; + + RegError dumpKey(const OUString& sPath, + const OUString& sName, + sal_Int16 nSpace) const; + + OUString resolveLinks(ORegKey* pKey, const OUString& path, sal_Bool firstLinkOnly=sal_False); + ORegKey* resolveLink(ORegKey* pKey, OUString& resolvedPath, const OUString& name); + + sal_Bool insertRecursionLink(ORegKey* pLink); + sal_Bool resetRecursionLinks(); + +protected: + + sal_uInt32 m_refCount; + Mutex m_mutex; + sal_Bool m_readOnly; + sal_Bool m_isOpen; + OUString m_name; + OStoreFile m_file; + KeyMap m_openKeyTable; + LinkList m_recursionList; + + const OUString ROOT; +}; + +#endif + diff --git a/registry/source/registry.cxx b/registry/source/registry.cxx new file mode 100644 index 000000000000..1e6f4af4335b --- /dev/null +++ b/registry/source/registry.cxx @@ -0,0 +1,793 @@ +/************************************************************************* + * + * $RCSfile: registry.cxx,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:18:42 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +#include + +#ifndef _REGISTRY_REGISTRY_HXX_ +#include +#endif + +#ifndef _REGIMPL_HXX_ +#include "regimpl.hxx" +#endif + +#ifndef _REGKEY_HXX_ +#include "keyimpl.hxx" +#endif + +#include + +#if defined(WIN32) || defined(WNT) || defined(__OS2__) +#include +#endif + +#if defined(UNX) +#include +#include +#endif + +using namespace vos; + +#if defined ( GCC ) && ( defined ( SCO ) || defined ( NETBSD ) ) +ORealDynamicLoader* ODynamicLoader::m_pLoader = NULL; +#endif + +OString getTempName() +{ + OUString uTmpPattern; + sal_Char tmpPattern[512] = ""; + sal_Char *pTmpName = NULL; + + OStartupInfo StartupInfo; + + if (StartupInfo.getEnvironment(OUString( RTL_CONSTASCII_USTRINGPARAM("TMP") ), + uTmpPattern) != OStartupInfo::E_None) + { + if (StartupInfo.getEnvironment( OUString( RTL_CONSTASCII_USTRINGPARAM("TEMP") ), + uTmpPattern) != NAMESPACE_VOS(OStartupInfo)::E_None) + { +#if defined(WIN32) || defined(WNT) || defined(OS2) + strcpy(tmpPattern, "."); +#else + strcpy(tmpPattern, "/tmp"); +#endif + } + } + + if ( uTmpPattern.getLength() ) + { + strcpy(tmpPattern, OUStringToOString(uTmpPattern, RTL_TEXTENCODING_UTF8).getStr()); + } + +#if defined(WIN32) || defined(WNT) + strcat(tmpPattern, "\\reg_XXXXXX"); + pTmpName = mktemp(tmpPattern); +#endif + +#ifdef __OS2__ + strcpy(tmpPattern, tempnam(NULL, "reg_")); + pTmpName = tmpPattern; +#endif + +#ifdef UNX + strcat(tmpPattern, "/reg_XXXXXX"); + pTmpName = mktemp(tmpPattern); +#endif + + return OString(pTmpName); +} + +//********************************************************************* +// acquire +// +static void REGISTRY_CALLTYPE acquire(RegHandle hReg) +{ + ORegistry* pReg = (ORegistry*) hReg; + + if (pReg != NULL) + pReg->acquire(); +} + + +//********************************************************************* +// release +// +static void REGISTRY_CALLTYPE release(RegHandle hReg) +{ + ORegistry* pReg = (ORegistry*) hReg; + + if (pReg) + { + if (pReg->release() == 0) + { + delete pReg; + hReg = NULL; + } + } +} + + +//********************************************************************* +// getName +// +static RegError REGISTRY_CALLTYPE getName(RegHandle hReg, rtl_uString** pName) +{ + ORegistry* pReg; + + if (hReg) + { + pReg = (ORegistry*)hReg; + if ( pReg->isOpen() ) + { + rtl_uString_assign(pName, pReg->getName().pData); + return REG_NO_ERROR; + } else + { + rtl_uString_new(pName); + return REG_REGISTRY_NOT_OPEN; + } + } + + rtl_uString_new(pName); + return REG_INVALID_REGISTRY; +} + + +//********************************************************************* +// isReadOnly +// +static sal_Bool REGISTRY_CALLTYPE isReadOnly(RegHandle hReg) +{ + if (hReg) + return ((ORegistry*)hReg)->isReadOnly(); + else + return sal_False; +} + + +//********************************************************************* +// createRegistry +// +static RegError REGISTRY_CALLTYPE createRegistry(rtl_uString* registryName, + RegHandle* phRegistry) +{ + RegError ret; + + ORegistry* pReg = new ORegistry(); + if (ret = pReg->initRegistry(registryName, REG_CREATE)) + { + *phRegistry = NULL; + return ret; + } + + *phRegistry = pReg; + + return REG_NO_ERROR; +} + +//********************************************************************* +// openRootKey +// +static RegError REGISTRY_CALLTYPE openRootKey(RegHandle hReg, + RegKeyHandle* phRootKey) +{ + ORegistry* pReg; + + if (hReg) + { + pReg = (ORegistry*)hReg; + if (!pReg->isOpen()) + return REG_REGISTRY_NOT_OPEN; + } else + { + phRootKey = NULL; + return REG_INVALID_REGISTRY; + } + + *phRootKey = pReg->getRootKey(); + + return REG_NO_ERROR; +} + + +//********************************************************************* +// openRegistry +// +static RegError REGISTRY_CALLTYPE openRegistry(rtl_uString* registryName, + RegHandle* phRegistry, + RegAccessMode accessMode) +{ + RegError _ret; + + ORegistry* pReg = new ORegistry(); + if (_ret = pReg->initRegistry(registryName, accessMode)) + { + *phRegistry = NULL; + delete pReg; + return _ret; + } + + + *phRegistry = pReg; + + return REG_NO_ERROR; +} + +//********************************************************************* +// closeRegistry +// +static RegError REGISTRY_CALLTYPE closeRegistry(RegHandle hReg) +{ + ORegistry *pReg; + + if (hReg) + { + pReg = (ORegistry*)hReg; + if (!pReg->isOpen()) + return REG_REGISTRY_NOT_OPEN; + + RegError ret = REG_NO_ERROR; + if (pReg->release() == 0) + { + delete(pReg); + hReg = NULL; + } + else + ret = pReg->closeRegistry(); + + return ret; + } else + { + return REG_INVALID_REGISTRY; + } +} + + +//********************************************************************* +// destroyRegistry +// +static RegError REGISTRY_CALLTYPE destroyRegistry(RegHandle hReg, + rtl_uString* registryName) +{ + ORegistry *pReg; + + if (hReg) + { + pReg = (ORegistry*)hReg; + if (!pReg->isOpen()) + return REG_INVALID_REGISTRY; + + RegError ret = REG_NO_ERROR; + if (!(ret = pReg->destroyRegistry(registryName))) + { + if (!registryName->length) + { + delete(pReg); + hReg = NULL; + } + } + return ret; + } else + { + return REG_INVALID_REGISTRY; + } +} + + +//********************************************************************* +// loadRegKey +// +static RegError REGISTRY_CALLTYPE loadKey(RegHandle hReg, + RegKeyHandle hKey, + rtl_uString* keyName, + rtl_uString* regFileName) +{ + ORegistry *pReg; + ORegKey *pKey, *pNewKey; + RegError _ret; + + if (hReg) + { + pReg = (ORegistry*)hReg; + if (!pReg->isOpen()) + return REG_REGISTRY_NOT_OPEN; + } else + { + return REG_INVALID_REGISTRY; + } + + if (hKey) + { + pKey = (ORegKey*)hKey; + + if (pKey->getRegistry() != pReg || pKey->isDeleted()) + return REG_INVALID_KEY; + } else + { + return REG_INVALID_KEY; + } + + if (pKey->isReadOnly()) + return REG_REGISTRY_READONLY; + + if (!pKey->openKey(keyName, (RegKeyHandle*)&pNewKey)) + { + pKey->closeKey(pNewKey); + pKey->deleteKey(keyName); + } + + if (_ret = pKey->createKey(keyName, (RegKeyHandle*)&pNewKey)) + return _ret; + + if (_ret = pReg->loadKey(pNewKey, regFileName)) + { + pKey->closeKey(pNewKey); + pKey->deleteKey(keyName); + return _ret; + } + + return pKey->closeKey(pNewKey); +} + +//********************************************************************* +// saveKey +// +static RegError REGISTRY_CALLTYPE saveKey(RegHandle hReg, + RegKeyHandle hKey, + rtl_uString* keyName, + rtl_uString* regFileName) +{ + ORegistry *pReg; + ORegKey *pKey, *pNewKey; + RegError _ret; + + if (hReg) + { + pReg = (ORegistry*)hReg; + if (!pReg->isOpen()) + return REG_REGISTRY_NOT_OPEN; + } else + { + return REG_INVALID_REGISTRY; + } + + if (hKey) + { + pKey = (ORegKey*)hKey; + + if (pKey->getRegistry() != pReg || pKey->isDeleted()) + return REG_INVALID_KEY; + } else + { + return REG_INVALID_KEY; + } + + if (_ret = pKey->openKey(keyName, (RegKeyHandle*)&pNewKey)) + return _ret; + + if (_ret = pReg->saveKey(pNewKey, regFileName)) + { + pKey->closeKey(pNewKey); + return _ret; + } + + return pKey->closeKey(pNewKey); +} + +//********************************************************************* +// mergeKey +// +static RegError REGISTRY_CALLTYPE mergeKey(RegHandle hReg, + RegKeyHandle hKey, + rtl_uString* keyName, + rtl_uString* regFileName, + sal_Bool bWarnings, + sal_Bool bReport) +{ + ORegistry *pReg; + ORegKey *pKey, *pNewKey; + RegError _ret; + + if (hReg) + { + pReg = (ORegistry*)hReg; + if (!pReg->isOpen()) + return(REG_REGISTRY_NOT_OPEN); + } else + { + return REG_INVALID_REGISTRY; + } + + if (hKey) + { + pKey = (ORegKey*)hKey; + + if (pKey->getRegistry() != pReg || pKey->isDeleted()) + return REG_INVALID_KEY; + } else + { + return REG_INVALID_KEY; + } + + if (pKey->isReadOnly()) + return REG_REGISTRY_READONLY; + + if (keyName->length) + { + if (_ret = pKey->createKey(keyName, (RegKeyHandle*)&pNewKey) ) + return _ret; + } else + { + pNewKey = pKey; + } + + /* + OString tmpName = getTempName(); + pReg->saveKey(pNewKey, tmpName, sal_False, sal_False); + */ + _ret = pKey->getRegistry()->loadKey(pNewKey, regFileName, bWarnings, bReport); + /* + if (_ret) + { + if (_ret == REG_MERGE_ERROR || + (_ret == REG_MERGE_CONFLICT && bWarnings)) + { + pKey->closeKey(pNewKey); + pKey->deleteKey(keyName); + pKey->createKey(keyName, (RegKeyHandle*)&pNewKey); + pReg->loadKey(pNewKey, tmpName, sal_False, sal_False); + } + + destroyRegistry(hReg, tmpName); + + pKey->closeKey(pNewKey); + return _ret; + } + + destroyRegistry(hReg, tmpName); + */ + if ( pKey != pNewKey ) + _ret = pKey->closeKey(pNewKey); + + return _ret; +} + + +//********************************************************************* +// dumpRegistry +// +static RegError REGISTRY_CALLTYPE dumpRegistry(RegHandle hReg, + RegKeyHandle hKey) +{ + ORegistry *pReg; + ORegKey *pKey; + + if (hReg) + { + pReg = (ORegistry*)hReg; + if (!pReg->isOpen()) + return REG_REGISTRY_NOT_OPEN; + } else + { + return REG_INVALID_REGISTRY; + } + + if (hKey) + { + pKey = (ORegKey*)hKey; + + if (pKey->getRegistry() != pReg || pKey->isDeleted()) + return REG_INVALID_KEY; + } else + { + return REG_INVALID_KEY; + } + + return pReg->dumpRegistry(hKey); +} + + +//********************************************************************* +// initRegistry_Api +// +void REGISTRY_CALLTYPE acquireKey(RegKeyHandle); +void REGISTRY_CALLTYPE releaseKey(RegKeyHandle); +sal_Bool REGISTRY_CALLTYPE isKeyReadOnly(RegKeyHandle); +RegError REGISTRY_CALLTYPE getKeyName(RegKeyHandle, rtl_uString**); +RegError REGISTRY_CALLTYPE createKey(RegKeyHandle, rtl_uString*, RegKeyHandle*); +RegError REGISTRY_CALLTYPE openKey(RegKeyHandle, rtl_uString*, RegKeyHandle*); +RegError REGISTRY_CALLTYPE openSubKeys(RegKeyHandle, rtl_uString*, RegKeyHandle**, sal_uInt32*); +RegError REGISTRY_CALLTYPE closeSubKeys(RegKeyHandle*, sal_uInt32); +RegError REGISTRY_CALLTYPE deleteKey(RegKeyHandle, rtl_uString*); +RegError REGISTRY_CALLTYPE closeKey(RegKeyHandle); +RegError REGISTRY_CALLTYPE setValue(RegKeyHandle, rtl_uString*, RegValueType, RegValue, sal_uInt32); +RegError REGISTRY_CALLTYPE setLongListValue(RegKeyHandle, rtl_uString*, sal_Int32*, sal_uInt32); +RegError REGISTRY_CALLTYPE setStringListValue(RegKeyHandle, rtl_uString*, sal_Char**, sal_uInt32); +RegError REGISTRY_CALLTYPE setUnicodeListValue(RegKeyHandle, rtl_uString*, sal_Unicode**, sal_uInt32); +RegError REGISTRY_CALLTYPE getValueInfo(RegKeyHandle, rtl_uString*, RegValueType*, sal_uInt32*); +RegError REGISTRY_CALLTYPE getValue(RegKeyHandle, rtl_uString*, RegValue); +RegError REGISTRY_CALLTYPE getLongListValue(RegKeyHandle, rtl_uString*, sal_Int32**, sal_uInt32*); +RegError REGISTRY_CALLTYPE getStringListValue(RegKeyHandle, rtl_uString*, sal_Char***, sal_uInt32*); +RegError REGISTRY_CALLTYPE getUnicodeListValue(RegKeyHandle, rtl_uString*, sal_Unicode***, sal_uInt32*); +RegError REGISTRY_CALLTYPE freeValueList(RegValueType, RegValue, sal_uInt32); +RegError REGISTRY_CALLTYPE createLink(RegKeyHandle, rtl_uString*, rtl_uString*); +RegError REGISTRY_CALLTYPE deleteLink(RegKeyHandle, rtl_uString*); +RegError REGISTRY_CALLTYPE getKeyType(RegKeyHandle, rtl_uString*, RegKeyType*); +RegError REGISTRY_CALLTYPE getLinkTarget(RegKeyHandle, rtl_uString*, rtl_uString**); +RegError REGISTRY_CALLTYPE getResolvedKeyName(RegKeyHandle, rtl_uString*, sal_Bool, rtl_uString**); +RegError REGISTRY_CALLTYPE getKeyNames(RegKeyHandle, rtl_uString*, rtl_uString***, sal_uInt32*); +RegError REGISTRY_CALLTYPE freeKeyNames(rtl_uString**, sal_uInt32); + + +extern "C" Registry_Api* REGISTRY_CALLTYPE initRegistry_Api(void) +{ + static Registry_Api aApi= {&acquire, + &release, + &isReadOnly, + &openRootKey, + &getName, + &createRegistry, + &openRegistry, + &closeRegistry, + &destroyRegistry, + &loadKey, + &saveKey, + &mergeKey, + &dumpRegistry, + &acquireKey, + &releaseKey, + &isKeyReadOnly, + &getKeyName, + &createKey, + &openKey, + &openSubKeys, + &closeSubKeys, + &deleteKey, + &closeKey, + &setValue, + &setLongListValue, + &setStringListValue, + &setUnicodeListValue, + &getValueInfo, + &getValue, + &getLongListValue, + &getStringListValue, + &getUnicodeListValue, + &freeValueList, + &createLink, + &deleteLink, + &getKeyType, + &getLinkTarget, + &getResolvedKeyName, + &getKeyNames, + &freeKeyNames}; + + return (&aApi); +} + + +//********************************************************************* +// reg_loadRegKey +// +RegError REGISTRY_CALLTYPE reg_loadKey(RegKeyHandle hKey, + rtl_uString* keyName, + rtl_uString* regFileName) +{ + ORegKey *pKey; + + if (hKey) + pKey = (ORegKey*)hKey; + else + return REG_INVALID_KEY; + + return loadKey(pKey->getRegistry(), hKey, keyName, regFileName); +} + +//********************************************************************* +// reg_saveKey +// +RegError REGISTRY_CALLTYPE reg_saveKey(RegKeyHandle hKey, + rtl_uString* keyName, + rtl_uString* regFileName) +{ + ORegKey *pKey; + + if (hKey) + pKey = (ORegKey*)hKey; + else + return REG_INVALID_KEY; + + return saveKey(pKey->getRegistry(), hKey, keyName, regFileName); +} + +//********************************************************************* +// reg_mergeKey +// +RegError REGISTRY_CALLTYPE reg_mergeKey(RegKeyHandle hKey, + rtl_uString* keyName, + rtl_uString* regFileName, + sal_Bool bWarnings, + sal_Bool bReport) +{ + ORegKey *pKey; + + if (hKey) + pKey = (ORegKey*)hKey; + else + return REG_INVALID_KEY; + + return mergeKey(pKey->getRegistry(), hKey, keyName, regFileName, bWarnings, bReport); +} + +//********************************************************************* +// reg_createRegistry +// +RegError REGISTRY_CALLTYPE reg_createRegistry(rtl_uString* registryName, + RegHandle* phRegistry) +{ + RegError ret; + + ORegistry* pReg = new ORegistry(); + if (ret = pReg->initRegistry(registryName, REG_CREATE)) + { + *phRegistry = NULL; + return ret; + } + + *phRegistry = pReg; + + return REG_NO_ERROR; +} + +//********************************************************************* +// reg_openRootKey +// +RegError REGISTRY_CALLTYPE reg_openRootKey(RegHandle hRegistry, + RegKeyHandle* phRootKey) +{ + return openRootKey(hRegistry, phRootKey); +} + + +//********************************************************************* +// reg_getName +// +const RegError REGISTRY_CALLTYPE reg_getName(RegHandle hRegistry, rtl_uString** pName) +{ + return getName(hRegistry, pName); +} + + +//********************************************************************* +// reg_isReadOnly +// +sal_Bool REGISTRY_CALLTYPE reg_isReadOnly(RegHandle hRegistry) +{ + return isReadOnly(hRegistry); +} + + +//********************************************************************* +// reg_openRegistry +// +RegError REGISTRY_CALLTYPE reg_openRegistry(rtl_uString* registryName, + RegHandle* phRegistry, + RegAccessMode accessMode) +{ + RegError _ret; + + ORegistry* pReg = new ORegistry(); + if (_ret = pReg->initRegistry(registryName, accessMode)) + { + *phRegistry = NULL; + return _ret; + } + + *phRegistry = pReg; + + return REG_NO_ERROR; +} + +//********************************************************************* +// reg_closeRegistry +// +RegError REGISTRY_CALLTYPE reg_closeRegistry(RegHandle hRegistry) +{ + ORegistry* pReg; + + if (hRegistry) + { + pReg = (ORegistry*)hRegistry; + delete(pReg); + return REG_NO_ERROR; + } else + { + return REG_REGISTRY_NOT_OPEN; + } +} + + +//********************************************************************* +// reg_destroyRegistry +// +RegError REGISTRY_CALLTYPE reg_destroyRegistry(RegHandle hRegistry, + rtl_uString* registryName) +{ + return destroyRegistry(hRegistry, registryName); +} + + +//********************************************************************* +// reg_dumpRegistry +// +RegError REGISTRY_CALLTYPE reg_dumpRegistry(RegKeyHandle hKey) +{ + ORegKey *pKey; + + if (hKey) + pKey = (ORegKey*)hKey; + else + return REG_INVALID_KEY; + + return dumpRegistry(pKey->getRegistry(), hKey); +} + + diff --git a/registry/source/regkey.cxx b/registry/source/regkey.cxx new file mode 100644 index 000000000000..7da6044705a2 --- /dev/null +++ b/registry/source/regkey.cxx @@ -0,0 +1,1298 @@ +/************************************************************************* + * + * $RCSfile: regkey.cxx,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:18:43 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +#ifndef _REGISTRY_REGISTRY_HXX_ +#include +#endif + +#ifndef _RTL_ALLOC_H_ +#include +#endif + +#ifndef _REGIMPL_HXX_ +#include "regimpl.hxx" +#endif + +#ifndef _KEYIMPL_HXX_ +#include "keyimpl.hxx" +#endif + + +//********************************************************************* +// acquireKey +// +void REGISTRY_CALLTYPE acquireKey(RegKeyHandle hKey) +{ + ORegKey* pKey = (ORegKey*) hKey; + + if (pKey != NULL) + pKey->acquire(); +} + + +//********************************************************************* +// releaseKey +// +void REGISTRY_CALLTYPE releaseKey(RegKeyHandle hKey) +{ + ORegKey* pKey = (ORegKey*) hKey; + + if (pKey) + { + if (pKey->release() == 0) + delete pKey; + } +} + + +//********************************************************************* +// isKeyReadOnly +// +sal_Bool REGISTRY_CALLTYPE isKeyReadOnly(RegKeyHandle hKey) +{ + if (hKey) + { + return ((ORegKey*)hKey)->isReadOnly(); + } else + { + return sal_False; + } +} + + +//********************************************************************* +// getKeyName +// +RegError REGISTRY_CALLTYPE getKeyName(RegKeyHandle hKey, rtl_uString** pKeyName) +{ + if (hKey) + { + rtl_uString_assign( pKeyName, ((ORegKey*)hKey)->getName().pData ); + return REG_NO_ERROR; + } else + { + rtl_uString_new(pKeyName); + return REG_INVALID_KEY; + } +} + + +//********************************************************************* +// createKey +// +RegError REGISTRY_CALLTYPE createKey(RegKeyHandle hKey, + rtl_uString* keyName, + RegKeyHandle* phNewKey) +{ + ORegKey* pKey; + + if (hKey) + { + pKey = (ORegKey*)hKey; + + if (pKey->isDeleted()) + { + phNewKey = NULL; + return REG_INVALID_KEY; + } + } else + { + phNewKey = NULL; + return REG_INVALID_KEY; + } + + if (pKey->isReadOnly()) + return REG_REGISTRY_READONLY; + + return pKey->createKey(keyName, phNewKey); +} + +//********************************************************************* +// openKey +// +RegError REGISTRY_CALLTYPE openKey(RegKeyHandle hKey, + rtl_uString* keyName, + RegKeyHandle* phOpenKey) +{ + ORegKey* pKey; + + if (hKey) + { + pKey = (ORegKey*)hKey; + + if (pKey->isDeleted()) + { + phOpenKey = NULL; + return REG_INVALID_KEY; + } + } else + { + phOpenKey = NULL; + return REG_INVALID_KEY; + } + + return pKey->openKey(keyName, phOpenKey); +} + +//********************************************************************* +// openSubKeys +// +RegError REGISTRY_CALLTYPE openSubKeys(RegKeyHandle hKey, + rtl_uString* keyName, + RegKeyHandle** pphSubKeys, + sal_uInt32* pnSubKeys) +{ + ORegKey* pKey; + + if (hKey) + { + pKey = (ORegKey*)hKey; + + if (pKey->isDeleted()) + { + pphSubKeys = NULL; + return REG_INVALID_KEY; + } + } else + { + pphSubKeys = NULL; + return REG_INVALID_KEY; + } + + return pKey->openSubKeys(keyName, pphSubKeys, pnSubKeys); +} + +//********************************************************************* +// closeSubKeys +// +RegError REGISTRY_CALLTYPE closeSubKeys(RegKeyHandle* phSubKeys, + sal_uInt32 nSubKeys) +{ + RegError _ret = REG_NO_ERROR; + + if (phSubKeys) + { + ORegistry* pReg = NULL; + + pReg = ((ORegKey*)phSubKeys[0])->getRegistry(); + + for (int i=0; (i < nSubKeys) && (_ret == REG_NO_ERROR); i++) + { + _ret = pReg->closeKey(phSubKeys[i]); + } + + rtl_freeMemory(phSubKeys); + } + else + _ret = REG_INVALID_KEY; + + return _ret; +} + + +//********************************************************************* +// deleteKey +// +RegError REGISTRY_CALLTYPE deleteKey(RegKeyHandle hKey, + rtl_uString* keyName) +{ + ORegKey* pKey; + + if (hKey) + { + pKey = (ORegKey*)hKey; + + if (pKey->isDeleted()) + return REG_INVALID_KEY; + } else + return REG_INVALID_KEY; + + if (pKey->isReadOnly()) + return REG_REGISTRY_READONLY; + + return pKey->deleteKey(keyName); +} + +//********************************************************************* +// closeKey +// +RegError REGISTRY_CALLTYPE closeKey(RegKeyHandle hKey) +{ + ORegKey* pKey; + ORegistry* pReg; + + if (hKey) + { + pKey = (ORegKey*)hKey; + + pReg = pKey->getRegistry(); + + if (pReg->closeKey(hKey)) + return REG_INVALID_KEY; + } else + return REG_INVALID_KEY; + + return REG_NO_ERROR; +} + + +//********************************************************************* +// setValue +// +RegError REGISTRY_CALLTYPE setValue(RegKeyHandle hKey, + rtl_uString* keyName, + RegValueType valueType, + RegValue pData, + sal_uInt32 valueSize) +{ + ORegKey* pKey; + + if (hKey) + { + pKey = (ORegKey*)hKey; + + if (pKey->isDeleted()) + return REG_INVALID_KEY; + } else + return REG_INVALID_KEY; + + if (pKey->isReadOnly()) + return REG_REGISTRY_READONLY; + + OUString valueName( RTL_CONSTASCII_USTRINGPARAM("value") ); + if (keyName->length) + { + RegKeyHandle hSubKey; + ORegKey* pSubKey; + RegError _ret1, _ret2; + if (_ret1 = pKey->openKey(keyName, &hSubKey)) + return _ret1; + + pSubKey = (ORegKey*)hSubKey; + if (_ret1 = pSubKey->setValue(valueName, valueType, pData, valueSize)) + { + if (_ret2 = pKey->closeKey(hSubKey)) + return _ret2; + else + return _ret1; + } + + return pKey->closeKey(hSubKey); + } + + return pKey->setValue(valueName, valueType, pData, valueSize); +} + +//********************************************************************* +// setLongValueList +// +RegError REGISTRY_CALLTYPE setLongListValue(RegKeyHandle hKey, + rtl_uString* keyName, + sal_Int32* pValueList, + sal_uInt32 len) +{ + ORegKey* pKey; + + if (hKey) + { + pKey = (ORegKey*)hKey; + + if (pKey->isDeleted()) + return REG_INVALID_KEY; + } else + return REG_INVALID_KEY; + + if (pKey->isReadOnly()) + return REG_REGISTRY_READONLY; + + OUString valueName( RTL_CONSTASCII_USTRINGPARAM("value") ); + if (keyName->length) + { + RegKeyHandle hSubKey; + ORegKey* pSubKey; + RegError _ret1, _ret2; + if (_ret1 = pKey->openKey(keyName, &hSubKey)) + return _ret1; + + pSubKey = (ORegKey*)hSubKey; + if (_ret1 = pSubKey->setLongListValue(valueName, pValueList, len)) + { + if (_ret2 = pKey->closeKey(hSubKey)) + return _ret2; + else + return _ret1; + } + + return pKey->closeKey(hSubKey); + } + + return pKey->setLongListValue(valueName, pValueList, len); +} + +//********************************************************************* +// setStringValueList +// +RegError REGISTRY_CALLTYPE setStringListValue(RegKeyHandle hKey, + rtl_uString* keyName, + sal_Char** pValueList, + sal_uInt32 len) +{ + ORegKey* pKey; + + if (hKey) + { + pKey = (ORegKey*)hKey; + + if (pKey->isDeleted()) + return REG_INVALID_KEY; + } else + return REG_INVALID_KEY; + + if (pKey->isReadOnly()) + return REG_REGISTRY_READONLY; + + OUString valueName( RTL_CONSTASCII_USTRINGPARAM("value") ); + if (keyName->length) + { + RegKeyHandle hSubKey; + ORegKey* pSubKey; + RegError _ret1, _ret2; + if (_ret1 = pKey->openKey(keyName, &hSubKey)) + return _ret1; + + pSubKey = (ORegKey*)hSubKey; + if (_ret1 = pSubKey->setStringListValue(valueName, pValueList, len)) + { + if (_ret2 = pKey->closeKey(hSubKey)) + return _ret2; + else + return _ret1; + } + + return pKey->closeKey(hSubKey); + } + + return pKey->setStringListValue(valueName, pValueList, len); +} + +//********************************************************************* +// setUnicodeValueList +// +RegError REGISTRY_CALLTYPE setUnicodeListValue(RegKeyHandle hKey, + rtl_uString* keyName, + sal_Unicode** pValueList, + sal_uInt32 len) +{ + ORegKey* pKey; + + if (hKey) + { + pKey = (ORegKey*)hKey; + + if (pKey->isDeleted()) + return REG_INVALID_KEY; + } else + return REG_INVALID_KEY; + + if (pKey->isReadOnly()) + return REG_REGISTRY_READONLY; + + OUString valueName( RTL_CONSTASCII_USTRINGPARAM("value") ); + if (keyName->length) + { + RegKeyHandle hSubKey; + ORegKey* pSubKey; + RegError _ret1, _ret2; + if (_ret1 = pKey->openKey(keyName, &hSubKey)) + return _ret1; + + pSubKey = (ORegKey*)hSubKey; + if (_ret1 = pSubKey->setUnicodeListValue(valueName, pValueList, len)) + { + if (_ret2 = pKey->closeKey(hSubKey)) + return _ret2; + else + return _ret1; + } + + return pKey->closeKey(hSubKey); + } + + return pKey->setUnicodeListValue(valueName, pValueList, len); +} + +//********************************************************************* +// getValueInfo +// +RegError REGISTRY_CALLTYPE getValueInfo(RegKeyHandle hKey, + rtl_uString* keyName, + RegValueType* pValueType, + sal_uInt32* pValueSize) +{ + ORegKey* pKey; + RegValueType valueType; + sal_uInt32 valueSize; + + *pValueType = RG_VALUETYPE_NOT_DEFINED; + *pValueSize = 0; + + if (hKey) + { + pKey = (ORegKey*)hKey; + + if (pKey->isDeleted()) + return REG_INVALID_KEY; + } else + return REG_INVALID_KEY; + + OUString valueName( RTL_CONSTASCII_USTRINGPARAM("value") ); + if (keyName->length) + { + RegKeyHandle hSubKey; + ORegKey* pSubKey; + RegError _ret; + if (_ret = pKey->openKey(keyName, &hSubKey)) + return _ret; + + pSubKey = (ORegKey*)hSubKey; + if (pSubKey->getValueInfo(valueName, &valueType, &valueSize)) + { + if (_ret = pKey->closeKey(hSubKey)) + return _ret; + else + return REG_INVALID_VALUE; + } + + *pValueType = valueType; + *pValueSize = valueSize; + + return pKey->closeKey(hSubKey); + } + + + if (pKey->getValueInfo(valueName, &valueType, &valueSize)) + { + return REG_INVALID_VALUE; + } + + *pValueType = valueType; + *pValueSize = valueSize; + + return REG_NO_ERROR; +} + +//********************************************************************* +// getValueInfo +// +RegError REGISTRY_CALLTYPE getValue(RegKeyHandle hKey, + rtl_uString* keyName, + RegValue pValue) +{ + ORegKey* pKey; + + if (hKey) + { + pKey = (ORegKey*)hKey; + + if (pKey->isDeleted()) + { + pValue = NULL; + return REG_INVALID_KEY; + } + } else + { + pValue = NULL; + return REG_INVALID_KEY; + } + + OUString valueName( RTL_CONSTASCII_USTRINGPARAM("value") ); + if (keyName->length) + { + RegKeyHandle hSubKey; + ORegKey* pSubKey; + RegError _ret1, _ret2; + if (_ret1 = pKey->openKey(keyName, &hSubKey)) + { + pValue = NULL; + return _ret1; + } + + pSubKey = (ORegKey*)hSubKey; + if (_ret1 = pSubKey->getValue(valueName, pValue)) + { + if (_ret2 = pKey->closeKey(hSubKey)) + { + pValue = NULL; + return _ret2; + } else + { + pValue = NULL; + return _ret1; + } + } + + return pKey->closeKey(hSubKey); + } + + return pKey->getValue(valueName, pValue); +} + +//********************************************************************* +// getLongValueList +// +RegError REGISTRY_CALLTYPE getLongListValue(RegKeyHandle hKey, + rtl_uString* keyName, + sal_Int32** pValueList, + sal_uInt32* pLen) +{ + ORegKey* pKey; + + if (hKey) + { + pKey = (ORegKey*)hKey; + + if (pKey->isDeleted()) + { + pValueList = NULL; + *pLen = 0; + return REG_INVALID_KEY; + } + } else + { + pValueList = NULL; + *pLen = 0; + return REG_INVALID_KEY; + } + + OUString valueName( RTL_CONSTASCII_USTRINGPARAM("value") ); + if (keyName->length) + { + RegKeyHandle hSubKey; + ORegKey* pSubKey; + RegError _ret1, _ret2; + if (_ret1 = pKey->openKey(keyName, &hSubKey)) + { + pValueList = NULL; + *pLen = 0; + return _ret1; + } + + pSubKey = (ORegKey*)hSubKey; + + if (_ret1 = pSubKey->getLongListValue(valueName, pValueList, pLen)) + { + if (_ret2 = pKey->closeKey(hSubKey)) + { + pValueList = NULL; + *pLen = 0; + return _ret2; + } else + { + pValueList = NULL; + *pLen = 0; + return _ret1; + } + } + + return pKey->closeKey(hSubKey); + } + + return pKey->getLongListValue(valueName, pValueList, pLen); +} + +//********************************************************************* +// getStringValueList +// +RegError REGISTRY_CALLTYPE getStringListValue(RegKeyHandle hKey, + rtl_uString* keyName, + sal_Char*** pValueList, + sal_uInt32* pLen) +{ + ORegKey* pKey; + + if (hKey) + { + pKey = (ORegKey*)hKey; + + if (pKey->isDeleted()) + { + pValueList = NULL; + *pLen = 0; + return REG_INVALID_KEY; + } + } else + { + pValueList = NULL; + *pLen = 0; + return REG_INVALID_KEY; + } + + OUString valueName( RTL_CONSTASCII_USTRINGPARAM("value") ); + if (keyName->length) + { + RegKeyHandle hSubKey; + ORegKey* pSubKey; + RegError _ret1, _ret2; + if ((_ret1 = pKey->openKey(keyName, &hSubKey))) + { + pValueList = NULL; + *pLen = 0; + return _ret1; + } + + pSubKey = (ORegKey*)hSubKey; + + if (_ret1 = pSubKey->getStringListValue(valueName, pValueList, pLen)) + { + if (_ret2 = pKey->closeKey(hSubKey)) + { + pValueList = NULL; + *pLen = 0; + return _ret2; + } else + { + pValueList = NULL; + *pLen = 0; + return _ret1; + } + } + + return pKey->closeKey(hSubKey); + } + + return pKey->getStringListValue(valueName, pValueList, pLen); +} + +//********************************************************************* +// getUnicodeListValue +// +RegError REGISTRY_CALLTYPE getUnicodeListValue(RegKeyHandle hKey, + rtl_uString* keyName, + sal_Unicode*** pValueList, + sal_uInt32* pLen) +{ + ORegKey* pKey; + + if (hKey) + { + pKey = (ORegKey*)hKey; + + if (pKey->isDeleted()) + { + pValueList = NULL; + *pLen = 0; + return REG_INVALID_KEY; + } + } else + { + pValueList = NULL; + *pLen = 0; + return REG_INVALID_KEY; + } + + OUString valueName( RTL_CONSTASCII_USTRINGPARAM("value") ); + if (keyName->length) + { + RegKeyHandle hSubKey; + ORegKey* pSubKey; + RegError _ret1, _ret2; + if (_ret1 = pKey->openKey(keyName, &hSubKey)) + { + pValueList = NULL; + *pLen = 0; + return _ret1; + } + + pSubKey = (ORegKey*)hSubKey; + + if (_ret1 = pSubKey->getUnicodeListValue(valueName, pValueList, pLen)) + { + if (_ret2 = pKey->closeKey(hSubKey)) + { + pValueList = NULL; + *pLen = 0; + return _ret2; + } else + { + pValueList = NULL; + *pLen = 0; + return _ret1; + } + } + + return pKey->closeKey(hSubKey); + } + + return pKey->getUnicodeListValue(valueName, pValueList, pLen); +} + +//********************************************************************* +// freeValueList +// +RegError REGISTRY_CALLTYPE freeValueList(RegValueType valueType, + RegValue pValueList, + sal_uInt32 len) +{ + switch (valueType) + { + case 5: + { + sal_Int32* pVList = (sal_Int32*)pValueList; + rtl_freeMemory(pValueList); + } + break; + case 6: + { + sal_Char** pVList = (sal_Char**)pValueList; + for (int i=0; i < len; i++) + { + rtl_freeMemory(pVList[i]); + } + + rtl_freeMemory(pVList); + } + break; + case 7: + { + sal_Unicode** pVList = (sal_Unicode**)pValueList; + for (int i=0; i < len; i++) + { + rtl_freeMemory(pVList[i]); + } + + rtl_freeMemory(pVList); + } + break; + default: + return REG_INVALID_VALUE; + } + + pValueList = NULL; + return REG_NO_ERROR; +} + + +//********************************************************************* +// createLink +// +RegError REGISTRY_CALLTYPE createLink(RegKeyHandle hKey, + rtl_uString* linkName, + rtl_uString* linkTarget) +{ + ORegKey* pKey; + + if (hKey) + { + pKey = (ORegKey*)hKey; + + if (pKey->isDeleted()) + return REG_INVALID_KEY; + } else + return REG_INVALID_KEY; + + if (pKey->isReadOnly()) + return REG_REGISTRY_READONLY; + + return pKey->createLink(linkName, linkTarget); +} + +//********************************************************************* +// deleteLink +// +RegError REGISTRY_CALLTYPE deleteLink(RegKeyHandle hKey, + rtl_uString* linkName) +{ + ORegKey* pKey; + + if (hKey) + { + pKey = (ORegKey*)hKey; + + if (pKey->isDeleted()) + return REG_INVALID_KEY; + } else + return REG_INVALID_KEY; + + if (pKey->isReadOnly()) + return REG_REGISTRY_READONLY; + + return pKey->deleteLink(linkName); +} + +//********************************************************************* +// getKeyType +// +RegError REGISTRY_CALLTYPE getKeyType(RegKeyHandle hKey, + rtl_uString* keyName, + RegKeyType* pKeyType) +{ + ORegKey* pKey; + + if (hKey) + { + pKey = (ORegKey*)hKey; + + if (pKey->isDeleted()) + return REG_INVALID_KEY; + } else + return REG_INVALID_KEY; + + return pKey->getKeyType(keyName, pKeyType); +} + +//********************************************************************* +// getLinkTarget +// +RegError REGISTRY_CALLTYPE getLinkTarget(RegKeyHandle hKey, + rtl_uString* linkName, + rtl_uString** pLinkTarget) +{ + ORegKey* pKey; + + if (hKey) + { + pKey = (ORegKey*)hKey; + + if (pKey->isDeleted()) + return REG_INVALID_KEY; + } else + return REG_INVALID_KEY; + + OUString linkTarget; + RegError ret = pKey->getLinkTarget(linkName, linkTarget); + if (!ret) + rtl_uString_assign(pLinkTarget, linkTarget.pData); + return ret; +} + + +//********************************************************************* +// getName +// +RegError REGISTRY_CALLTYPE getResolvedKeyName(RegKeyHandle hKey, + rtl_uString* keyName, + sal_Bool firstLinkOnly, + rtl_uString** pResolvedName) +{ + ORegKey *pKey; + RegError _ret = REG_NO_ERROR; + + if (hKey) + { + pKey = (ORegKey*)hKey; + + if (pKey->isDeleted()) + return REG_INVALID_KEY; + } else + return REG_INVALID_KEY; + + OUString resolvedName; + _ret = pKey->getResolvedKeyName(keyName, resolvedName, firstLinkOnly); + if (!_ret) + rtl_uString_assign(pResolvedName, resolvedName.pData); + return _ret; +} + + +//********************************************************************* +// getKeyNames +// +RegError REGISTRY_CALLTYPE getKeyNames(RegKeyHandle hKey, + rtl_uString* keyName, + rtl_uString*** pSubKeyNames, + sal_uInt32* pnSubKeys) +{ + ORegKey* pKey; + + if (hKey) + { + pKey = (ORegKey*)hKey; + + if (pKey->isDeleted()) + return REG_INVALID_KEY; + } else + return REG_INVALID_KEY; + + return pKey->getKeyNames(keyName, pSubKeyNames, pnSubKeys); +} + +//********************************************************************* +// freeKeyNames +// +RegError REGISTRY_CALLTYPE freeKeyNames(rtl_uString** pKeyNames, + sal_uInt32 nKeys) +{ + for (int i=0; i getName().pData ); + return REG_NO_ERROR; + } else + { + rtl_uString_new( pKeyName ); + return REG_INVALID_KEY; + } +} + +//********************************************************************* +// reg_setValue +// +RegError REGISTRY_CALLTYPE reg_setValue(RegKeyHandle hKey, + rtl_uString* keyName, + RegValueType valueType, + RegValue pData, + sal_uInt32 valueSize) +{ + if (!hKey) + return REG_INVALID_KEY; + + return setValue(hKey, keyName, valueType, pData, valueSize); +} + +//********************************************************************* +// reg_setLongListValue +// +RegError REGISTRY_CALLTYPE reg_setLongListValue(RegKeyHandle hKey, + rtl_uString* keyName, + sal_Int32* pValueList, + sal_uInt32 len) +{ + if (!hKey) + return REG_INVALID_KEY; + + return setLongListValue(hKey, keyName, pValueList, len); +} + +//********************************************************************* +// reg_setStringListValue +// +RegError REGISTRY_CALLTYPE reg_setStringListValue(RegKeyHandle hKey, + rtl_uString* keyName, + sal_Char** pValueList, + sal_uInt32 len) +{ + if (!hKey) + return REG_INVALID_KEY; + + return setStringListValue(hKey, keyName, pValueList, len); +} + +//********************************************************************* +// reg_setUnicodeListValue +// +RegError REGISTRY_CALLTYPE reg_setUnicodeListValue(RegKeyHandle hKey, + rtl_uString* keyName, + sal_Unicode** pValueList, + sal_uInt32 len) +{ + if (!hKey) + return REG_INVALID_KEY; + + return setUnicodeListValue(hKey, keyName, pValueList, len); +} + +//********************************************************************* +// reg_getValueInfo +// +RegError REGISTRY_CALLTYPE reg_getValueInfo(RegKeyHandle hKey, + rtl_uString* keyName, + RegValueType* pValueType, + sal_uInt32* pValueSize) +{ + if (!hKey) + return REG_INVALID_KEY; + + return getValueInfo(hKey, keyName, pValueType, pValueSize); +} + +//********************************************************************* +// reg_getValueInfo +// +RegError REGISTRY_CALLTYPE reg_getValue(RegKeyHandle hKey, + rtl_uString* keyName, + RegValue pData) +{ + if (!hKey) + return REG_INVALID_KEY; + + return getValue(hKey, keyName, pData); +} + +//********************************************************************* +// reg_getLongListValue +// +RegError REGISTRY_CALLTYPE reg_getLongListValue(RegKeyHandle hKey, + rtl_uString* keyName, + sal_Int32** pValueList, + sal_uInt32* pLen) +{ + if (!hKey) + return REG_INVALID_KEY; + + return getLongListValue(hKey, keyName, pValueList, pLen); +} + +//********************************************************************* +// reg_getStringListValue +// +RegError REGISTRY_CALLTYPE reg_getStringListValue(RegKeyHandle hKey, + rtl_uString* keyName, + sal_Char*** pValueList, + sal_uInt32* pLen) +{ + if (!hKey) + return REG_INVALID_KEY; + + return getStringListValue(hKey, keyName, pValueList, pLen); +} + +//********************************************************************* +// reg_getUnicodeListValue +// +RegError REGISTRY_CALLTYPE reg_getUnicodeListValue(RegKeyHandle hKey, + rtl_uString* keyName, + sal_Unicode*** pValueList, + sal_uInt32* pLen) +{ + if (!hKey) + return REG_INVALID_KEY; + + return getUnicodeListValue(hKey, keyName, pValueList, pLen); +} + +//********************************************************************* +// reg_freeValueList +// +RegError REGISTRY_CALLTYPE reg_freeValueList(RegValueType valueType, + RegValue pValueList, + sal_uInt32 len) +{ + if (pValueList) + return freeValueList(valueType, pValueList, len); + else + return REG_INVALID_VALUE; +} + +//********************************************************************* +// reg_createLink +// +RegError REGISTRY_CALLTYPE reg_createLink(RegKeyHandle hKey, + rtl_uString* linkName, + rtl_uString* linkTarget) +{ + if (!hKey) + return REG_INVALID_KEY; + + return createLink(hKey, linkName, linkTarget); +} + +//********************************************************************* +// reg_deleteLink +// +RegError REGISTRY_CALLTYPE reg_deleteLink(RegKeyHandle hKey, + rtl_uString* linkName) +{ + if (!hKey) + return REG_INVALID_KEY; + + return deleteLink(hKey, linkName); +} + +//********************************************************************* +// reg_getKeyType +// +RegError REGISTRY_CALLTYPE reg_getKeyType(RegKeyHandle hKey, + rtl_uString* keyName, + RegKeyType* pKeyType) +{ + if (!hKey) + return REG_INVALID_KEY; + + return getKeyType(hKey, keyName, pKeyType); +} + +//********************************************************************* +// reg_getLinkTarget +// +RegError REGISTRY_CALLTYPE reg_getLinkTarget(RegKeyHandle hKey, + rtl_uString* linkName, + rtl_uString** pLinkTarget) +{ + if (!hKey) + return REG_INVALID_KEY; + + return getLinkTarget(hKey, linkName, pLinkTarget); +} + + +//********************************************************************* +// reg_getResolvedKeyName +// +RegError REGISTRY_CALLTYPE reg_getResolvedKeyName(RegKeyHandle hKey, + rtl_uString* keyName, + sal_Bool firstLinkOnly, + rtl_uString** pResolvedName) +{ + ORegKey *pKey; + + if (hKey) + pKey = (ORegKey*)hKey; + else + return REG_INVALID_KEY; + + return getResolvedKeyName(hKey, keyName, firstLinkOnly, pResolvedName); +} + + diff --git a/registry/source/regmap.hxx b/registry/source/regmap.hxx new file mode 100644 index 000000000000..1bf07bb3a69a --- /dev/null +++ b/registry/source/regmap.hxx @@ -0,0 +1,117 @@ +/************************************************************************* + * + * $RCSfile: regmap.hxx,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:18:43 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +#ifndef _REGMAP_HXX_ +#define _REGMAP_HXX_ + +#if STLPORT_VERSION<321 +#include +#include +#include +#else +#include +#include +#include +#endif + +#ifndef _VOS_MACROS_HXX_ +#include +#endif + +#ifndef _RTL_USTRING_HXX_ +#include +#endif + +using namespace rtl; + +class ORegKey; + +struct EqualString +{ + bool operator()(const OUString& str1, const OUString& str2) const + { + return (str1 == str2); + } +}; + +struct HashString +{ + size_t operator()(const OUString& str) const + { + return str.hashCode(); + } +}; + +struct LessString +{ + bool operator()(const OUString& str1, const OUString& str2) const + { + return (str1 < str2); + } +}; + +typedef NAMESPACE_STD(hash_map) KeyMap; + +typedef NAMESPACE_STD(list) LinkList; + +typedef NAMESPACE_STD(set) StringSet; + +#endif diff --git a/registry/test/makefile.mk b/registry/test/makefile.mk new file mode 100644 index 000000000000..c3dddd2b3a54 --- /dev/null +++ b/registry/test/makefile.mk @@ -0,0 +1,133 @@ +#************************************************************************* +# +# $RCSfile: makefile.mk,v $ +# +# $Revision: 1.1.1.1 $ +# +# last change: $Author: hr $ $Date: 2000-09-18 15:18:43 $ +# +# The Contents of this file are made available subject to the terms of +# either of the following licenses +# +# - GNU Lesser General Public License Version 2.1 +# - Sun Industry Standards Source License Version 1.1 +# +# Sun Microsystems Inc., October, 2000 +# +# GNU Lesser General Public License Version 2.1 +# ============================================= +# Copyright 2000 by Sun Microsystems, Inc. +# 901 San Antonio Road, Palo Alto, CA 94303, USA +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License version 2.1, as published by the Free Software Foundation. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, +# MA 02111-1307 USA +# +# +# Sun Industry Standards Source License Version 1.1 +# ================================================= +# The contents of this file are subject to the Sun Industry Standards +# Source License Version 1.1 (the "License"); You may not use this file +# except in compliance with the License. You may obtain a copy of the +# License at http://www.openoffice.org/license.html. +# +# Software provided under this License is provided on an "AS IS" basis, +# WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, +# WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, +# MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. +# See the License for the specific provisions governing your rights and +# obligations concerning the Software. +# +# The Initial Developer of the Original Code is: Sun Microsystems, Inc. +# +# Copyright: 2000 by Sun Microsystems, Inc. +# +# All Rights Reserved. +# +# Contributor(s): _______________________________________ +# +# +# +#************************************************************************* + +PRJ=.. + +PRJNAME=registry +TARGET=regtest + +USE_LDUMP2=TRUE +#LDUMP2=LDUMP3 + + +# --- Settings ----------------------------------------------------- +.INCLUDE : svpre.mk +.INCLUDE : settings.mk +.INCLUDE : sv.mk + + +# ------------------------------------------------------------------ +CDEFS += -DDLL_VERSION=\"$(UPD)$(DLLPOSTFIX)\" + +CXXFILES= \ + testregcpp.cxx \ + testmerge.cxx + + +LIB1TARGET= $(SLB)$/$(TARGET).lib + +LIB1OBJFILES= \ + $(SLO)$/testregcpp.obj \ + $(SLO)$/testmerge.obj + + +SHL1TARGET= rgt$(UPD)$(DLLPOSTFIX) +SHL1IMPLIB= rgt +SHL1STDLIBS= \ + $(SALLIB) \ + $(VOSLIB) \ + $(STDLIBCPP) + +.IF "$(GUI)" == "WNT" +SHL1STDLIBS += \ + $(LIBCMT) \ + $(LIBCIMT) +.ENDIF + + +SHL1LIBS= $(LIB1TARGET) +SHL1DEPN= $(LIB1TARGET) +SHL1DEF= $(MISC)$/$(SHL1TARGET).def +DEF1NAME= $(SHL1TARGET) + +DEF1DEPN =$(MISC)$/rgt$(UPD)$(DLLPOSTFIX).flt $(SLOFILES) +DEFLIB1NAME =$(TARGET) +DEF1DES =Registry Runtime - TestDll + +# --- Targets ------------------------------------------------------ + +#all: \ +# ALLTAR + +.INCLUDE : target.mk + +# --- SO2-Filter-Datei --- + + +$(MISC)$/rgt$(UPD)$(DLLPOSTFIX).flt: + @echo ------------------------------ + @echo Making: $@ + @echo WEP>$@ + @echo LIBMAIN>>$@ + @echo LibMain>>$@ + + diff --git a/registry/test/testmerge.cxx b/registry/test/testmerge.cxx new file mode 100644 index 000000000000..f277535890e0 --- /dev/null +++ b/registry/test/testmerge.cxx @@ -0,0 +1,492 @@ +/************************************************************************* + * + * $RCSfile: testmerge.cxx,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:18:43 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +#include +#include +#include + +#include "registry/registry.hxx" +#include "registry/reflread.hxx" +#include "registry/reflwrit.hxx" + +#ifndef _VOS_MODULE_HXX +#include +#endif + +#ifndef _VOS_DIAGNOSE_HXX +#include +#endif + +#ifndef _RTL_ALLOC_H_ +#include +#endif + +#ifndef _RTL_USTRING_HXX_ +#include +#endif + + +using namespace rtl; + +sal_Int32 lValue1 = 123456789; +sal_Int32 lValue2 = 54321; +sal_Int32 lValue3 = 111333111; +sal_Int32 lValue4 = 333111333; +sal_Char* sValue = "string Value"; +OUString wValue = rtl::OUString::createFromAscii( "unicode Value" ); + + +void test_generateMerge1() +{ + RegistryLoader* pLoader = new RegistryLoader(); + + if (!pLoader->isLoaded()) + { + delete pLoader; + return; + } + + Registry *myRegistry = new Registry(*pLoader); + delete pLoader; + + RegistryKey rootKey, key1, key2, key3, key4, key5, key6, key7, key8, key9; + + VOS_ENSHURE(!myRegistry->create(OUString::createFromAscii("merge1.rdb")), "testGenerateMerge1 error 1"); + VOS_ENSHURE(!myRegistry->openRootKey(rootKey), "testGenerateMerge1 error 2"); + + VOS_ENSHURE(!rootKey.createKey(OUString::createFromAscii("MergeKey1"), key1), "testGenerateMerge1 error 3"); + VOS_ENSHURE(!rootKey.createKey(OUString::createFromAscii("/MergeKey1/MK1SubKey1"), key2), "testGenerateMerge1 error 4"); + VOS_ENSHURE(!rootKey.createKey(OUString::createFromAscii("/MergeKey1/MK1SubKey1/KeyWithLongValue"), key3), "testGenerateMerge1 error 5"); + VOS_ENSHURE(!key3.setValue(OUString(), RG_VALUETYPE_LONG, &lValue1, sizeof(sal_Int32)), "testGenerateMerge1 error 5a"); + VOS_ENSHURE(!rootKey.createKey(OUString::createFromAscii("/MergeKey1/MK1SubKey2"), key4), "testGenerateMerge1 error 6"); + VOS_ENSHURE(!rootKey.createKey(OUString::createFromAscii("/MergeKey1/MK1SubKey2/KeyWithStringValue"), key5), "testGenerateMerge1 error 7"); + VOS_ENSHURE(!key5.setValue(OUString(), RG_VALUETYPE_STRING, sValue, strlen(sValue)+1), "testGenerateMerge1 error 7a"); + VOS_ENSHURE(!rootKey.createKey(OUString::createFromAscii("/MergeKey1/MK1SubKey3"), key6), "testGenerateMerge1 error 8"); + VOS_ENSHURE(!rootKey.createKey(OUString::createFromAscii("/MergeKey1/MK1SubKey3/KeyWithUnicodeValue"), key7), "testGenerateMerge1 error 9"); + VOS_ENSHURE(!key7.setValue(OUString(), RG_VALUETYPE_UNICODE, (void*)wValue.getStr(), ((wValue.getLength()+1)*sizeof(sal_Unicode))), "testGenerateMerge1 error 9a"); + VOS_ENSHURE(!rootKey.createKey(OUString::createFromAscii("/MergeKey1/MK1SubKey4"), key8), "testGenerateMerge1 error 10"); + VOS_ENSHURE(!rootKey.createKey(OUString::createFromAscii("/MergeKey1/MK1SubKey4/KeyWithBinaryValue"), key9), "testGenerateMerge1 error 11"); + VOS_ENSHURE(!key9.setValue(OUString(), RG_VALUETYPE_BINARY, "abcdefghijklmnopqrstuvwxyz", 27), "testGenerateMerge1 error 11a"); + + + VOS_ENSHURE(!key1.closeKey() && + !key2.closeKey() && + !key3.closeKey() && + !key4.closeKey() && + !key5.closeKey() && + !key6.closeKey() && + !key7.closeKey() && + !key8.closeKey() && + !key9.closeKey(), "testGenerateMerge1 error 12"); + + VOS_ENSHURE(!rootKey.createKey(OUString::createFromAscii("MergeKey1u2"), key1), "testGenerateMerge1 error 13"); + VOS_ENSHURE(!rootKey.createKey(OUString::createFromAscii("/MergeKey1u2/MK1SubKey11"), key2), "testGenerateMerge1 error 14"); + VOS_ENSHURE(!rootKey.createKey(OUString::createFromAscii("/MergeKey1u2/MK1SubKey11/KeyWithLongValue"), key3), "testGenerateMerge1 error 15"); + VOS_ENSHURE(!key3.setValue(OUString(), RG_VALUETYPE_LONG, &lValue2, sizeof(sal_Int32)), "testGenerateMerge1 error 15a"); + VOS_ENSHURE(!rootKey.createKey(OUString::createFromAscii("/MergeKey1u2/MK1SubKey12"), key4), "testGenerateMerge1 error 16"); + VOS_ENSHURE(!rootKey.createKey(OUString::createFromAscii("/MergeKey1u2/MK1SubKey12/KeyWithStringValue"), key5), "testGenerateMerge1 error 17"); + VOS_ENSHURE(!key5.setValue(OUString(), RG_VALUETYPE_STRING, sValue, strlen(sValue)+1), "testGenerateMerge1 error 17a"); + VOS_ENSHURE(!rootKey.createKey(OUString::createFromAscii("/MergeKey1u2/MK1SubKey13"), key6), "testGenerateMerge1 error 18"); + VOS_ENSHURE(!rootKey.createKey(OUString::createFromAscii("/MergeKey1u2/MK1SubKey13/KeyWithUnicodeValue"), key7), "testGenerateMerge1 error 19"); + VOS_ENSHURE(!key7.setValue(OUString(), RG_VALUETYPE_UNICODE, (void*)wValue.getStr(), ((wValue.getLength()+1)*sizeof(sal_Unicode))), "testGenerateMerge1 error 19a"); + VOS_ENSHURE(!rootKey.createKey(OUString::createFromAscii("/MergeKey1u2/MK12SubKey1u2"), key8), "testGenerateMerge1 error 20"); + VOS_ENSHURE(!rootKey.createKey(OUString::createFromAscii("/MergeKey1u2/MK12SubKey1u2/KeyWithLongValue"), key9), "testGenerateMerge1 error 21"); + VOS_ENSHURE(!key9.setValue(OUString(), RG_VALUETYPE_LONG, &lValue3, sizeof(sal_Int32)), "testGenerateMerge1 error 21a"); + + VOS_ENSHURE(!rootKey.closeKey() && + !key1.closeKey() && + !key2.closeKey() && + !key3.closeKey() && + !key4.closeKey() && + !key5.closeKey() && + !key6.closeKey() && + !key7.closeKey() && + !key8.closeKey() && + !key9.closeKey(), "testGenerateMerge1 error 22"); + + + delete myRegistry; + + cout << "test_generateMerge1() Ok!\n"; + return; +} + +void test_generateMerge2() +{ + RegistryLoader* pLoader = new RegistryLoader(); + + if (!pLoader->isLoaded()) + { + delete pLoader; + return; + } + + Registry *myRegistry = new Registry(*pLoader); + delete pLoader; + + RegistryKey rootKey, key1, key2, key3, key4, key5, key6, key7, key8, key9; + + VOS_ENSHURE(!myRegistry->create(OUString::createFromAscii("merge2.rdb")), "testGenerateMerge2 error 1"); + VOS_ENSHURE(!myRegistry->openRootKey(rootKey), "testGenerateMerge2 error 2"); + + VOS_ENSHURE(!rootKey.createKey(OUString::createFromAscii("MergeKey2"), key1), "testGenerateMerge2 error 3"); + VOS_ENSHURE(!rootKey.createKey(OUString::createFromAscii("/MergeKey2/MK2SubKey1"), key2), "testGenerateMerge2 error 4"); + VOS_ENSHURE(!rootKey.createKey(OUString::createFromAscii("/MergeKey2/MK2SubKey1/KeyWithBinaryValue"), key3), "testGenerateMerge2 error 5"); + VOS_ENSHURE(!key3.setValue(OUString(), RG_VALUETYPE_BINARY, "1234567890", 11), "testGenerateMerge1 error 5a"); + VOS_ENSHURE(!rootKey.createKey(OUString::createFromAscii("/MergeKey2/MK2SubKey2"), key4), "testGenerateMerge2 error 6"); + VOS_ENSHURE(!rootKey.createKey(OUString::createFromAscii("/MergeKey2/MK2SubKey2/KeyWithUnicodeValue"), key5), "testGenerateMerge2 error 7"); + VOS_ENSHURE(!key5.setValue(OUString(), RG_VALUETYPE_UNICODE, (void*)wValue.getStr(), ((wValue.getLength()+1)*sizeof(sal_Unicode))), "testGenerateMerge1 error 7a"); + VOS_ENSHURE(!rootKey.createKey(OUString::createFromAscii("/MergeKey2/MK2SubKey3"), key6), "testGenerateMerge2 error 8"); + VOS_ENSHURE(!rootKey.createKey(OUString::createFromAscii("/MergeKey2/MK2SubKey3/KeyWithStringValue"), key7), "testGenerateMerge2 error 9"); + VOS_ENSHURE(!key7.setValue(OUString(), RG_VALUETYPE_STRING, sValue, strlen(sValue)+1), "testGenerateMerge1 error 9a"); + VOS_ENSHURE(!rootKey.createKey(OUString::createFromAscii("/MergeKey2/MK2SubKey4"), key8), "testGenerateMerge2 error 10"); + VOS_ENSHURE(!rootKey.createKey(OUString::createFromAscii("/MergeKey2/MK2SubKey4/KeyWithLongValue"), key9), "testGenerateMerge2 error 11"); + VOS_ENSHURE(!key9.setValue(OUString(), RG_VALUETYPE_LONG, &lValue1, sizeof(sal_Int32)), "testGenerateMerge1 error 11a"); + + VOS_ENSHURE(!key1.closeKey() && + !key2.closeKey() && + !key3.closeKey() && + !key4.closeKey() && + !key5.closeKey() && + !key6.closeKey() && + !key7.closeKey() && + !key8.closeKey() && + !key9.closeKey(), "testGenerateMerge2 error 12"); + + VOS_ENSHURE(!rootKey.createKey(OUString::createFromAscii("MergeKey1u2"), key1), "testGenerateMerge2 error 13"); + VOS_ENSHURE(!rootKey.createKey(OUString::createFromAscii("/MergeKey1u2/MK2SubKey21"), key2), "testGenerateMerge2 error 14"); + VOS_ENSHURE(!rootKey.createKey(OUString::createFromAscii("/MergeKey1u2/MK2SubKey21/KeyWithBinaryValue"), key3), "testGenerateMerge2 error 15"); + VOS_ENSHURE(!key3.setValue(OUString(), RG_VALUETYPE_BINARY, "a1b2c3d4e5f6g7h8i9", 19), "testGenerateMerge1 error 15a"); + VOS_ENSHURE(!rootKey.createKey(OUString::createFromAscii("/MergeKey1u2/MK2SubKey22"), key4), "testGenerateMerge2 error 16"); + VOS_ENSHURE(!rootKey.createKey(OUString::createFromAscii("/MergeKey1u2/MK2SubKey22/KeyWithLongValue"), key5), "testGenerateMerge2 error 17"); + VOS_ENSHURE(!key5.setValue(OUString(), RG_VALUETYPE_LONG, &lValue2, sizeof(sal_Int32)), "testGenerateMerge1 error 17a"); + VOS_ENSHURE(!rootKey.createKey(OUString::createFromAscii("/MergeKey1u2/MK2SubKey23"), key6), "testGenerateMerge2 error 18"); + VOS_ENSHURE(!rootKey.createKey(OUString::createFromAscii("/MergeKey1u2/MK2SubKey23/KeyWithStringValue"), key7), "testGenerateMerge2 error 19"); + VOS_ENSHURE(!key7.setValue(OUString(), RG_VALUETYPE_STRING, sValue, strlen(sValue)+1), "testGenerateMerge1 error 19a"); + VOS_ENSHURE(!rootKey.createKey(OUString::createFromAscii("/MergeKey1u2/MK12SubKey1u2"), key8), "testGenerateMerge2 error 20"); + VOS_ENSHURE(!rootKey.createKey(OUString::createFromAscii("/MergeKey1u2/MK12SubKey1u2/KeyWithLongValue"), key9), "testGenerateMerge2 error 21"); + VOS_ENSHURE(!key9.setValue(OUString(), RG_VALUETYPE_LONG, &lValue4, sizeof(sal_Int32)), "testGenerateMerge1 error 21a"); + + VOS_ENSHURE(!rootKey.closeKey() && + !key1.closeKey() && + !key2.closeKey() && + !key3.closeKey() && + !key4.closeKey() && + !key5.closeKey() && + !key6.closeKey() && + !key7.closeKey() && + !key8.closeKey() && + !key9.closeKey(), "testGenerateMerge2 error 22"); + + + delete myRegistry; + + cout << "test_generateMerge2() Ok!\n"; + return; +} + +void test_merge() +{ + RegistryLoader* pLoader = new RegistryLoader(); + + if (!pLoader->isLoaded()) + { + delete pLoader; + return; + } + + Registry *myRegistry = new Registry(*pLoader); + delete pLoader; + + RegistryKey rootKey, key1, mkey1, key2, mkey2, key1u2, mkey1u2; + + VOS_ENSHURE(!myRegistry->create(OUString::createFromAscii("mergetest.rdb")), "testMerge error 1"); + VOS_ENSHURE(myRegistry->getName().equals(OUString::createFromAscii("mergetest.rdb")), "testMerge error 1.a)"); + VOS_ENSHURE(!myRegistry->openRootKey(rootKey), "testMerge error 2"); + VOS_ENSHURE(!myRegistry->loadKey(rootKey, OUString::createFromAscii("/stardiv/IchbineinMergeKey"), + OUString::createFromAscii("merge1.rdb")), "testMerge error 3"); + VOS_ENSHURE(!myRegistry->mergeKey(rootKey, OUString::createFromAscii("/stardiv/IchbineinMergeKey"), + OUString::createFromAscii("merge2.rdb")), "testMerge error 4"); + + /////////////////////////////////////////////////////////////////////////// + + VOS_ENSHURE(!rootKey.openKey(OUString::createFromAscii("/stardiv/IchbineinMergeKey"), key1), "testMerge error 5"); + + VOS_ENSHURE(!key1.openKey(OUString::createFromAscii("MergeKey1"), mkey1), "testMerge error 6"); + VOS_ENSHURE(!mkey1.closeKey(), "testMerge error 7"); + + VOS_ENSHURE(!key1.openKey(OUString::createFromAscii("/MergeKey1/MK1SubKey1"), mkey1), "testMerge error 8"); + VOS_ENSHURE(!mkey1.closeKey(), "testMerge error 9"); + VOS_ENSHURE(!key1.openKey(OUString::createFromAscii("/MergeKey1/MK1SubKey1/KeyWithLongValue"), mkey1), "testMerge error 10"); + VOS_ENSHURE(!mkey1.closeKey(), "testMerge error 11"); + + VOS_ENSHURE(!key1.openKey(OUString::createFromAscii("/MergeKey1/MK1SubKey2"), mkey1), "testMerge error 12"); + VOS_ENSHURE(!mkey1.closeKey(), "testMerge error 13"); + VOS_ENSHURE(!key1.openKey(OUString::createFromAscii("/MergeKey1/MK1SubKey2/KeyWithStringValue"), mkey1), "testMerge error 14"); + VOS_ENSHURE(!mkey1.closeKey(), "testMerge error 15"); + + VOS_ENSHURE(!key1.openKey(OUString::createFromAscii("/MergeKey1/MK1SubKey3"), mkey1), "testMerge error 16"); + VOS_ENSHURE(!mkey1.closeKey(), "testMerge error 17"); + VOS_ENSHURE(!key1.openKey(OUString::createFromAscii("/MergeKey1/MK1SubKey3/KeyWithUnicodeValue"), mkey1), "testMerge error 18"); + VOS_ENSHURE(!mkey1.closeKey(), "testMerge error 19"); + + VOS_ENSHURE(!key1.openKey(OUString::createFromAscii("/MergeKey1/MK1SubKey4"), mkey1), "testMerge error 20"); + VOS_ENSHURE(!mkey1.closeKey(), "testMerge error 21"); + VOS_ENSHURE(!key1.openKey(OUString::createFromAscii("/MergeKey1/MK1SubKey4/KeyWithBinaryValue"), mkey1), "testMerge error 22"); + VOS_ENSHURE(!mkey1.closeKey(), "testMerge error 23"); + + VOS_ENSHURE(!key1.closeKey(), "testMerge error 24"); + + /////////////////////////////////////////////////////////////////////////// + + VOS_ENSHURE(!rootKey.openKey(OUString::createFromAscii("/stardiv/IchbineinMergeKey"), key2), "testMerge error 25"); + + VOS_ENSHURE(!key2.openKey(OUString::createFromAscii("MergeKey2"), mkey2), "testMerge error 26"); + VOS_ENSHURE(!mkey2.closeKey(), "testMerge error 27"); + + VOS_ENSHURE(!key2.openKey(OUString::createFromAscii("/MergeKey2/MK2SubKey1"), mkey2), "testMerge error 28"); + VOS_ENSHURE(!mkey2.closeKey(), "testMerge error 29"); + VOS_ENSHURE(!key2.openKey(OUString::createFromAscii("/MergeKey2/MK2SubKey1/KeyWithBinaryValue"), mkey2), "testMerge error 30"); + VOS_ENSHURE(!mkey2.closeKey(), "testMerge error 31"); + + VOS_ENSHURE(!key2.openKey(OUString::createFromAscii("/MergeKey2/MK2SubKey2"), mkey2), "testMerge error 31"); + VOS_ENSHURE(!mkey2.closeKey(), "testMerge error 33"); + VOS_ENSHURE(!key2.openKey(OUString::createFromAscii("/MergeKey2/MK2SubKey2/KeyWithUnicodeValue"), mkey2), "testMerge error 34"); + VOS_ENSHURE(!mkey2.closeKey(), "testMerge error 35"); + + VOS_ENSHURE(!key2.openKey(OUString::createFromAscii("/MergeKey2/MK2SubKey3"), mkey2), "testMerge error 36"); + VOS_ENSHURE(!mkey2.closeKey(), "testMerge error 37"); + VOS_ENSHURE(!key2.openKey(OUString::createFromAscii("/MergeKey2/MK2SubKey3/KeyWithStringValue"), mkey2), "testMerge error 38"); + VOS_ENSHURE(!mkey2.closeKey(), "testMerge error 39"); + + VOS_ENSHURE(!key2.openKey(OUString::createFromAscii("/MergeKey2/MK2SubKey4"), mkey2), "testMerge error 40"); + VOS_ENSHURE(!mkey2.closeKey(), "testMerge error 41"); + VOS_ENSHURE(!key2.openKey(OUString::createFromAscii("/MergeKey2/MK2SubKey4/KeyWithLongValue"), mkey2), "testMerge error 42"); + VOS_ENSHURE(!mkey2.closeKey(), "testMerge error 43"); + + VOS_ENSHURE(!key2.closeKey(), "testMerge error 44"); + + /////////////////////////////////////////////////////////////////////////// + + VOS_ENSHURE(!rootKey.openKey(OUString::createFromAscii("/stardiv/IchbineinMergeKey"), key1u2), "testMerge error 40"); + + VOS_ENSHURE(!key1u2.openKey(OUString::createFromAscii("MergeKey1u2"), mkey1u2), "testMerge error 41"); + VOS_ENSHURE(!mkey1u2.closeKey(), "testMerge error 42"); + + VOS_ENSHURE(!key1u2.openKey(OUString::createFromAscii("/MergeKey1u2/MK1SubKey11"), mkey1u2), "testMerge error 43"); + VOS_ENSHURE(!mkey1u2.closeKey(), "testMerge error 44"); + VOS_ENSHURE(!key1u2.openKey(OUString::createFromAscii("/MergeKey1u2/MK1SubKey11/KeyWithLongValue"), mkey1u2), "testMerge error 45"); + VOS_ENSHURE(!mkey1u2.closeKey(), "testMerge error 46"); + + VOS_ENSHURE(!key1u2.openKey(OUString::createFromAscii("/MergeKey1u2/MK1SubKey12"), mkey1u2), "testMerge error 47"); + VOS_ENSHURE(!mkey1u2.closeKey(), "testMerge error 48"); + VOS_ENSHURE(!key1u2.openKey(OUString::createFromAscii("/MergeKey1u2/MK1SubKey12/KeyWithStringValue"), mkey1u2), "testMerge error 49"); + VOS_ENSHURE(!mkey1u2.closeKey(), "testMerge error 50"); + + VOS_ENSHURE(!key1u2.openKey(OUString::createFromAscii("/MergeKey1u2/MK1SubKey13"), mkey1u2), "testMerge error 51"); + VOS_ENSHURE(!mkey1u2.closeKey(), "testMerge error 52"); + VOS_ENSHURE(!key1u2.openKey(OUString::createFromAscii("/MergeKey1u2/MK1SubKey13/KeyWithUnicodeValue"), mkey1u2), "testMerge error 53"); + VOS_ENSHURE(!mkey1u2.closeKey(), "testMerge error 54"); + + VOS_ENSHURE(!key1u2.openKey(OUString::createFromAscii("/MergeKey1u2/MK2SubKey21"), mkey1u2), "testMerge error 55"); + VOS_ENSHURE(!mkey1u2.closeKey(), "testMerge error 56"); + VOS_ENSHURE(!key1u2.openKey(OUString::createFromAscii("/MergeKey1u2/MK2SubKey21/KeyWithBinaryValue"), mkey1u2), "testMerge error 57"); + VOS_ENSHURE(!mkey1u2.closeKey(), "testMerge error 58"); + + VOS_ENSHURE(!key1u2.openKey(OUString::createFromAscii("/MergeKey1u2/MK2SubKey22"), mkey1u2), "testMerge error 59"); + VOS_ENSHURE(!mkey1u2.closeKey(), "testMerge error 60"); + VOS_ENSHURE(!key1u2.openKey(OUString::createFromAscii("/MergeKey1u2/MK2SubKey22/KeyWithLongValue"), mkey1u2), "testMerge error 61"); + VOS_ENSHURE(!mkey1u2.closeKey(), "testMerge error 62"); + + VOS_ENSHURE(!key1u2.openKey(OUString::createFromAscii("/MergeKey1u2/MK2SubKey23"), mkey1u2), "testMerge error 63"); + VOS_ENSHURE(!mkey1u2.closeKey(), "testMerge error 64"); + VOS_ENSHURE(!key1u2.openKey(OUString::createFromAscii("/MergeKey1u2/MK2SubKey23/KeyWithStringValue"), mkey1u2), "testMerge error 65"); + VOS_ENSHURE(!mkey1u2.closeKey(), "testMerge error 66"); + + VOS_ENSHURE(!key1u2.openKey(OUString::createFromAscii("/MergeKey1u2/MK12SubKey1u2"), mkey1u2), "testMerge error 67"); + VOS_ENSHURE(!mkey1u2.closeKey(), "testMerge error 68"); + VOS_ENSHURE(!key1u2.openKey(OUString::createFromAscii("/MergeKey1u2/MK12SubKey1u2/KeyWithLongValue"), mkey1u2), "testMerge error 69"); + VOS_ENSHURE(!mkey1u2.closeKey(), "testMerge error 70"); + + VOS_ENSHURE(!key1u2.closeKey(), "testMerge error 71"); + + /////////////////////////////////////////////////////////////////////////// + + RegValueType valueType; + sal_uInt32 valueSize; + sal_Int32 int32Value; + sal_uInt8 *Value; + + VOS_ENSHURE(!rootKey.openKey(OUString::createFromAscii("/stardiv/IchbineinMergeKey"), key1), "testMerge error 72"); + + VOS_ENSHURE(!key1.getValueInfo(OUString::createFromAscii("/MergeKey1/MK1SubKey1/KeyWithLongValue"), &valueType, &valueSize), "testMerge error 73"); + VOS_ENSHURE(valueType == RG_VALUETYPE_LONG && valueSize == sizeof(sal_Int32), "testMerge error 74"); + VOS_ENSHURE(!key1.getValue(OUString::createFromAscii("/MergeKey1/MK1SubKey1/KeyWithLongValue"), (RegValue)&int32Value), "testMerge error 74.a)"); + VOS_ENSHURE(int32Value == lValue1, "testMerge error 74.b)"); + + VOS_ENSHURE(!key1.getValueInfo(OUString::createFromAscii("/MergeKey1/MK1SubKey2/KeyWithStringValue"), &valueType, &valueSize), "testMerge error 75"); + VOS_ENSHURE(valueType == RG_VALUETYPE_STRING && valueSize == strlen(sValue)+1, "testMerge error 76"); + Value = new sal_uInt8[valueSize]; + VOS_ENSHURE(!key1.getValue(OUString::createFromAscii("/MergeKey1/MK1SubKey2/KeyWithStringValue"), (RegValue)Value), "testMerge error 76.a)"); + VOS_ENSHURE(strcmp((const sal_Char*)Value, sValue) == 0, "testMerge error 76.b)"); + delete(Value); + + VOS_ENSHURE(!key1.getValueInfo(OUString::createFromAscii("/MergeKey1/MK1SubKey3/KeyWithUnicodeValue"), &valueType, &valueSize), "testMerge error 77"); + VOS_ENSHURE(valueType == RG_VALUETYPE_UNICODE && valueSize == (wValue.getLength()+1)*sizeof(sal_Unicode), "testMerge error 78"); + Value = new sal_uInt8[valueSize]; + VOS_ENSHURE(!key1.getValue(OUString::createFromAscii("/MergeKey1/MK1SubKey3/KeyWithUnicodeValue"), (RegValue)Value), "testMerge error 78.a)"); + VOS_ENSHURE(wValue.equals( (const sal_Unicode*)Value ), "testMerge error 78.b)"); + delete(Value); + + VOS_ENSHURE(!key1.getValueInfo(OUString::createFromAscii("/MergeKey1/MK1SubKey4/KeyWithBinaryValue"), &valueType, &valueSize), "testMerge error 79"); + VOS_ENSHURE(valueType == RG_VALUETYPE_BINARY && valueSize == 27, "testMerge error 80"); + Value = new sal_uInt8[valueSize]; + VOS_ENSHURE(!key1.getValue(OUString::createFromAscii("/MergeKey1/MK1SubKey4/KeyWithBinaryValue"), (RegValue)Value), "testMerge error 80.a)"); + VOS_ENSHURE(strcmp((const sal_Char*)Value, "abcdefghijklmnopqrstuvwxyz") == 0, "testMerge error 80.b)"); + delete(Value); + + VOS_ENSHURE(!key1.getValueInfo(OUString::createFromAscii("/MergeKey2/MK2SubKey1/KeyWithBinaryValue"), &valueType, &valueSize), "testMerge error 81"); + VOS_ENSHURE(valueType == RG_VALUETYPE_BINARY && valueSize == 11, "testMerge error 82"); + Value = new sal_uInt8[valueSize]; + VOS_ENSHURE(!key1.getValue(OUString::createFromAscii("/MergeKey2/MK2SubKey1/KeyWithBinaryValue"), (RegValue)Value), "testMerge error 82.a)"); + VOS_ENSHURE(strcmp((const sal_Char*)Value, "1234567890") == 0, "testMerge error 82.b)"); + delete(Value); + + VOS_ENSHURE(!key1.getValueInfo(OUString::createFromAscii("/MergeKey2/MK2SubKey2/KeyWithUnicodeValue"), &valueType, &valueSize), "testMerge error 83"); + VOS_ENSHURE(valueType == RG_VALUETYPE_UNICODE&& valueSize == (wValue.getLength()+1)*sizeof(sal_Unicode), "testMerge error 84"); + Value = new sal_uInt8[valueSize]; + VOS_ENSHURE(!key1.getValue(OUString::createFromAscii("/MergeKey2/MK2SubKey2/KeyWithUnicodeValue"), (RegValue)Value), "testMerge error 84.a)"); + VOS_ENSHURE(wValue.equals( (const sal_Unicode*)Value ), "testMerge error 84.b)"); + delete(Value); + + VOS_ENSHURE(!key1.getValueInfo(OUString::createFromAscii("/MergeKey2/MK2SubKey3/KeyWithStringValue"), &valueType, &valueSize), "testMerge error 85"); + VOS_ENSHURE(valueType == RG_VALUETYPE_STRING && valueSize == strlen(sValue)+1, "testMerge error 86"); + Value = new sal_uInt8[valueSize]; + VOS_ENSHURE(!key1.getValue(OUString::createFromAscii("/MergeKey2/MK2SubKey3/KeyWithStringValue"), (RegValue)Value), "testMerge error 86.a)"); + VOS_ENSHURE(strcmp((const sal_Char*)Value, sValue) == 0, "testMerge error 86.b)"); + delete(Value); + + VOS_ENSHURE(!key1.getValueInfo(OUString::createFromAscii("/MergeKey2/MK2SubKey4/KeyWithLongValue"), &valueType, &valueSize), "testMerge error 87"); + VOS_ENSHURE(valueType == RG_VALUETYPE_LONG && valueSize == sizeof(sal_Int32), "testMerge error 88"); + VOS_ENSHURE(!key1.getValue(OUString::createFromAscii("/MergeKey2/MK2SubKey4/KeyWithLongValue"), (RegValue)&int32Value), "testMerge error 88.a)"); + VOS_ENSHURE(int32Value == lValue1, "testMerge error 88.b)"); + + VOS_ENSHURE(!key1.getValueInfo(OUString::createFromAscii("/MergeKey1u2/MK1SubKey11/KeyWithLongValue"), &valueType, &valueSize), "testMerge error 89"); + VOS_ENSHURE(valueType == RG_VALUETYPE_LONG && valueSize == sizeof(sal_Int32), "testMerge error 90"); + VOS_ENSHURE(!key1.getValue(OUString::createFromAscii("/MergeKey1u2/MK1SubKey11/KeyWithLongValue"), (RegValue)&int32Value), "testMerge error 90.a)"); + VOS_ENSHURE(int32Value == lValue2, "testMerge error 90.b)"); + + VOS_ENSHURE(!key1.getValueInfo(OUString::createFromAscii("/MergeKey1u2/MK1SubKey12/KeyWithStringValue"), &valueType, &valueSize), "testMerge error 91"); + VOS_ENSHURE(valueType == RG_VALUETYPE_STRING && valueSize == strlen(sValue)+1, "testMerge error 92"); + Value = new sal_uInt8[valueSize]; + VOS_ENSHURE(!key1.getValue(OUString::createFromAscii("/MergeKey1u2/MK1SubKey12/KeyWithStringValue"), (RegValue)Value), "testMerge error 92.a)"); + VOS_ENSHURE(strcmp((const sal_Char*)Value, sValue) == 0, "testMerge error 92.b)"); + delete(Value); + + VOS_ENSHURE(!key1.getValueInfo(OUString::createFromAscii("/MergeKey1u2/MK1SubKey13/KeyWithUnicodeValue"), &valueType, &valueSize), "testMerge error 93"); + VOS_ENSHURE(valueType == RG_VALUETYPE_UNICODE && valueSize == (wValue.getLength()+1)*sizeof(sal_Unicode), "testMerge error 94"); + Value = new sal_uInt8[valueSize]; + VOS_ENSHURE(!key1.getValue(OUString::createFromAscii("/MergeKey1u2/MK1SubKey13/KeyWithUnicodeValue"), (RegValue)Value), "testMerge error 94.a)"); + VOS_ENSHURE(wValue.equals( (const sal_Unicode*)Value ), "testMerge error 94.b)"); + delete(Value); + + VOS_ENSHURE(!key1.getValueInfo(OUString::createFromAscii("/MergeKey1u2/MK2SubKey21/KeyWithBinaryValue"), &valueType, &valueSize), "testMerge error 95"); + VOS_ENSHURE(valueType == RG_VALUETYPE_BINARY && valueSize == 19, "testMerge error 96"); + Value = new sal_uInt8[valueSize]; + VOS_ENSHURE(!key1.getValue(OUString::createFromAscii("/MergeKey1u2/MK2SubKey21/KeyWithBinaryValue"), (RegValue)Value), "testMerge error 96.a)"); + VOS_ENSHURE(strcmp((const sal_Char*)Value, "a1b2c3d4e5f6g7h8i9") == 0, "testMerge error 96.b)"); + delete(Value); + + VOS_ENSHURE(!key1.getValueInfo(OUString::createFromAscii("/MergeKey1u2/MK2SubKey22/KeyWithLongValue"), &valueType, &valueSize), "testMerge error 97"); + VOS_ENSHURE(valueType == RG_VALUETYPE_LONG && valueSize == sizeof(sal_Int32), "testMerge error 98"); + VOS_ENSHURE(!key1.getValue(OUString::createFromAscii("/MergeKey1u2/MK2SubKey22/KeyWithLongValue"), (RegValue)&int32Value), "testMerge error 98.a)"); + VOS_ENSHURE(int32Value == lValue2, "testMerge error 98.b)"); + + VOS_ENSHURE(!key1.getValueInfo(OUString::createFromAscii("/MergeKey1u2/MK2SubKey23/KeyWithStringValue"), &valueType, &valueSize), "testMerge error 99"); + VOS_ENSHURE(valueType == RG_VALUETYPE_STRING && valueSize == strlen(sValue)+1, "testMerge error 100"); + Value = new sal_uInt8[valueSize]; + VOS_ENSHURE(!key1.getValue(OUString::createFromAscii("/MergeKey1u2/MK2SubKey23/KeyWithStringValue"), (RegValue)Value), "testMerge error 100.a)"); + VOS_ENSHURE(strcmp((const sal_Char*)Value, sValue) == 0, "testMerge error 100.b)"); + delete(Value); + + VOS_ENSHURE(!key1.getValueInfo(OUString::createFromAscii("/MergeKey1u2/MK12SubKey1u2/KeyWithLongValue"), &valueType, &valueSize), "testMerge error 101"); + VOS_ENSHURE(valueType == RG_VALUETYPE_LONG && valueSize == sizeof(sal_Int32), "testMerge error 102"); + VOS_ENSHURE(!key1.getValue(OUString::createFromAscii("/MergeKey1u2/MK12SubKey1u2/KeyWithLongValue"), (RegValue)&int32Value), "testMerge error 102.a)"); + VOS_ENSHURE(int32Value == lValue4, "testMerge error 102.b)"); + + + VOS_ENSHURE(!key1.closeKey(), "testMerge error 24"); + + /////////////////////////////////////////////////////////////////////////// + + VOS_ENSHURE(!rootKey.closeKey(), "testMerge error 10"); + + VOS_ENSHURE(!myRegistry->destroy( OUString::createFromAscii("merge1.rdb") ), "test_registry_CppApi error 11"); + VOS_ENSHURE(!myRegistry->destroy( OUString::createFromAscii("merge2.rdb") ), "test_registry_CppApi error 12"); + VOS_ENSHURE(!myRegistry->destroy( OUString() ), "test_registry_CppApi error 13"); + + delete(myRegistry); + + cout << "test_merge() Ok!\n"; + return; +} + + diff --git a/registry/test/testregcpp.cxx b/registry/test/testregcpp.cxx new file mode 100644 index 000000000000..ffdbdb8d721e --- /dev/null +++ b/registry/test/testregcpp.cxx @@ -0,0 +1,738 @@ +/************************************************************************* + * + * $RCSfile: testregcpp.cxx,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:18:43 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +#include +#include +#include + +#include "registry/registry.hxx" +#include "registry/reflread.hxx" +#include "registry/reflwrit.hxx" + + +#ifndef _VOS_MODULE_HXX +#include +#endif + +#ifndef _VOS_DIAGNOSE_HXX +#include +#endif + +#ifndef _RTL_ALLOC_H_ +#include +#endif + +#ifndef _RTL_USTRING_HXX_ +#include +#endif + +using namespace rtl; + +void test_coreReflection() +{ + RegistryLoader* pLoader = new RegistryLoader(); + + if (!pLoader->isLoaded()) + { + delete pLoader; + return; + } + + RegistryTypeWriterLoader* pWriterLoader = new RegistryTypeWriterLoader(); + + if (!pWriterLoader->isLoaded()) + { + delete pWriterLoader; + return; + } + + RegistryTypeReaderLoader* pReaderLoader = new RegistryTypeReaderLoader(); + + if (!pReaderLoader->isLoaded()) + { + delete pReaderLoader; + return; + } + + Registry *myRegistry = new Registry(*pLoader); + delete pLoader; + + RegistryKey rootKey, key1, key2, key3, key4 ,key5, key6, key7, key8; + + VOS_ENSHURE(!myRegistry->create(OUString::createFromAscii("ucrtest.rdb")), "testCoreReflection error 1"); + VOS_ENSHURE(!myRegistry->openRootKey(rootKey), "testCoreReflection error 2"); + + VOS_ENSHURE(!rootKey.createKey(OUString::createFromAscii("UCR"), key1), "testCoreReflection error 3"); + VOS_ENSHURE(!key1.createKey(OUString::createFromAscii("ModuleA"), key2), "testCoreReflection error 4"); + VOS_ENSHURE(!key2.createKey(OUString::createFromAscii("StructA"), key3), "testCoreReflection error 5"); + VOS_ENSHURE(!key2.createKey(OUString::createFromAscii("EnumA"), key4), "testCoreReflection error 6"); + VOS_ENSHURE(!key2.createKey(OUString::createFromAscii("XInterfaceA"), key5), "testCoreReflection error 7"); + VOS_ENSHURE(!key2.createKey(OUString::createFromAscii("ExceptionA"), key6), "testCoreReflection error 8"); + VOS_ENSHURE(!key2.createKey(OUString::createFromAscii("ServiceA"), key7), "testCoreReflection error 8a"); + VOS_ENSHURE(!key2.createKey(OUString::createFromAscii("ConstantsA"), key8), "testCoreReflection error 8b"); + + { + RegistryTypeWriter writer(*pWriterLoader, + RT_TYPE_MODULE, + OUString::createFromAscii("ModuleA"), + OUString(), 9, 0, 0); + + RTConstValue aConst; + + writer.setDoku(OUString::createFromAscii("Hallo ich bin ein Modul")); + writer.setFileName(OUString::createFromAscii("DummyFile")); + + aConst.m_type = RT_TYPE_BOOL; + aConst.m_value.aBool = sal_True; + writer.setFieldData(0, OUString::createFromAscii("aConstBool"), + OUString::createFromAscii("boolean"), + OUString::createFromAscii("ich bin ein boolean"), + OUString::createFromAscii("DummyFile"), RT_ACCESS_CONST, aConst); + aConst.m_type = RT_TYPE_BYTE; + aConst.m_value.aByte = 127; + writer.setFieldData(1, OUString::createFromAscii("aConstByte"), + OUString::createFromAscii("byte"), + OUString::createFromAscii("ich bin ein byte"), + OUString::createFromAscii("DummyFile"), RT_ACCESS_CONST, aConst); + aConst.m_type = RT_TYPE_INT16; + aConst.m_value.aShort = -10; + writer.setFieldData(2, OUString::createFromAscii("aConstShort"), + OUString::createFromAscii("short"), + OUString::createFromAscii("ich bin ein short"), + OUString::createFromAscii("DummyFile"), RT_ACCESS_CONST, aConst); + aConst.m_type = RT_TYPE_UINT16; + aConst.m_value.aUShort = 10; + writer.setFieldData(3, OUString::createFromAscii("aConstUShort"), + OUString::createFromAscii("unsigned short"), + OUString::createFromAscii("ich bin ein unsigned short"), + OUString::createFromAscii("DummyFile"), RT_ACCESS_CONST, aConst); + aConst.m_type = RT_TYPE_INT32; + aConst.m_value.aLong = -100000; + writer.setFieldData(4, OUString::createFromAscii("aConstLong"), + OUString::createFromAscii("long"), + OUString::createFromAscii("ich bin ein long"), + OUString::createFromAscii("DummyFile"), RT_ACCESS_CONST, aConst); + aConst.m_type = RT_TYPE_UINT32; + aConst.m_value.aULong = 100000; + writer.setFieldData(5, OUString::createFromAscii("aConstULong"), + OUString::createFromAscii("unsigned long"), + OUString::createFromAscii("ich bin ein unsigned long"), + OUString::createFromAscii("DummyFile"), RT_ACCESS_CONST, aConst); + aConst.m_type = RT_TYPE_FLOAT; + aConst.m_value.aFloat = -2e-10f; + writer.setFieldData(6, OUString::createFromAscii("aConstFloat"), + OUString::createFromAscii("float"), + OUString::createFromAscii("ich bin ein float"), + OUString::createFromAscii("DummyFile"), RT_ACCESS_CONST, aConst); + aConst.m_type = RT_TYPE_DOUBLE; + aConst.m_value.aDouble = -2e-100; writer.setFieldData(7, OUString::createFromAscii("aConstDouble"), + OUString::createFromAscii("double"), + OUString::createFromAscii("ich bin ein double"), + OUString::createFromAscii("DummyFile"), RT_ACCESS_CONST, aConst); + aConst.m_type = RT_TYPE_STRING; + OUString tmpStr(OUString::createFromAscii( "dies ist ein unicode string" )); + aConst.m_value.aString = tmpStr.getStr(); + + writer.setFieldData(8, OUString::createFromAscii("aConstString"), + OUString::createFromAscii("string"), + OUString::createFromAscii("ich bin ein string"), + OUString::createFromAscii("DummyFile"), RT_ACCESS_CONST, aConst); + + const sal_uInt8* pBlop = writer.getBlop(); + sal_uInt32 aBlopSize = writer.getBlopSize(); + + VOS_ENSHURE(!key2.setValue(OUString(), RG_VALUETYPE_BINARY, (void*)pBlop, aBlopSize), "testCoreReflection error 9"); + + sal_uInt8* readBlop = (sal_uInt8*)rtl_allocateMemory(aBlopSize); + VOS_ENSHURE(!key2.getValue(OUString(), (void*)readBlop) , "testCoreReflection error 9a"); + + RegistryTypeReader reader(*pReaderLoader, readBlop, aBlopSize, sal_True); + + if (reader.isValid()) + { + RTConstValue aReadConst = reader.getFieldConstValue(8); + OString aConstStr = OUStringToOString(aConst.m_value.aString, RTL_TEXTENCODING_ASCII_US); + VOS_ENSHURE(aConstStr.equals("dies ist ein unicode string"), "testCoreReflection error 9b"); + } + + } + + { + RegistryTypeWriter writer(*pWriterLoader, + RT_TYPE_STRUCT, + OUString::createFromAscii("ModuleA/StructA"), + OUString(), 3, 0, 0); + + writer.setDoku(OUString::createFromAscii("Hallo ich bin eine Struktur")); + writer.setFileName(OUString::createFromAscii("DummyFile")); + + writer.setFieldData(0, OUString::createFromAscii("asal_uInt32"), + OUString::createFromAscii("unsigned long"), + OUString(), OUString(), RT_ACCESS_READWRITE); + writer.setFieldData(1, OUString::createFromAscii("aXInterface"), + OUString::createFromAscii("stardiv/uno/XInterface"), + OUString(), OUString(), RT_ACCESS_READWRITE); + writer.setFieldData(2, OUString::createFromAscii("aSequence"), + OUString::createFromAscii("[]ModuleA/EnumA"), + OUString(), OUString(), RT_ACCESS_READWRITE); + + const sal_uInt8* pBlop = writer.getBlop(); + sal_uInt32 aBlopSize = writer.getBlopSize(); + + VOS_ENSHURE(!key3.setValue(OUString(), RG_VALUETYPE_BINARY, (void*)pBlop, aBlopSize), "testCoreReflection error 9a"); + } + + { + RegistryTypeWriter writer(*pWriterLoader, + RT_TYPE_ENUM, + OUString::createFromAscii("ModuleA/EnumA"), + OUString(), 2, 0, 0); + + RTConstValue aConst; + + aConst.m_type = RT_TYPE_UINT32; + aConst.m_value.aULong = 10; + + writer.setDoku(OUString::createFromAscii("Hallo ich bin ein Enum")); + writer.setFileName(OUString::createFromAscii("DummyFile")); + + writer.setFieldData(0, OUString::createFromAscii("ENUM_VAL_1"), + OUString(), OUString::createFromAscii("ich bin ein enum value"), + OUString(), RT_ACCESS_CONST, aConst); + + aConst.m_value.aULong = 10; + writer.setFieldData(1, OUString::createFromAscii("ENUM_VAL_2"), + OUString(), OUString(), OUString(), RT_ACCESS_CONST, aConst); + + const sal_uInt8* pBlop = writer.getBlop(); + sal_uInt32 aBlopSize = writer.getBlopSize(); + + VOS_ENSHURE(!key4.setValue(OUString(), RG_VALUETYPE_BINARY, (void*)pBlop, aBlopSize), "testCoreReflection error 9b"); + } + + { + RegistryTypeWriter writer(*pWriterLoader, + RT_TYPE_INTERFACE, + OUString::createFromAscii("ModuleA/XInterfaceA"), + OUString::createFromAscii("stardiv/uno/XInterface"), + 4, 1, 0); + RTConstValue aConst; + + RTUik aUik = {1,2,3,4,5}; + + writer.setUik(aUik); + writer.setDoku(OUString::createFromAscii("Hallo ich bin ein Interface")); + writer.setFileName(OUString::createFromAscii("DummyFile")); + + writer.setFieldData(0, OUString::createFromAscii("aString"), + OUString::createFromAscii("string"), OUString(), OUString(), RT_ACCESS_READWRITE); + writer.setFieldData(1, OUString::createFromAscii("aStruct"), + OUString::createFromAscii("ModuleA/StructA"), + OUString(), OUString(), RT_ACCESS_READONLY); + writer.setFieldData(2, OUString::createFromAscii("aEnum"), + OUString::createFromAscii("ModuleA/EnumA"), OUString(), OUString(), RT_ACCESS_BOUND); + aConst.m_type = RT_TYPE_UINT16; + aConst.m_value.aUShort = 12; + writer.setFieldData(3, OUString::createFromAscii("aConstUShort"), + OUString::createFromAscii("unsigned short"), OUString(), + OUString::createFromAscii("DummyFile"), RT_ACCESS_CONST, aConst); + + writer.setMethodData(0, OUString::createFromAscii("methodA"), + OUString::createFromAscii("double"), RT_MODE_TWOWAY, 2, 1, + OUString::createFromAscii("Hallo ich bin die methodA")); + writer.setParamData(0, 0, OUString::createFromAscii("ModuleA/StructA"), + OUString::createFromAscii("aStruct"), RT_PARAM_IN); + writer.setParamData(0, 1, OUString::createFromAscii("unsigned short"), + OUString::createFromAscii("aShort"), RT_PARAM_INOUT); + writer.setExcData(0, 0, OUString::createFromAscii("ModuleA/ExceptionA")); + + const sal_uInt8* pBlop = writer.getBlop(); + sal_uInt32 aBlopSize = writer.getBlopSize(); + + VOS_ENSHURE(!key5.setValue(OUString(), RG_VALUETYPE_BINARY, (void*)pBlop, aBlopSize), "testCoreReflection error 9c"); + } + + { + RegistryTypeWriter writer(*pWriterLoader, + RT_TYPE_EXCEPTION, + OUString::createFromAscii("ModuleA/ExceptionA"), + OUString(), 1, 0, 0); + + writer.setDoku(OUString::createFromAscii("Hallo ich bin eine Exception")); + + writer.setFieldData(0, OUString::createFromAscii("aSource"), + OUString::createFromAscii("stardiv/uno/XInterface"), + OUString::createFromAscii("ich bin ein interface member"), + OUString(), RT_ACCESS_READWRITE); + + const sal_uInt8* pBlop = writer.getBlop(); + sal_uInt32 aBlopSize = writer.getBlopSize(); + + VOS_ENSHURE(!key6.setValue(OUString(), RG_VALUETYPE_BINARY, (void*)pBlop, aBlopSize), "testCoreReflection error 9d"); + } + + { + RegistryTypeWriter writer(*pWriterLoader, + RT_TYPE_SERVICE, + OUString::createFromAscii("ModuleA/ServiceA"), + OUString(), 1, 0, 4); + + writer.setDoku(OUString::createFromAscii("Hallo ich bin ein Service")); + writer.setFileName(OUString::createFromAscii("DummyFile")); + + writer.setFieldData(0, OUString::createFromAscii("aProperty"), + OUString::createFromAscii("stardiv/uno/XInterface"), + OUString::createFromAscii("ich bin eine property"), + OUString(), RT_ACCESS_READWRITE); + + writer.setReferenceData(0, OUString::createFromAscii("ModuleA/XInterfaceA"), RT_REF_SUPPORTS, + OUString::createFromAscii("Hallo ich eine Reference auf ein supported interface"), + RT_ACCESS_OPTIONAL); + writer.setReferenceData(1, OUString::createFromAscii("ModuleA/XInterfaceA"), RT_REF_OBSERVES, + OUString::createFromAscii("Hallo ich eine Reference auf ein observed interface")); + writer.setReferenceData(2, OUString::createFromAscii("ModuleA/ServiceB"), RT_REF_EXPORTS, + OUString::createFromAscii("Hallo ich eine Reference auf einen exported service")); + writer.setReferenceData(3, OUString::createFromAscii("ModuleA/ServiceB"), RT_REF_NEEDS, + OUString::createFromAscii("Hallo ich eine Reference auf einen needed service")); + + const sal_uInt8* pBlop = writer.getBlop(); + sal_uInt32 aBlopSize = writer.getBlopSize(); + + VOS_ENSHURE(!key7.setValue(OUString(), RG_VALUETYPE_BINARY, (void*)pBlop, aBlopSize), "testCoreReflection error 9e"); + } + + { + RegistryTypeWriter writer(*pWriterLoader, + RT_TYPE_CONSTANTS, + OUString::createFromAscii("ModuleA/ConstansA"), + OUString(), 3, 0, 0); + + RTConstValue aConst; + + writer.setDoku(OUString::createFromAscii("Hallo ich bin eine Constants Group")); + writer.setFileName(OUString::createFromAscii("DummyFile")); + + aConst.m_type = RT_TYPE_BOOL; + aConst.m_value.aBool = sal_True; + writer.setFieldData(0, OUString::createFromAscii("ConstantsA_aConstBool"), + OUString::createFromAscii("boolean"), + OUString::createFromAscii("ich bin ein boolean"), + OUString::createFromAscii("DummyFile"), RT_ACCESS_CONST, aConst); + aConst.m_type = RT_TYPE_BYTE; + aConst.m_value.aByte = 127; + writer.setFieldData(1, OUString::createFromAscii("ConstantsA_aConstByte"), + OUString::createFromAscii("byte"), + OUString::createFromAscii("ich bin ein byte"), + OUString::createFromAscii("DummyFile"), RT_ACCESS_CONST, aConst); + aConst.m_type = RT_TYPE_INT16; + aConst.m_value.aShort = -10; + writer.setFieldData(2, OUString::createFromAscii("ConstantsA_aConstShort"), + OUString::createFromAscii("short"), + OUString::createFromAscii("ich bin ein short"), + OUString::createFromAscii("DummyFile"), RT_ACCESS_CONST, aConst); + + const sal_uInt8* pBlop = writer.getBlop(); + sal_uInt32 aBlopSize = writer.getBlopSize(); + + VOS_ENSHURE(!key8.setValue(OUString(), RG_VALUETYPE_BINARY, (void*)pBlop, aBlopSize), "testCoreReflection error 9f"); + } + + delete pWriterLoader; + +// VOS_ENSHURE(!myRegistry->destroy(NULL), "testCoreReflection error 10"); + delete myRegistry; + + cout << "test_coreReflection() Ok!\n"; +} + +void test_registry_CppApi() +{ + RegistryLoader* pLoader = new RegistryLoader(); + + if (!pLoader->isLoaded()) + { + delete pLoader; + return; + } + + Registry *myRegistry = new Registry(*pLoader); + delete pLoader; + + RegistryKey rootKey, key1, key2, key3, key4 ,key5, key6, key7, key8, key9; + + VOS_ENSHURE(!myRegistry->create(OUString::createFromAscii("test.rdb")), "test_registry_CppApi error 1"); + VOS_ENSHURE(!myRegistry->openRootKey(rootKey), "test_registry_CppApi error 2"); + + VOS_ENSHURE(!rootKey.createKey(OUString::createFromAscii("myFirstKey"), key1), "test_registry_CppApi error 3"); + VOS_ENSHURE(!rootKey.createKey(OUString::createFromAscii("mySecondKey"), key2), "test_registry_CppApi error 4"); + VOS_ENSHURE(!key1.createKey(OUString::createFromAscii("X"), key3), "test_registry_CppApi error 5"); + VOS_ENSHURE(!key1.createKey(OUString::createFromAscii("mySecondSubKey"), key4), "test_registry_CppApi error 6"); + VOS_ENSHURE(!rootKey.createKey(OUString::createFromAscii("myThirdKey"), key5), "test_registry_CppApi error 6a"); + + VOS_ENSHURE(!key5.createKey(OUString::createFromAscii("1"), key4), "test_registry_CppApi error 6b"); + VOS_ENSHURE(!key4.createKey(OUString::createFromAscii("2"), key3), "test_registry_CppApi error 6c"); + VOS_ENSHURE(!key5.openKey(OUString::createFromAscii("1"), key4), "test_registry_CppApi error 6d"); + VOS_ENSHURE(!rootKey.openKey(OUString::createFromAscii("/myThirdKey/1"), key4), "test_registry_CppApi error 6e"); + VOS_ENSHURE(key4.getName().equals(OUString::createFromAscii("/myThirdKey/1")), "test_registry_CppApi error 6f"); + + VOS_ENSHURE(!rootKey.createKey(OUString::createFromAscii("myFourthKey"), key6), "test_registry_CppApi error 7"); + VOS_ENSHURE(!rootKey.createKey(OUString::createFromAscii("myFifthKey"), key6), "test_registry_CppApi error 7a"); + VOS_ENSHURE(!rootKey.createKey(OUString::createFromAscii("mySixthKey"), key6), "test_registry_CppApi error 7b"); + + // Link Test + // + + VOS_ENSHURE(!rootKey.createKey(OUString::createFromAscii("/myFourthKey/X"), key7), "test_registry_CppApi error 7c)");; + VOS_ENSHURE(!key6.createLink(OUString::createFromAscii("myFirstLink"), OUString::createFromAscii("/myFourthKey/X")), "test_registry_CppApi error 7d"); + VOS_ENSHURE(!key6.createKey(OUString::createFromAscii("mySixthSubKey"), key7), "test_registry_CppApi error 7e"); + + OUString linkTarget; + VOS_ENSHURE(!key6.getLinkTarget(OUString::createFromAscii("myFirstLink"), linkTarget), "test_registry_CppApi error 7f"); + VOS_ENSHURE(linkTarget.equals(OUString::createFromAscii("/myFourthKey/X")), "test_registry_CppApi error 7g"); + + RegistryKeyNames* pSubKeyNames = new RegistryKeyNames(); + sal_uInt32 nSubKeys=0; + + VOS_ENSHURE(!rootKey.getKeyNames(OUString::createFromAscii("mySixthKey"), *pSubKeyNames), "test_registry_CppApi error 7h)"); + VOS_ENSHURE(pSubKeyNames->getLength() == 2, "test_registry_CppApi error 7i)"); + + for (sal_uInt32 i=0; i < pSubKeyNames->getLength(); i++) + { + if (pSubKeyNames->getElement(i).equals(OUString::createFromAscii("/mySixthKey/myFirstLink"))) + { + RegKeyType keyType; + VOS_ENSHURE(!rootKey.getKeyType(pSubKeyNames->getElement(i), &keyType), "test_registry_CppApi error 7j"); + VOS_ENSHURE(keyType == RG_LINKTYPE, "test_registry_CppApi error 7k"); + } + } + + VOS_ENSHURE(!key7.closeKey(), "test_registry_CppApi error 7k1"); + delete pSubKeyNames; + + VOS_ENSHURE(!rootKey.openKey(OUString::createFromAscii("/mySixthKey/myFirstLink"), key6), "test_registry_CppApi error 7l"); + VOS_ENSHURE(key6.getName().equals(OUString::createFromAscii("/myFourthKey/X")), "test_registry_CppApi error 7m"); + + VOS_ENSHURE(!rootKey.openKey(OUString::createFromAscii("myFifthKey"), key6), "test_registry_CppApi error 7m1"); + VOS_ENSHURE(!key6.createLink(OUString::createFromAscii("mySecondLink"), + OUString::createFromAscii("/mySixthKey/myFirstLink")), "test_registry_CppApi error 7m2"); + + VOS_ENSHURE(!rootKey.openKey(OUString::createFromAscii("/myFifthKey/mySecondLink"), key6), "test_registry_CppApi error 7m3"); + VOS_ENSHURE(key6.getName().equals(OUString::createFromAscii("/myFourthKey/X")), "test_registry_CppApi error 7m4"); + + VOS_ENSHURE(!rootKey.createKey(OUString::createFromAscii("/myFifthKey/mySecondLink/myFirstLinkSubKey"), key7), "test_registry_CppApi error 7m5"); + VOS_ENSHURE(key7.getName().equals(OUString::createFromAscii("/myFourthKey/X/myFirstLinkSubKey")), "test_registry_CppApi error 7m6"); + + VOS_ENSHURE(!key7.createLink(OUString::createFromAscii("myThirdLink"), OUString::createFromAscii("/myFifthKey/mySecondLink")), "test_registry_CppApi error 7m7"); + VOS_ENSHURE(!rootKey.openKey(OUString::createFromAscii("/myFourthKey/X/myFirstLinkSubKey/myThirdLink"), key7), "test_registry_CppApi error 7m8"); + VOS_ENSHURE(!key7.openKey(OUString::createFromAscii("/myFirstLinkSubKey/myThirdLink/myFirstLinkSubKey/myThirdLink"), key6), "test_registry_CppApi error 7m9"); + VOS_ENSHURE(key7.getName().equals(OUString::createFromAscii("/myFourthKey/X")), "test_registry_CppApi error 7m10"); + VOS_ENSHURE(!key7.closeKey(), "test_registry_CppApi error 7m11"); + + VOS_ENSHURE(!rootKey.deleteLink(OUString::createFromAscii("/myFifthKey/mySecondLink")), "test_registry_CppApi error 7m12"); + + VOS_ENSHURE(!rootKey.createLink(OUString::createFromAscii("/myFifthKey/mySecondLink"), + OUString::createFromAscii("/myFourthKey/X/myFirstLinkSubKey/myThirdLink")), + "test_registry_CppApi error 7m13"); + + VOS_ENSHURE(rootKey.openKey(OUString::createFromAscii("/myFourthKey/X/myFirstLinkSubKey/myThirdLink"), key7) == REG_DETECT_RECURSION, + "test_registry_CppApi error 7m14"); + + VOS_ENSHURE(key7.closeKey() == REG_INVALID_KEY, "test_registry_CppApi error 7m11"); + + RegistryKeyNames subKeyNames; + nSubKeys=0; + + VOS_ENSHURE(!rootKey.getKeyNames(OUString::createFromAscii("mySixthKey"), subKeyNames), "test_registry_CppApi error 7n"); + + nSubKeys = subKeyNames.getLength(); + VOS_ENSHURE(nSubKeys == 2, "test_registry_CppApi error 7n1"); + VOS_ENSHURE(subKeyNames.getElement(0).equals(OUString::createFromAscii("/mySixthKey/myFirstLink")), "test_registry_CppApi error 7p1)"); + VOS_ENSHURE(subKeyNames.getElement(1).equals(OUString::createFromAscii("/mySixthKey/mySixthSubKey")), "test_registry_CppApi error 7p2"); + + + RegistryKeyArray subKeys; + nSubKeys=0; + + VOS_ENSHURE(!rootKey.openSubKeys(OUString::createFromAscii("myFirstKey"), subKeys), "test_registry_CppApi error 7o"); + + nSubKeys = subKeys.getLength(); + VOS_ENSHURE(nSubKeys == 2, "test_registry_CppApi error 7o1"); + VOS_ENSHURE(subKeys.getElement(0).getName().equals(OUString::createFromAscii("/myFirstKey/mySecondSubKey")), "test_registry_CppApi error 7p1)"); + VOS_ENSHURE(subKeys.getElement(1).getName().equals(OUString::createFromAscii("/myFirstKey/X")), "test_registry_CppApi error 7p2"); + + VOS_ENSHURE(!rootKey.closeSubKeys(subKeys), "test_registry_CppApi error 7q)"); + + + VOS_ENSHURE(!rootKey.createKey(OUString::createFromAscii("/TEST"), key8), "test_registry_CppApi error 8"); + VOS_ENSHURE(!rootKey.createKey(OUString::createFromAscii("/TEST/Child1"), key8), "test_registry_CppApi error 8a"); + VOS_ENSHURE(!rootKey.createKey(OUString::createFromAscii("/TEST/Child2"), key8), "test_registry_CppApi error 8a1"); + VOS_ENSHURE(!rootKey.openKey(OUString::createFromAscii("/TEST"), key9), "test_registry_CppApi error 8b"); + VOS_ENSHURE(!key8.closeKey() && !key9.closeKey(), "test_registry_CppApi error 8b1"); + VOS_ENSHURE(!rootKey.openKey(OUString::createFromAscii("/TEST"), key8), "test_registry_CppApi error 8b"); + VOS_ENSHURE(!key8.closeKey(), "test_registry_CppApi error 8c"); + VOS_ENSHURE(!rootKey.openKey(OUString::createFromAscii("TEST"), key8), "test_registry_CppApi error 8c"); + VOS_ENSHURE(!key8.closeKey(), "test_registry_CppApi error 8d"); + + + sal_Char* Value="Mein erster Value"; + VOS_ENSHURE(!rootKey.setValue(OUString::createFromAscii("mySecondKey"), RG_VALUETYPE_STRING, Value, 18), "test_registry_CppApi error 9"); + + RegValueType valueType; + sal_uInt32 valueSize; + sal_Char* readValue; + VOS_ENSHURE(!rootKey.getValueInfo(OUString::createFromAscii("mySecondKey"), &valueType, &valueSize), "test_registry_CppApi error 9a"); + + readValue = (sal_Char*)rtl_allocateMemory(valueSize); + VOS_ENSHURE(!key2.getValue(OUString(), readValue), "test_registry_CppApi error 10"); + + VOS_ENSHURE(valueType == RG_VALUETYPE_STRING, "test_registry_CppApi error 11"); + VOS_ENSHURE(valueSize == 18, "test_registry_CppApi error 12"); + VOS_ENSHURE(strcmp(readValue, Value) == 0, "test_registry_CppApi error 13"); + rtl_freeMemory(readValue); + + const sal_Char* pList[3]; + const sal_Char* n1= "Hallo"; + const sal_Char* n2= "jetzt komm"; + const sal_Char* n3= "ich"; + + pList[0]=n1; + pList[1]=n2; + pList[2]=n3; + + VOS_ENSHURE(!rootKey.setStringListValue(OUString::createFromAscii("myFourthKey"), (sal_Char**)pList, 3), "test_registry_CppApi error 13a"); + + RegistryValueList valueList; + VOS_ENSHURE(!rootKey.getStringListValue(OUString::createFromAscii("myFourthKey"), valueList), "test_registry_CppApi error 13b"); + + VOS_ENSHURE(strcmp(n1, valueList.getElement(0)) == 0, "test_registry_CppApi error 13c"); + VOS_ENSHURE(strcmp(n2, valueList.getElement(1)) == 0, "test_registry_CppApi error 13d"); + VOS_ENSHURE(strcmp(n3, valueList.getElement(2)) == 0, "test_registry_CppApi error 13e"); + + VOS_ENSHURE(!rootKey.getValueInfo(OUString::createFromAscii("myFourthKey"), &valueType, &valueSize), "test_registry_CppApi error 13e1"); + VOS_ENSHURE(valueType == RG_VALUETYPE_STRINGLIST, "test_registry_CppApi error 13e2"); + VOS_ENSHURE(valueSize == 3, "test_registry_CppApi error 13e3"); + + sal_Int32 pLong[3]; + pLong[0] = 123; + pLong[1] = 456; + pLong[2] = 789; + + VOS_ENSHURE(!rootKey.setLongListValue(OUString::createFromAscii("myFifthKey"), pLong, 3), "test_registry_CppApi error 13f"); + + RegistryValueList longList; + VOS_ENSHURE(!rootKey.getLongListValue(OUString::createFromAscii("myFifthKey"), longList), "test_registry_CppApi error 13g"); + + VOS_ENSHURE(pLong[0] == longList.getElement(0), "test_registry_CppApi error 13h"); + VOS_ENSHURE(pLong[1] == longList.getElement(1), "test_registry_CppApi error 13i"); + VOS_ENSHURE(pLong[2] == longList.getElement(2), "test_registry_CppApi error 13j"); + + + OUString sWTestValue(OUString::createFromAscii( "Mein erster Unicode Value" )); + const sal_Unicode* wTestValue= sWTestValue.getStr(); + VOS_ENSHURE(!rootKey.setValue(OUString::createFromAscii("mySixthKey"), RG_VALUETYPE_UNICODE, (void*)wTestValue, + (rtl_ustr_getLength(wTestValue)+1)*sizeof(sal_Unicode)), "test_registry_CppApi error 13j1"); + + VOS_ENSHURE(!rootKey.getValueInfo(OUString::createFromAscii("mySixthKey"), &valueType, &valueSize), "test_registry_CppApi error 13j2"); + sal_Unicode* pTmpValue = (sal_Unicode*)rtl_allocateMemory(valueSize); + VOS_ENSHURE(!rootKey.getValue(OUString::createFromAscii("mySixthKey"), pTmpValue), "test_registry_CppApi error 13j3"); + VOS_ENSHURE(rtl_ustr_getLength(wTestValue) == rtl_ustr_getLength(pTmpValue), "test_registry_CppApi error 13j4"); + VOS_ENSHURE(rtl_ustr_compare(wTestValue, pTmpValue) == 0, "test_registry_CppApi error 13j4"); + + const sal_Unicode* pUnicode[3]; + OUString w1(OUString::createFromAscii( "Hallo" )); + OUString w2(OUString::createFromAscii( "jetzt komm" )); + OUString w3(OUString::createFromAscii( "ich als unicode" )); + + pUnicode[0]=w1.getStr(); + pUnicode[1]=w2.getStr(); + pUnicode[2]=w3.getStr(); + + VOS_ENSHURE(!rootKey.setUnicodeListValue(OUString::createFromAscii("mySixthKey"), (sal_Unicode**)pUnicode, 3), "test_registry_CppApi error 13k"); + + RegistryValueList unicodeList; + VOS_ENSHURE(!rootKey.getUnicodeListValue(OUString::createFromAscii("mySixthKey"), unicodeList), "test_registry_CppApi error 13l"); + + VOS_ENSHURE(rtl_ustr_compare(w1, unicodeList.getElement(0)) == 0, "test_registry_CppApi error 13m"); + VOS_ENSHURE(rtl_ustr_compare(w2, unicodeList.getElement(1)) == 0, "test_registry_CppApi error 13n"); + VOS_ENSHURE(rtl_ustr_compare(w3, unicodeList.getElement(2)) == 0, "test_registry_CppApi error 13o"); + + VOS_ENSHURE(!key6.closeKey(), "test_registry_CppApi error 14"); + + VOS_ENSHURE(!key1.closeKey() && + !key3.closeKey() && + !key4.closeKey(), "test_registry_CppApi error 14"); + + VOS_ENSHURE(!rootKey.deleteKey(OUString::createFromAscii("myFirstKey")), "test_registry_CppApi error 15"); + + VOS_ENSHURE(!key2.closeKey(), "test_registry_CppApi error 16"); + VOS_ENSHURE(!rootKey.openKey(OUString::createFromAscii("mySecondKey"), key2), "test_registry_CppApi error 17"); + + VOS_ENSHURE(!key5.closeKey(), "test_registry_CppApi error 18"); + + VOS_ENSHURE(!rootKey.deleteKey(OUString::createFromAscii("myThirdKey")), "test_registry_CppApi error 19"); + + VOS_ENSHURE(rootKey.openKey(OUString::createFromAscii("myThirdKey"), key5), "test_registry_CppApi error 20"); + + VOS_ENSHURE(!key2.closeKey() && + !rootKey.closeKey(), "test_registry_CppApi error 21"); + + VOS_ENSHURE(!myRegistry->close(), "test_registry_CppApi error 22"); + + // Test loadkey + RegistryKey rootKey2, key21, key22, key23, key24 , key25; + + VOS_ENSHURE(!myRegistry->create(OUString::createFromAscii("test2.rdb")), "test_registry_CppApi error 23"); + VOS_ENSHURE(!myRegistry->openRootKey(rootKey2), "test_registry_CppApi error 24"); + + VOS_ENSHURE(!rootKey2.createKey(OUString::createFromAscii("reg2FirstKey"), key21), "test_registry_CppApi error 25"); + VOS_ENSHURE(!rootKey2.createKey(OUString::createFromAscii("reg2SecondKey"), key22), "test_registry_CppApi error 26"); + VOS_ENSHURE(!key21.createKey(OUString::createFromAscii("reg2FirstSubKey"), key23), "test_registry_CppApi error 27"); + VOS_ENSHURE(!key21.createKey(OUString::createFromAscii("reg2SecondSubKey"), key24), "test_registry_CppApi error 28"); + VOS_ENSHURE(!rootKey2.createKey(OUString::createFromAscii("reg2ThirdKey"), key25), "test_registry_CppApi error 29"); + + sal_uInt32 nValue= 123456789; + VOS_ENSHURE(!key23.setValue(OUString(), RG_VALUETYPE_LONG, &nValue, sizeof(sal_uInt32)), "test_registry_CppApi error 30"); + + VOS_ENSHURE(!key21.closeKey() && + !key22.closeKey() && + !key23.closeKey() && + !key24.closeKey() && + !key25.closeKey() && + !rootKey2.closeKey(), "test_registry_CppApi error 31"); + + VOS_ENSHURE(!myRegistry->close(), "test_registry_CppApi error 32"); + + VOS_ENSHURE(!myRegistry->open(OUString::createFromAscii("test.rdb"), REG_READWRITE), "test_registry_CppApi error 33"); + VOS_ENSHURE(!myRegistry->openRootKey(rootKey), "test_registry_CppApi error 34"); + + VOS_ENSHURE(!myRegistry->loadKey(rootKey, OUString::createFromAscii("allFromTest2"), + OUString::createFromAscii("test2.rdb")), "test_registry_CppApi error 35"); + VOS_ENSHURE(!myRegistry->saveKey(rootKey, OUString::createFromAscii("allFromTest2"), + OUString::createFromAscii("test3.rdb")), "test_registry_CppApi error 36"); + + VOS_ENSHURE(!rootKey.createKey(OUString::createFromAscii("allFromTest3"), key1), "test_registry_CppApi error 37"); + VOS_ENSHURE(!key1.createKey(OUString::createFromAscii("myFirstKey2"), key2), "test_registry_CppApi error 38"); + VOS_ENSHURE(!key1.createKey(OUString::createFromAscii("mySecondKey2"), key3), "test_registry_CppApi error 39"); + + VOS_ENSHURE(!myRegistry->mergeKey(rootKey, OUString::createFromAscii("allFromTest3"), + OUString::createFromAscii("test3.rdb")), "test_registry_CppApi error 40"); + VOS_ENSHURE(!myRegistry->mergeKey(rootKey, OUString::createFromAscii("allFromTest3"), + OUString::createFromAscii("ucrtest.rdb"), sal_True), "test_registry_CppApi error 40.a)"); + + VOS_ENSHURE(myRegistry->mergeKey(rootKey, OUString::createFromAscii("allFromTest3"), OUString::createFromAscii("ucrtest.rdb"), sal_True) + == REG_NO_ERROR/*REG_MERGE_CONFLICT*/, "test_registry_CppApi error 40.b)"); + + VOS_ENSHURE(!key1.closeKey() && + !key2.closeKey(), "test_registry_CppApi error 41"); + + const sal_Unicode* wValue= OUString::createFromAscii( "Mein erster Unicode Value" ).getStr(); + VOS_ENSHURE(!key3.setValue(OUString(), RG_VALUETYPE_UNICODE, (void*)wValue, + (rtl_ustr_getLength(wValue)+1)*sizeof(sal_Unicode)), "test_registry_CppApi error 42"); + + VOS_ENSHURE(!key3.closeKey(), "test_registry_CppApi error 43"); + + VOS_ENSHURE(!rootKey.openKey(OUString::createFromAscii("/allFromTest3/reg2FirstKey/reg2FirstSubKey"), key1), + "test_registry_CppApi error 43.a)"); + VOS_ENSHURE(!rootKey.deleteKey(OUString::createFromAscii("/allFromTest3/reg2FirstKey/reg2FirstSubKey")), "test_registry_CppApi error 44"); + VOS_ENSHURE(key1.getValueInfo(OUString(), &valueType, &valueSize) == REG_INVALID_KEY, + "test_registry_CppApi error 44.a)"); + VOS_ENSHURE(!key1.closeKey(), "test_registry_CppApi error 44.b)"); + + VOS_ENSHURE(!rootKey.closeKey(), "test_registry_CppApi error 45"); + + VOS_ENSHURE(!myRegistry->close(), "test_registry_CppApi error 46"); + + VOS_ENSHURE(!myRegistry->open(OUString::createFromAscii("test.rdb"), REG_READWRITE), "test_registry_CppApi error 47"); + + VOS_ENSHURE(!myRegistry->destroy(OUString::createFromAscii("test2.rdb")), "test_registry_CppApi error 48"); +// VOS_ENSHURE(!myRegistry->destroy("test3.rdb"), "test_registry_CppApi error 49"); + + Registry *myRegistry2 = new Registry(*myRegistry); + + VOS_ENSHURE(myRegistry->destroy(OUString()), "test_registry_CppApi error 50"); + + delete(myRegistry2); + + VOS_ENSHURE(!myRegistry->create(OUString::createFromAscii("destroytest.rdb")), "test_registry_CppApi error 51"); + VOS_ENSHURE(!myRegistry->close(), "test_registry_CppApi error 52"); + VOS_ENSHURE(!myRegistry->open(OUString::createFromAscii("destroytest.rdb"), REG_READONLY), "test_registry_CppApi error 53"); + VOS_ENSHURE(!myRegistry->openRootKey(rootKey), "test_registry_CppApi error 54"); + + VOS_ENSHURE(myRegistry->mergeKey(rootKey, OUString::createFromAscii("allFromTest3"), + OUString::createFromAscii("test3.rdb")), "test_registry_CppApi error 55"); + VOS_ENSHURE(!myRegistry->destroy(OUString::createFromAscii("test3.rdb")), "test_registry_CppApi error 56"); + + VOS_ENSHURE(!rootKey.closeKey(), "test_registry_CppApi error 57"); + VOS_ENSHURE(!myRegistry->close(), "test_registry_CppApi error 58"); + VOS_ENSHURE(!myRegistry->open(OUString::createFromAscii("destroytest.rdb"), REG_READWRITE), "test_registry_CppApi error 59"); + VOS_ENSHURE(!myRegistry->destroy(OUString()), "test_registry_CppApi error 60"); + + VOS_ENSHURE(!myRegistry->open(OUString::createFromAscii("test.rdb"), REG_READWRITE), "test_registry_CppApi error 61"); + VOS_ENSHURE(!myRegistry->destroy(OUString::createFromAscii("ucrtest.rdb")), "test_registry_CppApi error 62"); + VOS_ENSHURE(!myRegistry->destroy(OUString()), "test_registry_CppApi error 63"); + delete(myRegistry); + + cout << "test_registry_CppApi() Ok!\n"; + + return; +} + + diff --git a/registry/tools/makefile.mk b/registry/tools/makefile.mk new file mode 100644 index 000000000000..d08b710076eb --- /dev/null +++ b/registry/tools/makefile.mk @@ -0,0 +1,111 @@ +#************************************************************************* +# +# $RCSfile: makefile.mk,v $ +# +# $Revision: 1.1.1.1 $ +# +# last change: $Author: hr $ $Date: 2000-09-18 15:18:43 $ +# +# The Contents of this file are made available subject to the terms of +# either of the following licenses +# +# - GNU Lesser General Public License Version 2.1 +# - Sun Industry Standards Source License Version 1.1 +# +# Sun Microsystems Inc., October, 2000 +# +# GNU Lesser General Public License Version 2.1 +# ============================================= +# Copyright 2000 by Sun Microsystems, Inc. +# 901 San Antonio Road, Palo Alto, CA 94303, USA +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License version 2.1, as published by the Free Software Foundation. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, +# MA 02111-1307 USA +# +# +# Sun Industry Standards Source License Version 1.1 +# ================================================= +# The contents of this file are subject to the Sun Industry Standards +# Source License Version 1.1 (the "License"); You may not use this file +# except in compliance with the License. You may obtain a copy of the +# License at http://www.openoffice.org/license.html. +# +# Software provided under this License is provided on an "AS IS" basis, +# WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, +# WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, +# MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. +# See the License for the specific provisions governing your rights and +# obligations concerning the Software. +# +# The Initial Developer of the Original Code is: Sun Microsystems, Inc. +# +# Copyright: 2000 by Sun Microsystems, Inc. +# +# All Rights Reserved. +# +# Contributor(s): _______________________________________ +# +# +# +#************************************************************************* + +PRJ=.. + +PRJNAME=registry +TARGET=regmerge +TARGETTYPE=CUI +LIBTARGET=NO + +# --- Settings ----------------------------------------------------- +.INCLUDE : svpre.mk +.INCLUDE : settings.mk +.INCLUDE : sv.mk + +.INCLUDE : ..$/version.mk + +# --- Files -------------------------------------------------------- +CDEFS += -DDLL_VERSION=\"$(UPD)$(DLLPOSTFIX)\" + +CXXFILES= regview.cxx \ + regmerge.cxx + + +APP1TARGET= $(TARGET) +APP1OBJS= $(OBJ)$/regmerge.obj + +APP1STDLIBS=\ + $(SALLIB) \ + $(VOSLIB) \ + $(REGLIB) + +.IF "$(GUI)"=="WNT" +APP1STDLIBS+= \ + $(LIBCIMT) $(LIBCMT) +.ENDIF + + +APP2TARGET= regview +APP2OBJS= $(OBJ)$/regview.obj + +APP2STDLIBS=\ + $(SALLIB) \ + $(VOSLIB) \ + $(REGLIB) + +.IF "$(GUI)"=="WNT" +APP2STDLIBS+= \ + $(LIBCIMT) $(LIBCMT) +.ENDIF + +.INCLUDE : target.mk diff --git a/registry/tools/regmerge.cxx b/registry/tools/regmerge.cxx new file mode 100644 index 000000000000..73f530dafceb --- /dev/null +++ b/registry/tools/regmerge.cxx @@ -0,0 +1,217 @@ +/************************************************************************* + * + * $RCSfile: regmerge.cxx,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:18:43 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +#include +#include + +#include "registry/registry.h" + +#ifndef _RTL_USTRING_HXX_ +#include +#endif + +#ifndef _RTL_ALLOC_H_ +#include +#endif + +int realargc; +char* realargv[2048]; + +static void checkCommandFile(char* cmdfile) +{ + FILE *commandfile; + char option[256]; + + commandfile = fopen(cmdfile+1, "r"); + if( commandfile == NULL ) + { + fprintf(stderr, "ERROR: Can't open command file \"%s\"\n", cmdfile); + } else + { + while ( fscanf(commandfile, "%s", option) != EOF ) + { + if (option[0]== '@') + { + checkCommandFile(option); + } else + { + realargv[realargc]= strdup(option); + realargc++; + } + + if (realargc == 2047) + { + fprintf(stderr, "ERROR: more than 2048 arguments.\n"); + break; + } + } + fclose(commandfile); + } +} + +static void checkCommandArgs(int argc, char **argv) +{ + realargc = 0; + + for (int i=0; i + +#include "registry/registry.h" + +#ifndef _RTL_USTRING_HXX_ +#include +#endif + +#ifndef _RTL_ALLOC_H_ +#include +#endif + +#if (defined UNX) || (defined OS2) +int main( int argc, char * argv[] ) +#else +int _cdecl main( int argc, char * argv[] ) +#endif +{ + RegHandle hReg; + RegKeyHandle hRootKey, hKey; + + if (argc < 2 || argc > 3) + { + fprintf(stderr, "using: regview registryfile [keyName]\n"); + exit(1); + } + + ::rtl::OUString regName( ::rtl::OUString::createFromAscii(argv[1]) ); + if (reg_openRegistry(regName.pData, &hReg, REG_READONLY)) + { + fprintf(stderr, "open registry \"%s\" failed\n", argv[1]); + exit(1); + } + + if (!reg_openRootKey(hReg, &hRootKey)) + { + if (argc == 3) + { + ::rtl::OUString keyName( ::rtl::OUString::createFromAscii(argv[2]) ); + if (!reg_openKey(hRootKey, keyName.pData, &hKey)) + { + if (reg_dumpRegistry(hKey)) + { + fprintf(stderr, "dumping registry \"%s\" failed\n", argv[1]); + } + + if (reg_closeKey(hKey)) + { + fprintf(stderr, "closing key \"%s\" of registry \"%s\" failed\n", + argv[2], argv[1]); + } + } else + { + fprintf(stderr, "key \"%s\" not exists in registry \"%s\"\n", + argv[2], argv[1]); + } + } else + { + if (reg_dumpRegistry(hRootKey)) + { + fprintf(stderr, "dumping registry \"%s\" failed\n", argv[1]); + } + } + + if (reg_closeKey(hRootKey)) + { + fprintf(stderr, "closing root key of registry \"%s\" failed\n", argv[1]); + } + } else + { + fprintf(stderr, "open root key of registry \"%s\" failed\n", argv[1]); + } + + if (reg_closeRegistry(hReg)) + { + fprintf(stderr, "closing registry \"%s\" failed\n", argv[1]); + exit(1); + } + + return(0); +} + + diff --git a/registry/util/makefile.mk b/registry/util/makefile.mk new file mode 100644 index 000000000000..b9c9a7384a0d --- /dev/null +++ b/registry/util/makefile.mk @@ -0,0 +1,199 @@ +#************************************************************************* +# +# $RCSfile: makefile.mk,v $ +# +# $Revision: 1.1.1.1 $ +# +# last change: $Author: hr $ $Date: 2000-09-18 15:18:43 $ +# +# The Contents of this file are made available subject to the terms of +# either of the following licenses +# +# - GNU Lesser General Public License Version 2.1 +# - Sun Industry Standards Source License Version 1.1 +# +# Sun Microsystems Inc., October, 2000 +# +# GNU Lesser General Public License Version 2.1 +# ============================================= +# Copyright 2000 by Sun Microsystems, Inc. +# 901 San Antonio Road, Palo Alto, CA 94303, USA +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License version 2.1, as published by the Free Software Foundation. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, +# MA 02111-1307 USA +# +# +# Sun Industry Standards Source License Version 1.1 +# ================================================= +# The contents of this file are subject to the Sun Industry Standards +# Source License Version 1.1 (the "License"); You may not use this file +# except in compliance with the License. You may obtain a copy of the +# License at http://www.openoffice.org/license.html. +# +# Software provided under this License is provided on an "AS IS" basis, +# WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, +# WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, +# MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. +# See the License for the specific provisions governing your rights and +# obligations concerning the Software. +# +# The Initial Developer of the Original Code is: Sun Microsystems, Inc. +# +# Copyright: 2000 by Sun Microsystems, Inc. +# +# All Rights Reserved. +# +# Contributor(s): _______________________________________ +# +# +# +#************************************************************************* + +PRJ=.. + +PRJNAME=registry +TARGET=reg + +# --- Settings ----------------------------------------------------- + +.INCLUDE : svpre.mk +.INCLUDE : settings.mk +.INCLUDE : sv.mk + +.INCLUDE : ..$/version.mk + +# ------------------------------------------------------------------ + +USE_LDUMP2=TRUE +#USE_DEFFILE=TRUE +LDUMP2=LDUMP3 + +DOCPPFILES= $(INC)$/registry$/registry.hxx \ + $(INC)$/registry$/registry.h \ + $(INC)$/registry$/regtype.h \ + $(INC)$/registry$/reflread.hxx \ + $(INC)$/registry$/reflwrit.hxx \ + $(INC)$/registry$/refltype.hxx \ + +LIB1TARGET= $(SLB)$/$(TARGET).lib + +LIB1FILES= $(SLB)$/$(TARGET)cpp.lib + +SHL1TARGET= $(REGISTRY_TARGET)$(REGISTRY_MAJOR) +SHL1IMPLIB= ireg +SHL1STDLIBS= \ + $(VOSLIB) \ + $(SALLIB) \ + $(STORELIB) \ + $(LIBCIMT) + + +SHL1LIBS=$(LIB1TARGET) +SHL1DEPN= $(LIB1TARGET) +SHL1DEF= $(MISC)$/$(SHL1TARGET).def +DEF1NAME =$(SHL1TARGET) + +DEF1DEPN =$(MISC)$/$(SHL1TARGET).flt + + +DEFLIB1NAME =$(TARGET) +DEF1DES =RegistryRuntime + +.IF "$(COM)"!="ICC" || "$(GUI)"=="OS2" +.IF "$(GUI)"!="MAC" +DEF1EXPORT1 =initRegistry_Api @1000 +DEF1EXPORT3 =initRegistryTypeWriter_Api @1001 +DEF1EXPORT4 =initRegistryTypeReader_Api @1002 +.ELSE +DEF1EXPORT1 =initRegistry_Api +DEF1EXPORT3 =initRegistryTypeWriter_Api +DEF1EXPORT4 =initRegistryTypeReader_Api +.ENDIF +.ELSE +DEF1EXPORT1 =_initRegistry_Api @1000 +DEF1EXPORT3 =_initRegistryTypeWriter_Api @1001 +DEF1EXPORT4 =_initRegistryTypeReader_Api @1002 +.ENDIF + +# --- Targets ------------------------------------------------------ + +.IF "$(GUI)"=="WIN" +ALL: $(LIB1TARGET) \ + $(MISC)$/implib.cmd + ALLTAR +.ENDIF + +.INCLUDE : target.mk + +makedocpp: $(DOCPPFILES) + + docpp -H -m -f -u -d $(OUT)$/doc$/$(PRJNAME) $(DOCPPFILES) + +# --- SO2-Filter-Datei --- + +$(MISC)$/$(SHL1TARGET).flt: makefile.mk + @echo ------------------------------ + @echo Making: $@ + @echo WEP > $@ + @echo LIBMAIN >> $@ + @echo LibMain >> $@ + @echo _Impl >> $@ + @echo ORegistry >> $@ + @echo ORegKey >> $@ + @echo ORegManager >> $@ + @echo CntStoreFile >> $@ + @echo CntStoreDirectory >> $@ + @echo CntStorePageLockBytes >> $@ + @echo initRegistry >> $@ + @echo _alloc >> $@ + @echo malloc >> $@ + @echo _lower_bound >> $@ + @echo _stl_prime >> $@ + @echo _stl_hash >> $@ + @echo _C >> $@ + @echo _TI2 >> $@ + @echo _TI3 >> $@ + @echo 1Reg >> $@ + @echo 1OGuard >> $@ + @echo _E >> $@ + @echo _H >> $@ + @echo _B >> $@ + @echo _I >> $@ + @echo next >> $@ + @echo HashString >> $@ + @echo distance >> $@ + @echo iterator >> $@ + @echo lower_bound >> $@ + @echo endl >> $@ + @echo flush >> $@ + @echo String >> $@ + @echo Const >> $@ + @echo read >> $@ + @echo write >> $@ + @echo Blop >> $@ + @echo parse >> $@ + @echo Version >> $@ + @echo Entry >> $@ + @echo Type >> $@ + @echo Field >> $@ + @echo magic >> $@ + @echo Pool >> $@ + @echo Method >> $@ + @echo 0CPI >> $@ + @echo exception::exception >> $@ + + + + + + diff --git a/registry/version.mk b/registry/version.mk new file mode 100644 index 000000000000..d97e6ecfec8e --- /dev/null +++ b/registry/version.mk @@ -0,0 +1,74 @@ +#************************************************************************* +# +# $RCSfile: version.mk,v $ +# +# $Revision: 1.1.1.1 $ +# +# last change: $Author: hr $ $Date: 2000-09-18 15:18:42 $ +# +# The Contents of this file are made available subject to the terms of +# either of the following licenses +# +# - GNU Lesser General Public License Version 2.1 +# - Sun Industry Standards Source License Version 1.1 +# +# Sun Microsystems Inc., October, 2000 +# +# GNU Lesser General Public License Version 2.1 +# ============================================= +# Copyright 2000 by Sun Microsystems, Inc. +# 901 San Antonio Road, Palo Alto, CA 94303, USA +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License version 2.1, as published by the Free Software Foundation. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, +# MA 02111-1307 USA +# +# +# Sun Industry Standards Source License Version 1.1 +# ================================================= +# The contents of this file are subject to the Sun Industry Standards +# Source License Version 1.1 (the "License"); You may not use this file +# except in compliance with the License. You may obtain a copy of the +# License at http://www.openoffice.org/license.html. +# +# Software provided under this License is provided on an "AS IS" basis, +# WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, +# WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, +# MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. +# See the License for the specific provisions governing your rights and +# obligations concerning the Software. +# +# The Initial Developer of the Original Code is: Sun Microsystems, Inc. +# +# Copyright: 2000 by Sun Microsystems, Inc. +# +# All Rights Reserved. +# +# Contributor(s): _______________________________________ +# +# +# +#************************************************************************* + +# target +REGISTRY_TARGET=reg + +# the major +REGISTRY_MAJOR=2 +# the minor +REGISTRY_MINOR=0 +# the micro +REGISTRY_MICRO=0 + +# this is a c++ compatible library +REGISTRY_CPP=0 diff --git a/registry/workben/makefile.mk b/registry/workben/makefile.mk new file mode 100644 index 000000000000..edadeb34e988 --- /dev/null +++ b/registry/workben/makefile.mk @@ -0,0 +1,134 @@ +#************************************************************************* +# +# $RCSfile: makefile.mk,v $ +# +# $Revision: 1.1.1.1 $ +# +# last change: $Author: hr $ $Date: 2000-09-18 15:18:43 $ +# +# The Contents of this file are made available subject to the terms of +# either of the following licenses +# +# - GNU Lesser General Public License Version 2.1 +# - Sun Industry Standards Source License Version 1.1 +# +# Sun Microsystems Inc., October, 2000 +# +# GNU Lesser General Public License Version 2.1 +# ============================================= +# Copyright 2000 by Sun Microsystems, Inc. +# 901 San Antonio Road, Palo Alto, CA 94303, USA +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License version 2.1, as published by the Free Software Foundation. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, +# MA 02111-1307 USA +# +# +# Sun Industry Standards Source License Version 1.1 +# ================================================= +# The contents of this file are subject to the Sun Industry Standards +# Source License Version 1.1 (the "License"); You may not use this file +# except in compliance with the License. You may obtain a copy of the +# License at http://www.openoffice.org/license.html. +# +# Software provided under this License is provided on an "AS IS" basis, +# WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, +# WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, +# MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. +# See the License for the specific provisions governing your rights and +# obligations concerning the Software. +# +# The Initial Developer of the Original Code is: Sun Microsystems, Inc. +# +# Copyright: 2000 by Sun Microsystems, Inc. +# +# All Rights Reserved. +# +# Contributor(s): _______________________________________ +# +# +# +#************************************************************************* + +PRJ=.. + +PRJNAME=registry +TARGET=regtest +TARGETTYPE=CUI +LIBTARGET=NO + +# --- Settings ----------------------------------------------------- +.INCLUDE : svpre.mk +.INCLUDE : settings.mk +.INCLUDE : sv.mk + +# --- Files -------------------------------------------------------- +CDEFS += -DDLL_VERSION=\"$(UPD)$(DLLPOSTFIX)\" + +RGTLIB = rgt.lib +.IF "$(GUI)"=="UNX" +RGTLIB = -lrgt$(UPD)$(DLLPOSTFIX) +.ENDIF + + +CXXFILES= regtest.cxx \ + test.cxx \ + regspeed.cxx + + +APP1TARGET= $(TARGET) +APP1OBJS= $(OBJ)$/regtest.obj + +APP1STDLIBS=\ + $(SALLIB) \ + $(REGLIB) + +.IF "$(GUI)"=="WNT" +APP1STDLIBS+= \ + $(LIBCIMT) $(LIBCMT) +.ENDIF + + +APP2TARGET= test +APP2OBJS= $(OBJ)$/test.obj + +APP2STDLIBS=\ + $(RGTLIB) + + +.IF "$(GUI)"=="WNT" +APP2STDLIBS+= \ + $(LIBCIMT) $(LIBCMT) +.ENDIF + + +APP3TARGET= regspeed +APP3OBJS= $(OBJ)$/regspeed.obj + +APP3STDLIBS=\ + $(SALLIB) \ + $(REGLIB) + +.IF "$(GUI)"=="WNT" +APP3STDLIBS+= \ + $(LIBCIMT) $(LIBCMT) +.ENDIF + + + +#.IF "$(COM)"=="ICC" +#ENVCFLAGS=$(ENVCFLAGS) -D_STD_NO_NAMESPACE -D_VOS_NO_NAMESPACE -D_UNO_NO_NAMESPACE +#.ENDIF + + +.INCLUDE : target.mk diff --git a/registry/workben/regspeed.cxx b/registry/workben/regspeed.cxx new file mode 100644 index 000000000000..dee8f61f9f15 --- /dev/null +++ b/registry/workben/regspeed.cxx @@ -0,0 +1,307 @@ +/************************************************************************* + * + * $RCSfile: regspeed.cxx,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:18:43 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +#include +#include +#include +#include +#include +#include + +#include "registry/registry.h" + +#ifndef _RTL_USTRING_HXX_ +#include +#endif + +#ifndef _RTL_ALLOC_H_ +#include +#endif + + +/***************************************************************** + MyTimer +*****************************************************************/ +#ifndef UNX +class MyTimer +{ +public: + void start() { _ftime( &m_start ); }; + void stop() + { + _ftime( &m_stop ); + m_diff = difftime(m_stop.time, m_start.time); + if (m_stop.millitm > m_start.millitm) + { + m_diff += ((double)(m_stop.millitm - m_start.millitm)) / 1000; + } + else + { + m_diff -= 1; + m_diff += ((double)(1000 - (m_start.millitm - m_stop.millitm))) / 1000; + } + printf(" %.4f Sekunden\n", m_diff); + }; + +protected: +#ifdef OS2 + struct timeb m_start, m_stop; +#else + struct _timeb m_start, m_stop; +#endif + double m_diff; +}; +#else +extern "C" int ftime(struct timeb *pt); + +class MyTimer +{ +public: + void start() { ftime( &m_start ); }; + void stop() + { + ftime( &m_stop ); + m_diff = difftime(m_stop.time, m_start.time); + if (m_stop.millitm > m_start.millitm) + { + m_diff += ((double)(m_stop.millitm - m_start.millitm)) / 1000; + } + else + { + m_diff -= 1; + m_diff += ((double)(1000 - (m_start.millitm - m_stop.millitm))) / 1000; + } + printf(" %.4f Sekunden\n", m_diff); + }; + +protected: + struct timeb m_start, m_stop; + double m_diff; +}; +#endif + +using namespace rtl; + +#if (defined UNX) || (defined OS2) +int main( int argc, char * argv[] ) +#else +int _cdecl main( int argc, char * argv[] ) +#endif +{ + RegHandle hReg; + RegKeyHandle hRootKey, hKey, hSubKey, hSubSubKey; + OUString sName1(RTL_CONSTASCII_USTRINGPARAM("regkey")); + OUString sName2(RTL_CONSTASCII_USTRINGPARAM("regSubkey")); + OUString sName3(RTL_CONSTASCII_USTRINGPARAM("regSubSubkey")); + OUString keyName1; + OUString keyName2; + OUString keyName3; + int S1 = 10; + int S2 = 10; + int S3 = 10; + MyTimer aTimer; + + if (argc < 4) + { + cerr << "using regspeed count1 count2 count3\n"; + exit(1); + } + + S1 = atoi(argv[1]); + S2 = atoi(argv[2]); + S3 = atoi(argv[3]); + + OUString speedReg( RTL_CONSTASCII_USTRINGPARAM("speed.reg")); + if (reg_createRegistry(speedReg.pData, &hReg)) + { + cout << "creating registry \"test.reg\" failed\n"; + } else + { + if (reg_openRootKey(hReg, &hRootKey)) + { + cout << "open root key \"test.reg\" failed\n"; + } else + { + printf("\n %d keys anlegen, oeffnen und schliessen dauert ... ", (S1 * S2 * S3)); + aTimer.start(); + + for (sal_Int32 i=0; i < S1; i++) + { + keyName1 = sName1; + keyName1 += OUString().valueOf(i); + if (reg_createKey(hRootKey, keyName1.pData, &hKey)) + cout << "creating key \"" << OUStringToOString(keyName1, RTL_TEXTENCODING_ASCII_US).getStr() + << "\" failed\n"; + + for (sal_Int32 j=0; j < S2; j++) + { + keyName2 = sName2; + keyName2 += OUString().valueOf(j); + if (reg_createKey(hKey, keyName2.pData, &hSubKey)) + cout << "creating key \"" << OUStringToOString(keyName2, RTL_TEXTENCODING_ASCII_US).getStr() + << "\" failed\n"; + + for (sal_Int32 n=0; n < S3; n++) + { + keyName3 = sName3; + keyName3 += OUString().valueOf(n); + if (reg_createKey(hSubKey, keyName3.pData, &hSubSubKey)) + cout << "creating key \"" << OUStringToOString(keyName3, RTL_TEXTENCODING_ASCII_US).getStr() + << "\" failed\n"; + + if (reg_closeKey(hSubSubKey)) + cout << "closing key \"" << OUStringToOString(keyName3, RTL_TEXTENCODING_ASCII_US).getStr() + << "\" failed\n"; + } + + if (reg_closeKey(hSubKey)) + cout << "closing key \"" << OUStringToOString(keyName2, RTL_TEXTENCODING_ASCII_US).getStr() + << "\" failed\n"; + } + + if (reg_closeKey(hKey)) + cout << "closing key \"" << OUStringToOString(keyName1, RTL_TEXTENCODING_ASCII_US).getStr() + << "\" failed\n"; + } + + aTimer.stop(); + + printf("\n %d keys oeffnen und schliessen dauert ... ", (S1 * S2 * S3)); + aTimer.start(); + + for (i=0; i < S1; i++) + { + keyName1 = OUString::createFromAscii("/"); + keyName1 += sName1; + keyName1 += OUString().valueOf(i); + if (reg_openKey(hRootKey, keyName1.pData, &hKey)) + cout << "open key \"" << OUStringToOString(keyName1, RTL_TEXTENCODING_ASCII_US).getStr() + << "\" failed\n"; + + for (sal_Int32 j=0; j < S2; j++) + { + keyName2 = OUString::createFromAscii("/"); + keyName2 += sName1; + keyName2 += OUString().valueOf(i); + keyName2 += OUString::createFromAscii("/"); + keyName2 += sName2; + keyName2 += OUString().valueOf(j); + if (reg_openKey(hRootKey, keyName2.pData, &hSubKey)) + cout << "open key \"" << OUStringToOString(keyName2, RTL_TEXTENCODING_ASCII_US).getStr() + << "\" failed\n"; + + for (sal_Int32 n=0; n < S3; n++) + { + keyName3 = OUString::createFromAscii("/"); + keyName3 += sName1; + keyName3 += OUString().valueOf(i); + keyName3 += OUString::createFromAscii("/"); + keyName3 += sName2; + keyName3 += OUString().valueOf(j); + keyName3 += OUString::createFromAscii("/"); + keyName3 += sName3; + keyName3 += OUString().valueOf(n); + if (reg_openKey(hRootKey, keyName3.pData, &hSubSubKey)) + cout << "open key \"" << OUStringToOString(keyName3, RTL_TEXTENCODING_ASCII_US).getStr() + << "\" failed\n"; + + if (reg_closeKey(hSubSubKey)) + cout << "open key \"" << OUStringToOString(keyName3, RTL_TEXTENCODING_ASCII_US).getStr() + << "\" failed\n"; + } + + if (reg_closeKey(hSubKey)) + cout << "closing key \"" << OUStringToOString(keyName2, RTL_TEXTENCODING_ASCII_US).getStr() + << "\" failed\n"; + } + + if (reg_closeKey(hKey)) + cout << "closing key \"" << OUStringToOString(keyName1, RTL_TEXTENCODING_ASCII_US).getStr() + << "\" failed\n"; + } + + aTimer.stop(); + + printf("\n 1 key oeffnen und schliessen dauert ... "); + aTimer.start(); + + if (reg_openKey(hRootKey, keyName3.pData, &hSubSubKey)) + cout << "open key \"" << OUStringToOString(keyName3, RTL_TEXTENCODING_ASCII_US).getStr() + << "\" failed\n"; + + if (reg_closeKey(hSubSubKey)) + cout << "open key \"" << OUStringToOString(keyName3, RTL_TEXTENCODING_ASCII_US).getStr() + << "\" failed\n"; + + aTimer.stop(); + + } + + if (reg_closeKey(hRootKey)) + cout << "closing root key failed\n"; + if (reg_closeRegistry(hReg)) + cout << "\t41. closing registry \"test.reg\" failed\n"; + } + + return(0); +} + + diff --git a/registry/workben/regtest.cxx b/registry/workben/regtest.cxx new file mode 100644 index 000000000000..a39f34fe2c80 --- /dev/null +++ b/registry/workben/regtest.cxx @@ -0,0 +1,376 @@ +/************************************************************************* + * + * $RCSfile: regtest.cxx,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:18:43 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +#include +#include + +#include "registry/registry.h" + +#ifndef _RTL_USTRING_HXX_ +#include +#endif + +#ifndef _RTL_ALLOC_H_ +#include +#endif + +using namespace rtl; + +#if (defined UNX) || (defined OS2) +int main( int argc, char * argv[] ) +#else +int _cdecl main( int argc, char * argv[] ) +#endif +{ + RegHandle hReg; + RegKeyHandle hRootKey, hKey1, hKey2, hKey3, hKey4, hKey5; + + cout << "\n Simple Registry Test !!! \n\n"; + + if (reg_createRegistry(OUString::createFromAscii("test4.rdb").pData, &hReg)) + cout << "\t0. creating registry \"test4.rdb\" failed\n"; + else + cout << "0. registry test4.rdb is created\n"; + + if (reg_openRootKey(hReg, &hRootKey)) + cout << "1. open root key \"test4.rdb\" failed\n"; + else + cout << "1. root key of \"test4.rdb\" is opened\n"; + + if (reg_createKey(hRootKey, OUString::createFromAscii("myFirstKey").pData, &hKey1)) + cout << "\t2. creating key \"myFirstKey\" failed\n"; + else + cout << "2. key \"myFirstKey\" is created\n"; + if (reg_createKey(hRootKey, OUString::createFromAscii("mySecondKey").pData, &hKey2)) + cout << "\t3. creating key \"mySecondKey\" failed\n"; + else + cout << "3. key \"mySecondKey\" is created\n"; + if (reg_createKey(hKey1, OUString::createFromAscii("myFirstSubKey").pData, &hKey3)) + cout << "\t4. creating subkey \"myFirstSubKey\" failed\n"; + else + cout << "4. subkey \"myFirstSubKey\" is created\n"; + if (reg_createKey(hKey1, OUString::createFromAscii("mySecondSubKey").pData, &hKey4)) + cout << "\t5. creating subkey \"mySecondSubKey\" failed\n"; + else + cout << "5. subkey \"mySecondSubKey\" is created\n"; + if (reg_createKey(hRootKey, OUString::createFromAscii("myThirdKey").pData, &hKey5)) + cout << "\t6. creating key \"myThirdKey\" is created\n\n"; + else + cout << "6. key \"myThirdKey\" is created\n\n"; + + + RegKeyHandle* phSubKeys; + sal_uInt32 nSubKeys; + if (reg_openSubKeys(hRootKey, OUString::createFromAscii("myFirstKey").pData, &phSubKeys, &nSubKeys)) + cout << "\t7. open subkeys of \"myfirstKey\" failed\n"; + else + cout << "7. open " << nSubKeys << "subkeys of \"myfirstKey\"\n"; + + OUString keyName; + if (reg_getKeyName(phSubKeys[0], &keyName.pData)) + cout << "\tname of subkey 1 = " << OUStringToOString(keyName, RTL_TEXTENCODING_ASCII_US).getStr() << "\n"; + if (reg_getKeyName(phSubKeys[1], &keyName.pData)) + cout << "\tname of subkey 2 = " << OUStringToOString(keyName, RTL_TEXTENCODING_ASCII_US).getStr() << "\n"; + + if (reg_closeSubKeys(phSubKeys, nSubKeys)) + cout << "\t8. close subkeys of \"myfirstKey\" failed\n\n"; + else + cout << "8. close " << nSubKeys << "subkeys of \"myfirstKey\"\n\n"; + + + char* Value="Mein erster Value"; + if (reg_setValue(hRootKey, OUString::createFromAscii("mySecondKey").pData, RG_VALUETYPE_STRING, Value, 18)) + cout << "\t9. setValue of key \"mySecondKey\" failed\n"; + else + cout << "9. setValue (string Value) of key \"mySecondKey\"\n"; + + RegValueType valueType; + sal_uInt32 valueSize; + sal_Char* readValue; + if (reg_getValueInfo(hRootKey, OUString::createFromAscii("mySecondKey").pData, &valueType, &valueSize)) + cout << "\t10. getValueInfo of key \"mySecondKey\" failed\n"; + else + cout << "10. getValueInfo of key \"mySecondKey\"\n"; + + readValue = (sal_Char*)rtl_allocateMemory(valueSize); + if (reg_getValue(hKey2, OUString().pData, readValue)) + cout << "\t11. getValue of key \"mySecondKey\" failed\n"; + else + { + cout << "11. getValue of key \"mySecondKey\"\n"; + + cout << "read Value,\n\tvalueType = " << (long)valueType + << "\n\tvalueSize = " << valueSize + << "\n\tvalue = " << readValue << "\n\n"; + } + rtl_freeMemory(readValue); + + if (reg_closeKey(hKey1) || + reg_closeKey(hKey3) || + reg_closeKey(hKey4)) + cout << "\t12. closing \"myFirstKey\" \"myfistSubKey\" \"mySecondSubKey\" failed\n"; + else + cout << "12. keys \"myFirstKey\" \"myfistSubKey\" \"mySecondSubKey\" are closed\n"; + + if (reg_deleteKey(hRootKey, OUString::createFromAscii("myFirstKey").pData)) + cout << "13.\t delete key \"myFirstKey\" failed\n"; + else + cout << "13. key \"myFirstKey\" is deleted\n"; + + if (reg_closeKey(hKey2)) + cout << "\t14. closing key \"mySecondKey\" failed\n"; + else + cout << "14. key \"mySecondKey\" is closed\n"; + + if (reg_openKey(hRootKey, OUString::createFromAscii("mySecondKey").pData, &hKey2)) + cout << "\n15. open key \"mySecondKey\" failed\n"; + else + cout << "15. key \"mySecondKey\" is opended\n"; + + if (reg_closeKey(hKey5)) + cout << "\t15. closing key \"myThirdSubKey\" failed\n"; + else + cout << "15. key \"myThirdSubKey\" is closed\n"; + if (reg_deleteKey(hRootKey, OUString::createFromAscii("myThirdKey").pData)) + cout << "\t16. delete key \"myThirdKey\" failed\n"; + else + cout << "16. key \"myThirdKey\" is deleted\n"; + + if (reg_openKey(hRootKey, OUString::createFromAscii("myThirdKey").pData, &hKey5)) + cout << "\t17. open key \"myThirdKey\" failed\n"; + else + cout << "17. key \"myThirdKey\" is opened\n"; + + cout << "\n close open keys\n\n"; + + if (reg_closeKey(hKey2)) + cout << "\t18. closing key \"mySecondKey\" failed\n"; + else + cout << "18. key \"mySecondKey\" is closed\n"; + + if (reg_closeKey(hRootKey)) + cout << "\t19. closing root key failed\n"; + else + cout << "19. root key is closed\n"; + + if (reg_closeRegistry(hReg)) + cout << "\t20. closing registry \"test4.rdb\" failed\n"; + else + cout << "20. registry \"test4.rdb\" is closed\n"; + + // Test loadkey + cout << "\nTest load key\n\n"; + + RegHandle hReg2; + RegKeyHandle hRootKey2, h2Key1, h2Key2, h2Key3, h2Key4, h2Key5; + + if (reg_createRegistry(OUString::createFromAscii("test5.rdb").pData, &hReg2)) + cout << "\t21. creating registry \"test5.rdb\" failed\n"; + else + cout << "21. registry \"test5.rdb\" is created\n"; + + if (reg_openRootKey(hReg2, &hRootKey2)) + cout << "\t22. open root key of \"test5.rdb\" failed\n"; + else + cout << "22. root key of \"test5.rdb\" is opened\n"; + + if (reg_createKey(hRootKey2, OUString::createFromAscii("reg2FirstKey").pData, &h2Key1)) + cout << "\t23. creating key \"reg2FirstKey\" failed\n"; + else + cout << "23. key \"reg2FirstKey\" is created\n"; + if (reg_createKey(hRootKey2, OUString::createFromAscii("reg2SecondKey").pData, &h2Key2)) + cout << "\t24. creating key \"reg2SecondKey\" failed\n"; + else + cout << "24. key \"reg2SecondKey\" is created\n"; + if (reg_createKey(h2Key1, OUString::createFromAscii("reg2FirstSubKey").pData, &h2Key3)) + cout << "\t25. creating key \"reg2FirstSubKey\" failed\n"; + else + cout << "25. key \"reg2FirstSubKey\" is created\n"; + if (reg_createKey(h2Key1, OUString::createFromAscii("reg2SecondSubKey").pData, &h2Key4)) + cout << "\26. creating key \"reg2SecondSubKey\" failed\n"; + else + cout << "26. key \"reg2SecondSubKey\" is created\n"; + if (reg_createKey(hRootKey2, OUString::createFromAscii("reg2ThirdKey").pData, &h2Key5)) + cout << "\n27. creating key \"reg2ThirdKey\" failed\n"; + else + cout << "27. key \"reg2ThirdKey\" is created\n"; + + sal_uInt32 nValue= 123456789; + if (reg_setValue(h2Key3, OUString().pData, RG_VALUETYPE_LONG, &nValue, sizeof(sal_uInt32))) + cout << "\t27.b) setValue of key \"reg2FirstSubKey\" failed\n"; + else + cout << "27.b). setValue (long Value) of key \"reg2FirstSubKey\"\n"; + + if (reg_closeKey(h2Key1) || + reg_closeKey(h2Key2) || + reg_closeKey(h2Key3) || + reg_closeKey(h2Key4) || + reg_closeKey(h2Key5)) + cout << "\n\t28. closing keys of \"test5.rdb\" failed\n"; + else + cout << "\n28. all keys of \"test5.rdb\" closed\n"; + + if (reg_closeKey(hRootKey2)) + cout << "\t29. root key of \"test5.rdb\" failed\n"; + else + cout << "29. root key of \"test5.rdb\" is closed\n"; + + if (reg_closeRegistry(hReg2)) + cout << "\t30. registry test5.rdb is closed\n"; + else + cout << "30. registry test5.rdb is closed\n"; + + if (reg_openRegistry(OUString::createFromAscii("test4.rdb").pData, &hReg, REG_READWRITE)) + cout << "\t31. registry test4.rdb is opened\n"; + else + cout << "31. registry test4.rdb is opened\n"; + + if (reg_openRootKey(hReg, &hRootKey)) + cout << "\t32. open root key of \"test4.rdb\" is failed\n"; + else + cout << "32. root key of \"test4.rdb\" is opened\n"; + + if (reg_loadKey(hRootKey, OUString::createFromAscii("allFromTest2").pData, + OUString::createFromAscii("test5.rdb").pData)) + cout << "\n\t33. load all keys from \"test5.rdb\" under key \"allFromTest2\" failed\n"; + else + cout << "\n33. load all keys from test5.rdb under key \"allFromTest2\"\n"; + + if (reg_saveKey(hRootKey, OUString::createFromAscii("allFromTest2").pData, + OUString::createFromAscii("test6.rdb").pData)) + cout << "\n\t34. save all keys under \"allFromTest2\" in test6.rdb\n"; + else + cout << "\n34. save all keys under \"allFromTest2\" in test6.rdb\n"; + + + if (reg_createKey(hRootKey, OUString::createFromAscii("allFromTest3").pData, &hKey1)) + cout << "\t35. creating key \"allFromTest3\" failed\n"; + else + cout << "36. key \"allFromTest3\" is created\n"; + if (reg_createKey(hKey1, OUString::createFromAscii("myFirstKey2").pData, &hKey2)) + cout << "\t37. creating key \"myFirstKey2\" failed\n"; + else + cout << "37. key \"myFirstKey2\" is created\n"; + if (reg_createKey(hKey1, OUString::createFromAscii("mySecondKey2").pData, &hKey3)) + cout << "\t38. creating key \"mySecondKey2\" failed\n"; + else + cout << "38. key \"mySecondKey2\" is created\n"; + + if (reg_mergeKey(hRootKey, OUString::createFromAscii("allFromTest3").pData, + OUString::createFromAscii("test6.rdb").pData, sal_False, sal_False)) + cout << "\n\t39. merge all keys under \"allFromTest2\" with all in test6.rdb\n"; + else + cout << "\n39. merge all keys under \"allFromTest2\" with all in test6.rdb\n"; + + if (reg_closeKey(hKey1)) + cout << "\n\t40. closing key \"allFromTest3\" of \"test5.rdb\" failed\n"; + else + cout << "\n40. closing key \"allFromTest3\" of \"test5.rdb\"\n"; + if (reg_closeKey(hKey2)) + cout << "\n\t41. closing key \"myFirstKey2\" of \"test5.rdb\" failed\n"; + else + cout << "\n41. closing key \"myFirstKey2\" of \"test5.rdb\"\n"; + if (reg_closeKey(hKey3)) + cout << "\n\t42. closing key \"mySecondKey2\" of \"test5.rdb\" failed\n"; + else + cout << "\n42. closing key \"mySecondKey2\" of \"test5.rdb\"\n"; + + + if (reg_deleteKey(hRootKey, OUString::createFromAscii("/allFromTest3/reg2FirstKey/reg2FirstSubKey").pData)) + cout << "\n\t43. delete key \"/allFromTest3/reg2FirstKey/reg2FirstSubKey\" failed\n"; + else + cout << "\n43. key \"/allFromTest3/reg2FirstKey/reg2FirstSubKey\" is deleted\n"; + + if (reg_openRegistry(OUString::createFromAscii("test4.rdb").pData, &hReg2, REG_READONLY)) + cout << "\n\t44. registry test4.rdb is opened for read only\n"; + else + cout << "\n44. registry test4.rdb is opened for read only\n"; + + RegHandle hReg3; + if (reg_openRegistry(OUString::createFromAscii("test4.rdb").pData, &hReg3, REG_READONLY)) + cout << "\n\t44.a). registry test4.rdb is opened for read only\n"; + else + cout << "\n44.a). registry test4.rdb is opened for read only\n"; + + if (reg_closeRegistry(hReg2)) + cout << "\t45. closing registry \"test4.rdb\" failed\n"; + else + cout << "45. registry \"test4.rdb\" is closed\n"; + + if (reg_closeKey(hRootKey)) + cout << "\n\t46. closing root key of \"test4.rdb\" failed\n"; + else + cout << "\n46. root key of \"test4.rdb\" is closed\n"; + + if (reg_closeRegistry(hReg)) + cout << "\t47. closing registry \"test4.rdb\" failed\n"; + else + cout << "47. registry \"test4.rdb\" is closed\n"; + + if (reg_closeRegistry(hReg3)) + cout << "\t47.a). closing registry \"test4.rdb\" failed\n"; + else + cout << "47.a). registry \"test4.rdb\" is closed\n"; + + return(0); +} + + diff --git a/registry/workben/test.cxx b/registry/workben/test.cxx new file mode 100644 index 000000000000..2ba0c6661750 --- /dev/null +++ b/registry/workben/test.cxx @@ -0,0 +1,85 @@ +/************************************************************************* + * + * $RCSfile: test.cxx,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:18:43 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +#include + +#if (defined UNX) || (defined OS2) +int main( int argc, char * argv[] ) +#else +int _cdecl main( int argc, char * argv[] ) +#endif +{ + void test_coreReflection(); + void test_registry_CppApi(); + void test_generateMerge1(); + void test_generateMerge2(); + void test_merge(); + + test_coreReflection(); + test_registry_CppApi(); + test_generateMerge1(); + test_generateMerge2(); + test_merge(); + + return(0); +} + + diff --git a/sal/inc/osl/conditn.h b/sal/inc/osl/conditn.h new file mode 100644 index 000000000000..88fec4967bc7 --- /dev/null +++ b/sal/inc/osl/conditn.h @@ -0,0 +1,127 @@ +/************************************************************************* + * + * $RCSfile: conditn.h,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:17:12 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + + +#ifndef _OSL_CONDITION_H_ +#define _OSL_CONDITION_H_ + +#ifndef _OSL_TYPES_H_ +# include +#endif + +#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. + @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
+ 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.
+ False: condition is not set.
+*/ +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..d736df281a6d --- /dev/null +++ b/sal/inc/osl/conditn.hxx @@ -0,0 +1,145 @@ +/************************************************************************* + * + * $RCSfile: conditn.hxx,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:17:12 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +#ifndef _OSL_CONDITN_HXX_ +#define _OSL_CONDITN_HXX_ + +#ifdef __cplusplus + +#include + +#include + + +#ifdef _USE_NAMESPACE +namespace osl +{ +#endif + + 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; + + Condition(oslCondition condition) + { + this->condition = condition; + } + }; + +#ifdef _USE_NAMESPACE +} +#endif + +#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..ca48805f90ba --- /dev/null +++ b/sal/inc/osl/diagnose.h @@ -0,0 +1,163 @@ +/************************************************************************* + * + * $RCSfile: diagnose.h,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:17:12 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + + +#ifndef _OSL_DIAGNOSE_H_ +#define _OSL_DIAGNOSE_H_ + +#ifndef _OSL_TYPES_H_ +# include +#endif + +#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); + +#ifdef __cplusplus +} +#endif + +#define OSL_THIS_FILE __FILE__ + +#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_VERIFY(c) _OSL_VERIFY(c, OSL_THIS_FILE, __LINE__) +#define OSL_ENSHURE(c, m) _OSL_ENSHURE(c, OSL_THIS_FILE, __LINE__, m) +#define OSL_ENSURE(c, m) _OSL_ENSHURE(c, OSL_THIS_FILE, __LINE__, m) + +#define OSL_PRECOND(c, m) OSL_ENSHURE(c, m) +#define OSL_POSTCOND(c, m) OSL_ENSHURE(c, m) + + +#ifdef __cplusplus +#define _OSL_GLOBAL :: +#else +#define _OSL_GLOBAL +#endif /* __cplusplus */ + +#ifdef _WIN16 +#ifdef _DEBUG +#undef _DEBUG +#endif +#endif + + + +#ifdef _DEBUG + +#define _OSL_DEBUG_ONLY(f) (f) +#define _OSL_TRACE _OSL_GLOBAL osl_trace +#define _OSL_ASSERT(c, f, l) \ + do \ + { \ + if (!(c) && _OSL_GLOBAL osl_assertFailedLine(f, l, 0)) \ + _OSL_GLOBAL osl_breakDebug(); \ + } while (0) +#define _OSL_VERIFY(c, f, l) \ + do \ + { \ + if (!(c) && _OSL_GLOBAL osl_assertFailedLine(f, l, 0)) \ + _OSL_GLOBAL osl_breakDebug(); \ + } while (0) +#define _OSL_ENSHURE(c, f, l, m) \ + do \ + { \ + if (!(c) && _OSL_GLOBAL osl_assertFailedLine(f, l, m)) \ + _OSL_GLOBAL osl_breakDebug(); \ + } while (0) +#define _OSL_ENSHURE(c, f, l, m) \ + do \ + { \ + if (!(c) && _OSL_GLOBAL osl_assertFailedLine(f, l, m)) \ + _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_TRACE 1 ? ((void)0) : _OSL_GLOBAL osl_trace +#define _OSL_ASSERT(c, f, l) ((void)0) +#define _OSL_VERIFY(c, f, l) ((void)(c)) +#define _OSL_ENSHURE(c, f, l, m) ((void)0) +#define _OSL_ENSURE(c, f, l, m) ((void)0) + +#endif /* !_DEBUG */ + +#endif /* _OSL_DIAGNOSE_H_ */ + + + diff --git a/sal/inc/osl/file.h b/sal/inc/osl/file.h new file mode 100644 index 000000000000..1151b7bd69d7 --- /dev/null +++ b/sal/inc/osl/file.h @@ -0,0 +1,1066 @@ +/************************************************************************* + * + * $RCSfile: file.h,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:17:12 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + + +#ifndef _OSL_FILE_H_ +#define _OSL_FILE_H_ + +#ifndef _OSL_TYPES_H_ +# include +#endif + +#ifndef _RTL_USTRING_H +# include +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/** @name 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.

+ +There are a few main goals:

+ +1.The path specifications always have to be absolut. Any usage of relative path +specifications is forbidden. Most operating systems provide a +"Current Directory" per process. This is the reason why relative path +specifications can cause problems in multithreading environments.

+ +2.Proprietary notations of file paths are not supported. Every path notation +must follow the UNC notation. The directory divider is the slash character.

+ +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.

+ +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.
+ +The input bitmask supports a flag osl_FileStatus_Mask_Validate which +can be used to force retrieving uncached validated information. Setting this flag +when calling osl_getFileStatus 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.
+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 osl_FileStatus_Mask_Validate 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_invalidError, /* unmapped error: always last entry in enum! */ + osl_File_E_FORCE_EQUAL_SIZE = SAL_MAX_ENUM +} oslFileError; + +typedef void *oslDirectory; +typedef void *oslDirectoryItem; + +/** Opens a directory for enumerating its contents. + + @param strDirenctoryPath [in] Denotes the full qualified path of the directory follwing the UNC + notation. The path devider is '/'. Relative path specifications are not allowed. + @param pDirectory [out] on success it receives a handle used for subsequent calls by osl_getNextDirectoryItem + on error it receives NULL. The handle has to be released by a call to osl_closeDirectory. + + @return osl_File_E_None on success otherwise one of the following errorcodes:

+ osl_File_E_INVAL the format of the parameters was not valid
+ osl_File_E_NOENT the specified path doesn't exist
+ osl_File_E_NOTDIR the specified path is not an directory
+ osl_File_E_NOMEM not enough memory for allocating structures
+ osl_File_E_ACCES permission denied
+ osl_File_E_MFILE too many open files used by the process
+ osl_File_E_NFILE too many open files in the system
+ osl_File_E_NAMETOOLONG File name too long
+ osl_File_E_LOOP Too many symbolic links encountered

+ + @see osl_getNextDirectoryItem + @see osl_closeDirectory +*/ + +oslFileError SAL_CALL osl_openDirectory( rtl_uString *strDirectoryPath, oslDirectory *pDirectory); + +/** Retrieves the next item(s) of a previously openend directory. All handles have an initial + refcount of 1. + + @param Directory [in] is the 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 otherwise one of the following errorcodes:

+ osl_File_E_INVAL the format of the parameters was not valid
+ osl_File_E_NOMEM not enough memory for allocating structures
+ osl_File_E_NOENT No more entries in this directory

+ + These errorcodes can (eventually) be returned:

+ osl_File_E_BADF oslDirectory parameter is not valid
+ osl_File_E_OVERFLOW Value too large for defined data type

+ + @see osl_releaseDirectoryItem + @see osl_acquireDirectoryItem + @see osl_getDirectoryItem + @see osl_getFileStatus + @see osl_createDirectoryItemFromHandle +*/ + +oslFileError SAL_CALL osl_getNextDirectoryItem( + oslDirectory Directory, + oslDirectoryItem *pItem, + sal_uInt32 uHint + ); + + +/** Releases a directory handle + + @param Directory [in] a handle received by a call to osl_openDirectory. + + @return osl_File_E_None on success otherwise one of the following errorcodes:

+ osl_File_E_INVAL the format of the parameters was not valid
+ osl_File_E_NOMEM not enough memory for allocating structures

+ + These errorcodes can (eventually) be returned:

+ osl_File_E_BADF Invalid oslDirectory parameter
+ osl_File_E_INTR function call was interrupted

+ + @see osl_openDirectory +*/ + +oslFileError SAL_CALL osl_closeDirectory( + oslDirectory Directory + ); + + +/** Retrieves a single directory item handle with an initial refcount of 1. + + @param strFilePath [in] absolute file path following the notation explained in the documentation for + osl_openDirectory. 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 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 otherwise one of the following errorcodes:

+ osl_File_E_INVAL the format of the parameters was not valid
+ osl_File_E_NOMEM not enough memory for allocating structures
+ osl_File_E_ACCES permission denied
+ osl_File_E_MFILE too many open files used by the process
+ osl_File_E_NFILE too many open files in the system
+ osl_File_E_NOENT No such file or directory
+ osl_File_E_LOOP Too many symbolic links encountered
+ osl_File_E_NAMETOOLONG File name too long
+ osl_File_E_NOTDIR A component of the path prefix of path is not a directory

+ + These errorcodes can (eventually) be returned:

+ osl_File_E_IO I/O error
+ osl_File_E_MULTIHOP Multihop attempted
+ osl_File_E_NOLINK Link has been severed
+ osl_File_E_FAULT Bad address
+ osl_File_E_INTR function call was interrupted

+ + + @see osl_releaseDirectoryItem + @see osl_acquireDirectoryItem + @see osl_getFileStatus + @see osl_getNextDirectoryItem + @see osl_createDirectoryItemFromHandle +*/ + +oslFileError SAL_CALL osl_getDirectoryItem( + rtl_uString *strFilePath, + oslDirectoryItem *pItem + ); + + +/** Increases the refcount of a directory item handle + + @param Item [in] a handle received by a call to osl_getDirectoryItem, osl_getNextDirectoryItem or + osl_createDirectoryItemFromHandle. + + @return osl_File_E_None on success otherwise one of the following errorcodes:

+ osl_File_E_NOMEM not enough memory for allocating structures
+ osl_File_E_INVAL the format of the parameters was not valid

+ + @see osl_getDirectoryItem + @see osl_getNextDirectoryItem + @see osl_createDirectoryItemFromHandle + @see osl_releaseDirectoryItem +*/ + +oslFileError SAL_CALL osl_acquireDirectoryItem( oslDirectoryItem Item ); + +/** Decreases the refcount of a directory item handle and releases the data if the + refcount reaches 0. + + @param Item [in] a handle received by a call to osl_getDirectoryItem, osl_getNextDirectoryItem or + osl_createDirectoryItemFromHandle. + + @return osl_File_E_None on success otherwise one of the following errorcodes:

+ osl_File_E_NOMEM not enough memory for allocating structures
+ osl_File_E_INVAL the format of the parameters was not valid

+ + @see osl_getDirectoryItem + @see osl_getNextDirectoryItem + @see osl_acquireDirectoryItemosl_createDirectoryItemFromHandle + @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_FilePath 0x00000200 +#define osl_FileStatus_Mask_NativePath 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 osl_getFileStatus + and released after usage. */ + rtl_uString *strFileName; +/** Full path of the file in UNC notation. Should be set to zero before calling osl_getFileStatus + and released after usage. */ + rtl_uString **pstrFilePath; +/** Full path of the file in platform depending notation. This is for displaying the path in the UI. + Should be set to zero before calling osl_getFileStatus + and released after usage. */ + rtl_uString **pstrNativePath; +} oslFileStatus; + +/** Retrieves information about a single file or directory + + @param Item [in] a handle received by a previous call to osl_getDirectoryItem, + osl_getNextDirectoryItem or osl_createDirectoryItemFromHandle. + @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 otherwise one of the following errorcodes:

+ osl_File_E_NOMEM not enough memory for allocating structures
+ osl_File_E_INVAL the format of the parameters was not valid
+ osl_File_E_LOOP Too many symbolic links encountered
+ osl_File_E_ACCES Permission denied
+ osl_File_E_NOENT No such file or directory
+ osl_File_E_NAMETOOLONG file name too long

+ + These errorcodes can (eventually) be returned:

+ osl_File_E_BADF Invalid oslDirectoryItem parameter
+ osl_File_E_FAULT Bad address
+ osl_File_E_OVERFLOW Value too large for defined data type
+ osl_File_E_INTR function call was interrupted
+ osl_File_E_NOLINK Link has been severed
+ osl_File_E_MULTIHOP Components of path require hopping to multiple remote machines and the file system does not allow it
+ osl_File_E_MFILE too many open files used by the process
+ osl_File_E_NFILE too many open files in the system
+ osl_File_E_NOSPC No space left on device
+ osl_File_E_NXIO No such device or address
+ osl_File_E_IO I/O error
+ osl_File_E_NOSYS Function not implemented

+ + @see osl_getDirectoryItem + @see osl_getNextDirectoryItem + @see osl_createDirectoryItemFromHandle + @see oslFileStatus +*/ + +oslFileError SAL_CALL osl_getFileStatus( oslDirectoryItem Item, oslFileStatus *pStatus, sal_uInt32 uFieldMask ); + + +typedef void *oslVolumeDeviceHandle; + + +oslFileError SAL_CALL osl_unmountVolumeDevice( oslVolumeDeviceHandle Handle ); + +oslFileError SAL_CALL osl_automountVolumeDevice( oslVolumeDeviceHandle Handle ); + +oslFileError SAL_CALL osl_releaseVolumeDeviceHandle( oslVolumeDeviceHandle Handle ); + +oslFileError SAL_CALL osl_acquireVolumeDeviceHandle( oslVolumeDeviceHandle Handle ); + +/** Gets the normalized absolute file system path where a device is mounted to. + + @param Handle [in] Device handle of the volume retrieved with osl_getVolumeInformation. + @param pstrPath [out] Receives the path where the device is mounted to. + @return osl_File_E_None on success otherwise one of the following errorcodes:

+ osl_File_E_NOMEM not enough memory for allocating structures
+ osl_File_E_INVAL the format of the parameters was not valid
+ osl_File_E_ACCES permission denied
+ osl_File_E_NXIO No such device or address
+ osl_File_E_NODEV No such device
+ osl_File_E_NOENT No such file or directory
+ + These errorcodes can (eventually) be returned:

+ osl_File_E_FAULT Bad address
+ osl_FilE_E_INTR function call was interrupted
+ osl_File_E_IO I/O error
+ osl_File_E_MULTIHOP Multihop attempted
+ osl_File_E_NOLINK Link has been severed
+ osl_File_E_EOVERFLOW Value too large for defined data type

+ + @see osl_getVolumeInformation + @see osl_automountVolumeDevice + @see osl_unmountVolumeDevice +*/ + +oslFileError SAL_CALL osl_getVolumeDeviceMountPath( oslVolumeDeviceHandle Handle, rtl_uString **pstrPath ); + +/* Volume attributes */ + +#define osl_Volume_Attribute_Removeable 0x00000001L +#define osl_Volume_Attribute_Remote 0x00000002L + +/* 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 + +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 UNC notation */ + sal_uInt32 uMaxPathLength; +/** Name of the file system type. Should be set to zero before calling osl_getVolumeInformation + and released after usage. */ + rtl_uString **pstrFileSystemName; +/** Handle of underlying device */ + oslVolumeDeviceHandle *pDeviceHandle; +} oslVolumeInfo; + + +/** 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 strDirectory [in] Full qualified UNC path to 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 otherwise one of the following errorcodes:

+ osl_File_E_NOMEM not enough memory for allocating structures
+ osl_File_E_INVAL the format of the parameters was not valid

+ + These errorcodes can (eventually) be returned:

+ osl_File_E_NOTDIR Not a directory
+ osl_File_E_NAMETOOLONG File name too long
+ osl_File_E_NOENT No such file or directory
+ osl_File_E_ACCES permission denied
+ osl_File_E_LOOP Too many symbolic links encountered
+ ols_File_E_FAULT Bad address
+ osl_File_E_IO I/O error
+ osl_File_E_NOSYS Function not implemented
+ osl_File_E_MULTIHOP Multihop attempted
+ osl_File_E_NOLINK Link has been severed
+ osl_File_E_INTR function call was interrupted

+ + @see osl_getFileStatus + @see oslVolumeInfo +*/ + +oslFileError SAL_CALL osl_getVolumeInformation( rtl_uString *strDirectory, 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 + +/** Opens a file. + + @param strPath [in] Full qualified path to the file to open. Only regular files + can be openend. + @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 otherwise one of the following errorcodes:

+ osl_File_E_NOMEM not enough memory for allocating structures
+ osl_File_E_INVAL the format of the parameters was not valid
+ osl_File_E_NAMETOOLONG pathname was too long
+ osl_File_E_NOENT No such file or directory
+ osl_File_E_ACCES permission denied

+ + These errorcodes can (eventually) be returned:

+ osl_File_E_NOTDIR Not a directory
+ osl_File_E_NXIO No such device or address
+ osl_File_E_NODEV No such device
+ osl_File_E_ROFS Read-only file system
+ osl_File_E_TXTBSY Text file busy
+ osl_File_E_FAULT Bad address
+ osl_File_E_LOOP Too many symbolic links encountered
+ osl_File_E_NOSPC No space left on device
+ osl_File_E_ISDIR Is a directory
+ osl_File_E_MFILE too many open files used by the process
+ osl_File_E_NFILE too many open files in the system
+ osl_File_E_DQUOT Quota exceeded
+ osl_File_E_EXIST File exists
+ osl_FilE_E_INTR function call was interrupted
+ osl_File_E_IO I/O error
+ osl_File_E_MULTIHOP Multihop attempted
+ osl_File_E_NOLINK Link has been severed
+ osl_File_E_EOVERFLOW Value too large for defined data type

+ + @see osl_closeFile + @see osl_setFilePos + @see osl_getFilePos + @see osl_readFile + @see osl_writeFile + @see osl_setFileSize + @see osl_createDirectoryItemFromHandle +*/ + +oslFileError SAL_CALL osl_openFile( rtl_uString *strPath, oslFileHandle *pHandle, sal_uInt32 uFlags ); + +#define osl_Pos_Absolut 1 +#define osl_Pos_Current 2 +#define osl_Pos_End 3 + +/** Sets the internal position pointer of an open file. + @param Handle [in] Handle of an open 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 otherwise one of the following errorcodes:

+ osl_File_E_INVAL the format of the parameters was not valid
+ osl_File_E_OVERFLOW The resulting file offset would be a value which cannot + be represented correctly for regular files

+ + @see osl_openFile + @see osl_getFilePos +*/ + +oslFileError SAL_CALL osl_setFilePos( oslFileHandle Handle, sal_uInt32 uHow, sal_uInt64 uPos ); + + +/** Retrieves the current position of the internal pointer of an open file. + @param Handle [in] Handle to an open file. + @param pPos [out] On Success it receives the current position of the file pointer. + @return osl_File_E_None on success otherwise one of the following errorcodes:

+ osl_File_E_INVAL the format of the parameters was not valid
+ osl_File_E_OVERFLOW The resulting file offset would be a value which cannot + be represented correctly for regular files

+ + @see osl_openFile + @see osl_setFilePos + @see osl_readFile + @see osl_writeFile +*/ + +oslFileError SAL_CALL osl_getFilePos( oslFileHandle Handle, sal_uInt64 *pPos ); + + +/** 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 an open file. + @param uSize [int] New size in bytes. + @return osl_File_E_None on success otherwise one of the following errorcodes:

+ osl_File_E_INVAL the format of the parameters was not valid
+ osl_File_E_OVERFLOW The resulting file offset would be a value which cannot + be represented correctly for regular files

+ + @see osl_openFile + @see osl_setFilePos + @see osl_getFileStatus +*/ + +oslFileError SAL_CALL osl_setFileSize( oslFileHandle Handle, sal_uInt64 uSize ); + + +/** 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 an open file. + @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 otherwise one of the following errorcodes:

+ osl_File_E_INVAL the format of the parameters was not valid
+ + These errorcodes can (eventually) be returned:

+ osl_File_E_INTR function call was interrupted
+ osl_File_E_IO I/O error
+ osl_File_E_ISDIR Is a directory
+ osl_File_E_BADF Bad file
+ osl_File_E_FAULT Bad address
+ osl_File_E_AGAIN Operation would block
+ osl_File_E_NOLINK Link has been severed

+ + @see osl_openFile + @see osl_writeFile + @see osl_setFilePos +*/ + +oslFileError SAL_CALL osl_readFile( oslFileHandle Handle, void *pBuffer, sal_uInt64 uBytesRequested, sal_uInt64 *pBytesRead ); + + +/** 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 an open file. + @param pBuffer [int] 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 otherwise one of the following errorcodes:

+ osl_File_E_INVAL the format of the parameters was not valid
+ osl_File_E_FBIG File too large
+ osl_File_E_DQUOT Quota exceeded

+ + These errorcodes can (eventually) be returned:

+ osl_File_E_AGAIN Operation would block
+ osl_File_E_BADF Bad file
+ osl_File_E_FAULT Bad address
+ osl_File_E_INTR function call was interrupted
+ osl_File_E_IO I/O error
+ osl_File_E_NOLCK No record locks available
+ osl_File_E_NOLINK Link has been severed
+ osl_File_E_NOSPC No space left on device
+ osl_File_E_NXIO No such device or address

+ + @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 ); + + +/** Closes an open file. + @param Handle [in] Handle to a file previously open by a call to osl_openFile. + + @return osl_File_E_None on success otherwise one of the following errorcodes:

+ osl_File_E_INVAL the format of the parameters was not valid

+ + These errorcodes can (eventually) be returned:

+ osl_File_E_BADF Bad file
+ osl_File_E_INTR function call was interrupted
+ osl_File_E_NOLINK Link has been severed
+ osl_File_E_NOSPC No space left on device
+ osl_File_E_IO I/O error

+*/ + +oslFileError SAL_CALL osl_closeFile( oslFileHandle Handle ); + + +/** Get a directory item handle from an open file with an initial refcount of 1. + @param Handle [in] A Hdnale to an open file. + @param pItem [out] On success it receives a handle to a directory item which can be used + in subsequent calls to osl_getFileStatus. + @return osl_File_E_None on success otherwise one of the following errorcodes:

+ osl_File_E_INVAL the format of the parameters was not valid

+ + @see osl_openFile + @see osl_getFileStatus + @see osl_acquireDirectoryItem + @see osl_releaseDirectoryItem +*/ + +oslFileError SAL_CALL osl_createDirectoryItemFromHandle( oslFileHandle Handle, oslDirectoryItem *pItem ); + + +/** Creates a directory. + @param strPatg [in] Full qualified UNC path of the directory to create. + + @return osl_File_E_None on success otherwise one of the following errorcodes:

+ osl_File_E_INVAL the format of the parameters was not valid
+ osl_File_E_NOMEM not enough memory for allocating structures
+ osl_File_E_EXIST File exists
+ osl_File_E_ACCES Permission denied
+ osl_File_E_NAMETOOLONG File name too long
+ 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

+ + These errorcodes can (eventually) be returned:

+ osl_File_E_LOOP Too many symbolic links encountered
+ osl_File_E_FAULT Bad address
+ osl_FileE_IO I/O error
+ osl_File_E_MLINK Too many links
+ osl_File_E_MULTIHOP Multihop attempted
+ osl_File_E_NOLINK Link has been severed

+ + @see osl_removeDirectory +*/ + +oslFileError SAL_CALL osl_createDirectory( rtl_uString* strPath ); + +/** Removes an empty directory. + + @param strPath [in] Full qualified UNC path of the directory. + @return osl_File_E_None on success otherwise one of the following errorcodes:

+ osl_File_E_INVAL the format of the parameters was not valid
+ osl_File_E_NOMEM not enough memory for allocating structures
+ osl_File_E_PERM Operation not permitted
+ 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_NOTEMPTY Directory not empty

+ + These errorcodes can (eventually) be returned:

+ osl_File_E_FAULT Bad address
+ osl_File_E_NAMETOOLONG File name too long
+ osl_File_E_BUSY Device or resource busy
+ osl_File_E_ROFS Read-only file system
+ osl_File_E_LOOP Too many symbolic links encountered
+ osl_File_E_BUSY Device or resource busy
+ osl_File_E_EXIST File exists
+ osl_File_E_IO I/O error
+ osl_File_E_MULTIHOP Multihop attempted
+ osl_File_E_NOLINK Link has been severed

+ + @see osl_createDirectory +*/ + +oslFileError SAL_CALL osl_removeDirectory( rtl_uString* strPath ); + + +/** Removes (erases) a regular file. + + @param strPath [in] Full qualified UNC path of the directory. + @return osl_File_E_None on success otherwise one of the following errorcodes:

+ osl_File_E_INVAL the format of the parameters was not valid
+ osl_File_E_NOMEM not enough memory for allocating structures
+ osl_File_E_ACCES Permission denied
+ osl_File_E_PERM Operation not permitted
+ osl_File_E_NAMETOOLONG File name too long
+ osl_File_E_NOENT No such file or directory
+ osl_File_E_ISDIR Is a directory
+ osl_File_E_ROFS Read-only file system

+ + These errorcodes can (eventually) be returned:

+ osl_File_E_FAULT Bad address
+ osl_File_E_LOOP Too many symbolic links encountered
+ osl_File_E_IO I/O error
+ osl_File_E_BUSY Device or resource busy
+ osl_File_E_INTR function call was interrupted
+ osl_File_E_LOOP Too many symbolic links encountered
+ osl_File_E_MULTIHOP Multihop attempted
+ osl_File_E_NOLINK Link has been severed
+ osl_File_E_TXTBSY Text file busy

+*/ + +oslFileError SAL_CALL osl_removeFile( rtl_uString* strPath ); + + +/** Copies a file to a new destination. Copies only files not directories. No assumptions should + be made about preserving attributes or file time. + @param strPath [in] Full qualified UNC path of the source file. + @param strDestPath [in] Full qualified UNC path of the destination file. A directory is + NOT a valid destination file ! + @return osl_File_E_None on success otherwise one of the following errorcodes:

+ osl_File_E_INVAL the format of the parameters was not valid
+ osl_File_E_NOMEM not enough memory for allocating structures
+ osl_File_E_ACCES Permission denied
+ osl_File_E_PERM Operation not permitted
+ osl_File_E_NAMETOOLONG File name too long
+ osl_File_E_NOENT No such file or directory
+ osl_File_E_ISDIR Is a directory
+ osl_File_E_ROFS Read-only file system

+ + @see osl_moveFile + @see osl_removeFile + @see osl_createDirectory +*/ + +oslFileError SAL_CALL osl_copyFile( rtl_uString* strPath, rtl_uString *strDestPath ); + + +/** Moves a file or directory to a new destination or renames it. File time and attributes + are preserved. + @param strPath [in] Full qualified UNC path of the source file. + @param strDestPath [in] Full qualified UNC path of the destination file. An existing directory + is NOT a valid destination ! + @return osl_File_E_None on success otherwise one of the following errorcodes:

+ osl_File_E_INVAL the format of the parameters was not valid
+ osl_File_E_NOMEM not enough memory for allocating structures
+ osl_File_E_ACCES Permission denied
+ osl_File_E_PERM Operation not permitted
+ osl_File_E_NAMETOOLONG File name too long
+ osl_File_E_NOENT No such file or directory
+ osl_File_E_ROFS Read-only file system

+ + @see osl_copyFile +*/ + +oslFileError SAL_CALL osl_moveFile( rtl_uString* strPath, rtl_uString *strDestPath ); + + +/** Determines a valid unused canonical name for a requested name. Depending on file system and operation 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 file system and + operating system. + + @param strRequested [in] Requested name of a file or directory. + @param strValid [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 otherwise one of the following errorcodes:

+ osl_File_E_INVAL the format of the parameters was not valid
+ + @see osl_getFileStatus +*/ + +oslFileError SAL_CALL osl_getCanonicalName( rtl_uString *strRequested, rtl_uString **strValid); + + +/** Converts a path relative to a given directory into an full qualified UNC path. + + @param strDirBase [in] Base directory to which the relative path is related to. + @param strRelative[in] Path of a file or directory relative to the directory path + specified by strDirBase. + @param strAbsolute [out] On success it receives the full qualified UNC path of the + requested relative path. + + @return osl_File_E_None on success otherwise one of the following errorcodes:

+ osl_File_E_INVAL the format of the parameters was not valid
+ osl_File_E_NOMEM not enough memory for allocating structures
+ osl_File_E_NOTDIR Not a directory
+ osl_File_E_ACCES Permission denied
+ osl_File_E_NOENT No such file or directory
+ osl_File_E_NAMETOOLONG File name too long

+ + + These errorcodes can (eventually) be returned:

+ osl_File_E_OVERFLOW Value too large for defined data type

+ osl_File_E_FAULT Bad address
+ osl_File_E_INTR function call was interrupted
+ osl_File_E_LOOP Too many symbolic links encountered
+ osl_File_E_MULTIHOP Multihop attempted
+ osl_File_E_NOLINK Link has been severed

+ + @see osl_getFileStatus +*/ + + +oslFileError SAL_CALL osl_getAbsolutePath( rtl_uString* strDirBase, rtl_uString *strRelative, rtl_uString **strAbsolute ); + + +/** Converts a system dependent path into a full qualified UNC path + + @param strSysPath[in] System dependent path of a file or a directory + @param strPath[out] On success it receives the full qualified UNC path + + @return osl_File_E_None on success otherwise one of the following errorcodes:

+ osl_File_E_INVAL the format of the parameters was not valid
+ + @see osl_getCanonicalName + +*/ + +oslFileError SAL_CALL osl_normalizePath( rtl_uString *strSysPath, rtl_uString **strPath ); + + +/** Converts a File URL into a full qualified UNC path + + @param urlPath[in] System dependent path of a file or a directory + @param strPath[out] On success it receives the full qualified UNC path + + @return osl_File_E_None on success otherwise one of the following errorcodes:

+ osl_File_E_INVAL the format of the parameters was not valid
+ + @see osl_normalizePath + +*/ + +oslFileError SAL_CALL osl_getNormalizedPathFromFileURL( rtl_uString *urlPath, rtl_uString **strPath ); + + +/** Converts a full qualified UNC path into a FileURL + + @param dir[in] System dependent path of a file or a directory + @param strPath[out] On success it receives the full qualified UNC path + + @return osl_File_E_None on success otherwise one of the following errorcodes:

+ osl_File_E_INVAL the format of the parameters was not valid
+ + @see osl_normalizePath + @see osl_getNormalizedPathFromFileURL + +*/ + +oslFileError SAL_CALL osl_getFileURLFromNormalizedPath( rtl_uString *normPath, rtl_uString **strPath); + + +/** Searches a full qualified UNC-Path/File + + @param filePath[in] System dependent path / Normalized Path / File-URL or file or relative directory + @param searchPath[in] Paths, in which a given file has to be searched. These paths are only for the search of a + file or a relative path, otherwise it will be ignored. If it is set to 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 + @param strPath[out] On success it receives the full qualified UNC path + + @return osl_File_E_None on success otherwise one of the following errorcodes:

+ osl_File_E_INVAL the format of the parameters was not valid
+ osl_File_E_NOTDIR Not a directory
+ osl_File_E_NOENT No such file or directory not found
+ @see osl_normalizePath + +*/ + +/** Converts a full qualified UNC path into a system dependend path + + @param dir[in] Full qualified UNC path + @param strPath[out] On success it receives the system dependent path of a file or a directory + + @return osl_File_E_None on success otherwise one of the following errorcodes:

+ osl_File_E_INVAL the format of the parameters was not valid
+ + @see osl_normalizePath + @see osl_getNormalizedPathFromFileURL + +*/ + +oslFileError SAL_CALL osl_getSystemPathFromNormalizedPath( rtl_uString *normPath, rtl_uString **strPath); + +oslFileError SAL_CALL osl_searchNormalizedPath( rtl_uString *filePath, rtl_uString *searchPath, rtl_uString **strPath ); + + +/** Sets file-attributes + + @param filePath[in] Path of the file + @param uAttributes[in] Attributes of the file to be set + + @return osl_File_E_None on success otherwise one of the following errorcodes:

+ osl_File_E_INVAL the format of the parameters was not valid
+ @see osl_getFileStatus + +*/ + +oslFileError SAL_CALL osl_setFileAttributes( rtl_uString *filePath, sal_uInt64 uAttributes ); + + +/** Sets file-Time + + @param filePath[in] Path 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 otherwise one of the following errorcodes:

+ osl_File_E_INVAL the format of the parameters was not valid
+ osl_File_E_NOENT No such file or directory not found
+ @see osl_getFileStatus + +*/ + +oslFileError SAL_CALL osl_setFileTime( rtl_uString *filePath, TimeValue *aCreationTime, + TimeValue *aLastAccessTime, + TimeValue *aLastWriteTime); + +#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..b852debb57e8 --- /dev/null +++ b/sal/inc/osl/file.hxx @@ -0,0 +1,1408 @@ +/************************************************************************* + * + * $RCSfile: file.hxx,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:17:12 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + + +#ifndef _OSL_FILE_HXX_ +#define _OSL_FILE_HXX_ + +#ifdef __cplusplus + +#ifndef _RTL_MEMORY_H_ +# include +#endif + +#ifndef _RTL_USTRING_ +# include +#endif + +#include +#include + + +#ifdef _USE_NAMESPACE +namespace osl +{ +#endif + + +/** The VolumeInfo class + + @see Directory::getVolumeInfo +*/ + +#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_MaxPathLengt +#define VolumeInfoMask_FileSystemName osl_VolumeInfo_Mask_FileSystemName + +class Directory; + +class VolumeInfo +{ + oslVolumeInfo _aInfo; + sal_uInt32 _nMask; + rtl_uString *_strFileSystemName; + + /** define copy c'tor and assginment operator privat + */ + + VolumeInfo( VolumeInfo& ); + VolumeInfo& operator = ( VolumeInfo& ); + +public: + + /** C'tor + + @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 ); + _strFileSystemName=NULL; + _aInfo.pstrFileSystemName = &_strFileSystemName; + } + + /** D'tor + */ + + ~VolumeInfo() + { + if (_strFileSystemName!=NULL) + rtl_uString_release(_strFileSystemName); + } + + /** check if specified fields are valid + + @param set of flags for the fields to check + @return sal_True if all fields are valid, sal_False otherwise. + */ + + inline sal_Bool isValid( sal_uInt32 nMask ) const + { + return ( nMask & _aInfo.uValidFields ) == nMask; + } + + /** @return sal_True if Attributes are valid and the volume is remote, + sal_False otherwise. + */ + + inline sal_Bool getRemoteFlag() const + { + return (sal_Bool) (_aInfo.uAttributes & osl_Volume_Attribute_Remote); + } + + /** @return sal_True if attributes are valid and the volume is removable, + sal_False otherwise. + */ + + inline sal_Bool getRemoveableFlag() const + { + return (sal_Bool) (_aInfo.uAttributes & osl_Volume_Attribute_Removeable); + } + + /** @return the total diskspace of this volume if this information is valid, + 0 otherwise. + */ + + inline sal_uInt64 getTotalSpace() const + { + return _aInfo.uTotalSpace; + } + + /** @return the free diskspace of this volume if this information is valid, + 0 otherwise. + */ + + inline sal_uInt64 getFreeSpace() const + { + return _aInfo.uFreeSpace; + } + + /** @return the used diskspace of this volume if this information is valid, + 0 otherwise. + */ + + inline sal_uInt64 getUsedSpace() const + { + return _aInfo.uUsedSpace; + } + + /** @return the maximal length of a file name if this information is valid, + 0 otherwise. + */ + + inline sal_uInt32 getMaxNameLength() const + { + return _aInfo.uMaxNameLength; + } + + /** @return the maximal length of a path if this information is valid, + 0 otherwise. + */ + + inline sal_uInt32 getMaxPathLength() const + { + return _aInfo.uMaxPathLength; + } + + /** @return the name of the volume's fielsystem if this information is valid, + otherwise an empty string. + */ + + inline ::rtl::OUString getFileSystemName() const + { + return _strFileSystemName; + } + + friend class Directory; +}; + +// ----------------------------------------------------------------------------- + +/** The FileStatus class + + @see DirectoryItem::getFileStatus +*/ + +#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_FilePath osl_FileStatus_Mask_FilePath +#define FileStatusMask_NativePath osl_FileStatus_Mask_NativePath +#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; + +class FileStatus +{ + oslFileStatus _aStatus; + sal_uInt32 _nMask; + rtl_uString *_strNativePath; + rtl_uString *_strFilePath; + + /** define copy c'tor and assginment operator privat + */ + + FileStatus( FileStatus& ); + 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 + }; + + /** C'tor + + @param nMask set of flaggs decribing the demanded information. + */ + + FileStatus( sal_uInt32 nMask ): _nMask( nMask ), _strNativePath( NULL ), _strFilePath( NULL ) + { + _aStatus.uStructSize = sizeof( oslFileStatus ); + rtl_fillMemory( &_aStatus.uValidFields, sizeof( oslFileStatus ) - sizeof( sal_uInt32 ), 0 ); + _aStatus.pstrNativePath = &_strNativePath; + _aStatus.pstrFilePath = &_strFilePath; + } + + /** D'tor + */ + + ~FileStatus() + { + if ( _strFilePath ) + rtl_uString_release( _strFilePath ); + if ( _strNativePath ) + rtl_uString_release( _strNativePath ); + if ( _aStatus.strFileName ) + rtl_uString_release( _aStatus.strFileName ); + } + + /** check if specified fields are valid + + @param set of flags for the fields to check + @return sal_True if all fields are valid, sal_False otherwise. + */ + inline sal_Bool isValid( sal_uInt32 nMask ) const + { + return ( nMask & _aStatus.uValidFields ) == nMask; + } + + /** @return the file type if this information is valid, + Unknown otherwise. + */ + inline Type getFileType() const + { + return (_aStatus.uValidFields & FileStatusMask_Type) ? (Type) _aStatus.eType : Unknown; + } + + /** @return the set of attribute flags of this file + */ + + inline sal_uInt64 getAttributes() const + { + return _aStatus.uAttributes; + } + + /** @return the creation time if this information is valid, + an uninitialized TimeValue otherwise. + */ + + inline TimeValue getCreationTime() const + { + return _aStatus.aCreationTime; + } + + /** @return the last access time if this information is valid, + an uninitialized TimeValue otherwise. + */ + + inline TimeValue getAccessTime() const + { + return _aStatus.aAccessTime; + } + + /** @return the last modified time if this information is valid, + an uninitialized TimeValue otherwise. + */ + + inline TimeValue getModifyTime() const + { + return _aStatus.aModifyTime; + } + + /** @return the actual file size if this information is valid, + 0 otherwise. + */ + + inline sal_uInt64 getFileSize() const + { + return _aStatus.uFileSize; + } + + /** @return the file name if this information is valid, an empty + string otherwise. + */ + + inline ::rtl::OUString getFileName() const + { + return _aStatus.strFileName ? ::rtl::OUString(_aStatus.strFileName) : ::rtl::OUString(); + } + + /** @return the file path in UNC notation if this information is valid, + an empty string otherwise. + */ + + inline ::rtl::OUString getFilePath() const + { + return _strFilePath ? ::rtl::OUString(_strFilePath) : ::rtl::OUString(); + } + + /** @return the file path in host notation if this information is valid, + an empty string otherwise. + */ + + inline ::rtl::OUString getNativePath() const + { + return _strNativePath ? ::rtl::OUString(_strNativePath) : ::rtl::OUString(); + } + + friend class DirectoryItem; +}; + +// ----------------------------------------------------------------------------- + +/** Base class for all filesystem 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_invalidError = osl_File_E_invalidError /* unmapped error: always last entry in enum! */ + }; + + +public: + + /** Determines a valid unused canonical name for a requested name. Depending on file system and operation 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 file system and + operating system. + + @param strRequested [in] Requested name of a file or directory. + @param strValid [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 otherwise one of the following errorcodes:

+ osl_File_E_INVAL the format of the parameters was not valid
+ + @see osl_getFileStatus + */ + + static inline RC getCanonicalName( const ::rtl::OUString& strRequested, ::rtl::OUString& strValid ) + { + return (RC) osl_getCanonicalName( strRequested.pData, &strValid.pData ); + } + + /** Converts a path relative to a given directory into an full qualified UNC path. + + @param strDirBase [in] Base directory to which the relative path is related to. + @param strRelative[in] Path of a file or directory relative to the directory path + specified by strDirBase. + @param strAbsolute [out] On success it receives the full qualified UNC path of the + requested relative path. + + @return E_None on success otherwise one of the following errorcodes:

+ 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

+ + + These errorcodes can (eventually) be returned:

+ 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 getStatus + */ + + static inline RC getAbsolutePath( const ::rtl::OUString& strDirBase, const ::rtl::OUString& strRelative, ::rtl::OUString& strAbsolute ) + { + return (RC) osl_getAbsolutePath( strDirBase.pData, strRelative.pData, &strAbsolute.pData ); + } + + /** Converts a system dependent path into a full qualified UNC path + + @param strSysPath[in] System dependent path of a file or a directory + @param strPath[out] On success it receives the full qualified UNC path + + @return E_None on success otherwise one of the following errorcodes:

+ E_INVAL the format of the parameters was not valid
+ + @see getCanonicalName + */ + + static inline RC normalizePath( const ::rtl::OUString& strSysPath, ::rtl::OUString& strPath ) + { + return (RC) osl_normalizePath( strSysPath.pData, &strPath.pData ); + } + + /** Converts a File URL into a full qualified UNC path + + @param urlPath[in] System dependent path of a file or a directory + @param strPath[out] On success it receives the full qualified UNC path + + @return E_None on success otherwise one of the following errorcodes:

+ E_INVAL the format of the parameters was not valid
+ + @see normalizePath + */ + + static inline RC getNormalizedPathFromFileURL( const ::rtl::OUString& strPath, ::rtl::OUString& normPath ) + { + return (RC) osl_getNormalizedPathFromFileURL( strPath.pData, &normPath.pData ); + } + + /** Converts a full qualified UNC path into a FileURL + + @param dir[in] System dependent path of a file or a directory + @param strPath[out] On success it receives the full qualified UNC path + + @return E_None on success otherwise one of the following errorcodes:

+ E_INVAL the format of the parameters was not valid
+ + @see normalizePath + @see getNormalizedPathFromFileURL + */ + + static inline RC getFileURLFromNormalizedPath( const ::rtl::OUString& normPath, ::rtl::OUString& strPath ) + { + return (RC) osl_getFileURLFromNormalizedPath( normPath.pData, &strPath.pData ); + } + + /** Converts a full qualified UNC path into a system depended path + + @param dir[in] Full qualified UNC path + @param strPath[out] On success it receives the System dependent path of a file or a directory + + @return E_None on success otherwise one of the following errorcodes:

+ E_INVAL the format of the parameters was not valid
+ + @see normalizePath + @see getNormalizedPathFromFileURL + */ + + static inline RC getSystemPathFromNormalizedPath( const ::rtl::OUString& normPath, ::rtl::OUString& strPath ) + { + return (RC)osl_getSystemPathFromNormalizedPath( normPath.pData, &strPath.pData ); + } + + /** Searches a full qualified UNC-Path/File + + @param filePath[in] System dependent path / Normalized Path / File-URL or file or relative directory + @param searchPath[in] Paths, in which a given file has to be searched. These paths are only for the search of a + file or a relative path, otherwise it will be ignored. If it is set to 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 + @param strPath[out] On success it receives the full qualified UNC path + + @return E_None on success otherwise one of the following errorcodes:

+ 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 normalizePath + */ + + static inline RC searchNormalizedPath( const ::rtl::OUString& filePath, const ::rtl::OUString& searchPath, ::rtl::OUString& strPath ) + { + return (RC) osl_searchNormalizedPath( filePath.pData, searchPath.pData, &strPath.pData ); + } +}; + +// ----------------------------------------------------------------------------- + +/** The VolumeDevice class + + @see VolumeInfo +*/ + +class VolumeDevice : public FileBase +{ + oslVolumeDeviceHandle _aHandle; + +public: + VolumeDevice() : _aHandle( NULL ) + { + } + + VolumeDevice( const VolumeDevice & rDevice ) + { + _aHandle = rDevice._aHandle; + if ( _aHandle ) + osl_acquireVolumeDeviceHandle( _aHandle ); + } + + ~VolumeDevice() + { + if ( _aHandle ) + osl_releaseVolumeDeviceHandle( _aHandle ); + } + + + inline VolumeDevice & operator =( const VolumeDevice & rDevice ) + { + oslVolumeDeviceHandle newHandle = rDevice._aHandle; + + if ( newHandle ) + osl_acquireVolumeDeviceHandle( _aHandle ); + + if ( _aHandle ) + osl_releaseVolumeDeviceHandle( _aHandle ); + + _aHandle = newHandle; + + return *this; + } + + inline RC automount() + { + return (RC)osl_automountVolumeDevice( _aHandle ); + } + + inline RC unmount() + { + return (RC)osl_unmountVolumeDevice( _aHandle ); + } + + inline rtl::OUString getMountPath() + { + rtl::OUString aPath; + osl_getVolumeDeviceMountPath( _aHandle, &aPath.pData ); + return aPath; + } + + friend class VolumeInfo; +}; + +// ----------------------------------------------------------------------------- + +/** The file class object provides access to file contents and attributes + + @see Directory + @see DirectoryItem + */ + +class File: public FileBase +{ + oslFileHandle _pData; + ::rtl::OUString _aPath; + + /** define copy c'tor and assginment operator privat + */ + + File( File& ); + File& operator = ( File& ); + +public: + + /** C'tor + + @param strPath [in] The full qualified path of the file in UNC notation. + The path delimiter is '/'. Relative paths are not allowed. + */ + + File( const ::rtl::OUString& strPath ): _pData( 0 ), _aPath( strPath ) {}; + + /** D'tor + */ + + inline ~File() + { + close(); + } + + /** Opens a file. + @param uFlags [in] Specifies the open mode. + @return E_None on success otherwise one of the following errorcodes:

+ 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_ISDIR Is a directory

+ + These errorcodes can (eventually) be returned:

+ 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_ISDIR Is a directory
+ E_FAULT Bad address
+ E_LOOP Too many symbolic links encountered
+ E_NOSPC No space left on device
+ 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 I/O error
+ 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 setSize + */ + + #define OpenFlag_Read osl_File_OpenFlag_Read + #define OpenFlag_Write osl_File_OpenFlag_Write + #define OpenFlag_Create osl_File_OpenFlag_Create + + inline RC open( sal_uInt32 uFlags ) + { + return (RC) osl_openFile( _aPath.pData, &_pData, uFlags ); + } + + /** Closes an open file. + + @return E_None on success otherwise one of the following errorcodes:

+ E_INVAL the format of the parameters was not valid

+ + These errorcodes can (eventually) be returned:

+ 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 I/O error

+ */ + + inline RC close() + { + oslFileError Error = osl_File_E_BADF; + + if( _pData ) + { + Error=osl_closeFile( _pData ); + _pData = NULL; + } + + return (RC) Error; + }; + + + /** Sets 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 otherwise one of the following errorcodes:

+ 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 + */ + + #define Pos_Absolut osl_Pos_Absolut + #define Pos_Current osl_Pos_Current + #define Pos_End osl_Pos_End + + inline RC setPos( sal_uInt32 uHow, sal_uInt64 uPos ) + { + return (RC) osl_setFilePos( _pData, uHow, uPos ); + } + + /** Retrieves the current position of the internal pointer of an open file. + @param pPos [out] On Success it receives the current position of the file pointer. + @return E_None on success otherwise one of the following errorcodes:

+ 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 ); + } + + + /** 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 [int] New size in bytes. + @return E_None on success otherwise one of the following errorcodes:

+ 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 ); + } + + /** 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 otherwise one of the following errorcodes:

+ E_INVAL the format of the parameters was not valid
+ + These errorcodes can (eventually) be returned:

+ E_INTR function call was interrupted
+ E_IO I/O error
+ 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 setPos + */ + + inline RC read( void *pBuffer, sal_uInt64 uBytesRequested, sal_uInt64& rBytesRead ) + { + return (RC) osl_readFile( _pData, pBuffer, uBytesRequested, &rBytesRead ); + } + + /** 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 otherwise one of the following errorcodes:

+ E_INVAL the format of the parameters was not valid
+ E_FBIG File too large
+ E_DQUOT Quota exceeded

+ + These errorcodes can (eventually) be returned:

+ E_AGAIN Operation would block
+ E_BADF Bad file
+ E_FAULT Bad address
+ E_INTR function call was interrupted
+ E_IO I/O error
+ 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 openFile + @see readFile + @see setFilePos + */ + + inline RC write(const void *pBuffer, sal_uInt64 uBytesToWrite, sal_uInt64& rBytesWritten) + { + return (RC) osl_writeFile( _pData, pBuffer, uBytesToWrite, &rBytesWritten ); + } + + /** Copies a file to a new destination. Copies only files not directories. No assumptions should + be made about preserving attributes or file time. + @param strPath [in] Full qualified UNC path of the source file. + @param strDestPath [in] Full qualified UNC path of the destination file. A directory is + NOT a valid destination file ! + @return E_None on success otherwise one of the following errorcodes:

+ 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& strPath, const ::rtl::OUString& strDestPath ) + { + return (RC) osl_copyFile( strPath.pData, strDestPath.pData ); + } + + /** Moves a file or directory to a new destination or renames it. File time and attributes + are preserved. + @param strPath [in] Full qualified UNC path of the source file. + @param strDestPath [in] Full qualified UNC path of the destination file. An existing directory + is NOT a valid destination ! + @return E_None on success otherwise one of the following errorcodes:

+ 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& strPath, const ::rtl::OUString& strDestPath ) + { + return (RC) osl_moveFile( strPath.pData, strDestPath.pData ); + } + + /** Removes (erases) a regular file. + + @param strPath [in] Full qualified UNC path of the directory. + @return E_None on success otherwise one of the following errorcodes:

+ 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

+ + These errorcodes can (eventually) be returned:

+ E_FAULT Bad address
+ E_LOOP Too many symbolic links encountered
+ E_IO I/O error
+ 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

+ */ + + inline static RC remove( const ::rtl::OUString& strPath ) + { + return (RC) osl_removeFile( strPath.pData ); + } + + /** Sets file-attributes + + @param filePath[in] Path of the file + @param uAttributes[in] Attributes of the file to be set + + @return E_None on success otherwise one of the following errorcodes:

+ E_INVAL the format of the parameters was not valid
+ @see getStatus + */ + + inline static RC setAttributes( const ::rtl::OUString& strPath, sal_uInt64 uAttributes ) + { + return (RC) osl_setFileAttributes( strPath.pData, uAttributes ); + } + + /** Sets file-Time + + @param filePath[in] Path 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 E_None on success otherwise one of the following errorcodes:

+ E_INVAL the format of the parameters was not valid
+ E_NOENT No such file or directory not found
+ @see getStatus + */ + + inline static RC setTime( const ::rtl::OUString& strPath, TimeValue& rCreationTime, + TimeValue& rLastAccessTime, + TimeValue& rLastWriteTime ) + { + return (RC) osl_setFileTime( strPath.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: + + /** default c'tor + */ + + DirectoryItem(): _pData( NULL ) + { + } + + /** Copy C'tor + */ + + DirectoryItem( DirectoryItem& rItem ): _pData( rItem._pData) + { + osl_acquireDirectoryItem( _pData ); + } + + + /** D'tor + */ + + ~DirectoryItem() + { + if( _pData ) + osl_releaseDirectoryItem( _pData ); + } + + /** assignment operator + */ + + DirectoryItem& operator = ( DirectoryItem& rItem ) + { + if( _pData ) + osl_releaseDirectoryItem( _pData ); + + _pData = rItem._pData; + osl_acquireDirectoryItem( _pData ); + return *this; + }; + + /** @return sal_True if object is valid directory item, + sal_False otherwise. + */ + + inline sal_Bool is() + { + return _pData != NULL; + } + + /** fills a single directory item object + + @param strFilePath [in] absolute file path following the notation explained in the documentation for + osl_openDirectory. 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 rItem [out] on success it receives a valid directory item object. + + @return E_None on success otherwise one of the following errorcodes:

+ 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 File name too long
+ E_NOTDIR A component of the path prefix of path is not a directory

+ + These errorcodes can (eventually) be returned:

+ E_IO I/O error
+ E_MULTIHOP Multihop attempted
+ E_NOLINK Link has been severed
+ E_FAULT Bad address
+ E_INTR function call was interrupted

+ + + @see getFileStatus + @see Directory::getNextItem + */ + + static inline RC get( const ::rtl::OUString& strPath, DirectoryItem& rItem ) + { + if( rItem._pData) + osl_releaseDirectoryItem( rItem._pData ); + + return (RC) osl_getDirectoryItem( strPath.pData, &rItem._pData ); + } + + /** Get a directory item handle from an open file. + @param rItem [out] On success it receives a handle to a directory item which can be used + in subsequent calls to getStatus. + @return E_None on success otherwise one of the following errorcodes:

+ E_INVAL the format of the parameters was not valid

+ + @see File + @see getStatus + */ + + static inline RC get( const File& rFile, DirectoryItem& rItem ) + { + if( rItem._pData) + osl_releaseDirectoryItem( rItem._pData ); + + return (RC) osl_createDirectoryItemFromHandle( rFile._pData, &rItem._pData ); + } + + + /** Retrieves information about a single file or directory + + @param rStatus [in/out] reference of FileStatus class object that should be filled. + + @return E_None on success otherwise one of the following errorcodes:

+ 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

+ + These errorcodes can (eventually) be returned:

+ 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 I/O error
+ E_NOSYS Function not implemented

+ + @see DirectoryItem::get + @see Directory::getNextItem + */ + + inline RC getFileStatus( FileStatus& rStatus ) + { + return (RC) osl_getFileStatus( _pData, &rStatus._aStatus, rStatus._nMask ); + } + + friend class Directory; +}; + +// ----------------------------------------------------------------------------- + +/** The directory class object provides a enumeration of DirectoryItems. + + @see DirectoryItem + @see File + */ + +class Directory: public FileBase +{ + oslDirectory _pData; + ::rtl::OUString _aPath; + + /** define copy c'tor and assginment operator privat + */ + Directory( Directory& ); + Directory& operator = ( Directory& ); + + +public: + + /** C'tor + + @param strPath [in] The full qualified path of the directory in UNC notation. + The path delimiter is '/'. Relative paths are not allowed. + */ + + Directory( const ::rtl::OUString& strPath ): _pData( 0 ), _aPath( strPath ) + { + }; + + /** D'tor + */ + + ~Directory() + { + close(); + } + + /** Opens a directory for enumerating its contents. + + @return E_None on success otherwise one of the following errorcodes:

+ 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 item enumeration is valid. + + @return sal_True if enumeration is valid (opened), sal_False otherwise + + @see open + @see close + */ + + inline sal_Bool isOpen() { return _pData != NULL; }; + + /** closes a directory item enumeration + + @return E_None on success otherwise one of the following errorcodes:

+ E_INVAL the format of the parameters was not valid
+ E_NOMEM not enough memory for allocating structures

+ + These errorcodes can (eventually) be returned:

+ E_BADF Invalid oslDirectory parameter
+ E_INTR 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 the same as open + @see open + */ + + inline RC reset() + { + close(); + return open(); + } + + /** Retrieves the next item of a previously openend directory + @param rItem [out] The class that receives the next item's data. + @param nHint [in] With this parameter the caller can tell the implementation that one + 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 otherwise one of the following errorcodes:

+ 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

+ + These errorcodes can (eventually) be returned:

+ E_BADF oslDirectory parameter is not valid
+ E_OVERFLOW Value too large for defined data type

+ + @see DirectoryItem::get + */ + + inline RC getNextItem( DirectoryItem& rItem, sal_uInt32 nHint = 0 ) + { + return ( RC) osl_getNextDirectoryItem( _pData, &rItem._pData, nHint ); + } + + /** 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 File::getStatus should be called to determine if the type is + Type_Volume. + + @param strDirectory [in] Full qualified UNC path to the volume + @param rInfo [out] On success it receives information about the volume. + @return E_None on success otherwise one of the following errorcodes:

+ E_NOMEM not enough memory for allocating structures
+ E_INVAL the format of the parameters was not valid

+ + These errorcodes can (eventually) be returned:

+ 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 I/O error
+ E_NOSYS Function not implemented
+ E_MULTIHOP Multihop attempted
+ E_NOLINK Link has been severed
+ E_INTR function call was interrupted

+ + @see getFileStatus + @see VolumeInfo + */ + + inline static RC getVolumeInfo( const ::rtl::OUString& strPath, VolumeInfo& rInfo ) + { + return (RC) osl_getVolumeInformation( strPath.pData, &rInfo._aInfo, rInfo._nMask ); + } + + /** Creates a directory. + + @param strPath [in] Full qualified UNC path of the directory to create. + @return E_None on success otherwise one of the following errorcodes:

+ 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

+ + These errorcodes can (eventually) be returned:

+ E_LOOP Too many symbolic links encountered
+ E_FAULT Bad address
+ E_IO I/O error
+ E_MLINK Too many links
+ E_MULTIHOP Multihop attempted
+ E_NOLINK Link has been severed

+ + @see remove + */ + + inline static RC create( const ::rtl::OUString& strPath ) + { + return (RC) osl_createDirectory( strPath.pData ); + } + + /** Removes an empty directory. + + @param strPath [in] Full qualified UNC path of the empty directory to remove. + @return E_None on success otherwise one of the following errorcodes:

+ 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

+ + These errorcodes can (eventually) be returned:

+ 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 I/O error
+ E_MULTIHOP Multihop attempted
+ E_NOLINK Link has been severed

+ + @see create + */ + + inline static RC remove( const ::rtl::OUString& strPath ) + { + return (RC) osl_removeDirectory( strPath.pData ); + } +}; + +#ifdef _USE_NAMESPACE +} +#endif + +#endif /* __cplusplus */ +#endif /* _OSL_FILE_HXX_ */ + diff --git a/sal/inc/osl/interlck.h b/sal/inc/osl/interlck.h new file mode 100644 index 000000000000..ca149802b026 --- /dev/null +++ b/sal/inc/osl/interlck.h @@ -0,0 +1,93 @@ +/************************************************************************* + * + * $RCSfile: interlck.h,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:17:12 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +#ifndef _OSL_INTERLOCK_H_ +#define _OSL_INTERLOCK_H_ + +#ifndef _OSL_TYPES_H_ +# include +#endif + +#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..3d79af0d3742 --- /dev/null +++ b/sal/inc/osl/module.h @@ -0,0 +1,165 @@ +/************************************************************************* + * + * $RCSfile: module.h,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:17:13 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + + +#ifndef _OSL_MODULE_H_ +#define _OSL_MODULE_H_ + +#ifndef _RTL_USTRING_H +# include +#endif + +#ifndef _OSL_TYPES_H_ +# include +#endif + +#ifndef _RTL_TENCINFO_H +# include +#endif + +#ifdef __cplusplus +extern "C" { +#endif + + +#define SAL_LOADMODULE_DEFAULT 0x00000 +#define SAL_LOADMODULE_LAZY 0x00001 +#define SAL_LOADMODULE_NOW 0x00002 +#define SAL_LOADMODULE_GLOBAL 0x00100 + + +typedef void* oslModule; + + +/** Load a module.
+ @param strModuleName denotes the name of the module to be loaded. + @return 0 if the module could not be loaded, otherwise a handle to the module. +*/ +oslModule SAL_CALL osl_loadModule(rtl_uString *strModuleName, sal_Int32 nRtldMode); + +/** Release the Module +*/ +void SAL_CALL osl_unloadModule(oslModule Module); + +/** lookup the specified symbolname. + @returns address of the symbol or 0 if lookup failed, +*/ +void* SAL_CALL osl_getSymbol(oslModule Module, rtl_uString *strSymbolName); + +/** ascii interface for internal use. + @returns address of the symbol or 0 if lookup failed, +*/ +void* SAL_CALL osl_getSymbolA(oslModule Module, const char *pszSymbolName); + +#ifdef __cplusplus +} +#endif + +#endif /* _OSL_MODULE_H_ */ + + +/************************************************************************* +* +* $Log: not supported by cvs2svn $ +* Revision 1.8 2000/09/18 14:28:49 willem.vandorp +* OpenOffice header added. +* +* Revision 1.7 2000/05/17 14:30:14 mfe +* comments upgraded +* +* Revision 1.6 2000/03/31 15:55:56 rs +* UNICODE-Changes +* +* Revision 1.5 2000/03/16 16:43:52 obr +* Unicode API changes +* +* Revision 1.4 2000/01/06 11:46:32 mfe +* #71540# : for incompatible z'en +* +* Revision 1.3 2000/01/04 14:07:19 mfe +* osl_loadModule takes 2nd parameter +* +* Revision 1.2 1999/10/27 15:02:07 mfe +* Change of Copyright, removed compiler warnings, code clean up, ... +* +* Revision 1.1 1999/08/05 10:18:19 jsc +* verschoben aus osl +* +* Revision 1.6 1999/08/05 11:14:35 jsc +* verschoben in root inc-Verzeichnis +* +* Revision 1.5 1999/01/20 18:53:40 jsc +* #61011# Typumstellung +* +* Revision 1.4 1998/02/16 19:34:51 rh +* Cleanup of ports, integration of Size_t, features for process +* +* Revision 1.3 1997/07/31 15:28:38 ts +* *** empty log message *** +* +* Revision 1.2 1997/07/17 11:02:27 rh +* Header adapted and profile added +* +* Revision 1.1 1997/07/03 10:04:31 rh +* Module handling added +* +*************************************************************************/ + diff --git a/sal/inc/osl/mutex.h b/sal/inc/osl/mutex.h new file mode 100644 index 000000000000..4958a2f4b033 --- /dev/null +++ b/sal/inc/osl/mutex.h @@ -0,0 +1,145 @@ +/************************************************************************* + * + * $RCSfile: mutex.h,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:17:13 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +#ifndef _OSL_MUTEX_H_ +#define _OSL_MUTEX_H_ + +#ifndef _OSL_TYPES_H_ +# include +#endif + +#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); + +oslMutex * SAL_CALL osl_getGlobalMutex(); + +#ifdef __cplusplus +} +#endif + +#endif /* _OSL_MUTEX_H_ */ + +/************************************************************************* +* +* $Log: not supported by cvs2svn $ +* Revision 1.6 2000/09/18 14:28:49 willem.vandorp +* OpenOffice header added. +* +* Revision 1.5 2000/05/17 14:30:14 mfe +* comments upgraded +* +* Revision 1.4 1999/12/08 10:40:52 jbu +* #70413# changed oslMutex forward struct +* +* Revision 1.3 1999/10/27 15:02:07 mfe +* Change of Copyright, removed compiler warnings, code clean up, ... +* +* Revision 1.2 1999/09/28 13:04:31 kr +* new: getGlobalMutex +* +* Revision 1.1 1999/08/05 10:18:19 jsc +* verschoben aus osl +* +* Revision 1.4 1999/08/05 11:14:36 jsc +* verschoben in root inc-Verzeichnis +* +* Revision 1.3 1999/01/20 18:53:40 jsc +* #61011# Typumstellung +* +* Revision 1.2 1998/07/04 14:56:57 rh +* Prototype for OS/2 +* +* Revision 1.1 1998/02/16 19:34:51 rh +* Cleanup of ports, integration of Size_t, features for process +* +*************************************************************************/ diff --git a/sal/inc/osl/mutex.hxx b/sal/inc/osl/mutex.hxx new file mode 100644 index 000000000000..e428778fd113 --- /dev/null +++ b/sal/inc/osl/mutex.hxx @@ -0,0 +1,232 @@ +/************************************************************************* + * + * $RCSfile: mutex.hxx,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:17:13 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +#ifndef _OSL_MUTEX_HXX_ +#define _OSL_MUTEX_HXX_ + +#ifdef __cplusplus + +#include + +#include + + +#ifdef _USE_NAMESPACE +namespace osl +{ +#endif + + class Mutex { + oslMutex mutex; + + // these make no sense + Mutex( oslMutex ) {} + Mutex( const Mutex & ) {} + + public: + /** Create a thread-local mutex. + @return 0 if the mutex could not be created, otherwise a handle to the mutex. + */ + Mutex() + { + mutex = osl_createMutex(); + } + + /** Release the OS-structures and free mutex data-structure. + */ + ~Mutex() + { + osl_destroyMutex(mutex); + } + + /** Acquire the mutex, block if already acquired by another thread. + @return False if system-call fails. + */ + sal_Bool acquire() + { + return osl_acquireMutex(mutex); + } + + /** Try to acquire the mutex without blocking. + @return False if it could not be acquired. + */ + sal_Bool tryToAcquire() + { + return osl_tryToAcquireMutex(mutex); + } + + /** Release the mutex. + @return False if system-call fails. + */ + sal_Bool release() + { + return osl_releaseMutex(mutex); + } + + static Mutex * getGlobalMutex() + { + return (Mutex *)osl_getGlobalMutex(); + } + }; + + template + class Guard + { + protected: + T * pT; + public: + + Guard(T * pT) : pT(pT) + { + pT->acquire(); + } + + Guard(T & t) : pT(&t) + { + pT->acquire(); + } + + /** Releases mutex. */ + ~Guard() + { + pT->release(); + } + }; + + template + class ClearableGuard + { + protected: + T * pT; + public: + + ClearableGuard(T * pT) : pT(pT) + { + pT->acquire(); + } + + ClearableGuard(T & t) : pT(&t) + { + pT->acquire(); + } + + /** Releases mutex. */ + ~ClearableGuard() + { + if (pT) + pT->release(); + } + + /** Releases mutex. */ + void clear() + { + if(pT) + { + pT->release(); + pT = NULL; + } + } + }; + + typedef Guard MutexGuard; + typedef ClearableGuard ClearableMutexGuard; + +#ifdef _USE_NAMESPACE +} +#endif + +#endif /* __cplusplus */ +#endif /* _OSL_MUTEX_HXX_ */ + +/************************************************************************* +* +* $Log: not supported by cvs2svn $ +* Revision 1.10 2000/09/18 14:28:49 willem.vandorp +* OpenOffice header added. +* +* Revision 1.9 2000/07/04 13:38:41 dbo +* mutex copy ctors make no sense +* +* Revision 1.8 2000/05/17 14:30:14 mfe +* comments upgraded +* +* Revision 1.7 2000/01/04 14:48:04 dbo +* #70396# corrected ClearableGuard +* +* Revision 1.6 1999/10/27 15:02:07 mfe +* Change of Copyright, removed compiler warnings, code clean up, ... +* +* Revision 1.5 1999/10/18 09:08:41 rt +* syntax change in template for gcc for windows +* +* Revision 1.4 1999/10/05 10:23:31 obr +* changed OMutex to Mutex etc. +* +* Revision 1.3 1999/09/28 15:13:08 kr +* Protection +* +* Revision 1.2 1999/09/28 13:04:07 kr +* *** empty log message *** +* +* Revision 1.1 1999/09/23 12:09:22 kr +* inline header wrapper for mutex semaphore guard +* +*************************************************************************/ diff --git a/sal/inc/osl/pipe.h b/sal/inc/osl/pipe.h new file mode 100644 index 000000000000..83ffa0a3bf97 --- /dev/null +++ b/sal/inc/osl/pipe.h @@ -0,0 +1,148 @@ +/************************************************************************* + * + * $RCSfile: pipe.h,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:17:13 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + + +#ifndef _OSL_PIPE_H_ +#define _OSL_PIPE_H_ + +#ifndef _RTL_USTRING_H +# include +#endif + +#ifndef _OSL_TYPES_H_ +# include +#endif + +#ifndef _OSL_SECURITY_H_ +# include +#endif + +#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 void* oslPipe; + +oslPipe SAL_CALL osl_createPipe(rtl_uString *strPipeName, oslPipeOptions Options, oslSecurity Security); +void SAL_CALL osl_destroyPipe(oslPipe Pipe); + +oslPipe SAL_CALL osl_copyPipe(oslPipe Pipe); + +oslPipe SAL_CALL osl_acceptPipe(oslPipe Pipe); + +sal_Int32 SAL_CALL osl_sendPipe(oslPipe Pipe, const void* pBuffer, sal_uInt32 BufferSize); +sal_Int32 SAL_CALL osl_receivePipe(oslPipe Pipe, void* pBuffer, sal_uInt32 BufferSize); + +oslPipeError SAL_CALL osl_getLastPipeError(oslPipe Pipe); + +#ifdef __cplusplus +} +#endif + +#endif /* _OSL_PIPE_H_ */ + +/************************************************************************* +* +* $Log: not supported by cvs2svn $ +* Revision 1.5 2000/09/18 14:28:49 willem.vandorp +* OpenOffice header added. +* +* Revision 1.4 2000/05/17 14:30:14 mfe +* comments upgraded +* +* Revision 1.3 2000/03/16 16:43:52 obr +* Unicode API changes +* +* Revision 1.2 1999/10/27 15:02:07 mfe +* Change of Copyright, removed compiler warnings, code clean up, ... +* +* Revision 1.1 1999/08/05 10:18:19 jsc +* verschoben aus osl +* +* Revision 1.3 1999/08/05 11:14:37 jsc +* verschoben in root inc-Verzeichnis +* +* Revision 1.2 1999/01/20 18:53:40 jsc +* #61011# Typumstellung +* +* Revision 1.1 1998/03/13 15:07:31 rh +* Cleanup of enum chaos and implemntation of pipes +* +*************************************************************************/ diff --git a/sal/inc/osl/process.h b/sal/inc/osl/process.h new file mode 100644 index 000000000000..e3cf3d77b5fc --- /dev/null +++ b/sal/inc/osl/process.h @@ -0,0 +1,375 @@ +/************************************************************************* + * + * $RCSfile: process.h,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:17:13 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + + +#ifndef _OSL_PROCESS_H_ +#define _OSL_PROCESS_H_ + +#ifndef _RTL_USTRING_H +# include +#endif +#ifndef _RTL_TEXTENC_H +# include +#endif + +#ifndef _OSL_TYPES_H_ +# include +#endif + +#ifndef _OSL_FILE_H_ +# include +#endif + +#ifndef _OSL_PIPE_H_ +#include +#endif + +#ifndef _OSL_SOCKET_H_ +# include +#endif +#ifndef _OSL_SECURITY_H_ +# include +#endif + +#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; +#define osl_Process_IDENTIFIER 0x0001 +#define osl_Process_EXITCODE 0x0002 +#define osl_Process_CPUTIMES 0x0004 +#define osl_Process_HEAPUSAGE 0x0008 + +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(1) +#endif + +typedef union { + oslSocket Socket; + oslFileHandle File; +} oslResourceDescriptor; + +/** */ +typedef struct { + oslDescriptorType Type; + oslDescriptorFlag Flags; + oslResourceDescriptor Descriptor; +} oslIOResource; + +typedef struct { + sal_uInt32 Size; + oslProcessData Fields; + oslProcessIdentifier Ident; + oslProcessExitCode Code; + TimeValue UserTime; + TimeValue SystemTime; + sal_uInt32 HeapUsage; +} oslProcessInfo; + +#ifdef SAL_W32 +# pragma pack(pop) +#elif defined(SAL_OS2) +# pragma pack() +#endif + +/** Process handle + @see osl_executeProcess + @see osl_freeProcessHandle + @see osl_joinProcess +*/ +typedef void* oslProcess; + +/** Execute a process. + @param strImageName [in] denotes the name of the executable to be started. + @param strArguments [in] is an array of argument strings. + @param nArgument [in] the number of arguments provided. + @param Options [in] is a combination of int-constants to describe the mode of execution. + @param Security [in] describes a the user and his rights for wich the process is started. + @param strDirectory [in] denotes the name of the startup directory. + @param strEnviroments [in] is an array of strings wich describes the enviroment to set. + Each string has the form "variable=value". + @param nEnvironmentVars [in] the number of environment vars to set. + @param pResource [in] is a NULL terminated array of resources to transmit to the client process. + @param pProcess [out] points to a oslProcess variable, in wich the processhandle is returned. + @return osl_Process_E_None if the executable could be started, otherwise an error-code. + @see osl_freeProcessHandle + @see osl_getIOResources + @see osl_loginUser +*/ +oslProcessError SAL_CALL osl_executeProcess(rtl_uString *strImageName, + rtl_uString *strArguments[], + sal_uInt32 nArguments, + oslProcessOption Options, + oslSecurity Security, + rtl_uString *strWorkDir, + rtl_uString *strEnvironment[], + sal_uInt32 nEnvironmentVars, + oslIOResource* pResources, + oslProcess *pProcess); + +oslProcessError SAL_CALL osl_terminateProcess(oslProcess Process); + +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); + +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(); + +/** 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); + +/** 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); + +/** Receive io-resources like file descriptors or sockets from the parent process. + @param Resources [out] is the buffer in wich the resources are returned. + @param Max [in] is the size of this buffer. + @return osl_Process_E_None if the variable exists, otherwise an errorcode. + @see osl_executeProcess (provide the ioresources) +*/ +oslProcessError SAL_CALL osl_getIOResources(oslIOResource Resources[], sal_uInt32 Max); + +/** Receive a single io-resource inherited by a parent process using the Netsape + portable runtime. + NOTE: Currently only pipes are supported. + @param pResource [out] the buffer to be filled. + @param name [in] the name identifying the requested handle. +*/ +oslProcessError SAL_CALL osl_getIOResource(oslIOResource *pResource, const char * name); + +sal_Bool SAL_CALL osl_sendResourcePipe(oslPipe Pipe, oslSocket Socket); + +oslSocket SAL_CALL osl_receiveResourcePipe(oslPipe Pipe); + +#ifdef __cplusplus +} +#endif + +#endif /* _OSL_PROCESS_H_ */ + +/************************************************************************* +* +* $Log: not supported by cvs2svn $ +* Revision 1.13 2000/09/18 14:28:49 willem.vandorp +* OpenOffice header added. +* +* Revision 1.12 2000/07/31 17:41:51 mfe +* send and receive resource dummy implemented +* +* Revision 1.11 2000/07/21 16:15:41 mfe +* IO resource funcs added +* +* Revision 1.10 2000/06/18 12:18:57 obr +* enable inheritance of nspr file handles +* +* Revision 1.9 2000/05/17 14:30:14 mfe +* comments upgraded +* +* Revision 1.8 2000/03/31 17:02:04 rs +* UNICODE-Changes +* +* Revision 1.7 2000/03/27 09:17:50 hro +* UNICODE New osl_getThreadTextEncoding +* +* Revision 1.6 2000/03/20 15:23:15 obr +* Unicode API changes +* +* Revision 1.5 2000/03/17 13:41:25 obr +* Fixed parameter/docu +* +* Revision 1.4 2000/03/17 13:05:34 obr +* osl_getDefaulttextEncoding added. +* +* Revision 1.3 2000/03/17 12:03:56 obr +* Unicode API changes +* +* Revision 1.2 1999/10/27 15:02:08 mfe +* Change of Copyright, removed compiler warnings, code clean up, ... +* +* Revision 1.1 1999/08/05 10:18:19 jsc +* verschoben aus osl +* +* Revision 1.18 1999/08/05 11:14:38 jsc +* verschoben in root inc-Verzeichnis +* +* Revision 1.17 1999/01/20 18:53:41 jsc +* #61011# Typumstellung +* +* Revision 1.16 1998/07/20 17:17:33 rh +* #53072, #53073 Bugfixes for 5.0 +* +* Revision 1.15 1998/03/13 15:07:31 rh +* Cleanup of enum chaos and implemntation of pipes +* +* Revision 1.14 1998/02/16 19:34:51 rh +* Cleanup of ports, integration of Size_t, features for process +* +* Revision 1.13 1997/11/28 08:55:50 fm +* osl_PTSOCKETSEMAPHORE added +* +* Revision 1.12 1997/09/22 16:36:15 rh +* terminate added +* +* Revision 1.11 1997/07/31 15:28:39 ts +* *** empty log message *** +* +* Revision 1.10 1997/07/25 10:01:07 fm +* *** empty log message *** +* +* Revision 1.9 1997/07/22 14:29:29 rh +* process added +* +* Revision 1.8 1997/07/18 08:45:13 ts +* *** empty log message *** +* +* Revision 1.7 1997/07/17 19:01:44 ts +* *** empty log message *** +* +* Revision 1.6 1997/07/17 11:20:54 ts +* *** empty log message *** +* +* Revision 1.5 1997/07/17 11:02:27 rh +* Header adapted and profile added +* +* Revision 1.4 1997/07/15 19:01:58 rh +* system.h inserted +* +* Revision 1.3 1997/07/14 09:09:11 rh +* Adaptions for killable sleeps +* +* Revision 1.2 1997/07/11 10:14:28 ts +* *** empty log message *** +* +* Revision 1.1 1997/07/11 07:33:02 rh +* added +* +*************************************************************************/ diff --git a/sal/inc/osl/profile.h b/sal/inc/osl/profile.h new file mode 100644 index 000000000000..360e36b70155 --- /dev/null +++ b/sal/inc/osl/profile.h @@ -0,0 +1,205 @@ +/************************************************************************* + * + * $RCSfile: profile.h,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:17:13 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +#ifndef _OSL_PROFILE_H_ +#define _OSL_PROFILE_H_ + +#ifndef _RTL_USTRING_H +# include +#endif + +#ifndef _OSL_TYPES_H_ +# include +#endif + +#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; + +/** Open or create a configuration profile. + @return 0 if the profile could not be created, otherwise a handle to the profile. +*/ +oslProfile SAL_CALL osl_openProfile(rtl_uString *strProfileName, oslProfileOption Options); + +/** Close the opened profile an flush all data to the disk. + @param Profile handle to a opened profile. +*/ +sal_Bool SAL_CALL osl_closeProfile(oslProfile Profile); + + +sal_Bool SAL_CALL osl_flushProfile(oslProfile Profile); + + +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_Bool SAL_CALL osl_readProfileBool(oslProfile Profile, + const sal_Char* pszSection, const sal_Char* pszEntry, + sal_Bool 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_Bool SAL_CALL osl_writeProfileString(oslProfile Profile, + const sal_Char* pszSection, const sal_Char* pszEntry, + const sal_Char* pszString); +sal_Bool SAL_CALL osl_writeProfileBool(oslProfile Profile, + const sal_Char* pszSection, const sal_Char* pszEntry, + sal_Bool Value); +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); + +/** 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 SAL_CALL osl_removeProfileEntry(oslProfile Profile, + const sal_Char *pszSection, const sal_Char *pszEntry); + +/** Get all entries belonging to the specified section. + @param Profile handle to a opened profile. + @return Pointer to a array of pointers. +*/ +sal_uInt32 SAL_CALL osl_getProfileSectionEntries(oslProfile Profile, const sal_Char *pszSection, + sal_Char* pszBuffer, sal_uInt32 MaxLen); + +/** Get all section entries + @param Profile handle to a opened profile. + @return Pointer to a array of pointers. +*/ +sal_uInt32 SAL_CALL osl_getProfileSections(oslProfile Profile, sal_Char* pszBuffer, sal_uInt32 MaxLen); + +sal_Bool SAL_CALL osl_getProfileName(rtl_uString* strPath, rtl_uString* strName, rtl_uString** strProfileName); + + +#ifdef __cplusplus +} +#endif + +#endif /* _OSL_PROFILE_H_ */ + +/************************************************************************* +* +* $Log: not supported by cvs2svn $ +* Revision 1.8 2000/09/18 14:28:49 willem.vandorp +* OpenOffice header added. +* +* Revision 1.7 2000/05/17 14:50:15 mfe +* comments upgraded +* +* Revision 1.6 2000/03/22 17:06:42 mfe +* #73273# #72225# : now a UniCode Version +* +* Revision 1.5 2000/03/22 16:58:30 mfe +* #73273# #72225# : new Option for writing via flush without lock +* +* Revision 1.3 2000/03/06 14:14:46 mfe +* #73273# : added osl_flushProfile +* +* Revision 1.2 1999/10/27 15:02:08 mfe +* Change of Copyright, removed compiler warnings, code clean up, ... +* +* Revision 1.1 1999/08/05 10:18:19 jsc +* verschoben aus osl +* +* Revision 1.8 1999/08/05 11:14:39 jsc +* verschoben in root inc-Verzeichnis +* +* Revision 1.7 1999/01/20 18:53:41 jsc +* #61011# Typumstellung +* +* Revision 1.6 1998/05/04 10:44:01 rh +* Added osl_getProfileSections, minor changes on Unix signals, +* starting every process under unix in a separate thread, +* fix unix thread problem, when freeing a handle of a running thread +* +* Revision 1.5 1998/03/13 15:07:32 rh +* Cleanup of enum chaos and implemntation of pipes +* +* Revision 1.4 1998/02/16 19:34:51 rh +* Cleanup of ports, integration of Size_t, features for process +* +* Revision 1.3 1997/12/12 14:15:21 rh +* Added CR/LF conversion, locking and system integration +* +* Revision 1.2 1997/09/18 10:57:28 rh +* getProfileName added +* +* Revision 1.1 1997/07/17 11:02:27 rh +* Header adapted and profile added +* +*************************************************************************/ + diff --git a/sal/inc/osl/profile.hxx b/sal/inc/osl/profile.hxx new file mode 100644 index 000000000000..6fd53441e269 --- /dev/null +++ b/sal/inc/osl/profile.hxx @@ -0,0 +1,276 @@ +/************************************************************************* + * + * $RCSfile: profile.hxx,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:17:12 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +#ifndef _OSL_PROFILE_HXX_ +#define _OSL_PROFILE_HXX_ + +#include "profile.h" + +#ifndef _RTL_USTRING_ +#include +#endif + +#include + +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 */ + + 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() + { + sal_Bool err = 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; + } + + static rtl::OUString getName(const rtl::OUString& rPath, const rtl::OUString& rName) + { + rtl::OUString aProfileName; + return osl_getProfileName( rPath.pData, rName.pData, &aProfileName.pData ) ? aProfileName : rtl::OUString(); + } + + }; +} + +#endif /* _OSL_PROFILE_HXX_ */ + + +/************************************************************************* +* +* $Log: not supported by cvs2svn $ +* Revision 1.9 2000/09/18 14:28:49 willem.vandorp +* OpenOffice header added. +* +* Revision 1.8 2000/05/31 08:52:40 obr +* inline statement fixed +* +* Revision 1.7 2000/05/17 14:50:15 mfe +* comments upgraded +* +* Revision 1.6 2000/03/16 16:43:53 obr +* Unicode API changes +* +* Revision 1.5 2000/03/06 14:15:08 mfe +* #73273# : added flush() method +* +* Revision 1.4 1999/11/09 16:15:25 pl +* add: correct namespace +* +* Revision 1.3 1999/10/27 15:02:08 mfe +* Change of Copyright, removed compiler warnings, code clean up, ... +* +* Revision 1.2 1999/09/30 11:45:58 pl +* use OStrings to get rid of buffers +* +* Revision 1.1 1999/09/30 08:26:57 kr +* profile header inline wrapper +* +*************************************************************************/ diff --git a/sal/inc/osl/security.h b/sal/inc/osl/security.h new file mode 100644 index 000000000000..d98683f39a58 --- /dev/null +++ b/sal/inc/osl/security.h @@ -0,0 +1,263 @@ +/************************************************************************* + * + * $RCSfile: security.h,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:17:13 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +#ifndef _OSL_SECURITY_H_ +#define _OSL_SECURITY_H_ + +#ifndef _RTL_USTRING_H_ +# include +#endif + +#ifndef _OSL_TYPES_H_ +# include +#endif + +#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. + @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_ */ + +/************************************************************************* +* +* $Log: not supported by cvs2svn $ +* Revision 1.7 2000/09/18 14:28:49 willem.vandorp +* OpenOffice header added. +* +* Revision 1.6 2000/05/17 14:50:15 mfe +* comments upgraded +* +* Revision 1.5 2000/03/31 16:55:43 rs +* UNICODE-Changes +* +* Revision 1.4 2000/03/16 16:43:53 obr +* Unicode API changes +* +* Revision 1.3 1999/11/18 09:44:26 mfe +* loadUserprofile moved from process.c to security.c +* +* Revision 1.2 1999/10/27 15:02:08 mfe +* Change of Copyright, removed compiler warnings, code clean up, ... +* +* Revision 1.1 1999/08/05 10:18:20 jsc +* verschoben aus osl +* +* Revision 1.13 1999/08/05 11:14:41 jsc +* verschoben in root inc-Verzeichnis +* +* Revision 1.12 1999/07/09 15:35:33 br +* BR: fuer win16 +* +* Revision 1.11 1999/01/20 18:53:41 jsc +* #61011# Typumstellung +* +* Revision 1.10 1998/09/18 15:33:41 rh +* #56761# neue locations für cfg/ini files +* +* Revision 1.9 1998/03/13 15:07:32 rh +* Cleanup of enum chaos and implemntation of pipes +* +* Revision 1.8 1998/02/16 19:34:51 rh +* Cleanup of ports, integration of Size_t, features for process +* +* Revision 1.7 1997/10/21 14:22:21 ts +* Abfrage, ob ein Benutzer Adminstratorrechte hat eingebaut +* +* Revision 1.6 1997/10/17 16:00:44 ts +* osl_logonUserOnFileServer hinzugefuegt +* +* Revision 1.5 1997/10/14 07:52:51 fm +* *** empty log message *** +* +* Revision 1.4 1997/07/31 15:28:39 ts +* *** empty log message *** +* +* Revision 1.3 1997/07/22 14:29:30 rh +* process added +* +* Revision 1.2 1997/07/17 19:01:45 ts +* *** empty log message *** +* +* Revision 1.1 1997/07/17 11:22:18 ts +* *** empty log message *** +* +*************************************************************************/ + diff --git a/sal/inc/osl/semaphor.h b/sal/inc/osl/semaphor.h new file mode 100644 index 000000000000..911778cb0b82 --- /dev/null +++ b/sal/inc/osl/semaphor.h @@ -0,0 +1,146 @@ +/************************************************************************* + * + * $RCSfile: semaphor.h,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:17:13 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +#ifndef _OSL_SEMAPHORE_H_ +#define _OSL_SEMAPHORE_H_ + +#ifndef _OSL_TYPES_H_ +# include +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +typedef void* oslSemaphore; + +/** Creates a semaphore.
+ @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 + @return fbbb +*/ +void SAL_CALL osl_destroySemaphore(oslSemaphore Semaphore); + +/** acquire() decreases the count. It will block if it tries to + decrease below zero. + @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. +*/ +sal_Bool SAL_CALL osl_tryToAcquireSemaphore(oslSemaphore Semaphore); + +/** release() increases the count. + @return False if the system-call failed. +*/ +sal_Bool SAL_CALL osl_releaseSemaphore(oslSemaphore Semaphore); + +#ifdef __cplusplus +} +#endif + +#endif /* _OSL_SEMAPHORE_H_ */ + +/************************************************************************* +* +* $Log: not supported by cvs2svn $ +* Revision 1.4 2000/09/18 14:28:49 willem.vandorp +* OpenOffice header added. +* +* Revision 1.3 2000/05/17 14:50:15 mfe +* comments upgraded +* +* Revision 1.2 1999/10/27 15:02:08 mfe +* Change of Copyright, removed compiler warnings, code clean up, ... +* +* Revision 1.1 1999/08/05 10:18:20 jsc +* verschoben aus osl +* +* Revision 1.6 1999/08/05 11:14:41 jsc +* verschoben in root inc-Verzeichnis +* +* Revision 1.5 1999/01/20 18:53:41 jsc +* #61011# Typumstellung +* +* Revision 1.4 1998/02/16 19:34:52 rh +* Cleanup of ports, integration of Size_t, features for process +* +* Revision 1.3 1997/07/31 15:28:40 ts +* *** empty log message *** +* +* Revision 1.2 1997/07/17 11:02:28 rh +* Header adapted and profile added +* +* Revision 1.1 1997/06/19 13:10:10 bho +* first version of OSL. +* +*************************************************************************/ + diff --git a/sal/inc/osl/semaphor.hxx b/sal/inc/osl/semaphor.hxx new file mode 100644 index 000000000000..097bc6a81dd9 --- /dev/null +++ b/sal/inc/osl/semaphor.hxx @@ -0,0 +1,152 @@ +/************************************************************************* + * + * $RCSfile: semaphor.hxx,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:17:13 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +#ifndef _OSL_SEMAPHORE_HXX_ +#define _OSL_SEMAPHORE_HXX_ + +#ifdef __cplusplus + +#include + +#include + + +#ifdef _USE_NAMESPACE +namespace osl +{ +#endif + + class Semaphore { + oslSemaphore semaphore; + + public: + + /** Creates a semaphore.
+ @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); + } + }; +#ifdef _USE_NAMESPACE +} +#endif + +#endif /* __cplusplus */ +#endif /* _OSL_SEMAPHORE_HXX_ */ + +/************************************************************************* +* +* $Log: not supported by cvs2svn $ +* Revision 1.4 2000/09/18 14:28:49 willem.vandorp +* OpenOffice header added. +* +* Revision 1.3 2000/05/17 14:50:15 mfe +* comments upgraded +* +* Revision 1.2 1999/10/27 15:02:08 mfe +* Change of Copyright, removed compiler warnings, code clean up, ... +* +* Revision 1.1 1999/09/23 12:09:17 kr +* inline header wrapper for mutex semaphore guard +* +*************************************************************************/ + diff --git a/sal/inc/osl/signal.h b/sal/inc/osl/signal.h new file mode 100644 index 000000000000..439dd2feb60a --- /dev/null +++ b/sal/inc/osl/signal.h @@ -0,0 +1,182 @@ +/************************************************************************* + * + * $RCSfile: signal.h,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:17:13 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +#ifndef _OSL_SIGNAL_H_ +#define _OSL_SIGNAL_H_ + +#ifndef _OSL_TYPES_H_ +# include +#endif + +#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(1) +#endif + +typedef struct +{ + oslSignal Signal; + sal_Int32 UserSignal; + void* UserData; +} oslSignalInfo; + +#ifdef SAL_W32 +# pragma pack(pop) +#elif defined(SAL_OS2) +# pragma pack() +#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); + + +#ifdef __cplusplus +} +#endif + +#endif /* _OSL_SIGNAL_H_ */ + + +/************************************************************************* +* +* $Log: not supported by cvs2svn $ +* Revision 1.8 2000/09/18 14:28:49 willem.vandorp +* OpenOffice header added. +* +* Revision 1.7 2000/08/11 16:46:28 pl +* #77400# #76899# corrected define +* +* Revision 1.6 2000/08/11 16:31:40 pl +* #77400# add OSL_SIGNAL_USER_RVPCONNECTIONERROR +* +* Revision 1.5 2000/05/29 16:45:16 hro +* SRC591: Explicite SAL_CALL calling convention +* +* Revision 1.4 2000/05/17 14:50:15 mfe +* comments upgraded +* +* Revision 1.3 1999/12/22 13:37:55 mfe +* #71232# : added Alarm Signal Type +* +* Revision 1.2 1999/10/27 15:02:08 mfe +* Change of Copyright, removed compiler warnings, code clean up, ... +* +* Revision 1.1 1999/08/05 10:18:20 jsc +* verschoben aus osl +* +* Revision 1.5 1999/08/05 11:14:42 jsc +* verschoben in root inc-Verzeichnis +* +* Revision 1.4 1999/04/22 07:54:04 rh +* #63033# Deliver breakpoints via signal TSignal_DebugBreak +* +* Revision 1.3 1999/01/20 18:53:41 jsc +* #61011# Typumstellung +* +* Revision 1.2 1998/03/13 15:07:32 rh +* Cleanup of enum chaos and implemntation of pipes +* +* Revision 1.1 1998/03/06 15:42:09 rh +* Added signal handling +* +*************************************************************************/ diff --git a/sal/inc/osl/socket.h b/sal/inc/osl/socket.h new file mode 100644 index 000000000000..d20ebb9ad422 --- /dev/null +++ b/sal/inc/osl/socket.h @@ -0,0 +1,1001 @@ +/************************************************************************* + * + * $RCSfile: socket.h,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:17:13 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +#ifndef _OSL_SOCKET_H_ +#define _OSL_SOCKET_H_ + +#ifndef _RTL_USTRING_H_ +# include +#endif + +#ifndef _OSL_TYPES_H_ +# include +#endif + +#ifndef _RTL_TENCINFO_H +# include +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/* error returns */ +#define OSL_INADDR_NONE 0xffffffff +#define OSL_INVALID_PORT 0xffffffff +#define OSL_INVALID_IPX_SOCKET_NO 0xffffffff + +/**@{ begin section types +*/ + +/* + Opaque datatype SocketAddr. +*/ +typedef void* 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; + + +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; + + +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. + If family == osl_af_inet the address is set to INADDR_ANY + port 0. + @return 0 if address could not be created. +*/ +oslSocketAddr SAL_CALL osl_createEmptySocketAddr(oslAddrFamily Family); + + +/** Create a new SocketAddress and fill it from Addr. +*/ +oslSocketAddr SAL_CALL osl_copySocketAddr(oslSocketAddr Addr); + +/** Compare to SocketAddress. +*/ +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(..., oslSocketAddr ReceiverAddr, ...). + @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); + + +/** Create an IPX address. +*/ +oslSocketAddr SAL_CALL osl_createIpxSocketAddr(rtl_uString * strNetNumber, + rtl_uString * strNodeNumber, + sal_uInt32 SocketNumber); + +/** Free all memory allocated by pAddress. +*/ +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 osl_invalid_AddrFamily. +*/ +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 osl_af_inet, it returns OSL_INVALID_PORT +*/ +sal_Int32 SAL_CALL osl_getInetPortOfSocketAddr(oslSocketAddr Addr); + + +/** Sets the Port of Addr. + @param Port [in] is expected in host byte-order. + @return False if Addr is not an inet-addr. +*/ +sal_Bool SAL_CALL osl_setInetPortOfSocketAddr(oslSocketAddr Addr, sal_Int32 Port); + + +/** Gets the hostname represented by Addr. + @return 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. + @return the dotted decimal address (e.g. 141.99.20.34) represented + by the address. If the address is invalid or not of type osl_af_inet, + it returns 0. +*/ +oslSocketResult SAL_CALL osl_getDottedInetAddrOfSocketAddr(oslSocketAddr Addr, rtl_uString **strDottedInetAddr); + + +/** Gets the IPX Net-Number of the address. + @return the (4 bytes long) net-number or 0 if not an IPX address. +*/ +oslSocketResult SAL_CALL osl_getIpxNetNumber(oslSocketAddr Addr, oslSocketIpxNetNumber NetNumber); + + +/** Gets the IPX Node-Number of the address. + @return the (6 bytes long) net-number or 0 if not an IPX address. +*/ +oslSocketResult SAL_CALL osl_getIpxNodeNumber(oslSocketAddr Addr, oslSocketIpxNodeNumber NodeNumber); + +/** Gets the IPX Socket-Number of the address. + @return the IPX socket number or OSL_INVALID_IPX_SOCKET_NO if not an IPX address. +*/ +sal_Int32 SAL_CALL osl_getIpxSocketNumber(oslSocketAddr Addr); + +/**@} end section oslSocketAddr +*/ + +/**@{ begin section oslHostAddr +*/ + +/* + Opaque datatype HostAddr. +*/ +typedef void* 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); + + +/** Free all memory allocated by Addr. +*/ +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] The string that receives the local host name. + @return True upon success, False otherwise. +*/ +oslSocketResult SAL_CALL osl_getLocalHostname(rtl_uString **strLocalHostname); + + +/**@} end section oslHostAddr +*/ + +/**@{ begin section oslSocket +*/ + + +/*-***************************************************************************/ +/* oslSocket */ +/*-***************************************************************************/ + +typedef void* oslSocket; + +/** 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); + +/** Create a socket as a copy of another. + @return 0 if socket could not be created, otherwise you get a handle + to the allocated socket-datastructure. +*/ +oslSocket SAL_CALL osl_copySocket(oslSocket Socket); + +/** Closes the socket and frees the Socket data-structure. + For a graceful termination of a connection, you should call + osl_shutdownSocket() first. + @param Socket [in] The Socket to be closed and destroyed. +*/ +void SAL_CALL osl_destroySocket(oslSocket Socket); + + +/** 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 False if the bind failed. +*/ +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 osl_sock_result_ok on successful connection, + osl_sock_result_timeout if operation timed out, + osl_sock_result_interrupted if operation was interrupted + osl_sock_result_error 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 False 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: +

    +
  • osl_msg_normal, +
  • osl_msg_oob, +
  • osl_msg_peek, +
  • osl_msg_dontroute, +
  • osl_msg_maxiovlen, +
+ + @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 SenderAddr [out] An initialized oslSocketAddress. It will be + filled with the address of the datagrams sender. If SenderAddr 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: +
    +
  • osl_msg_normal, +
  • osl_msg_oob, +
  • osl_msg_peek, +
  • osl_msg_dontroute, +
  • osl_msg_maxiovlen, +
+ + @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: +
    +
  • osl_msg_normal, +
  • osl_msg_oob, +
  • osl_msg_peek, +
  • osl_msg_dontroute, +
  • osl_msg_maxiovlen, +
+ + @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 we only send one packet, we don't need to concern ourselfes here with + incomplete sends due to 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: +
    +
  • osl_msg_normal, +
  • osl_msg_oob, +
  • osl_msg_peek, +
  • osl_msg_dontroute, +
  • osl_msg_maxiovlen, +
+ + @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 True if read operations (recv, recvFrom, accept) on the Socket + will NOT block; False 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_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 True if send operations (send, sendTo) on the Socket + will NOT block; False 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 True if OOB-request operations (recv with appropriate flags) + on the Socket will NOT block; False 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_isExceptionPending(oslSocket Socket, const TimeValue* pTimeout); + +/** Shuts down communication on a connected socket. + @param Direction denotes which end of the socket + should be closed: +
    +
  • osl_shut_read closes read operations. +
  • osl_shut_write closes write operations. +
  • osl_shut_readwrite closes read and write operations. +
+ @return True 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: +
    +
  • osl_sol_socket: Socket Level +
  • osl_sol_tcp: Level of Transmission Control Protocol +
+ + @param Option denotes the option to query. + Valid values (depending on the Level) are: +
    +
  • osl_so_debug, +
  • osl_so_acceptconn, +
  • osl_so_reuseaddr, +
  • osl_so_keepalive, +
  • osl_so_dontroute, +
  • osl_so_broadcast, +
  • osl_so_useloopback, +
  • osl_so_linger, +
  • osl_so_oobinline, +
  • osl_so_sndbuf, +
  • osl_so_rcvbuf, +
  • osl_so_sndlowat, +
  • osl_so_rcvlowat, +
  • osl_so_sndtimeo, +
  • osl_so_rcvtimeo, +
  • osl_so_error, +
  • osl_so_type, +
  • osl_so_tcp_nodelay, (sol_tcp) +
+ If not above mentioned otherwise, the options are only valid for + level sol_socket. + + @param pBuffer Pointer to a Buffer with enough room 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. +*/ +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: +
    +
  • osl_sol_socket: Socket Level +
  • osl_sol_tcp: Level of Transmission Control Protocol +
+ + @param Option denotes the option to modify. + Valid values (depending on the Level) are: +
    +
  • osl_so_debug, +
  • osl_so_acceptconn, +
  • osl_so_reuseaddr, +
  • osl_so_keepalive, +
  • osl_so_dontroute, +
  • osl_so_broadcast, +
  • osl_so_useloopback, +
  • osl_so_linger, +
  • osl_so_oobinline, +
  • osl_so_sndbuf, +
  • osl_so_rcvbuf, +
  • osl_so_sndlowat, +
  • osl_so_rcvlowat, +
  • osl_so_sndtimeo, +
  • osl_so_rcvtimeo, +
  • osl_so_error, +
  • osl_so_type, +
  • osl_so_tcp_nodelay, (sol_tcp) +
+ If not above mentioned otherwise, the options are only valid for + level sol_socket. + + @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 True: enable non-blocking mode, False: disable non-blocking mode. + @return True 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: +
    +
  • osl_sock_stream, +
  • osl_sock_dgram, +
  • osl_sock_raw, +
  • osl_sock_rdm, +
  • osl_sock_seqpacket, +
  • osl_invalid_SocketType, if an error occured +
+ +*/ +oslSocketType SAL_CALL osl_getSocketType(oslSocket Socket); + +/** Delivers a string which describes the last socket error. + @param strError The string that receives the error message. + than the provided buffer, it will be cut short. Buffer sizes about 128 chars + should be large enough. +*/ +void SAL_CALL osl_getLastSocketErrorDescription(oslSocket Socket, rtl_uString **strError); + +/** Delivers a constant decribing the last error for the socket system. + @return osl_Socket_E_NONE if no error occured, osl_invalid_SocketError 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 void* 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(); + +/** 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 True 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); + +void SAL_CALL osl_closeSocket(oslSocket Socket); + + +/**@} end section oslSocket +*/ + + + +#ifdef __cplusplus +} +#endif + +#endif /* _OSL_SOCKET_H_ */ + +/************************************************************************* +* +* $Log: not supported by cvs2svn $ +* Revision 1.8 2000/09/18 14:28:49 willem.vandorp +* OpenOffice header added. +* +* Revision 1.7 2000/06/27 15:45:29 mhu +* Added function osl_createInetBroadcastAddr(). +* +* Revision 1.6 2000/05/17 14:50:15 mfe +* comments upgraded +* +* Revision 1.5 2000/03/31 15:56:19 rs +* UNICODE-Changes +* +* Revision 1.4 2000/03/20 08:56:22 obr +* Unicode API changes +* +* Revision 1.3 2000/03/16 16:43:53 obr +* Unicode API changes +* +* Revision 1.2 1999/10/27 15:02:08 mfe +* Change of Copyright, removed compiler warnings, code clean up, ... +* +* Revision 1.1 1999/08/05 10:18:20 jsc +* verschoben aus osl +* +* Revision 1.22 1999/08/05 11:14:43 jsc +* verschoben in root inc-Verzeichnis +* +* Revision 1.21 1999/07/21 16:13:06 ts +* #67730# changed channel maneger api +* +* Revision 1.20 1999/03/04 09:58:37 rh +* #62583 compare socketaddr +* +* Revision 1.19 1999/01/20 18:53:41 jsc +* #61011# Typumstellung +* +* Revision 1.18 1998/03/13 15:07:32 rh +* Cleanup of enum chaos and implemntation of pipes +* +* Revision 1.17 1998/02/16 19:34:52 rh +* Cleanup of ports, integration of sal_uInt32, features for process +* +* Revision 1.16 1997/12/09 10:55:40 mib +* AIX +* +* Revision 1.15 1997/11/25 10:14:40 fm +* initial release for S/390 +* +* Revision 1.14 1997/10/16 16:12:04 rh +* *** empty log message *** +* +* Revision 1.13 1997/10/15 10:26:02 mhu +* Added function: sal_Bool osl_getLocalHostname (sal_Char *pBuffer, int BufferSize) +* +* Revision 1.12 1997/09/15 10:53:54 mhu +* Added function osl_copyHostAddr(const oslHostAddr Addr). +* +* Revision 1.11 1997/09/09 12:03:29 fm +* *** empty log message *** +* +* Revision 1.10 1997/09/08 17:17:53 mhu +* Added support for domain name resolution (oslHostAddr). +* +* Revision 1.9 1997/09/04 09:51:44 rh +* Blockmode +* +* Revision 1.8 1997/08/23 20:36:40 rh +* return value for name resolving +* +* Revision 1.7 1997/08/22 14:47:36 rh +* TimeValue inserted +* +* Revision 1.6 1997/07/31 18:28:54 rh +* Standard types adapted +* +* Revision 1.5 1997/07/31 15:28:40 ts +* *** empty log message *** +* +* Revision 1.4 1997/07/17 11:02:28 rh +* Header adapted and profile added +* +* Revision 1.3 1997/06/25 13:16:31 rh +* Formatting +* +* Revision 1.2 1997/06/25 08:44:40 bho +* !changed implementation of sems to SYS V, because POSIX Sems are not +* supported yet by solaris. +* +* Revision 1.1 1997/06/19 13:10:11 bho +* first version of OSL. +* +*************************************************************************/ + diff --git a/sal/inc/osl/thread.h b/sal/inc/osl/thread.h new file mode 100644 index 000000000000..15fc7e8f4f9b --- /dev/null +++ b/sal/inc/osl/thread.h @@ -0,0 +1,329 @@ +/************************************************************************* + * + * $RCSfile: thread.h,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:17:13 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +#ifndef _OSL_THREAD_H_ +#define _OSL_THREAD_H_ + +#ifndef _OSL_TYPES_H_ +# include +#endif + +#ifndef _RTL_TEXTENC_H_ +# include +#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 enum +{ + osl_Thread_SleepNormal, + osl_Thread_SleepCancel, + osl_Thread_SleepPending, + osl_Thread_SleepActive, + osl_Thread_SleepError, + osl_Thread_SleepUnknown, /* don't use to set */ + osl_Thread_Sleep_FORCE_EQUAL_SIZE = SAL_MAX_ENUM +} oslThreadSleep; + +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); + +/** Forcefully abort the thread, if it is still running. + Then release the OS-structures and our thread data-structure. + If Thread is NULL, the function won't do anything. +*/ +void SAL_CALL osl_destroyThread(oslThread Thread); + +/** Release our thread data-structure. + 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_freeThreadHandle(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 + of time. Returns False if the sleep is aborted by a call + to awakeThread. +*/ +oslThreadSleep SAL_CALL osl_sleepThread(oslThread Thread, const TimeValue* pDelay); + +/** Awake a sleeping thread. Returns False if at least one of + the handles is invalid or the thread is not sleeping. +*/ +sal_Bool SAL_CALL osl_awakeThread(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); + +/** Create a key to an associated thread local storage pointer. */ +oslThreadKey SAL_CALL osl_createThreadKey(void); + +/** 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(); + +/** 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_ */ + +/************************************************************************* +* +* $Log: not supported by cvs2svn $ +* Revision 1.9 2000/09/18 14:28:49 willem.vandorp +* OpenOffice header added. +* +* Revision 1.8 2000/07/31 09:34:24 mfe +* changed declaration of setthreadtextenconding +* +* Revision 1.7 2000/07/27 20:23:46 patrick.luby +* Set osl_setThreadTextEncoding prototype to match function definition in +* osl/unx/thread.c file. +* +* Revision 1.6 2000/05/29 16:45:16 hro +* SRC591: Explicite SAL_CALL calling convention +* +* Revision 1.5 2000/05/17 14:50:15 mfe +* comments upgraded +* +* Revision 1.4 2000/03/27 09:16:51 hro +* UNICODE New osl_getThreadTextEncoding +* +* Revision 1.3 1999/12/22 13:38:17 mfe +* some clean up +* +* Revision 1.2 1999/10/27 15:02:08 mfe +* Change of Copyright, removed compiler warnings, code clean up, ... +* +* Revision 1.1 1999/08/05 10:18:20 jsc +* verschoben aus osl +* +* Revision 1.15 1999/08/05 11:14:44 jsc +* verschoben in root inc-Verzeichnis +* +* Revision 1.14 1999/03/19 09:05:58 jsc +* #60455# osl_isCurrentThresad entfernt +* +* Revision 1.13 1999/01/20 18:53:41 jsc +* #61011# Typumstellung +* +* Revision 1.12 1998/11/05 11:13:16 rh +* #59037# Thread local storage implementation +* +* Revision 1.11 1998/03/13 15:07:33 rh +* Cleanup of enum chaos and implemntation of pipes +* +* Revision 1.10 1998/02/26 18:35:27 rh +* Avoid unix zombies and rename oslThreadHandle to oslThread +* +* Revision 1.9 1998/02/16 19:34:52 rh +* Cleanup of ports, integration of Size_t, features for process +* +* Revision 1.8 1997/10/16 16:35:51 rh +* *** empty log message *** +* +* Revision 1.7 1997/10/16 16:26:08 rh +* *** empty log message *** +* +* Revision 1.6 1997/09/09 12:03:30 fm +* *** empty log message *** +* +* Revision 1.5 1997/08/22 14:47:38 rh +* TimeValue inserted +* +* Revision 1.4 1997/07/22 14:29:30 rh +* process added +* +* Revision 1.3 1997/07/17 11:02:29 rh +* Header adapted and profile added +* +* Revision 1.2 1997/07/14 09:09:12 rh +* Adaptions for killable sleeps +* +* Revision 1.1 1997/06/19 13:10:13 bho +* first version of OSL. +* +*************************************************************************/ + diff --git a/sal/inc/osl/time.h b/sal/inc/osl/time.h new file mode 100644 index 000000000000..660159935e9e --- /dev/null +++ b/sal/inc/osl/time.h @@ -0,0 +1,212 @@ +/************************************************************************* + * + * $RCSfile: time.h,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:17:13 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +#ifndef _OSL_TIME_H_ +#define _OSL_TIME_H_ + +#ifndef _OSL_TYPES_H_ +# include +#endif + +#ifdef __cplusplus +extern "C" { +#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 ); + + +#ifdef __cplusplus +} +#endif + +#endif /* _OSL_TIME_H_ */ + +/************************************************************************* +* +* $Log: not supported by cvs2svn $ +* Revision 1.6 2000/09/18 14:28:49 willem.vandorp +* OpenOffice header added. +* +* Revision 1.5 2000/08/18 14:01:05 rs +* new time functions +* +* Revision 1.4 2000/07/26 15:12:52 rs +* DateTime functions +* +* Revision 1.3 2000/05/17 14:50:15 mfe +* comments upgraded +* +* Revision 1.2 1999/10/27 15:02:09 mfe +* Change of Copyright, removed compiler warnings, code clean up, ... +* +* Revision 1.1 1999/08/05 10:18:20 jsc +* verschoben aus osl +* +* Revision 1.7 1999/08/05 11:14:44 jsc +* verschoben in root inc-Verzeichnis +* +* Revision 1.6 1999/01/20 18:53:41 jsc +* #61011# Typumstellung +* +* Revision 1.5 1998/03/13 15:07:33 rh +* Cleanup of enum chaos and implemntation of pipes +* +* Revision 1.4 1998/02/16 19:34:52 rh +* Cleanup of ports, integration of Size_t, features for process +* +* Revision 1.3 1997/08/22 14:47:38 rh +* TimeValue inserted +* +* Revision 1.2 1997/07/23 07:07:02 rh +* Change Micor to Nano-seconds +* +* Revision 1.1 1997/07/21 19:13:13 rh +* getSystemTime added +* +*************************************************************************/ diff --git a/sal/inc/osl/util.h b/sal/inc/osl/util.h new file mode 100644 index 000000000000..d0e26c3fd6dd --- /dev/null +++ b/sal/inc/osl/util.h @@ -0,0 +1,130 @@ +/************************************************************************* + * + * $RCSfile: util.h,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:17:13 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + + +#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.
+ * 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 ); + +/** + @deprecated + Set the solar build number. Affect the profile function from osl and + the ORealDynamicLoader class from vos. + Default is the SUPD from the build process if it was build with the + solar environment, otherwise 0. + */ +void SAL_CALL osl_setSUPD( sal_Int32 n ); + +/** + @deprecated + Return the solar build number + */ +sal_Int32 SAL_CALL osl_getSUPD(); + +#ifdef __cplusplus +} +#endif + +#endif + +/************************************************************************* +* +* $Log: not supported by cvs2svn $ +* Revision 1.7 2000/09/18 14:28:49 willem.vandorp +* OpenOffice header added. +* +* Revision 1.6 2000/05/26 10:12:13 hro +* SAL_CALL for osl_getSUPD, osl_getSUPD +* +* Revision 1.5 2000/05/17 14:50:15 mfe +* comments upgraded +* +* Revision 1.4 2000/03/16 16:43:53 obr +* Unicode API changes +* +* Revision 1.3 2000/03/16 14:16:34 mm +* #74230# setSUPD +* +* Revision 1.2 1999/12/06 14:59:18 jbu +* osl_getEthernetAddress added +* +* Revision 1.1 1999/10/25 09:48:05 mfe +* added getEtherAddr +* +*************************************************************************/ diff --git a/sal/inc/rtl/alloc.h b/sal/inc/rtl/alloc.h new file mode 100644 index 000000000000..67bbaa8706cd --- /dev/null +++ b/sal/inc/rtl/alloc.h @@ -0,0 +1,116 @@ +/************************************************************************* + * + * $RCSfile: alloc.h,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:17:13 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +#ifndef _RTL_ALLOC_H_ +#define _RTL_ALLOC_H_ + +#ifndef _SAL_TYPES_H_ +# include +#endif + +#ifdef __cplusplus +extern "C" { +#endif + + +/** Allocate memory. + * @param Bytes [in] memory size. + * @return pointer to allocated memory. + */ +void * SAL_CALL rtl_allocateMemory (sal_uInt32 Bytes); + + +/** Reallocate memory. + * @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_uInt32 Bytes); + + +/** 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); + + +/** Allocate and zero memory. + * @param Bytes [in] memory size. + * @return pointer to allocated and zero'ed memory. + */ +void * SAL_CALL rtl_allocateZeroMemory (sal_uInt32 Bytes); + + +/** 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_uInt32 Bytes); + + +#ifdef __cplusplus +} +#endif + +#endif /*_RTL_ALLOC_H_ */ + diff --git a/sal/inc/rtl/byteseq.h b/sal/inc/rtl/byteseq.h new file mode 100644 index 000000000000..c4d5c5b1f694 --- /dev/null +++ b/sal/inc/rtl/byteseq.h @@ -0,0 +1,330 @@ +/************************************************************************* + * + * $RCSfile: byteseq.h,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:17:13 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ +#ifndef _RTL_BYTESEQ_H_ +#define _RTL_BYTESEQ_H_ + +#ifndef _SAL_TYPES_H_ +#include +#endif + +#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 ); + +/** 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 ); + +/** Acquires the byte sequence
+ @param pSequence sequence, that shall be acquired. + */ +void SAL_CALL rtl_byte_sequence_acquire( sal_Sequence *pSequence ); + +/** Releases the byte sequence. If the refcount drops to zero, + * the sequence is freed.
+ + @param pSequence sequence, that shall be released. Invalid after call. + */ +void SAL_CALL rtl_byte_sequence_release( sal_Sequence *pSequence ); + +/** Constructs a bytes sequence with length nLength. All bytes are set to zero. + * + * @param On entry *ppSequence may be null , otherwise it is released. + * After the call, ppSequence contains the newly constructed sequence. + * + * + **/ +void SAL_CALL rtl_byte_sequence_construct( sal_Sequence **ppSequence , sal_Int32 nLength ); + +/** Constructs a bytes sequence with length nLength. The data is not initialized. + * + * @param ppSequence contains the newly constructed sequence. + * *ppSequence is released on entry if needed. + * + **/ +void SAL_CALL rtl_byte_sequence_constructNoDefault( + sal_Sequence **ppSequence , sal_Int32 nLength ); + +/** Constructs a byte sequence with length nLength and copies nLength bytes from pData. + * + * @param ppSequence contains the newly constructed sequence. + * *ppSequence is released on entry if needed. + **/ +void SAL_CALL rtl_byte_sequence_constructFromArray( + sal_Sequence **ppSequence, const sal_Int8 *pData , sal_Int32 nLength ); + +/** Assigns the byte sequence pSequence to ppSequence. + * + * @param On entry *ppSequence may be null , otherwise it is released. + * ppSequence contains after the call a copy of pSequence. + * @param pSequence the source sequence + **/ +void SAL_CALL rtl_byte_sequence_assign( sal_Sequence **ppSequence , sal_Sequence *pSequence ); + +/** Compares two byte sequences. + * + * @return sal_False, if the data within the sequences are different.
+ * sal_True, if the data within the sequences are identical
+ **/ +sal_Bool SAL_CALL rtl_byte_sequence_equals( sal_Sequence *pSequence1 , sal_Sequence *pSequence2 ); + + +/** Returns the data pointer of the sequence. + * + * @return const pointer to the data 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 ); + +/** Returns the length of the sequence + * + * + **/ +sal_Int32 SAL_CALL rtl_byte_sequence_getLength( sal_Sequence *pSequence ); + +#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
+ */ + sal_Sequence * _pSequence; + +public: + /** Default constructor: + Creates an empty sequence. +
+ */ + inline ByteSequence(); + /** Copy constructor: + Creates a copy of given sequence. +
+ @param rSeq another byte sequence + */ + inline ByteSequence( const ByteSequence & rSeq ); + /** Copy constructor + Creates a copy from the C-Handle. + */ + inline ByteSequence( sal_Sequence *pSequence ); + /** Constructor: + Creates a copy of given bytes. +
+ @param pElement 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 dummy parameter + */ + inline ByteSequence( sal_Int32 len , enum __ByteSequence_NoDefault nodefault ); + /** Constructor: + Creates a sequence from a C-Handle without acquiring the handle. 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 ). +
+ */ + inline ByteSequence( sal_Sequence *pSequence , enum __ByteSequence_NoAcquire noacquire ); + /** Destructor: + Releases sequence handle. Last handle will free memory. +
+ */ + inline ~ByteSequence(); + + /** Assignment operator: + Acquires given sequence handle and releases previously set handle. +
+ @param rSeq another byte sequence + @return this sequence + */ + inline ByteSequence & SAL_CALL operator = ( const ByteSequence & rSeq ); + + /** Gets length of sequence. +
+ @return length of sequence + */ + inline sal_Int32 SAL_CALL getLength() const + { 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 + { 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.
+ The implementation does not check for array bounds!
+ 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! +
+ @param nIndex index + @return non-const C++ reference to element + */ + inline sal_Int8 & SAL_CALL operator [] ( sal_Int32 nIndex ) + { return getArray()[ 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 + */ + inline const sal_Int8 & SAL_CALL operator [] ( sal_Int32 nIndex ) const + { 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; + /** 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 + { return (! operator == ( rSeq )); } + + /** 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 (unacquired) C-Handle of the sequence + * + **/ + inline sal_Sequence * SAL_CALL getHandle() + { return _pSequence; } +}; + +} +#endif +#endif diff --git a/sal/inc/rtl/byteseq.hxx b/sal/inc/rtl/byteseq.hxx new file mode 100644 index 000000000000..5fe4c0132ddd --- /dev/null +++ b/sal/inc/rtl/byteseq.hxx @@ -0,0 +1,155 @@ +/************************************************************************* + * + * $RCSfile: byteseq.hxx,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:17:13 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ +#ifndef _RTL_BYTESEQ_HXX_ +#define _RTL_BYTESEQ_HXX_ + +#ifndef _OSL_INTERLOCK_H_ +#include +#endif +#ifndef _RTL_BYTESEQ_H_ +#include +#endif +#ifndef _RTL_ALLOC_H_ +#include +#endif +#ifndef _RTL_MEMORY_H_ +#include +#endif + + +namespace rtl +{ + +//__________________________________________________________________________________________________ +inline ByteSequence::ByteSequence() + : _pSequence( 0 ) +{ + rtl_byte_sequence_construct( &_pSequence , 0 ); +} +//__________________________________________________________________________________________________ +inline ByteSequence::ByteSequence( const ByteSequence & rSeq ) : + _pSequence( 0 ) +{ + rtl_byte_sequence_assign( &_pSequence , rSeq._pSequence ); +} +//__________________________________________________________________________________________________ +inline ByteSequence::ByteSequence( sal_Sequence *pSequence) : + _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 ); +} +//__________________________________________________________________________________________________ +inline ByteSequence::ByteSequence( sal_Int32 len, enum __ByteSequence_NoDefault value ) + : _pSequence( 0 ) +{ + rtl_byte_sequence_constructNoDefault( &_pSequence , len ); +} +//__________________________________________________________________________________________________ +inline ByteSequence::ByteSequence( sal_Sequence *pSequence, enum __ByteSequence_NoAcquire value ) + : _pSequence( pSequence ) +{ +} +//__________________________________________________________________________________________________ +inline ByteSequence::ByteSequence( sal_Int32 len ) + : _pSequence( 0 ) +{ + rtl_byte_sequence_construct( &_pSequence , len ); +} +//__________________________________________________________________________________________________ +inline ByteSequence::~ByteSequence() +{ + rtl_byte_sequence_release( _pSequence ); +} +//__________________________________________________________________________________________________ +inline ByteSequence & ByteSequence::operator = ( const ByteSequence & rSeq ) +{ + rtl_byte_sequence_assign( &_pSequence , rSeq._pSequence ); + return *this; +} +//__________________________________________________________________________________________________ +inline sal_Bool ByteSequence::operator == ( const ByteSequence & rSeq ) const +{ + if (_pSequence == rSeq._pSequence) + return sal_True; + if (_pSequence->nElements != rSeq._pSequence->nElements) + return sal_False; + return (0 == ::rtl_compareMemory( _pSequence->elements, rSeq._pSequence->elements, _pSequence->nElements )); +} +//__________________________________________________________________________________________________ +inline sal_Int8 * ByteSequence::getArray() +{ + ::rtl_byte_sequence_reference2One( &_pSequence ); + return (sal_Int8 *)_pSequence->elements; +} +//__________________________________________________________________________________________________ +inline void ByteSequence::realloc( sal_Int32 nSize ) +{ + ::rtl_byte_sequence_realloc( &_pSequence, nSize ); +} + +} +#endif diff --git a/sal/inc/rtl/cipher.h b/sal/inc/rtl/cipher.h new file mode 100644 index 000000000000..f64685108773 --- /dev/null +++ b/sal/inc/rtl/cipher.h @@ -0,0 +1,275 @@ +/************************************************************************* + * + * $RCSfile: cipher.h,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:17:14 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +#ifndef _RTL_CIPHER_H_ +#define _RTL_CIPHER_H_ "$Revision: 1.1.1.1 $" + +#ifndef _SAL_TYPES_H_ +#include +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/*======================================================================== + * + * rtlCipher interface. + * + *======================================================================*/ +/** Opaque cipher handle. + */ +typedef void* rtlCipher; + + +/** rtlCipherAlgorithm. + * + * @see rtl_cipher_create. + */ +typedef enum +{ + rtl_Cipher_AlgorithmBF, + rtl_Cipher_AlgorithmInvalid, + rtl_Cipher_Algorithm_FORCE_EQUAL_SIZE = SAL_MAX_ENUM +} rtlCipherAlgorithm; + + +/** rtlCipherMode. + * + * @see rtl_cipher_create. + */ +typedef enum +{ + rtl_Cipher_ModeECB, + rtl_Cipher_ModeCBC, + rtl_Cipher_ModeStream, + rtl_Cipher_ModeInvalid, + rtl_Cipher_Mode_FORCE_EQUAL_SIZE = SAL_MAX_ENUM +} rtlCipherMode; + + +/** rtlCipherDirection. + * + * @see rtl_cipher_init. + */ +typedef enum +{ + rtl_Cipher_DirectionBoth, + rtl_Cipher_DirectionDecode, + rtl_Cipher_DirectionEncode, + rtl_Cipher_DirectionInvalid, + rtl_Cipher_Direction_FORCE_EQUAL_SIZE = SAL_MAX_ENUM +} rtlCipherDirection; + + +/** rtlCipherError. + */ +typedef enum +{ + 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 +} rtlCipherError; + + +/** rtl_cipher_create. + * Create a cipher handle for the given algorithm and mode. + * + * @param Algorithm [in] + * @param Mode [in] + * @return Cipher handle, or 0 upon failure. + */ +rtlCipher SAL_CALL rtl_cipher_create ( + rtlCipherAlgorithm Algorithm, + rtlCipherMode Mode); + + +/** rtl_cipher_init. + * + * @param Cipher [in] + * @param Direction [in] + * @param pKeyData [in] + * @param nKeyLen [in] + * @param pArgData [in] + * @param nArgLen [in] + * @return rtl_Cipher_E_None upon success. + */ +rtlCipherError SAL_CALL rtl_cipher_init ( + rtlCipher Cipher, + rtlCipherDirection Direction, + const sal_uInt8 *pKeyData, sal_uInt32 nKeyLen, + const sal_uInt8 *pArgData, sal_uInt32 nArgLen); + + +/** rtl_cipher_encode. + * + * @param Cipher [in] + * @param pData [in] + * @param nDatLen [in] + * @param pBuffer [out] + * @param nBufLen [in] + * @return rtl_Cipher_E_None upon success. + */ +rtlCipherError SAL_CALL rtl_cipher_encode ( + rtlCipher Cipher, + const void *pData, sal_uInt32 nDatLen, + sal_uInt8 *pBuffer, sal_uInt32 nBufLen); + + +/** rtl_cipher_decode. + * + * @param Cipher [in] + * @param pData [in] + * @param nDatLen [in] + * @param pBuffer [out] + * @param nBufLen [in] + * @return rtl_Cipher_E_None upon success. + */ +rtlCipherError SAL_CALL rtl_cipher_decode ( + rtlCipher Cipher, + const void *pData, sal_uInt32 nDatLen, + sal_uInt8 *pBuffer, sal_uInt32 nBufLen); + + +/** rtl_cipher_destroy. + * + * @param Cipher [in] handle to be destroyed. + * @return None. Cipher handle destroyed and invalid. + */ +void SAL_CALL rtl_cipher_destroy (rtlCipher Cipher); + + +/*======================================================================== + * + * rtl_cipherBF (Blowfish) interface. + * + * Reference: + * Bruce Schneier: Applied Cryptography, 2nd edition, ch. 14.3 + * + *======================================================================*/ +/** rtl_cipher_createBF. + * + * @return Cipher handle, or 0 upon failure. + * @see rtl_cipher_create. + */ +rtlCipher SAL_CALL rtl_cipher_createBF (rtlCipherMode Mode); + + +/** rtl_cipher_initBF. + * + * @return rtl_Cipher_E_None upon success. + * @see rtl_cipher_init. + */ +rtlCipherError SAL_CALL rtl_cipher_initBF ( + rtlCipher Cipher, + rtlCipherDirection Direction, + const sal_uInt8 *pKeyData, sal_uInt32 nKeyLen, + const sal_uInt8 *pArgData, sal_uInt32 nArgLen); + + +/** rtl_cipher_encodeBF. + * + * @return rtl_Cipher_E_None upon success. + * @see rtl_cipher_encode. + */ +rtlCipherError SAL_CALL rtl_cipher_encodeBF ( + rtlCipher Cipher, + const void *pData, sal_uInt32 nDatLen, + sal_uInt8 *pBuffer, sal_uInt32 nBufLen); + + +/** rtl_cipher_decodeBF. + * + * @return rtl_Cipher_E_None upon success. + * @see rtl_cipher_decode. + */ +rtlCipherError SAL_CALL rtl_cipher_decodeBF ( + rtlCipher Cipher, + const void *pData, sal_uInt32 nDatLen, + sal_uInt8 *pBuffer, sal_uInt32 nBufLen); + + +/** rtl_cipher_destroyBF. + * + * @param Cipher [in] handle to be destroyed. + * @return None. Cipher handle destroyed and invalid. + * @see rtl_cipher_destroy. + */ +void SAL_CALL rtl_cipher_destroyBF (rtlCipher Cipher); + +/*======================================================================== + * + * 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..fac1552b03af --- /dev/null +++ b/sal/inc/rtl/crc.h @@ -0,0 +1,100 @@ +/************************************************************************* + * + * $RCSfile: crc.h,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:17:14 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +#ifndef _RTL_CRC_H_ +#define _RTL_CRC_H_ "$Revision: 1.1.1.1 $" + +#ifndef _SAL_TYPES_H_ +#include +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/*======================================================================== + * + * rtl_crc32 interface. + * + *======================================================================*/ +/** Evaluate CRC32 over given data. + * + * @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); + +/*======================================================================== + * + * 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..a92f09ee5f68 --- /dev/null +++ b/sal/inc/rtl/digest.h @@ -0,0 +1,224 @@ +/************************************************************************* + * + * $RCSfile: digest.h,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:17:14 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +#ifndef _RTL_DIGEST_H_ +#define _RTL_DIGEST_H_ "$Revision: 1.1.1.1 $" + +#ifndef _SAL_TYPES_H_ +#include +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/*======================================================================== + * + * rtlDigest. + * + *======================================================================*/ +typedef void* rtlDigest; + +typedef enum { + rtl_Digest_AlgorithmMD2, + rtl_Digest_AlgorithmMD5, + rtl_Digest_AlgorithmSHA, + rtl_Digest_AlgorithmSHA1, + rtl_Digest_AlgorithmInvalid, + rtl_Digest_Algorithm_FORCE_EQUAL_SIZE = SAL_MAX_ENUM +} rtlDigestAlgorithm; + +typedef enum { + 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 +} rtlDigestError; + +rtlDigest SAL_CALL rtl_digest_create (rtlDigestAlgorithm Algorithm); +void SAL_CALL rtl_digest_destroy (rtlDigest Digest); + +rtlDigestAlgorithm SAL_CALL rtl_digest_queryAlgorithm (rtlDigest Digest); +sal_uInt32 SAL_CALL rtl_digest_queryLength (rtlDigest Digest); + +rtlDigestError SAL_CALL rtl_digest_update ( + rtlDigest Digest, + const void *pData, sal_uInt32 nDatLen); + +rtlDigestError SAL_CALL rtl_digest_get ( + rtlDigest Digest, + sal_uInt8 *pBuffer, sal_uInt32 nBufLen); + +/*======================================================================== + * + * rtl_digest_MD2 interface. + * + * Reference: + * RFC 1319 - The MD2 Message-Digest Algorithm (Informational) + * + *======================================================================*/ +#define RTL_DIGEST_LENGTH_MD2 16 + +rtlDigest SAL_CALL rtl_digest_createMD2 (void); +void SAL_CALL rtl_digest_destroyMD2 (rtlDigest Digest); + +rtlDigestError SAL_CALL rtl_digest_updateMD2 ( + rtlDigest Digest, + const void *pData, sal_uInt32 nDatLen); + +rtlDigestError SAL_CALL rtl_digest_getMD2 ( + rtlDigest Digest, + sal_uInt8 *pBuffer, sal_uInt32 nBufLen); + +rtlDigestError SAL_CALL rtl_digest_MD2 ( + const void *pData, sal_uInt32 nDatLen, + sal_uInt8 *pBuffer, sal_uInt32 nBufLen); + +/*======================================================================== + * + * rtl_digest_MD5 interface. + * + * Reference: + * RFC 1321 - The MD5 Message-Digest Algorithm (Informational) + * + *======================================================================*/ +#define RTL_DIGEST_LENGTH_MD5 16 + +rtlDigest SAL_CALL rtl_digest_createMD5 (void); +void SAL_CALL rtl_digest_destroyMD5 (rtlDigest Digest); + +rtlDigestError SAL_CALL rtl_digest_updateMD5 ( + rtlDigest Digest, + const void *pData, sal_uInt32 nDatLen); + +rtlDigestError SAL_CALL rtl_digest_getMD5 ( + rtlDigest Digest, + sal_uInt8 *pBuffer, sal_uInt32 nBufLen); + +rtlDigestError SAL_CALL rtl_digest_MD5 ( + const void *pData, sal_uInt32 nDatLen, + sal_uInt8 *pBuffer, sal_uInt32 nBufLen); + +/*======================================================================== + * + * rtl_digest_SHA interface. + * + * Reference: + * FIPS PUB 180 - Secure Hash Standard (Superseded by FIPS PUB 180-1) + * + *======================================================================*/ +#define RTL_DIGEST_LENGTH_SHA 20 + +rtlDigest SAL_CALL rtl_digest_createSHA (void); +void SAL_CALL rtl_digest_destroySHA (rtlDigest Digest); + +rtlDigestError SAL_CALL rtl_digest_updateSHA ( + rtlDigest Digest, + const void *pData, sal_uInt32 nDatLen); + +rtlDigestError SAL_CALL rtl_digest_getSHA ( + rtlDigest Digest, + sal_uInt8 *pBuffer, sal_uInt32 nBufLen); + +rtlDigestError SAL_CALL rtl_digest_SHA ( + const void *pData, sal_uInt32 nDatLen, + sal_uInt8 *pBuffer, sal_uInt32 nBufLen); + +/*======================================================================== + * + * rtl_digest_SHA1 interface. + * + * Reference: + * FIPS PUB 180-1 - Secure Hash Standard (Supersedes FIPS PUB 180) + * + *======================================================================*/ +#define RTL_DIGEST_LENGTH_SHA1 20 + +rtlDigest SAL_CALL rtl_digest_createSHA1 (void); +void SAL_CALL rtl_digest_destroySHA1 (rtlDigest Digest); + +rtlDigestError SAL_CALL rtl_digest_updateSHA1 ( + rtlDigest Digest, + const void *pData, sal_uInt32 nDatLen); + +rtlDigestError SAL_CALL rtl_digest_getSHA1 ( + rtlDigest Digest, + sal_uInt8 *pBuffer, sal_uInt32 nBufLen); + +rtlDigestError SAL_CALL rtl_digest_SHA1 ( + const void *pData, sal_uInt32 nDatLen, + sal_uInt8 *pBuffer, sal_uInt32 nBufLen); + +/*======================================================================== + * + * The End. + * + *======================================================================*/ + +#ifdef __cplusplus +} +#endif + +#endif /* _RTL_DIGEST_H_ */ + diff --git a/sal/inc/rtl/locale.h b/sal/inc/rtl/locale.h new file mode 100644 index 000000000000..58a9174e34e5 --- /dev/null +++ b/sal/inc/rtl/locale.h @@ -0,0 +1,182 @@ +/************************************************************************* + * + * $RCSfile: locale.h,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:17:14 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +#ifndef _RTL_LOCALE_H_ +#define _RTL_LOCALE_H_ + +#ifndef _RTL_USTRING_ +#ifdef __BORLANDC__ +#include +#else +#include +#endif /*__BORLANDC__*/ +#endif /*_RTL_USTRING_*/ + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef SAL_W32 +# pragma pack(push, 8) +#elif defined(SAL_OS2) +# pragma pack(1) +#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 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; + +#ifdef SAL_W32 +# pragma pack(pop) +#elif defined(SAL_OS2) +# pragma pack() +#endif + +/** + * Register a locale from language, country and variant. + * @param language lowercase two-letter ISO-639 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.) + *

More advanced programs will allow users to use different locales + * for different fields, e.g. in a spreadsheet. + *
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. setDefault does not reset the host locale. + * @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. + */ +void SAL_CALL rtl_locale_setDefault( const sal_Unicode * language, const sal_Unicode * country, const sal_Unicode * variant ); + +/** + * Getter for programmatic name of field, + * an lowercased two-letter ISO-639 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..4ee31db7e71c --- /dev/null +++ b/sal/inc/rtl/locale.hxx @@ -0,0 +1,316 @@ +/************************************************************************* + * + * $RCSfile: locale.hxx,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:17:14 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +#ifndef _RTL_LOCALE_HXX_ +#define _RTL_LOCALE_HXX_ + +#ifndef _RTL_LOCALE_H_ +#include +#endif +#ifndef _RTL_USTRING_HXX_ +#include +#endif + +#ifdef __cplusplus + +#ifdef _USE_NAMESPACE +namespace rtl +{ +#endif + +/** + * + * A OLocale object represents a specific geographical, political, + * or cultural region. An operation that requires a OLocale to perform + * its task is called locale-sensitive and uses the OLocale + * 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. + * + *

+ * You create a OLocale object using one of the two constructors in + * this class: + *

+ *
+ * OLocale(String language, String country)
+ * OLocale(String language, String country, String variant)
+ * 
+ *
+ * The first argument to both constructors is a valid ISO + * Language Code. 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: + *
+ * http://www.ics.uci.edu/pub/ietf/http/related/iso639.txt + * + *

+ * The second argument to both constructors is a valid ISO Country + * Code. 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: + *
+ * http://www.chemie.fu-berlin.de/diverse/doc/ISO_3166.html + * + *

+ * The second constructor requires a third argument--the Variant. + * 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". + * + *

+ * Because a OLocale object is just an identifier for a region, + * no validity check is performed when you construct a OLocale. + * If you want to see whether particular resources are available for the + * OLocale you construct, you must query those resources. For + * example, ask the NumberFormat for the locales it supports + * using its getAvailableLocales method. + *
Note: 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 + * ResourceBundle. + * + *

+ * The OLocale class provides a number of convenient constants + * that you can use to create OLocale objects for commonly used + * locales. For example, the following creates a OLocale object + * for the United States: + *

+ *
+ * OLocale.US
+ * 
+ *
+ * + *

+ * Once you've created a OLocale you can query it for information about + * itself. Use getCountry to get the ISO Country Code and + * getLanguage to get the ISO Language Code. You can + * use getDisplayCountry to get the + * name of the country suitable for displaying to the user. Similarly, + * you can use getDisplayLanguage to get the name of + * the language suitable for displaying to the user. Interestingly, + * the getDisplayXXX 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. + * + *

+ * The JDK provides a number of classes that perform locale-sensitive + * operations. For example, the NumberFormat class formats + * numbers, currency, or percentages in a locale-sensitive manner. Classes + * such as NumberFormat have a number of convenience methods + * for creating a default object of that type. For example, the + * NumberFormat class provides these three convenience methods + * for creating a default NumberFormat object: + *

+ *
+ * NumberFormat.getInstance()
+ * NumberFormat.getCurrencyInstance()
+ * NumberFormat.getPercentInstance()
+ * 
+ *
+ * These methods have two variants; one with an explicit locale + * and one without; the latter using the default locale. + *
+ *
+ * NumberFormat.getInstance(myLocale)
+ * NumberFormat.getCurrencyInstance(myLocale)
+ * NumberFormat.getPercentInstance(myLocale)
+ * 
+ *
+ * A OLocale is the mechanism for identifying the kind of object + * (NumberFormat) that you would like to get. The locale is + * just a mechanism for identifying objects, + * not a container for the objects themselves. + * + *

+ * 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: + *

+ *
+ * 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.
+ * 
+ *
+ * + * @see ResourceBundle + * @see java.text.Format + * @see java.text.NumberFormat + * @see java.text.Collation + * @version 1.21 29 Jan 1997 + * @author Mark Davis + */ +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; + } +*/ +}; + +#ifdef _USE_NAMESPACE +} +#endif + +#endif /* __cplusplus */ +#endif /* _RTL_LOCALE_HXX_ */ + + diff --git a/sal/inc/rtl/memory.h b/sal/inc/rtl/memory.h new file mode 100644 index 000000000000..99f822ac754e --- /dev/null +++ b/sal/inc/rtl/memory.h @@ -0,0 +1,87 @@ +/************************************************************************* + * + * $RCSfile: memory.h,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:17:14 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + + +#ifndef _RTL_MEMORY_H_ +#define _RTL_MEMORY_H_ + +#ifndef _SAL_TYPES_H_ +# include +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +void SAL_CALL rtl_zeroMemory(void *Ptr, sal_uInt32 Bytes); +void SAL_CALL rtl_fillMemory(void *Ptr, sal_uInt32 Bytes, sal_uInt8 Fill); +void SAL_CALL rtl_copyMemory(void *Dst, const void *Src, sal_uInt32 Bytes); +void SAL_CALL rtl_moveMemory(void *Dst, const void *Src, sal_uInt32 Bytes); +sal_Int32 SAL_CALL rtl_compareMemory(const void *MemA, const void *MemB, sal_uInt32 Bytes); +void* SAL_CALL rtl_findInMemory(const void *MemA, sal_uInt8 ch, sal_uInt32 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..a8672df810b7 --- /dev/null +++ b/sal/inc/rtl/process.h @@ -0,0 +1,89 @@ +/************************************************************************* + * + * $RCSfile: process.h,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:17:14 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ +#ifndef _RTL_PROCESS_H_ +#define _RTL_PROCESS_H_ + +#include + +#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 ( @see rtl_createUiid ). Thus the + * identifier is very likely to be different from identifiers created + * in other processes. + * + * @param pTargetUUID 16 byte of memory + * + ******/ +void SAL_CALL rtl_getGlobalProcessId( sal_uInt8 *pTargetUUID ); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/sal/inc/rtl/random.h b/sal/inc/rtl/random.h new file mode 100644 index 000000000000..9d764b597af9 --- /dev/null +++ b/sal/inc/rtl/random.h @@ -0,0 +1,139 @@ +/************************************************************************* + * + * $RCSfile: random.h,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:17:14 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +#ifndef _RTL_RANDOM_H_ +#define _RTL_RANDOM_H_ "$Revision: 1.1.1.1 $" + +#ifndef _SAL_TYPES_H_ +#include +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/*======================================================================== + * + * rtlRandom interface. + * + *======================================================================*/ +/** rtlRandomPool. + */ +typedef void* rtlRandomPool; + +/** rtlRandomError. + */ +typedef enum +{ + 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 +} rtlRandomError; + +/** rtl_random_createPool. + * + * @return Pool + */ +rtlRandomPool SAL_CALL rtl_random_createPool (void); + +/** rtl_random_destroyPool. + * + * @param Pool [in] + */ +void SAL_CALL rtl_random_destroyPool ( + rtlRandomPool Pool); + +/** rtl_random_addBytes. + * + * @param Pool [in] + * @param pBuffer [in] + * @param nBufLen [in] + */ +rtlRandomError SAL_CALL rtl_random_addBytes ( + rtlRandomPool Pool, + const void *Buffer, + sal_uInt32 Bytes); + +/** rtl_random_getBytes. + * + * @param Pool [in] + * @param pBuffer [inout] + * @param nBufLen [in] + */ +rtlRandomError SAL_CALL rtl_random_getBytes ( + rtlRandomPool Pool, + void *Buffer, + sal_uInt32 Bytes); + +/*======================================================================== + * + * The End. + * + *======================================================================*/ + +#ifdef __cplusplus +} +#endif + +#endif /* _RTL_RANDOM_H_ */ + diff --git a/sal/inc/rtl/strbuf.h b/sal/inc/rtl/strbuf.h new file mode 100644 index 000000000000..0c64f6794211 --- /dev/null +++ b/sal/inc/rtl/strbuf.h @@ -0,0 +1,152 @@ +/************************************************************************* + * + * $RCSfile: strbuf.h,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:17:14 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +#ifndef _RTL_STRBUF_H_ +#define _RTL_STRBUF_H_ + +#ifndef _RTL_STRING_H_ +#include +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * Allocates a new String that contains characters from + * the character array argument. The count argument specifies + * the length of the array. The initial capacity of the string buffer is + * 16 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 String that contains the same sequence of + * characters as the string argument. The initial capacity is the larger of: + *
    + *
  • The bufferLen argument. + *
  • The length of the string argument. + *
+ * + * @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: + *
    + *
  • The minimumCapacity argument. + *
  • Twice the old capacity, plus 2. + *
+ * If the minimumCapacity 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 char 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 + * offset. 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..42b0307e8f15 --- /dev/null +++ b/sal/inc/rtl/strbuf.hxx @@ -0,0 +1,682 @@ +/************************************************************************* + * + * $RCSfile: strbuf.hxx,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:17:14 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +#ifndef _RTL_STRBUF_HXX_ +#define _RTL_STRBUF_HXX_ + +#ifndef _RTL_STRBUF_H_ +#include +#endif +#ifndef _RTL_STRING_HXX_ +#include +#endif + +#ifdef __cplusplus + +#ifdef _USE_NAMESPACE +namespace rtl +{ +#endif + +/** + * A string buffer implements a mutable sequence of characters. + *

+ * 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. + *

+ * String buffers are used by the compiler to implement the binary + * string concatenation operator +. For example, the code: + *

+ *     x = "a" + 4 + "c"
+ * 

+ * is compiled to the equivalent of: + *

+ *     x = new OStringBuffer().append("a").append(4).append("c")
+ *                           .toString()
+ * 

+ * The principal operations on a OStringBuffer are the + * append and insert 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 + * append method always adds these characters at the end + * of the buffer; the insert method adds the characters at + * a specified point. + *

+ * For example, if z refers to a string buffer object + * whose current contents are "start", then + * the method call z.append("le") would cause the string + * buffer to contain "startle", whereas + * z.insert(4, "le") would alter the string buffer to + * contain "starlet". + *

+ * 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 OStringBuffer. + */ + 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 length 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 16 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() ); + } + + /** + * Release the string own string data and notice and acquire the string data of value. + */ + OStringBuffer& operator = ( const OStringBuffer& value ) + { + rtl_string_assign( &pData, value.pData ); + 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() + { + 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() + { + return nCapacity; + } + + /** + * 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: + *

    + *
  • The minimumCapacity argument. + *
  • Twice the old capacity, plus 2. + *
+ * If the minimumCapacity argument is nonpositive, this + * method takes no action and simply returns. + * + * @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 newLength 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 + * newLength argument. + *

+ * If the newLength argument is greater than or equal + * to the current length, sufficient null characters + * ('\u0000') are appended to the string buffer so that + * length becomes the newLength argument. + *

+ * The newLength argument must be greater than or equal + * to 0. + * + * @param newLength the new length of the buffer. + */ + void setLength(sal_Int32 newLength) + { + 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 + * 0, the next at index 1, and so on, for + * array indexing. + *

+ * The index argument must be greater than or equal to + * 0, 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 ) + { + 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 ch. + *

+ * The offset argument must be greater than or equal to + * 0, 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) + { + pData->buffer[ index ] = ch; + return *this; + } + + /** + * Appends the string to this string buffer. + *

+ * The characters of the String 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 char 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 char array + * argument to this string buffer. + *

+ * Characters of the character array str are appended, + * in order, to the contents of this string buffer. The length of this + * string buffer increases by the value of len. + * + * @param str the characters to be appended. + * @param len the number of characters to append. + * @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 sal_Bool + * argument to the string buffer. + *

+ * The argument is converted to a string as if by the method + * String.valueOf, and the characters of that + * string are then appended to this string buffer. + * + * @param b a sal_Bool. + * @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 char + * argument to this string buffer. + *

+ * The argument is appended to the contents of this string buffer. + * The length of this string buffer increases by 1. + * + * @param ch a char. + * @return this string buffer. + */ + OStringBuffer & append(sal_Char c) + { + return append( &c, 1 ); + } + + /** + * Appends the string representation of the sal_Int32 + * argument to this string buffer. + *

+ * The argument is converted to a string as if by the method + * String.valueOf, and the characters of that + * string are then appended to this string buffer. + * + * @param i an sal_Int32. + * @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 long + * argument to this string buffer. + *

+ * The argument is converted to a string as if by the method + * String.valueOf, and the characters of that + * string are then appended to this string buffer. + * + * @param l a long. + * @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 float + * argument to this string buffer. + *

+ * The argument is converted to a string as if by the method + * String.valueOf, and the characters of that + * string are then appended to this string buffer. + * + * @param f a float. + * @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 double + * argument to this string buffer. + *

+ * The argument is converted to a string as if by the method + * String.valueOf, and the characters of that + * string are then appended to this string buffer. + * + * @param d a double. + * @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 String 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. + *

+ * The offset argument must be greater than or equal to + * 0, 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 char 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 + * offset. The length of this string buffer increases by + * the length of the argument. + * + * @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 char 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 + * offset. The length of this string buffer increases by + * the length of the argument. + * + * @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 sal_Bool + * argument into this string buffer. + *

+ * The second argument is converted to a string as if by the method + * String.valueOf, and the characters of that + * string are then inserted into this string buffer at the indicated + * offset. + *

+ * The offset argument must be greater than or equal to + * 0, and less than or equal to the length of this + * string buffer. + * + * @param offset the offset. + * @param b a sal_Bool. + * @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 char + * argument into this string buffer. + *

+ * The second argument is inserted into the contents of this string + * buffer at the position indicated by offset. The length + * of this string buffer increases by one. + *

+ * The offset argument must be greater than or equal to + * 0, and less than or equal to the length of this + * string buffer. + * + * @param offset the offset. + * @param ch a char. + * @return this string buffer. + */ + OStringBuffer & insert(sal_Int32 offset, sal_Char c) + { + return insert( offset, &c, 1 ); + } + + /** + * Inserts the string representation of the second sal_Int32 + * argument into this string buffer. + *

+ * The second argument is converted to a string as if by the method + * String.valueOf, and the characters of that + * string are then inserted into this string buffer at the indicated + * offset. + *

+ * The offset argument must be greater than or equal to + * 0, and less than or equal to the length of this + * string buffer. + * + * @param offset the offset. + * @param b an sal_Int32. + * @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 long + * argument into this string buffer. + *

+ * The second argument is converted to a string as if by the method + * String.valueOf, and the characters of that + * string are then inserted into this string buffer at the indicated + * offset. + *

+ * The offset argument must be greater than or equal to + * 0, and less than or equal to the length of this + * string buffer. + * + * @param offset the offset. + * @param b a long. + * @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 float + * argument into this string buffer. + *

+ * The second argument is converted to a string as if by the method + * String.valueOf, and the characters of that + * string are then inserted into this string buffer at the indicated + * offset. + *

+ * The offset argument must be greater than or equal to + * 0, and less than or equal to the length of this + * string buffer. + * + * @param offset the offset. + * @param b a float. + * @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 double + * argument into this string buffer. + *

+ * The second argument is converted to a string as if by the method + * String.valueOf, and the characters of that + * string are then inserted into this string buffer at the indicated + * offset. + *

+ * The offset argument must be greater than or equal to + * 0, and less than or equal to the length of this + * string buffer. + * + * @param offset the offset. + * @param b a double. + * @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; +}; + +#ifdef _USE_NAMESPACE +} +#endif + +#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..24343c908165 --- /dev/null +++ b/sal/inc/rtl/string.h @@ -0,0 +1,588 @@ +/************************************************************************* + * + * $RCSfile: string.h,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:17:14 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +#ifndef _RTL_STRING_H_ +#define _RTL_STRING_H_ + +#ifndef _SAL_TYPES_H_ +#include +#endif +#ifndef _RTL_TEXTCVT_H +#include +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * Returns the length of this string. + * The length is equal to the number of 8-bit + * characters in the string. + * + * @param str must be a NULL-terminated string. + * @return the length of the sequence of characters represented by this + * string. + */ +sal_Int32 SAL_CALL rtl_str_getLength( const sal_Char * str ); + +/** + * Compares first string to second string object. Both + * strings must be NULL-terminated. + * The result is true if and only if second string represents + * the same sequence of characters as the first string, where case is ignored. + *

+ * Two characters are considered the same, ignoring case, if at + * least one of the following is true: + *

    + *
  • The two characters are the same (as compared by the == + * operator). + *
  • Applying the method Character.toUppercase to each + * character produces the same result. + *
  • Applying the method Character.toLowercase to each + * character produces the same result. + *
+ *

+ * Two sequences of characters are the same, ignoring case, if the + * sequences have the same length and corresponding characters are + * the same, ignoring case. + * + * @param first the string to compared. + * @param second the string to compare first + * String against. + * @return true if the Strings are equal, + * ignoring case; false otherwise. + */ +sal_Bool SAL_CALL rtl_str_equalsIgnoreCase_WithLength( const sal_Char * first, sal_Int32 firstLen, const sal_Char * second, sal_Int32 secondLen ); +sal_Bool SAL_CALL rtl_str_equalsIgnoreCase( const sal_Char * first, const sal_Char * second ); + +/** + * Compares two strings lexicographically. Both + * strings must be NULL-terminated. + * The comparison is based on the ascii value of each character in + * the strings. + * + * @param first the String to be compared. + * @param second the String to compare first + * String against. + * @return the value 0 if the argument string is equal to + * this string; a value less than 0 if first string + * is lexicographically less than the second string; and a + * value greater than 0 if first string is + * lexicographically 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_Int32 SAL_CALL rtl_str_compare( const sal_Char * first, const sal_Char * Second ); + +/** + * rtl_str_compareIgnoreCase() and rtl_str_compareIgnoreCase_WithLength() + * functions are caseinsensitive versions of rtl_str_compare() and + * rtl_str_compare_WithLength() respectively, described above. They assume + * the ASCII characterset and ignore differences in case when comparing + * lower and upper case characters. rtl_str_compareIgnoreCase_WithLength() + * does not compare more than len characters. Both strings have to be NULL + * terminated + * + * @param first the String to be compared. + * @param second the String to compare first + * String against. + * @return the value 0 if the argument string is equal to + * this string; a value less than 0 if a all lowercase + * version of first string is lexicographically less than a all + * lowercase version of the second string; and a + * value greater than 0 if first string is + * lexicographically greater than the second string, again both + * strings all lowercase. + */ +sal_Int32 SAL_CALL +rtl_str_compareIgnoreCase_WithLength( + const sal_Char *first, const sal_Char *second, sal_Int32 len ); +sal_Int32 SAL_CALL +rtl_str_compareIgnoreCase( const sal_Char *first, const sal_Char *second ); + +/** + * Returns a hashcode for the string. + * + * @param str a NULL-terminated string. + * @return a hash code value for str. + */ +sal_Int32 SAL_CALL rtl_str_hashCode_WithLength( const sal_Char * str, sal_Int32 len ); +sal_Int32 SAL_CALL rtl_str_hashCode( const sal_Char * str ); + +/** + * Returns the index within the string of the first occurrence of the + * specified character. + * + * @param str a NULL-terminated string. + * @param ch a character. + * @return the index of the first occurrence of the character in the + * character sequence represented by 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_Int32 SAL_CALL rtl_str_indexOfChar( const sal_Char * str, sal_Char ch ); + +/** + * Returns the index within the string of the last occurrence of the + * specified character, searching backward starting at the specified index. + * + * @param str a NULL-terminated string. + * @param ch a character. + * @return the index of the last occurrence of the character in the + * character sequence represented by the string, or + * -1 if the character does not occur. + */ +sal_Int32 SAL_CALL rtl_str_lastIndexOfChar_WithLength( const sal_Char * str, sal_Int32 len, sal_Char ch ); +sal_Int32 SAL_CALL rtl_str_lastIndexOfChar( const sal_Char * str, sal_Char ch ); + +/** + * Returns the index within the string of the first occurrence of the + * specified substring. + * + * @param str a NULL-terminated string. + * @param subStr a NULL-terminated substring to be searched for. + * @return if the string argument occurs as a substring within the + * string, then the index of the first character of the first + * such substring is returned; if it does not occur as a + * substring, -1 is returned. + */ +sal_Int32 SAL_CALL rtl_str_indexOfStr_WithLength( const sal_Char * str, sal_Int32 len, const sal_Char * subStr, sal_Int32 subLen ); +sal_Int32 SAL_CALL rtl_str_indexOfStr( const sal_Char * str, const sal_Char * subStr ); + +/** + * Returns the index within this string of the last occurrence of + * the specified substring. + * The returned index indicates the start of the substring, and it + * must be equal to or less than fromIndex. + * + * @param str a NULL-terminated string. + * @param subStr a NULL-terminated substring to be searched for. + * @return If the string argument occurs one or more times as a substring + * within the 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 SAL_CALL rtl_str_lastIndexOfStr_WithLength( const sal_Char * str, sal_Int32 len, const sal_Char * subStr, sal_Int32 subLen ); +sal_Int32 SAL_CALL rtl_str_lastIndexOfStr( const sal_Char * ggstr, const sal_Char * subStr ); + +/** + * Replaces all occurrences of oldChar in the string with + * newChar. + *

+ * If the character oldChar does not occur in the + * character sequence represented by this object, then the string is + *not modified. + * + * @param str a NULL-terminated 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); +void SAL_CALL rtl_str_replaceChar( sal_Char * str, sal_Char oldChar, sal_Char newChar); + +/** + * Converts all of the characters in the string to lower case. + * @param str a NULL-terminated string. + */ +void SAL_CALL rtl_str_toAsciiLowerCase_WithLength( sal_Char * str, sal_Int32 len ); +void SAL_CALL rtl_str_toAsciiLowerCase( sal_Char * str ); + +/** + * Converts all of the characters in the string to upper case. + * + * @param str a NULL-terminated string. + */ +void SAL_CALL rtl_str_toAsciiUpperCase_WithLength(sal_Char * str, sal_Int32 len); +void SAL_CALL rtl_str_toAsciiUpperCase(sal_Char * str); + +/** + * Removes white space from both ends of the string. + *

+ * All characters that have codes less than or equal to + * '\u0020' (the space character) are considered to be + * white space. + * + * @param str a NULL-terminated string. + * @return new length of the string. + */ +sal_Int32 SAL_CALL rtl_str_trim_WithLength( sal_Char * str, sal_Int32 len ); +sal_Int32 SAL_CALL rtl_str_trim( sal_Char * str ); + +/** + * Returns the string representation of the sal_Bool argument. + * + * @param str a newly allocated string with the length RTL_STR_MAX_VALUEOFBOOLEAN. + * @param b a sal_Bool. + * @return if the argument is true, a string equal to + * "true" is returned; otherwise, a string equal to + * "false" is returned. + */ +#define RTL_STR_MAX_VALUEOFBOOLEAN 6 +sal_Int32 SAL_CALL rtl_str_valueOfBoolean( sal_Char * str, sal_Bool b ); + +/** + * Returns the string representation of the char argument. + * + * @param str a newly allocated string with the length RTL_STR_MAX_VALUEOFCHAR. + * @param ch a char. + * @return a newly allocated string of length 1 containing + * as its single character the argument ch. + */ +#define RTL_STR_MAX_VALUEOFCHAR 2 +sal_Int32 SAL_CALL rtl_str_valueOfChar( sal_Char * str, sal_Char ch ); + +/** + * Returns the string representation of the int argument. + *

+ * The representation is exactly the one returned by the + * Integer.toString method of one argument. + * + * @param str a newly allocated string with the length RTL_STR_MAX_VALUEOFINT32. + * @param i an sal_Int32. + * @return a newly allocated string containing a string representation of + * the int argument. + * @see java.lang.Integer#toString(int, int) + */ +#define RTL_STR_MIN_RADIX 2 +#define RTL_STR_MAX_RADIX 36 +#define RTL_STR_MAX_VALUEOFINT32 33 +sal_Int32 SAL_CALL rtl_str_valueOfInt32(sal_Char * str, sal_Int32 i, sal_Int16 radix ); + +/** + * Returns the string representation of the long argument. + *

+ * The representation is exactly the one returned by the + * Long.toString method of one argument. + * + * @param str a newly allocated string with the length RTL_STR_MAX_VALUEOFINT64. + * @param l a sal_Int64. + * @return a newly allocated string containing a string representation of + * the long argument. + * @see java.lang.Long#toString(long) + */ +#define RTL_STR_MAX_VALUEOFINT64 65 +sal_Int32 SAL_CALL rtl_str_valueOfInt64(sal_Char * str, sal_Int64 l, sal_Int16 radix ); + +/** + * Returns the string representation of the float argument. + *

+ * The representation is exactly the one returned by the + * Float.toString method of one argument. + * + * @param f a float. + * @return a newly allocated string containing a string representation of + * the float argument. + * @see java.lang.Float#toString(float) + */ +#define RTL_STR_MAX_VALUEOFFLOAT 1 /*???*/ +sal_Int32 SAL_CALL rtl_str_valueOfFloat(sal_Char * str, float f); + +/** + * Returns the string representation of the double argument. + *

+ * The representation is exactly the one returned by the + * Double.toString method of one argument. + * + * @param d a double. + * @return a newly allocated string containing a string representation of + * the double argument. + * @see java.lang.Double#toString(double) + */ +#define RTL_STR_MAX_VALUEOFDOUBLE 1/*???*/ +sal_Int32 SAL_CALL rtl_str_valueOfDouble(sal_Char * str, double d); + + +/*######################################################################*/ + + +/** + * A string with this reference count is static und must not deleted. + * It is also not allowed to modifiy the reference count. + */ +#define RTL_STATIC_ASCIISTRING_REF ((sal_Int32)0x80000000) + +#ifdef SAL_W32 +# pragma pack(push, 8) +#elif defined(SAL_OS2) +# pragma pack(1) +#endif + +/** + * The implementation structure of a ascii string. + */ +typedef struct _rtl_String +{ + sal_Int32 refCount; + sal_Int32 length; + sal_Char buffer[1]; +} rtl_String; + +#ifdef SAL_W32 +# pragma pack(pop) +#elif defined(SAL_OS2) +# pragma pack() +#endif + +/** + * Increment the reference count of the string. + */ +void SAL_CALL rtl_string_acquire( rtl_String * value ); + +/** + * Decrement the reference count of the string. If the count goes to zero than the string is + * deleted. + */ +void SAL_CALL rtl_string_release( rtl_String * value ); + +/** + * Allocates a new string containing no characters. + * Use the macro RTL_NEWDEFAULTSTRING() which optimize platform dependend + * the access to the default string. + */ +void SAL_CALL rtl_string_new( rtl_String ** newStr); +#define RTL_STRING_NEW(newStr) rtl_string_new(newStr) + +/** + * Allocates a new string containing nLen characters. + * The values of the characters are '\0' defined. + */ +void SAL_CALL rtl_string_new_WithLength( rtl_String ** newStr, sal_Int32 nLen ); + +/** + * Allocates a new string that contains the same sequence of + * characters as the string argument.
+ * + * @param value a string. + * @return the new string. The reference count is 1. + */ +void SAL_CALL rtl_string_newFromString( rtl_String ** newStr, rtl_String * value); + +/** + * Allocates a new string so that it represents the + * sequence of characters currently contained in the character array + * argument. + * + * @param value the initial value of the string. + * @return the new string. The reference count is 1. + */ +void SAL_CALL rtl_string_newFromStr( rtl_String ** newStr, const sal_Char * value ); + +/** + * Allocates a new String that contains characters from + * the character array argument. + * + * @param value array that is the source of characters. + * @param len the length of the array. + * @return the new string. The reference count is 1. + */ +void SAL_CALL rtl_string_newFromStr_WithLength(rtl_String ** newStr, + const sal_Char * value, + sal_Int32 Len); + +/** + * Assign rightValue to *str. Release *str and aquire rightValue! + */ +void SAL_CALL rtl_string_assign( rtl_String ** str, rtl_String * rightValue ); + +/** + * Returns the length of this string. + * The length is equal to the number of 16-bit + * Unicode characters in the string. + * + * @return the length of the sequence of characters represented by the + * string. + */ +sal_Int32 SAL_CALL rtl_string_getLength( rtl_String * str ); + +/** + * Return the pointer to the sal_Char array of the string. + * + * @return a null terminated sal_Char *. + */ +sal_Char * SAL_CALL rtl_string_getStr( rtl_String * str ); + +/** + * Concatenates the right string to the end of the left string. Left and + * right must be NULL-terminated strings. + *

+ * + * @return a string that represents the concatenation of the strings. + */ +void SAL_CALL rtl_string_newConcat( rtl_String ** newStr, rtl_String * left, rtl_String * right ); + +/** + * 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 the string, then the string is + * returned. + * + * @param oldChar the old character. + * @param newChar the new character. + * @return the new string. The reference count is 1. + */ +void SAL_CALL rtl_string_newReplace( rtl_String ** newStr, + rtl_String * str, + sal_Char oldChar, + sal_Char newChar); + +/** + * Returns a new string resulting from replacing n = count characters + * from position index in this string with newStr. + *

+ * + * @param index the index for beginning. + * @param count the count of charcters that will replaced + * @param newStr the new substring. + * @return the new string. The reference count is 1. + */ +void SAL_CALL rtl_string_newReplaceStrAt( rtl_String ** newStr, + rtl_String * str, + sal_Int32 index, + sal_Int32 count, + rtl_String * newSub); + +/** + * Converts all of the characters in this String to lower + * case using the rules of the given locale. + * @param locale use the case transformation rules for this locale + * @return the String, converted to lowercase. + * @return the new string. The reference count is 1. + */ +void SAL_CALL rtl_string_newToLowerCase( rtl_String ** newStr, rtl_String * str); + +/** + * Converts all of the characters in this String to upper + * case using the rules of the given locale. + * @param locale use the case transformation rules for this locale + * @return the String, converted to uppercase. + * @return the new string. The reference count is 1. + */ +void SAL_CALL rtl_string_newToUpperCase( rtl_String ** newStr, rtl_String * str); + +/** + * Removes white space from both ends of the string. + *

+ * All characters that have codes less than or equal to + * '\u0020' (the space character) are considered to be + * white space. + * + * @return this string, with white space removed from the front and end. + * @return the new string. The reference count is 1. + */ +void SAL_CALL rtl_string_newTrim( rtl_String ** newStr, rtl_String * str ); + +/** + * Returns the number of tokens in this String seperated + * by cTok. + * + * @param cTok the character which seperate the tokens + * @return the number of tokens. + */ +sal_Int32 SAL_CALL rtl_string_getTokenCount( rtl_String * str , sal_Char cTok); + +/** + * Returns a new string for the token specified by nToken. If nToken < 0 or + * nToken > tokenCount then an empty string is returned. + * + * @param nToken the number of the token to return. + * @param cTok the character which seperate the tokens + * @param newStr the new string for the token + * @return the new string. The reference count is 1. + */ +void SAL_CALL rtl_string_getToken( rtl_String ** newStr , rtl_String * str, sal_Int32 nToken, sal_Char cTok); + +/* predefined constants used in headers wstring, wstring.hxx, string.hxx */ +#define OSTRING_TO_OUSTRING_CVTFLAGS (RTL_TEXTTOUNICODE_FLAGS_UNDEFINED_MAPTOPRIVATE |\ + RTL_TEXTTOUNICODE_FLAGS_MBUNDEFINED_DEFAULT |\ + RTL_TEXTTOUNICODE_FLAGS_INVALID_DEFAULT) +/* For SOffice 5.2, because we have problems, when the string get a diffrent length */ +#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) +/* For the future, when we use unicode +#define OUSTRING_TO_OSTRING_CVTFLAGS (RTL_UNICODETOTEXT_FLAGS_UNDEFINED_DEFAULT |\ + RTL_UNICODETOTEXT_FLAGS_INVALID_DEFAULT |\ + RTL_UNICODETOTEXT_FLAGS_UNDEFINED_REPLACE |\ + RTL_UNICODETOTEXT_FLAGS_UNDEFINED_REPLACESTR |\ + RTL_UNICODETOTEXT_FLAGS_PRIVATE_MAPTO0 |\ + RTL_UNICODETOTEXT_FLAGS_NONSPACING_IGNORE |\ + RTL_UNICODETOTEXT_FLAGS_CONTROL_IGNORE) +*/ + +/* constAsciiStr must be a "..." or char const aFoo[] = "..." */ +#ifndef RTL_CONSTASCII_STRINGPARAM +#define RTL_CONSTASCII_STRINGPARAM( constAsciiStr ) constAsciiStr, sizeof( constAsciiStr )-1 +#endif +#ifndef RTL_CONSTASCII_LENGTH +#define RTL_CONSTASCII_LENGTH( constAsciiStr ) (sizeof( constAsciiStr )-1) +#endif + +#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..53586cc2f311 --- /dev/null +++ b/sal/inc/rtl/string.hxx @@ -0,0 +1,827 @@ +/************************************************************************* + * + * $RCSfile: string.hxx,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:17:15 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +#ifndef _RTL_STRING_HXX_ +#define _RTL_STRING_HXX_ + +#ifndef _RTL_STRING_H_ +#include +#endif +#ifndef _RTL_USTRING_H_ +#include +#endif +#ifndef _RTL_MEMORY_H_ +#include +#endif +#ifndef _RTL_TEXTENC_H +#include +#endif +#ifndef _RTL_MACROS_HXX_ +#include +#endif + +#ifdef __cplusplus + +class ByteString; + +#ifdef _USE_NAMESPACE +namespace rtl +{ +#endif + +/** + * The OAsciiString class represents character strings. All + * string literals in Java programs, such as "abc", are + * implemented as instances of this class. + *

+ * Strings are constant; their values cannot be changed after they + * are created. OAsciiString buffers support mutable strings. + * Because OAsciiString objects are immutable they can be shared. For example: + *

+ *     OAsciiString str = "abc";
+ * 

+ * is equivalent to: + *

+ *     char data[] = {'a', 'b', 'c'};
+ *     OAsciiString str = new OAsciiString(data);
+ * 

+ * Here are some more examples of how strings can be used: + *

+ *     System.out.println("abc");
+ *     OAsciiString cde = "cde";
+ *     System.out.println("abc" + cde);
+ *     OAsciiString c = "abc".substring(2,3);
+ *     OAsciiString d = cde.substring(1, 2);
+ * 
+ *

+ * The class OAsciiString includes methods for examining + * individual characters of the sequence, for comparing strings, for + * searching strings, for extracting substrings, and for creating a + * copy of a string with all characters translated to uppercase or to + * lowercase. + */ +class OString +{ + class DO_NOT_ACQUIRE; + OString( rtl_String * value, DO_NOT_ACQUIRE * ) + : pData( value ) + { + } +public: + /** + * A pointer to the data structur which contains the data. + */ + rtl_String * pData; + + /** + * Allocates a new OString containing no characters. + */ + OString() + : pData(NULL) + { + RTL_STRING_NEW(&pData); + } + + /** + * Notice and acquire the string data of value. + * + * @param value a OString. + */ + OString( const OString & value ) + : pData( value.pData ) + { + rtl_string_acquire( pData ); + } + + /** + * Notice and acquire the string data of value. + * + * @param value a rtl_String. + */ + OString( rtl_String * value ) + : pData(value) + { + rtl_string_acquire( pData ); + } + + /** + * Allocates a new OString so that it represents the + * sequence of characters currently contained in the character array + * argument. + * + * @param value the initial value of the string. + */ + OString( const sal_Char * value) + : pData(NULL) + { + rtl_string_newFromStr( &pData, value ); + } + + /** + * Allocates a new OString that contains characters from + * a subarray of the character array argument. The offset + * argument is the index of the first character of the subarray and + * the count argument specifies the length of the + * subarray. + * + * @param value array that is the source of characters. + * @param offset the initial offset. + * @param count the length. + * @exception StringIndexOutOfBoundsException if the offset + * and count arguments index characters outside + * the bounds of the value array. + */ + OString( const sal_Char * value, sal_Int32 length ) + : pData(NULL) + { + rtl_string_newFromStr_WithLength( &pData, value, length ); + } + + /** + * Allocates a new OString that contains the first + * count characters of the Unicode character array argument. + * The Unicode string is converted to a 8 bit string using the + * encoding argument. + * + * @param value Unicode character array + * @param count the length. + * @param encoding TextEncoding used to convert the 8 bit string + * @exception StringIndexOutOfBoundsException count argument + * is bigger than the length of the 8 bit character string. + */ + OString( const sal_Unicode * value, sal_Int32 length, rtl_TextEncoding encoding ) + : pData(NULL) + { + RTL_STRING_NEW(&pData); + if( value ) + { + // for exception + //sal_Int32 len = rtl_ustr_getLength(value); + //if( len < length ) + // throw StringIndexOutOfBoundsException; + + if( length ) + rtl_uString2String( &pData, value, length, encoding, OUSTRING_TO_OSTRING_CVTFLAGS ); + } + } + + OString( const ByteString & value ); + + /** + * Release the string own string data and notice and acquire the string data of value. + */ + OString& operator = ( const OString& value ) + { + rtl_string_assign( &pData, value.pData ); + return *this; + } + + /** + * Release the string own string data and replace the string data with new string data + * containing the old string data concatenate with the sting data of value. + */ + OString operator+=( const OString& rStr ) + { + rtl_string_newConcat( &pData, pData, rStr.pData ); + return *this; + } + + /** + * Release the string data. + */ + ~OString() + { + rtl_string_release( pData ); + } + + /** + * Allocates a new string that contains the sequence of characters + * currently contained in the string buffer argument. + * + * @param buffer a StringBuffer. + */ + //public OString (StringBuffer buffer) { + + /** + * Returns the length of this string. + * The length is equal to the number of 16-bit + * Unicode characters in the string. + * + * @return the length of the sequence of characters represented by this + * object. + */ + sal_Int32 getLength() const { return pData->length; } + + /** + * Returns the character at the specified index. An index ranges + * from 0 to length() - 1. + * + * @param index the index of the character. + * @return the character at the specified index of this string. + * The first character is at index 0. + * @exception StringIndexOutOfBoundsException if the index is out of + * range. + */ + //sal_Char operator [] ( sal_Int32 nIndex ) const + // { return pData->buffer[nIndex]; } + + /** + * Return a null terminated character array. + */ + operator const sal_Char *() const { return pData->buffer; } + + /** + * Return a null terminated unicode character array. + */ + const sal_Char* getStr() const { return pData->buffer; } + + /** + * Compares this string to the specified object. + * The result is true if and only if the argument is not + * null and is a OString object that represents + * the same sequence of characters as this object. + * + * @param anObject the object to compare this OString + * against. + * @return true if the OString are equal; + * false otherwise. + * @see java.lang.OString#compareTo(java.lang.OString) + * @see java.lang.OString#equalsIgnoreCase(java.lang.OString) + */ + sal_Bool equals( const OString & rObj ) const + { + return getLength() == rObj.getLength() && compareTo( rObj ) == 0; + } + + /** + * Compares this OString to another object. + * The result is true if and only if the argument is not + * null and is a OString object that represents + * the same sequence of characters as this object, where case is ignored. + *

+ * Two characters are considered the same, ignoring case, if at + * least one of the following is true: + *

    + *
  • The two characters are the same (as compared by the == + * operator). + *
  • Applying the method Character.toUppercase to each + * character produces the same result. + *
  • Applying the method Character.toLowercase to each + * character produces the same result. + *
+ *

+ * Two sequences of characters are the same, ignoring case, if the + * sequences have the same length and corresponding characters are + * the same, ignoring case. + * + * @param anotherString the OString to compare this + * OString against. + * @return true if the OStrings are equal, + * ignoring case; false otherwise. + * @see java.lang.Character#toLowerCase(char) + * @see java.lang.Character#toUpperCase(char) + */ + sal_Bool equalsIgnoreCase( const OString & rObj ) const + { + return rtl_str_equalsIgnoreCase_WithLength( pData->buffer, pData->length, + rObj.pData->buffer, rObj.pData->length ); + } + + /** + * Compares two strings lexicographically. + * The comparison is based on the Unicode value of each character in + * the strings. + * + * @param anotherString the OString to be compared. + * @return the value 0 if the argument string is equal to + * this string; a value less than 0 if this string + * is lexicographically less than the string argument; and a + * value greater than 0 if this string is + * lexicographically greater than the string argument. + */ + sal_Int32 compareTo( const OString & rObj ) const + { + return rtl_str_compare_WithLength( pData->buffer, pData->length, + rObj.pData->buffer, rObj.pData->length ); + } + + /** + * Compares two strings lexicographically using only the number of + * characters given in the length parameter. + * The comparison is based on the Unicode value of each character in + * the strings. + * + * @param anotherString the OString to be compared. + * @param length the number of characters that are compared. + * @return 'This string' and 'argument string' here means the substring + * defined by the length parameter. + * the value 0 if the argument string is equal to + * this string; a value less than 0 if this string + * is lexicographically less than the string argument; and a + * value greater than 0 if this string is + * lexicographically greater than the string argument. + */ + sal_Int32 compareTo( const OString & rObj, sal_Int32 length ) const + { + return rtl_str_compare_WithLength( pData->buffer, length, + rObj.pData->buffer, rObj.pData->length ); + } + + friend sal_Bool operator == ( const OString& rStr1, const OString& rStr2 ) + { return rStr1.getLength() == rStr2.getLength() && rStr1.compareTo( rStr2 ) == 0; } + friend sal_Bool operator == ( const OString& rStr1, const sal_Char * pStr2 ) + { return rStr1.compareTo( pStr2 ) == 0; } + friend sal_Bool operator == ( const sal_Char * pStr1, const OString& rStr2 ) + { return OString( pStr1 ).compareTo( rStr2 ) == 0; } + + friend sal_Bool operator != ( const OString& rStr1, const OString& rStr2 ) + { return !(operator == ( rStr1, rStr2 )); } + friend sal_Bool operator != ( const OString& rStr1, const sal_Char * pStr2 ) + { return !(operator == ( rStr1, pStr2 )); } + friend sal_Bool operator != ( const sal_Char * pStr1, const OString& rStr2 ) + { return !(operator == ( pStr1, rStr2 )); } + + friend sal_Bool operator < ( const OString& rStr1, const OString& rStr2 ) + { return rStr1.compareTo( rStr2 ) < 0; } + friend sal_Bool operator > ( const OString& rStr1, const OString& rStr2 ) + { return rStr1.compareTo( rStr2 ) > 0; } + friend sal_Bool operator <= ( const OString& rStr1, const OString& rStr2 ) + { return rStr1.compareTo( rStr2 ) <= 0; } + friend sal_Bool operator >= ( const OString& rStr1, const OString& rStr2 ) + { return rStr1.compareTo( rStr2 ) >= 0; } + + /** + * Returns a hashcode for this string. + * + * @return a hash code value for this object. + */ + sal_Int32 hashCode() const + { + 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 a character. + * @param fromIndex the index to start the search from. + * @return the index of the first occurrence of the character in the + * character sequence represented by this object 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_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 first occurence of + * the specified substring. + * The returned index indicates the start of the substring, and it + * must be equal to or less than fromIndex. + * + * @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 object at a starting index no greater than + * fromIndex, then the index of the first character of + * the last such substring is returned. If it does not occur as a + * substring starting at fromIndex or earlier, + * -1 is returned. + */ + sal_Int32 indexOf( const OString & str, int fromIndex = 0) const + { + 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 character, searching backward starting at the end. + * + * @param ch a character. + * @param fromIndex the index to start the search from. + * @return the index of the last occurrence of the character in the + * character sequence represented by this object that is less + * than or equal to length -1, or -1 + * if the character does not occur before that point. + */ + sal_Int32 lastIndexOf( sal_Char ch, int fromIndex ) const + { + return rtl_str_lastIndexOfChar_WithLength( pData->buffer, fromIndex, ch ); + } + + /** + * Returns the index within this string of the last occurrence of the + * specified character, searching backward starting at the end. + * + * @param ch a character. + * @param fromIndex the index to start the search from. + * @return the index of the last occurrence of the character in the + * character sequence represented by this object that is less + * than or equal to length -1, or -1 + * if the character does not occur before that point. + */ + sal_Int32 lastIndexOf( sal_Char ch ) const + { + return rtl_str_lastIndexOfChar_WithLength( pData->buffer, pData->length, ch ); + } + + /** + * Returns the index within this string of the last occurrence of + * the specified substring. + * The returned index indicates the start of the substring, and it + * must be equal to or less than fromIndex. + * + * @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 object at a starting index no greater than + * fromIndex, then the index of the first character of + * the last such substring is returned. If it does not occur as a + * substring starting at fromIndex or earlier, + * -1 is returned. + */ + sal_Int32 lastIndexOf( const OString & str, int fromIndex ) const + { + return rtl_str_lastIndexOfStr_WithLength( pData->buffer, fromIndex, + str.pData->buffer, str.pData->length ); + } + + /** + * Returns the index within this string of the last occurrence of + * the specified substring. + * The returned index indicates the start of the substring, and it + * must be equal to or less than fromIndex. + * + * @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 object at a starting index no greater than + * fromIndex, then the index of the first character of + * the last such substring is returned. If it does not occur as a + * substring starting at fromIndex or earlier, + * -1 is returned. + */ + sal_Int32 lastIndexOf( const OString & str ) const + { + return rtl_str_lastIndexOfStr_WithLength( pData->buffer, pData->length, + str.pData->buffer, str.pData->length ); + } + + /** + * Returns a new string that is a substring of this string. The + * substring begins at the specified index and extends to the end of + * this string. + * + * @param beginIndex the beginning index, inclusive. + * @return the specified substring. + * @exception StringIndexOutOfBoundsException if the + * beginIndex is out of range. + */ + OString copy( sal_Int32 beginIndex) const + { + return copy( beginIndex, getLength() - beginIndex ); + } + + + /** + * Returns a new string that is a substring of this string. The + * substring begins at the specified beginIndex and + * extends to the character at index endIndex - 1. + * + * @param beginIndex the beginning index, inclusive. + * @param count the number of characters. + * @return the specified substring. + * @exception StringIndexOutOfBoundsException if the + * beginIndex or the endIndex is + * out of range. + */ + OString copy( sal_Int32 beginIndex, sal_Int32 count ) const + { + if( beginIndex == 0 && count == getLength() ) + return *this; + else + { + OString newStr; + rtl_string_newFromStr_WithLength( &newStr.pData, pData->buffer + beginIndex, count ); + return newStr; + } + } + + /** + * Concatenates the specified string to the end of this string. + *

+ * If the length of the argument string is 0, then this + * object is returned. + * + * @param str the OString that is concatenated to the end + * of this OString. + * @return a string that represents the concatenation of this object's + * characters followed by the string argument's characters. + */ + OString concat( const OString & str ) const + { + OString newStr; + rtl_string_newConcat( &newStr.pData, pData, str.pData ); + return newStr; + } + + friend OString operator+( const OString& rStr1, const OString& rStr2 ) + { + return rStr1.concat( rStr2 ); + } + + /** + * 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 this string is + * returned. + * + * @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 + { + rtl_String * pNew = 0; + rtl_string_newReplace( &pNew, pData, oldChar, newChar ); + return OString( pNew, (DO_NOT_ACQUIRE *)0 ); + } + + /** + * Returns a new string resulting from replacing n = count characters + * from position index in this string with newStr. + *

+ * + * @param index the index for beginning. + * @param count the count of charcters that will replaced + * @param newStr the new substring. + * @return the new string. The reference count is 1. + */ + OString replaceAt(sal_Int32 index, sal_Int32 count, const OString& newStr ) const + { + rtl_String * pNew = 0; + rtl_string_newReplaceStrAt( &pNew, pData, index, count, newStr.pData ); + return OString( pNew, (DO_NOT_ACQUIRE *)0 ); + } + + /** + * Converts this OString to lowercase. + *

+ * If no character in the string has a different lowercase version, + * based on calling the toLowerCase method defined by + * Character, then the original string is returned. + *

+ * Otherwise, a new string is allocated, whose length is identical + * to this string, and such that each character that has a different + * lowercase version is mapped to this lowercase equivalent. + * + * @return the string, converted to lowercase. + * @see java.lang.Character#toLowerCase(char) + * @see java.lang.OString#toUpperCase() + */ + OString toLowerCase() const + { + rtl_String * pNew = 0; + rtl_string_newToLowerCase( &pNew, pData ); + return OString( pNew, (DO_NOT_ACQUIRE *)0 ); + } + + /** + * Converts this string to uppercase. + *

+ * If no character in this string has a different uppercase version, + * based on calling the toUpperCase method defined by + * Character, then the original string is returned. + *

+ * Otherwise, a new string is allocated, whose length is identical + * to this string, and such that each character that has a different + * uppercase version is mapped to this uppercase equivalent. + * + * @return the string, converted to uppercase. + * @see java.lang.Character#toUpperCase(char) + * @see java.lang.OString#toLowerCase() + */ + OString toUpperCase() const + { + rtl_String * pNew = 0; + rtl_string_newToUpperCase( &pNew, pData ); + return OString( pNew, (DO_NOT_ACQUIRE *)0 ); + } + + /** + * Removes white space from both ends of this string. + *

+ * All characters that have codes less than or equal to + * '\u0020' (the space character) are considered to be + * white space. + * + * @return this string, with white space removed from the front and end. + */ + OString trim() const + { + rtl_String * pNew = 0; + rtl_string_newTrim( &pNew, pData ); + return OString( pNew, (DO_NOT_ACQUIRE *)0 ); + } + + /** + * Returns the string representation of the sal_Bool argument. + * + * @param b a sal_Bool. + * @return if the argument is true, a string equal to + * "true" is returned; otherwise, a string equal to + * "false" is returned. + */ + static OString valueOf(sal_Bool b) + { + sal_Char sz[RTL_STR_MAX_VALUEOFBOOLEAN]; + rtl_String * pNew = 0; + rtl_string_newFromStr_WithLength( &pNew, sz, rtl_str_valueOfBoolean( sz, b ) ); + return OString( pNew, (DO_NOT_ACQUIRE *)0 ); + } + + /** + * Returns the string representation of the char * argument. + * + * @param c a char. + * @return a newly allocated string of length 1 containing + * as its single character the argument c. + */ + static OString valueOf(sal_Char c) + { + return OString( &c, 1 ); + } + + /** + * Returns the string representation of the int argument. + *

+ * The representation is exactly the one returned by the + * Integer.toString method of one argument. + * + * @param i an int. + * @return a newly allocated string containing a string representation of + * the int argument. + * @see java.lang.Integer#toString(int, int) + */ + static OString valueOf(sal_Int32 i, sal_Int16 radix = 10 ) + { + sal_Char sz[RTL_STR_MAX_VALUEOFINT32]; + rtl_String * pNew = 0; + rtl_string_newFromStr_WithLength( &pNew, sz, rtl_str_valueOfInt32( sz, i, radix ) ); + return OString( pNew, (DO_NOT_ACQUIRE *)0 ); + } + + /** + * Returns the string representation of the long argument. + *

+ * The representation is exactly the one returned by the + * Long.toString method of one argument. + * + * @param l a long. + * @return a newly allocated string containing a string representation of + * the long argument. + * @see java.lang.Long#toString(long) + */ + static OString valueOf(sal_Int64 l, sal_Int16 radix = 10 ) + { + sal_Char sz[RTL_STR_MAX_VALUEOFINT64]; + rtl_String * pNew = 0; + rtl_string_newFromStr_WithLength( &pNew, sz, rtl_str_valueOfInt64( sz, l, radix ) ); + return OString( pNew, (DO_NOT_ACQUIRE *)0 ); + } + + /** + * Returns the string representation of the float argument. + *

+ * The representation is exactly the one returned by the + * Float.toString method of one argument. + * + * @param f a float. + * @return a newly allocated string containing a string representation of + * the float argument. + * @see java.lang.Float#toString(float) + */ + static OString valueOf(float f) + { + sal_Char sz[RTL_STR_MAX_VALUEOFFLOAT]; + rtl_String * pNew = 0; + rtl_string_newFromStr_WithLength( &pNew, sz, rtl_str_valueOfFloat( sz, f ) ); + return OString( pNew, (DO_NOT_ACQUIRE *)0 ); + } + + /** + * Returns the string representation of the double argument. + *

+ * The representation is exactly the one returned by the + * Double.toString method of one argument. + * + * @param d a double. + * @return a newly allocated string containing a string representation of + * the double argument. + * @see java.lang.Double#toString(double) + */ + static OString valueOf(double d) + { + sal_Char sz[RTL_STR_MAX_VALUEOFDOUBLE]; + rtl_String * pNew = 0; + rtl_string_newFromStr_WithLength( &pNew, sz, rtl_str_valueOfDouble( sz, d ) ); + return OString( pNew, (DO_NOT_ACQUIRE *)0 ); + } + + // UString compatibility deprecated + sal_Int32 len() const { return getLength(); } + + sal_Int32 search( sal_Char ch ) const { return indexOf( ch ); } + + sal_Int32 getTokenCount( sal_Char cTok = ';' ) const + { + return rtl_string_getTokenCount(pData, cTok ); + } + + OString getToken( sal_Int32 nToken, sal_Char cTok = ';' ) const + { + OString newStr; + rtl_string_getToken( &newStr.pData, pData, nToken, cTok ); + return newStr; + } + + sal_Int32 search( const OString& rStr, sal_Int32 nIndex = 0) const { return indexOf( rStr, nIndex ); } + sal_Int32 search( const sal_Char* pchar, sal_Int32 nIndex = 0) const { return indexOf( pchar, nIndex ); } +}; + +#ifdef _USE_NAMESPACE +} +#endif + +#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..d2ebe8680cf8 --- /dev/null +++ b/sal/inc/rtl/tencinfo.h @@ -0,0 +1,166 @@ +/************************************************************************* + * + * $RCSfile: tencinfo.h,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:17:15 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + + +#ifndef _RTL_TENCINFO_H +#define _RTL_TENCINFO_H + +#ifndef _SAL_TYPES_H +#include +#endif +#ifndef _RTL_TEXTENC_H +#include +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/* ----------- */ +/* - Scripts - */ +/* ----------- */ + +typedef sal_uInt16 rtl_Script; +#define SCRIPT_DONTKNOW ((rtl_Script)0) +#define SCRIPT_UNICODE ((rtl_Script)1) +#define SCRIPT_SYMBOL ((rtl_Script)2) +#define SCRIPT_LATIN ((rtl_Script)3) +#define SCRIPT_EASTEUROPE ((rtl_Script)4) +#define SCRIPT_CYRILLIC ((rtl_Script)5) +#define SCRIPT_BALTIC ((rtl_Script)6) +#define SCRIPT_TURKISH ((rtl_Script)7) +#define SCRIPT_GREEK ((rtl_Script)8) +#define SCRIPT_JAPANESE ((rtl_Script)9) +#define SCRIPT_CHINESE_SIMPLIFIED ((rtl_Script)10) +#define SCRIPT_CHINESE_TRADITIONAL ((rtl_Script)11) +#define SCRIPT_KOREAN ((rtl_Script)12) +#define SCRIPT_ARABIC ((rtl_Script)13) +#define SCRIPT_HEBREW ((rtl_Script)14) +#define SCRIPT_ARMENIAN ((rtl_Script)15) +#define SCRIPT_DEVANAGARI ((rtl_Script)16) +#define SCRIPT_BENGALI ((rtl_Script)17) +#define SCRIPT_GURMUKHI ((rtl_Script)18) +#define SCRIPT_GUJARATI ((rtl_Script)19) +#define SCRIPT_ORIYA ((rtl_Script)20) +#define SCRIPT_TAMIL ((rtl_Script)21) +#define SCRIPT_TELUGU ((rtl_Script)22) +#define SCRIPT_KANNADA ((rtl_Script)23) +#define SCRIPT_MALAYALAM ((rtl_Script)24) +#define SCRIPT_THAI ((rtl_Script)25) +#define SCRIPT_VIETNAMESE ((rtl_Script)26) +#define SCRIPT_LAO ((rtl_Script)27) +#define SCRIPT_GEORGIEN ((rtl_Script)28) + +/* ---------------------------- */ +/* - TextEncoding - InfoFlags - */ +/* ---------------------------- */ + +#define RTL_TEXTENCODING_INFO_CONTEXT ((sal_uInt32)0x0001) +#define RTL_TEXTENCODING_INFO_ASCII ((sal_uInt32)0x0002) +#define RTL_TEXTENCODING_INFO_UNICODE ((sal_uInt32)0x0004) +#define RTL_TEXTENCODING_INFO_MULTIBYTE ((sal_uInt32)0x0008) +#define RTL_TEXTENCODING_INFO_R2L ((sal_uInt32)0x0010) +#define RTL_TEXTENCODING_INFO_7BIT ((sal_uInt32)0x0020) +#define RTL_TEXTENCODING_INFO_SYMBOL ((sal_uInt32)0x0040) +#define RTL_TEXTENCODING_INFO_MIME ((sal_uInt32)0x0080) + +/* ----------------------- */ +/* - TextEncoding - Info - */ +/* ----------------------- */ + +typedef struct _rtl_TextEncodingInfo +{ + sal_uInt32 StructSize; + sal_uInt8 MinimumCharSize; + sal_uInt8 MaximumCharSize; + sal_uInt8 AverageCharSize; + sal_uInt8 Reserved; + sal_uInt32 Flags; + rtl_Script Script; +} rtl_TextEncodingInfo; + +sal_Bool SAL_CALL rtl_getTextEncodingInfo( rtl_TextEncoding eTextEncoding, rtl_TextEncodingInfo* pEncInfo ); + +/* -------------------------------------- */ +/* - Charset and TextEncoding - Convert - */ +/* -------------------------------------- */ + +rtl_TextEncoding SAL_CALL rtl_getTextEncodingFromWindowsCharset( sal_uInt8 nWinCharset ); +rtl_TextEncoding SAL_CALL rtl_getTextEncodingFromPCCodePage( sal_uInt32 nCodePage ); +rtl_TextEncoding SAL_CALL rtl_getTextEncodingFromMacTextEncoding( sal_uInt32 nMacTextEncoding ); +rtl_TextEncoding SAL_CALL rtl_getTextEncodingFromUnixCharset( const sal_Char* pUnixCharset ); +rtl_TextEncoding SAL_CALL rtl_getTextEncodingFromMimeCharset( const sal_Char* pMimeCharset ); + +/* Only for internal use. Because this functions are removed in future versions */ +sal_uInt8 SAL_CALL rtl_getBestWindowsCharsetFromTextEncoding( rtl_TextEncoding eTextEncoding ); +sal_uInt32 SAL_CALL rtl_getBestPCCodePageFromTextEncoding( rtl_TextEncoding eTextEncoding ); +sal_uInt32 SAL_CALL rtl_getBestMacTextEncodingFromTextEncoding( rtl_TextEncoding eTextEncoding ); +const sal_Char* SAL_CALL rtl_getBestUnixCharsetFromTextEncoding( rtl_TextEncoding eTextEncoding ); +const sal_Char* SAL_CALL rtl_getBestMimeCharsetFromTextEncoding( rtl_TextEncoding eTextEncoding ); + +#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..40e0ad79d18f --- /dev/null +++ b/sal/inc/rtl/textcvt.h @@ -0,0 +1,174 @@ +/************************************************************************* + * + * $RCSfile: textcvt.h,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:17:15 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +#ifndef _RTL_TEXTCVT_H +#define _RTL_TEXTCVT_H + +#ifndef _SAL_TYPES_H +#include +#endif +#ifndef _RTL_TEXTENC_H +#include +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/* ------------------------ */ +/* - convertTextToUnicode - */ +/* ------------------------ */ + +typedef void* rtl_TextToUnicodeConverter; +typedef void* rtl_TextToUnicodeContext; + +rtl_TextToUnicodeConverter SAL_CALL rtl_createTextToUnicodeConverter( rtl_TextEncoding eTextEncoding ); +void SAL_CALL rtl_destroyTextToUnicodeConverter( rtl_TextToUnicodeConverter hConverter ); +rtl_TextToUnicodeContext SAL_CALL rtl_createTextToUnicodeContext( rtl_TextToUnicodeConverter hConverter ); +void SAL_CALL rtl_destroyTextToUnicodeContext( rtl_TextToUnicodeConverter hConverter, rtl_TextToUnicodeContext hContext ); +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_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) + +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 ); + +/* ------------------------ */ +/* - convertUnicodeToText - */ +/* ------------------------ */ + +typedef void* rtl_UnicodeToTextConverter; +typedef void* rtl_UnicodeToTextContext; + +rtl_UnicodeToTextConverter SAL_CALL rtl_createUnicodeToTextConverter( rtl_TextEncoding eTextEncoding ); +void SAL_CALL rtl_destroyUnicodeToTextConverter( rtl_UnicodeToTextConverter hConverter ); +rtl_UnicodeToTextContext SAL_CALL rtl_createUnicodeToTextContext( rtl_UnicodeToTextConverter hConverter ); +void SAL_CALL rtl_destroyUnicodeToTextContext( rtl_UnicodeToTextConverter hConverter, rtl_UnicodeToTextContext hContext ); +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_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) + +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..3475ca16fda0 --- /dev/null +++ b/sal/inc/rtl/textenc.h @@ -0,0 +1,274 @@ +/************************************************************************* + * + * $RCSfile: textenc.h,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:17:15 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +#ifndef _RTL_TEXTENC_H +#define _RTL_TEXTENC_H + +#ifndef _SAL_TYPES_H +#include +#endif + +typedef sal_uInt16 rtl_TextEncoding; +#define RTL_TEXTENCODING_DONTKNOW ((rtl_TextEncoding)0) +#define RTL_TEXTENCODING_MS_1252 ((rtl_TextEncoding)1) +#define RTL_TEXTENCODING_APPLE_ROMAN ((rtl_TextEncoding)2) +#define RTL_TEXTENCODING_IBM_437 ((rtl_TextEncoding)3) +#define RTL_TEXTENCODING_IBM_850 ((rtl_TextEncoding)4) +#define RTL_TEXTENCODING_IBM_860 ((rtl_TextEncoding)5) +#define RTL_TEXTENCODING_IBM_861 ((rtl_TextEncoding)6) +#define RTL_TEXTENCODING_IBM_863 ((rtl_TextEncoding)7) +#define RTL_TEXTENCODING_IBM_865 ((rtl_TextEncoding)8) +/* Reserved: RTL_TEXTENCODING_SYSTEM ((rtl_TextEncoding)9) */ +#define RTL_TEXTENCODING_SYMBOL ((rtl_TextEncoding)10) +#define RTL_TEXTENCODING_ASCII_US ((rtl_TextEncoding)11) +#define RTL_TEXTENCODING_ISO_8859_1 ((rtl_TextEncoding)12) +#define RTL_TEXTENCODING_ISO_8859_2 ((rtl_TextEncoding)13) +#define RTL_TEXTENCODING_ISO_8859_3 ((rtl_TextEncoding)14) +#define RTL_TEXTENCODING_ISO_8859_4 ((rtl_TextEncoding)15) +#define RTL_TEXTENCODING_ISO_8859_5 ((rtl_TextEncoding)16) +#define RTL_TEXTENCODING_ISO_8859_6 ((rtl_TextEncoding)17) +#define RTL_TEXTENCODING_ISO_8859_7 ((rtl_TextEncoding)18) +#define RTL_TEXTENCODING_ISO_8859_8 ((rtl_TextEncoding)19) +#define RTL_TEXTENCODING_ISO_8859_9 ((rtl_TextEncoding)20) +#define RTL_TEXTENCODING_ISO_8859_14 ((rtl_TextEncoding)21) +#define RTL_TEXTENCODING_ISO_8859_15 ((rtl_TextEncoding)22) +#define RTL_TEXTENCODING_IBM_737 ((rtl_TextEncoding)23) +#define RTL_TEXTENCODING_IBM_775 ((rtl_TextEncoding)24) +#define RTL_TEXTENCODING_IBM_852 ((rtl_TextEncoding)25) +#define RTL_TEXTENCODING_IBM_855 ((rtl_TextEncoding)26) +#define RTL_TEXTENCODING_IBM_857 ((rtl_TextEncoding)27) +#define RTL_TEXTENCODING_IBM_862 ((rtl_TextEncoding)28) +#define RTL_TEXTENCODING_IBM_864 ((rtl_TextEncoding)29) +#define RTL_TEXTENCODING_IBM_866 ((rtl_TextEncoding)30) +#define RTL_TEXTENCODING_IBM_869 ((rtl_TextEncoding)31) +#define RTL_TEXTENCODING_MS_874 ((rtl_TextEncoding)32) +#define RTL_TEXTENCODING_MS_1250 ((rtl_TextEncoding)33) +#define RTL_TEXTENCODING_MS_1251 ((rtl_TextEncoding)34) +#define RTL_TEXTENCODING_MS_1253 ((rtl_TextEncoding)35) +#define RTL_TEXTENCODING_MS_1254 ((rtl_TextEncoding)36) +#define RTL_TEXTENCODING_MS_1255 ((rtl_TextEncoding)37) +#define RTL_TEXTENCODING_MS_1256 ((rtl_TextEncoding)38) +#define RTL_TEXTENCODING_MS_1257 ((rtl_TextEncoding)39) +#define RTL_TEXTENCODING_MS_1258 ((rtl_TextEncoding)40) +#define RTL_TEXTENCODING_APPLE_ARABIC ((rtl_TextEncoding)41) +#define RTL_TEXTENCODING_APPLE_CENTEURO ((rtl_TextEncoding)42) +#define RTL_TEXTENCODING_APPLE_CROATIAN ((rtl_TextEncoding)43) +#define RTL_TEXTENCODING_APPLE_CYRILLIC ((rtl_TextEncoding)44) +#define RTL_TEXTENCODING_APPLE_DEVANAGARI ((rtl_TextEncoding)45) +#define RTL_TEXTENCODING_APPLE_FARSI ((rtl_TextEncoding)46) +#define RTL_TEXTENCODING_APPLE_GREEK ((rtl_TextEncoding)47) +#define RTL_TEXTENCODING_APPLE_GUJARATI ((rtl_TextEncoding)48) +#define RTL_TEXTENCODING_APPLE_GURMUKHI ((rtl_TextEncoding)49) +#define RTL_TEXTENCODING_APPLE_HEBREW ((rtl_TextEncoding)50) +#define RTL_TEXTENCODING_APPLE_ICELAND ((rtl_TextEncoding)51) +#define RTL_TEXTENCODING_APPLE_ROMANIAN ((rtl_TextEncoding)52) +#define RTL_TEXTENCODING_APPLE_THAI ((rtl_TextEncoding)53) +#define RTL_TEXTENCODING_APPLE_TURKISH ((rtl_TextEncoding)54) +#define RTL_TEXTENCODING_APPLE_UKRAINIAN ((rtl_TextEncoding)55) +#define RTL_TEXTENCODING_APPLE_CHINSIMP ((rtl_TextEncoding)56) +#define RTL_TEXTENCODING_APPLE_CHINTRAD ((rtl_TextEncoding)57) +#define RTL_TEXTENCODING_APPLE_JAPANESE ((rtl_TextEncoding)58) +#define RTL_TEXTENCODING_APPLE_KOREAN ((rtl_TextEncoding)59) +#define RTL_TEXTENCODING_MS_932 ((rtl_TextEncoding)60) +#define RTL_TEXTENCODING_MS_936 ((rtl_TextEncoding)61) +#define RTL_TEXTENCODING_MS_949 ((rtl_TextEncoding)62) +#define RTL_TEXTENCODING_MS_950 ((rtl_TextEncoding)63) +#define RTL_TEXTENCODING_SHIFT_JIS ((rtl_TextEncoding)64) +#define RTL_TEXTENCODING_GB_2312 ((rtl_TextEncoding)65) +#define RTL_TEXTENCODING_GBT_12345 ((rtl_TextEncoding)66) +#define RTL_TEXTENCODING_GBK ((rtl_TextEncoding)67) +#define RTL_TEXTENCODING_BIG5 ((rtl_TextEncoding)68) +#define RTL_TEXTENCODING_EUC_JP ((rtl_TextEncoding)69) +#define RTL_TEXTENCODING_EUC_CN ((rtl_TextEncoding)70) +#define RTL_TEXTENCODING_EUC_TW ((rtl_TextEncoding)71) +#define RTL_TEXTENCODING_ISO_2022_JP ((rtl_TextEncoding)72) +#define RTL_TEXTENCODING_ISO_2022_CN ((rtl_TextEncoding)73) +#define RTL_TEXTENCODING_KOI8_R ((rtl_TextEncoding)74) +#define RTL_TEXTENCODING_UTF7 ((rtl_TextEncoding)75) +#define RTL_TEXTENCODING_UTF8 ((rtl_TextEncoding)76) +#define RTL_TEXTENCODING_ISO_8859_10 ((rtl_TextEncoding)77) +#define RTL_TEXTENCODING_ISO_8859_13 ((rtl_TextEncoding)78) +#define RTL_TEXTENCODING_EUC_KR ((rtl_TextEncoding)79) +#define RTL_TEXTENCODING_ISO_2022_KR ((rtl_TextEncoding)80) +#define RTL_TEXTENCODING_JIS_X_0201 ((rtl_TextEncoding)81) +#define RTL_TEXTENCODING_JIS_X_0208 ((rtl_TextEncoding)82) +#define RTL_TEXTENCODING_JIS_X_0212 ((rtl_TextEncoding)83) + +#define RTL_TEXTENCODING_STD_COUNT ((rtl_TextEncoding)84) + +#define RTL_TEXTENCODING_USER_START ((rtl_TextEncoding)0x8000) +#define RTL_TEXTENCODING_USER_END ((rtl_TextEncoding)0xEFFF) + +#define RTL_TEXTENCODING_UCS4 ((rtl_TextEncoding)0xFFFE) +#define RTL_TEXTENCODING_UCS2 ((rtl_TextEncoding)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 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 + +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 (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 + +Latin 3 (ISO-8859-3) RTL_TEXTENCODING_ISO_8859_3 + +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 + +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 + +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/ustrbuf.h b/sal/inc/rtl/ustrbuf.h new file mode 100644 index 000000000000..facc966410cc --- /dev/null +++ b/sal/inc/rtl/ustrbuf.h @@ -0,0 +1,176 @@ +/************************************************************************* + * + * $RCSfile: ustrbuf.h,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:17:15 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +#ifndef _RTL_USTRBUF_H_ +#define _RTL_USTRBUF_H_ + +#ifndef _RTL_USTRING_H_ +#include +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * Allocates a new String that contains characters from + * the character array argument. The count argument specifies + * the length of the array. The initial capacity of the string buffer is + * 16 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 String that contains the same sequence of + * characters as the string argument. The initial capacity is the larger of: + *

    + *
  • The bufferLen argument. + *
  • The length of the string argument. + *
+ * + * @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: + *
    + *
  • The minimumCapacity argument. + *
  • Twice the old capacity, plus 2. + *
+ * If the minimumCapacity 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 str 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 + * offset. 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 the 8-Bit ASCII string representation of the str + * 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. + *

+ * The characters of the array argument are inserted into the + * contents of this string buffer at the position indicated by + * offset. 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..6178ddf2e41d --- /dev/null +++ b/sal/inc/rtl/ustrbuf.hxx @@ -0,0 +1,736 @@ +/************************************************************************* + * + * $RCSfile: ustrbuf.hxx,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:17:14 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +#ifndef _RTL_USTRBUF_HXX_ +#define _RTL_USTRBUF_HXX_ + +#ifndef _OSL_DIAGNOSE_H_ +#include +#endif +#ifndef _RTL_USTRBUF_H_ +#include +#endif +#ifndef _RTL_USTRING_ +#ifdef __BORLANDC__ +#include +#else +#include +#endif /*__BORLANDC__*/ +#endif /*_RTL_USTRING_*/ + +#ifdef __cplusplus + +#ifdef _USE_NAMESPACE +namespace rtl +{ +#endif + +/** + * A string buffer implements a mutable sequence of characters. + *

+ * 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. + *

+ * String buffers are used by the compiler to implement the binary + * string concatenation operator +. For example, the code: + *

+ *     x = "a" + 4 + "c"
+ * 

+ * is compiled to the equivalent of: + *

+ *     x = new OUStringBuffer().append("a").append(4).append("c")
+ *                           .toString()
+ * 

+ * The principal operations on a OUStringBuffer are the + * append and insert 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 + * append method always adds these characters at the end + * of the buffer; the insert method adds the characters at + * a specified point. + *

+ * For example, if z refers to a string buffer object + * whose current contents are "start", then + * the method call z.append("le") would cause the string + * buffer to contain "startle", whereas + * z.insert(4, "le") would alter the string buffer to + * contain "starlet". + *

+ * 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 OStringBuffer. + */ + 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 length 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 16 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() ); + } + + /** + * Release the string own string data and notice and acquire the string data of value. + */ + OUStringBuffer& operator = ( const OUStringBuffer& value ) + { + rtl_uString_assign( &pData, value.pData ); + 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() + { + 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() + { + return nCapacity; + } + + /** + * 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: + *

    + *
  • The minimumCapacity argument. + *
  • Twice the old capacity, plus 2. + *
+ * If the minimumCapacity argument is nonpositive, this + * method takes no action and simply returns. + * + * @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 newLength 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 + * newLength argument. + *

+ * If the newLength argument is greater than or equal + * to the current length, sufficient null characters + * ('\u0000') are appended to the string buffer so that + * length becomes the newLength argument. + *

+ * The newLength argument must be greater than or equal + * to 0. + * + * @param newLength the new length of the buffer. + */ + void setLength(sal_Int32 newLength) + { + 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 + * 0, the next at index 1, and so on, for + * array indexing. + *

+ * The index argument must be greater than or equal to + * 0, 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 ) + { + 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 ch. + *

+ * The offset argument must be greater than or equal to + * 0, 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) + { + pData->buffer[ index ] = ch; + return *this; + } + + /** + * Appends the string to this string buffer. + *

+ * The characters of the String 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 char 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 char array + * argument to this string buffer. + *

+ * Characters of the character array str are appended, + * in order, to the contents of this string buffer. The length of this + * string buffer increases by the value of len. + * + * @param str the characters to be appended. + * @param len the number of characters to append. + * @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. + *

+ * 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. + *

+ * Characters of the character array str are appended, + * in order, to the contents of this string buffer. The length of this + * string buffer increases by the value of len. + * + * @param str the 8-Bit ASCII characters to be appended. + * @param len the number of characters to append. + * @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 sal_Bool + * argument to the string buffer. + *

+ * The argument is converted to a string as if by the method + * String.valueOf, and the characters of that + * string are then appended to this string buffer. + * + * @param b a sal_Bool. + * @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 char + * argument to this string buffer. + *

+ * The argument is appended to the contents of this string buffer. + * The length of this string buffer increases by 1. + * + * @param ch a char. + * @return this string buffer. + */ + OUStringBuffer & append(sal_Unicode c) + { + return append( &c, 1 ); + } + + /** + * Appends the string representation of the sal_Int32 + * argument to this string buffer. + *

+ * The argument is converted to a string as if by the method + * String.valueOf, and the characters of that + * string are then appended to this string buffer. + * + * @param i an sal_Int32. + * @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 long + * argument to this string buffer. + *

+ * The argument is converted to a string as if by the method + * String.valueOf, and the characters of that + * string are then appended to this string buffer. + * + * @param l a long. + * @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 float + * argument to this string buffer. + *

+ * The argument is converted to a string as if by the method + * String.valueOf, and the characters of that + * string are then appended to this string buffer. + * + * @param f a float. + * @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 double + * argument to this string buffer. + *

+ * The argument is converted to a string as if by the method + * String.valueOf, and the characters of that + * string are then appended to this string buffer. + * + * @param d a double. + * @return this string buffer. + */ + OUStringBuffer & append(double d) + { + sal_Unicode sz[RTL_USTR_MAX_VALUEOFDOUBLE]; + return append( sz, rtl_ustr_valueOfDouble( sz, d ) ); + } + + /** + * Inserts the string into this string buffer. + *

+ * The characters of the String 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. + *

+ * The offset argument must be greater than or equal to + * 0, 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 char 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 + * offset. The length of this string buffer increases by + * the length of the argument. + * + * @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 char 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 + * offset. The length of this string buffer increases by + * the length of the argument. + * + * @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 sal_Bool + * argument into this string buffer. + *

+ * The second argument is converted to a string as if by the method + * String.valueOf, and the characters of that + * string are then inserted into this string buffer at the indicated + * offset. + *

+ * The offset argument must be greater than or equal to + * 0, and less than or equal to the length of this + * string buffer. + * + * @param offset the offset. + * @param b a sal_Bool. + * @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 char + * argument into this string buffer. + *

+ * The second argument is inserted into the contents of this string + * buffer at the position indicated by offset. The length + * of this string buffer increases by one. + *

+ * The offset argument must be greater than or equal to + * 0, and less than or equal to the length of this + * string buffer. + * + * @param offset the offset. + * @param ch a char. + * @return this string buffer. + */ + OUStringBuffer & insert(sal_Int32 offset, sal_Unicode c) + { + return insert( offset, &c, 1 ); + } + + /** + * Inserts the string representation of the second sal_Int32 + * argument into this string buffer. + *

+ * The second argument is converted to a string as if by the method + * String.valueOf, and the characters of that + * string are then inserted into this string buffer at the indicated + * offset. + *

+ * The offset argument must be greater than or equal to + * 0, and less than or equal to the length of this + * string buffer. + * + * @param offset the offset. + * @param b an sal_Int32. + * @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 long + * argument into this string buffer. + *

+ * The second argument is converted to a string as if by the method + * String.valueOf, and the characters of that + * string are then inserted into this string buffer at the indicated + * offset. + *

+ * The offset argument must be greater than or equal to + * 0, and less than or equal to the length of this + * string buffer. + * + * @param offset the offset. + * @param b a long. + * @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 float + * argument into this string buffer. + *

+ * The second argument is converted to a string as if by the method + * String.valueOf, and the characters of that + * string are then inserted into this string buffer at the indicated + * offset. + *

+ * The offset argument must be greater than or equal to + * 0, and less than or equal to the length of this + * string buffer. + * + * @param offset the offset. + * @param b a float. + * @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 double + * argument into this string buffer. + *

+ * The second argument is converted to a string as if by the method + * String.valueOf, and the characters of that + * string are then inserted into this string buffer at the indicated + * offset. + *

+ * The offset argument must be greater than or equal to + * 0, and less than or equal to the length of this + * string buffer. + * + * @param offset the offset. + * @param b a double. + * @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 ) ); + } +private: + /** + * A pointer to the data structur which contains the data. + */ + rtl_uString * pData; + + /** + * The len of the pData->buffer. + */ + sal_Int32 nCapacity; +}; + +#ifdef _USE_NAMESPACE +} +#endif + +#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..952bb431a330 --- /dev/null +++ b/sal/inc/rtl/ustring.h @@ -0,0 +1,717 @@ +/************************************************************************* + * + * $RCSfile: ustring.h,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:17:15 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + + +#ifndef _RTL_USTRING_H_ +#define _RTL_USTRING_H_ + +#ifndef _SAL_TYPES_H_ +#include +#endif + +#ifndef _RTL_STRING_H_ +#include +#endif +#ifndef _RTL_TEXTENC_H +#include +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * Returns the length of this string. + * The length is equal to the number of 16-bit + * Unicode characters in the string. + * + * @param str must be a NULL-terminated string. + * @return the length of the sequence of characters represented by this + * string. + */ +sal_Int32 SAL_CALL rtl_ustr_getLength( const sal_Unicode * str ); + +/** + * Compares first string to second string object. Both + * strings must be NULL-terminated. + * The result is true if and only if second string represents + * the same sequence of characters as the first string, where case is ignored. + *

+ * Two characters are considered the same, ignoring case, if at + * least one of the following is true: + *

    + *
  • The two characters are the same (as compared by the == + * operator). + *
  • Applying the method Character.toUppercase to each + * character produces the same result. + *
  • Applying the method Character.toLowercase to each + * character produces the same result. + *
+ *

+ * Two sequences of characters are the same, ignoring case, if the + * sequences have the same length and corresponding characters are + * the same, ignoring case. + * + * @param first the string to compared. + * @param second the string to compare first + * String against. + * @return true if the Strings are equal, + * ignoring case; false otherwise. + */ +sal_Bool SAL_CALL rtl_ustr_equalsIgnoreCase_WithLength( const sal_Unicode * first, sal_Int32 firstLen, const sal_Unicode * second, sal_Int32 secondLen ); +sal_Bool SAL_CALL rtl_ustr_equalsIgnoreCase( const sal_Unicode * first, const sal_Unicode * second ); + +/** + * Compares two strings lexicographically. Both + * strings must be NULL-terminated. + * The comparison is based on the Unicode value of each character in + * the strings. + * + * @param first the String to be compared. + * @param second the String to compare first + * String against. + * @return the value 0 if the argument string is equal to + * this string; a value less than 0 if first string + * is lexicographically less than the second string; and a + * value greater than 0 if first string is + * lexicographically 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_Int32 SAL_CALL rtl_ustr_compare( const sal_Unicode * first, const sal_Unicode * second ); + +/** + * Compares two strings lexicographically. Both + * strings must be NULL-terminated. + * The comparison is based on the Unicode value of each character in + * the strings. + * + * @param first the String to be compared. + * @param second the String to compare first + * String against. + * @param shortenedLength the number of characters which should be compared. + * This length can be longer, shorter or equal than the both other strings. + * + * @return the value 0 if the argument string is equal to + * this string; a value less than 0 if first string + * is lexicographically less than the second string; and a + * value greater than 0 if first string is + * lexicographically greater than the second string. + */ +sal_Int32 SAL_CALL rtl_ustr_shortenedCompare_WithLength( const sal_Unicode * first, sal_Int32 firstLen, + const sal_Unicode * second, sal_Int32 secondLen, sal_Int32 shortenedLength ); + +/** + * Compares lexicographically a 16-Bit Unicode character string directly + * with a 8-Bit ASCII character string. 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. strings must be NULL-terminated. + * + * @param first the String to be compared. + * @param second the String to compare first + * String against. + * + * @return the value 0 if the argument string is equal to + * this string; a value less than 0 if first string + * is lexicographically less than the second string; and a + * value greater than 0 if first string is + * lexicographically greater than the second string. + */ +sal_Int32 SAL_CALL rtl_ustr_ascii_compare_WithLength( const sal_Unicode * first, sal_Int32 firstLen, + const sal_Char * second ); +sal_Int32 SAL_CALL rtl_ustr_ascii_compare( const sal_Unicode * first, const sal_Char * second ); + +/** + * Compares the string reverse lexicographically with a 8-Bit ASCII + * character string. The secondLength parameter is the length of + * the ASCII string and not the number of characters which should be + * compared. The reverse comparison is based on the + * numerical values of each Unicode/ASCII character in the + * strings with a 8-Bit ASCII character string. Since this + * method is optimized for performance. the ASCII character + * values are not converted in any way. The caller has to + * ensure that all ASCII characters are in the allowed + * range between 0 and 127. + * The ASCII string must be NULL-terminated. + * + * @param first the String to be compared. + * @param second the String to compare first + * String against. + * @param secondLength the + * + * @return the value 0 if the argument string is equal to + * this string; a value less than 0 if first string + * is lexicographically less than the second string; and a + * value greater than 0 if first string is + * lexicographically greater than the second string. + * The compare order is from the last character to the + * first one. + */ +sal_Int32 SAL_CALL rtl_ustr_asciil_reverseCompare_WithLength( const sal_Unicode * first, sal_Int32 firstLen, + const sal_Char * second, sal_Int32 secondLength ); + +/** + * Compares lexicographically a 16-Bit Unicode character string directly + * with a 8-Bit ASCII character string. 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. strings must be NULL-terminated. + * + * @param first the String to be compared. + * @param second the String to compare first + * String against. + * @param shortenedLength the number of characters which should be compared. + * This length can be longer, shorter or equal than the both other strings. + * + * @return the value 0 if the argument string is equal to + * this string; a value less than 0 if first string + * is lexicographically less than the second string; and a + * value greater than 0 if first string is + * lexicographically greater than the second string. + */ +sal_Int32 SAL_CALL rtl_ustr_ascii_shortenedCompare_WithLength( const sal_Unicode * first, sal_Int32 firstLen, + const sal_Char * second, sal_Int32 shortenedLength ); + +/** + * Returns a hashcode for the string. + * + * @param str a NULL-terminated string. + * @return a hash code value for str. + */ +sal_Int32 SAL_CALL rtl_ustr_hashCode_WithLength( const sal_Unicode * str, sal_Int32 len ); +sal_Int32 SAL_CALL rtl_ustr_hashCode( const sal_Unicode * str ); + +/** + * Returns the index within the string of the first occurrence of the + * specified character. + * + * @param str a NULL-terminated string. + * @param ch a character. + * @return the index of the first occurrence of the character in the + * character sequence represented by 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_Int32 SAL_CALL rtl_ustr_indexOfChar( const sal_Unicode * str, sal_Unicode ch ); + +/** + * Returns the index within the string of the last occurrence of the + * specified character, searching backward starting at the specified index. + * + * @param str a NULL-terminated string. + * @param ch a character. + * @return the index of the last occurrence of the character in the + * character sequence represented by the string, or + * -1 if the character does not occur. + */ +sal_Int32 SAL_CALL rtl_ustr_lastIndexOfChar_WithLength( const sal_Unicode * str, sal_Int32 len, sal_Unicode ch ); +sal_Int32 SAL_CALL rtl_ustr_lastIndexOfChar( const sal_Unicode * str, sal_Unicode ch ); + +/** + * Returns the index within the string of the first occurrence of the + * specified substring. + * + * @param str a NULL-terminated string. + * @param subStr a NULL-terminated substring to be searched for. + * @return if the string argument occurs as a substring within the + * string, then the index of the first character of the first + * such substring is returned; if it does not occur as a + * substring, -1 is returned. + */ +sal_Int32 SAL_CALL rtl_ustr_indexOfStr_WithLength( const sal_Unicode * str, sal_Int32 len, const sal_Unicode * subStr, sal_Int32 subLen ); +sal_Int32 SAL_CALL rtl_ustr_indexOfStr( const sal_Unicode * str, const sal_Unicode * subStr ); + +/** + * Returns the index within this string of the last occurrence of + * the specified substring. + * The returned index indicates the start of the substring, and it + * must be equal to or less than fromIndex. + * + * @param str a NULL-terminated string. + * @param subStr a NULL-terminated substring to be searched for. + * @return If the string argument occurs one or more times as a substring + * within the 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 SAL_CALL rtl_ustr_lastIndexOfStr_WithLength( const sal_Unicode * str, sal_Int32 len, const sal_Unicode * subStr, sal_Int32 subLen ); +sal_Int32 SAL_CALL rtl_ustr_lastIndexOfStr( const sal_Unicode * ggstr, const sal_Unicode * subStr ); + +/** + * Replaces all occurrences of oldChar in the string with + * newChar. + *

+ * If the character oldChar does not occur in the + * character sequence represented by this object, then the string is + *not modified. + * + * @param str a NULL-terminated 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); +void SAL_CALL rtl_ustr_replaceChar( sal_Unicode * str, sal_Unicode oldChar, sal_Unicode newChar); + +/** + * Converts all of the characters in the string to lower case. + * @param str a NULL-terminated string. + */ +void SAL_CALL rtl_ustr_toAsciiLowerCase_WithLength( sal_Unicode * str, sal_Int32 len ); +void SAL_CALL rtl_ustr_toAsciiLowerCase( sal_Unicode * str ); + +/** + * Converts all of the characters in the string to upper case. + * + * @param str a NULL-terminated string. + */ +void SAL_CALL rtl_ustr_toAsciiUpperCase_WithLength(sal_Unicode * str, sal_Int32 len); +void SAL_CALL rtl_ustr_toAsciiUpperCase(sal_Unicode * str); + +/** + * Removes white space from both ends of the string. + *

+ * All characters that have codes less than or equal to + * '\u0020' (the space character) are considered to be + * white space. + * + * @param str a NULL-terminated string. + * @return new length of the string. + */ +sal_Int32 SAL_CALL rtl_ustr_trim_WithLength( sal_Unicode * str, sal_Int32 len ); +sal_Int32 SAL_CALL rtl_ustr_trim( sal_Unicode * str ); + +/** + * Returns the string representation of the sal_Bool argument. + * + * @param str a newly allocated string with the length RTL_USTR_MAX_VALUEOFBOOLEAN. + * @param b a sal_Bool. + * @return if the argument is true, a string equal to + * "true" is returned; otherwise, a string equal to + * "false" is returned. + */ +#define RTL_USTR_MAX_VALUEOFBOOLEAN 6 +sal_Int32 SAL_CALL rtl_ustr_valueOfBoolean( sal_Unicode * str, sal_Bool b ); + +/** + * Returns the string representation of the char argument. + * + * @param str a newly allocated string with the length RTL_USTR_MAX_VALUEOFCHAR. + * @param ch a char. + * @return a newly allocated string of length 1 containing + * as its single character the argument ch. + */ +#define RTL_USTR_MAX_VALUEOFCHAR 2 +sal_Int32 SAL_CALL rtl_ustr_valueOfChar( sal_Unicode * str, sal_Unicode ch ); + +/** + * Returns the string representation of the int argument. + *

+ * The representation is exactly the one returned by the + * Integer.toString method of one argument. + * + * @param str a newly allocated string with the length RTL_USTR_MAX_VALUEOFINT32. + * @param i an sal_Int32. + * @return a newly allocated string containing a string representation of + * the int argument. + * @see java.lang.Integer#toString(int, int) + */ +#define RTL_USTR_MIN_RADIX 2 +#define RTL_USTR_MAX_RADIX 36 +#define RTL_USTR_MAX_VALUEOFINT32 33 +sal_Int32 SAL_CALL rtl_ustr_valueOfInt32(sal_Unicode * str, sal_Int32 i, sal_Int16 radix ); + +/** + * Returns the string representation of the long argument. + *

+ * The representation is exactly the one returned by the + * Long.toString method of one argument. + * + * @param str a newly allocated string with the length RTL_USTR_MAX_VALUEOFINT64. + * @param l a sal_Int64. + * @return a newly allocated string containing a string representation of + * the long argument. + * @see java.lang.Long#toString(long) + */ +#define RTL_USTR_MAX_VALUEOFINT64 65 +sal_Int32 SAL_CALL rtl_ustr_valueOfInt64(sal_Unicode * str, sal_Int64 l, sal_Int16 radix ); + +/** + * Returns the string representation of the float argument. + *

+ * The representation is exactly the one returned by the + * Float.toString method of one argument. + * + * @param f a float. + * @return a newly allocated string containing a string representation of + * the float argument. + * @see java.lang.Float#toString(float) + */ +#define RTL_USTR_MAX_VALUEOFFLOAT 15 +sal_Int32 SAL_CALL rtl_ustr_valueOfFloat(sal_Unicode * str, float f); + +/** + * Returns the string representation of the double argument. + *

+ * The representation is exactly the one returned by the + * Double.toString method of one argument. + * + * @param d a double. + * @return a newly allocated string containing a string representation of + * the double argument. + * @see java.lang.Double#toString(double) + */ +#define RTL_USTR_MAX_VALUEOFDOUBLE 25 +sal_Int32 SAL_CALL rtl_ustr_valueOfDouble(sal_Unicode * str, double d); + +/** + * Returns the int32 value represented str argument. + *

+ * + * @param str a string representing a number + * @return the int32 represented by the string + * 0 if the string represents no number. + */ +sal_Int32 SAL_CALL rtl_ustr_toInt32( sal_Unicode * str, sal_Int16 radix ); + +/** + * Returns the int64 value represented str argument. + *

+ * + * @param str a string representing a number + * @return the int64 represented by the string + * 0 if the string represents no number. + */ +sal_Int64 SAL_CALL rtl_ustr_toInt64( sal_Unicode * str, sal_Int16 radix ); + + /** + * Returns the float value represented str argument. + *

+ * + * @param str a string representing a number + * @return the float represented by the string + * 0.0 if the string represents no number. + */ +float SAL_CALL rtl_ustr_toFloat( sal_Unicode * str ); + +/** + * Returns the double value represented str argument. + *

+ * + * @param str a string representing a number + * @return the double represented by the string + * 0.0 if the string represents no number. + */ +double SAL_CALL rtl_ustr_toDouble( sal_Unicode * str ); + +/** + * A string with this reference count is static und must not deleted. + * It is also not allowed to modifiy the reference count. + */ +#define RTL_STATIC_STRING_REF ((sal_Int32)0x80000000) + +#ifdef SAL_W32 +# pragma pack(push, 4) +#elif defined(SAL_OS2) +# pragma pack(1) +#endif + +struct _rtl_Locale; + +/** + * The implementation structure of a string. + */ +typedef struct _rtl_uString +{ + sal_Int32 refCount; + sal_Int32 length; + sal_Unicode buffer[1]; +} rtl_uString; + +#ifdef SAL_W32 +# pragma pack(pop) +#elif defined(SAL_OS2) +# pragma pack() +#endif + +/** + * Increment the reference count of the string. + */ +void SAL_CALL rtl_uString_acquire( rtl_uString * value ); + +/** + * Decrement the reference count of the string. If the count goes to zero than the string is + * deleted. + */ +void SAL_CALL rtl_uString_release( rtl_uString * value ); + +/** + * Allocates a new string containing no characters. + * Use the macro RTL_NEWDEFAULTSTRING() which optimize platform dependend + * the access to the default string. + */ +void SAL_CALL rtl_uString_new( rtl_uString ** newStr); +#define RTL_USTRING_NEW(newStr) rtl_uString_new(newStr) + +/** + * Allocates a new string containing nLen characters. + * The values of the characters are '\u0000' defined. + */ +void SAL_CALL rtl_uString_new_WithLength( rtl_uString ** newStr, sal_Int32 nLen ); + +/** + * Allocates a new string that contains the same sequence of + * characters as the string argument.
+ * + * @param value a string. + * @return the new string. The reference count is 1. + */ +void SAL_CALL rtl_uString_newFromString( rtl_uString ** newStr, rtl_uString * value); + +/** + * Allocates a new string so that it represents the + * sequence of characters currently contained in the character array + * argument. + * + * @param value the initial value of the string. + * @return the new string. The reference count is 1. + */ +void SAL_CALL rtl_uString_newFromStr( rtl_uString ** newStr, const sal_Unicode * value ); + +/** + * Allocates a new String that contains characters from + * the character array argument. + * + * @param value array that is the source of characters. + * @param len the length of the array. + * @return the new string. The reference count is 1. + */ +void SAL_CALL rtl_uString_newFromStr_WithLength( rtl_uString ** newStr, const sal_Unicode * value, sal_Int32 Len); + +/** + * Allocates a new string so that it represents the + * sequence of characters currently contained in the character array + * argument. + * + * @param value the initial value of the string. + * @return the new string. The reference count is 1. + */ +void SAL_CALL rtl_uString_newFromWStr( rtl_uString ** newStr, const wchar_t * value ); + +/** + * Allocates a new String that contains characters from + * the character array argument. + * + * @param value array that is the source of characters. + * @param len the length of the array. + * @return the new string. The reference count is 1. + */ +void SAL_CALL rtl_uString_newFromWStr_WithLength( rtl_uString ** newStr, const wchar_t * value, sal_Int32 Len); + +/** + * Allocates a new string so that it represents the + * sequence of ASCII characters currently contained in the sal_Char + * array argument. 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. + * + * @param value the initial value of the string in ASCII characters. + * @return the new string. The reference count is 1. + */ +void SAL_CALL rtl_uString_newFromAscii( rtl_uString ** newStr, const sal_Char * value ); + +/** + * Assign rightValue to *str. Release *str and aquire rightValue! + */ +void SAL_CALL rtl_uString_assign( rtl_uString ** str, rtl_uString * rightValue ); + +/** + * Returns the length of this string. + * The length is equal to the number of 16-bit + * Unicode characters in the string. + * + * @return the length of the sequence of characters represented by the + * string. + */ +sal_Int32 SAL_CALL rtl_uString_getLength( rtl_uString * str ); + +/** + * Return the pointer to the sal_Unicode array of the string. + * + * @return a null terminated sal_Unicode *. + */ +sal_Unicode * SAL_CALL rtl_uString_getStr( rtl_uString * str ); + +/** + * Concatenates the right string to the end of the left string. Left and + * right must be NULL-terminated strings. + *

+ * + * @return a string that represents the concatenation of the strings. + */ +void SAL_CALL rtl_uString_newConcat( rtl_uString ** newStr, rtl_uString * left, rtl_uString * right ); + +/** + * 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 the string, then the string is + * returned. + * + * @param oldChar the old character. + * @param newChar the new character. + * @return the new string. The reference count is 1. + */ +void SAL_CALL rtl_uString_newReplace( rtl_uString ** newStr, + rtl_uString * str, + sal_Unicode oldChar, + sal_Unicode newChar); + +/** + * Returns a new string resulting from replacing n = count characters + * from position index in this string with newStr. + *

+ * + * @param index the index for beginning. + * @param count the count of charcters that will replaced + * @param newStr the new substring. + * @return the new string. The reference count is 1. + */ +void SAL_CALL rtl_uString_newReplaceStrAt( rtl_uString ** newStr, + rtl_uString * str, + sal_Int32 index, + sal_Int32 count, + rtl_uString * newSub); + +/** + * Converts all of the characters in this String to lower + * case using the rules of the given locale. + * @param locale use the case transformation rules for this locale + * @return the String, converted to lowercase. + * @return the new string. The reference count is 1. + */ +void SAL_CALL rtl_uString_newToLowerCase( rtl_uString ** newStr, rtl_uString * str, struct _rtl_Locale * locale ); + +/** + * Converts all of the characters in this String to upper + * case using the rules of the given locale. + * @param locale use the case transformation rules for this locale + * @return the String, converted to uppercase. + * @return the new string. The reference count is 1. + */ +void SAL_CALL rtl_uString_newToUpperCase( rtl_uString ** newStr, rtl_uString * str, struct _rtl_Locale * locale ); + +/** + * Removes white space from both ends of the string. + *

+ * All characters that have codes less than or equal to + * '\u0020' (the space character) are considered to be + * white space. + * + * @return this string, with white space removed from the front and end. + * @return the new string. The reference count is 1. + */ +void SAL_CALL rtl_uString_newTrim( rtl_uString ** newStr, rtl_uString * str ); + +/** + * Returns the number of tokens in this String seperated + * by cTok. + * + * @param cTok the character which seperate the tokens + * @return the number of tokens. + */ +sal_Int32 SAL_CALL rtl_uString_getTokenCount( rtl_uString * str , sal_Unicode cTok); + +/** + * Returns a new string for the token specified by nToken. If nToken < 0 or + * nToken > tokenCount then an empty string is returned. + * + * @param nToken the number of the token to return. + * @param cTok the character which seperate the tokens + * @param newStr the new string for the token + * @return the new string. The reference count is 1. + */ +void SAL_CALL rtl_uString_getToken( rtl_uString ** newStr , rtl_uString * str, sal_Int32 nToken, sal_Unicode cTok); + + +void SAL_CALL rtl_string2UString( rtl_uString** newStr, const sal_Char* pStr, sal_Int32 nLen, + rtl_TextEncoding encoding, sal_uInt32 nCvtFlags ); + +void SAL_CALL rtl_uString2String( rtl_String** newStr, const sal_Unicode* pWStr, sal_Int32 nWLen, + rtl_TextEncoding encoding, sal_uInt32 nCvtFlags ); + +/* constAsciiStr must be a "..." or char const aFoo[] = "..." */ +#define RTL_CONSTASCII_USTRINGPARAM( constAsciiStr ) constAsciiStr, sizeof( constAsciiStr )-1, RTL_TEXTENCODING_ASCII_US +#ifndef RTL_CONSTASCII_STRINGPARAM +#define RTL_CONSTASCII_STRINGPARAM( constAsciiStr ) constAsciiStr, sizeof( constAsciiStr )-1 +#endif +#ifndef RTL_CONSTASCII_LENGTH +#define RTL_CONSTASCII_LENGTH( constAsciiStr ) (sizeof( constAsciiStr )-1) +#endif + +#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..2f11e3499aa8 --- /dev/null +++ b/sal/inc/rtl/ustring.hxx @@ -0,0 +1,140 @@ +/************************************************************************* + * + * $RCSfile: ustring.hxx,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:17:15 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +#ifndef _RTL_USTRING_HXX_ +#define _RTL_USTRING_HXX_ + +#ifndef _RTL_USTRING_ +#include +#endif +#ifndef _RTL_STRING_HXX_ +#include +#endif +#ifndef _RTL_LOCALE_HXX_ +#include +#endif + +#ifdef _USE_NAMESPACE +namespace rtl +{ +#endif + +/** + * Converts all of the characters in this OUString to lower + * case using the rules of the given locale. + * @param locale use the case transformation rules for this locale + * @return the OUString, converted to lowercase. + * @see java.lang.Character#toLowerCase(char) + * @see java.lang.OUString#toUpperCase() + * @since JDK1.1 + */ +inline OUString OUString::toLowerCase( const OLocale & locale ) const +{ + OUString newStr; + rtl_uString_newToLowerCase( &newStr.pData, pData, *(rtl_Locale **)&locale ); + return newStr; +} + + +/** + * Converts all of the characters in this OUString to upper + * case using the rules of the given locale. + * @param locale use the case transformation rules for this locale + * @return the OUString, converted to uppercase. + * @see java.lang.Character#toUpperCase(char) + * @see java.lang.OUString#toLowerCase(char) + * @since JDK1.1 + */ +inline OUString OUString::toUpperCase( const OLocale & locale) const +{ + OUString newStr; + rtl_uString_newToUpperCase( &newStr.pData, pData, *(rtl_Locale **)&locale ); + return newStr; +} + +// Helper functions +inline OUString OStringToOUString( const OString & rStr, + rtl_TextEncoding encoding, + sal_uInt32 nCvtFlags=OSTRING_TO_OUSTRING_CVTFLAGS ) +{ + OUString newStr; + if (rStr.getLength()) + rtl_string2UString( &newStr.pData, rStr.getStr(), rStr.getLength(), encoding, nCvtFlags ); + return newStr; +} + +inline OString OUStringToOString( const OUString & rUnicode, + rtl_TextEncoding encoding, + sal_uInt32 nCvtFlags=OUSTRING_TO_OSTRING_CVTFLAGS ) +{ + OString newStr; + if (rUnicode.getLength()) + rtl_uString2String( &newStr.pData, rUnicode.getStr(), rUnicode.getLength(), encoding, nCvtFlags ); + return newStr; +} + +#ifdef _USE_NAMESPACE +} +#endif + +#endif /* _RTL_USTRING_HXX_ */ + + diff --git a/sal/inc/rtl/uuid.h b/sal/inc/rtl/uuid.h new file mode 100644 index 000000000000..dfb9d3b70695 --- /dev/null +++ b/sal/inc/rtl/uuid.h @@ -0,0 +1,231 @@ +/************************************************************************* + * + * $RCSfile: uuid.h,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:17:15 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ +#ifndef _RTL_UUID_H_ +#define _RTL_UUID_H_ + + +#include +#include + +/*** + * (from ) + * Specification + * + * 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 the time value used for + * constructing a UUID is limited and will roll over in the future + * (approximately at A.D. 3400, based on the specified algorithm). 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. + * + * The generation of UUIDs does not require that a registration + * authority be contacted for each identifier. Instead, it requires a + * unique value over space for each UUID generator. This spatially + * unique value is specified as an IEEE 802 address, which is usually + * already available to network-connected systems. This 48-bit address + * can be assigned based on an address block obtained through the IEEE + * registration authority. + * + *****/ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * Generates a new UUID (Universally Unique IDentifier). + * If available, the ethernetaddress of a networkcard is used, otherwise + * a 6 Byte random number is generated( for which rtlRandomPool is used ). + * + * + * @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 pointer to the previously generated uuid in network byte + * order. The generator reuses the 6-Byte random value + * and the two byte context value and ensures, + * that pTargetUUID is generated with a later timestamp. + * Set pPredecessorUUID to 0 if no predecessor is available. + * The caller is responsible for making the value persistent + * (if desired). + * @param bUseEthernetAddress if sal_True, the generator uses the ethernet address of a + * network card (if available).
+ * if sal_False, the generator generates a new 6-Byte random + * value each time it is called with pPredecessorUUID = 0. + * + **/ +void SAL_CALL rtl_createUuid( sal_uInt8 *pTargetUUID , + const sal_uInt8 *pPredecessorUUID, + sal_Bool bUseEthernetAddress ); + +/**** + * uuid_compare -- Compare two UUID's "lexically" and return + * -1 u1 is lexically before u2 + * 0 u1 is equal to u2 + * 1 u1 is lexically after u2 + * + * Note: lexical ordering is not temporal ordering! + * Note: For equalnesschecking, a memcmp(pUUID1,pUUID2,16) is more efficient + ****/ +sal_Int32 SAL_CALL rtl_compareUuid( const sal_uInt8 *pUUID1 , const sal_uInt8 *pUUID2 ); + +/**** + * The version 3 UUID is meant for generating UUIDs from "names" that + * are drawn from, and unique within, some "name space". 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. + * + * The requirements for such UUIDs are as follows: + * + * - The UUIDs generated at different times from the same name in the + * same namespace MUST be equal + * + * - The UUIDs generated from two different names in the same namespace + * should be different (with very high probability) + * + * - The UUIDs generated from the same name in two different namespaces + * should be different with (very high probability) + * + * - 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). + * + * @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; + * + ****/ +/* 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\ + } + +/* 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\ + } + +/* 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\ + } + +/* 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 LINUX +#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 +#elif MACOS +#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/config.h b/sal/inc/sal/config.h new file mode 100644 index 000000000000..77af6e31a0fc --- /dev/null +++ b/sal/inc/sal/config.h @@ -0,0 +1,124 @@ +/************************************************************************* + * + * $RCSfile: config.h,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:17:15 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +#ifndef _SAL_CONFIG_H_ +#define _SAL_CONFIG_H_ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef __cplusplus +} +#endif + + +/** The define _USE_NO_NAMEPSACE disable the use of namespaces. + default is that namespaces were used. +*/ +#ifndef _USE_NO_NAMESPACE +#if defined(USE_NAMESPACE) || !defined(_USE_NAMESPACE) +# define _USE_NAMESPACE +#endif +#endif + +#ifdef WIN32 +#define SAL_W32 + +/* No warning for: C++ Exception Specification ignored */ +#pragma warning( disable : 4290 ) + + #if defined(_DEBUG) + /* No warning for: identifier was truncated to '255' characters in the browser information */ + #pragma warning( disable : 4786 ) + #endif + +#endif + +/* BR: 16bit fuer Borland-Compiler */ +#ifdef __BORLANDC__ +#define SAL_W16 +#endif +/* BR: 16bit fuer Borland-Compiler */ + +#ifdef OS2 +#define SAL_OS2 +#endif + +#ifdef MAC +#define SAL_MAC +#endif + +#if defined(SOLARIS) || defined(LINUX) || defined(NETBSD) || \ + defined(SCO) || defined(MACOSX) +#define SAL_UNX +#endif + +#ifdef sun +#undef sun +#define sun sun +#endif + +#endif /*_SAL_CONFIG_H_ */ + + diff --git a/sal/inc/sal/types.h b/sal/inc/sal/types.h new file mode 100644 index 000000000000..df0e61331907 --- /dev/null +++ b/sal/inc/sal/types.h @@ -0,0 +1,225 @@ +/************************************************************************* + * + * $RCSfile: types.h,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:17:15 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +#ifndef _SAL_TYPES_H_ +#define _SAL_TYPES_H_ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/********************************************************************************/ +/* Data types +*/ + +/* Boolean */ + +typedef unsigned char sal_Bool; +# define sal_False ((unsigned char)0) +# define sal_True ((unsigned char)1) +/* +typedef int sal_Bool; +# define sal_False 0 +# define sal_True 1 +*/ +typedef signed char sal_Int8; +typedef unsigned char sal_uInt8; +typedef signed short sal_Int16; +typedef unsigned short sal_uInt16; +typedef signed long sal_Int32; +typedef unsigned long sal_uInt32; + +# if (_MSC_VER >= 1000) +typedef __int64 sal_Int64; +typedef unsigned __int64 sal_uInt64; +# elif defined(__SUNPRO_CC) || defined(__SUNPRO_C) || defined (__GNUC__) || defined (__MWERKS__) || defined(__hpux) +typedef long long sal_Int64; +typedef unsigned long long sal_uInt64; +# else +# define SAL_INT64_IS_STRUCT +typedef struct + { + sal_uInt32 Part1; + sal_uInt32 Part2; + } sal_Int64; + +typedef struct + { + sal_uInt32 Part1; + sal_uInt32 Part2; + } sal_uInt64; +#endif + +typedef char sal_Char; +typedef signed char sal_sChar; +typedef unsigned char sal_uChar; +#if defined(SAL_W32) +typedef wchar_t sal_Unicode; +#else +#define SAL_UNICODE_NOTEQUAL_WCHAR_T +typedef sal_uInt16 sal_Unicode; +#endif + +typedef void* sal_Handle; +typedef unsigned long sal_Size; + +#if defined(SAL_W32) || defined(SAL_OS2) || defined(SAL_UNX) || defined(SAL_MAC) +#define SAL_MAX_ENUM 0x7fffffff +#elif defined(SAL_W16) +#define SAL_MAX_ENUM 0x7fff +#endif + +#ifdef SAL_W32 +# define SAL_DLLEXPORT __declspec(dllexport) +# define SAL_CALL __cdecl +# define SAL_CALL_ELLIPSE __cdecl +#elif defined SAL_OS2 +# define SAL_DLLEXPORT +# define SAL_CALL +# define SAL_CALL_ELLIPSE +#elif defined SAL_UNX +# define SAL_DLLEXPORT +# define SAL_CALL +# define SAL_CALL_ELLIPSE +#elif defined SAL_MAC +# define SAL_DLLEXPORT +# define SAL_CALL +# define SAL_CALL_ELLIPSE +#elif defined SAL_W16 /* BR: kopiert von SAL_W32 */ +# define SAL_DLLEXPORT __declspec(dllexport) +# define SAL_CALL __cdecl +# define SAL_CALL_ELLIPSE __cdecl +#else +# error("unknown platform") +#endif + +void SAL_CALL sal_setInt64(sal_Int64* newInt, sal_uInt32 lowInt, sal_Int32 highInt); +void SAL_CALL sal_getInt64(sal_Int64 newInt, sal_uInt32* lowInt, sal_Int32* highInt); + +void SAL_CALL sal_setUInt64(sal_uInt64* newInt, sal_uInt32 lowInt, sal_uInt32 highInt); +void SAL_CALL sal_getUInt64(sal_uInt64 newInt, sal_uInt32* lowInt, sal_uInt32* highInt); + +#define SAL_PACK_PUSH +#define SAL_PACK_POP + +#ifdef SAL_W16 +#define SAL_HUGE +#else +#define SAL_HUGE +#endif + + +#ifdef SAL_W32 +#pragma pack(push, 8) +#elif defined(SAL_OS2) +#pragma pack(8) +#endif + +/** This is the binary specification of a SAL sequence. +
+*/ +typedef struct _sal_Sequence +{ + /** reference count of sequence
+ */ + sal_Int32 nRefCount; + /** element count
+ */ + sal_Int32 nElements; + /** elements array
+ */ + char elements[1]; +} sal_Sequence; + +#define SAL_SEQUENCE_HEADER_SIZE ((sal_Size)&((sal_Sequence *)0)->elements) + +#ifdef SAL_W32 +#pragma pack(pop) +#elif defined(SAL_OS2) +#pragma pack() +#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 +#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 */ + +#ifdef __cplusplus +} +#endif + + +#endif /*_SAL_TYPES_H_ */ + diff --git a/sal/inc/systools/win32/StrConvert.h b/sal/inc/systools/win32/StrConvert.h new file mode 100644 index 000000000000..1922928433bb --- /dev/null +++ b/sal/inc/systools/win32/StrConvert.h @@ -0,0 +1,80 @@ +/************************************************************************* + * + * $RCSfile: StrConvert.h,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:17:15 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ +#ifndef _STRCONVERT_H_ +#define _STRCONVERT_H_ + +#include + +#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 ); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/sal/inc/systools/win32/advapi9x.h b/sal/inc/systools/win32/advapi9x.h new file mode 100644 index 000000000000..427ff7136fa8 --- /dev/null +++ b/sal/inc/systools/win32/advapi9x.h @@ -0,0 +1,198 @@ +/************************************************************************* + * + * $RCSfile: advapi9x.h,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:17:15 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ +#pragma once + +#ifndef _WINDOWS_ +#include +#endif + +#ifdef __cplusplus +extern "C"{ +#endif + +/* 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 + +/* undefine if already defined as macros */ +#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 + +extern 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 +); + +extern 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 +); + +extern 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 +); + +extern LONG (WINAPI *lpfnRegDeleteKeyW) ( + HKEY hKey, // handle to open key + LPCWSTR lpSubKey // subkey name +); + +extern 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 +); + +extern 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 +); + +extern 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 +); + +extern LONG (WINAPI *lpfnRegDeleteValueW) ( + HKEY hKey, // handle to key + LPCWSTR lpValueName // value name +); + +#define RegOpenKeyExW lpfnRegOpenKeyExW +#define RegEnumKeyExW lpfnRegEnumKeyExW +#define RegCreateKeyExW lpfnRegCreateKeyExW +#define RegDeleteKeyW lpfnRegDeleteKeyW +#define RegEnumValueW lpfnRegEnumValueW +#define RegQueryValueExW lpfnRegQueryValueExW +#define RegSetValueExW lpfnRegSetValueExW +#define RegDeleteValueW lpfnRegDeleteValueW + +extern void Advapi9xInit(LPOSVERSIONINFO lpVersionInfo); +extern void Advapi9xDeInit(); + +#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..2b96286de242 --- /dev/null +++ b/sal/inc/systools/win32/comdlg9x.h @@ -0,0 +1,102 @@ +/************************************************************************* + * + * $RCSfile: comdlg9x.h,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:17:15 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ +#pragma once + +#ifndef _WINDOWS_ +#include +#endif + +#ifndef _COMMDLG_H_ +#include +#endif + +#ifdef __cplusplus +extern "C"{ +#endif + +/* undefine if already a macro */ + +#ifdef GetOpenFileNameW +#undef GetOpenFileNameW +#endif + +#ifdef GetSaveFileNameW +#undef GetSaveFileNameW +#endif + +extern BOOL ( WINAPI * lpfnGetOpenFileNameW) ( + LPOPENFILENAMEW lpofn +); + +extern BOOL ( WINAPI * lpfnGetSaveFileNameW) ( + LPOPENFILENAMEW lpofn +); + +/* define as macro */ +#define GetOpenFileNameW lpfnGetOpenFileNameW +#define GetSaveFileNameW lpfnGetSaveFileNameW + +void Comdlg9xInit(LPOSVERSIONINFO lpVersionInfo); +void Comdlg9xDeInit(); + +#ifdef __cplusplus +} +#endif diff --git a/sal/inc/systools/win32/kernel9x.h b/sal/inc/systools/win32/kernel9x.h new file mode 100644 index 000000000000..a2acefae7ebd --- /dev/null +++ b/sal/inc/systools/win32/kernel9x.h @@ -0,0 +1,205 @@ +/************************************************************************* + * + * $RCSfile: kernel9x.h,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:17:15 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ +#pragma once + +#ifndef _WINDOWS_ +#include +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/* undefine if already defined as macros */ +#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 + +//BOOL WINAPI RegisterServiceProcess( DWORD dwProcessID, BOOL fRegister ); + +extern HMODULE (WINAPI *lpfnLoadLibraryExW) ( + LPCWSTR lpLibFileName, // file name of module + HANDLE hFile, // reserved, must be NULL + DWORD dwFlags // entry-point execution option +); + +extern DWORD (WINAPI *lpfnGetModuleFileNameW) ( + HMODULE hModule, // handle to module + LPWSTR lpFilename, // file name of module + DWORD nSize // size of buffer +); + +extern DWORD (WINAPI *lpfnGetLogicalDriveStringsW) ( + DWORD nBufferLength, // size of buffer + LPWSTR lpBuffer // drive strings buffer +); + +extern HANDLE ( WINAPI *lpfnCreateFileW )( + LPCWSTR lpFileName, + DWORD dwDesiredAccess, + DWORD dwShareMode, + LPSECURITY_ATTRIBUTES lpSecurityAttributes, + DWORD dwCreationDisposition, + DWORD dwFlagsAndAttributes, + HANDLE hTemplateFile +); + +extern DWORD WINAPI GetCanonicalPathNameA( + LPCSTR lpszPath, // file name + LPSTR lpszCanonicalPath, // path buffer + DWORD cchBuffer // size of path buffer +); + +extern DWORD WINAPI GetCanonicalPathNameW( + LPCWSTR lpszPath, // file name + LPWSTR lpszCanonicalPath, // path buffer + DWORD cchBuffer // size of path buffer +); + + +extern BOOL (WINAPI *lpfnDeleteFileW) ( + LPCWSTR lpFileName // file name +); + +extern BOOL (WINAPI *lpfnCopyFileW) ( + LPCWSTR lpExistingFileName, // file name + LPCWSTR lpNewFileName, // new file name + BOOL bFailIfExist // operation if file exists +); + +extern BOOL (WINAPI *lpfnMoveFileW) ( + LPCWSTR lpExistingFileName, // file name + LPCWSTR lpNewFileName // new file name +); + +extern BOOL (WINAPI *lpfnMoveFileExW) ( + LPCWSTR lpExistingFileName, // file name + LPCWSTR lpNewFileName, // new file name + DWORD dwFlags // move options +); + +extern HANDLE (WINAPI *lpfnCreateFileW) ( + LPCWSTR lpFileName, + DWORD dwDesiredAccess, + DWORD dwShareMode, + LPSECURITY_ATTRIBUTES lpSecurityAttributes, + DWORD dwCreationDisposition, + DWORD dwFlagsAndAttributes, + HANDLE hTemplateFile +); + +#ifdef UNICODE +#define GetCanonicalPath GetCanonicalPathW +#else +#define GetCanonicalPath GetCanonicalPathA +#endif + +/* replace API calls */ +#define LoadLibraryExW lpfnLoadLibraryExW +#define LoadLibraryW(c) LoadLibraryExW(c, NULL, 0) +#define GetModuleFileNameW lpfnGetModuleFileNameW +#define GetLogicalDriveStringsW lpfnGetLogicalDriveStringsW +#define DeleteFileW lpfnDeleteFileW +#define CopyFileW lpfnCopyFileW +#define MoveFileW lpfnMoveFileW +#define MoveFileExW lpfnMoveFileExW +#define CreateFileW lpfnCreateFileW + +extern void Kernel9xInit(LPOSVERSIONINFO lpVersionInfo); +extern void Kernel9xDeInit(); + +#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..0ef45873476f --- /dev/null +++ b/sal/inc/systools/win32/shell9x.h @@ -0,0 +1,122 @@ +/************************************************************************* + * + * $RCSfile: shell9x.h,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:17:15 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ +#pragma once + +#ifndef _WINDOWS_ +#include +#endif + +#ifndef _SHLOBJ_H_ +#include +#endif + +#ifdef __cplusplus +extern "C"{ +#endif + +/* undefine if already a macro */ +#ifdef CommandLineToArgvW +#undef CommandLineToArgvW +#endif + +#ifdef SHBrowseForFolderW +#undef SHBrowseForFolderW +#endif + +#ifdef SHGetPathFromIDListW +#undef SHGetPathFromIDListW +#endif + +#ifdef SetWindowTextW +#undef SetWindowTextW +#endif + +extern LPWSTR * (WINAPI *lpfnCommandLineToArgvW) ( + LPCWSTR lpCmdLine, // pointer to a command-line string + int *pNumArgs // receives the argument count +); + +extern LPITEMIDLIST ( WINAPI * lpfnSHBrowseForFolderW) ( + LPBROWSEINFOW lpbi +); + +extern BOOL ( WINAPI * lpfnSHGetPathFromIDListW ) ( + LPCITEMIDLIST pidl, + LPWSTR pszPath +); + +extern BOOL ( WINAPI * lpfnSetWindowTextW ) ( + HWND hWnd, + LPCWSTR lpString +); + +/* define as macro */ +#define CommandLineToArgvW lpfnCommandLineToArgvW +#define SHBrowseForFolderW lpfnSHBrowseForFolderW +#define SHGetPathFromIDListW lpfnSHGetPathFromIDListW +#define SetWindowTextW lpfnSetWindowTextW + +void Shell9xInit(LPOSVERSIONINFO lpVersionInfo); +void Shell9xDeInit(); + +#ifdef __cplusplus +} +#endif diff --git a/sal/inc/systools/win32/user9x.h b/sal/inc/systools/win32/user9x.h new file mode 100644 index 000000000000..052b51401bcf --- /dev/null +++ b/sal/inc/systools/win32/user9x.h @@ -0,0 +1,132 @@ +/************************************************************************* + * + * $RCSfile: user9x.h,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:17:15 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ +#pragma once + +#ifndef _WINDOWS_ +#include +#endif + +#ifdef __cplusplus +extern "C"{ +#endif + +/* undefine if already a macro */ + +#ifdef SendMessageW +#undef SendMessageW +#endif + +#ifdef CreateWindowExW +#undef CreateWindowExW +#endif + +#ifdef RegisterClassExW +#undef RegisterClassExW +#endif + +#ifdef UnregisterClassW +#undef UnregisterClassW +#endif + +extern LRESULT ( WINAPI * lpfnSendMessageW) ( + HWND hWnd, // handle to the destination window + UINT Msg, // message + WPARAM wParam, // first message parameter + LPARAM lParam // second message parameter +); + +extern 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 +); + +extern ATOM ( WINAPI * lpfnRegisterClassExW ) ( + CONST WNDCLASSEXW* lpwcx // class data +); + +extern BOOL ( WINAPI * lpfnUnregisterClassW ) ( + LPCWSTR lpClassName, // class name + HINSTANCE hInstance // handle to application instance +); + + +/* define as macro */ +#define SendMessageW lpfnSendMessageW +#define CreateWindowExW lpfnCreateWindowExW +#define RegisterClassExW lpfnRegisterClassExW +#define UnregisterClassW lpfnUnregisterClassExW + +void User9xInit(LPOSVERSIONINFO lpVersionInfo); +void User9xDeInit(); + +#ifdef __cplusplus +} +#endif diff --git a/sal/osl/all/makefile.mk b/sal/osl/all/makefile.mk new file mode 100644 index 000000000000..ace3da10069e --- /dev/null +++ b/sal/osl/all/makefile.mk @@ -0,0 +1,115 @@ +#************************************************************************* +# +# $RCSfile: makefile.mk,v $ +# +# $Revision: 1.1.1.1 $ +# +# last change: $Author: hr $ $Date: 2000-09-18 15:17:15 $ +# +# The Contents of this file are made available subject to the terms of +# either of the following licenses +# +# - GNU Lesser General Public License Version 2.1 +# - Sun Industry Standards Source License Version 1.1 +# +# Sun Microsystems Inc., October, 2000 +# +# GNU Lesser General Public License Version 2.1 +# ============================================= +# Copyright 2000 by Sun Microsystems, Inc. +# 901 San Antonio Road, Palo Alto, CA 94303, USA +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License version 2.1, as published by the Free Software Foundation. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, +# MA 02111-1307 USA +# +# +# Sun Industry Standards Source License Version 1.1 +# ================================================= +# The contents of this file are subject to the Sun Industry Standards +# Source License Version 1.1 (the "License"); You may not use this file +# except in compliance with the License. You may obtain a copy of the +# License at http://www.openoffice.org/license.html. +# +# Software provided under this License is provided on an "AS IS" basis, +# WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, +# WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, +# MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. +# See the License for the specific provisions governing your rights and +# obligations concerning the Software. +# +# The Initial Developer of the Original Code is: Sun Microsystems, Inc. +# +# Copyright: 2000 by Sun Microsystems, Inc. +# +# All Rights Reserved. +# +# Contributor(s): _______________________________________ +# +# +# +#************************************************************************* + +PRJ=..$/.. + +PRJNAME=sal +TARGET=oslall +USE_LDUMP2=TRUE + +PROJECTPCH4DLL=TRUE +PROJECTPCH=cont_pch +PROJECTPCHSOURCE=cont_pch + +MULTITHREAD_OBJ=TRUE + +# --- Settings ----------------------------------------------------- + +.INCLUDE : svpre.mk +.INCLUDE : settings.mk +.INCLUDE : sv.mk + +# --- Files -------------------------------------------------------- + +.IF "$(GUI)"=="OS2" +NOOPTFILES=$(SLO)$/daemprot.obj \ + $(OBJ)$/daemprot.obj + +.ENDIF + +SLOFILES= $(SLO)$/daemprot.obj \ + $(SLO)$/daemclie.obj \ + $(SLO)$/daemreg.obj \ + $(SLO)$/channman.obj \ + $(SLO)$/chanpool.obj \ + $(SLO)$/isocket.obj \ + $(SLO)$/types.obj \ + $(SLO)$/nspr.obj \ + $(SLO)$/omutex.obj + +#.IF "$(UPDATER)"=="YES" +OBJFILES= $(OBJ)$/daemman.obj \ + $(OBJ)$/daemprot.obj \ + $(OBJ)$/daemreg.obj \ + $(OBJ)$/daemclie.obj \ + $(OBJ)$/channman.obj \ + $(OBJ)$/chanpool.obj \ + $(OBJ)$/isocket.obj \ + $(OBJ)$/types.obj \ + $(OBJ)$/omutex.obj +#.ENDIF + +# --- Targets ------------------------------------------------------ + +.INCLUDE : target.mk + + diff --git a/sal/osl/os2/conditn.c b/sal/osl/os2/conditn.c new file mode 100644 index 000000000000..4f60ac69b0b7 --- /dev/null +++ b/sal/osl/os2/conditn.c @@ -0,0 +1,157 @@ +/************************************************************************* + * + * $RCSfile: conditn.c,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:17:19 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + + +#include "system.h" + +#include +#include +#include + +/* + 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/diagnose.c b/sal/osl/os2/diagnose.c new file mode 100644 index 000000000000..91a9c1173168 --- /dev/null +++ b/sal/osl/os2/diagnose.c @@ -0,0 +1,155 @@ +/************************************************************************* + * + * $RCSfile: diagnose.c,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:17:19 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + + +#include "system.h" + +#include +#include +#include + +#include + +sal_Char oslTraceEnv[] = "OSL_TRACE_TO_FILE"; + +/*----------------------------------------------------------------------------*/ + +void SAL_CALL osl_breakDebug() +{ + exit(0); +} + +/*----------------------------------------------------------------------------*/ + +void SAL_CALL osl_trace(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, &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( 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; +} + +/*----------------------------------------------------------------------------*/ + diff --git a/sal/osl/os2/dllentry.c b/sal/osl/os2/dllentry.c new file mode 100644 index 000000000000..2c3924e2301a --- /dev/null +++ b/sal/osl/os2/dllentry.c @@ -0,0 +1,109 @@ +/************************************************************************* + * + * $RCSfile: dllentry.c,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:17:19 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +#include "system.h" +#include "sockimpl.h" +#include "secimpl.h" +#include "daemimpl.h" + +#include + +#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/interlck.c b/sal/osl/os2/interlck.c new file mode 100644 index 000000000000..96423ee99bb1 --- /dev/null +++ b/sal/osl/os2/interlck.c @@ -0,0 +1,95 @@ +/************************************************************************* + * + * $RCSfile: interlck.c,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:17:20 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +#include "system.h" + +#include +#include + +/*****************************************************************************/ +/* osl_incrementInterlockedCount */ +/*****************************************************************************/ +oslInterlockedCount SAL_CALL osl_incrementInterlockedCount(oslInterlockedCount* pCount) +{ + oslInterlockedCount Count; + + DosEnterCritSec(); + Count = ++(*pCount); + DosExitCritSec(); + + return (Count); +} + +/*****************************************************************************/ +/* osl_decrementInterlockedCount */ +/*****************************************************************************/ +oslInterlockedCount SAL_CALL osl_decrementInterlockedCount(oslInterlockedCount* pCount) +{ + oslInterlockedCount Count; + + DosEnterCritSec(); + Count = --(*pCount); + DosExitCritSec(); + + return (Count); +} + + diff --git a/sal/osl/os2/makefile.mk b/sal/osl/os2/makefile.mk new file mode 100644 index 000000000000..9776a61c0d17 --- /dev/null +++ b/sal/osl/os2/makefile.mk @@ -0,0 +1,165 @@ +#************************************************************************* +# +# $RCSfile: makefile.mk,v $ +# +# $Revision: 1.1.1.1 $ +# +# last change: $Author: hr $ $Date: 2000-09-18 15:17:19 $ +# +# The Contents of this file are made available subject to the terms of +# either of the following licenses +# +# - GNU Lesser General Public License Version 2.1 +# - Sun Industry Standards Source License Version 1.1 +# +# Sun Microsystems Inc., October, 2000 +# +# GNU Lesser General Public License Version 2.1 +# ============================================= +# Copyright 2000 by Sun Microsystems, Inc. +# 901 San Antonio Road, Palo Alto, CA 94303, USA +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License version 2.1, as published by the Free Software Foundation. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, +# MA 02111-1307 USA +# +# +# Sun Industry Standards Source License Version 1.1 +# ================================================= +# The contents of this file are subject to the Sun Industry Standards +# Source License Version 1.1 (the "License"); You may not use this file +# except in compliance with the License. You may obtain a copy of the +# License at http://www.openoffice.org/license.html. +# +# Software provided under this License is provided on an "AS IS" basis, +# WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, +# WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, +# MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. +# See the License for the specific provisions governing your rights and +# obligations concerning the Software. +# +# The Initial Developer of the Original Code is: Sun Microsystems, Inc. +# +# Copyright: 2000 by Sun Microsystems, Inc. +# +# All Rights Reserved. +# +# Contributor(s): _______________________________________ +# +# +# +#************************************************************************* + +PRJ=..$/.. + +PRJNAME=sal +TARGET=cpposl + +PROJECTPCH4DLL=TRUE +PROJECTPCH=cont_pch +PROJECTPCHSOURCE=cont_pch + +# --- Settings ----------------------------------------------------- + +.INCLUDE : svpre.mk +.INCLUDE : settings.mk +.INCLUDE : sv.mk + +# --- Files -------------------------------------------------------- + +START_SCRIPT = sdaemon.cmd + +.IF "$(header)" == "" + +CFILES= conditn.c \ + diagnose.c \ + dllentry.c \ + semaphor.c \ + socket.c \ + interlck.c \ + mutex.c \ + thread.c \ + module.c \ + process.c \ + security.c \ + profile.c \ + time.c \ + tools.c \ + file.c \ + signal.c \ + pipe.c \ + daemon.c \ + util.c \ + channel.c \ + ports.c + +SLOFILES= $(SLO)$/conditn.obj \ + $(SLO)$/diagnose.obj \ + $(SLO)$/dllentry.obj \ + $(SLO)$/semaphor.obj \ + $(SLO)$/socket.obj \ + $(SLO)$/interlck.obj \ + $(SLO)$/mutex.obj \ + $(SLO)$/thread.obj \ + $(SLO)$/module.obj \ + $(SLO)$/process.obj \ + $(SLO)$/security.obj \ + $(SLO)$/profile.obj \ + $(SLO)$/time.obj \ + $(SLO)$/tools.obj \ + $(SLO)$/file.obj \ + $(SLO)$/signal.obj \ + $(SLO)$/pipe.obj \ + $(SLO)$/daemon.obj \ + $(SLO)$/util.obj \ + $(SLO)$/channel.obj \ + $(SLO)$/ports.obj + +.ENDIF + +OBJFILES= $(OBJ)$/conditn.obj \ + $(OBJ)$/diagnose.obj \ + $(OBJ)$/dllentry.obj \ + $(OBJ)$/semaphor.obj \ + $(OBJ)$/socket.obj \ + $(OBJ)$/interlck.obj \ + $(OBJ)$/mutex.obj \ + $(OBJ)$/thread.obj \ + $(OBJ)$/module.obj \ + $(OBJ)$/process.obj \ + $(OBJ)$/security.obj \ + $(OBJ)$/profile.obj \ + $(OBJ)$/time.obj \ + $(OBJ)$/tools.obj \ + $(OBJ)$/file.obj \ + $(OBJ)$/signal.obj \ + $(OBJ)$/pipe.obj \ + $(OBJ)$/daemon.obj \ + $(OBJ)$/util.obj \ + $(OBJ)$/channel.obj \ + $(OBJ)$/ports.obj + +DEPOBJFILES = $(OBJ)$/sdaemon.obj + +# --- Targets ------------------------------------------------------ + +ALL: \ + ALLTAR \ + $(BIN)$/$(START_SCRIPT) + +.INCLUDE : target.mk + +$(BIN)$/$(START_SCRIPT): $(START_SCRIPT) + @+$(COPY) $(START_SCRIPT) $@ + @+echo $(START_SCRIPT) copied + diff --git a/sal/osl/os2/module.c b/sal/osl/os2/module.c new file mode 100644 index 000000000000..8307cad96d0d --- /dev/null +++ b/sal/osl/os2/module.c @@ -0,0 +1,125 @@ +/************************************************************************* + * + * $RCSfile: module.c,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:17:20 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + + +#include "system.h" + +#include +#include +#include + +/*****************************************************************************/ +/* osl_loadModule */ +/*****************************************************************************/ +oslModule SAL_CALL osl_loadModule(const sal_Char* pszModuleName, sal_Int32 nRtldMode ) +{ + HMODULE hModule; + sal_Char szErrorMessage[ 80 ]; + APIRET rc; + + OSL_ASSERT(pszModuleName); + + rc = DosLoadModule( szErrorMessage, sizeof( szErrorMessage ), + (sal_Char*)pszModuleName, &hModule ); + + if (rc == NO_ERROR ) + return (oslModule)hModule; + else + { + sal_Char szError[ 120 ]; + sprintf( szError, "DosLoadModule (%d): %s\n", rc, szErrorMessage ); + OSL_TRACE(szError); + + return 0; + } +} + +/*****************************************************************************/ +/* osl_unloadModule */ +/*****************************************************************************/ +void SAL_CALL osl_unloadModule(oslModule Module) +{ + OSL_ASSERT(Module); + + DosFreeModule((HMODULE)Module); +} + +/*****************************************************************************/ +/* osl_getSymbol */ +/*****************************************************************************/ +void* SAL_CALL osl_getSymbol(oslModule Module, const sal_Char* pszSymbolName) +{ + PFN pFunction; + APIRET rc; + + OSL_ASSERT(Module); + OSL_ASSERT(pszSymbolName); + + rc = DosQueryProcAddr( (HMODULE) Module, 0, (sal_Char*) pszSymbolName, &pFunction ); + + if( rc == NO_ERROR ) + return (void*)pFunction; + else + return NULL; +} + +/*****************************************************************************/ + diff --git a/sal/osl/os2/mutex.c b/sal/osl/os2/mutex.c new file mode 100644 index 000000000000..946b605984e4 --- /dev/null +++ b/sal/osl/os2/mutex.c @@ -0,0 +1,142 @@ +/************************************************************************* + * + * $RCSfile: mutex.c,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:17:20 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +#include "system.h" + +#include +#include + +/* +#include +#include +#include +*/ + +/* + Implementation notes: + The void* hidden by oslMutex points to a WIN32 + CRITICAL_SECTION structure. +*/ + +/*****************************************************************************/ +/* osl_createMutex */ +/*****************************************************************************/ +oslMutex SAL_CALL osl_createMutex() +{ + HMTX hMutex; + APIRET rc; + + /* create semaphore */ + rc = DosCreateMutexSem( NULL, &hMutex, 0, FALSE ); + if( rc != NO_ERROR ) + return NULL; + + return (oslMutex) hMutex; +} + +/*****************************************************************************/ +/* osl_destroyMutex */ +/*****************************************************************************/ +void SAL_CALL osl_destroyMutex(oslMutex Mutex) +{ + DosCloseMutexSem( (HMTX) Mutex ); +} + +/*****************************************************************************/ +/* osl_acquireMutex */ +/*****************************************************************************/ +sal_Bool SAL_CALL osl_acquireMutex(oslMutex Mutex) +{ + APIRET rc; + OSL_ASSERT(Mutex); + + rc = DosRequestMutexSem( (HMTX) Mutex, SEM_INDEFINITE_WAIT ); + + return( rc == NO_ERROR ); +} + +/*****************************************************************************/ +/* osl_tryToAcquireMutex */ +/*****************************************************************************/ +sal_Bool SAL_CALL osl_tryToAcquireMutex(oslMutex Mutex) +{ + APIRET rc; + OSL_ASSERT(Mutex); + + rc = DosRequestMutexSem( (HMTX) Mutex, SEM_IMMEDIATE_RETURN ); + + return( rc == NO_ERROR ); +} + +/*****************************************************************************/ +/* osl_releaseMutex */ +/*****************************************************************************/ +sal_Bool SAL_CALL osl_releaseMutex(oslMutex Mutex) +{ + APIRET rc; + OSL_ASSERT(Mutex); + + rc = DosReleaseMutexSem( (HMTX) Mutex ); + + return( rc == NO_ERROR ); +} + + diff --git a/sal/osl/os2/process.c b/sal/osl/os2/process.c new file mode 100644 index 000000000000..e0337a533015 --- /dev/null +++ b/sal/osl/os2/process.c @@ -0,0 +1,1320 @@ +/************************************************************************* + * + * $RCSfile: process.c,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:17:20 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +#include "system.h" + +#include +#include + +#include "procimpl.h" +#include "sockimpl.h" +#include "secimpl.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; + + +static sal_Bool InitSessionTerm( void ) +{ + DosCreateQueue( &SessionTermQueue, QUE_FIFO, + (sal_Char *) SessionTermQueueName ); + + return sal_True; +} + + +/*----------------------------------------------------------------------------*/ +/* Pipes! */ +/*----------------------------------------------------------------------------*/ + +static Pipe* openPipe(sal_uInt32 pid) +{ + Pipe* ppipe = 0; + APIRET rc; + HPIPE hPipe; + HMTX hMutex; + sal_Char pipeName[ _MAX_PATH ]; + sal_Char semName[ _MAX_PATH ]; + + if (pid == 0) + { + PTIB pptib = NULL; + PPIB pppib = NULL; + + /* get process ID */ + DosGetInfoBlocks( &pptib, &pppib ); + pid = pppib->pib_ulpid; + + /* build pipe and semaphore names */ + sprintf( pipeName, PIPENAMEMASK, pid ); + sprintf( semName, SEMNAMEMASK, pid ); + + /* open or create semaphore */ + rc = DosCreateMutexSem( semName, &hMutex, 0, FALSE ); + if( rc == ERROR_DUPLICATE_NAME ) + DosOpenMutexSem( semName, &hMutex ); + + rc = DosCreateNPipe( pipeName, /* name of pipe */ + &hPipe, + NP_ACCESS_DUPLEX, /* 2 way pipe */ + 1, /* only 1 instance needed */ + sizeof( Message ), /* OutBufferSize */ + sizeof( Message ), /* InBufferSize */ + 0 ); /* use default timeout */ + if( rc != NO_ERROR ) + return NULL; + + /* connect to open pipe */ + rc = DosConnectNPipe( hPipe ); + if( rc != NO_ERROR ) + { + DosClose( hPipe ); + return NULL; + } + + /* release mutex and remove handle */ + DosReleaseMutexSem( hMutex ); + DosCloseMutexSem( hMutex ); + } + else + { + ULONG ulAction; + + /* build pipe and semaphore names */ + sprintf( pipeName, PIPENAMEMASK, pid ); + sprintf( semName, SEMNAMEMASK, pid ); + + /* open or create semaphore */ + rc = DosCreateMutexSem( semName, &hMutex, 1, FALSE ); + if( rc == ERROR_DUPLICATE_NAME ) + DosOpenMutexSem( semName, &hMutex ); + + /* wait for mutex and remove handle */ + DosRequestMutexSem( hMutex, SEM_INDEFINITE_WAIT ); + DosCloseMutexSem( hMutex ); + + /* open pipe */ + rc = DosOpen( pipeName, /* name of pipe */ + &hPipe, + &ulAction, /* result of DosOpen */ + 0, /* ./. */ + FILE_NORMAL, + OPEN_ACTION_OPEN_IF_EXISTS, + OPEN_ACCESS_READWRITE | + OPEN_SHARE_DENYNONE, + NULL ); /* ./. */ + + /* set mode of pipe (we need message based data transfer) */ + DosSetNPHState( hPipe, NP_READMODE_MESSAGE ); + } + + /* allocate intern pipe structure and store pipe handle */ + ppipe = malloc(sizeof(Pipe)); + ppipe->m_hPipe = hPipe; + + return ppipe; +} + +/*----------------------------------------------------------------------------*/ + +static void closePipe(Pipe* pipe) +{ + /* close pipe */ + if( pipe->m_hPipe != 0 ) + DosClose( pipe->m_hPipe ); + + /* free intern pipe structure */ + free(pipe); +} + +/*----------------------------------------------------------------------------*/ + +/* Callback is called when the socket is closed by the owner */ +static void* socketCloseCallback(void* pArg) +{ + + if (pArg != NULL) + { + oslSocketCallbackArg* callbackArg = (oslSocketCallbackArg*) pArg; + Message msg; + sal_uInt32 nbytes; + + msg.m_Type = MSG_REL; + msg.m_Data = osl_Process_TypeNone; + msg.m_Flags = 0; + msg.m_Value = callbackArg->m_socket; + DosWrite( callbackArg->m_pipe->m_hPipe, &msg, sizeof(msg), &nbytes ); + + if( (DosRead(callbackArg->m_pipe->m_hPipe, &msg, sizeof(msg), &nbytes ) == NO_ERROR) + && (nbytes == sizeof(msg))) + { + if (msg.m_Type == MSG_END) + closePipe(callbackArg->m_pipe); + } + + free (callbackArg); + } + + return NULL; +} + +/*----------------------------------------------------------------------------*/ + +static sal_Bool sendIOResources(Pipe* pipe, oslIOResource ioRes[], HANDLE hChild ) +{ + sal_uInt32 nbytes; + Message msg; + oslIOResource* pIORes = ioRes; + SOCKET socket; + APIRET rc; + HEV hevSocketFreed; + sal_Char szTemp[ 20 ]; + oslSocketCallbackArg* callbackArg; + + /* send messages with resources through pipe */ + while (pIORes->Type != osl_Process_TypeNone) + { + switch (pIORes->Type) + { + /* create message from resource */ + case osl_Process_TypeSocket: + + socket = ((oslSocketImpl *)(pIORes->Descriptor.Socket))->m_Socket; + + ((oslSocketImpl *)(pIORes->Descriptor.Socket))->m_Flags |= OSL_SOCKET_FLAGS_SHARED; + + if (pIORes->Flags & osl_Process_DFWAIT) + { + callbackArg = malloc(sizeof(oslSocketCallbackArg)); + + callbackArg->m_socket = socket; + callbackArg->m_pipe = pipe; + + ((oslSocketImpl *)(pIORes->Descriptor.Socket))->m_CloseCallback = &socketCloseCallback; + ((oslSocketImpl *)(pIORes->Descriptor.Socket))->m_CallbackArg = callbackArg; + + } + + msg.m_Type = MSG_DATA; + msg.m_Data = osl_Process_TypeSocket; + msg.m_Flags = pIORes->Flags; + msg.m_Value = socket; + + OSL_TRACE( "sendIOResources (PTSOCKET): %d\n", socket ); + + /* send message with socket */ + if ( (DosWrite( pipe->m_hPipe, &msg, sizeof(msg), &nbytes ) != NO_ERROR) + || (nbytes != sizeof(msg))) + return sal_False; + + break; + + default: + OSL_TRACE("Not implemented"); + OSL_ASSERT(sal_False); + break; + } + + pIORes++; + } + + /* send MSG_END as end marker */ + msg.m_Type = MSG_END; + msg.m_Data = osl_Process_TypeNone; + DosWrite( pipe->m_hPipe, &msg, sizeof(msg), &nbytes ); + + /* wait for acknoledge from receiver */ + if( (DosRead(pipe->m_hPipe, &msg, sizeof(msg), &nbytes ) == NO_ERROR) + && (nbytes == sizeof(msg)) + && ((msg.m_Type == MSG_ACK) || (msg.m_Type == MSG_END))) + { + if (msg.m_Type == MSG_END) + closePipe(pipe); + + return sal_True; + } + else + { + closePipe(pipe); + + return sal_False; + } +} + +/*----------------------------------------------------------------------------*/ + +oslProcessError SAL_CALL osl_getIOResources(oslIOResource Resources[], sal_uInt32 Max) +{ + oslProcessError ret = osl_Process_E_Unknown; + int wait = 0; + int i = 0; + Message msg; + sal_uInt32 nbytes; + Pipe* pipe; + sal_Char szTemp[ 20 ]; + + /* open pipe (build name from own process ID) */ + pipe = openPipe( 0 ); + + /* get messages with resources from pipe */ + while( i < Max ) + { + /* read until MSG_END received or DosRead failed */ + if ( (DosRead(pipe->m_hPipe, &msg, sizeof(msg), &nbytes ) != NO_ERROR) + || (nbytes < sizeof(msg)) + || (msg.m_Type == MSG_END)) + break; + else + { + /* get resource data from message */ + switch (msg.m_Type) + { + case MSG_DATA: + switch ( msg.m_Data ) + { + case osl_Process_TypeSocket: + { + oslSocketImpl* pSockImpl = __osl_createSocketImpl( (SOCKET)msg.m_Value ); + + OSL_TRACE( "getIOResources (PTSOCKET): %d\n", (SOCKET)msg.m_Value ); + + Resources[i].Type = osl_Process_TypeSocket; + Resources[i].Flags = msg.m_Flags; + Resources[i].Descriptor.Socket = (oslSocket)pSockImpl; + + if (msg.m_Flags & osl_Process_DFWAIT) + wait++; + + i++; + break; + } + + default: + OSL_TRACE("Not implemented"); + OSL_ASSERT(sal_False); + break; + } + } + } + } + + Resources[i].Type = osl_Process_TypeNone; + + if (msg.m_Type == MSG_END) + { + if (wait > 0) + { + msg.m_Type = MSG_ACK; + msg.m_Data = osl_Process_TypeNone; + msg.m_Flags = 0; + DosWrite( pipe->m_hPipe, &msg, sizeof(msg), &nbytes ); + + do + { + if ((! DosRead( pipe->m_hPipe, &msg, sizeof(msg), &nbytes )) + || (nbytes != sizeof(msg)) + || (msg.m_Type != MSG_REL)) + break; + + for (i = 0; Resources[i].Type != osl_Process_TypeNone; i++) + if (((oslSocketImpl *)Resources[i].Descriptor.Socket)->m_Socket + == (SOCKET)msg.m_Value) + { + OSL_ASSERT(Resources[i].Flags & osl_Process_DFWAIT); + + Resources[i].Flags &= ~osl_Process_DFWAIT; + + if (--wait > 0) + { + msg.m_Type = MSG_ACK; + msg.m_Data = osl_Process_TypeNone; + msg.m_Flags = 0; + DosWrite( pipe->m_hPipe, &msg, sizeof(msg), &nbytes ); + } + + break; + } + } + while (wait > 0); + } + + msg.m_Type = MSG_END; + msg.m_Data = osl_Process_TypeNone; + msg.m_Flags = 0; + DosWrite( pipe->m_hPipe, &msg, sizeof(msg), &nbytes ); + + ret = osl_Process_E_None; + } + + closePipe(pipe); + + return ret; +} + +/*----------------------------------------------------------------------------*/ + +oslProcessError SAL_CALL osl_executeProcess(const sal_Char* pszImageName, + const sal_Char* pszArguments[], + oslProcessOption Options, + oslSecurity Security, + const sal_Char* pszDirectory, + const sal_Char* pszEnvironments[], + oslIOResource* pResources, + oslProcess *pProcess) +{ + 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; + + /* get imagename from arg list, if not specified */ + if (pszImageName == NULL) + pszImageName = pszArguments[first++]; + + OSL_ASSERT(pszImageName != NULL); + + /* search imagename on path, if option osl_Process_SEARCHPATH specified */ + if ((Options & osl_Process_SEARCHPATH) && + (osl_searchPath(pszImageName, NULL, '\0', + path, sizeof(path)) == osl_Process_E_None)) + pszImageName = path; + + /* check application type */ + rc = DosQueryAppType( (sal_Char*) 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, 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 */ + osl_getExecutableFile( ownfilename, sizeof( ownfilename )); + DosQueryAppType( ownfilename, &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 = 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 */ + + if( pszEnvironments ) + { + n = 0; + + for (i = 0; pszEnvironments[i] != NULL; i++) + n += strlen(pszEnvironments[i]) + 1; + + /* allocate space for environment */ + + envs = malloc(n + 1); + pStr = envs; + + /* 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'; + } + + /* set end marker for environment */ + *pStr = '\0'; + } else + { + envs = NULL; + } + + 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; + args = malloc(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; + envs = malloc(n + 1); + pStr = 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 */ + } + + /* windows application ? */ + else if( nAppType & ( FAPPTYP_WINDOWSREAL | FAPPTYP_WINDOWSPROT | + FAPPTYP_WINDOWSPROT31 ) ) + { + /* use pszImageName as first argument */ + if( args ) + { + sal_Char* cp = malloc( strlen( pszImageName ) + strlen( args ) + 2 ); + strcpy( cp, pszImageName ); + strcat( cp, " " ); + strcat( cp, args ); + free( args ); + args = cp; + } + else + { + args = strdup( pszImageName ); + } + + /* inherit options from shell */ + SData.InheritOpt = SSF_INHERTOPT_SHELL; + + switch (Options & (osl_Process_NORMAL | osl_Process_MINIMIZED | + osl_Process_MAXIMIZED | osl_Process_FULLSCREEN)) + { + case osl_Process_MINIMIZED: + pszImageName = "WINOS2.COM"; + SData.SessionType = PROG_31_ENHSEAMLESSCOMMON; + SData.PgmControl |= SSF_CONTROL_MINIMIZE; + break; + + case osl_Process_MAXIMIZED: + pszImageName = "WINOS2.COM"; + SData.SessionType = PROG_31_ENHSEAMLESSCOMMON; + SData.PgmControl |= SSF_CONTROL_MAXIMIZE; + break; + + case osl_Process_FULLSCREEN: + pszImageName = "WIN.COM"; + SData.SessionType = SSF_TYPE_VDM; + break; + + default: + pszImageName = "WINOS2.COM"; + SData.SessionType = PROG_31_ENHSEAMLESSCOMMON; + } /* switch */ + + /* call win[os2].com */ + if( osl_searchPath(pszImageName, NULL, '\0', path, + sizeof(path)) == osl_Process_E_None) + pszImageName = path; + + } + + /* dos application */ + else + { + /* inherit options from shell */ + SData.InheritOpt = SSF_INHERTOPT_SHELL; + + switch (Options & (osl_Process_NORMAL | osl_Process_MINIMIZED | + osl_Process_MAXIMIZED | osl_Process_FULLSCREEN)) + { + case osl_Process_MINIMIZED: + SData.SessionType = SSF_TYPE_WINDOWEDVDM; + SData.PgmControl |= SSF_CONTROL_MINIMIZE; + break; + + case osl_Process_MAXIMIZED: + SData.SessionType = SSF_TYPE_WINDOWEDVDM; + SData.PgmControl |= SSF_CONTROL_MAXIMIZE; + break; + + case osl_Process_FULLSCREEN: + SData.SessionType = SSF_TYPE_VDM; + break; + + default: + SData.SessionType = SSF_TYPE_WINDOWEDVDM; + } /* 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 = (sal_Char *) SessionTermQueueName; + } + + SData.FgBg = SSF_FGBG_FORE; /* start session in foreground */ + SData.TraceOpt = SSF_TRACEOPT_NONE; /* No trace */ + + SData.PgmTitle = NULL; + SData.PgmInputs = args; + SData.PgmName = (sal_Char*) pszImageName; + SData.Environment = envs; + + if( Options & osl_Process_HIDDEN ) + SData.PgmControl |= SSF_CONTROL_INVISIBLE; + else + SData.PgmControl |= SSF_CONTROL_VISIBLE; + + SData.ObjectBuffer = (sal_Char*) 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) + free(envs); + if(args) + free(args); + + if( rc != NO_ERROR ) + return osl_Process_E_Unknown; + + } /* else */ + + /* send resources to child process through pipe */ + if (pResources) + { + Pipe* pipe; + pipe = openPipe( pidProcess ); + + sendIOResources(pipe, pResources, 0 ); + } + + /* restore current disk */ + if(nCurrentDisk) + { + DosSetDefaultDisk(nCurrentDisk); + } + + /* restore current drive information */ + if(*currentDir) + { + DosSetCurrentDir(currentDir); + } + + /* allocate intern process structure and store child process ID */ + pProcImpl = malloc(sizeof(oslProcessImpl)); + pProcImpl->pProcess = pidProcess; + pProcImpl->nSessionID = ulSessID; + + pProcImpl->bResultCodeValid = FALSE; + + if( Options & osl_Process_WAIT ) + { + /* process in same session ? */ + if( ulSessID == 0 ) + { + PID pidEnded; + + rc = DosWaitChild( DCWA_PROCESS, DCWW_WAIT, &resultCode, + &pidEnded, pidProcess ); + + if( rc == NO_ERROR ) + { + pProcImpl->nResultCode = resultCode.codeResult; + pProcImpl->bResultCodeValid = TRUE; + } + } + 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 ); + + break; + } + } /* while */ + } + } /* if */ + + *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 = 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; +} + +/*----------------------------------------------------------------------------*/ + +oslProcessError SAL_CALL osl_getExecutableFile(sal_Char* pszBuffer, sal_uInt32 Max) +{ + PTIB pptib = NULL; + PPIB pppib = NULL; + + DosGetInfoBlocks(&pptib, &pppib); + + if( NO_ERROR == DosQueryPathInfo( pppib->pib_pchcmd, FIL_QUERYFULLNAME, pszBuffer, Max ) ) + return osl_Process_E_None; + else + return osl_Process_E_Unknown; +} + +/*----------------------------------------------------------------------------*/ + +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_getEnvironment(const sal_Char* pszName, sal_Char* pszBuffer, sal_uInt32 Max) +{ + sal_Char* pszEnv; + + /* search for environment string and copy value if found */ + if (DosScanEnv((sal_Char*)pszName, &pszEnv) == NO_ERROR) + { + strncpy(pszBuffer, pszEnv, Max); + pszBuffer[Max - 1] = '\0'; + + return osl_Process_E_None; + } + + return osl_Process_E_NotFound; +} + +/*----------------------------------------------------------------------------*/ + +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; +} + +/*----------------------------------------------------------------------------*/ + +oslProcessError SAL_CALL osl_searchPath(const sal_Char* pszName, const sal_Char* pszPath, + sal_Char Separator, sal_Char *pszBuffer, sal_uInt32 Max) +{ + + OSL_ASSERT(pszName != NULL); + + if( (Separator == '\0') || (Separator == ';') ) + { + APIRET rc; + + rc = DosSearchPath( SEARCH_IGNORENETERRS | SEARCH_ENVIRONMENT | SEARCH_CUR_DIRECTORY, + pszPath == NULL ? "PATH" : (sal_Char*) pszPath, + (sal_Char*) pszName, + pszBuffer, Max ); + + return( rc == NO_ERROR ? osl_Process_E_None : osl_Process_E_NotFound ); + } + else + { + sal_Char path[_MAX_PATH]; + sal_Char buffer[_MAX_ENV]; + sal_Char* pszEnv; + + if (pszPath == NULL) + pszPath = "PATH"; + + if (DosScanEnv((sal_Char*)pszPath, &pszEnv) == NO_ERROR) + { + sal_Char *pstr, *pchr = buffer; + + strncpy(buffer, pszEnv, Max); + pszBuffer[Max - 1] = '\0'; + + while (*pchr != '\0') + { + pstr = path; + + while ((*pchr != '\0') && (*pchr != Separator)) + *pstr++ = *pchr++; + + if ((pstr > path) && + ((*(pstr - 1) != ':') && (*(pstr - 1) != '\\'))) + *pstr++ = '\\'; + + *pstr = '\0'; + + strcat(path, pszName); + + if (access(path, 0) == 0) + { + sal_Char* pName; + + if( (DosQueryPathInfo( path, FIL_QUERYFULLNAME, path, sizeof( path ) ) != NO_ERROR ) + || (strlen( path ) >= (size_t)Max) ) + return osl_Process_E_Unknown; + + strcpy(pszBuffer, path); + + return osl_Process_E_None; + } + + if (*pchr == Separator) + pchr++; + } + } + + return osl_Process_E_NotFound; + } + +} + +/*----------------------------------------------------------------------------*/ + + + diff --git a/sal/osl/os2/procimpl.h b/sal/osl/os2/procimpl.h new file mode 100644 index 000000000000..ee4edc329caf --- /dev/null +++ b/sal/osl/os2/procimpl.h @@ -0,0 +1,86 @@ +/************************************************************************* + * + * $RCSfile: procimpl.h,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:17:20 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +#ifndef _OSL_PROCIMPL_H_ +#define _OSL_PROCIMPL_H_ + + +#include + +#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..e405febc25f3 --- /dev/null +++ b/sal/osl/os2/profile.c @@ -0,0 +1,1872 @@ +/************************************************************************* + * + * $RCSfile: profile.c,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:17:20 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +#include "system.h" + +#define min(a,b) (((a) < (b)) ? (a) : (b)) + +#include +#include +#include +#include +#include + +#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) + + +/*****************************************************************************/ +/* 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]; +} 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; + osl_TProfileSection* m_Sections; + HINI m_hIni; +} osl_TProfileImpl; + + +/*****************************************************************************/ +/* Static Module Function Declarations */ +/*****************************************************************************/ + +static osl_TFile* openFile(const sal_Char* pszFilename, sal_Bool bWriteable); +static osl_TStamp closeFile(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); + + + + +/*****************************************************************************/ +/* Exported Module Functions */ +/*****************************************************************************/ + +oslProfile SAL_CALL osl_openProfile(const sal_Char *pszProfileName, sal_uInt32 Flags) +{ + osl_TFile* pFile; + osl_TProfileImpl* pProfile; + sal_Char Filename[_MAX_PATH]; + + if (pszProfileName == NULL) + { + OSL_VERIFY(osl_getProfileName(NULL, NULL, Filename, sizeof(Filename))); + pszProfileName = Filename; + } + + if ((! (Flags & osl_Profile_SYSTEM)) && + ((pFile = openFile(pszProfileName, (Flags & osl_Profile_WRITELOCK) ? sal_True : sal_False)) == NULL)) + return NULL; + + pProfile = (osl_TProfileImpl*)calloc(1, sizeof(osl_TProfileImpl)); + + pProfile->m_Flags = Flags & FLG_USER; + osl_getFullPath(pszProfileName, pProfile->m_Filename, sizeof(pProfile->m_Filename)); + + 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) + closeFile(pFile); + + return pProfile; +} + +sal_Bool SAL_CALL osl_closeProfile(oslProfile Profile) +{ + osl_TProfileImpl* pProfile = (osl_TProfileImpl*)Profile; + + if ( pProfile == 0 ) + { + return sal_False; + } + + if (! (pProfile->m_Flags & osl_Profile_SYSTEM)) + { + if (pProfile->m_Flags & FLG_MODIFIED) + { + if (pProfile->m_pFile == NULL) + pProfile->m_pFile = openFile(pProfile->m_Filename, sal_True); + + storeProfile(pProfile->m_pFile, pProfile, sal_True); + } + + if (pProfile->m_pFile != NULL) + closeFile(pProfile->m_pFile); + } + + pProfile->m_pFile = NULL; + pProfile->m_Filename[0] = '\0'; + + /* 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); + + 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 = acquireProfile(Profile, sal_False); + + if (pProfile == NULL) + 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, (sal_Char*)pszSection, + (sal_Char*)pszEntry, (sal_Char*)pszDefault, + pszString, MaxLen); + + releaseProfile(pProfile); + + if ( pStr == 0 ) + return sal_False ; + + 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]; + + 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; + } + + 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]; + + 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++; + } + } + + 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_uInt32 NoEntry; + const sal_Char* pStr; + sal_Char Line[1024]; + osl_TProfileSection* pSec; + osl_TProfileImpl* pProfile = acquireProfile(Profile, sal_True); + + if (pProfile == NULL) + 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[0], pszSection); + Line[0 + strlen(pszSection)] = ']'; + Line[1 + strlen(pszSection)] = '\0'; + + if (((pStr = addLine(pProfile, Line)) == NULL) || + (! addSection(pProfile, pProfile->m_NoLines - 1, &pStr[1], strlen(pszSection)))) + { + releaseProfile(pProfile); + 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); + 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, (sal_Char*)pszSection, + (sal_Char*)pszEntry, (sal_Char*)pszString); + + return (releaseProfile(pProfile)); +} + + +sal_Bool SAL_CALL osl_writeProfileBool(oslProfile Profile, + const sal_Char* pszSection, const sal_Char* pszEntry, + sal_Bool Value) +{ + if (Value) + return (osl_writeProfileString(Profile, pszSection, pszEntry, STR_INI_BOOLONE)); + else + return (osl_writeProfileString(Profile, pszSection, pszEntry, STR_INI_BOOLZERO)); +} + + +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; + + for (n = 0; Strings[n] != NULL; n++); + + if ((i = Value - FirstId) >= n) + return (sal_False); + else + return (osl_writeProfileString(Profile, pszSection, pszEntry, Strings[i])); +} + + +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 = acquireProfile(Profile, sal_True); + + if (pProfile == NULL) + 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, (sal_Char*)pszSection, (sal_Char*)pszEntry, NULL); + + return (releaseProfile(pProfile)); +} + + +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 = acquireProfile(Profile, sal_False); + + if (pProfile == NULL) + 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, (sal_Char*)pszSection, NULL, NULL, + pszBuffer, MaxLen ); + + releaseProfile(pProfile); + + 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); +} + +sal_Bool SAL_CALL osl_getProfileName(const sal_Char* pszPath, const sal_Char* pszName, + sal_Char* pszBuffer, sal_uInt32 MaxLen) +{ + sal_Bool bFailed; + sal_Char* pStr; + sal_Char File[_MAX_PATH]; + sal_Char Path[_MAX_PATH]; + + Path[0]='\0'; + + /* build file name */ + if (pszName) + { + strcpy(File, pszName); + + /* add default extensiom */ + if (strchr(pszName, '.') == NULL) + strcat(File, STR_INI_EXTENSION); + } + else + { + sal_Char *pChr; + sal_Char ProgName[_MAX_PATH]; + + if (osl_getExecutableFile(ProgName, sizeof(ProgName)) != osl_Process_E_None) + return (sal_False); + + /* remove path from filename */ + if ((pStr = strrchr(ProgName, '\\')) == NULL) + if ((pStr = strrchr(ProgName, ':')) == NULL) + pStr = ProgName; + else + pStr++; + else + pStr++; + + if ((pChr = strrchr(pStr, '.')) != NULL) + *pChr = '\0'; + + strcpy(File, pStr); + strcat(File, STR_INI_EXTENSION); + } + + /* build directory path */ + if (pszPath) + { + if ((strncmp(pszPath, STR_INI_METAHOME, sizeof(STR_INI_METAHOME) - 1) == 0) && + ((pszPath[sizeof(STR_INI_METAHOME) - 1] == '\0') || + (pszPath[sizeof(STR_INI_METAHOME) - 1] == '\\') || + (pszPath[sizeof(STR_INI_METAHOME) - 1] == '/'))) + { + oslSecurity security = osl_getCurrentSecurity(); + bFailed = ! osl_getHomeDir(security, Path, sizeof(Path)); + osl_freeSecurityHandle(security); + + if (bFailed) return (sal_False); + + if ((pszPath[sizeof(STR_INI_METAHOME) - 1] == '/') || + (pszPath[sizeof(STR_INI_METAHOME) - 1] == '\\')) + { + if ((Path[strlen(Path) - 1] != '/') && (Path[strlen(Path) - 1] != '\\')) + strcat(Path, "\\"); + strcat(Path, pszPath + sizeof(STR_INI_METAHOME)); + } + } + else if ((strncmp(pszPath, STR_INI_METACFG, sizeof(STR_INI_METACFG) - 1) == 0) && + ((pszPath[sizeof(STR_INI_METACFG) - 1] == '\0') || + (pszPath[sizeof(STR_INI_METACFG) - 1] == '\\') || + (pszPath[sizeof(STR_INI_METACFG) - 1] == '/'))) + { + oslSecurity security = osl_getCurrentSecurity(); + bFailed = ! osl_getConfigDir(security, Path, sizeof(Path)); + osl_freeSecurityHandle(security); + + if (bFailed) return (sal_False); + + if ((pszPath[sizeof(STR_INI_METACFG) - 1] == '/') || + (pszPath[sizeof(STR_INI_METACFG) - 1] == '\\')) + { + if ((Path[strlen(Path) - 1] != '/') && (Path[strlen(Path) - 1] != '\\')) + strcat(Path, "\\"); + strcat(Path, pszPath + sizeof(STR_INI_METACFG)); + } + } + else if ((strncmp(pszPath, STR_INI_METASYS, sizeof(STR_INI_METASYS) - 1) == 0) && + ((pszPath[sizeof(STR_INI_METASYS) - 1] == '\0') || + (pszPath[sizeof(STR_INI_METASYS) - 1] == '\\') || + (pszPath[sizeof(STR_INI_METASYS) - 1] == '/'))) + { + if (!osl_getSystemDir(Path, sizeof(Path))) + return (sal_False); + + if ((pszPath[sizeof(STR_INI_METASYS) - 1] == '/') || + (pszPath[sizeof(STR_INI_METASYS) - 1] == '\\')) + { + if ((Path[strlen(Path) - 1] != '/') && (Path[strlen(Path) - 1] != '\\')) + strcat(Path, "\\"); + strcat(Path, pszPath + sizeof(STR_INI_METASYS)); + } + } + else if ((strncmp(pszPath, STR_INI_METAINS, sizeof(STR_INI_METAINS) - 1) == 0) && + ((pszPath[sizeof(STR_INI_METAINS) - 1] == '\0') || + (pszPath[sizeof(STR_INI_METAINS) - 1] == '\\') || + (pszPath[sizeof(STR_INI_METAINS) - 1] == '/') || + (pszPath[sizeof(STR_INI_METAINS) - 1] == '"'))) + { + if (! lookupProfile(pszPath + sizeof(STR_INI_METAINS) - 1, File, Path)) + return (sal_False); + } + else + strcpy(Path, pszPath); + + OSL_ASSERT(strlen(Path) <= _MAX_DIR); + } + else + { + oslSecurity security = osl_getCurrentSecurity(); + bFailed = ! osl_getConfigDir(security, Path, sizeof(Path)); + osl_freeSecurityHandle(security); + + if (bFailed) return (sal_False); + } + + + if ( Path[0]!= 0 && (Path[strlen(Path) - 1] != '/') && (Path[strlen(Path) - 1] != '\\')) + { + OSL_ASSERT(strlen(Path) > 0); + strcat(Path, "\\"); + } + + /* append file name */ + strcat(Path, File); + + /* copy filename */ + strncpy(pszBuffer, Path, MaxLen); + pszBuffer[MaxLen - 1] = '\0'; + + return (strlen(Path) < MaxLen); +} + + +/*****************************************************************************/ +/* 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(const sal_Char* pszFilename, sal_Bool bWriteable) +{ + sal_uInt32 action; + APIRET rc; + osl_TFile* pFile = calloc(1, sizeof(osl_TFile)); + + ULONG attributes; + ULONG flags; + ULONG mode; + + 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((sal_Char*)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((sal_Char*)pszFilename, &pFile->m_Handle, &action, 0, flags, attributes, mode, NULL); + } + } + + if ( (rc != NO_ERROR) && bWriteable) + { + free(pFile); + return (NULL); + } + else + { + lockFile(pFile, bWriteable ? write_lock : read_lock); + + pFile->m_pWritePtr = pFile->m_WriteBuf; + pFile->m_pReadPtr = pFile->m_ReadBuf + sizeof(pFile->m_ReadBuf); + + return (pFile); + } +} + +static osl_TStamp closeFile(osl_TFile* pFile) +{ + osl_TStamp stamp = {0, 0}; + + if ( pFile == 0 ) + { + return stamp; + } + + if (pFile->m_Handle) + { + 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); + } + + free(pFile); + + return(stamp); +} + +static sal_Bool rewindFile(osl_TFile* pFile, sal_Bool bTruncate) +{ + if (pFile->m_Handle) + { + sal_uInt32 Position; + + 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) + 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) +{ + int Len = strlen(pszLine); + int Bytes = pFile->m_pWritePtr - pFile->m_WriteBuf; + int Free = sizeof(pFile->m_WriteBuf) - Bytes; + int Max = min(Len, Free); + sal_uInt32 Written; + + if (!pFile->m_Handle) + return (sal_False); + + if ((Len + 2 - Max) > sizeof(pFile->m_WriteBuf)) + { + /* Length of Line could not be splittet into the buffer, + * so flush the buffer and write the line directly + */ + if (DosWrite(pFile->m_Handle, pFile->m_WriteBuf, Bytes, &Written)) + return (sal_False); + pFile->m_pWritePtr = pFile->m_WriteBuf; + if (DosWrite(pFile->m_Handle, (sal_Char*)pszLine, Len, &Written)) + return (sal_False); + } + else + { + /* Copy maximum count of characters to the buffer */ + memcpy(pFile->m_pWritePtr, pszLine, Max); + pFile->m_pWritePtr += Max; + + if ((Free -= Max) <= 1) + { + if (DosWrite(pFile->m_Handle, pFile->m_WriteBuf, sizeof(pFile->m_WriteBuf) - Free, &Written)) + return (sal_False); + pFile->m_pWritePtr = pFile->m_WriteBuf; + } + + if ((Len -= Max) > 0) + { + /* Line does not fit into the free space of the buffer. + * Flush the buffer an copy the remaining part into the + * the buffer. + */ + + memcpy(pFile->m_pWritePtr, pszLine + Max, Len); + pFile->m_pWritePtr += Len; + } + } + *(pFile->m_pWritePtr)++ = '\r'; + *(pFile->m_pWritePtr)++ = '\n'; + return sal_True; +} + +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; + + if (pProfile == NULL) + { + if ((pProfile = osl_openProfile(NULL, bWriteable ? + osl_Profile_DEFAULT : (osl_Profile_DEFAULT | osl_Profile_WRITELOCK))) + != NULL) + pProfile->m_Flags |= FLG_AUTOOPEN; + } + else + { + if (! (pProfile->m_Flags & osl_Profile_SYSTEM)) + { + if (! (pProfile->m_Flags & (osl_Profile_READLOCK | osl_Profile_WRITELOCK))) + { + osl_TStamp Stamp; + + if (! (pProfile->m_pFile = openFile(pProfile->m_Filename, bWriteable))) + 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 + /* A readlock file could not be written */ + if ((pProfile->m_Flags & osl_Profile_READLOCK) && bWriteable) + return (NULL); + } + else + { + /* hack: usualy you have a specific HAB, but NULL works here... */ + pProfile->m_hIni = PrfOpenProfile(NULL, pProfile->m_Filename); + if (! pProfile->m_hIni) + return (NULL); + } + + } + + return (pProfile); +} + +static sal_Bool releaseProfile(osl_TProfileImpl* pProfile) +{ + if ( pProfile == 0 ) + { + return sal_False; + } + + if (! (pProfile->m_Flags & osl_Profile_SYSTEM)) + { + if (pProfile->m_Flags & FLG_AUTOOPEN) + return (osl_closeProfile((oslProfile)pProfile)); + else + { + if (! (pProfile->m_Flags & (osl_Profile_READLOCK | osl_Profile_WRITELOCK))) + { + if (pProfile->m_Flags & FLG_MODIFIED) + storeProfile(pProfile->m_pFile, pProfile, sal_False); + + closeFile(pProfile->m_pFile); + pProfile->m_pFile = NULL; + } + } + } + else + PrfCloseProfile(pProfile->m_hIni); + + return (sal_True); +} + +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); +} + + + + + + diff --git a/sal/osl/os2/secimpl.h b/sal/osl/os2/secimpl.h new file mode 100644 index 000000000000..8e85b41adf66 --- /dev/null +++ b/sal/osl/os2/secimpl.h @@ -0,0 +1,96 @@ +/************************************************************************* + * + * $RCSfile: secimpl.h,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:17:20 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +#ifndef _OSL_SECURITYIMPL_H_ +#define _OSL_SECURITYIMPL_H_ + +#include + +#define USER_BUFFER_SIZE 256 +#define DIRECTORY_BUFFER_SIZE 260 +#define DOMAIN_BUFFER_SIZE 260 + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct _oslSecurityImpl { + HANDLE m_hToken; + sal_Char m_User[USER_BUFFER_SIZE]; + sal_Char m_Domain[DOMAIN_BUFFER_SIZE]; + sal_Char m_Directory[DIRECTORY_BUFFER_SIZE]; + sal_uInt16 nLogon; +} oslSecurityImpl; + + +sal_Bool SAL_CALL osl_getSystemDir(sal_Char* pszDirectory, sal_uInt32 nMax); + +void ImplFreeUPM( void ); + +#ifdef __cplusplus +} +#endif + +#endif + + + + diff --git a/sal/osl/os2/security.c b/sal/osl/os2/security.c new file mode 100644 index 000000000000..0e9a0f8e5193 --- /dev/null +++ b/sal/osl/os2/security.c @@ -0,0 +1,371 @@ +/************************************************************************* + * + * $RCSfile: security.c,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:17:20 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +#include "system.h" + +#include +#include +#include + +#include "secimpl.h" + +/*----------------------------------------------------------------------------*/ + +#define PURE_32 +#include "UPM.H" + +typedef LSINT (APIENTRY fptr_U32EULGN) ( + unsigned char*, + unsigned char*, + unsigned char*, + unsigned long, + unsigned long ); + +typedef LSINT (APIENTRY fptr_U32EULGF) ( + unsigned char*, + unsigned char*, + unsigned long ); + +/* netcons.h */ +#define UNLEN 20 + +/*----------------------------------------------------------------------------*/ + +static HMODULE hUPM32DLL = 0; + +static fptr_U32EULGN* pfU32EULGN = 0; +static fptr_U32EULGF* pfU32EULGF = 0; + +/*----------------------------------------------------------------------------*/ + +sal_Bool ImplLoadUPM( void ) +{ + APIRET nRet; + + /* load UPM.DLL */ + nRet = DosLoadModule ((PSZ)0, 0, "UPM32", &hUPM32DLL); + if( hUPM32DLL == NULL ) + { + OSL_TRACE( "UPM32.DLL not found: %d\n", nRet ); + return sal_False; + } + + OSL_TRACE( "UPM32.DLL geladen!\n"); + + /* Load function pointer */ + nRet = DosQueryProcAddr(hUPM32DLL, 0, "U32EULGN", (PFN*)&pfU32EULGN); + nRet += DosQueryProcAddr(hUPM32DLL, 0, "U32EULGF", (PFN*)&pfU32EULGF); + + if (nRet) + { + OSL_TRACE( "Some functions not found; UPM32.DLL freed.\n" ); + ImplFreeUPM(); + return sal_False; + } + + return sal_True; +} + +/*----------------------------------------------------------------------------*/ + +#ifndef GCC +void ImplFreeUPM( void ) +{ + if( hUPM32DLL != 0 ) + { + OSL_TRACE( "UPM32.DLL entladen!\n"); + + DosFreeModule( hUPM32DLL ); + hUPM32DLL = 0; + } +} +#endif + +/*----------------------------------------------------------------------------*/ + + +oslSecurity SAL_CALL osl_getCurrentSecurity() +{ + static oslSecurityImpl currentSecurity = {(HANDLE)-1, "", "", "", 0}; + + if (currentSecurity.m_hToken == (HANDLE)-1) + { + currentSecurity.m_hToken = (HANDLE)NULL; + osl_getSystemDir(currentSecurity.m_Directory, sizeof(currentSecurity.m_Directory)); + } + + return (¤tSecurity); +} + +/*----------------------------------------------------------------------------*/ + +oslSecurityError SAL_CALL osl_loginUser(const sal_Char* pszUserName, const sal_Char* pszPasswd, + oslSecurity* pSecurity) +{ + sal_Char* pszUser; + sal_Char* pszDomain = strdup( pszUserName ); + sal_Char* pszPassword = strdup( pszPasswd ); + APIRET nRet; + int nResult; + oslSecurityError erg = osl_Security_E_None; + oslSecurityImpl* pSecImpl = malloc(sizeof(oslSecurityImpl)); + sal_uInt16 nLogonFlag; + + /* load UPM module */ + if( !hUPM32DLL ) + if( !ImplLoadUPM() ) + { + free( pszPassword ); + free( pszDomain ); + return osl_Security_E_UserUnknown; + } + + /* extract domainname from username */ + if (pszUser = strchr(pszDomain, '/')) + { + *pszUser++ = '\0'; + + OSL_TRACE( "Logon %s (%s)\n", pszUser, pszDomain ); + + pSecImpl->nLogon = UPM_DOMAIN; + nLogonFlag = UPM_FL_DOMVER; + } + else + { + pszUser = pszDomain; + pszDomain = NULL; + + OSL_TRACE( "Logon %s\n", pszUser ); + + pSecImpl->nLogon = UPM_LOCAL; + nLogonFlag = UPM_FL_LOCVER; + } + + /* password must be UPPERCASE */ + strupr( pszPassword ); + + nResult = pfU32EULGN( (sal_uChar*) pszUser, + (sal_uChar*) pszPassword, + (sal_uChar*) pszDomain, + pSecImpl->nLogon, + nLogonFlag ); + + if( (nResult == UPM_OK) || (nResult == -1262) ) /* UPM_LOGGED = 0xFB12 */ + { + erg = osl_Security_E_None; + + OSL_TRACE( "logon %s (pfU32EULGF): %d\n", pszUserName, nResult ); + + /* save username */ + strncpy( pSecImpl->m_User, pszUser, USER_BUFFER_SIZE ); + pSecImpl->m_User[ USER_BUFFER_SIZE - 1 ] = 0; + + /* save domainname */ + if( pszDomain ) + { + strncpy( pSecImpl->m_Domain, pszDomain, DOMAIN_BUFFER_SIZE ); + pSecImpl->m_Domain[ DOMAIN_BUFFER_SIZE - 1 ] = 0; + } + + /* use default home directory */ + strcpy( pSecImpl->m_Directory, "." ); + } + else + { + OSL_TRACE( "pfU32EULGN failed: %d\n", nResult ); + erg = osl_Security_E_UserUnknown; + } + + if( osl_Security_E_None == erg ) + *pSecurity = (oslSecurity)pSecImpl; + else + { + *pSecurity = NULL; + free( pSecImpl ); + } + + free( pszPassword ); + free( pszDomain ); + + return erg; +} + +/*----------------------------------------------------------------------------*/ + +sal_Bool SAL_CALL osl_getUserIdent(oslSecurity Security, sal_Char *pszIdent, sal_uInt32 nMax) +{ + return sal_False; +} + +/*----------------------------------------------------------------------------*/ + +sal_Bool SAL_CALL osl_getUserName(oslSecurity Security, sal_Char* pszName, sal_uInt32 nMax) +{ + if (Security == NULL) + return sal_False; + + strncpy(pszName, ((oslSecurityImpl*)Security)->m_User, nMax); + pszName[ nMax - 1 ] = 0; + + OSL_TRACE( "osl_getUserName (%s)\n", pszName ); + + return sal_True; +} + +/*----------------------------------------------------------------------------*/ + +sal_Bool SAL_CALL osl_getHomeDir(oslSecurity Security, sal_Char* pszDirectory, sal_uInt32 nMax) +{ + if (Security == NULL) + return sal_False; + + strncpy(pszDirectory, ((oslSecurityImpl*)Security)->m_Directory, nMax); + + OSL_TRACE( "osl_getHomeDir (%s)\n", pszDirectory ); + + return sal_True; +} + +/*----------------------------------------------------------------------------*/ + +sal_Bool SAL_CALL osl_getSystemDir(sal_Char* pszDirectory, sal_uInt32 nMax) +{ + ULONG driveBuffer; + APIRET apiret = DosQuerySysInfo(QSV_BOOT_DRIVE, QSV_BOOT_DRIVE, &driveBuffer, sizeof(driveBuffer)); + + if ((apiret != NO_ERROR) || (nMax <= strlen("c:\\OS2"))) + return (sal_False); + + pszDirectory[0] = 'A' + (driveBuffer - 1); + sprintf(pszDirectory + 1, ":\\OS2"); +} + +sal_Bool SAL_CALL osl_getConfigDir(oslSecurity Security, sal_Char* pszDirectory, sal_uInt32 nMax) +{ + if (Security == NULL) + return sal_False; + + strncpy(pszDirectory, ((oslSecurityImpl*)Security)->m_Directory, nMax); + + OSL_TRACE( "osl_getConfigDir (%s)\n", pszDirectory ); + + return sal_True; +} + +/*----------------------------------------------------------------------------*/ + +void SAL_CALL osl_freeSecurityHandle(oslSecurity Security) +{ + if (Security != osl_getCurrentSecurity()) + { + oslSecurityImpl* pSecImpl = (oslSecurityImpl*)Security; + + if( pSecImpl ) + { + if( hUPM32DLL ) + { + int nResult; + + /* logout user */ + nResult = pfU32EULGF( (sal_uChar*) pSecImpl->m_User, + pSecImpl->nLogon == UPM_DOMAIN + ? (sal_uChar*) pSecImpl->m_Domain + : NULL, + pSecImpl->nLogon ); + OSL_TRACE( "logoff %s (pfU32EULGF): %d\n", pSecImpl->m_User, nResult ); + } + + free ((oslSecurityImpl*)Security); + } + } +} + +/*----------------------------------------------------------------------------*/ + +oslSecurityError SAL_CALL osl_loginUserOnFileServer( const sal_Char* pszUserName, + const sal_Char* pszPasswd, + const sal_Char* pszFileServer, + oslSecurity* pSecurity) +{ + return osl_Security_E_UserUnknown; +} + +/*----------------------------------------------------------------------------*/ + +sal_Bool SAL_CALL osl_isAdministrator(oslSecurity Security) +{ + return sal_True; +} + +/*----------------------------------------------------------------------------*/ + +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..30939c7cedd2 --- /dev/null +++ b/sal/osl/os2/semaphor.c @@ -0,0 +1,218 @@ +/************************************************************************* + * + * $RCSfile: semaphor.c,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:17:20 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +#include "system.h" + +#include +#include + +/* + Implemetation notes: + The void* represented by oslSemaphore is used + to store a OS/2 HANDLE. +*/ + +typedef struct _oslSemaphoreImpl +{ + int nCount; + HEV hevReachedZero; +} oslSemaphoreImpl; + +/*****************************************************************************/ +/* 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 = 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; + + 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); + + DosEnterCritSec(); + + while( pSemaphoreImpl->nCount < 1 ) + { + sal_uInt32 nPostCount; + + DosExitCritSec(); + + rc = DosWaitEventSem(pSemaphoreImpl->hevReachedZero, SEM_INDEFINITE_WAIT ); + DosResetEventSem(pSemaphoreImpl->hevReachedZero, &nPostCount); + + DosEnterCritSec(); + } + + pSemaphoreImpl->nCount--; + DosExitCritSec(); + + 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); + + DosEnterCritSec(); + + nCount = pSemaphoreImpl->nCount; + if( pSemaphoreImpl->nCount > 0 ) + pSemaphoreImpl->nCount--; + + DosExitCritSec(); + + 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); + + DosEnterCritSec(); + + nCount = pSemaphoreImpl->nCount; + pSemaphoreImpl->nCount++; + + DosExitCritSec(); + + 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..97ebb810fced --- /dev/null +++ b/sal/osl/os2/signal.c @@ -0,0 +1,272 @@ +/************************************************************************* + * + * $RCSfile: signal.c,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:17:20 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + + +/* system headers */ +#include "system.h" + +#include +#include +#include + +typedef struct _oslSignalHandlerImpl +{ + oslSignalHandlerFunction Handler; + void* pData; + struct _oslSignalHandlerImpl* pNext; +} oslSignalHandlerImpl; + +static sal_Bool bInitSignal = sal_False; +static oslMutex SignalListMutex; +static oslSignalHandlerImpl* SignalList; + +/*static*//* ULONG _Export APIENTRY SignalHandlerFunction(PEXCEPTIONREPORTRECORD pERepRec, + PEXCEPTIONREGISTRATIONRECORD, + PCONTEXTRECORD, PVOID); +*/ +/*static*/ ULONG 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 /*_Export*/ 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 = 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); +} + + diff --git a/sal/osl/os2/socket.c b/sal/osl/os2/socket.c new file mode 100644 index 000000000000..519641eb653a --- /dev/null +++ b/sal/osl/os2/socket.c @@ -0,0 +1,68 @@ +/************************************************************************* + * + * $RCSfile: socket.c,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:17:20 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +#ifdef GCC +#include "socket.gcc.c" +#else +#include "socket.icc.c" +#endif + + diff --git a/sal/osl/os2/sockimpl.h b/sal/osl/os2/sockimpl.h new file mode 100644 index 000000000000..6bd07a9c52c2 --- /dev/null +++ b/sal/osl/os2/sockimpl.h @@ -0,0 +1,101 @@ +/************************************************************************* + * + * $RCSfile: sockimpl.h,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:17:20 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + + +#ifndef _OSL_SOCKETIMPL_H_ +#define _OSL_SOCKETIMPL_H_ + +/* SocketImpl + + @author Bernd Hofner + @version 1.0 +*/ + +#include + +sal_Bool ImplLoadTCPIP( void ); +void ImplFreeTCPIP( void ); + +#ifdef __cplusplus +extern "C" { +#endif + +#define OSL_SOCKET_FLAGS_NONBLOCKING 0x0001 +#define OSL_SOCKET_FLAGS_SHARED 0x0002 + +typedef void* (*oslCloseCallback) (void*); + +typedef struct _oslSocketImpl { + SOCKET m_Socket; + int m_Flags; + oslCloseCallback m_CloseCallback; + void* m_CallbackArg; +} oslSocketImpl; + +oslSocketImpl* __osl_createSocketImpl(SOCKET Socket); +void __osl_destroySocketImpl(oslSocketImpl *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..9229fdbfab9e --- /dev/null +++ b/sal/osl/os2/system.h @@ -0,0 +1,147 @@ +/************************************************************************* + * + * $RCSfile: system.h,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:17:20 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +/* toolkit header */ + +#define BSD_SELECT + +#ifdef GCC +#include +#else +#include +#endif +#include +#include +#include +#include +#include +/* +#include +#include +#include +#include +#include +#include +*/ +/* 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 + +/* compiler header */ + +#include +#include +#include +#include +#include +#include +#include +#include + + +/* no header file - defined in the runtime startup code */ +int _CRT_init(void); + +/* BEGIN HACK */ +/* dummy define and declarations for IPX should be replaced by */ +/* original ipx headers when these are available for this platform */ + +typedef struct sockaddr_ipx { + short sa_family; + 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 + +#define AF_IPX AF_NS /* IPX protocols: IPX, SPX, etc. */ + +#define WSAEDISCON (WSABASEERR+101) + +/* END HACK */ + +#define HANDLE ULONG + +#define SOCKET int + +#define TCP_NODELAY 0x01 /* don't delay send to coalesce packets */ + +#define _MAX_ENV 2048 +#define _MAX_CMD 2048 + +# define PTR_SIZE_T(s) ((int *)&(s)) +# define PTR_FD_SET(s) ((int *)&(s)) + + diff --git a/sal/osl/os2/thread.c b/sal/osl/os2/thread.c new file mode 100644 index 000000000000..fb899ec93ee4 --- /dev/null +++ b/sal/osl/os2/thread.c @@ -0,0 +1,702 @@ +/************************************************************************* + * + * $RCSfile: thread.c,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:17:20 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + + +#include "system.h" + +#include +#include + +/* + 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 + +HAB osl_getPMinternal_HAB(oslThread hThread) +{ + osl_TThreadImpl* pThreadImpl= (osl_TThreadImpl*)hThread; + + if(pThreadImpl == NULL) /* valid ptr? */ + { + return NULL; + } + else + {o + 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 _Optlink oslWorkerWrapperFunction(void* pData) +{ + osl_TThreadImpl* pThreadImpl= (osl_TThreadImpl*)pData; + + /* Inizialize PM for this thread */ + pThreadImpl->m_hab = WinInitialize( 0 ); + pThreadImpl->m_hmq = WinCreateMsgQueue( pThreadImpl->m_hab, 0 ); + + /* call worker-function with data */ + pThreadImpl->m_WorkerFunction( pThreadImpl->m_pData ); + + /* Free all PM-resources for this thread */ + WinDestroyMsgQueue( pThreadImpl->m_hmq ); + WinTerminate( pThreadImpl->m_hab ); +} + + +/*****************************************************************************/ +/* oslCreateThread */ +/*****************************************************************************/ +static oslThread oslCreateThread(oslWorkerFunction pWorker, + void* pThreadData, + sal_Bool nFlags) +{ + osl_TThreadImpl* pThreadImpl; + + /* alloc mem. for our internal data structure */ + pThreadImpl = 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; + + if ( nFlags == sal_True ) + { + DosEnterCritSec(); + } + + pThreadImpl->m_ThreadId = (TID) _beginthread( oslWorkerWrapperFunction, /* worker-function */ + NULL, /* unused parameter */ + 1024000, /* max. Stacksize */ + pThreadImpl ); + if ( nFlags == sal_True ) + { + if( pThreadImpl->m_ThreadId != -1 ) + DosSuspendThread( pThreadImpl->m_ThreadId ); + DosExitCritSec(); + } + + 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_sleepThread */ +/*****************************************************************************/ +oslThreadSleep SAL_CALL osl_sleepThread(oslThread Thread, const TimeValue* pDelay) +{ + TID tidCurrentThread; + APIRET rc; + ULONG ulPostCount; + int millisecs; + + osl_TThreadImpl* pThreadImpl= (osl_TThreadImpl*)Thread; + + OSL_ASSERT(pDelay); + + /* invalid arguments?*/ + if(pThreadImpl==0 || pThreadImpl->m_ThreadId==-1) + return osl_Thread_SleepError; + + if (pThreadImpl->m_Flags & THREADIMPL_FLAGS_SLEEP) + return osl_Thread_SleepActive; + + DosEnterCritSec(); + + if (pThreadImpl->m_hEvent == 0) + rc = DosCreateEventSem( NULL, /* unnamed semaphore */ + &pThreadImpl->m_hEvent, /* pointer to variable */ + /* for the sem-handle */ + DC_SEM_SHARED, /* shared semaphore */ + FALSE ); /* initial state is posted */ + else + DosResetEventSem(pThreadImpl->m_hEvent, &ulPostCount); + + /* get thread ID */ + { + PTIB pptib = NULL; + PPIB pppib = NULL; + + DosGetInfoBlocks( &pptib, &pppib ); + tidCurrentThread = pptib->tib_ptib2->tib2_ultid; + } + + millisecs = pDelay->Seconds * 1000 + pDelay->Nanosec / 1000000; + + if (pThreadImpl->m_ThreadId == tidCurrentThread) + { + pThreadImpl->m_Timeout = 0; + pThreadImpl->m_Flags |= THREADIMPL_FLAGS_SLEEP; + + DosExitCritSec(); + + rc = DosWaitEventSem(pThreadImpl->m_hEvent, millisecs); + + DosEnterCritSec(); + + pThreadImpl->m_Flags &= ~THREADIMPL_FLAGS_SLEEP; + + DosExitCritSec(); + + return (rc == ERROR_TIMEOUT) ? osl_Thread_SleepNormal : + osl_Thread_SleepCancel; + } + else + { + pThreadImpl->m_Timeout = millisecs; + pThreadImpl->m_Flags |= THREADIMPL_FLAGS_SLEEP; + + DosExitCritSec(); + + return osl_Thread_SleepPending; + } +} + +/*****************************************************************************/ +/* osl_awakeThread */ +/*****************************************************************************/ +sal_Bool SAL_CALL osl_awakeThread(oslThread Thread) +{ + osl_TThreadImpl* pThreadImpl= (osl_TThreadImpl*)Thread; + + /* invalid arguments?*/ + if (pThreadImpl==0 || pThreadImpl->m_ThreadId==-1) + { + /* assume thread is not running */ + return sal_False; + } + + DosEnterCritSec(); + + if (pThreadImpl->m_Flags & THREADIMPL_FLAGS_SLEEP) + { + DosPostEventSem(pThreadImpl->m_hEvent); + + DosExitCritSec(); + return sal_True; + } + else + { + DosExitCritSec(); + return sal_True; + } +} + +/*****************************************************************************/ +/* 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; + } + + DosEnterCritSec(); + pThreadImpl->m_Flags |= THREADIMPL_FLAGS_TERMINATE; + DosExitCritSec(); +} + + +/*****************************************************************************/ +/* 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); + + DosEnterCritSec(); + + pThreadImpl->m_Timeout = 0; + + pThreadImpl->m_Flags &= ~THREADIMPL_FLAGS_SLEEP; + + DosExitCritSec(); + } + + return ((pThreadImpl->m_Flags & THREADIMPL_FLAGS_TERMINATE) == 0); +} + +/*****************************************************************************/ +/* osl_yieldThread */ +/*****************************************************************************/ +void SAL_CALL osl_yieldThread() +{ + DosSleep(0); +} + +/*****************************************************************************/ +/* osl_createThreadKey */ +/*****************************************************************************/ +oslThreadKey SAL_CALL osl_createThreadKey(void) +{ + PULONG ptr; + + if (DosAllocThreadLocalMemory(1, &ptr) != NO_ERROR) + ptr = NULL; + else + *ptr = 0L; + + return ((oslThreadKey)ptr); +} + +/*****************************************************************************/ +/* osl_destroyThreadKey */ +/*****************************************************************************/ +void SAL_CALL osl_destroyThreadKey(oslThreadKey Key) +{ + if (Key != 0L) + DosFreeThreadLocalMemory((PULONG)Key); +} + +/*****************************************************************************/ +/* osl_getThreadKeyData */ +/*****************************************************************************/ +void * SAL_CALL osl_getThreadKeyData(oslThreadKey Key) +{ + if (Key != 0L) + return ((void *)*((PULONG)Key)); + + return (NULL); +} + +/*****************************************************************************/ +/* osl_setThreadKeyData */ +/*****************************************************************************/ +sal_Bool SAL_CALL osl_setThreadKeyData(oslThreadKey Key, void *pData) +{ + if (Key != 0L) + return *((PULONG)Key) = (ULONG)pData; + + return (sal_False); +} + + + diff --git a/sal/osl/os2/time.c b/sal/osl/os2/time.c new file mode 100644 index 000000000000..d8a641dbd249 --- /dev/null +++ b/sal/osl/os2/time.c @@ -0,0 +1,90 @@ +/************************************************************************* + * + * $RCSfile: time.c,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:17:20 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + + +#include "system.h" + +#include +#include + +/*----------------------------------------------------------------------------*/ + +sal_Bool SAL_CALL osl_getSystemTime(TimeValue* TimeValue) +{ + ULONG SysVar[ 2 ]; + + /* get system data */ + DosQuerySysInfo( QSV_MS_COUNT, /* startindex: 14 -> SysVar[ 0 ] */ + QSV_TIME_LOW, /* endindex: 15 -> SysVar[ 1 ] */ + &SysVar, /* buffer */ + sizeof( SysVar ) ); + + /* copy 'seconds since 1.1.1970' from buffer */ + TimeValue->Seconds = SysVar[ 1 ]; + + /* use remider of 'milliseconds since system' startup for nanoseconds */ + TimeValue->Nanosec = (SysVar[ 0 ] % 1000) * 1000000; + + return (sal_True); +} + +/*----------------------------------------------------------------------------*/ + diff --git a/sal/osl/os2/util.c b/sal/osl/os2/util.c new file mode 100644 index 000000000000..2b5bd3602498 --- /dev/null +++ b/sal/osl/os2/util.c @@ -0,0 +1,76 @@ +/************************************************************************* + * + * $RCSfile: util.c,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:17:20 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +#include "osl/util.h" + + + +extern sal_Bool osl_getEtherAddr(sal_Char* pszAddr, sal_uInt16 BufferSize) +{ + return sal_False; +} + +extern sal_Bool osl_getEthernetAddress( sal_uInt8 * pTargetAddress ) +{ + return sal_False; +} + + diff --git a/sal/osl/unx/conditn.c b/sal/osl/unx/conditn.c new file mode 100644 index 000000000000..39ed19f11081 --- /dev/null +++ b/sal/osl/unx/conditn.c @@ -0,0 +1,394 @@ +/************************************************************************* + * + * $RCSfile: conditn.c,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:17:20 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + + +#include "system.h" + +#include +#include +#include + + +/* + The void* oslCondition is used as a pointer to a TCondition + struct. +*/ + +typedef struct _TCondition +{ + pthread_cond_t m_Condition; + pthread_mutex_t m_Lock; + sal_Bool m_State; +} TCondition; + +/*****************************************************************************/ +/* osl_createCondition */ +/*****************************************************************************/ +oslCondition SAL_CALL osl_createCondition() +{ + TCondition* pCond; + int nRet=0; + + pCond = (TCondition*) malloc(sizeof(TCondition)); + + 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) +{ + TCondition* pCond; + int nRet = 0; + + if ( Condition ) + { + pCond = (TCondition*)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) +{ + TCondition* pCond; + int nRet=0; + + OSL_ASSERT(Condition); + pCond = (TCondition*)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) +{ + TCondition* pCond; + int nRet=0; + + OSL_ASSERT(Condition); + + pCond = (TCondition*)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_cond_broadcast(&pCond->m_Condition); + if ( nRet != 0 ) + { + OSL_TRACE("osl_resetCondition : 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_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) +{ + TCondition* pCond; + int nRet=0; + oslConditionResult Result = osl_cond_result_ok; + + OSL_ASSERT(Condition); + pCond = (TCondition*)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; + } + + while ( ! pCond->m_State ) + { + if ( pTimeout ) + { + int ret; + struct timeval tp; + struct timespec to; + int nOk=0; + + gettimeofday(&tp, NULL); + + SET_TIMESPEC( to, tp.tv_sec + pTimeout->Seconds, + tp.tv_usec * 1000 + pTimeout->Nanosec ); + + while ( nOk == 0 ) + { + 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");*/ + } + else + { + nOk=1; + } + } + } + else + { + 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; + TCondition* pCond; + int nRet=0; + + OSL_ASSERT(Condition); + pCond = (TCondition*)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..2166944cf577 --- /dev/null +++ b/sal/osl/unx/diagnose.c @@ -0,0 +1,133 @@ +/************************************************************************* + * + * $RCSfile: diagnose.c,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:17:21 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + + +#include "system.h" + +#include + +/* + Trace output +*/ + +void SAL_CALL osl_breakDebug() +{ + exit(0); +} + +void SAL_CALL osl_trace(const sal_Char* lpszFormat, ...) +{ + va_list args; + + va_start(args, lpszFormat); + + fprintf(stderr,"Trace Message : "); + + vfprintf(stderr,lpszFormat, args); + + fprintf(stderr,"\n"); + + va_end(args); +} + +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 */ +#ifdef S390 + if(pszMessage != 0) + { + s390_printf( "Assertion Failed: %s: File %s, Line %d: %s", + lpszAppName, pszFileName, nLine, pszMessage); + } else { + s390_printf( "Assertion Failed: %s: File %s, Line %d:\n", + lpszAppName, pszFileName, nLine); + } +#else + if(pszMessage != 0) + { + sprintf(szMessage, "Assertion Failed: %s: File %s, Line %lu: %s", + lpszAppName, pszFileName, nLine, pszMessage); + } else { + sprintf(szMessage, "Assertion Failed: %s: File %s, Line %lu:\n", + lpszAppName, pszFileName, nLine); + } + szMessage[sizeof(szMessage)-1] = '\0'; + fputs(szMessage, stderr); +#endif + + return sal_False; /* no abort */ +} + +sal_Int32 SAL_CALL osl_reportError(sal_uInt32 nType, const sal_Char* pszMessage) +{ +#ifdef S390 + s390_printf( pszMessage ); +#else + fputs(pszMessage, stderr); +#endif + return 0; +} + diff --git a/sal/osl/unx/interlck.c b/sal/osl/unx/interlck.c new file mode 100644 index 000000000000..380dada62ba1 --- /dev/null +++ b/sal/osl/unx/interlck.c @@ -0,0 +1,97 @@ +/************************************************************************* + * + * $RCSfile: interlck.c,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:17:21 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + + +#include "system.h" + +#include +#include + +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); +} + diff --git a/sal/osl/unx/makefile.mk b/sal/osl/unx/makefile.mk new file mode 100644 index 000000000000..55f7b94928bf --- /dev/null +++ b/sal/osl/unx/makefile.mk @@ -0,0 +1,151 @@ +#************************************************************************* +# +# $RCSfile: makefile.mk,v $ +# +# $Revision: 1.1.1.1 $ +# +# last change: $Author: hr $ $Date: 2000-09-18 15:17:20 $ +# +# The Contents of this file are made available subject to the terms of +# either of the following licenses +# +# - GNU Lesser General Public License Version 2.1 +# - Sun Industry Standards Source License Version 1.1 +# +# Sun Microsystems Inc., October, 2000 +# +# GNU Lesser General Public License Version 2.1 +# ============================================= +# Copyright 2000 by Sun Microsystems, Inc. +# 901 San Antonio Road, Palo Alto, CA 94303, USA +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License version 2.1, as published by the Free Software Foundation. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, +# MA 02111-1307 USA +# +# +# Sun Industry Standards Source License Version 1.1 +# ================================================= +# The contents of this file are subject to the Sun Industry Standards +# Source License Version 1.1 (the "License"); You may not use this file +# except in compliance with the License. You may obtain a copy of the +# License at http://www.openoffice.org/license.html. +# +# Software provided under this License is provided on an "AS IS" basis, +# WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, +# WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, +# MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. +# See the License for the specific provisions governing your rights and +# obligations concerning the Software. +# +# The Initial Developer of the Original Code is: Sun Microsystems, Inc. +# +# Copyright: 2000 by Sun Microsystems, Inc. +# +# All Rights Reserved. +# +# Contributor(s): _______________________________________ +# +# +# +#************************************************************************* + +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 : svpre.mk +.INCLUDE : settings.mk +.INCLUDE : sv.mk + +# --- Files -------------------------------------------------------- + +START_SCRIPT = sdaemon.sh + +SLOFILES= $(SLO)$/conditn.obj \ + $(SLO)$/diagnose.obj \ + $(SLO)$/semaphor.obj \ + $(SLO)$/socket.obj \ + $(SLO)$/interlck.obj \ + $(SLO)$/mutex.obj \ + $(SLO)$/thread.obj \ + $(SLO)$/module.obj \ + $(SLO)$/process.obj \ + $(SLO)$/security.obj \ + $(SLO)$/profile.obj \ + $(SLO)$/time.obj \ + $(SLO)$/daemon.obj \ + $(SLO)$/file.obj \ + $(SLO)$/signal.obj \ + $(SLO)$/pipe.obj \ + $(SLO)$/system.obj \ + $(SLO)$/channel.obj \ + $(SLO)$/util.obj \ + $(SLO)$/ports.obj + +#.IF "$(UPDATER)"=="YES" +OBJFILES= $(OBJ)$/conditn.obj \ + $(OBJ)$/diagnose.obj \ + $(OBJ)$/semaphor.obj \ + $(OBJ)$/socket.obj \ + $(OBJ)$/interlck.obj \ + $(OBJ)$/mutex.obj \ + $(OBJ)$/thread.obj \ + $(OBJ)$/module.obj \ + $(OBJ)$/process.obj \ + $(OBJ)$/security.obj \ + $(OBJ)$/profile.obj \ + $(OBJ)$/time.obj \ + $(OBJ)$/daemon.obj \ + $(OBJ)$/file.obj \ + $(OBJ)$/signal.obj \ + $(OBJ)$/pipe.obj \ + $(OBJ)$/system.obj \ + $(OBJ)$/channel.obj \ + $(OBJ)$/util.obj \ + $(OBJ)$/ports.obj +#.ENDIF + +DEPOBJFILES = $(OBJ)$/sdaemon.obj + +# --- Targets ------------------------------------------------------ + +.IF "$(COM)"=="C50" +APP1STDLIBS+=-lC +.ENDIF + +ALL: \ + ALLTAR \ + $(BIN)$/$(START_SCRIPT) + +.INCLUDE : target.mk + + +$(BIN)$/$(START_SCRIPT): $(START_SCRIPT) + @+$(COPY) $(START_SCRIPT) $@ + @+echo $(START_SCRIPT) copied + diff --git a/sal/osl/unx/module.c b/sal/osl/unx/module.c new file mode 100644 index 000000000000..74c101d4eb89 --- /dev/null +++ b/sal/osl/unx/module.c @@ -0,0 +1,875 @@ +/************************************************************************* + * + * $RCSfile: module.c,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:17:21 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + + +#ifndef _OSL_DIAGNOSE_H_ +#include +#endif + +#ifndef _OSL_TYPES_H_ +#include +#endif + +#ifndef _OSL_MODULE_H_ +#include +#endif + +#include "system.h" +#include + +#ifdef MACOSX +#ifndef _OSL_PROCESS_H_ +#include +#endif +extern oslProcessError SAL_CALL osl_searchPath(const sal_Char* pszName, const sal_Char* pszPath, sal_Char Separator, sal_Char *pszBuffer, sal_uInt32 Max); +#else /* MACOSX */ +extern int _dlclose(void *handle); +#endif /* MACOSX */ + +oslModule SAL_CALL osl_psz_loadModule(const sal_Char *pszModuleName, sal_Int32 nRtldMode); +void* SAL_CALL osl_psz_getSymbol(oslModule hModule, const sal_Char* pszSymbolName); + +#if defined(SOLARIS) + +#include + +/* osl_getSolarisRelease + * make a single integer from solaris release string */ + +sal_Int32 SAL_CALL osl_getSolarisRelease() +{ + struct utsname aRelease; + static int nRelease = 0; + + if ( nRelease != 0 ) + { + /* computed once, returned many */ + return nRelease; + } + else + if ( uname( &aRelease ) > -1 ) + { + int nTokens; + int nMajor, nMinor, nMMinor; + + /* release will be something like 5.5.1 or 5.6 */ + nTokens = sscanf(aRelease.release, "%i.%i.%i\n", + &nMajor, &nMinor, &nMMinor ); + + switch ( nTokens ) + { + case 0: nMajor = 0; + /* fall thru */ + case 1: nMinor = 0; + /* fall thru */ + case 2: nMMinor = 0; + break; + case 3: + default: + /* 3 tokens cannot match more than 3 times */ + break; + } + + /* will be something like 551 or 560, dont expect a minor release + * number larger than 9 */ + nRelease = nMajor * 100 + nMinor * 10 + nMMinor; + + /* okay, the paranoic case */ + if ( nRelease == 0 ) + nRelease = -1; + } + else + { + /* never saw uname fail, but just in case + * (must be very old solaris) */ + nRelease = -1; + } + + return nRelease; +} + +#endif + +/*****************************************************************************/ +/* osl_loadModule */ +/*****************************************************************************/ +#if defined(SOLARIS) +/* + * mfe: #65566# and #68661# + * Under 5.5.1 we can't use dlclose due to relocation error with libsk + * The First fix was to dlopen all libs with RTLD_GLOBAL but we did + * encounter problems with Java then (zip symbols) + * The error occurs when an implicit dlclose was called + * We catch dlclose here and leave all libs opened via dlopen unclosed + */ + +int dlclose(void *handle) +{ + int nRet; + sal_Int32 release; + release = osl_getSolarisRelease(); + if ( release >= 560 ) + { + nRet=_dlclose(handle); + } + return nRet; +} +#endif + +oslModule SAL_CALL osl_loadModule(rtl_uString *ustrModuleName, sal_Int32 nRtldMode) +{ + oslModule pModule=0; + + if ( ustrModuleName != 0 ) + { + rtl_String* strModuleName = 0; + sal_Char* pszModuleName=0; + + rtl_uString2String( &strModuleName, + rtl_uString_getStr(ustrModuleName), + rtl_uString_getLength(ustrModuleName), + RTL_TEXTENCODING_UTF8, + OUSTRING_TO_OSTRING_CVTFLAGS ); + + pszModuleName=rtl_string_getStr(strModuleName); + + + if ( strncmp(pszModuleName,"//./",4) == 0 ) + pszModuleName+=3; + + pModule = osl_psz_loadModule(pszModuleName,nRtldMode); + rtl_string_release(strModuleName); + } + + return pModule; +} + + +oslModule SAL_CALL osl_psz_loadModule(const sal_Char *pszModuleName, sal_Int32 nRtldMode) +{ +#ifdef MACOSX + + CFStringRef pPath=0; + CFURLRef pURL=0; + CFBundleRef pLib=0; + sal_Char *searchPath; + sal_Char path[PATH_MAX + 1]; + + OSL_ASSERT(pszModuleName); + + /* + * Try to construct the absolute path to the module name by searching + * for the module name in the directories specified in the + * DYLD_LIBRARY_PATH environment variable. + */ + if ( osl_searchPath( pszModuleName, "DYLD_LIBRARY_PATH", '\0', path, sizeof(path) ) == osl_Process_E_None ) + pszModuleName = path; + + if ( pszModuleName ) + { +#ifndef NO_DL_FUNCTIONS + /* Convert path in strModulePath to CFStringRef */ + pPath = CFStringCreateWithCString( NULL, pszModuleName, + kCFStringEncodingUTF8 ); + + /* Get the framework's CFURLRef using its path */ + if ( ! (pURL = CFURLCreateWithFileSystemPath( kCFAllocatorDefault, + pPath, kCFURLPOSIXPathStyle, true) ) ) + { +#ifdef DEBUG + fprintf( stderr, + "osl_loadModule: cannot load module %s for reason: %s\n", + pszModuleName, "path does not exist" ); +#endif + CFRelease(pPath); + return NULL; + } + + /* Load the framework */ + if ( ! ( pLib = CFBundleCreate( NULL, pURL) ) ) + { +#ifdef DEBUG + fprintf( stderr, + "osl_loadModule: cannot load module %s for reason: %s\n", + pszModuleName, "path is not a bundle" ); +#endif + CFRelease( pPath ); + CFRelease( pURL ); + return NULL; + } + + /* Load the library in the framework */ + if ( CFBundleLoadExecutable( pLib ) ) + { + CFRelease( pPath ); + CFRelease( pURL ); + return (oslModule)pLib; + } + else + { +#ifdef DEBUG + fprintf( stderr, + "osl_loadModule: cannot load module %s for reason: %s\n", + pszModuleName, "bundle does not contain a valid library" ); +#endif + CFRelease( pPath ); + CFRelease( pURL ); + CFRelease( pLib ); + return NULL; + } + +#endif + } + return NULL; + +#else /* MACOSX */ + + sal_Int32 rtld_mode; + + if ( nRtldMode == 0 ) + { + rtld_mode = RTLD_LAZY; + } + else + { + rtld_mode=nRtldMode; + } + + OSL_ASSERT(pszModuleName); + + if (pszModuleName) + { +#ifndef NO_DL_FUNCTIONS + void* pLib = dlopen(pszModuleName, rtld_mode ); +#ifdef DEBUG + if( ! pLib ) + fprintf( stderr, "osl_loadModule: cannot load module %s for reason: %s\n", + pszModuleName, dlerror() ); +#endif + return ((oslModule)pLib); +#endif + } + return NULL; + +#endif /* MACOSX */ +} + +/*****************************************************************************/ +/* osl_unloadModule */ +/*****************************************************************************/ +void SAL_CALL osl_unloadModule(oslModule hModule) +{ +#ifdef MACOSX + + OSL_ASSERT(hModule); + + if (hModule) + CFRelease((CFBundleRef)hModule); + +#else /* MACOSX */ + + OSL_ASSERT(hModule); + + if (hModule) + { +#ifndef NO_DL_FUNCTIONS +#ifndef GCC + /* gcc (2.9.1 (egcs), 295) registers atexit handlers for + * static destructors which obviously cannot + * be called after dlclose. A compiler "feature". The workaround for now + * is not to dlclose libraries. Since most of them are closed at shutdown + * this does not make that much a difference + */ + dlclose(hModule); + +#endif +#endif + } + +#endif /* MACOSX */ +} + +/*****************************************************************************/ +/* osl_getSymbol */ +/*****************************************************************************/ +void* SAL_CALL osl_getSymbol(oslModule Module, rtl_uString* ustrSymbolName) +{ + void* pHandle=0; + + if ( ustrSymbolName != 0 ) + { + rtl_String* strSymbolName=0; + sal_Char* pszSymbolName=0; + + rtl_uString2String( &strSymbolName, + rtl_uString_getStr(ustrSymbolName), + rtl_uString_getLength(ustrSymbolName), + RTL_TEXTENCODING_UTF8, + OUSTRING_TO_OSTRING_CVTFLAGS ); + + pszSymbolName = rtl_string_getStr(strSymbolName); + + pHandle=osl_psz_getSymbol(Module,pszSymbolName); + } + + + return pHandle; +} + +void* SAL_CALL osl_psz_getSymbol(oslModule hModule, const sal_Char* pszSymbolName) +{ +#ifdef MACOSX + + CFStringRef pSymbolName; + void *pSymbol; + + OSL_ASSERT(hModule); + OSL_ASSERT(pszSymbolName); + + if (hModule && pszSymbolName) + { +#ifndef NO_DL_FUNCTIONS + /* Convert char pointer to CFStringRef */ + pSymbolName = CFStringCreateWithCString(NULL, pszSymbolName, + kCFStringEncodingUTF8); + + /* Try to get the symbol */ + pSymbol = CFBundleGetFunctionPointerForName((CFBundleRef)hModule, + pSymbolName); + + /* Release CFStringRef */ + if ( pSymbolName ) + CFRelease(pSymbolName); + + return pSymbol; +#endif + } + return NULL; + +#else /* MACOSX */ + + OSL_ASSERT(hModule); + OSL_ASSERT(pszSymbolName); + + if (hModule && pszSymbolName) + { +#ifndef NO_DL_FUNCTIONS + return dlsym(hModule, pszSymbolName); +#endif + } + return NULL; + +#endif /* MACOSX */ +} + +/*****************************************************************************/ +/* NYI */ +/*****************************************************************************/ +#ifdef NOT_IMPL + + +#include +#include +#include +#include +#ifdef AIX +#include +#include +#include +#include +#include +#define _H_FCNTL +#define LIBPATH "LIBPATH" +#elif defined HPUX +#include +#include +#define LIBPATH "SHLIB_PATH" +#elif defined S390 +#include +#include +#define LIBPATH "LIPPATH" +#else +#include +#define LIBPATH "LD_LIBRARY_PATH" +#endif + +#ifdef AIX +struct SymbolEntry +{ + String aSymbolName; + void *aSymbolAdress; +}; +DECLARE_LIST(SymbolTable, SymbolEntry*); +#endif + +struct LibraryPrivateData +{ + String aLibname; + ULONG nRefCount; + +#ifdef HPUX + shl_t aHandle; +#elif S390 + dllhandle *aHandle; +#else + void *aHandle; +#endif + +#ifdef AIX + SymbolTable aSymbolTable; +#endif + +#if defined AIX || defined HPUX + void (*init)(void); + void (*exit)(void); +#endif + + LibraryPrivateData( const String & aName ) + : aLibname (aName), nRefCount (1), aHandle (NULL) +#if defined AIX || defined HPUX + , init (NULL), exit (NULL) +#endif + {} +}; + +static String aError; + +DECLARE_LIST(LibraryList, LibraryPrivateData*); +static LibraryList aLibraryList; + +#if defined AIX || defined HPUX +inline void SetError (const sal_Char* const pError, BOOL bErrno = FALSE) +{ + aError = pError; + if (bErrno) + { + aError += ' '; + aError += strerror(errno); + } + aError += '\n'; +#ifdef DBG_UTIL + DBG_ASSERTWARNING (TRUE, aError.GetStr()); +#endif +} +#endif + +inline String FindLibrary( const String &rPathname ) +{ + if (rPathname.Search('/') != STRING_NOTFOUND) + return access(rPathname.GetStr(), F_OK | R_OK | X_OK) + ? String() : (String)rPathname; + String aLibpath (getenv (LIBPATH)); + String aPathName; + USHORT nToken = aLibpath.GetTokenCount (':'); + for (USHORT i = 0; i < nToken; i++) + { + aPathName = aLibpath.GetToken (i, ':'); + aPathName += '/'; + aPathName += rPathname; + if (! access(aPathName.GetStr(), F_OK | R_OK | X_OK)) + return aPathName; + } + return String(); +} + +#ifdef HPUX + +inline void *FindFunction(LibraryPrivateData *pPriv, const String & rSymbol) +{ + void *pReturn; + if (shl_findsym( &pPriv->aHandle, rFuncName.GetStr(), + TYPE_PROCEDURE, &pReturn) == -1) + { + SetError("FindFunction", TRUE); + pReturn = NULL; + } + return pReturn; +} + +inline BOOL Load(LibraryPrivateData *pPriv, const String & rPathname) +{ + pPriv->aHandle = shl_load(rPathname.GetStr(), + (BIND_DEFERRED | BIND_NONFATAL | DYNAMIC_PATH), 0L); + BOOL ret = (pPriv->aHandle != NULL); + if (ret) + { + String aSymbol("_GLOBAL__FI_"); + String aSymbol += pPriv->aLibName; + aSymbol.SearchAndReplace('.', '_'); + pPriv->init = FindFunction(pPriv, Symbol); + aSymbol.SearchAndReplace('I', 'D'); + pPriv->exit = FindFunction(pPriv, Symbol); + if (pPriv->init) + (pPriv->init)(); + } + else + SetError("Load:", TRUE); + return (ret); +} + +inline BOOL Unload (LibraryPrivateData *pPriv) { + BOOL ret = TRUE; + if (pPriv) + { + if (pPriv->exit) + (pPriv->exit)(); + ret = (shl_unload (pPriv->aHandle) != -1); + if (! ret) + SetError("Unload:", TRUE); + } + return (ret); +} + +#elif defined AIX + +inline struct ld_info *GetInfo (void) +{ + for (ULONG size = 4096; TRUE; size += 4096) + { + sal_Char *pBuffer = new sal_Char [size]; + if (! pBuffer) { + SetError("GetInfo: out of memory"); + return NULL; + } + if (loadquery (L_GETINFO, pBuffer, size) != -1) + return ((struct ld_info *) pBuffer); + delete[] pBuffer; + if (errno != ENOMEM) + return NULL; + } +} + +class MainEntry +{ + void *pPoint; + MainEntry () + { + struct ld_info *pLdInfo = GetInfo (); + if (pLdInfo) + { + pPoint = pLdInfo->ldinfo_dataorg; + delete[] pLdInfo; + } + else + { + pPoint = NULL; + SetError("MainEntryPoint: cannot find"); + } + } +} + +static MainEntry aMainEntryPoint; + +inline void *FindFunction(LibraryPrivateData *pPriv, const String & rSymbol) +{ + SymbolEntry *pSymbolEntry; + for (pSymbolEntry = pPriv->aSymbolTable.First(); + pSymbolEntry && (pSymbolEntry->aSymbolName != rFuncName); + pSymbolEntry = pPriv->aSymbolTable.Next()) + ; + void *ret = pSymbolEntry ? pSymbolEntry->aSymbolAdress : NULL; + if (ret) + { + String aTmp("FindFunction: symbol "); + aTmp += rFuncName; + aTmp += " not found"; + SetError(aTmp.GetStr()); + } + return ret; +} + +inline BOOL Load(LibraryPrivateData *pPriv, const String & rPathname) +{ + String aPathName = FindLibrary (rPathname); + if (!aPathName) + { + String aTmp = "Load: "; + aTmp += rPathname; + aTmp += " not found"; + SetError (aTmp.GetStr()); + return FALSE; + } + + pPriv->aHandle = load ((sal_Char*)aPathName.GetStr(), L_NOAUTODEFER, NULL); + if (! pPriv->aHandle) + { + String aTmp = "LOad: load:"; + aTmp += rPathname; + aTmp += ':'; + SetError (aTmp.GetStr(), TRUE); + return FALSE; + } + + if (loadbind(NULL, aMainEntryPoint.aPoint , pPriv->aHandle) == -1) + { + unload (pPriv->aHandle); + SetError("Load: loadbind:", TRUE); + return FALSE; + } + + LDFILE *pLdFile = ldopen ((sal_Char*) aPathName.GetStr(), NULL); + if (! pLdFile) + { + struct ld_info *pLdInfo; + if (!(pLdInfo = GetInfo())); + { + SetError("Load: cannot find symbol table"); + return FALSE; + } + while (pLdInfo && (! pLdFile)) + { + if (pLdInfo->ldinfo_dataorg == pPriv->aHandle) + pLdFile = ldopen (pLdInfo->ldinfo_filename,pLdFile); + else + pLdInfo = pLdInfo->ldinfo_next ? + (struct ld_info *)((sal_Char *) pLdInfo) + + pLdInfo->ldinfo_next : + NULL; + } + delete[] pLdInfo; + if (! pLdFile) + { + SetError("Library::Library:"); + return FALSE; + } + } + if (TYPE(pLdFile) != U802TOCMAGIC) + { + while (ldclose (pLdFile) == FAILURE) + ; + SetError("Library::Library: bad magic"); + return FALSE; + } + + SCNHDR aSectionHeader; + if (ldnshread (pLdFile, _LOADER, &aSectionHeader) != SUCCESS) + { + while (ldclose (pLdFile) == FAILURE) + ; + SetError("Library::Library: cannot read loader section header"); + return FALSE; + } + if (FSEEK(pLdFile, aSectionHeader.s_scnptr, BEGINNING) != OKFSEEK) { + while (ldclose (pLdFile) == FAILURE) + ; + SetError("Load: cannot seek to loader section"); + return FALSE; + } + sal_Char *pBuffer = new sal_Char [aSectionHeader.s_size]; + if (FREAD(pBuffer, aSectionHeader.s_size, 1, pLdFile) != 1) + { + while (ldclose (pLdFile) == FAILURE) + ; + SetError("Load: cannot read loader section"); + return FALSE; + } + int i = ((LDHDR *)pBuffer)->l_nsyms; + for (LDSYM *pSymbol = (LDSYM*) (pBuffer + LDHDRSZ); i--; pSymbol++) + { + if (LDR_EXPORT (*pSymbol)) + { + SymbolEntry *pSymbolEntry = new SymbolEntry; + pSymbolEntry->aSymbolName = pSymbol->l_zeroes ? + pSymbol->l_name : + pSymbol->l_offset + ((LDHDR *)pBuffer)->l_stoff + pBuffer; + pSymbolEntry->aSymbolAdress = (void *)((sal_uInt32) + pPriv->aHandle + pSymbol->l_value); + pPriv->aSymbolTable.Insert(pSymbolEntry); + } + } + delete[] pBuffer; + while(ldclose(pLdFile) == FAILURE) + ; + + struct dl_info { void (*init)(void); void (*exit)(void); } + *pInfo = (struct dl_info *) FindFunction ("dl_info"); + if (pInfo) + { + pPriv->exit = pInfo->exit; + pPriv->init = pInfo->init; + if (pPriv->init) + pPriv->init(); + } + return TRUE; +} + +inline BOOL Unload (LibraryPrivateData *pPriv) +{ + if (pPriv->exit) + pPriv->exit(); + if (unload (pPriv->aHandle) == -1) + SetError("Unload", TRUE); + for (SymbolEntry *pSymbolEntry = pPriv->aSymbolTable.First(); + pSymbolEntry; pSymbolEntry = pPriv->aSymbolTable.Next()) + delete pSymbolEntry; +} + +#elif S390 + +inline void *FindFunction(LibraryPrivateData *pPriv, const String & rFuncname) +{ + void *pReturn = (void *)(dllqueryfn(pPriv->aHandle, (sal_Char*) rFuncname.GetStr())); + if (pReturn == NULL) + aError = strerror(errno); + return pReturn; +} + +inline BOOL Load(LibraryPrivateData *pPriv, const String & rPathname) +{ + pPriv->aHandle = dllload((sal_Char *) rPathname.GetStr()); + if (pPriv->aHandle == NULL) + aError = strerror(errno); + return (pPriv->aHandle != NULL); +} + +inline BOOL Unload (LibraryPrivateData *pPriv) +{ + BOOL bRet = (dllfree(pPriv->aHandle) == 0); + if (!bRet) + aError = strerror(errno); + return bRet; +} + +#else + +inline void *FindFunction(LibraryPrivateData *pPriv, const String & rFuncname) +{ + void *pReturn = dlsym(pPriv->aHandle, rFuncname.GetStr()); + aError = dlerror(); + return pReturn; +} + +inline BOOL Load(LibraryPrivateData *pPriv, const String & rPathname) +{ + pPriv->aHandle = dlopen((sal_Char *) rPathname.GetStr(), RTLD_LAZY); + aError = dlerror(); + return (pPriv->aHandle != NULL); +} + +inline BOOL Unload (LibraryPrivateData *pPriv) +{ +#ifndef LINUX + BOOL ret = (dlclose(pPriv->aHandle) != 0); + aError = dlerror(); + return ret; +#else + /* gcc 2.9.1 (egcs) registers atexit handlers which obviously cannot + * be called after dlclose. A compiler "feature". The workaround for now + * is not to dlclose libraries. Since most of them are closed at shutdown + * this does not make that much a difference + */ + return TRUE; +#endif +} + +#endif + +BOOL Library::ModulFound( const String &rPathname ) +{ + return FindLibrary (rPathname).Len(); +} + +Library::Library(const String & rPathname) +{ + sal_Char *pLibname = strrchr (rPathname.GetStr(), '/'); + String aLibname(pLibname ? String(pLibname) : (String)rPathname); + + for (pPriv = aLibraryList.First(); + pPriv && (pPriv->aLibname != aLibname); + pPriv = aLibraryList.Next()) + ; + if (pPriv) + { + pPriv->nRefCount++; + return; + } + pPriv = new LibraryPrivateData (aLibname); + if (Load(pPriv, rPathname)) + aLibraryList.Insert(pPriv); + else + { + delete pPriv; + pPriv = NULL; + } +} + +Library::~Library() +{ + if (pPriv && --pPriv->nRefCount) + { + Unload (pPriv); + delete pPriv; + pPriv = NULL; + aLibraryList.Remove(pPriv); + } +} + +void* Library::GetFunction(const String & rFuncName) const +{ + return pPriv ? FindFunction(pPriv, rFuncName) : NULL; +} + +BOOL Library::ModulFound () const { + return ((pPriv != NULL) && (pPriv->aHandle != NULL)); +} + +#endif + diff --git a/sal/osl/unx/mutex.c b/sal/osl/unx/mutex.c new file mode 100644 index 000000000000..8cfc8b34e6ce --- /dev/null +++ b/sal/osl/unx/mutex.c @@ -0,0 +1,326 @@ +/************************************************************************* + * + * $RCSfile: mutex.c,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:17:21 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +#include "system.h" + +#include +#include + + +#if defined(SOLARIS) + +#include +#include + +volatile int GlobalInit = 55; + +void ChangeGlobalInit() +{ + GlobalInit = 0; +} + +pthread_t faked_pthread_self () +{ + if (GlobalInit == 55) + return (pthread_t)0; + else + return pthread_self(); +} + +#define pthread_self() faked_pthread_self() + +#endif /* SOLARIS */ + + +/* + Implementation notes: + oslMutex hides a pointer to the MutexContext structure, which + ist needed to manage recursive locks on a mutex. + +*/ + + +typedef struct _oslMutexImpl +{ + pthread_mutex_t mutex; + pthread_t owner; + sal_uInt32 locks; +} MutexContext; + +/*****************************************************************************/ +/* osl_createMutex */ +/*****************************************************************************/ +oslMutex SAL_CALL osl_createMutex() +{ + MutexContext* pMutex = (MutexContext*) malloc(sizeof(MutexContext)); + int nRet=0; + + OSL_ASSERT(pMutex); + + if ( pMutex == 0 ) + { + return 0; + } + + nRet = pthread_mutex_init(&(pMutex->mutex), PTHREAD_MUTEXATTR_DEFAULT); + if ( nRet != 0 ) + { + OSL_TRACE("osl_createMutex : mutex init failed. Errno: %d; %s\n", + nRet, strerror(nRet)); + + free(pMutex); + return 0; + } + + pMutex->owner = PTHREAD_NONE; + pMutex->locks = 0; + + return (oslMutex) pMutex; +} + +/*****************************************************************************/ +/* osl_destroyMutex */ +/*****************************************************************************/ +void SAL_CALL osl_destroyMutex(oslMutex Mutex) +{ + MutexContext* pMutex = (MutexContext*) Mutex; + + OSL_ASSERT(pMutex); + + if ( pMutex != NULL ) /* is critical section valid? */ + { + int nRet=0; + +#if defined(SOLARIS) + if ( GlobalInit != 55 ) + { +#endif + OSL_ASSERT( pthread_equal(pMutex->owner, PTHREAD_NONE) ); +#if defined(SOLARIS) + } +#endif + + 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) +{ + MutexContext* pMutex = (MutexContext*) Mutex; + int nRet=0; + + OSL_ASSERT(pMutex); + + if ( pMutex ) + { + pthread_t thread_id = pthread_self(); + + if ( pthread_equal(pMutex->owner, thread_id ) ) + { + pMutex->locks++; +/* fprintf(stderr,"osl_acquireMutex 0x%08X (locks == %i) from %i to thread %i (lock inc)\n", + pMutex,pMutex->locks,pMutex->owner,pthread_self());*/ + } + else + { + nRet = pthread_mutex_lock(&(pMutex->mutex)); + if ( nRet != 0 ) + { + OSL_TRACE("osl_acquireMutex : mutex lock failed. Errno: %d; %s\n", + nRet, strerror(nRet)); + } + +/* fprintf(stderr,"osl_acquireMutex 0x%08X (locks == %i) from %i to thread %i\n", + pMutex,pMutex->locks,pMutex->owner,thread_id);*/ + + OSL_ASSERT( pMutex->locks == 0 ); + + pMutex->owner = thread_id; + } + + return sal_True; + } + + /* not initialized */ + return sal_False; +} + +/*****************************************************************************/ +/* osl_tryToAcquireMutex */ +/*****************************************************************************/ +sal_Bool SAL_CALL osl_tryToAcquireMutex(oslMutex Mutex) +{ + MutexContext* pMutex = (MutexContext*) Mutex; + + OSL_ASSERT(pMutex); + + if ( pMutex ) + { + int nRet = 0; + + if ( pthread_equal(pMutex->owner, pthread_self()) ) + { + pMutex->locks++; + } + else + { + nRet = pthread_mutex_trylock(&(pMutex->mutex)); + if ( nRet != 0 ) + { + OSL_TRACE("osl_tryToacquireMutex : mutex trylock failed. Errno: %d; %s\n", + nRet, strerror(nRet)); + return sal_False; + } + +#if defined(SOLARIS) + if ( GlobalInit != 55 ) + { +#endif + OSL_ASSERT( pthread_equal(pMutex->owner, PTHREAD_NONE) ); +#if defined(SOLARIS) + } +#endif + + OSL_ASSERT( pMutex->locks == 0 ); + + pMutex->owner = pthread_self(); + } + + return sal_True; + } + + /* not initialized */ + return sal_False; +} + +/*****************************************************************************/ +/* osl_releaseMutex */ +/*****************************************************************************/ +sal_Bool SAL_CALL osl_releaseMutex(oslMutex Mutex) +{ + MutexContext* pMutex = (MutexContext*) Mutex; + int nRet=0; + + OSL_ASSERT(pMutex); + + if ( pMutex ) + { + if ( pthread_equal( pMutex->owner, pthread_self()) ) + { + if ( pMutex->locks > 0 ) + { + pMutex->locks--; +/* fprintf(stderr,"osl_releaseMutex 0x%08X (locks == %i) from %i to thread %i (lock dec)\n", + pMutex,pMutex->locks,pMutex->owner,pthread_self());*/ + } + else + { +/* fprintf(stderr,"osl_releaseMutex 0x%08X (locks == %i) from %i to thread %i\n", + pMutex,pMutex->locks,pMutex->owner,pthread_self());*/ + + pMutex->owner = PTHREAD_NONE; + + 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_True); + } + else + { +/* fprintf(stderr,"osl_releaseMutex 0x%08X (locks == %i) from %i to thread %i (not owner)\n", + pMutex,pMutex->locks,pMutex->owner,pthread_self());*/ + + 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; +} + + + diff --git a/sal/osl/unx/pipe.c b/sal/osl/unx/pipe.c new file mode 100644 index 000000000000..f822de71dbc1 --- /dev/null +++ b/sal/osl/unx/pipe.c @@ -0,0 +1,530 @@ +/************************************************************************* + * + * $RCSfile: pipe.c,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:17:21 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + + +#include "system.h" + +#include +#include +#include + +#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 oslPipeImpl */ +/*****************************************************************************/ + +typedef struct _oslPipeImpl { + int m_Socket; + sal_Char m_Name[PATH_MAX + 1]; +} oslPipeImpl; + + +/*****************************************************************************/ +/* 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 */ +/*****************************************************************************/ + +oslPipeImpl* __osl_createPipeImpl() +{ + oslPipeImpl* pPipeImpl; + + pPipeImpl = (oslPipeImpl*)calloc(1, sizeof(oslPipeImpl)); + + return (pPipeImpl); +} + +void __osl_destroyPipeImpl(oslPipeImpl *pImpl) +{ + if (pImpl != NULL) + free(pImpl); +} + + +/*****************************************************************************/ +/* osl_createPipe */ +/*****************************************************************************/ +oslPipe SAL_CALL osl_createPipe(rtl_uString *ustrPipeName, oslPipeOptions Options, oslSecurity Security) +{ + oslPipe pPipe; + rtl_String* strPipeName=0; + sal_Char* pszPipeName=0; + + if ( ustrPipeName != 0 ) + { + rtl_uString2String( &strPipeName, + rtl_uString_getStr(ustrPipeName), + rtl_uString_getLength(ustrPipeName), + RTL_TEXTENCODING_UTF8, + OUSTRING_TO_OSTRING_CVTFLAGS ); + pszPipeName = rtl_string_getStr(strPipeName); + pPipe = osl_psz_createPipe(pszPipeName, Options, Security); + } + + 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] = ""; + oslPipeImpl* pPipeImpl; + + if (access(PIPEDEFAULTPATH, O_RDWR) == 0) + { + strcpy(name, PIPEDEFAULTPATH); + } + else + { + strcpy(name, PIPEALTERNATEPATH); + } + + + strcat(name, "/"); + + if (Security) + { + sal_Char Ident[256] = ""; + + OSL_VERIFY(osl_psz_getUserIdent(Security, Ident, sizeof(Ident))); + + sprintf(&name[strlen(name)], SECPIPENAMEMASK, Ident, pszPipeName); + } + else + { + sprintf(&name[strlen(name)], PIPENAMEMASK, pszPipeName); + } + + + /* alloc memory */ + pPipeImpl= __osl_createPipeImpl(); + + /* create socket */ + pPipeImpl->m_Socket = socket(AF_UNIX, SOCK_STREAM, 0); + if ( pPipeImpl->m_Socket < 0 ) + { + OSL_TRACE("osl_createPipe socket failed. Errno: %d; %s\n",errno, strerror(errno)); + __osl_destroyPipeImpl(pPipeImpl); + return NULL; + } + +// OSL_TRACE("osl_createPipe : new Pipe on fd %i\n",pPipeImpl->m_Socket); + + /* set close-on-exec flag */ + if ((Flags = fcntl(pPipeImpl->m_Socket, F_GETFD, 0)) != -1) + { + Flags |= FD_CLOEXEC; + if (fcntl(pPipeImpl->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)); + + addr.sun_family = AF_UNIX; + strcpy(addr.sun_path, name); + len = sizeof(addr.sun_family) + strlen(addr.sun_path); + + 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(pPipeImpl->m_Socket,(struct sockaddr *)&addr,len) >= 0 ) + { + OSL_TRACE("osl_createPipe : Pipe already in use. Errno: %d; %s\n",errno,strerror(errno)); + close (pPipeImpl->m_Socket); + __osl_destroyPipeImpl(pPipeImpl); + return NULL; + } + + unlink(name); + } + + /* ok, fs clean */ + if ( bind(pPipeImpl->m_Socket, (struct sockaddr *)&addr, len) < 0 ) + { + OSL_TRACE("osl_createPipe : failed to bind socket. Errno: %d; %s\n",errno,strerror(errno)); + close (pPipeImpl->m_Socket); + __osl_destroyPipeImpl(pPipeImpl); + return NULL; + } + + + strcpy(pPipeImpl->m_Name, name); + + if ( listen(pPipeImpl->m_Socket, 5) < 0 ) + { + OSL_TRACE("osl_createPipe failed to listen. Errno: %d; %s\n",errno,strerror(errno)); + unlink(name); /* remove filesystem entry */ + close (pPipeImpl->m_Socket); + __osl_destroyPipeImpl(pPipeImpl); + return NULL; + } + + return (pPipeImpl); + } + else + { /* osl_pipe_OPEN */ + if ( access(name, F_OK) != -1 ) + { + if ( connect( pPipeImpl->m_Socket, (struct sockaddr *)&addr, len) >= 0 ) + { + return (pPipeImpl); + } + + OSL_TRACE("osl_createPipe failed to connect. Errno: %d; %s\n",errno,strerror(errno)); + } + + close (pPipeImpl->m_Socket); + __osl_destroyPipeImpl(pPipeImpl); + return NULL; + } + + /* if we reach here something went wrong */ + /* should never come here */ + close (pPipeImpl->m_Socket); + __osl_destroyPipeImpl(pPipeImpl); + return NULL; +} + +/*****************************************************************************/ +/* osl_copyPipe */ +/*****************************************************************************/ +oslPipe SAL_CALL osl_copyPipe(oslPipe Pipe) +{ + oslPipeImpl* pPipeImpl; + oslPipeImpl* pParamPipeImpl; + + OSL_ASSERT(Pipe); + + if ( Pipe == 0 ) + { + return 0; + } + + /* alloc memory */ + pPipeImpl= __osl_createPipeImpl(); + + OSL_ASSERT(pPipeImpl); + + if ( pPipeImpl == 0 ) + { + return 0; + } + + pParamPipeImpl= (oslPipeImpl*)Pipe; + + /* copy socket */ + memcpy(pPipeImpl, pParamPipeImpl, sizeof(oslPipeImpl)); + + return (oslPipe)pPipeImpl; +} + + +/*****************************************************************************/ +/* osl_destroyPipe */ +/*****************************************************************************/ +void SAL_CALL osl_destroyPipe(oslPipe Pipe) +{ + oslPipeImpl* pPipeImpl; + int nRet; + + /* socket already invalid */ + if( Pipe == NULL ) + return; + + OSL_TRACE("In osl_destroyPipe"); + + pPipeImpl = (oslPipeImpl*) Pipe; + + nRet = close(pPipeImpl->m_Socket); + if ( nRet < 0 ) + { + OSL_TRACE("close in destroyPipe failed : '%s'\n",strerror(errno)); + } + + /* remove filesystem entry */ + if ( strlen(pPipeImpl->m_Name) > 0 ) + { + unlink(pPipeImpl->m_Name); + } + + /* free memory */ + __osl_destroyPipeImpl(pPipeImpl); +} + +/*****************************************************************************/ +/* osl_acceptPipe */ +/*****************************************************************************/ +oslPipe SAL_CALL osl_acceptPipe(oslPipe Pipe) +{ + int s; + oslPipeImpl* pPipeImpl; + oslPipeImpl* pParamPipeImpl; + + OSL_ASSERT(Pipe); + + if ( Pipe == 0 ) + { + return 0; + } + + pParamPipeImpl= (oslPipeImpl*)Pipe; + + OSL_ASSERT(strlen(pParamPipeImpl->m_Name) > 0); + + if ((s = accept(pParamPipeImpl->m_Socket, NULL, NULL)) < 0) + { + return NULL; + } + else + { + /* alloc memory */ + pPipeImpl= __osl_createPipeImpl(); + + OSL_ASSERT(pPipeImpl); + + if(pPipeImpl==NULL) + return NULL; + + pPipeImpl->m_Socket = s; + } + + return (oslPipe)pPipeImpl; +} + +/*****************************************************************************/ +/* osl_receivePipe */ +/*****************************************************************************/ +sal_Int32 SAL_CALL osl_receivePipe(oslPipe Pipe, + void* pBuffer, + sal_uInt32 BytesToRead) +{ + oslPipeImpl* pPipeImpl; + int nRet = 0; + int i; + + OSL_ASSERT(Pipe); + + if ( Pipe == 0 ) + { + OSL_TRACE("osl_receivePipe : Invalid socket"); + errno=EINVAL; + return -1; + } + + pPipeImpl= (oslPipeImpl*)Pipe; + +/* OSL_TRACE("osl_receivePipe : receiving %i bytes on fd %i\n",BytesToRead,pPipeImpl->m_Socket);*/ + + nRet = recv(pPipeImpl->m_Socket, + (sal_Char*)pBuffer, + BytesToRead, 0); + + + if ( nRet <= 0 ) + { + OSL_TRACE("osl_receivePipe failed : %i '%s'",nRet,strerror(errno)); + } + +/* fprintf(stderr,"osl_receivePipe : received "); */ +/* for ( i = 0 ; i < nRet ; i++ ) */ +/* { */ +/* fprintf(stderr," '%c'",((sal_Char*)pBuffer)[i]); */ +/* } */ +/* fprintf(stderr,"\n"); */ + + return nRet; +} + + +/*****************************************************************************/ +/* osl_sendPipe */ +/*****************************************************************************/ +sal_Int32 SAL_CALL osl_sendPipe(oslPipe Pipe, + const void* pBuffer, + sal_uInt32 BytesToSend) +{ + oslPipeImpl* pPipeImpl; + int nRet=0; + int i; + + OSL_ASSERT(Pipe); + + if ( Pipe == 0 ) + { + OSL_TRACE("osl_sendPipe : Invalid socket"); + errno=EINVAL; + return -1; + } + + pPipeImpl= (oslPipeImpl*)Pipe; + +/* OSL_TRACE("osl_sendPipe : sending %i bytes on fd %i\n",BytesToSend,pPipeImpl->m_Socket);*/ + + nRet = send(pPipeImpl->m_Socket, + (sal_Char*)pBuffer, + BytesToSend, 0); + + + if ( nRet <= 0 ) + { + OSL_TRACE("osl_sendPipe failed : %i '%s'",nRet,strerror(errno)); + } + +/* fprintf(stderr,"osl_sendPipe : sended "); */ +/* for ( i = 0 ; i < nRet ; i++ ) */ +/* { */ +/* fprintf(stderr," '%c'",((sal_Char*)pBuffer)[i]); */ +/* } */ +/* fprintf(stderr,"\n"); */ + + return nRet; +} + + +/*****************************************************************************/ +/* osl_getLastPipeError */ +/*****************************************************************************/ +oslPipeError SAL_CALL osl_getLastPipeError(oslPipe Pipe) +{ + return ERROR_FROM_NATIVE(errno); +} + + diff --git a/sal/osl/unx/process.c b/sal/osl/unx/process.c new file mode 100644 index 000000000000..a2b406314d67 --- /dev/null +++ b/sal/osl/unx/process.c @@ -0,0 +1,2483 @@ +/************************************************************************* + * + * $RCSfile: process.c,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:17:21 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +#ifdef LINUX +#include +#endif + +#include "system.h" + +#include +#include +#include +#include +#include +#include +#include + +#include + +#include "procimpl.h" +#include "sockimpl.h" +#include "secimpl.h" + +oslProcessError SAL_CALL osl_psz_executeProcess(sal_Char *pszImageName, + sal_Char *pszArguments[], + oslProcessOption Options, + oslSecurity Security, + sal_Char *pszDirectory, + sal_Char *pszEnvironments[], + oslIOResource* pResources, + oslProcess *pProcess); +oslProcessError SAL_CALL osl_searchPath(const sal_Char* pszName, const sal_Char* pszPath, + sal_Char Separator, sal_Char *pszBuffer, sal_uInt32 Max); + +oslProcessError SAL_CALL osl_psz_getExecutableFile(sal_Char* pszBuffer, sal_uInt32 Max); +sal_Bool osl_getFullPath(const sal_Char* pszFilename, sal_Char* pszPath, sal_uInt32 MaxLen); +oslProcessError SAL_CALL osl_psz_getEnvironment(const sal_Char* pszName, sal_Char *pszBuffer, sal_uInt32 Max); +oslProcessError SAL_CALL osl_getCommandArgs(sal_Char* pszBuffer, sal_uInt32 Max); + +#define FIFO_MODE (S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH) +#define MAX_ARGS 255 +#define MAX_ENVS 255 + +#define PIPEDEFAULTPATH "/tmp" +#define PIPEALTERNATEPATH "/var/tmp" +#define PIPENAMEMASK "OSL_IOT_%u" + +// #ifdef IORESOURCE_TRANSFER_BSD +#define CONTROLLEN (sizeof(struct cmsghdr) + sizeof(int)) +// #endif + +typedef enum { + MSG_DATA, + MSG_END, + MSG_ACK, + MSG_REL, + MSG_UNKNOWN +} MessageType; + +typedef struct { + MessageType m_Type; + oslDescriptorFlag m_Flags; + oslDescriptorType m_Data; + int m_Value; +} Message; + +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; + const sal_Char* m_pszEnv[MAX_ENVS + 1]; + oslIOResource* m_pRes; + uid_t m_uid; + gid_t m_gid; + sal_Char* m_name; + oslCondition m_started; + oslProcessImpl* m_pProcImpl; +} ProcessData; + +typedef struct _oslSocketCallbackArg { + int m_ident; + Pipe* m_pipe; +} oslSocketCallbackArg; + +typedef struct _oslPipeImpl { + int m_Socket; + sal_Char m_Name[PATH_MAX + 1]; +} oslPipeImpl; + + +static oslProcessImpl* ChildList; +static oslMutex ChildListMutex; + +static sal_Char CmdLine[CMD_ARG_MAX + 1] = ""; +static int nArgCount = -1; + + +#if defined(CMD_ARG_PRG) && defined(CMD_ARG_ENV) +static sal_Char *getCmdLine() +{ + /* Memory layout of CMD_ARG_PRG: + progname\0arg1\0...argn[\0]\0environ\0env2\0...envn\0[\0] */ + + extern sal_Char* CMD_ARG_PRG; + extern sal_Char** CMD_ARG_ENV; + + int n = *(CMD_ARG_ENV) - (CMD_ARG_PRG); + sal_Char *pchr; + + if (pchr = calloc(n + 1, sizeof(sal_Char))) + { + memcpy(pchr,(CMD_ARG_PRG), n); + pchr[n] = '\0'; + return pchr; + } + + return NULL; +} +#endif + +#if !defined (CMD_ARG_PRG) && defined (CMD_ARG_ENV) +extern sal_Char** CMD_ARG_ENV; +static sal_Char* pEnviron; + +/* The environment pointer has to be saved away early because + * any putenv() may change it. The next line works for GCC on any + * ELF platform. + */ + +static void saveEnviron(void) __attribute__((constructor)); + +static void saveEnviron(void) +{ + pEnviron = CMD_ARG_ENV; +} + +static sal_Char *getCmdLine() +{ + sal_Char **pArgs = pEnviron; + sal_Char *pChr; + size_t n; + + pArgs--; + while(*(--pArgs)); + pArgs += 2; /* skip NULL and pointer to number of args */ + + n = *(CMD_ARG_ENV) - *(pArgs); + + if (pChr = calloc(n + 1, sizeof(sal_Char))) { + memcpy(pChr,*pArgs, n); + pChr[n] = '\0'; + return pChr; + } + return (NULL); +} +#endif + +#ifdef CMD_ARG_PROC_STREAM +static sal_Char *getCmdLine() +{ + FILE *fp; + sal_Char name[PATH_MAX + 1] = ""; + + sprintf(name, CMD_ARG_PROC_NAME, getpid()); + + if ( (fp = fopen(name, "r")) != 0 ) + { + int c; + int i = 0, n = 32; + sal_Char *pchr = (sal_Char*) calloc(n, sizeof(sal_Char)); + + while ((c = getc(fp)) != EOF) + { + if (i >= (n - 2)) + pchr = (sal_Char*) realloc(pchr, (n += 32) * sizeof(sal_Char)); + + pchr[i++] = c; + } + + pchr[i] = pchr[i + 1] = '\0'; + + fclose(fp); + + return (pchr); + } + + return (NULL); +} +#endif + +#ifdef CMD_ARG_PROC_IOCTL +static sal_Char *getCmdLine() +{ + int fd; + sal_Char name[PATH_MAX + 1] = ""; + sal_Char *pchr=0; + + sprintf(name, CMD_ARG_PROC_NAME, getpid()); + + if ((fd = open(name, O_RDONLY)) >= 0) + { + CMD_ARG_PROC_TYPE psinfo; + + if (ioctl(fd, CMD_ARG_PROC_IOCTL, &psinfo) >= 0) + { + int j, i = 0, n = 32; + pchr = (sal_Char*) calloc(n, sizeof(sal_Char)); + + if (CMD_ARG_PROC_ARGC(psinfo) > 0) + for (j = 0; j < CMD_ARG_PROC_ARGC(psinfo) , CMD_ARG_PROC_ARGV(psinfo)[j] != 0 ; j++) + { + int l = strlen(CMD_ARG_PROC_ARGV(psinfo)[j]); + + if (i + l >= (n - 2)) + pchr = (sal_Char*) realloc(pchr, (n += l + 32) * sizeof(sal_Char)); + + strcpy(&pchr[i], CMD_ARG_PROC_ARGV(psinfo)[j]); +/* fprintf(stderr,"getCmdLine : arg %i is '%s'\n",j,&pchr[i]); */ +/* fprintf(stderr,"getCmdLine : argv %i is '%s'\n",j,CMD_ARG_PROC_ARGV(psinfo)[j]); */ + + i += l; + pchr[i++] = '\0'; + } + else + pchr[i++] = '\0'; + + pchr[i] = '\0'; + } + + close(fd); + } + + return (pchr); +} +#endif + +#ifdef CMD_ARG_PS +static sal_Char *getCmdLine() +{ + FILE *fp; + sal_Char cmd[CMD_ARG_MAX + 1] = ""; + int i; + + sprintf(cmd, CMD_ARG_PS, getpid()); + + if (fp = popen(cmd, "r")) + { + int c; + int i = 0, n = 32; + sal_Bool sep = sal_True; + sal_Char *pchr = calloc(n, sizeof(sal_Char)); + + while ((c = getc(fp)) != EOF) + { + if (i >= (n - 2)) + pchr = realloc(pchr, (n += 32) * sizeof(sal_Char)); + + if (! isspace(c)) + { + pchr[i++] = c; + sep = sal_False; + } + else + if (! sep) + { + pchr[i++] = '\0'; + sep = sal_True; + } + } + + pchr[i] = pchr[i + 1] = '\0'; + + fclose(fp); + + return (pchr); + } + + return (NULL); +} +#endif + + +static Pipe* openPipe(pid_t pid) +{ + Pipe* ppipe = NULL; + +#if defined(IORESOURCE_TRANSFER_SYSV) || defined(IORESOURCE_TRANSFER_BSD) + int fd; + sal_Char name[PATH_MAX + 1] = ""; + + if (access(PIPEDEFAULTPATH, O_RDWR) == 0) + strcpy(name, PIPEDEFAULTPATH); + else + strcpy(name, PIPEALTERNATEPATH); + + strcat(name, "/"); + + sprintf(&name[strlen(name)], PIPENAMEMASK, pid); + +#ifdef IORESOURCE_TRANSFER_BSD + fd = socket(AF_UNIX, SOCK_STREAM, 0); + + if (fd != -1) + { + int len; + struct sockaddr_un addr; + struct stat status; + + memset(&addr, 0, sizeof(addr)); + + addr.sun_family = AF_UNIX; + strcpy(addr.sun_path, name); + len = sizeof(addr.sun_family) + strlen(addr.sun_path); + + if (access(name, O_RDWR) < 0) + { + int msk; + + /* check if there exists an orphan filesystem entry */ + if ((stat(name, &status) == 0) && + (S_ISSOCK(status.st_mode) || S_ISFIFO(status.st_mode)) && + (kill((pid_t)status.st_atime, 0) < 0)) + unlink(name); + + /* try to create a named file a base for the pipe */ + msk = umask(0); + if (bind(fd, (const struct sockaddr *)&addr, len) >= 0) + { + struct utimbuf times; + + /* set access time to our pid for marking the owner */ + stat(name, &status); + times.actime = (time_t)getpid(); + times.modtime = status.st_mtime; + utime(name, ×); + + if (listen(fd, 5) >= 0) + { + ppipe = (Pipe*) malloc(sizeof(Pipe)); + + ppipe->m_hConn = fd; + ppipe->m_hPipe = -1; + + strncpy(ppipe->m_Name, name, sizeof(ppipe->m_Name)); + } + else + { + unlink(name); /* remove filesystem entry */ + } + } + umask(msk); + } + else + { + /* connect to socket */ + if (connect(fd, (const struct sockaddr *)&addr, len) >= 0) + { + ppipe = (Pipe*) malloc(sizeof(Pipe)); + ppipe->m_hPipe = fd; + ppipe->m_hConn = -1; + ppipe->m_Name[0] = '\0'; + } + } + + if (ppipe == NULL) + close(fd); + } +#endif + +#ifdef IORESOURCE_TRANSFER_SYSV + if (access(name, O_RDWR) < 0) + { + int pd[2]; + int msk; + + /* try to create a named file a base for the pipe */ + msk = umask(0); + fd = creat(name, FIFO_MODE); + umask(msk); + + if (fd >= 0) + close(fd); + else + return 0; + + /* create pipe */ + if (pipe(pd) < 0) + return 0; + + /* bind pipe to name */ + if (((fd = ioctl(pd[1], I_PUSH, "connld" )) < 0) || + (fattach(pd[1], name) < 0 )) + return 0; + + ppipe = (Pipe*) malloc(sizeof(Pipe)); + + ppipe->m_hConn = pd[0]; + ppipe->m_hPipe = -1; + + strncpy(ppipe->m_Name, name, sizeof(ppipe->m_Name)); + } + else + { + ppipe = (Pipe*) malloc(sizeof(Pipe)); + ppipe->m_hPipe = open(name, O_RDWR); + ppipe->m_hConn = -1; + ppipe->m_Name[0] = '\0'; + } +#endif + +#endif + + return ppipe; +} + +static void closePipe(Pipe* pipe) +{ + +#if defined(IORESOURCE_TRANSFER_SYSV) || defined(IORESOURCE_TRANSFER_BSD) + if (pipe->m_hPipe != -1) + close(pipe->m_hPipe); + + if (pipe->m_hConn!= -1) + { + close(pipe->m_hConn); + + if (pipe->m_Name[0] != '\0') + unlink(pipe->m_Name); + } + + free(pipe); +#endif + +} + +static sal_Bool connectPipe(Pipe* pipe) +{ + +#ifdef IORESOURCE_TRANSFER_BSD + int fd; + + if ((fd = accept(pipe->m_hConn, NULL, NULL)) < 0) + return(False); + + pipe->m_hPipe = fd; + + return sal_True; +#endif + +#ifdef IORESOURCE_TRANSFER_SYSV + struct strrecvfd recvfd; + + if (ioctl(pipe->m_hConn, I_RECVFD, &recvfd) < 0) + return sal_False; + + pipe->m_hPipe = recvfd.fd; + + return sal_True; +#endif + +#if !defined(IORESOURCE_TRANSFER_SYSV) && !defined(IORESOURCE_TRANSFER_BSD) + return sal_False; +#endif + +} + +static int send_fd(Pipe* pipe, int fd) +{ + +#if defined(IORESOURCE_TRANSFER_SYSV) || defined(IORESOURCE_TRANSFER_BSD) + +#ifdef IORESOURCE_TRANSFER_BSD + struct msghdr msghdr; + struct iovec iov[1]; + char buffer[2]; + + struct cmsghdr* cmptr = (struct cmsghdr*)malloc(CONTROLLEN); + + iov[0].iov_base = buffer; + iov[0].iov_len = 2; + msghdr.msg_iov = iov; + msghdr.msg_iovlen = 1; + msghdr.msg_name = NULL; + msghdr.msg_namelen = 0; + msghdr.msg_control = (caddr_t) cmptr; + msghdr.msg_controllen = CONTROLLEN; + + cmptr->cmsg_level = SOL_SOCKET; + cmptr->cmsg_type = SCM_RIGHTS; + cmptr->cmsg_len = CONTROLLEN; + *(int*)CMSG_DATA(cmptr) = fd; + + if (sendmsg(pipe->m_hPipe, &msghdr, 0) < 0) + { + free(cmptr); + return(-1); + } + + free(cmptr); +#endif + +#ifdef IORESOURCE_TRANSFER_SYSV + if (ioctl(pipe->m_hPipe, I_SENDFD, fd) < 0) + return(-1); +#endif + + return(0); +#endif + +#if !defined(IORESOURCE_TRANSFER_SYSV) && !defined(IORESOURCE_TRANSFER_BSD) + return(-1); +#endif +} + +static int recv_fd(Pipe* pipe) +{ + int newFd = -1; + +#if defined(IORESOURCE_TRANSFER_SYSV) || defined(IORESOURCE_TRANSFER_BSD) + +#ifdef IORESOURCE_TRANSFER_BSD + struct msghdr msghdr; + struct iovec iov[1]; + char buffer[PATH_MAX]; + + struct cmsghdr* cmptr = (struct cmsghdr*)malloc(CONTROLLEN); + + 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; + + if (recvmsg(pipe->m_hPipe, &msghdr, 0) >= 0) + { + newFd = *(int*) CMSG_DATA(cmptr); + } + + free(cmptr); +#endif + +#ifdef IORESOURCE_TRANSFER_SYSV + struct strrecvfd recvfd; + + if (ioctl(pipe->m_hPipe, I_RECVFD, &recvfd) >= 0) + { + newFd = recvfd.fd; + } +#endif + +#endif + + return(newFd); +} + +/* Callback is called when the socket is closed by the owner */ +static void* socketCloseCallback(void* pArg) +{ + oslSocketCallbackArg* callbackArg = (oslSocketCallbackArg*) pArg; + Message msg; + + msg.m_Type = MSG_REL; + msg.m_Data = osl_Process_TypeSocket; + msg.m_Flags = 0; + msg.m_Value = callbackArg->m_ident; + write(callbackArg->m_pipe->m_hPipe, &msg, sizeof(msg)); + + if (read(callbackArg->m_pipe->m_hPipe, &msg, sizeof(msg)) == sizeof(msg)) + { + if (msg.m_Type == MSG_END) + closePipe(callbackArg->m_pipe); + } + + free(callbackArg); + + return NULL; +} + +static sal_Bool sendIOResources(Pipe* pipe, oslIOResource ioRes[]) +{ + +#if defined(IORESOURCE_TRANSFER_SYSV) || defined(IORESOURCE_TRANSFER_BSD) + int socket; + Message msg; + int i = 0; + oslSocketCallbackArg* callbackArg; + + if (connectPipe(pipe)) + { + while (ioRes[i].Type != osl_Process_TypeNone) + { + switch (ioRes[i].Type) + { + case osl_Process_TypeSocket: + { + socket = ((oslSocketImpl *)(ioRes[0].Descriptor.Socket))->m_Socket; + + if (ioRes[i].Flags & osl_Process_DFWAIT) + { + callbackArg = (oslSocketCallbackArg*) malloc(sizeof(oslSocketCallbackArg)); + + callbackArg->m_ident = i; + callbackArg->m_pipe = pipe; + +/* osl_registerSocketCallBack(ioRes[i].Descriptor.Socket,&socketCloseCallback,callbackArg); */ + + ((oslSocketImpl *)(ioRes[i].Descriptor.Socket))->m_CloseCallback = &socketCloseCallback; + ((oslSocketImpl *)(ioRes[i].Descriptor.Socket))->m_CallbackArg = callbackArg; + } + + msg.m_Type = MSG_DATA; + msg.m_Data = osl_Process_TypeSocket; + msg.m_Flags = ioRes[i].Flags; + msg.m_Value = i; + + if (write(pipe->m_hPipe, &msg, sizeof(msg)) != sizeof(msg)) + { + OSL_TRACE("Write error to pipe while transfering IO-resources, errno=%d (%s)\n", errno, strerror(errno)); + return sal_False; + } + else + { + if (send_fd(pipe, socket) < 0) + { + OSL_TRACE("IOCTL error at pipe while transfering IO-resources, errno=%d (%s)\n", errno, strerror(errno)); + return sal_False; + } + } + break; + } + + default: + OSL_TRACE("Not implemented\n"); + OSL_ASSERT(sal_False); + break; + } + + i++; + } + + msg.m_Type = MSG_END; + msg.m_Data = osl_Process_TypeNone; + msg.m_Flags = 0; + msg.m_Value = 0; + + write(pipe->m_hPipe, &msg, sizeof(msg)); + + if ((read(pipe->m_hPipe, &msg, sizeof(msg)) == sizeof(msg)) && + ((msg.m_Type == MSG_ACK) || (msg.m_Type == MSG_END))) + { + if (msg.m_Type == MSG_END) + closePipe(pipe); + + return sal_True; + } + else + { + closePipe(pipe); + + return sal_False; + } + + } +#endif + + return sal_False; +} + +static void ChildStatusProc(void *pData) +{ + int i; +/* int first = 0;*/ + pid_t pid; +/* int status;*/ + int channel[2]; + ProcessData data; + ProcessData *pdata; + + 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)); + + socketpair(AF_UNIX, SOCK_STREAM, 0, channel); + + fcntl(channel[0], F_SETFD, FD_CLOEXEC); + fcntl(channel[1], F_SETFD, FD_CLOEXEC); + + if ((pid = fork()) == 0) + { + /* Child */ + close(channel[0]); + + /* if we transfer resources give our parent a chance to + create the communiction pipe */ + if (data.m_pRes) + { + pid_t id; + + while (((i = read(channel[1], &id, sizeof(id))) < 0)) + { + if (errno != EINTR) + break; + } + } + + 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)); +#ifdef LINUX + unsetenv("HOME"); +#else + putenv("HOME="); +#endif + } + + if ((data.m_uid == (uid_t)-1) || ((data.m_uid == getuid()) && (data.m_gid == getgid()))) + + { + if (data.m_pszDir) + chdir(data.m_pszDir); + + for (i = 0; data.m_pszEnv[i] != NULL; i++) + putenv(data.m_pszEnv[i]); + +#if defined(LINUX) + /* mfe: linux likes to have just one thread when the exec family is called */ + /* this np function has this purpose ... */ + pthread_kill_other_threads_np(); +#endif + + pid=execv(data.m_pszArgs[0], (sal_Char **)data.m_pszArgs); + + } + + OSL_TRACE("Failed to exec, errno=%d (%s)\n", errno, strerror(errno)); + + /* if we reach here, something went wrong */ + write(channel[1], &errno, sizeof(errno)); + + close(channel[1]); + + _exit(255); + } + else + { /* Parent */ + int status; + Pipe* rpipe; + + close(channel[1]); + + if (pdata->m_pRes) + { + rpipe = openPipe(pid); + write(channel[0], &pid, sizeof(pid)); + + sendIOResources(rpipe, pdata->m_pRes); + } + + while (((i = read(channel[0], &status, sizeof(status))) < 0)) + { + if (errno != EINTR) + break; + } + + close(channel[0]); + + + if (i == 0) + { + osl_acquireMutex(ChildListMutex); + + pdata->m_pProcImpl->m_pid = pid; + pdata->m_pProcImpl->m_pnext = ChildList; + ChildList = pdata->m_pProcImpl; + + osl_releaseMutex(ChildListMutex); + + osl_setCondition(pdata->m_started); + + if ((pid = waitpid(pid, &status, 0)) < 0) + OSL_TRACE("Failed to wait for child process, errno=%d (%s)\n", errno, strerror(errno)); + else + { + oslProcessImpl* pChild; + + osl_acquireMutex(ChildListMutex); + + pChild = ChildList; + + /* check if it is one of our child processes */ + while (pChild != NULL) + { + if (pChild->m_pid == 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("Failed to launch child process, child reports errno=%d (%s)\n", status, strerror(status)); + + osl_setCondition(pdata->m_started); + } + } +} + +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, + oslIOResource* pResources, + oslProcess *pProcess) +{ + + oslProcessError Error; + rtl_String* strImageName=0; + rtl_String* strWorkDir=0; + sal_Char* pszImageName=0; + sal_Char* pszWorkDir=0; + sal_Char** pArguments=0; + sal_Char** pEnvironment=0; + unsigned int index; + + + if ( ustrImageName != 0 && ustrImageName->buffer[0] != 0 ) + { + rtl_uString2String( &strImageName, + rtl_uString_getStr(ustrImageName), + rtl_uString_getLength(ustrImageName), + RTL_TEXTENCODING_UTF8, + OUSTRING_TO_OSTRING_CVTFLAGS ); + + pszImageName = rtl_string_getStr(strImageName); + if ( strncmp(pszImageName,"//./",4) == 0 ) + { + pszImageName+=3; + } + } + + if ( ustrWorkDir != 0 && ustrWorkDir->buffer[0] != 0 ) + { + rtl_uString2String( &strWorkDir, + rtl_uString_getStr(ustrWorkDir), + rtl_uString_getLength(ustrWorkDir), + RTL_TEXTENCODING_UTF8, + OUSTRING_TO_OSTRING_CVTFLAGS ); + + pszWorkDir = rtl_string_getStr(strWorkDir); + } + + 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]), + RTL_TEXTENCODING_UTF8, + 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]), + RTL_TEXTENCODING_UTF8, + OUSTRING_TO_OSTRING_CVTFLAGS ); + + pEnvironment[index]=strdup(rtl_string_getStr(strEnv)); + rtl_string_release(strEnv); + pEnvironment[index+1]=0; + } + + + Error = osl_psz_executeProcess(pszImageName, + pArguments, + Options, + Security, + pszWorkDir, + pEnvironment, + pResources, + pProcess); + + 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); + } + + if ( strImageName != 0 ) + { + rtl_string_release(strImageName); + } + + if ( strWorkDir != 0 ) + { + rtl_string_release(strWorkDir); + } + + + return Error; +} + + +oslProcessError SAL_CALL osl_psz_executeProcess(sal_Char *pszImageName, + sal_Char *pszArguments[], + oslProcessOption Options, + oslSecurity Security, + sal_Char *pszDirectory, + sal_Char *pszEnvironments[], + oslIOResource* pResources, + oslProcess *pProcess) +{ + int i; + sal_Char path[PATH_MAX + 1] = ""; + ProcessData Data; + oslThread hThread; + + memset(&Data,0,sizeof(ProcessData)); + + 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(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; + + Data.m_pRes = pResources; + + 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_freeThreadHandle(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; +} + +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; +} + +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); +} + +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 'statm' */ + long size; /* numbers of pages in memory */ + long resident; /* number of resident pages */ + long share; /* number of shared pages */ + long trs; /* text resident size */ + long lrs; /* library resident size */ + long drs; /* data resident size */ + long dt; /* ditry pages */ + + /* 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 */ +}; + +void +osl_getProcStat(pid_t pid, struct osl_procStat* procstat) +{ + int fd = 0; + char name[PATH_MAX + 1]; + sprintf(name, "/proc/%u/stat", pid); + + if ((fd = open(name,O_RDONLY)) >=0 ) + { + char* tmp=0; + char prstatbuf[512]; + memset(prstatbuf,0,512); + read(fd,prstatbuf,512); + + close(fd); + /*printf("%s\n\n",prstatbuf);*/ + + + 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 + ); + } +} + +void +osl_getProcStatm(pid_t pid, struct osl_procStat* procstat) +{ + int fd = 0; + char name[PATH_MAX + 1]; + sprintf(name, "/proc/%u/statm", pid); + + if ((fd = open(name,O_RDONLY)) >=0 ) + { + char prstatmbuf[512]; + memset(prstatmbuf,0,512); + read(fd,prstatmbuf,512); + + close(fd); + + /* printf("\n\n%s\n\n",prstatmbuf);*/ + + sscanf(prstatmbuf,"%li %li %li %li %li %li %li", + &procstat->size, &procstat->resident, &procstat->share, + &procstat->trs, &procstat->lrs, &procstat->drs, + &procstat->dt + ); + } +} + +void +osl_getProcStatus(pid_t pid, struct osl_procStat* procstat) +{ + int fd = 0; + char name[PATH_MAX + 1]; + sprintf(name, "/proc/%u/status", pid); + + if ((fd = open(name,O_RDONLY)) >=0 ) + { + char* tmp=0; + char prstatusbuf[512]; + memset(prstatusbuf,0,512); + read(fd,prstatusbuf,512); + + close(fd); + + /* printf("\n\n%s\n\n",prstatusbuf);*/ + + 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 + ); + } + } +} + +#endif + +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] = ""; + + sprintf(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(IRIX) + + int fd; + sal_Char name[PATH_MAX + 1] = ""; + + sprintf(name, "/proc/%u", pid); + + if ((fd = open(name, O_RDONLY)) >= 0) + { + prstatus_t prstatus; + prpsinfo_t prpsinfo; + + if (ioctl(fd, PIOCSTATUS, &prstatus) >= 0 && + ioctl(fd, PIOCPSINFO, &prpsinfo) >= 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) + { + int pagesize = getpagesize(); + + pInfo->HeapUsage = prpsinfo.pr_size*pagesize; + + pInfo->Fields |= osl_Process_HEAPUSAGE; + } + + close(fd); + + return (pInfo->Fields == Fields) ? osl_Process_E_None : osl_Process_E_Unknown; + } + else + close(fd); + } + +#elif defined(LINUX) + +/* int fd = 0;*/ + struct osl_procStat procstat; + memset(&procstat,0,sizeof(procstat)); + + osl_getProcStat(pid, &procstat); + osl_getProcStatm(pid, &procstat); + osl_getProcStatus(pid, &procstat); + + if ( Fields & osl_Process_CPUTIMES) + { + /* + * 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) + */ + + unsigned long userseconds=(procstat.utime/HZ); + unsigned long 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) + { + /* + * 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; +} + +oslProcessError SAL_CALL osl_joinProcess(oslProcess Process) +{ +/* int status;*/ + + if (Process != NULL) + { + oslProcessImpl* pChild; + + OSL_ASSERT(ChildListMutex != NULL); + + if ( ChildListMutex == 0 ) + { + return osl_Process_E_Unknown; + } + + osl_acquireMutex(ChildListMutex); + + pChild = ChildList; + + /* 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) + osl_waitCondition(pChild->m_terminated, NULL); + else + { + /* process is not a child, so the StatusThread will not be able + to set the condition terminated */ + while (kill(((oslProcessImpl*)Process)->m_pid, 0) != -1) + sleep(1); + } + + return osl_Process_E_None; + } + + return osl_Process_E_Unknown; +} + +oslProcessError SAL_CALL osl_getExecutableFile(rtl_uString **ustrFile) +{ + sal_Char pszExecutable[PATH_MAX] = ""; + sal_Char pszUncPath[PATH_MAX+5] = ""; + oslProcessError Error; + + Error=osl_psz_getExecutableFile(pszExecutable,sizeof(pszExecutable)); + + if ( Error == osl_Process_E_None) + { + strcpy(pszUncPath,"//."); + strcat(pszUncPath,pszExecutable); + } + + /* fprintf(stderr,"Exec file is '%s'\n",pszUncPath);*/ + + rtl_uString_newFromAscii(ustrFile,pszUncPath); + + return Error; +} + + +oslProcessError SAL_CALL osl_psz_getExecutableFile(sal_Char* pszBuffer, sal_uInt32 Max) +{ + static int PrgLen = -1; + static sal_Char PrgName[PATH_MAX + 1] = ""; + + oslProcessError ret = osl_Process_E_None; + + if (PrgLen < 1) + { + sal_Char *pszCmdLine = getCmdLine(); + + if (strchr(pszCmdLine, '/')) + { + if (! osl_getFullPath(pszCmdLine, PrgName, sizeof(PrgName))) + ret = osl_Process_E_Unknown; + else + PrgLen = strlen(PrgName) + 1; + } + else + { + if ((ret = osl_searchPath(pszCmdLine, NULL, '\0', PrgName, sizeof(PrgName))) + == osl_Process_E_None) + PrgLen = strlen(PrgName) + 1; + + } + + free(pszCmdLine); + } + + if (Max >= (sal_uInt32)PrgLen) + memcpy(pszBuffer, PrgName, PrgLen); + else + ret = osl_Process_E_Unknown; + + return (ret); +} + + +sal_uInt32 SAL_CALL osl_getCommandArgCount() +{ + sal_Char pszBuffer[CMD_ARG_MAX+1] = ""; + + oslProcessError tErr = osl_Process_E_Unknown; + + if ( nArgCount == -1 ) + { + tErr = osl_getCommandArgs(pszBuffer, sizeof(pszBuffer)); + + if ( tErr != osl_Process_E_None) + { + return 0; + } + } + + /* fprintf(stderr,"osl_getCommandArgCount : ArgCount = '%i'\n",nArgCount);*/ + + return nArgCount; +} + +oslProcessError SAL_CALL osl_getCommandArg( sal_uInt32 nArg, rtl_uString **strCommandArg) +{ + oslProcessError tErr = osl_Process_E_Unknown; + sal_Char* pChr=0; + + if ( nArgCount == -1 ) + { + sal_Char pBuffer[CMD_ARG_MAX+1] = ""; + tErr = osl_getCommandArgs(pBuffer, CMD_ARG_MAX+1); + if ( tErr == osl_Process_E_None ) + { + return tErr; + } + } + +/* fprintf(stderr,"osl_getCommandArg : getting Arg No. '%i'\n",nArg); */ + +/* nArg++;*/ + + if ( nArg >= 0 && nArg < nArgCount ) + { + int nIndex=0; + int nLen; + + pChr=CmdLine; + + while ( nArg != nIndex && nIndex < nArgCount ) + { +/* fprintf(stderr,"Having arg '%i' '%s'\n",nIndex,pChr); */ + nLen = strlen(pChr); + pChr+=nLen+1; + ++nIndex; + } +/* fprintf(stderr,"osl_getCommandArg : Arg '%i' = '%s'\n",nIndex,pChr); */ + + rtl_uString_newFromAscii(strCommandArg,pChr); + tErr=osl_Process_E_None; + } + + return tErr; +} + +oslProcessError SAL_CALL osl_getCommandArgs(sal_Char* pszBuffer, sal_uInt32 Max) +{ + static int CmdLen = -1; + + if (CmdLen < 0) + { + sal_Char *pszCmdLine = getCmdLine(); + sal_Char *pStr = pszCmdLine; + sal_Char *pBuffer = CmdLine; + + OSL_ASSERT(pszCmdLine != NULL); + + if ( pszCmdLine == 0 ) + { + return osl_Process_E_Unknown; + } + + nArgCount=0; + + /* skip program name */ + pStr += strlen(pStr) + 1; + + while ((*pStr != '\0') && + ((pBuffer + strlen(pszCmdLine)) < (CmdLine + sizeof(CmdLine) - 2))) + { +/* fprintf(stderr,"osl_getCommandArgs : Arg %i is '%s'\n",nArgCount,pStr); */ + strcpy(pBuffer, pStr); + pBuffer += strlen(pStr) + 1; + pStr += strlen(pStr) + 1; + ++nArgCount; + } + + *pBuffer++ = '\0'; + + CmdLen = pBuffer - CmdLine; + free(pszCmdLine); + } + + OSL_ASSERT(pszBuffer); + + if ( pszBuffer == 0 ) + { + return osl_Process_E_Unknown; + } + + if (Max < (sal_uInt32)CmdLen) + return osl_Process_E_Unknown; + +/* fprintf(stderr,"osl_getCommandArgs : ArgCount is '%i'\n",nArgCount); */ + + memcpy(pszBuffer, CmdLine, CmdLen); + + return osl_Process_E_None; +} + +oslProcessError SAL_CALL osl_getEnvironment(rtl_uString *ustrVar, rtl_uString **ustrValue) +{ + oslProcessError Error; + sal_Char pszValue[PATH_MAX] = ""; + rtl_String* strVar=0; + sal_Char* pszVar=0; + + if ( ustrVar != 0 ) + { + rtl_uString2String( &strVar, + rtl_uString_getStr(ustrVar), + rtl_uString_getLength(ustrVar), + RTL_TEXTENCODING_UTF8, + OUSTRING_TO_OSTRING_CVTFLAGS ); + pszVar = rtl_string_getStr(strVar); + } + + + Error=osl_psz_getEnvironment(pszVar,pszValue,sizeof(pszValue)); + + rtl_uString_newFromAscii(ustrValue,pszValue); + + if ( strVar != 0 ) + { + rtl_string_release(strVar); + } + + + return Error; +} + + +oslProcessError SAL_CALL osl_psz_getEnvironment(const sal_Char* pszName, sal_Char *pszBuffer, sal_uInt32 Max) +{ + sal_Char *pStr; + + if ( (pStr = getenv(pszName)) != 0 ) + { + strncpy(pszBuffer, pStr, Max); + pszBuffer[Max-1] = '\0'; + + return osl_Process_E_None; + } + + return osl_Process_E_NotFound; +} + +oslProcessError SAL_CALL osl_searchPath(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; + + 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) + { + if (! osl_getFullPath(path, path, sizeof(path)) || + (strlen(path) >= (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; +} + +oslProcessError SAL_CALL osl_getIOResources(oslIOResource Resources[], sal_uInt32 Max) +{ + oslProcessError ret = osl_Process_E_Unknown; + +#if defined(IORESOURCE_TRANSFER_SYSV) || defined(IORESOURCE_TRANSFER_BSD) + Message msg; + int wait = 0; + int i = 0; + int newFd = -1; + Pipe* pipe = NULL; +/* sal_Bool acceptMsg = sal_False;*/ + + pipe = openPipe(getpid()); + + while ((read(pipe->m_hPipe, &msg, sizeof(msg)) == sizeof(msg)) + && (msg.m_Type != MSG_END)) + { + if (i < (int)Max) + { + switch (msg.m_Type) + { + case MSG_DATA: + switch (msg.m_Data) + { + case osl_Process_TypeSocket: + if ((newFd = recv_fd(pipe)) >= 0) + { + oslSocketImpl *pImpl = __osl_createSocketImpl(newFd); + + OSL_ASSERT(i == msg.m_Value); + + Resources[i].Type = osl_Process_TypeSocket; + Resources[i].Flags = msg.m_Flags; + Resources[i].Descriptor.Socket = (oslSocket)pImpl; + + if (msg.m_Flags & osl_Process_DFWAIT) + wait++; + } + + i++; + + break; + + default: + OSL_TRACE("Not implemented\n"); + OSL_ASSERT(sal_False); + break; + } + default: + break; + } + } + } + + Resources[i].Type = osl_Process_TypeNone; + + if (msg.m_Type == MSG_END) + { + if (wait > 0) + { + msg.m_Type = MSG_ACK; + msg.m_Data = osl_Process_TypeNone; + msg.m_Flags = 0; + write(pipe->m_hPipe, &msg, sizeof(msg)); + + do + { + if ((read(pipe->m_hPipe, &msg, sizeof(msg)) != sizeof(msg)) + || (msg.m_Type != MSG_REL)) + break; + + i = msg.m_Value; + + if (Resources[i].Type != osl_Process_TypeNone) + { + OSL_ASSERT(Resources[i].Type == msg.m_Data); + OSL_ASSERT(Resources[i].Flags & osl_Process_DFWAIT); + + Resources[i].Flags &= ~osl_Process_DFWAIT; + + if (--wait > 0) + { + msg.m_Type = MSG_ACK; + msg.m_Data = osl_Process_TypeNone; + msg.m_Flags = 0; + write(pipe->m_hPipe, &msg, sizeof(msg)); + } + } + } + while (wait > 0); + } + + msg.m_Type = MSG_END; + msg.m_Data = osl_Process_TypeNone; + msg.m_Flags = 0; + write(pipe->m_hPipe, &msg, sizeof(msg)); + + ret = osl_Process_E_None; + } + + closePipe(pipe); + +#endif + + return ret; +} + +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 = 2; + 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() */ + + if ( ( nSend = sendmsg(PipeFD, &msg, 0)) > 0) + { + bRet = sal_True; +/* fprintf(stderr,"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"); + } + + + +#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 = 2; + 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; + *(int*)CMSG_DATA(cmptr) = SocketFD; + + if (sendmsg(PipeFD, &msg, 0) > 0) + { + bRet = sal_True; + } + else + { + OSL_TRACE("sendFdPipe : sending failed (%s)",strerror(errno)); + } + + free(cmptr); +#endif + + return bRet; +} + + +oslSocketImpl* receiveFdPipe(int PipeFD) +{ + oslSocketImpl* pSocket = 0; + struct msghdr msghdr; + struct iovec iov[1]; + char buffer[PATH_MAX]; + +#if defined(IOCHANNEL_TRANSFER_BSD) + char *ptr; + sal_Int32 nread, status; + int newfd; + int RetCode=0; + + + 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 */ + + if ((nread = recvmsg(PipeFD, &msghdr, 0)) > 0) + { +/* fprintf(stderr,"receiveFdPipe : received '%i' bytes\n",nread);*/ + + if (newfd >= 0) + { + pSocket = __osl_createSocketImpl(newfd); + RetCode=1; +/* OSL_TRACE("received fd %i\n",newfd); */ + } + } + else + { + OSL_TRACE("receiveFdPipe : receiving failed (%s)",strerror(errno)); + } + + OSL_TRACE("receiveFdPipe : writing back %i",RetCode); + nread=write(PipeFD,&RetCode,sizeof(RetCode)); + +#else + struct cmsghdr* cmptr = (struct cmsghdr*)malloc(CONTROLLEN); + int newfd; + +/* 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; + + if ( + (recvmsg(PipeFD, &msghdr, 0) > 0) && + (msghdr.msg_controllen == CONTROLLEN) + ) + { + newfd = *(int*)CMSG_DATA(cmptr); +/* OSL_TRACE("received fd %i\n",newfd); */ + pSocket = __osl_createSocketImpl(newfd); + + + } + else + { + OSL_TRACE("receiveFdPipe : receiving failed (%s)",strerror(errno)); + } + + free(cmptr); +#endif + + return pSocket; +} + +sal_Bool osl_sendResourcePipe(oslPipe Pipe, oslSocket Socket) +{ + oslSocketImpl* pSocket = (oslSocketImpl*) Socket; + oslPipeImpl* pPipe = (oslPipeImpl*) Pipe; + + sal_Bool bRet = sal_False; + + if ( pSocket == 0 || pPipe == 0 ) + { + return sal_False; + } + + bRet = sendFdPipe(pPipe->m_Socket,pSocket->m_Socket); + + return bRet; +} + + +oslSocket osl_receiveResourcePipe(oslPipe Pipe) +{ + oslPipeImpl* pPipe = (oslPipeImpl*) Pipe; + oslSocketImpl* pSocket=0; + + if ( pPipe == 0 ) + { + return 0; + } + + pSocket = receiveFdPipe(pPipe->m_Socket); + + return (oslSocket) pSocket; +} + + +sal_Bool osl_getFullPath(const sal_Char* pszFilename, sal_Char* pszPath, sal_uInt32 MaxLen) +{ + int n; + sal_Char* pBuffer; + sal_Char* pDir; + struct stat status; + struct stat root; + struct stat parent; + sal_Char Path[PATH_MAX + 1] = ""; + + pDir = strdup(pszFilename); + + /* check if path has a trailing '/', so it should specify a directory, */ + /* or if last component doesn't exist or is not a directory. So in any case */ + /* of this the last component should be remove before checking the path */ + if ((pDir[strlen(pDir) - 1] == '/') || + (stat(pDir, &status) < 0) || (! S_ISDIR(status.st_mode))) + { + sal_Char* pFile; + + if ((pFile = strrchr(pDir, '/')) != NULL) + { + *pFile++ = '\0'; + strcpy(Path, pFile); + strcat(Path, "/"); + } + else + { + strcpy(Path, pDir); + strcat(Path, "/"); + rtl_freeMemory(pDir); + pDir = strdup("."); + } + + if ((strlen(pDir) > 0) && + ((stat(pDir, &status) < 0) || (! S_ISDIR(status.st_mode)))) + { + rtl_freeMemory(pDir); + return sal_False; + } + } + else + { + Path[0] = '\0'; + } + + if ((n = pathconf(pDir, _PC_PATH_MAX)) < 0) + n = PATH_MAX + 1; + + pBuffer = (sal_Char*) rtl_allocateMemory((n + 1) * sizeof(sal_Char)); + strcpy(pBuffer, pDir); + + stat("/", &root); + + strcat(pBuffer, "/."); + STAT_PARENT(pBuffer, &status); + strcat(pBuffer, "."); + + while ((status.st_dev != root.st_dev) || (status.st_ino != root.st_ino)) + { + DIR* dir; + struct dirent* entry; + + if (((dir = opendir(pBuffer)) == NULL) || + (STAT_PARENT(pBuffer, &parent) < 0)) + { + rtl_freeMemory(pDir); + rtl_freeMemory(pBuffer); + + return sal_False; + } + + if (status.st_dev == parent.st_dev) + { + do + { + if ((entry = readdir(dir)) == NULL) + { + rtl_freeMemory(pDir); + rtl_freeMemory(pBuffer); + + return sal_False; + } + } + while (entry->d_ino != status.st_ino); + } + else + { + /* + * if this point is a mount point we have to check + * each entry, because the inode number in the directory + * is for the parent directory, not for the mounted file + */ + sal_Char* full = (sal_Char*) rtl_allocateMemory((strlen(pBuffer) + PATH_MAX + 1) * sizeof(sal_Char)); + sal_Char* name; + + strcpy(full, pBuffer); + strcat(full, "/"); + name = full + strlen(full); + + do + { + if ((entry = readdir(dir)) == NULL) + { + rtl_freeMemory(full); + + rtl_freeMemory(pDir); + rtl_freeMemory(pBuffer); + + return sal_False; + } + + if ((entry->d_name[0] == '.') && ((entry->d_name[1] == '\0') || + ((entry->d_name[1] == '.') && (entry->d_name[2] == '\0')))) + continue; + + strcpy(name, entry->d_name); + + if (STAT_PARENT(full, &parent) < 0) + continue; + } + while ((parent.st_ino != status.st_ino) || (parent.st_dev != status.st_dev)); + + rtl_freeMemory(full); + } + + strcat(Path, entry->d_name); + strcat(Path, "/"); + + closedir(dir); + + STAT_PARENT(pBuffer, &status); + strcat(pBuffer, "/.."); + } + + rtl_freeMemory(pDir); + rtl_freeMemory(pBuffer); + + if (strlen(Path) < MaxLen) + { + int n; + sal_Char *p, *l; + + for (p = Path + strlen(Path), l = p; p >= Path; p--) + { + if (*p == '/') + { + n = l - (p + 1); + memcpy(pszPath, p + 1, n); + pszPath += n; + *pszPath++ = '/'; + l = p; + } + } + + n = l - (p + 1); + memcpy(pszPath, p + 1, n); + pszPath += n; + *pszPath = '\0'; + + return sal_True; + } + + return sal_False; +} + +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; +} + + diff --git a/sal/osl/unx/procimpl.h b/sal/osl/unx/procimpl.h new file mode 100644 index 000000000000..d1d7e06c3737 --- /dev/null +++ b/sal/osl/unx/procimpl.h @@ -0,0 +1,84 @@ +/************************************************************************* + * + * $RCSfile: procimpl.h,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:17:21 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +#ifndef _OSL_PROCIMPL_H_ +#define _OSL_PROCIMPL_H_ + +#include +#include + +#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..46ab34856087 --- /dev/null +++ b/sal/osl/unx/profile.c @@ -0,0 +1,2896 @@ +/************************************************************************* + * + * $RCSfile: profile.c,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:17:21 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + + +#include "system.h" + +#include +#include +#include +#include +#include + +#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_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[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; + sal_Bool m_bIsSoffice; +} 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_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 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); + +extern sal_Bool SAL_CALL osl_psz_getHomeDir(oslSecurity Security, sal_Char* pszDirectory, sal_uInt32 nMax); +extern sal_Bool SAL_CALL osl_getConfigDir(oslSecurity Security, rtl_uString **ustrDirectory); +extern oslProcessError SAL_CALL osl_psz_getExecutableFile(sal_Char* pszBuffer, sal_uInt32 Max); +oslProfile SAL_CALL osl_psz_openProfile(const sal_Char *pszProfileName, oslProfileOption Flags); +sal_Bool SAL_CALL osl_psz_getProfileName(const sal_Char* pszPath, const sal_Char* pszName, + sal_Char* pszBuffer, sal_uInt32 MaxLen); +sal_Bool osl_getFullPath(const sal_Char* pszFilename, sal_Char* pszPath, sal_uInt32 MaxLen); +sal_Bool SAL_CALL osl_psz_getConfigDir(oslSecurity Security, sal_Char* pszDirectory, sal_uInt32 nMax); +oslProcessError SAL_CALL osl_getCommandArgs(sal_Char* pszBuffer, sal_uInt32 Max); + + +static sal_Bool bGlobalSofficeFlag=sal_False; + + +/*****************************************************************************/ +/* Exported Module Functions */ +/*****************************************************************************/ +oslProfile SAL_CALL osl_openProfile(rtl_uString *ustrProfileName, oslProfileOption Options) +{ + oslProfile pProfile=0; + rtl_String* strProfileName=0; + sal_Char* pszProfileName=0; + + + if ( ustrProfileName != 0 && ustrProfileName->buffer[0] != 0 ) + { + + rtl_uString2String( &strProfileName, + rtl_uString_getStr(ustrProfileName), + rtl_uString_getLength(ustrProfileName), + RTL_TEXTENCODING_UTF8, + OUSTRING_TO_OSTRING_CVTFLAGS ); + pszProfileName = rtl_string_getStr(strProfileName); + + if ( strncmp(pszProfileName,"//./",4) != 0 ) + { + rtl_string_release(strProfileName); + return 0; + } + pszProfileName+=3; + } + + + pProfile = osl_psz_openProfile(pszProfileName,Options); + + if ( strProfileName != 0 ) + { + rtl_string_release(strProfileName); + } + + + return pProfile; +} + + +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; + +#ifdef TRACE_OSL_PROFILE + OSL_TRACE("In osl_openProfile\n"); +#endif + + if (pszProfileName == NULL) + { + OSL_VERIFY(osl_psz_getProfileName(NULL, NULL, Filename, sizeof(Filename))); + pszProfileName = Filename; + } + + +#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_READWRITE ) */ +/* { */ +/* OSL_TRACE("with osl_Profile_READWRITE\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_bIsSoffice = sal_False; + + if ( strstr(pszProfileName,"sofficerc") != 0 ) + { + if ( bGlobalSofficeFlag == sal_True ) + { + OSL_ENSURE(0,"Attempt to open sofficerc more than once\n"); + } + else + { + bGlobalSofficeFlag=sal_True; + } + pProfile->m_bIsSoffice=sal_True; + } + + 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); + OSL_ASSERT(bRet); + + + OSL_VERIFY(osl_getFullPath(pszProfileName, pProfile->m_FileName, sizeof(pProfile->m_FileName))); + + + 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_SYSTEM)) */ +/* { */ + if ( ! ( pProfile->m_Flags & osl_Profile_READLOCK ) && ( pProfile->m_Flags & FLG_MODIFIED ) ) + { + pProfile = acquireProfile(Profile,sal_True); + + if ( pProfile != 0 ) + { +/* if (pProfile->m_pFile == NULL) */ +/* pProfile->m_pFile = openFileImpl(pProfile->m_FileName, pProfile->m_Flags); */ + + bRet=storeProfile(pProfile->m_pFile, 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 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]); + pProfile->m_Lines[index]=0; + } + } + free(pProfile->m_Lines); + pProfile->m_Lines=0; + } + 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); + pProfile->m_Sections[index].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(pFile,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; +#ifdef DEBUG + 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; + } + +#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 + +#ifdef DEBUG + 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)); +/* OSL_TRACE("Out osl_writeProfileImpl() [write '%s']\n",strerror(errno));*/ + return (sal_False); + } + +#ifdef DEBUG + OSL_ASSERT(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=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] = ""; + +#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] = ""; + +#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[1024] = ""; + 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); + } + + + 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)); + +#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)); + +#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)); + +#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); +} + +sal_Bool SAL_CALL osl_getProfileName(rtl_uString* ustrPath, rtl_uString* ustrName, rtl_uString** strProfileName) +{ + sal_Bool bRet=sal_False; + sal_Char pszBuffer[PATH_MAX] = ""; + rtl_uString* strNativeName=0; + rtl_String* strPath=0; + rtl_String* strName=0; + sal_Char* pszPath=0; + sal_Char* pszName=0; + + + if ( ustrPath != 0 && ustrPath->buffer[0] != 0 ) + { + rtl_uString2String( &strPath, + rtl_uString_getStr(ustrPath), + rtl_uString_getLength(ustrPath), + RTL_TEXTENCODING_UTF8, + OUSTRING_TO_OSTRING_CVTFLAGS ); + pszPath = rtl_string_getStr(strPath); + + /* Don't skip UNC prefix if metatag is used */ + + if ( strncmp(pszPath,"//./",4) == 0 ) + { + pszPath+=3; + } + else if ( strncmp(pszPath, "?", 1) != 0 ) + { + rtl_string_release(strPath); + return 0; + } + } + + if ( ustrName != 0 && ustrName->buffer[0] != 0 ) + { + rtl_uString2String( &strName, + rtl_uString_getStr(ustrName), + rtl_uString_getLength(ustrName), + RTL_TEXTENCODING_UTF8, + OUSTRING_TO_OSTRING_CVTFLAGS ); + pszName = rtl_string_getStr(strName); + } + + + + bRet=osl_psz_getProfileName(pszPath,pszName,pszBuffer,sizeof(pszBuffer)); + + + if ( strPath != 0 ) + { + rtl_string_release(strPath); + } + + if ( strName != 0 ) + { + rtl_string_release(strName); + } + + /* Convert result to UNC notation */ + + rtl_uString_newFromAscii(&strNativeName,pszBuffer); + osl_normalizePath( strNativeName, strProfileName ); + rtl_uString_release( strNativeName ); + + + return bRet; +} + + +sal_Bool SAL_CALL osl_psz_getProfileName(const sal_Char* pszPath, const sal_Char* pszName, + sal_Char* pszBuffer, sal_uInt32 MaxLen) +{ + sal_Char *pChr=0; + const sal_Char *pStr=0; + sal_Char Home[PATH_MAX] = ""; + sal_Char Config[PATH_MAX] = ""; + sal_Char Path[PATH_MAX] = ""; + sal_Char File[PATH_MAX] = ""; + sal_Bool bFailed; + sal_Bool bHidden = sal_False; + oslSecurity security; + + +#ifdef TRACE_OSL_PROFILE + OSL_TRACE("In osl_getProfileName\n"); +#endif + + security = osl_getCurrentSecurity(); + bFailed = ! (osl_psz_getHomeDir(security, Home, sizeof(Home)) && + osl_psz_getConfigDir(security, Config, sizeof(Config))); + osl_freeSecurityHandle(security); + + if (bFailed) + { +#ifdef TRACE_OSL_PROFILE + OSL_TRACE("Out osl_getProfileName [get directory]\n"); +#endif + return (sal_False); + } + + + if (Home[strlen(Home) - 1] != '/') + { + strcat(Home, "/"); + } + + if (Config[strlen(Config) - 1] != '/') + { + strcat(Config, "/"); + } + + + /* build file name */ + if (pszName == NULL) + { + if (osl_psz_getExecutableFile(Path, sizeof(Path)) != osl_Process_E_None) + { +#ifdef TRACE_OSL_PROFILE + OSL_TRACE("Out osl_getProfileName [get exe file name]\n"); +#endif + return (sal_False); + } + + + /* remove path from filename */ + if ((pStr = strrchr(Path, '/')) == NULL) + pStr = Path; + else + pStr++; + + if (((pChr = strrchr(pStr, '.')) != NULL) && (pChr != pStr)) + *pChr = '\0'; + } + else + { + /* FIXME: mfe: assignment of 'const char' to 'char' */ + pStr = pszName; + } + + strcpy(File, pStr); + + /* add default extensiom */ + if (strchr(File + 1, '.') == NULL) + strcat(File, STR_INI_EXTENSION); + + /* build directory path */ + if (pszPath) + { + sal_Char Dir[PATH_MAX] = ""; + sal_Char Loc[PATH_MAX] = ""; + + if ((strncmp(pszPath, STR_INI_METAHOME, sizeof(STR_INI_METAHOME) - 1) == 0) && + ((pszPath[sizeof(STR_INI_METAHOME) - 1] == '\0') || + (pszPath[sizeof(STR_INI_METAHOME) - 1] == '/'))) + { + strcpy(Dir, Home); + if (pszPath[sizeof(STR_INI_METAHOME) - 1] == '/') + strcat(Dir, pszPath + sizeof(STR_INI_METAHOME)); + pszPath = Dir; + } + else if ((strncmp(pszPath, STR_INI_METACFG, sizeof(STR_INI_METACFG) - 1) == 0) && + ((pszPath[sizeof(STR_INI_METACFG) - 1] == '\0') || + (pszPath[sizeof(STR_INI_METACFG) - 1] == '/'))) + { + strcpy(Dir, Config); + if (pszPath[sizeof(STR_INI_METACFG) - 1] == '/') + strcat(Dir, pszPath + sizeof(STR_INI_METACFG)); + pszPath = Dir; + } + else if ((strncmp(pszPath, STR_INI_METASYS, sizeof(STR_INI_METASYS) - 1) == 0) && + ((pszPath[sizeof(STR_INI_METASYS) - 1] == '\0') || + (pszPath[sizeof(STR_INI_METASYS) - 1] == '/'))) + { + strcpy(Dir, "/etc/"); + if (pszPath[sizeof(STR_INI_METASYS) - 1] == '/') + strcat(Dir, pszPath + sizeof(STR_INI_METASYS)); + pszPath = Dir; + } + else if ((strncmp(pszPath, STR_INI_METAINS, sizeof(STR_INI_METAINS) - 1) == 0) && + ((pszPath[sizeof(STR_INI_METAINS) - 1] == '\0') || + (pszPath[sizeof(STR_INI_METAINS) - 1] == '/') || + (pszPath[sizeof(STR_INI_METAINS) - 1] == '"'))) + { + if (! lookupProfile(pszPath + sizeof(STR_INI_METAINS) - 1, File, Dir)) + { +#ifdef TRACE_OSL_PROFILE + OSL_TRACE("Out osl_getProfileName [lookup profile]\n"); +#endif + return (sal_False); + } + + pszPath = Dir; + } + + OSL_VERIFY(osl_getFullPath(Home, Loc, sizeof(Loc))); + + /* when file is in the home directory it should be hidden */ + if (osl_getFullPath(pszPath, Path, sizeof(Path))) + { + if (Path[strlen(Path) - 1] != '/') strcat(Path, "/"); + + if (strcmp(Loc, Path) == 0) + bHidden = sal_True; + } + + OSL_ASSERT(strlen(pszPath) <= sizeof(Path)); + strcpy(Path, pszPath); + if (Path[strlen(Path) - 1] != '/') strcat(Path, "/"); + } + else + { + /* config files should be hidden if in the home directory */ + if (strcmp(Home, Config) == 0) + bHidden = sal_True; + + strcpy(Path, Config); + } + + if (bHidden && (Path[0] != '.')) + strcat(Path, "."); + + strcat(Path, File); + + /* copy filename */ + strncpy(pszBuffer, Path, MaxLen); + pszBuffer[MaxLen - 1] = '\0'; + +#ifdef TRACE_OSL_PROFILE + OSL_TRACE("Out osl_getProfileName [ok]\n"); +#endif + + return (strlen(File) < MaxLen); +} + +/*****************************************************************************/ +/* 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; + } + + if ( fcntl(pFile->m_Handle, F_SETLKW, &lock) == -1 ) + { + 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 | 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) + { +#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); + } + + /* mfe: new WriteBuf obsolete */ +/* pFile->m_pWritePtr = pFile->m_WriteBuf;*/ +/* pFile->m_pReadPtr = pFile->m_ReadBuf + sizeof(pFile->m_ReadBuf);*/ + +#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 ) + { + /* 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) */ +/* write(pFile->m_Handle, pFile->m_WriteBuf, */ +/* pFile->m_pWritePtr - pFile->m_WriteBuf); */ + + 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) +{ +#ifdef TRACE_OSL_PROFILE + OSL_TRACE("In osl_OslProfile_rewindFile\n"); +#endif + + if (pFile->m_Handle >= 0) + { + /* 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) */ +/* { */ +/* write(pFile->m_Handle, pFile->m_WriteBuf, */ +/* pFile->m_pWritePtr - pFile->m_WriteBuf); */ + +/* pFile->m_pWritePtr = pFile->m_WriteBuf; */ +/* } */ + + pFile->m_pReadPtr = pFile->m_ReadBuf + sizeof(pFile->m_ReadBuf); + +#ifdef DEBUG_OSL_PROFILE + OSL_TRACE("rewinding\n"); +#endif + lseek(pFile->m_Handle, SEEK_SET, 0L); + + if (bTruncate) + { +#ifdef DEBUG_OSL_PROFILE + OSL_TRACE("truncating\n"); +#endif + ftruncate(pFile->m_Handle, 0L); + } + + } + +#ifdef TRACE_OSL_PROFILE + OSL_TRACE("Out osl_OslProfile_rewindFile [ok]\n"); +#endif + return (sal_True); +} + + +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); + +#ifdef DEBUG_OSL_PROFILE +/* OSL_TRACE( "read line: \"%s\" (%d bytes)\n", pLine ? pLine : "", nLineBytes );*/ +#endif + + 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; + +#ifdef DEBUG_OSL_PROFILE +/* OSL_TRACE("File Buffer in _putLine '%s' size == '%i' '%i'(%i)\n", + pFile->m_pBuf,pFile->m_BufLen,strlen(pFile->m_pBuf),pFile->m_BufLen - pFile->m_BufFree);*/ +#endif + + 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 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 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 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; + + 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); +/* 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) && + (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); +/* 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) && + (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; +/* return (sal_False);*/ + } + + } + else + { + /* new section */ + + if (! addSection(pProfile, i, pStr + 1, pChar - pStr - 1)) + { + OSL_ASSERT(0); + continue; +/* return (sal_False);*/ + } + + } + } + + return (sal_True); +} + +static sal_Bool storeProfile(osl_TFile* pFile, 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 ( pProfile->m_bIsSoffice == sal_True ) + { +/* OSL_ENSURE( ( ( pTmpFile->m_nWriteBufLen - pTmpFile->m_nWriteBufFree ) > 5000 ), "Profile to write is less than 5000 bytes\n"); */ +/* OSL_ENSURE( ( pProfile->m_NoSections > 15 ), "Profile to write has less than 15 Sections\n"); */ +/* OSL_ENSURE( ( pProfile->m_NoLines > 170 ), "Profile to write has less than 170 lines\n"); */ +/* OSL_ENSURE( ( i > 170 ), "less than 170 lines to be written in Profile\n"); */ + } + + 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; + + /* 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] = ""; + + 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_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(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->m_pFile, 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); +} + +static sal_Bool lookupProfile(const sal_Char *pszPath, const sal_Char *pszFile, sal_Char *pPath) +{ + sal_Char *pChr, *pStr; + sal_Char Path[PATH_MAX] = ""; + sal_Char Product[132] = ""; + sal_Char Buffer[1024] = ""; + sal_Char szSUPD[20] = ""; + + if (*pszPath == '"') + { + int i = 0; + + pszPath++; + + while ((*pszPath != '"') && (*pszPath != '\0')) + Product[i++] = *pszPath++; + + Product[i] = '\0'; + + if (*pszPath == '"') + pszPath++; + + if ( *pszPath == '/' ) + { + pszPath++; + } + } + else + { + /* if we have no product identification, do a special handling for soffice.ini */ + if (strcasecmp(SVERSION_PROFILE, pszFile) == 0) + { + sal_Char Profile[PATH_MAX] = ""; + sal_Char Dir[PATH_MAX] = ""; + oslProfile hProfile; + + /* open sversionrc in the system directory, and try to locate the entry + with the highest version for StarOffice */ + if ((osl_psz_getProfileName(SVERSION_FALLBACK, SVERSION_NAME, Profile, sizeof(Profile))) && + (hProfile = osl_psz_openProfile(Profile, osl_Profile_READLOCK))) + { + osl_getProfileSectionEntries(hProfile, SVERSION_SECTION, + Buffer, sizeof(Buffer)); + + for (pChr = Buffer; *pChr != '\0'; pChr += strlen(pChr) + 1) + { + if ((strncasecmp(pChr, SVERSION_SOFFICE, sizeof(SVERSION_SOFFICE) - 1) == 0) && + (strcasecmp(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 sversionrc in the users directory, and try to locate the entry + with the highest version for StarOffice */ + if ((strcmp(SVERSION_LOCATION, SVERSION_FALLBACK) != 0) && + (osl_psz_getProfileName(SVERSION_LOCATION, SVERSION_NAME, Profile, sizeof(Profile))) && + (hProfile = osl_psz_openProfile(Profile, osl_Profile_READLOCK))) + { + osl_getProfileSectionEntries(hProfile, SVERSION_SECTION, + Buffer, sizeof(Buffer)); + + for (pChr = Buffer; *pChr != '\0'; pChr += strlen(pChr) + 1) + { + if ((strncasecmp(pChr, SVERSION_SOFFICE, sizeof(SVERSION_SOFFICE) - 1) == 0) && + (strcasecmp(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 == '+')) && + (strncasecmp(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] != '/') + { + 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_psz_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,SVERSION_USER); + } + else + { + strcat(Path, pszPath); + } + + /* if the directory given as a parameter does not exist, remove any specified subdirectories + like "bin" or "program" */ + if (((access(Path, 0) < 0) && (pStr != NULL)) || (strlen(pszPath) <= 0)) + { + static sal_Char *SubDirs[] = SVERSION_DIRS; + + unsigned int i = 0; + + for (i = 0; i < (sizeof(SubDirs) / sizeof(SubDirs[0])); i++) + if (strncasecmp(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] != '/') + strcat(Path, "/"); + strcat(Path, pszFile); + + if ((access(Path, 0) < 0) && (strlen(Product) > 0)) + { + sal_Char Profile[PATH_MAX] = ""; + 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_psz_getProfileName(SVERSION_LOCATION, SVERSION_NAME, Profile, sizeof(Profile))) && + (hProfile = osl_psz_openProfile(Profile, osl_Profile_READLOCK))) + { + pChr = &Product[strlen(Product)]; + + /* append build number */ + strcat(Product, "/"); + snprintf(szSUPD, sizeof(szSUPD), "%li", osl_getSUPD()); + strcat(Product, szSUPD); + + 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_psz_getProfileName(SVERSION_FALLBACK, SVERSION_NAME, Profile, sizeof(Profile))) && + (hProfile = osl_psz_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] != '/') + { + + strcat(Path, "/"); + } + pChr=&Path[strlen(Path)]; + 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); +} + + + diff --git a/sal/osl/unx/secimpl.h b/sal/osl/unx/secimpl.h new file mode 100644 index 000000000000..233b46bcf02e --- /dev/null +++ b/sal/osl/unx/secimpl.h @@ -0,0 +1,84 @@ +/************************************************************************* + * + * $RCSfile: secimpl.h,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:17:21 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +#ifndef _OSL_SECURITYIMPL_H_ +#define _OSL_SECURITYIMPL_H_ + +#include + +#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/unx/security.c b/sal/osl/unx/security.c new file mode 100644 index 000000000000..7a8fb87552e0 --- /dev/null +++ b/sal/osl/unx/security.c @@ -0,0 +1,1101 @@ +/************************************************************************* + * + * $RCSfile: security.c,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:17:21 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + + +#include "system.h" + +#include +#include +#ifndef _OSL_MODULE_H_ +#include +#endif + +#ifdef SOLARIS +#include +#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 = "unknown"; + 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_dir = "/tmp"; + pSecImpl->m_pPasswd.pw_shell = "unknown"; + pSecImpl->m_isValid = sal_False; + } + + + return ((oslSecurity)pSecImpl); +} + + +#ifdef LINUX + +/* + * + * 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 + +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 + */ + +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 = 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 = 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; +} + +/* + * 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 = 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", 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 = True; + } + + return pam_module; +} + +/* + * User Identification using PAM + */ + +static sal_Bool +osl_PamAuthentification( const sal_Char* name, const sal_Char* password ) +{ + sal_Bool success = False; + + sal_PamModule* pam_module; + + pam_module = osl_getPAM(); + if ( pam_module != NULL ) + { + 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); + + return_value = pam_module->pam_start( "su", name, + &pam_conversation, &pam_handle); + if (return_value == PAM_SUCCESS ) + return_value = pam_module->pam_authenticate(pam_handle, 0); + if (return_value == PAM_SUCCESS ) + return_value = pam_module->pam_acct_mgmt(pam_handle, 0); + pam_module->pam_end( pam_handle, return_value ); + + success = (sal_Bool)(return_value == PAM_SUCCESS); + } + + return success; +} + + +/* 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 ) +{ + 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 = False; + + if ( !load_once ) + { + oslModule crypt_library; + + crypt_library = osl_psz_loadModule( "libcrypt.so", SAL_LOADMODULE_DEFAULT ); /* never closed */ + if ( crypt_library != NULL ) + crypt_sym = (char* (*)(const char *, const char *)) osl_psz_getSymbol(crypt_library, "crypt" ); + if ( crypt_sym == NULL ) /* no libcrypt or libcrypt without crypt */ + crypt_sym = (char* (*)(const char *, const char *)) &osl_noCrypt; + + load_once = True; + } + + return (void*)crypt_sym; +} + +/* replacement for crypt function for password encryption, uses either + strong encryption of dlopen´ed libcrypt.so 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 *key, char *salt); + + dynamic_crypt = (char * (*)(char *, char *)) osl_getCrypt(); + + return dynamic_crypt( (sal_Char*)key, (sal_Char*)salt ); +} + +/* + * 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 + */ + +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); + + encrypted_plain = (sal_Char *)osl_dynamicCrypt( pPlainPassword, salt ); + success = (sal_Bool) (strcmp(pEncryptedPassword, encrypted_plain) == 0); + + pthread_mutex_unlock(&crypt_mutex); + + return success; +} + +/* + * the oslSecurityImpl structure is merely a struct passwd plus addons like a + * buffer, which may be used in *_r calls. Copying is less nifty since struct + * passwd has some member (pw_name, pw_passwd ...) wich point into this buffer. + * osl_copySecurity copies the data from the src->passwd entries (which do or + * do not point to src->buffer) one by one into the dst->buffer and make the + * dst->passwd entries point to the corresponding spots in dst->buffer + * NOTE: the function implies that PASSWD_BUFFER_SIZE is sufficient to hold the + * memory, otherwise getpwnam_r fails anyway and this routine + * isn't called at all. If this doesn't hold some entries will contain + * garbage, but memory is kept clean and does not leak. + */ + +/* wraper around memcpy which maintains buffer integrity */ +sal_Char* SAL_CALL +osl_copyPasswdEntry( sal_Char *dst, sal_Char *src, sal_Int32 *size ) +{ + sal_Int32 len; + + len = strlen( src ) + 1; + *size += len; + if ( *size < PASSWD_BUFFER_SIZE ) + { + memcpy( dst, src, len ); + dst += len; + } + + return dst; +} + +/* copy a security by using the oslSecurityImpl.m_buffer for mem requirements */ +oslSecurity SAL_CALL +osl_copySecurity ( oslSecurityImpl* src ) +{ + sal_Int32 size = 0; + oslSecurityImpl *dst; + sal_Char *buffer; + + dst = (oslSecurityImpl*) malloc( sizeof(oslSecurityImpl) ); + buffer = (sal_Char*)&(dst->m_buffer); + + buffer = osl_copyPasswdEntry ( dst->m_pPasswd.pw_name = buffer, + src->m_pPasswd.pw_name, &size ); + buffer = osl_copyPasswdEntry ( dst->m_pPasswd.pw_passwd = buffer, + src->m_pPasswd.pw_passwd, &size ); + buffer = osl_copyPasswdEntry ( dst->m_pPasswd.pw_gecos = buffer, + src->m_pPasswd.pw_gecos, &size ); + buffer = osl_copyPasswdEntry ( dst->m_pPasswd.pw_dir = buffer, + src->m_pPasswd.pw_dir, &size ); + buffer = osl_copyPasswdEntry ( dst->m_pPasswd.pw_shell = buffer, + src->m_pPasswd.pw_shell, &size ); + + dst->m_pPasswd.pw_uid = src->m_pPasswd.pw_uid; + dst->m_pPasswd.pw_gid = src->m_pPasswd.pw_gid; + + dst->m_isValid = src->m_isValid; + + return (oslSecurity)dst ; +} + +#endif +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; +} + + +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; + +#elif defined HPUX + + oslSecurityImpl *pSecImpl = NULL; + + if ((pszUserName == NULL) || (pszPasswd == NULL) || (pSecurity == NULL)) + return osl_Security_E_Unknown; + + pSecImpl = malloc(sizeof(oslSecurityImpl)); + + pSecImpl->m_isValid = sal_False; + + if (getpwnam_r(pszUserName, &pSecImpl->m_pPasswd, + pSecImpl->m_buffer, PASSWD_BUFFER_SIZE) == 0) + { + sal_Char salt[3], *cryptPasswd; + CRYPTD aCRYPTD; + struct spwd *pSpwd; + + strncpy(salt, pSecImpl->m_pPasswd.pw_passwd, 2); + salt[2] = '\0'; + cryptPasswd = crypt_r((sal_Char*)pszPasswd, salt, &aCRYPTD); + + if (strcmp(pSecImpl->m_pPasswd.pw_passwd, cryptPasswd) == 0) + { + pSecImpl->m_isValid = sal_True; + *pSecurity = (oslSecurity) pSecImpl; + return osl_Security_E_None; + } + + /* check for trusted systems */ + if (pSpwd = getspnam((sal_Char*)pszUserName)) + { + strncpy(salt, pSpwd->sp_pwdp, 2); + salt[2] = '\0'; + cryptPasswd = crypt_r((sal_Char*)pszPasswd, salt, &aCRYPTD); + + if (strcmp(pSpwd->sp_pwdp, cryptPasswd) == 0) + { + pSecImpl->m_isValid = sal_True; + strcpy(pSecImpl->m_pPasswd.pw_passwd, pSpwd->sp_pwdp); + *pSecurity = (oslSecurity)pSecImpl; + return osl_Security_E_None; + } + } + + free(pSecImpl); + *pSecurity = NULL; + return osl_Security_E_WrongPassword; + } + else + { + free(pSecImpl); + *pSecurity = NULL; + return osl_Security_E_UserUnknown; + } + +#elif defined IRIX +/* getpwnam_r (_POSIX1C) returns 25 (ENOTTY, i.e. Inapprop. I/O control op.) */ + + struct passwd *pPasswd; + static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; + + if ((pszUserName == NULL) || (pszPasswd == NULL) || (pSecurity == NULL)) + return osl_Security_E_Unknown; + + pthread_mutex_lock(&mutex); + + pPasswd = getpwnam(pszUserName); + if (pPasswd) + { + sal_Char salt[3], *cryptPasswd; + + strncpy(salt, pPasswd->pw_passwd, 2); + salt[2] = '\0'; + cryptPasswd = crypt((sal_Char*)pszPasswd, salt); + + if (strcmp(pPasswd->pw_passwd, cryptPasswd) == 0) + { + if (strlen(pPasswd->pw_name) + strlen(pPasswd->pw_passwd) + + strlen(pPasswd->pw_age) + strlen(pPasswd->pw_comment) + + strlen(pPasswd->pw_gecos) + strlen(pPasswd->pw_dir) + + strlen(pPasswd->pw_shell) + 7 <= PASSWD_BUFFER_SIZE) + { + sal_Char *p; + oslSecurityImpl *pSecImpl = malloc(sizeof(oslSecurityImpl)); + + pSecImpl->m_pPasswd = *pPasswd; + + p = pSecImpl->m_buffer; + pSecImpl->m_pPasswd.pw_name = p; + strcpy(p, pPasswd->pw_name); + + p += strlen(pPasswd->pw_name) + 1; + pSecImpl->m_pPasswd.pw_passwd = p; + strcpy(p, pPasswd->pw_passwd); + + p += strlen(pPasswd->pw_passwd) + 1; + pSecImpl->m_pPasswd.pw_age = p; + strcpy(p, pPasswd->pw_age); + + p += strlen(pPasswd->pw_age) + 1; + pSecImpl->m_pPasswd.pw_comment = p; + strcpy(p, pPasswd->pw_comment); + + p += strlen(pPasswd->pw_comment) + 1; + pSecImpl->m_pPasswd.pw_gecos = p; + strcpy(p, pPasswd->pw_gecos); + + p += strlen(pPasswd->pw_gecos) + 1; + pSecImpl->m_pPasswd.pw_dir = p; + strcpy(p, pPasswd->pw_dir); + + p += strlen(pPasswd->pw_dir) + 1; + pSecImpl->m_pPasswd.pw_shell = p; + strcpy(p, pPasswd->pw_shell); + + pSecImpl->m_isValid = sal_True; + *pSecurity = (oslSecurity)pSecImpl; + pthread_mutex_unlock(&mutex); + return osl_Security_E_None; + } + else + { + *pSecurity = NULL; + pthread_mutex_unlock(&mutex); + return osl_Security_E_Unknown; + } + } + else + { + *pSecurity = NULL; + pthread_mutex_unlock(&mutex); + return osl_Security_E_WrongPassword; + } + } + else + { + *pSecurity = NULL; + pthread_mutex_unlock(&mutex); + return osl_Security_E_UserUnknown; + } + +#elif defined S390 + + struct passwd *pPasswd; + + if ((pszUserName == NULL) || (pszPasswd == NULL) || (pSecurity == NULL)) + return osl_SEUNKNOWN; + + OSL_TRACE("osl_loginUser %s (for now without password validation!)\n", pszUserName); + + pPasswd = getpwnam(pszUserName); + if (pPasswd) + { + int iResult = 0; +/* the function __passwd is not correctly implemented now; we have to wait for the next OS/390 release... + sal_Char* _pszUserName = strdup(pszUserName); + sal_Char* _pszPasswd = strdup(pszPasswd); + asc2ebc(_pszUserName); + asc2ebc(_pszPasswd); + + iResult = __passwd(_pszUserName, _pszPasswd, NULL); + if(iResult == -1) + { + OSL_TRACE("__passwd result: %d", errno); + perror(NULL); + } + + free(_pszUserName); + free(_pszPasswd); +*/ + if (iResult == 0) + { + if (strlen(pPasswd->pw_name) + + strlen(pPasswd->pw_dir) + + strlen(pPasswd->pw_shell) + 7 <= PASSWD_BUFFER_SIZE) + { + sal_Char *p; + oslSecurityImpl *pSecImpl = malloc(sizeof(oslSecurityImpl)); + + pSecImpl->m_pPasswd = *pPasswd; + + p = pSecImpl->m_buffer; + pSecImpl->m_pPasswd.pw_name = p; + strcpy(p, pPasswd->pw_name); + + p += strlen(pPasswd->pw_name) + 1; + pSecImpl->m_pPasswd.pw_dir = p; + strcpy(p, pPasswd->pw_dir); + + p += strlen(pPasswd->pw_dir) + 1; + pSecImpl->m_pPasswd.pw_shell = p; + strcpy(p, pPasswd->pw_shell); + + pSecImpl->m_isValid = sal_True; + *pSecurity = (oslSecurity)pSecImpl; + + OSL_TRACE("Homedirectory of %s: %s\n", pSecImpl->m_pPasswd.pw_name, pSecImpl->m_pPasswd.pw_dir); + + return osl_Security_E_None; + } + else + { + *pSecurity = NULL; + return osl_SEUNKNOWN; + } + } + else + { + *pSecurity = NULL; + return osl_Security_E_WrongPassword; + } + } + else + { + *pSecurity = NULL; + return osl_Security_E_UserUnknown; + } + + +#elif (LINUX && (GLIBC >= 2)) + + struct passwd *pPasswd; + + oslSecurityImpl aSecurityBuffer; + oslSecurityError nError = osl_Security_E_Unknown; + + if ((pszUserName == NULL) || (pszPasswd == NULL) || (pSecurity == NULL)) + return osl_Security_E_Unknown; + + /* 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 */ + if (0 == getpwnam_r ( pszUserName, + &(aSecurityBuffer.m_pPasswd), + (char*)&(aSecurityBuffer.m_buffer), PASSWD_BUFFER_SIZE, + &pPasswd ) ) + { + /* only root is able to read the /etc/shadow passwd, + * a normal user even can't read his own encrypted passwd */ + sal_Char buffer[ 1024 ] = ""; + struct spwd result_buf; + struct spwd *pShadowPasswd=0; + int nRet=0; + + /* mfe: here we try to get the shadowpassword though it's used later */ + nRet=getspnam_r ( pszUserName, &result_buf, buffer, sizeof(buffer), &pShadowPasswd); + /* right password ? */ + if ( osl_equalPasswords(pPasswd->pw_passwd, pszPasswd) ) + { + nError = osl_Security_E_None; + } + else + /* otherwise try Pluggable Authentication Modules (PAM) */ + if ( osl_PamAuthentification( pszUserName, pszPasswd ) ) + { + nError = osl_Security_E_None; + } + else + /* otherwise try shadow passwd */ + if ( pShadowPasswd != 0 ) + { + if ( osl_equalPasswords(pShadowPasswd->sp_pwdp, pszPasswd ) ) + { + nError = osl_Security_E_None; + } + else + { + nError = 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) && + 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); + + if ( osl_equalPasswords(pShadowPasswd->sp_pwdp, pszPasswd ) ) + { + nError = osl_Security_E_None; + } + else + /* mfe: once more via PAM */ + if ( osl_PamAuthentification( "root", pszPasswd ) ) + { + nError = osl_Security_E_None; + } + else + { + /* mfe: it didn't' succeed at all */ + nError = osl_Security_E_WrongPassword; + } + } + } + } + else + { + nError = osl_Security_E_UserUnknown; + } + + /* return nError as well as a properly built pSecurity. if we've used + * the shadow passwd, aSecurityBuffer doesn't contain the right password! */ + if ( nError == osl_Security_E_None ) + { + aSecurityBuffer.m_isValid = sal_True; + *pSecurity = osl_copySecurity( &aSecurityBuffer ); + } + else + { + *pSecurity = NULL; + } + + return nError; + +#else + + struct passwd* pPasswd; + struct spwd spwdStruct; + sal_Char buffer[PASSWD_BUFFER_SIZE] = ""; + + oslSecurityImpl* pSecImpl = NULL; + + if ((pszUserName == NULL) || (pszPasswd == NULL) || (pSecurity == NULL)) + return osl_Security_E_Unknown; + + pSecImpl = (oslSecurityImpl*) malloc(sizeof(oslSecurityImpl)); + + if (getpwnam_r(pszUserName, + &(pSecImpl->m_pPasswd), + pSecImpl->m_buffer, + PASSWD_BUFFER_SIZE, + &pPasswd) == 0) + { + sal_Char salt[3], *cryptPasswd; + + if (getspnam_r(pszUserName, &spwdStruct, + buffer, PASSWD_BUFFER_SIZE) != NULL) + { + strncpy(salt, spwdStruct.sp_pwdp, 2); + salt[2] = '\0'; + cryptPasswd = (sal_Char *)crypt(pszPasswd, salt); + + if (strcmp(spwdStruct.sp_pwdp, cryptPasswd) == 0) + { + *pSecurity = (oslSecurity) pSecImpl; + return osl_Security_E_None; + } + else + { + /* if current process is running as root, + allow to logon as any other user */ + if ((getuid() == 0) && + (getspnam_r("root", &spwdStruct, + buffer, PASSWD_BUFFER_SIZE) != NULL)) + { + strncpy(salt, spwdStruct.sp_pwdp, 2); + salt[2] = '\0'; + cryptPasswd = (sal_Char *)crypt(pszPasswd, salt); + + if (strcmp(spwdStruct.sp_pwdp, cryptPasswd) == 0) + { + *pSecurity = (oslSecurity) pSecImpl; + return osl_Security_E_None; + } + } + + free(pSecImpl); + *pSecurity = NULL; + return osl_Security_E_WrongPassword; + } + } + else + { + free(pSecImpl); + *pSecurity = NULL; + return osl_Security_E_UserUnknown; + } + } + else + { + free(pSecImpl); + *pSecurity = NULL; + return osl_Security_E_UserUnknown; + } +#endif +} + +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] = ""; + + bRet = osl_psz_getUserIdent(Security,pszIdent,sizeof(pszIdent)); + + rtl_uString_newFromAscii(ustrIdent,pszIdent); + + return bRet; +} + + +sal_Bool SAL_CALL osl_psz_getUserIdent(oslSecurity Security, sal_Char *pszIdent, sal_uInt32 nMax) +{ + sal_Char buffer[32] = ""; + + oslSecurityImpl *pSecImpl = (oslSecurityImpl *)Security; + + if (pSecImpl == NULL) + return sal_False; + + sprintf(buffer, "%u", pSecImpl->m_pPasswd.pw_uid); + + strncpy(pszIdent, buffer, nMax); + + return sal_True; +} + +sal_Bool SAL_CALL osl_getUserName(oslSecurity Security, rtl_uString **ustrName) +{ + sal_Bool bRet=sal_False; + sal_Char pszName[1024] = ""; + + bRet = osl_psz_getUserName(Security,pszName,sizeof(pszName)); + + rtl_uString_newFromAscii(ustrName,pszName); + + 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 **ustrDirectory) +{ + sal_Bool bRet=sal_False; + sal_Char pszDirectory[PATH_MAX] = ""; + sal_Char pszUncPath[PATH_MAX+4] = ""; + + bRet = osl_psz_getHomeDir(Security,pszDirectory,sizeof(pszDirectory)); + + if ( bRet == sal_True ) + { + strcpy(pszUncPath,"//."); + strcat(pszUncPath,pszDirectory); + } + + rtl_uString_newFromAscii(ustrDirectory,pszDirectory); + + 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 = getenv("HOME"); + + 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 **ustrDirectory) +{ + sal_Bool bRet = sal_False; + sal_Char pszDirectory[PATH_MAX] = ""; + sal_Char pszUncPath[PATH_MAX+4] = ""; + + bRet = osl_psz_getConfigDir(Security,pszDirectory,sizeof(pszDirectory)); + + if ( bRet == sal_True ) + { + strcpy(pszUncPath,"//."); + strcat(pszUncPath,pszDirectory); + } + + rtl_uString_newFromAscii(ustrDirectory,pszDirectory); + + 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/unx/semaphor.c b/sal/osl/unx/semaphor.c new file mode 100644 index 000000000000..158a40977a8d --- /dev/null +++ b/sal/osl/unx/semaphor.c @@ -0,0 +1,360 @@ +/************************************************************************* + * + * $RCSfile: semaphor.c,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:17:21 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + + +#include "system.h" + +#include +#include + +#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 */ +/*****************************************************************************/ + +#ifdef LINUX +/* sem_t from glibc-2.1 (/usr/include/semaphore.h) */ + +typedef struct { + struct { long status; int spinlock; } sem_lock; + int sem_value; + _pthread_descr sem_waiting; +} glibc_21_sem_t; +#endif + +oslSemaphore SAL_CALL osl_createSemaphore(sal_uInt32 initialCount) +{ + int ret = 0; + oslSemaphore Semaphore; + + /* + * XXX this a hack of course. since sizeof(sem_t) changed + * from glibc-2.0.7 to glibc-2.1.x, we have to allocate the + * larger of both + * XXX + */ +#ifdef LINUX + if ( sizeof(glibc_21_sem_t) > sizeof(sem_t) ) + Semaphore= malloc(sizeof(glibc_21_sem_t)); + else +#endif + 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 +*/ + +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..19a6de1f092f --- /dev/null +++ b/sal/osl/unx/signal.c @@ -0,0 +1,490 @@ +/************************************************************************* + * + * $RCSfile: signal.c,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:17:21 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + + +/* system headers */ +#include "system.h" + +#include +#include +#include +#include + + +#define ACT_IGNORE 1 +#define ACT_ABORT 2 +#define ACT_EXIT 3 +#define ACT_SYSTEM 4 +#define ACT_HIDE 5 + +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_ABORT, NULL }, /* quit (ASCII FS) */ + { SIGILL, ACT_ABORT, NULL }, /* illegal instruction (not reset when caught) */ + { 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_ABORT, NULL }, /* EMT instruction */ +#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_EXIT, NULL }, /* profiling timer expired */ + { 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 bInitSignal = sal_False; +static oslMutex SignalListMutex; +static oslSignalHandlerImpl* SignalList; +static sal_Bool bDoHardKill = sal_False; +static sal_Bool bDoNotUseSEGV = sal_False; + +static void SignalHandlerFunction(int); +extern oslProcessError SAL_CALL osl_psz_getExecutableFile(sal_Char* pszBuffer, sal_uInt32 Max); +oslProcessError SAL_CALL osl_getCommandArgs(sal_Char* pszBuffer, sal_uInt32 Max); + +static sal_Bool InitSignal() +{ + int i; + struct sigaction act; + struct sigaction oact; + + /* Portal Demo HACK !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*/ + char ProgFile[512]; + + if ((osl_psz_getExecutableFile(ProgFile, sizeof(ProgFile)) == osl_Process_E_None) && + (strstr(ProgFile, "soffice") != NULL)) + { + char CmdLine[512]; + + if ((osl_getCommandArgs(CmdLine, sizeof(CmdLine)) == osl_Process_E_None) && + (strstr(CmdLine, "-bean") != NULL)) + bDoHardKill = sal_True; + } + + if ((osl_psz_getExecutableFile(ProgFile, sizeof(ProgFile)) == osl_Process_E_None) && + (strstr(ProgFile, "stomcatd") != NULL)) + { + bDoNotUseSEGV = sal_True; + } + + /* Portal Demo HACK !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*/ + + + 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 (!bDoNotUseSEGV || (Signals[i].Signal != SIGSEGV)) + { + if (Signals[i].Action != ACT_SYSTEM) + { + if (Signals[i].Action == ACT_HIDE) + { + struct sigaction ign; + + ign.sa_handler = SIG_IGN; + ign.sa_flags = 0; + + 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; + } + } + } + + 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; +} + +static oslSignalAction CallSignalHandler(oslSignalInfo *pInfo) +{ + oslSignalHandlerImpl* pHandler = SignalList; + oslSignalAction Action = osl_Signal_ActCallNextHdl; + + /* PORTAL EA SOFFICE TERMINATION HACK BEGIN */ + struct sigaction act; + struct sigaction oldact; + int nRet=0; + + act.sa_flags = 0; + sigemptyset(&(act.sa_mask)); + + act.sa_handler=SIG_DFL; + nRet = sigaction(SIGALRM,&act,&oldact); + if ( nRet < 0 ) + { + OSL_TRACE("sigaction failed : '%s'\n",strerror(errno)); + } + + alarm(30); + /* PORTAL EA SOFFICE TERMINATION HACK END */ + + while (pHandler != NULL) + { + if ((Action = pHandler->Handler(pHandler->pData, pInfo)) + != osl_Signal_ActCallNextHdl) + break; + + pHandler = pHandler->pNext; + } + + /* PORTAL EA SOFFICE TERMINATION HACK BEGIN */ + alarm(0); + /* PORTAL EA SOFFICE TERMINATION HACK END */ + + + return Action; +} + +static 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 */ + exit(255); + break; + + case ACT_ABORT: /* terminate witch core dump */ + act.sa_handler = SIG_DFL; + act.sa_flags = 0; + sigemptyset(&(act.sa_mask)); + sigaction(SIGABRT, &act, NULL); + abort(); + break; + + case ACT_IGNORE: /* ignore */ + break; + + default: /* should never happen */ + OSL_ASSERT(0); + } + } + else + (*Signals[i].Handler)(Signal); + } +} + +/*****************************************************************************/ +/* SignalHandlerFunction */ +/*****************************************************************************/ +static void SignalHandlerFunction(int Signal) +{ + oslSignalInfo Info; + struct sigaction act; + + Info.UserSignal = Signal; + Info.UserData = NULL; + + switch (Signal) + { + case SIGBUS: + case SIGILL: + case SIGSEGV: + 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 SIGIOT: + case SIGTERM: + case SIGQUIT: + case SIGHUP: + Info.Signal = osl_Signal_Terminate; + break; + + default: + Info.Signal = osl_Signal_System; + break; + } + + /* 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: + act.sa_handler = SIG_DFL; + act.sa_flags = 0; + sigemptyset(&(act.sa_mask)); + sigaction(SIGABRT, &act, NULL); + abort(); + break; + + case osl_Signal_ActKillApp: + 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); +} + diff --git a/sal/osl/unx/socket.c b/sal/osl/unx/socket.c new file mode 100644 index 000000000000..28e41eeeefc8 --- /dev/null +++ b/sal/osl/unx/socket.c @@ -0,0 +1,2795 @@ +/************************************************************************* + * + * $RCSfile: socket.c,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:17:21 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +#include "system.h" + +#include +#include +#include +#include + +#include + +#include "sockimpl.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 + + +/*****************************************************************************/ +/* 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 */ +/*****************************************************************************/ + +oslSocketImpl* __osl_createSocketImpl(int Socket) +{ + oslSocketImpl* pSockImpl; + + pSockImpl = (oslSocketImpl*)calloc(1, sizeof(oslSocketImpl)); + + pSockImpl->m_Socket = Socket; + + return (pSockImpl); +} + +void __osl_destroySocketImpl(oslSocketImpl *pImpl) +{ + if (pImpl != NULL) + free(pImpl); +} + +/*****************************************************************************/ +/* osl_createEmptySocketAddr */ +/*****************************************************************************/ +oslSocketAddr SAL_CALL osl_createEmptySocketAddr(oslAddrFamily Family) +{ + + struct sockaddr* pAddr; + + pAddr= (struct sockaddr*)malloc(sizeof(struct sockaddr)); + + /* is it an internet-address? */ + if(Family == osl_Socket_FamilyInet) + { + struct sockaddr_in* pInetAddr= (struct sockaddr_in*)pAddr; + + pInetAddr->sin_family= FAMILY_TO_NATIVE(osl_Socket_FamilyInet); + pInetAddr->sin_addr.s_addr= htonl(INADDR_ANY); + pInetAddr->sin_port= 0; + } + else + { + memset(pAddr, 0, sizeof(struct sockaddr)); + pAddr->sa_family= FAMILY_TO_NATIVE(Family); + } + + return (oslSocketAddr)pAddr; +} + +/*****************************************************************************/ +/* osl_copySocketAddr */ +/*****************************************************************************/ +oslSocketAddr SAL_CALL osl_copySocketAddr(oslSocketAddr Addr) +{ + struct sockaddr* pAddr; + + pAddr= (struct sockaddr*)malloc(sizeof(struct sockaddr)); + + memcpy(pAddr, Addr, sizeof(struct sockaddr)); + + return pAddr; +} + +/*****************************************************************************/ +/* osl_isEqualSocketAddr */ +/*****************************************************************************/ +sal_Bool SAL_CALL osl_isEqualSocketAddr ( + oslSocketAddr Addr1, + oslSocketAddr Addr2) +{ + struct sockaddr* pAddr1= (struct sockaddr*)Addr1; + struct sockaddr* pAddr2= (struct sockaddr*)Addr2; + + OSL_ASSERT(pAddr1); + OSL_ASSERT(pAddr2); + + if ( pAddr1 ==0 || pAddr2 == 0 ) + { + return sal_False; + } + + 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); + } + + case AF_IPX: + { + struct sockaddr_ipx* pIpxAddr1= (struct sockaddr_ipx*)pAddr1; + struct sockaddr_ipx* pIpxAddr2= (struct sockaddr_ipx*)pAddr2; + + if ((pIpxAddr1->sa_family == pIpxAddr2->sa_family) && + (memcmp(&pIpxAddr1->sa_netnum, &pIpxAddr2->sa_netnum, sizeof(pIpxAddr1->sa_netnum)) == 0) && + (memcmp(&pIpxAddr1->sa_nodenum, &pIpxAddr2->sa_nodenum, sizeof(pIpxAddr1->sa_nodenum)) == 0) && + (pIpxAddr1->sa_socket == pIpxAddr2->sa_socket)) + 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) +{ + struct sockaddr_in *pAddr = NULL; + 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); + } + + pAddr = malloc (sizeof(struct sockaddr_in)); + if (pAddr) + { + pAddr->sin_family = FAMILY_TO_NATIVE(osl_Socket_FamilyInet); + pAddr->sin_port = htons((sal_uInt16)(Port & 0xffff)); + pAddr->sin_addr.s_addr = nAddr; /* Already in network order */ + } + return ((oslSocketAddr)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) +{ + sal_Int32 Addr; + + Addr= inet_addr(pszDottedAddr); + + if(Addr != -1) + { + /* valid dotted addr */ + + struct sockaddr_in* pInetAddr; + pInetAddr= (struct sockaddr_in*)malloc(sizeof(struct sockaddr_in)); + + OSL_ASSERT(pInetAddr); + + pInetAddr->sin_family= FAMILY_TO_NATIVE(osl_Socket_FamilyInet); + pInetAddr->sin_port= htons((sal_uInt16)Port); + pInetAddr->sin_addr.s_addr= Addr; /* already in right order */ + + return (oslSocketAddr)pInetAddr; + } + + return (oslSocketAddr)0; +} + + +/*****************************************************************************/ +/* osl_createIpxSocketAddr */ +/*****************************************************************************/ +oslSocketAddr SAL_CALL osl_createIpxSocketAddr(rtl_uString * ustrNetNumber, + rtl_uString * ustrNodeNumber, + sal_uInt32 SocketNumber) +{ + oslSocketAddr Addr; + sal_Char NetNumber[4]; + sal_Char NodeNumber[4]; + rtl_String* strNetNumber=0; + rtl_String* strNodeNumber=0; + sal_Char* pszNetNumber=0; + sal_Char* pszNodeNumber=0; + + if ( ustrNetNumber != 0 ) + { + rtl_uString2String( &strNetNumber, + rtl_uString_getStr(ustrNetNumber), + rtl_uString_getLength(ustrNetNumber), + RTL_TEXTENCODING_UTF8, + OUSTRING_TO_OSTRING_CVTFLAGS ); + pszNetNumber = rtl_string_getStr(strNetNumber); + } + + if ( ustrNodeNumber != 0 ) + { + rtl_uString2String( &strNodeNumber, + rtl_uString_getStr(ustrNodeNumber), + rtl_uString_getLength(ustrNodeNumber), + RTL_TEXTENCODING_UTF8, + OUSTRING_TO_OSTRING_CVTFLAGS ); + pszNodeNumber = rtl_string_getStr(strNodeNumber); + } + + memcpy(NetNumber,pszNetNumber,sizeof(NetNumber)); + memcpy(NodeNumber,pszNodeNumber,sizeof(NodeNumber)); + + Addr = osl_psz_createIpxSocketAddr(NetNumber,NodeNumber,SocketNumber); + + if ( strNetNumber != 0 ) + { + rtl_string_release(strNetNumber); + } + + if ( strNodeNumber != 0 ) + { + rtl_string_release(strNodeNumber); + } + + return Addr; +} + +oslSocketAddr SAL_CALL osl_psz_createIpxSocketAddr ( + const sal_Char NetNumber[4], + const sal_Char NodeNumber[6], + sal_uInt32 SocketNumber) +{ + struct sockaddr_ipx* pIpxAddr; + + pIpxAddr= (struct sockaddr_ipx*)malloc(sizeof(struct sockaddr)); + + OSL_ASSERT(pIpxAddr); + + pIpxAddr->sa_family= FAMILY_TO_NATIVE(osl_Socket_FamilyIpx); + memcpy(&pIpxAddr->sa_netnum, NetNumber, sizeof(pIpxAddr->sa_netnum)); + memcpy(&pIpxAddr->sa_nodenum, NodeNumber, sizeof(pIpxAddr->sa_nodenum)); + pIpxAddr->sa_socket= (sal_uInt16)SocketNumber; + + return (oslSocketAddr)pIpxAddr; +} + +/*****************************************************************************/ +/* _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 ; +#else + return gethostbyname_r( name, result, buffer, buflen, h_errnop); +#endif +} + +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; + FILE *pPipeToDomainnameExe; + + /* 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); + } + } + +#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 > "; + + 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 ] = ""; + 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; + + 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 */ + + /* 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[ 256 ] = ""; + sal_Char pQualifiedHostBuffer[ 256 ] = ""; + int nErrorNo; + + /* 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 = 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 = 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 */ +/*****************************************************************************/ +typedef struct oslHostAddrImpl_t { + sal_Char *pHostName; + struct sockaddr *pSockAddr; +} oslHostAddrImpl; + +static oslHostAddr _osl_hostentToHostAddr (const struct hostent *he) +{ + oslHostAddrImpl *pAddr= NULL; + struct sockaddr *sa; + 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); + } + + sa= (struct sockaddr *)malloc (sizeof (struct sockaddr)); + OSL_ASSERT(sa); + if (sa == NULL) + { + free(cn); + return ((oslHostAddr)NULL); + } + memset (sa, 0, sizeof (struct sockaddr)); + + sa->sa_family= he->h_addrtype; + if (sa->sa_family == FAMILY_TO_NATIVE(osl_Socket_FamilyInet)) + { + struct sockaddr_in *sin= (struct sockaddr_in *)sa; + memcpy(&(sin->sin_addr.s_addr), + he->h_addr_list[0], + he->h_length); + } + else if (sa->sa_family == FAMILY_TO_NATIVE(osl_Socket_FamilyIpx)) + { + struct sockaddr_ipx *spx= (struct sockaddr_ipx *)sa; + + /* not quite sure what ipx/spx defines as a host-address: */ + /* just the hostnumber of the combination of net- and hostnumber */ + /* I guess the later, but am prepared for anything */ + + switch (he->h_length) + { + case sizeof(spx->sa_netnum) + sizeof(spx->sa_nodenum): + case sizeof(spx->sa_netnum): + memcpy ( + &(spx->sa_netnum), + he->h_addr_list[0], + he->h_length); + break; + + case sizeof(spx->sa_nodenum): + memcpy ( + &(spx->sa_nodenum), + he->h_addr_list[0], + he->h_length); + break; + + default: + OSL_TRACE("_osl_hostentToHostAddr: " + "unknown IPX/SPX address format.\n"); + OSL_ASSERT(sal_False); + + free (sa); + free (cn); + return ((oslHostAddr)NULL); + } + } + 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); + + free (sa); + free (cn); + return ((oslHostAddr)NULL); + } + + pAddr= (oslHostAddrImpl *)malloc (sizeof (oslHostAddrImpl)); + OSL_ASSERT(pAddr); + if (pAddr == NULL) + { + free (sa); + free (cn); + return ((oslHostAddr)NULL); + } + + pAddr->pHostName= cn; + pAddr->pSockAddr= sa; + + return ((oslHostAddr)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 Addr) +{ + oslHostAddrImpl *pAddr; + struct sockaddr *sa; + sal_Char *cn; + + OSL_ASSERT(pszHostname && Addr); + if ((pszHostname == NULL) || (Addr == NULL)) + return ((oslHostAddr)NULL); + + cn = (sal_Char *)malloc(strlen (pszHostname) + 1); + OSL_ASSERT(cn); + if (cn == NULL) + return ((oslHostAddr)NULL); + + strcpy (cn, pszHostname); + + sa= (struct sockaddr *)osl_copySocketAddr (Addr); + if (sa == NULL) + { + free (cn); + return ((oslHostAddr)NULL); + } + + pAddr= (oslHostAddrImpl *)malloc(sizeof (oslHostAddrImpl)); + OSL_ASSERT(pAddr); + if (pAddr == NULL) + { + free (cn); + free (sa); + return ((oslHostAddr)NULL); + } + + pAddr->pHostName= cn; + pAddr->pSockAddr= sa; + + return ((oslHostAddr)pAddr); +} + +/*****************************************************************************/ +/* 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 Addr) +{ + const struct sockaddr *pAddr= (const struct sockaddr *)Addr; + OSL_ASSERT(pAddr); + + if (pAddr == NULL) + return ((oslHostAddr)NULL); + + if (pAddr->sa_family == FAMILY_TO_NATIVE(osl_Socket_FamilyInet)) + { + const struct sockaddr_in *sin= (const struct sockaddr_in *)pAddr; + 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 Addr) +{ + oslHostAddrImpl *pAddr= (oslHostAddrImpl *)Addr; + 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 Addr) +{ + const oslHostAddrImpl *pAddr= (const oslHostAddrImpl *)Addr; + OSL_ASSERT(pAddr); + + if (pAddr) + return pAddr->pHostName; + else + return NULL; +} + +/*****************************************************************************/ +/* osl_getSocketAddrOfHostAddr */ +/*****************************************************************************/ +oslSocketAddr SAL_CALL osl_getSocketAddrOfHostAddr (const oslHostAddr Addr) +{ + const oslHostAddrImpl *pAddr= (const oslHostAddrImpl *)Addr; + OSL_ASSERT(pAddr); + + if (pAddr) + return ((oslSocketAddr)(pAddr->pSockAddr)); + else + return NULL; +} + +/*****************************************************************************/ +/* osl_destroyHostAddr */ +/*****************************************************************************/ +void SAL_CALL osl_destroyHostAddr (oslHostAddr Addr) +{ + oslHostAddrImpl *pAddr= (oslHostAddrImpl *)Addr; + 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] = ""; + + 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; + + strcpy(LocalHostname, uts.nodename); +#else /* BSD compatible */ + + if (gethostname(LocalHostname, sizeof(LocalHostname)) != 0) + return osl_Socket_Error; +#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) + { + sal_Char* pChr; + 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) +{ + oslHostAddrImpl *pAddr= + (oslHostAddrImpl *)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 Addr) +{ + if(Addr) + free(Addr); +} + +/*****************************************************************************/ +/* osl_getFamilyOfSocketAddr */ +/*****************************************************************************/ +oslAddrFamily SAL_CALL osl_getFamilyOfSocketAddr(oslSocketAddr Addr) +{ + struct sockaddr* pAddr= (struct sockaddr*)Addr; + OSL_ASSERT(pAddr); + + if (pAddr) + return FAMILY_FROM_NATIVE(pAddr->sa_family); + else + return osl_Socket_FamilyInvalid; +} + +/*****************************************************************************/ +/* osl_getInetPortOfSocketAddr */ +/*****************************************************************************/ +sal_Int32 SAL_CALL osl_getInetPortOfSocketAddr(oslSocketAddr Addr) +{ + struct sockaddr_in* pAddr= (struct sockaddr_in*)Addr; + OSL_ASSERT(pAddr); + + if (pAddr && (pAddr->sin_family == FAMILY_TO_NATIVE(osl_Socket_FamilyInet))) + return ntohs(pAddr->sin_port); + else + return OSL_INVALID_PORT; +} + +/*****************************************************************************/ +/* osl_setInetPortOfSocketAddr */ +/*****************************************************************************/ +sal_Bool SAL_CALL osl_setInetPortOfSocketAddr(oslSocketAddr Addr, sal_Int32 Port) +{ + struct sockaddr_in* pAddr= (struct sockaddr_in*)Addr; + OSL_ASSERT(pAddr); + + if (pAddr && (pAddr->sin_family == FAMILY_TO_NATIVE(osl_Socket_FamilyInet))) + { + pAddr->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] = ""; + + Result = osl_psz_getHostnameOfSocketAddr(Addr,pszHostname,sizeof(pszHostname)); + + rtl_uString_newFromAscii(ustrHostname,pszHostname); + + return Result; +} + + +oslSocketResult SAL_CALL osl_psz_getHostnameOfSocketAddr(oslSocketAddr Addr, + sal_Char *pBuffer, sal_uInt32 BufferSize) +{ + oslHostAddrImpl *pAddr= (oslHostAddrImpl *)osl_createHostAddrByAddr(Addr); + + if (pAddr) + { + strncpy(pBuffer, pAddr->pHostName, BufferSize); + + pBuffer[BufferSize - 1] = '\0'; + + osl_destroyHostAddr(pAddr); + + 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] = ""; + + Result = osl_psz_getDottedInetAddrOfSocketAddr(Addr,pszDottedInetAddr,sizeof(pszDottedInetAddr)); + + rtl_uString_newFromAscii(ustrDottedInetAddr,pszDottedInetAddr); + + return Result; + +} + +oslSocketResult SAL_CALL osl_psz_getDottedInetAddrOfSocketAddr(oslSocketAddr Addr, + sal_Char *pBuffer, sal_uInt32 BufferSize) +{ + struct sockaddr_in* pAddr; + + pAddr= (struct sockaddr_in*)Addr; + OSL_ASSERT(pAddr); + + if (pAddr == NULL) + return osl_Socket_Error; + + if (pAddr->sin_family != FAMILY_TO_NATIVE(osl_Socket_FamilyInet)) + return osl_Socket_Error; + + strncpy(pBuffer, inet_ntoa(pAddr->sin_addr), BufferSize); + pBuffer[BufferSize - 1] = '\0'; + + return osl_Socket_Ok; +} + + +/*****************************************************************************/ +/* 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; +} + +/*****************************************************************************/ +/* osl_createSocket */ +/*****************************************************************************/ +oslSocket SAL_CALL osl_createSocket(oslAddrFamily Family, + oslSocketType Type, + oslProtocol Protocol) +{ + int Flags; + oslSocketImpl* pSockImpl; + + /* alloc memory */ + pSockImpl= __osl_createSocketImpl(0); + + /* create socket */ + pSockImpl->m_Socket= socket(FAMILY_TO_NATIVE(Family), + TYPE_TO_NATIVE(Type), + PROTOCOL_TO_NATIVE(Protocol)); + + /* creation failed => free memory */ + if(pSockImpl->m_Socket == OSL_INVALID_SOCKET) + { + OSL_TRACE("osl_createSocket failed. Errno: %d; %s\n", + errno, + strerror(errno)); + + __osl_destroySocketImpl(pSockImpl); + pSockImpl= 0; + } + else + { + /* set close-on-exec flag */ + if ((Flags = fcntl(pSockImpl->m_Socket, F_GETFD, 0)) != -1) + { + Flags |= FD_CLOEXEC; + if (fcntl(pSockImpl->m_Socket, F_SETFD, Flags) == -1) + OSL_TRACE("osl_createSocket failed changing socket flags. Errno: %d; %s\n", + errno, + strerror(errno)); + } + + pSockImpl->m_CloseCallback = NULL; + pSockImpl->m_CallbackArg = NULL; + } + + return (oslSocket)pSockImpl; +} + +/*****************************************************************************/ +/* osl_copySocket */ +/*****************************************************************************/ +oslSocket SAL_CALL osl_copySocket(oslSocket Socket) +{ + oslSocketImpl* pSockImpl; + oslSocketImpl* pParamSockImpl; + + OSL_ASSERT(Socket); + if ( Socket == 0 ) + { + return 0; + } + + /* alloc memory */ + pSockImpl= __osl_createSocketImpl(0); + + OSL_ASSERT(pSockImpl); + + if(pSockImpl==0) + return 0; + + pParamSockImpl= (oslSocketImpl*)Socket; + + /* copy socket */ + memcpy(pSockImpl, pParamSockImpl, sizeof(oslSocketImpl)); + + return (oslSocket)pSockImpl; +} + + +/*****************************************************************************/ +/* osl_destroySocket */ +/*****************************************************************************/ +void SAL_CALL osl_destroySocket(oslSocket Socket) +{ + oslSocketImpl* pSockImpl = (oslSocketImpl*)Socket; + + /* socket already invalid */ + if(Socket==0) + return; + + osl_closeSocket(Socket); + + /* free memory */ + __osl_destroySocketImpl(pSockImpl); +} + +/*****************************************************************************/ +/* osl_closeSocket */ +/*****************************************************************************/ +void SAL_CALL osl_closeSocket(oslSocket Socket) +{ + oslSocketImpl* pSockImpl; + int nRet; + + /* socket already invalid */ + if(Socket==0) + return; + + pSockImpl= (oslSocketImpl*)Socket; + + /* registrierten Callback ausfuehren */ + if (pSockImpl->m_CloseCallback != NULL) + { + pSockImpl->m_CloseCallback(pSockImpl->m_CallbackArg); + } + + nRet=close(pSockImpl->m_Socket); + if ( nRet != 0 ) + { + OSL_TRACE("closeSocket close error '%s'\n",strerror(errno)); + } + + pSockImpl->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 Socket) +{ + oslSocketImpl* pSockImpl; +#ifdef LINUX + 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; + + OSL_ASSERT(Socket); + if ( Socket == 0 ) + { + return 0; + } + + pSockImpl= (oslSocketImpl*)Socket; + AddrLen= sizeof(struct sockaddr); + + if(getsockname(pSockImpl->m_Socket, &Addr, PTR_SIZE_T(AddrLen)) == OSL_SOCKET_ERROR) + return 0; + + return osl_copySocketAddr((oslSocketAddr)&Addr); +} + +/*****************************************************************************/ +/* osl_getPeerAddrOfSocket */ +/*****************************************************************************/ +oslSocketAddr SAL_CALL osl_getPeerAddrOfSocket(oslSocket Socket) +{ + oslSocketImpl* pSockImpl; + sal_uInt32 AddrLen; + struct sockaddr Addr; + + OSL_ASSERT(Socket); + if ( Socket == 0 ) + { + return 0; + } + + pSockImpl= (oslSocketImpl*)Socket; + AddrLen= sizeof(struct sockaddr); + + if(getpeername(pSockImpl->m_Socket, &Addr, PTR_SIZE_T(AddrLen)) == OSL_SOCKET_ERROR) + return 0; + + return osl_copySocketAddr((oslSocketAddr)&Addr); +} + +/*****************************************************************************/ +/* osl_bindAddrToSocket */ +/*****************************************************************************/ +sal_Bool SAL_CALL osl_bindAddrToSocket(oslSocket Socket, + oslSocketAddr Addr) +{ + oslSocketImpl* pSockImpl; + + OSL_ASSERT(Socket); + if ( Socket == 0 ) + { + return sal_False; + } + + pSockImpl= (oslSocketImpl*)Socket; + + return (bind(pSockImpl->m_Socket, + (struct sockaddr*)Addr, + sizeof(struct sockaddr)) != OSL_SOCKET_ERROR); +} + + +/*****************************************************************************/ +/* osl_listenOnSocket */ +/*****************************************************************************/ +sal_Bool SAL_CALL osl_listenOnSocket(oslSocket Socket, + sal_Int32 MaxPendingConnections) +{ + oslSocketImpl* pSockImpl; + + OSL_ASSERT(Socket); + if ( Socket == 0 ) + { + return sal_False; + } + + pSockImpl= (oslSocketImpl*)Socket; + + return (listen(pSockImpl->m_Socket, + MaxPendingConnections == -1 ? + SOMAXCONN : + MaxPendingConnections) != OSL_SOCKET_ERROR); +} + + +/*****************************************************************************/ +/* osl_connectSocketTo */ +/*****************************************************************************/ +oslSocketResult SAL_CALL osl_connectSocketTo(oslSocket Socket, + oslSocketAddr Addr, + const TimeValue* pTimeout) +{ + oslSocketImpl* pSockImpl; + fd_set WriteSet; + fd_set ExcptSet; + int ReadyHandles; + struct timeval tv; + oslSocketResult Result= osl_Socket_Ok; + + OSL_PRECOND(Socket, "osl_connectSocketTo(): need a valid socket!\n"); + + pSockImpl= (oslSocketImpl*)Socket; + + if (osl_isNonBlockingMode(Socket)) + { + if (connect(pSockImpl->m_Socket, + (struct sockaddr*)Addr, + sizeof(struct sockaddr)) != OSL_SOCKET_ERROR) + return osl_Socket_Ok; + else + if (errno == EWOULDBLOCK || errno == EINPROGRESS) + return osl_Socket_InProgress; + + return osl_Socket_Error; + } + + /* set socket temporarily to non-blocking */ + OSL_VERIFY(osl_enableNonBlockingMode(Socket, sal_True)); + + /* initiate connect */ + if(connect(pSockImpl->m_Socket, + (struct sockaddr*)Addr, + sizeof(struct sockaddr)) != OSL_SOCKET_ERROR) + { + /* immediate connection */ + osl_enableNonBlockingMode(Socket, sal_False); + + return osl_Socket_Ok; + } + else + { + /* really an error or just delayed? */ + if (errno != EINPROGRESS) + { + OSL_TRACE( + "osl_connectSocketTo(): connect failed: errno: %d (%s)\n", + errno, strerror(errno)); + + osl_enableNonBlockingMode(Socket, sal_False); + + return osl_Socket_Error; + } + } + + + /* prepare select set for socket */ + FD_ZERO(&WriteSet); + FD_ZERO(&ExcptSet); + FD_SET(pSockImpl->m_Socket, &WriteSet); + FD_SET(pSockImpl->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(pSockImpl->m_Socket+1, + 0, + PTR_FD_SET(WriteSet), + PTR_FD_SET(ExcptSet), + (pTimeout) ? &tv : 0); + + if (ReadyHandles > 0) /* connected */ + { + if ( FD_ISSET(pSockImpl->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 ( pSockImpl->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, &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 + Result= osl_Socket_Error; + + } + else /* timeout */ + { + Result= osl_Socket_TimedOut; + } + + osl_enableNonBlockingMode(Socket, sal_False); + + return Result; +} + + +/*****************************************************************************/ +/* osl_acceptConnectionOnSocket */ +/*****************************************************************************/ +oslSocket SAL_CALL osl_acceptConnectionOnSocket(oslSocket Socket, + oslSocketAddr* pAddr) +{ + oslSocketImpl* pSockImpl; + struct sockaddr Addr; + int Connection, Flags; + oslSocketImpl* pConnectionSockImpl; + + OSL_ASSERT(Socket); + if ( Socket == 0 ) + { + return 0; + } + + pSockImpl= (oslSocketImpl*)Socket; + + if(pAddr) + { + sal_uInt32 AddrLen = sizeof(struct sockaddr); + + do + { + /* user wants to know peer address */ + Connection= accept(pSockImpl->m_Socket, (struct sockaddr*)&Addr, PTR_SIZE_T(AddrLen)); + } while (Connection == -1 && errno == EINTR); + + OSL_ASSERT(AddrLen == sizeof(struct sockaddr)); + + *pAddr= osl_copySocketAddr((oslSocketAddr)&Addr); + } + else + { + do + { + /* user is not interested in peer-addr */ + Connection= accept(pSockImpl->m_Socket, 0, 0); + } while ( Connection == -1 && errno == EINTR); + + } + + /* accept failed? */ + if(Connection == OSL_SOCKET_ERROR) + return 0; + + /* alloc memory */ + pConnectionSockImpl= __osl_createSocketImpl(0); + + /* set close-on-exec flag */ + if ((Flags = fcntl(Connection, F_GETFD, 0)) != -1) + { + Flags |= FD_CLOEXEC; + if (fcntl(Connection, F_SETFD, Flags) == -1) + OSL_TRACE("osl_acceptConnectionOnSocket failed changing socket flags. Errno: %d (%s)\n", + errno, + strerror(errno)); + } + + pConnectionSockImpl->m_Socket = Connection; + pConnectionSockImpl->m_CloseCallback = NULL; + pConnectionSockImpl->m_CallbackArg = NULL; + + return (oslSocket)pConnectionSockImpl; +} + +/*****************************************************************************/ +/* osl_receiveSocket */ +/*****************************************************************************/ +sal_Int32 SAL_CALL osl_receiveSocket(oslSocket Socket, + void* pBuffer, + sal_uInt32 BytesToRead, + oslSocketMsgFlag Flag) +{ + oslSocketImpl* pSockImpl; + int nRead; + + OSL_ASSERT(Socket); + if ( Socket == 0 ) + { + OSL_TRACE("osl_receiveSocket : Invalid socket"); + errno=EINVAL; + return -1; + } + + pSockImpl = (oslSocketImpl*)Socket; + + nRead = recv(pSockImpl->m_Socket, + (sal_Char*)pBuffer, + BytesToRead, + MSG_FLAG_TO_NATIVE(Flag)); + + if ( nRead <= 0 ) + { + OSL_TRACE("osl_receiveSocket failed : %i '%s'",nRead,strerror(errno)); + } + + return nRead; + +/* return recv(pSockImpl->m_Socket, */ +/* (sal_Char*)pBuffer, */ +/* BytesToRead, */ +/* MSG_FLAG_TO_NATIVE(Flag)); */ +} + + +/*****************************************************************************/ +/* osl_receiveFromSocket */ +/*****************************************************************************/ +sal_Int32 SAL_CALL osl_receiveFromSocket(oslSocket Socket, + oslSocketAddr SenderAddr, + void* pBuffer, + sal_uInt32 BufferSize, + oslSocketMsgFlag Flag) +{ + oslSocketImpl* pSockImpl; + int nRead; + + sal_uInt32 AddrLen= SenderAddr == 0 ? 0 : sizeof(struct sockaddr); + + OSL_ASSERT(Socket); + if ( Socket == 0 ) + { + OSL_TRACE("osl_receiveFromSocket : Invalid socket"); + errno=EINVAL; + return -1; + } + + pSockImpl= (oslSocketImpl*)Socket; + + nRead = recvfrom(pSockImpl->m_Socket, + (sal_Char*)pBuffer, + BufferSize, + MSG_FLAG_TO_NATIVE(Flag), + (struct sockaddr*)SenderAddr, + PTR_SIZE_T(AddrLen)); + + if ( nRead <= 0 ) + { + OSL_TRACE("osl_receiveFromSocket failed : %i '%s'",nRead,strerror(errno)); + } + + return nRead; +} + + +/*****************************************************************************/ +/* osl_sendSocket */ +/*****************************************************************************/ +sal_Int32 SAL_CALL osl_sendSocket(oslSocket Socket, + const void* pBuffer, + sal_uInt32 BytesToSend, + oslSocketMsgFlag Flag) +{ + oslSocketImpl* pSockImpl; + int nWritten; + + OSL_ASSERT(Socket); + if ( Socket == 0 ) + { + OSL_TRACE("osl_sendSocket : Invalid socket"); + errno=EINVAL; + return -1; + } + + pSockImpl = (oslSocketImpl*)Socket; + + nWritten = send(pSockImpl->m_Socket, + (sal_Char*)pBuffer, + BytesToSend, + MSG_FLAG_TO_NATIVE(Flag)); + + if ( nWritten <= 0 ) + { + OSL_TRACE("osl_sendSocket failed : %i '%s'",nWritten,strerror(errno)); + } + + return nWritten; +} + +/*****************************************************************************/ +/* osl_sendToSocket */ +/*****************************************************************************/ +sal_Int32 SAL_CALL osl_sendToSocket(oslSocket Socket, + oslSocketAddr ReceiverAddr, + const void* pBuffer, + sal_uInt32 BytesToSend, + oslSocketMsgFlag Flag) +{ + oslSocketImpl* pSockImpl; + int nWritten; + + OSL_ASSERT(Socket); + if ( Socket == 0 ) + { + OSL_TRACE("osl_sendSocket : Invalid socket"); + errno=EINVAL; + return -1; + } + + pSockImpl= (oslSocketImpl*)Socket; + + /* ReceiverAddr might be 0 when used on a connected socket. */ + /* Then sendto should behave like send. */ + + nWritten = sendto(pSockImpl->m_Socket, + (sal_Char*)pBuffer, + BytesToSend, + MSG_FLAG_TO_NATIVE(Flag), + (struct sockaddr*)ReceiverAddr, + ReceiverAddr == 0 ? 0 : sizeof(struct sockaddr)); + + if ( nWritten <= 0 ) + { + OSL_TRACE("osl_sendToSocket failed : %i '%s'",nWritten,strerror(errno)); + } + + return nWritten; +} + + +/*****************************************************************************/ +/* osl_isReceiveReady */ +/*****************************************************************************/ +sal_Bool SAL_CALL osl_isReceiveReady(oslSocket Socket, const TimeValue* pTimeout) +{ + fd_set fds; + struct timeval tv; + oslSocketImpl* pSockImpl; + int result; + + OSL_ASSERT(Socket); + if ( Socket == 0 ) + { + return sal_False; + } + + pSockImpl= (oslSocketImpl*)Socket; + + FD_ZERO(&fds); + FD_SET(pSockImpl->m_Socket, &fds); + + if (pTimeout) + { + tv.tv_sec = pTimeout->Seconds; + tv.tv_usec = pTimeout->Nanosec / 1000L; + } + + result= select(pSockImpl->m_Socket+1, /* highest socketno to monitor */ + PTR_FD_SET(fds), /* check read operations */ + 0, /* check write ops */ + 0, /* ckeck for OOB */ + (pTimeout) ? &tv : 0); /* use timeout? */ + + if(result < 0) /* error */ + { + OSL_TRACE("osl_isReceiveReady(): select-error: %d (%s)\n", errno, strerror(errno)); + return sal_False; + } + + if(result == 0) /* timeout */ + { + return sal_False; + } + + return sal_True; +} + + +/*****************************************************************************/ +/* osl_isSendReady */ +/*****************************************************************************/ +sal_Bool SAL_CALL osl_isSendReady(oslSocket Socket, const TimeValue* pTimeout) +{ + fd_set fds; + struct timeval tv; + oslSocketImpl* pSockImpl; + + OSL_ASSERT(Socket); + if ( Socket == 0 ) + { + return sal_False; + } + + pSockImpl= (oslSocketImpl*)Socket; + + FD_ZERO(&fds); + FD_SET(pSockImpl->m_Socket, &fds); + + if (pTimeout) + { + tv.tv_sec = pTimeout->Seconds; + tv.tv_usec = pTimeout->Nanosec / 1000L; + } + + return (select(pSockImpl->m_Socket+1, /* highest socketno to monitor */ + 0, /* check read operations */ + PTR_FD_SET(fds), /* check write ops */ + 0, /* ckeck for OOB */ + (pTimeout) ? &tv : 0)==1); /* use timeout? */ +} + +/*****************************************************************************/ +/* osl_isExceptionPending */ +/*****************************************************************************/ +sal_Bool SAL_CALL osl_isExceptionPending(oslSocket Socket, const TimeValue* pTimeout) +{ + fd_set fds; + struct timeval tv; + oslSocketImpl* pSockImpl; + + OSL_ASSERT(Socket); + if ( Socket == 0 ) + { + return sal_False; + } + + pSockImpl= (oslSocketImpl*)Socket; + + FD_ZERO(&fds); + FD_SET(pSockImpl->m_Socket, &fds); + + if (pTimeout) + { + tv.tv_sec = pTimeout->Seconds; + tv.tv_usec = pTimeout->Nanosec / 1000L; + } + + return (select(pSockImpl->m_Socket+1, /* highest socketno to monitor */ + 0, /* check read operations */ + 0, /* check write ops */ + PTR_FD_SET(fds), /* ckeck for OOB */ + (pTimeout) ? &tv : 0)==1); /* use timeout? */ +} + +/*****************************************************************************/ +/* osl_shutdownSocket */ +/*****************************************************************************/ +sal_Bool SAL_CALL osl_shutdownSocket(oslSocket Socket, + oslSocketDirection Direction) +{ + oslSocketImpl* pSockImpl; + int nRet; + + OSL_ASSERT(Socket); + if ( Socket == 0 ) + { + return sal_False; + } + + pSockImpl= (oslSocketImpl*)Socket; + + nRet=shutdown(pSockImpl->m_Socket, DIRECTION_TO_NATIVE(Direction)); + if (nRet != 0 ) + { +#ifdef DEBUG + fprintf(stderr,"shutdown error '%s'\n",strerror(errno)); +#endif + } + return (nRet==0); +} + + +/*****************************************************************************/ +/* osl_getSocketOption */ +/*****************************************************************************/ +sal_Int32 SAL_CALL osl_getSocketOption(oslSocket Socket, + oslSocketOptionLevel Level, + oslSocketOption Option, + void* pBuffer, + sal_uInt32 BufferLen) +{ + oslSocketImpl* pSockImpl; + + OSL_ASSERT(Socket); + if ( Socket == 0 ) + { + return -1; + } + + pSockImpl= (oslSocketImpl*)Socket; + + if(getsockopt(pSockImpl->m_Socket, + OPTION_LEVEL_TO_NATIVE(Level), + OPTION_TO_NATIVE(Option), + (sal_Char*)pBuffer, + PTR_SIZE_T(BufferLen)) == -1) + { + return -1; + } + + return BufferLen; +} + +/*****************************************************************************/ +/* osl_setSocketOption */ +/*****************************************************************************/ +sal_Bool SAL_CALL osl_setSocketOption(oslSocket Socket, + oslSocketOptionLevel Level, + oslSocketOption Option, + void* pBuffer, + sal_uInt32 BufferLen) +{ + oslSocketImpl* pSockImpl; + + OSL_ASSERT(Socket); + if ( Socket == 0 ) + { + return sal_False; + } + + pSockImpl= (oslSocketImpl*)Socket; + + return(setsockopt(pSockImpl->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 Socket, + sal_Bool On) +{ + int flags; + oslSocketImpl* pSockImpl; + + OSL_ASSERT(Socket); + if ( Socket == 0 ) + { + return sal_False; + } + + pSockImpl= (oslSocketImpl*)Socket; + + flags = fcntl(pSockImpl->m_Socket, F_GETFL, 0); + + if (On) + flags |= O_NONBLOCK; + else + flags &= ~(O_NONBLOCK); + + return fcntl(pSockImpl->m_Socket, F_SETFL, flags) != -1; +} + +/*****************************************************************************/ +/* osl_isNonBlockingMode */ +/*****************************************************************************/ +sal_Bool SAL_CALL osl_isNonBlockingMode(oslSocket Socket) +{ + int flags; + oslSocketImpl* pSockImpl; + + OSL_ASSERT(Socket); + if ( Socket == 0 ) + { + return sal_False; + } + + pSockImpl= (oslSocketImpl*)Socket; + + flags = fcntl(pSockImpl->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 Socket) +{ + oslSocketImpl* pSockImpl; + int Type=0; + sal_uInt32 TypeSize= sizeof(Type); + + OSL_ASSERT(Socket); + if ( Socket == 0 ) + { + return osl_Socket_TypeInvalid; + } + + pSockImpl= (oslSocketImpl*)Socket; + + if(getsockopt(pSockImpl->m_Socket, + OPTION_LEVEL_TO_NATIVE(osl_Socket_LevelSocket), + OPTION_TO_NATIVE(osl_Socket_OptionType), + (sal_Char*)&Type, + PTR_SIZE_T(TypeSize)) == -1) + { + /* error */ + 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] = ""; + + osl_psz_getLastSocketErrorDescription(Socket,pszError,sizeof(pszError)); + + rtl_uString_newFromAscii(ustrError,pszError); + + return; +} + + +void SAL_CALL osl_psz_getLastSocketErrorDescription(oslSocket Socket, 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'; + + strncpy(pBuffer, strerror(errno), BufferSize-1); + +} + +/*****************************************************************************/ +/* osl_getLastSocketError */ +/*****************************************************************************/ +oslSocketError SAL_CALL osl_getLastSocketError(oslSocket Socket) +{ + return ERROR_FROM_NATIVE(errno); +} + +/*****************************************************************************/ +/* 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 Socket) +{ + oslSocketImpl* pSockImpl; + TSocketSetImpl* pSet; + + OSL_ASSERT(Set); + OSL_ASSERT(Socket); + + if ( Set == 0 || Socket == 0) + { + return; + } + + pSockImpl= (oslSocketImpl*)Socket; + pSet= (TSocketSetImpl*)Set; + + /* correct max handle */ + if(pSockImpl->m_Socket > pSet->m_MaxHandle) + pSet->m_MaxHandle= pSockImpl->m_Socket; + FD_SET(pSockImpl->m_Socket, &pSet->m_Set); + +} + +/*****************************************************************************/ +/* osl_removeFromSocketSet */ +/*****************************************************************************/ +void SAL_CALL osl_removeFromSocketSet(oslSocketSet Set, oslSocket Socket) +{ + oslSocketImpl* pSockImpl; + TSocketSetImpl* pSet; + + OSL_ASSERT(Set); + OSL_ASSERT(Socket); + + if ( Set == 0 || Socket == 0) + { + return; + } + + pSockImpl= (oslSocketImpl*)Socket; + pSet= (TSocketSetImpl*)Set; + + /* correct max handle */ + if(pSockImpl->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(pSockImpl->m_Socket, &pSet->m_Set); +} + +/*****************************************************************************/ +/* osl_isInSocketSet */ +/*****************************************************************************/ +sal_Bool SAL_CALL osl_isInSocketSet(oslSocketSet Set, oslSocket Socket) +{ + oslSocketImpl* pSockImpl; + TSocketSetImpl* pSet; + + OSL_ASSERT(Set); + OSL_ASSERT(Socket); + if ( Set == 0 || Socket == 0 ) + { + return sal_False; + } + + pSockImpl= (oslSocketImpl*)Socket; + pSet= (TSocketSetImpl*)Set; + + return (FD_ISSET(pSockImpl->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..49090f1a03c5 --- /dev/null +++ b/sal/osl/unx/sockimpl.h @@ -0,0 +1,87 @@ +/************************************************************************* + * + * $RCSfile: sockimpl.h,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:17:21 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +#ifndef _OSL_SOCKETIMPL_H_ +#define _OSL_SOCKETIMPL_H_ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +typedef void* (*oslCloseCallback) (void*); + +typedef struct _oslSocketImpl { + int m_Socket; + oslCloseCallback m_CloseCallback; + void* m_CallbackArg; +} oslSocketImpl; + +oslSocketImpl* __osl_createSocketImpl(int Socket); +void __osl_destroySocketImpl(oslSocketImpl *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..9a34a1c3fac9 --- /dev/null +++ b/sal/osl/unx/system.c @@ -0,0 +1,454 @@ +/************************************************************************* + * + * $RCSfile: system.c,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:17:21 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +#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 || defined MACOSX +#include +#include + + +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; +} + +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 + +#ifdef SCO +#include +#include +#include + +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 + +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, ncntaddr_list, 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; + + result->h_aliases = buffer; + parray = (char**)buffer; + 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; + + result->h_addr_list = buffer; + parray = (char**)buffer; + 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 /* 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 +*/ +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 + +#ifdef PTHREAD_NONE_INIT +pthread_t _pthread_none_ = PTHREAD_NONE_INIT; +#endif + +#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 + diff --git a/sal/osl/unx/system.h b/sal/osl/unx/system.h new file mode 100644 index 000000000000..699896abb0d6 --- /dev/null +++ b/sal/osl/unx/system.h @@ -0,0 +1,555 @@ +/************************************************************************* + * + * $RCSfile: system.h,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:17:21 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +#ifndef __OSL_SYSTEM_H__ +#define __OSL_SYSTEM_H__ + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include + +#include + +#include +#include + +#include +#include +#include +#include + +#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 +#endif + +#ifdef LINUX +#if GLIBC >= 2 +# include +# include +# include +# include +# include +# include +# include +# include +# include +# include +# include +# include +# 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 CMD_ARG_PROC_STREAM +# define CMD_ARG_PROC_NAME "/proc/%u/cmdline" +# define PTHREAD_SIGACTION pthread_sigaction +#else +# include +# include +# include +# include +# include +# include +# include +# include +# include +# include +# include +# 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 CMD_ARG_PROC_STREAM +# define CMD_ARG_PROC_NAME "/proc/%u/cmdline" +# define PTHREAD_SIGACTION pthread_sigaction +#endif +#endif + +#ifdef NETBSD +# define ETIME ETIMEDOUT +# include +# include +# include +# include +# include +# include +# include +# include +# include +# include +# 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 +# define CMD_ARG_PRG __progname +# define CMD_ARG_ENV environ +#endif + +#ifdef FREEBSD +# define ETIME ETIMEDOUT +# include +# include +# include +# include +# include +# include +# include +# define IORESOURCE_TRANSFER_BSD +# define sched_yield() pthread_yield(0) +# define pthread_testcancel pthread_testintr +# define NO_PTHREAD_RTL +# define NO_PTHREAD_PRIORITY +# define NO_DL_FUNCTIONS +# define CMD_ARG_PRG __progname +# define CMD_ARG_ENV environ +#endif + +#ifdef SCO +# define AF_IPX -1 +# include +# include +# include +# include +# include +# include +# include +# include +# include +# 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 CMD_ARG_ENV _environ +# define STAT_PARENT stat +#endif + +#ifdef AIX +# define AF_IPX -1 +# include +# include +# include +# include +# include +# include +# 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(×pec, 0) +# define LIBPATH "LIBPATH" +# define PTR_SIZE_T(s) ((size_t *)&(s)) +# define NO_PTHREAD_SEMAPHORES +# define NO_DL_FUNCTIONS +# define CMD_ARG_PS "ps -p %u -o args=\"\"" +#endif + +#ifdef HPUX +# define AF_IPX -1 +# undef howmany +# undef MAXINT +# include +# include +# include +# include +# include +# include +# include +# include +# 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 +# define CMD_ARG_PRG $ARGV +# define CMD_ARG_ENV environ +# undef sigaction +# define PTHREAD_SIGACTION cma_sigaction +#endif + +#ifdef IRIX +# define AF_IPX -1 +# include +# include +# include +# include +# include +# include +# include +# include +# include +# 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 SA_FAMILY_DECL \ + union { struct { short sa_family2; } sa_generic; } sa_union +# define NO_DL_FUNCTIONS +# define CMD_ARG_PRG *__Argv +# define CMD_ARG_ENV _environ +#endif + +#ifdef S390 +# define AF_IPX -1 +# include +# include +# include +# include +# include +# include +# include +# define _BIG_ENDIAN +# define LIBPATH "LIPPATH" +# define PTHREAD_NONE_INIT { 0 } +# define sched_yield() pthread_yield(NULL) +# define SLEEP_TIMESPEC(timespec) OSL_TRACE("WARNINIG:sleep not implemented (%s:%d)", __FILE__, __LINE__) +# define pthread_testcancel pthread_testintr +# define pthread_detach(t) pthread_detach(&(t)) +# define NO_PTHREAD_SEMAPHORES +# define NO_PTHREAD_PRIORITY +# define NO_DL_FUNCTIONS +# define PATH_MAX _POSIX_PATH_MAX +#endif + +#ifdef SOLARIS +# include +# include +# include +# include +# include +# include +# include +# include +# include +# include +# define IORESOURCE_TRANSFER_SYSV +# define IOCHANNEL_TRANSFER_BSD +# define LIBPATH "LD_LIBRARY_PATH" +# define PTR_SIZE_T(s) ((int *)&(s)) +# define CMD_ARG_PROC_IOCTL PIOCPSINFO +# define CMD_ARG_PROC_NAME "/proc/%u" +# define CMD_ARG_PROC_TYPE prpsinfo_t +# define CMD_ARG_PROC_ARGC(t) t.pr_argc +# define CMD_ARG_PROC_ARGV(t) t.pr_argv +#endif + +#ifdef MACOSX +# define ETIME ETIMEDOUT +# include +# include +# include +# include +# include +# include +# include +# include +# include +# include +# include +# include +# 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 +# define NO_PTHREAD_SEMAPHORES +# define CMD_ARG_PRG __progname +# define CMD_ARG_ENV environ +#endif + +#if !defined(_WIN32) && !defined(_WIN16) && !defined(OS2) && \ + !defined(LINUX) && !defined(NETBSD) && !defined(SCO) && \ + !defined(AIX) && !defined(HPUX) && !defined(S390) && \ + !defined(SOLARIS) && !defined(IRIX) && !defined(MAC) && \ + !defined(MACOSX) +# error "Target plattform not specified !" +#endif + +#if defined _LITTLE_ENDIAN +# define _OSL_BIGENDIAN +#elif defined _BIG_ENDIAN +# define _OSL_LITENDIAN +#else +# error undetermined endianess +#endif + +#ifndef CMD_ARG_MAX +# define CMD_ARG_MAX 4096 +#endif + +#ifndef ENV_VAR_MAX +# define ENV_VAR_MAX 4096 +#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 +# ifdef MACOSX +# define NORMALIZE_TIMESPEC(timespec) \ + timespec.tv_sec += timespec.tv_nsec / 1000000000; \ + timespec.tv_nsec %= 1000000000; +# else +# define NORMALIZE_TIMESPEC(timespec) \ + timespec##.tv_sec += timespec##.tv_nsec / 1000000000; \ + timespec##.tv_nsec %= 1000000000; +# endif +#endif + +#ifndef SET_TIMESPEC +# ifdef MACOSX +# define SET_TIMESPEC(timespec, sec, nsec) \ + timespec.tv_sec = (sec); \ + timespec.tv_nsec = (nsec); \ + NORMALIZE_TIMESPEC(timespec); +# else +# define SET_TIMESPEC(timespec, sec, nsec) \ + timespec##.tv_sec = (sec); \ + timespec##.tv_nsec = (nsec); \ + NORMALIZE_TIMESPEC(timespec); +# endif +#endif + +#ifndef SLEEP_TIMESPEC +# define SLEEP_TIMESPEC(timespec) nanosleep(×pec, 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 +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); +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/unx/thread.c b/sal/osl/unx/thread.c new file mode 100644 index 000000000000..e16f45bae5e0 --- /dev/null +++ b/sal/osl/unx/thread.c @@ -0,0 +1,1073 @@ +/************************************************************************* + * + * $RCSfile: thread.c,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:17:21 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + + +/* system headers */ +#include "system.h" + +#include +#include +#include + + +/*****************************************************************************/ +/* Thread-data structure hidden behind oslThread: */ +/*****************************************************************************/ + +#define THREADIMPL_FLAGS_TERMINATE 0x00001 +#define THREADIMPL_FLAGS_SLEEP 0x00002 +#define THREADIMPL_FLAGS_SUSPENDED 0x00004 +#define THREADIMPL_FLAGS_ACTIVE 0x00008 +#define THREADIMPL_FLAGS_ATTACHED 0x00010 +#define THREADIMPL_FLAGS_STARTUP 0x00020 + +typedef struct _osl_TThreadImpl { + pthread_t m_hThread; /* OS-handle used for all thread-functions */ + sal_uInt16 m_Ident; + short m_Flags; + sal_uInt32 m_Timeout; + oslWorkerFunction m_WorkerFunction; + void* m_pData; + pthread_mutex_t m_HandleLock; + pthread_cond_t m_Suspend; + pthread_mutex_t m_AccessLock; +} osl_TThreadImpl; + +static sal_Bool osl_init_thread= sal_False; + +#ifndef NO_PTHREAD_PRIORITY +static int Thread_Prio_Highest = 127; +static int Thread_Prio_Above_Normal = 96; +static int Thread_Prio_Normal = 64; +static int Thread_Prio_Below_Normal = 32; +static int Thread_Prio_Lowest = 0; +#endif + +static sal_uInt16 insertThreadId(); +static sal_uInt16 lookupThreadId(); +static void removeThreadId(); +static sal_Bool osl_initThread(); +static void oslCleanupFunction(void* pData); +static void* oslWorkerWrapperFunction(void* pData); +static oslThread oslCreateThread(oslWorkerFunction pWorker, void* pThreadData, short nFlags); + + +#if defined(SOLARIS) + +extern void ChangeGlobalInit(); + +static oslSignalAction oslSigAlarmHandler(void* pData, oslSignalInfo* pInfo) +{ + if ( pInfo == 0 ) + { + return osl_Signal_ActCallNextHdl; + } + + if ( pInfo->Signal == osl_Signal_Alarm ) + { + return osl_Signal_ActIgnore; + } + + return osl_Signal_ActCallNextHdl; +} + +#endif + + +/*****************************************************************************/ +/* ID management */ +/*****************************************************************************/ + +#define HASHID(x) ((int)PTHREAD_VALUE(x) % HashSize) + +typedef struct _HashEntry +{ + pthread_t Handle; + sal_uInt16 Ident; + struct _HashEntry *Next; +} HashEntry; + +static HashEntry* HashTable[32]; +static int HashSize = sizeof(HashTable) / sizeof(HashEntry*); + +static pthread_mutex_t HashLock; + +static sal_uInt16 LastIdent = 0; + +static sal_uInt16 lookupThreadId() +{ + int i, n; + HashEntry *pEntry; + pthread_t hThread = pthread_self(); + + pthread_mutex_lock(&HashLock); + + for (n = 0, i = HASHID(hThread); n < HashSize; n++, i = ++i % HashSize) + { + pEntry = HashTable[i]; + + 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() +{ + HashEntry *pEntry, *pInsert = NULL; + pthread_t hThread = pthread_self(); + + 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; + 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 = pthread_self(); + 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); +} + +/*****************************************************************************/ +/* oslCleanupFunction */ +/*****************************************************************************/ +static void oslCleanupFunction(void* pData) +{ + sal_Bool attached; + + osl_TThreadImpl* pThreadImpl= (osl_TThreadImpl*)pData; + + pthread_mutex_lock(&pThreadImpl->m_HandleLock); + pThreadImpl->m_Flags &= ~THREADIMPL_FLAGS_ACTIVE; + attached = pThreadImpl->m_Flags & THREADIMPL_FLAGS_ATTACHED; + pThreadImpl->m_Flags &= ~THREADIMPL_FLAGS_ATTACHED; + pthread_mutex_unlock(&pThreadImpl->m_HandleLock); + + removeThreadId(); + + if (! attached) + { + pthread_cond_destroy(&pThreadImpl->m_Suspend); + pthread_mutex_destroy(&pThreadImpl->m_HandleLock); + pthread_mutex_destroy(&pThreadImpl->m_AccessLock); + + /* free memory */ + free(pThreadImpl); + } +} + +/*****************************************************************************/ +/* oslWorkerWrapperFunction */ +/*****************************************************************************/ +static void* oslWorkerWrapperFunction(void* pData) +{ + osl_TThreadImpl* pThreadImpl= (osl_TThreadImpl*)pData; + + + pthread_mutex_lock(&pThreadImpl->m_AccessLock); + + pthread_cleanup_push(oslCleanupFunction, pData); + + + /* Check if thread is started in suspended state */ + pthread_mutex_lock(&pThreadImpl->m_HandleLock); + pThreadImpl->m_Ident = insertThreadId(); + pThreadImpl->m_Flags |= THREADIMPL_FLAGS_ACTIVE; + pThreadImpl->m_Flags &= ~THREADIMPL_FLAGS_STARTUP; + pthread_mutex_unlock(&pThreadImpl->m_HandleLock); + + + pthread_cond_signal(&pThreadImpl->m_Suspend); + + + if (pThreadImpl->m_Flags & THREADIMPL_FLAGS_SUSPENDED) + { + pthread_cond_wait(&pThreadImpl->m_Suspend, &pThreadImpl->m_AccessLock); + } + + + pthread_mutex_unlock(&pThreadImpl->m_AccessLock); + + + /* call worker-function with data */ + pThreadImpl->m_WorkerFunction(pThreadImpl->m_pData); + + pthread_cleanup_pop(1); + + return (0); +} + +/*****************************************************************************/ +/* oslCreateThread */ +/*****************************************************************************/ +static oslThread oslCreateThread(oslWorkerFunction pWorker, + void* pThreadData, + short nFlags) +{ + osl_TThreadImpl* pThreadImpl; + int nRet=0; + + /* init threads only once */ + if ( ! osl_init_thread ) + osl_init_thread = osl_initThread(); + + /* alloc mem. for our internal data structure */ + pThreadImpl= (osl_TThreadImpl*)malloc(sizeof(osl_TThreadImpl)); + + OSL_ASSERT(pThreadImpl); + + if ( pThreadImpl == 0 ) + { + return 0; + } + + pThreadImpl->m_WorkerFunction= pWorker; + pThreadImpl->m_pData= pThreadData; + + pThreadImpl->m_Flags = nFlags; + + pthread_mutex_init(&pThreadImpl->m_HandleLock, PTHREAD_MUTEXATTR_DEFAULT); + pthread_mutex_init(&pThreadImpl->m_AccessLock, PTHREAD_MUTEXATTR_DEFAULT); + pthread_cond_init(&pThreadImpl->m_Suspend, PTHREAD_CONDATTR_DEFAULT); + + pthread_mutex_lock(&pThreadImpl->m_AccessLock); + + if ( ( nRet=pthread_create((pthread_t*)&pThreadImpl->m_hThread, /* receives thread data */ + PTHREAD_ATTR_DEFAULT, + oslWorkerWrapperFunction, + (void*)pThreadImpl) ) != 0 ) + { + OSL_TRACE("oslCreateThread failed. Errno: %d; %s\n", + nRet, strerror(nRet)); + + pthread_cond_destroy(&pThreadImpl->m_Suspend); + pthread_mutex_destroy(&pThreadImpl->m_HandleLock); + pthread_mutex_destroy(&pThreadImpl->m_AccessLock); + + free(pThreadImpl); + return 0; + } + + pthread_cond_wait(&pThreadImpl->m_Suspend,&pThreadImpl->m_AccessLock); + + pthread_mutex_unlock(&pThreadImpl->m_AccessLock); + +#ifdef S390 + pthread_setintrtype(PTHREAD_INTR_CONTROLLED); + pthread_setintrtype(PTHREAD_INTR_ENABLE); +#endif + + return (oslThread)pThreadImpl; +} + +/*****************************************************************************/ +/* osl_initThread + 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. + We do this by using this static (thus private for this file) + function (osl_initThread()) to osl_init_thread the static var init. +*/ +/*****************************************************************************/ +static sal_Bool osl_initThread() +{ +#ifndef NO_PTHREAD_PRIORITY + struct sched_param param; + int policy=0; + int nRet=0; +#endif /* NO_PTHREAD_PRIORITY */ + + +#if defined(SOLARIS) + + ChangeGlobalInit(); + + /* + * mfe: 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. + */ + osl_addSignalHandler(&oslSigAlarmHandler,NULL); + +#endif /* SOLARIS */ + + + pthread_mutex_init(&HashLock, PTHREAD_MUTEXATTR_DEFAULT); + + /* main thread should have first ID */ + insertThreadId(); + + +#ifndef NO_PTHREAD_PRIORITY + + if ( ( nRet = pthread_getschedparam(pthread_self(), &policy, ¶m)) != 0 ) + { + OSL_TRACE("failed to get priority of thread [%s]\n",strerror(nRet)); + return sal_False; + } + + 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; + } + + Thread_Prio_Normal = (Thread_Prio_Lowest + Thread_Prio_Highest) / 2; + Thread_Prio_Below_Normal = (Thread_Prio_Lowest + Thread_Prio_Normal) / 2; + Thread_Prio_Above_Normal = (Thread_Prio_Normal + Thread_Prio_Highest) / 2; + + param.sched_priority= Thread_Prio_Normal; + + if ( ( nRet = pthread_setschedparam(pthread_self(), policy, ¶m)) != 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); + return sal_False; + } + +#endif /* NO_PTHREAD_PRIORITY */ + + + return sal_True; +} + +/*****************************************************************************/ +/* osl_createThread */ +/*****************************************************************************/ +oslThread osl_createThread(oslWorkerFunction pWorker, + void* pThreadData) +{ + return oslCreateThread(pWorker, + pThreadData, + THREADIMPL_FLAGS_STARTUP | + THREADIMPL_FLAGS_ATTACHED ); +} + +/*****************************************************************************/ +/* osl_createSuspendedThread */ +/*****************************************************************************/ +oslThread osl_createSuspendedThread(oslWorkerFunction pWorker, + void* pThreadData) +{ + return oslCreateThread(pWorker, + pThreadData, + THREADIMPL_FLAGS_STARTUP | + THREADIMPL_FLAGS_ATTACHED | + THREADIMPL_FLAGS_SUSPENDED ); +} + +/*****************************************************************************/ +/* osl_getThreadIdentifier */ +/*****************************************************************************/ +oslThreadIdentifier SAL_CALL osl_getThreadIdentifier(oslThread Thread) +{ + osl_TThreadImpl* pThreadImpl= (osl_TThreadImpl*)Thread; + + /* init threads only once */ + if (! osl_init_thread) + osl_init_thread = osl_initThread(); + + if (pThreadImpl != NULL) + return ((oslThreadIdentifier)pThreadImpl->m_Ident); + else + { + sal_uInt16 Ident = lookupThreadId(); + + if (Ident == 0) + Ident = insertThreadId(); + + return ((oslThreadIdentifier)Ident); + } +} + +/*****************************************************************************/ +/* 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; + } + + /* cancel thread */ + pthread_cancel(pThreadImpl->m_hThread); +} + +/*****************************************************************************/ +/* osl_freeThreadHandle */ +/*****************************************************************************/ +void SAL_CALL osl_freeThreadHandle(oslThread Thread) +{ + sal_Bool attached; + osl_TThreadImpl* pThreadImpl= (osl_TThreadImpl*)Thread; + + if (Thread == 0) /* valid ptr? */ + { + /* thread already destroyed or not created */ + return; + } + + pthread_mutex_lock(&pThreadImpl->m_HandleLock); + if ( (attached = (pThreadImpl->m_Flags & THREADIMPL_FLAGS_ATTACHED)) > 0 ) + { + pThreadImpl->m_Flags &= ~THREADIMPL_FLAGS_ATTACHED; + pthread_detach(pThreadImpl->m_hThread); + } + pthread_mutex_unlock(&pThreadImpl->m_HandleLock); + + if (! attached) + { + pthread_cond_destroy(&pThreadImpl->m_Suspend); + pthread_mutex_destroy(&pThreadImpl->m_HandleLock); + pthread_mutex_destroy(&pThreadImpl->m_AccessLock); + + /* free memory */ + free(pThreadImpl); + } +} + +/*****************************************************************************/ +/* osl_resumeThread */ +/*****************************************************************************/ +void SAL_CALL osl_resumeThread(oslThread Thread) +{ + osl_TThreadImpl* pThreadImpl= (osl_TThreadImpl*)Thread; + + OSL_ASSERT(pThreadImpl); /* valid ptr? */ + + if ( pThreadImpl == 0 ) + { + return; + } + + + pthread_mutex_lock(&pThreadImpl->m_HandleLock); + + if (pThreadImpl->m_Flags & THREADIMPL_FLAGS_SUSPENDED) + { + pthread_cond_signal(&pThreadImpl->m_Suspend); + } + + + pThreadImpl->m_Flags &= ~THREADIMPL_FLAGS_SUSPENDED; + + pthread_mutex_unlock(&pThreadImpl->m_HandleLock); + + return; +} + +/*****************************************************************************/ +/* osl_suspendThread */ +/*****************************************************************************/ +void SAL_CALL osl_suspendThread(oslThread Thread) +{ + osl_TThreadImpl* pThreadImpl= (osl_TThreadImpl*)Thread; + + OSL_ASSERT(pThreadImpl); /* valid ptr? */ + + if ( pThreadImpl == 0 ) + { + return; + } + + pthread_mutex_lock(&pThreadImpl->m_HandleLock); + + pThreadImpl->m_Flags |= THREADIMPL_FLAGS_SUSPENDED; + + pthread_mutex_unlock(&pThreadImpl->m_HandleLock); + + /* suspend now if we are ourself */ + if ( pthread_equal( pthread_self(), pThreadImpl->m_hThread ) ) + { + pthread_mutex_lock(&pThreadImpl->m_AccessLock); + if (pThreadImpl->m_Flags & THREADIMPL_FLAGS_SUSPENDED) + { + pthread_cond_wait(&pThreadImpl->m_Suspend, &pThreadImpl->m_AccessLock); + } + pthread_mutex_unlock(&pThreadImpl->m_AccessLock); + } + +} + +/*****************************************************************************/ +/* 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; + + osl_TThreadImpl* pThreadImpl= (osl_TThreadImpl*)Thread; + OSL_ASSERT(pThreadImpl); /* valid ptr? */ + + if ( pThreadImpl == 0 ) + { + return; + } + + if ( ( nRet = pthread_getschedparam(pThreadImpl->m_hThread, &policy, &Param)) != 0 ) + { + OSL_TRACE("failed to get priority of thread [%s]\n",strerror(nRet)); + return; + } + + if ( policy >= _SCHED_NEXT) + { + /* mfe: pthread_getschedparam on Salris has a possible Bug */ + /* one gets 959917873 as the policy */ + /* so set the policy to a default one */ + policy=SCHED_RR; + } + + switch(Priority) + { + case osl_Thread_PriorityHighest: + Param.sched_priority= Thread_Prio_Highest; + break; + + case osl_Thread_PriorityAboveNormal: + Param.sched_priority= Thread_Prio_Above_Normal; + break; + + case osl_Thread_PriorityNormal: + Param.sched_priority= Thread_Prio_Normal; + break; + + case osl_Thread_PriorityBelowNormal: + Param.sched_priority= Thread_Prio_Below_Normal; + break; + + case osl_Thread_PriorityLowest: + Param.sched_priority= Thread_Prio_Lowest; + break; + + case osl_Thread_PriorityUnknown: + OSL_ASSERT(sal_False); /* only fools try this...*/ + + /* let release-version behave friendly */ + return; + + default: + OSL_ASSERT(sal_False); /* enum expanded, but forgotten here...*/ + + /* let release-version behave friendly */ + return; + } + + + if ( ( nRet = pthread_setschedparam(pThreadImpl->m_hThread, policy, &Param) ) != 0 ) + { + OSL_TRACE("failed to change thread priority [%s]\n",strerror(nRet)); + } + +#endif + + return; +} + +/*****************************************************************************/ +/* osl_getThreadPriority */ +/* see also notes at osl_setPriorityOfThread */ +/*****************************************************************************/ +oslThreadPriority SAL_CALL osl_getThreadPriority(const oslThread Thread) +{ +#ifndef NO_PTHREAD_PRIORITY + + struct sched_param Param; + int Policy; + oslThreadPriority Priority; + + osl_TThreadImpl* pThreadImpl= (osl_TThreadImpl*)Thread; + + /* invalid arguments ?*/ + if ( (pThreadImpl == 0) || + ( pthread_getschedparam(pThreadImpl->m_hThread, &Policy, &Param) != 0 ) ) + { + return osl_Thread_PriorityUnknown; + } + + /* map pthread priority to enum */ + if (Param.sched_priority==Thread_Prio_Highest) { + /* 127 - highest */ + Priority= osl_Thread_PriorityHighest; + + } else if (Param.sched_priority > Thread_Prio_Normal) { + /* 65..126 - above normal */ + Priority= osl_Thread_PriorityAboveNormal; + + } else if (Param.sched_priority == Thread_Prio_Normal) { + /* normal */ + Priority= osl_Thread_PriorityNormal; + + } else if (Param.sched_priority > Thread_Prio_Lowest) { + /* 63..1 -below normal */ + Priority= osl_Thread_PriorityBelowNormal; + + } else if (Param.sched_priority == Thread_Prio_Lowest) { + /* 0 - lowest */ + Priority= osl_Thread_PriorityLowest; + } + + return Priority; + +#else + + return osl_Thread_PriorityNormal; + +#endif +} + +/*****************************************************************************/ +/* osl_isThreadRunning */ +/*****************************************************************************/ +sal_Bool SAL_CALL osl_isThreadRunning(const oslThread Thread) +{ + osl_TThreadImpl* pThreadImpl= (osl_TThreadImpl*)Thread; + + /* invalid arguments ?*/ + if (pThreadImpl == NULL) + { + return sal_False; + } + + return ((pThreadImpl->m_Flags & + (THREADIMPL_FLAGS_ACTIVE | THREADIMPL_FLAGS_STARTUP)) != 0); +} + +/*****************************************************************************/ +/* osl_joinWithThread */ +/*****************************************************************************/ +void SAL_CALL osl_joinWithThread(oslThread Thread) +{ + osl_TThreadImpl* pThreadImpl= (osl_TThreadImpl*)Thread; + + /* thread already destroyed or not created */ + if (pThreadImpl == NULL) + { + return; + } + + /* wait till it is canceled */ + pthread_join(pThreadImpl->m_hThread, NULL); + return; +} + +/*****************************************************************************/ +/* osl_sleepThread */ +/*****************************************************************************/ +oslThreadSleep SAL_CALL osl_sleepThread(oslThread Thread, const TimeValue* pDelay) +{ + osl_TThreadImpl* pThreadImpl= (osl_TThreadImpl*)Thread; + + /* invalid arguments?*/ + if (pThreadImpl == NULL || PTHREAD_VALUE(pThreadImpl->m_hThread)==0 || pDelay==0) + return osl_Thread_SleepError; + + if (pThreadImpl->m_Flags & THREADIMPL_FLAGS_SLEEP) + return osl_Thread_SleepActive; + + if (pthread_equal(pThreadImpl->m_hThread, pthread_self())) + { + int ret; + struct timeval now; + struct timespec delay; + int nOk=0; + + pthread_mutex_lock(&pThreadImpl->m_HandleLock); + pThreadImpl->m_Timeout = 0; + pThreadImpl->m_Flags |= THREADIMPL_FLAGS_SLEEP; + pthread_mutex_unlock(&pThreadImpl->m_HandleLock); + + gettimeofday(&now, NULL); + + SET_TIMESPEC(delay, now.tv_sec + (unsigned long) pDelay->Seconds, + (now.tv_usec * 1000) + (unsigned long) pDelay->Nanosec); + + while ( nOk == 0 ) + { + pthread_mutex_lock(&pThreadImpl->m_AccessLock); + + ret = pthread_cond_timedwait(&pThreadImpl->m_Suspend, &pThreadImpl->m_AccessLock, &delay); + if ( ret != EINTR ) + { + nOk=1; + } + pthread_mutex_unlock(&pThreadImpl->m_AccessLock); + } + + pthread_mutex_lock(&pThreadImpl->m_HandleLock); + pThreadImpl->m_Flags &= ~THREADIMPL_FLAGS_SLEEP; + pthread_mutex_unlock(&pThreadImpl->m_HandleLock); + + return (ret == ETIME || ret == ETIMEDOUT ) ? osl_Thread_SleepNormal : + osl_Thread_SleepCancel; + } + else + { + pthread_mutex_lock(&pThreadImpl->m_HandleLock); + + pThreadImpl->m_Timeout = pDelay->Seconds*1000+pDelay->Nanosec/1000000; + pThreadImpl->m_Flags |= THREADIMPL_FLAGS_SLEEP; + + pthread_mutex_unlock(&pThreadImpl->m_HandleLock); + + return osl_Thread_SleepPending; + } +} + +/*****************************************************************************/ +/* osl_awakeThread */ +/*****************************************************************************/ +sal_Bool SAL_CALL osl_awakeThread(oslThread Thread) +{ + osl_TThreadImpl* pThreadImpl= (osl_TThreadImpl*)Thread; + + /* invalid arguments?*/ + if (pThreadImpl==NULL || PTHREAD_VALUE(pThreadImpl->m_hThread)==0) + { + /* assume thread is not running */ + return sal_False; + } + + pthread_mutex_lock(&pThreadImpl->m_HandleLock); + + if (pThreadImpl->m_Flags & THREADIMPL_FLAGS_SLEEP) + pthread_cond_signal(&pThreadImpl->m_Suspend); + + pThreadImpl->m_Flags &= ~THREADIMPL_FLAGS_SLEEP; + + pthread_mutex_unlock(&pThreadImpl->m_HandleLock); + + return sal_True; +} + +/*****************************************************************************/ +/* 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_terminateThread */ +/*****************************************************************************/ +void SAL_CALL osl_terminateThread(oslThread Thread) +{ + osl_TThreadImpl* pThreadImpl= (osl_TThreadImpl*)Thread; + + + OSL_ASSERT(pThreadImpl); /* valid ptr? */ + + /* invalid arguments?*/ + if (pThreadImpl==NULL || PTHREAD_VALUE(pThreadImpl->m_hThread)==0) + { + /* assume thread is not running */ + return; + } + + pthread_mutex_lock(&pThreadImpl->m_HandleLock); + + pThreadImpl->m_Flags |= THREADIMPL_FLAGS_TERMINATE; + + if (pThreadImpl->m_Flags & (THREADIMPL_FLAGS_SLEEP | THREADIMPL_FLAGS_SUSPENDED)) + { + pthread_cond_signal(&pThreadImpl->m_Suspend); + } + + pthread_mutex_unlock(&pThreadImpl->m_HandleLock); +} + +/*****************************************************************************/ +/* osl_scheduleThread */ +/*****************************************************************************/ +sal_Bool SAL_CALL osl_scheduleThread(oslThread Thread) +{ + osl_TThreadImpl* pThreadImpl= (osl_TThreadImpl*)Thread; + +/* OSL_ASSERT(pThreadImpl);*/ /* valid ptr? */ + + /* invalid arguments?*/ + if (pThreadImpl==0 || PTHREAD_VALUE(pThreadImpl->m_hThread)==0) + { + /* assume thread is not running */ + return sal_False; + } + + OSL_ASSERT(pthread_equal(pThreadImpl->m_hThread, pthread_self())); + + + pthread_testcancel(); + + pthread_mutex_lock(&pThreadImpl->m_HandleLock); + + if (pThreadImpl->m_Flags & THREADIMPL_FLAGS_SUSPENDED) + { + pthread_mutex_lock(&pThreadImpl->m_AccessLock); + pthread_cond_wait(&pThreadImpl->m_Suspend, &pThreadImpl->m_AccessLock); + pthread_mutex_unlock(&pThreadImpl->m_AccessLock); + } + + pthread_mutex_unlock(&pThreadImpl->m_HandleLock); + + if (pThreadImpl->m_Flags & THREADIMPL_FLAGS_SLEEP) + { + int ret; + struct timeval now; + struct timespec delay; + int nOk=0; + + gettimeofday(&now, NULL); + + SET_TIMESPEC(delay, now.tv_sec + pThreadImpl->m_Timeout / 1000, + now.tv_usec * 1000 + (pThreadImpl->m_Timeout % 1000) * 1000000); + + while ( nOk == 0 ) + { + pthread_mutex_lock(&pThreadImpl->m_AccessLock); + + ret=pthread_cond_timedwait(&pThreadImpl->m_Suspend, &pThreadImpl->m_AccessLock, &delay); + if ( ret != EINTR ) + { + nOk=1; + } + pthread_mutex_unlock(&pThreadImpl->m_AccessLock); + } + + pthread_mutex_lock(&pThreadImpl->m_HandleLock); + pThreadImpl->m_Flags &= ~THREADIMPL_FLAGS_SLEEP; + pthread_mutex_unlock(&pThreadImpl->m_HandleLock); + } + + + pthread_testcancel(); + + return ((pThreadImpl->m_Flags & THREADIMPL_FLAGS_TERMINATE) == 0); +} + +/*****************************************************************************/ +/* 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_createThreadKey */ +/*****************************************************************************/ +oslThreadKey SAL_CALL osl_createThreadKey(void) +{ + pthread_key_t key; + + if (pthread_key_create(&key, NULL) != 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); +} + + +/*****************************************************************************/ +/* osl_getThreadTextEncoding */ +/*****************************************************************************/ +rtl_TextEncoding SAL_CALL osl_getThreadTextEncoding() +{ + /* FIXME: mfe : osl_getThreadTextEncoding + * This function has to return a Thread Specific + * Encoding. + * It is yet to be implemented. + */ + return RTL_TEXTENCODING_ISO_8859_1; +} + + +/*****************************************************************************/ +/* osl_setThreadTextEncoding */ +/*****************************************************************************/ +rtl_TextEncoding osl_setThreadTextEncoding(rtl_TextEncoding Encoding) +{ + /* FIXME: mfe : osl_setThreadTextEncoding + * This function has to set a Thread Specific + * Encoding. + * It is yet to be implemented. + */ + + return RTL_TEXTENCODING_ISO_8859_1; +} + + diff --git a/sal/osl/unx/time.c b/sal/osl/unx/time.c new file mode 100644 index 000000000000..a2dc2c15da36 --- /dev/null +++ b/sal/osl/unx/time.c @@ -0,0 +1,234 @@ +/************************************************************************* + * + * $RCSfile: time.c,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:17:21 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + + +#include "system.h" + +#include +#include + + +sal_Bool SAL_CALL osl_getSystemTime(TimeValue* TimeValue) +{ + struct timeval tp; + + 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; + time_t atime; + + atime = (time_t)pTimeVal->Seconds; + + // Convert time from type time_t to struct tm + pSystemTime = gmtime( &atime ); + + + // 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 aSystemTime; + time_t aSeconds; + + // Convert struct oslDateTime to struct tm + aSystemTime.tm_sec = pDateTime->Seconds; + aSystemTime.tm_min = pDateTime->Minutes; + aSystemTime.tm_hour = pDateTime->Hours; + aSystemTime.tm_mday = pDateTime->Day; + aSystemTime.tm_wday = pDateTime->DayOfWeek; + + if ( pDateTime->Month > 1) + aSystemTime.tm_mon = pDateTime->Month - 1; + else + return sal_False; + + if ( pDateTime->Year >= 1900) + aSystemTime.tm_year = pDateTime->Year - 1900; + else + return sal_False; + + aSystemTime.tm_isdst = 0; + aSystemTime.tm_wday = 0; + aSystemTime.tm_yday = 0; + + // Convert time to calendar value + aSeconds = mktime( &aSystemTime ); + + if (aSeconds != (time_t) -1) + { + tzset(); + +#ifdef MACOSX + fprintf( stderr, "osl_getTimeValueFromDateTime: timezone correction not implemented\n" ); +#else + // timezone corrections + if ( (sal_Int64) aSeconds > timezone ) + aSeconds -= timezone; + else + return sal_False; +#endif + + pTimeVal->Seconds = aSeconds; + pTimeVal->Nanosec = pDateTime->NanoSeconds; + + return sal_True; + } + + return sal_False; +} + + +//-------------------------------------------------- +// osl_getLocalTimeFromSystemTime +//-------------------------------------------------- + +sal_Bool SAL_CALL osl_getLocalTimeFromSystemTime( TimeValue* pSystemTimeVal, TimeValue* pLocalTimeVal ) +{ + sal_Int64 bias; + + tzset(); + +#ifdef MACOSX + fprintf( stderr, "osl_getLocalTimeFromSystemTime: timezone correction not implemented\n" ); +#else + // timezone an daylight saving time + if ( daylight != 0) + bias = timezone - 3600; + else + bias = 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 ) +{ + sal_Int64 bias; + + tzset(); + +#ifdef MACOSX + fprintf( stderr, "osl_getLocalTimeFromSystemTime: timezone correction not implemented\n" ); +#else + // timezone an daylight saving time + if ( daylight != 0) + bias = timezone - 3600; + else + bias = timezone; +#endif + + if ( (sal_Int64) pSystemTimeVal->Seconds + bias > 0) + { + pSystemTimeVal->Seconds = pLocalTimeVal->Seconds + bias; + pSystemTimeVal->Nanosec = pLocalTimeVal->Nanosec; + + return sal_True; + } + + return sal_False; +} + + diff --git a/sal/osl/unx/util.c b/sal/osl/unx/util.c new file mode 100644 index 000000000000..8142237dfe23 --- /dev/null +++ b/sal/osl/unx/util.c @@ -0,0 +1,323 @@ +/************************************************************************* + * + * $RCSfile: util.c,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:17:21 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + + +#include +#include +#include +#include +#include +#include +#include + +#ifdef SOLARIS +#include +#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); +static char* osl_decodeEtherAddr(const char *ptr, char* buff); + + +/*****************************************************************************/ +/* osl_getEtherAddr */ +/*****************************************************************************/ + +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; +#endif + + 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; + } + + + /* + * 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; + } + } + + close(so); + return sal_False; +} + + +extern sal_Bool osl_getEtherAddr(sal_Char* pszAddr, sal_uInt16 BufferSize) +{ + char buff[1024]; + char hard_addr[64]; + struct ifconf ifc; + struct ifreq *ifr; + int i; + int so; + + if ( pszAddr == 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; + } + + + /* + * 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 ) + { + osl_decodeEtherAddr(hard_addr,pszAddr); + return sal_True; + } + } + + close(so); + return sal_False; +} + + +/*****************************************************************************/ +/* 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)); */ + 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));*/ + return 0; + } + + + /* + * And now, the real thing: the get address + */ + +#ifdef LINUX + 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); + return ret; + } + +#ifdef LINUX + 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; +} + + +/*****************************************************************************/ +/* osl_decodeEtherAddr */ +/*****************************************************************************/ + +static char* osl_decodeEtherAddr(const char *ptr, char* buff) +{ + sprintf(buff, "%02X:%02X:%02X:%02X:%02X:%02X", + (ptr[0] & 0377), (ptr[1] & 0377), (ptr[2] & 0377), + (ptr[3] & 0377), (ptr[4] & 0377), (ptr[5] & 0377)); + return(buff); +} + + diff --git a/sal/osl/w32/MAKEFILE.MK b/sal/osl/w32/MAKEFILE.MK new file mode 100644 index 000000000000..467854ecee37 --- /dev/null +++ b/sal/osl/w32/MAKEFILE.MK @@ -0,0 +1,117 @@ +#************************************************************************* +# +# $RCSfile: MAKEFILE.MK,v $ +# +# $Revision: 1.1.1.1 $ +# +# last change: $Author: hr $ $Date: 2000-09-18 15:17:23 $ +# +# Copyright according the GNU Public License. +# +#************************************************************************* + +PRJ=..$/.. + +PRJNAME=sal +TARGET=cpposl +USE_LDUMP2=TRUE + +PROJECTPCH4DLL=TRUE +PROJECTPCH=cont_pch +PROJECTPCHSOURCE=cont_pch + +MULTITHREAD_OBJ=TRUE + +# --- Settings ----------------------------------------------------- + +.INCLUDE : svpre.mk +.INCLUDE : settings.mk +.INCLUDE : sv.mk + +# --- Files -------------------------------------------------------- + +.IF "$(header)" == "" + +#CFILES= conditn.c \ +# diagnose.c \ +# dllentry.c \ +# semaphor.c \ +# socket.c \ +# interlck.c \ +# mutex.c \ +# thread.c \ +# module.c \ +# process.c \ +# security.c \ +# profile.c \ +# time.c \ +# file.c \ +# signal.c \ +# pipe.c \ +# daemon.c \ +# daemregw.c \ +# channel.c \ +# util.c \ +# ports.c \ +# dir.c \ +# dirw9x.c + +SLOFILES= $(SLO)$/conditn.obj \ + $(SLO)$/diagnose.obj \ + $(SLO)$/dllentry.obj \ + $(SLO)$/semaphor.obj \ + $(SLO)$/socket.obj \ + $(SLO)$/interlck.obj \ + $(SLO)$/mutex.obj \ + $(SLO)$/thread.obj \ + $(SLO)$/module.obj \ + $(SLO)$/process.obj \ + $(SLO)$/security.obj \ + $(SLO)$/profile.obj \ + $(SLO)$/time.obj \ + $(SLO)$/file.obj \ + $(SLO)$/signal.obj \ + $(SLO)$/pipe.obj \ + $(SLO)$/daemon.obj \ + $(SLO)$/daemregw.obj \ + $(SLO)$/channel.obj \ + $(SLO)$/util.obj \ + $(SLO)$/ports.obj \ + $(SLO)$/dir.obj \ + $(SLO)$/dirw9x.obj + + +OBJFILES= $(OBJ)$/conditn.obj \ + $(OBJ)$/diagnose.obj \ + $(OBJ)$/libutil.obj \ + $(OBJ)$/semaphor.obj \ + $(OBJ)$/socket.obj \ + $(OBJ)$/interlck.obj \ + $(OBJ)$/mutex.obj \ + $(OBJ)$/thread.obj \ + $(OBJ)$/module.obj \ + $(OBJ)$/process.obj \ + $(OBJ)$/security.obj \ + $(OBJ)$/profile.obj \ + $(OBJ)$/time.obj \ + $(OBJ)$/file.obj \ + $(OBJ)$/signal.obj \ + $(OBJ)$/pipe.obj \ + $(OBJ)$/daemon.obj \ + $(OBJ)$/daemregw.obj \ + $(OBJ)$/channel.obj \ + $(OBJ)$/util.obj \ + $(OBJ)$/ports.obj \ + $(OBJ)$/dir.obj \ + $(OBJ)$/dirw9x.obj + +DEPOBJFILES = $(OBJ)$/sdaemon.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..ce9cfc07e6c1 --- /dev/null +++ b/sal/osl/w32/conditn.c @@ -0,0 +1,173 @@ +/************************************************************************* + * + * $RCSfile: conditn.c,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:17:23 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +#include "system.h" + +#include +#include +#include + +/* + 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() +{ + 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 SetEvent((HANDLE)Condition); +} + +/*****************************************************************************/ +/* osl_resetCondition */ +/*****************************************************************************/ +sal_Bool SAL_CALL osl_resetCondition(oslCondition Condition) +{ + OSL_ASSERT(Condition); + + return ResetEvent((HANDLE)Condition); +} + +/*****************************************************************************/ +/* 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; + + while(1) + { + switch (MsgWaitForMultipleObjects(1, &((HANDLE)Condition), + FALSE, timeout, QS_SENDMESSAGE)) + { + case WAIT_OBJECT_0: + return (osl_cond_result_ok); + + case WAIT_OBJECT_0 + 1: + { + MSG msg; + + while (PeekMessage(&msg, NULL, WM_USER - 1, WM_USER - 1, PM_REMOVE)) + { + TranslateMessage(&msg); + DispatchMessage(&msg); + } + break; + } + + 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 (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..af72fc958569 --- /dev/null +++ b/sal/osl/w32/diagnose.c @@ -0,0 +1,155 @@ +/************************************************************************* + * + * $RCSfile: diagnose.c,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:17:23 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +#include "system.h" + +#define NO_DEBUG_CRT + +#include + +#define NO_DEBUG_CRT + +/* + Trace output +*/ + +void SAL_CALL osl_breakDebug() +{ + DebugBreak(); +} + +void SAL_CALL osl_trace(const sal_Char* lpszFormat, ...) +{ + va_list args; + + va_start(args, lpszFormat); + + vfprintf(stderr,lpszFormat, args); + + 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 = "OSL"; + 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); + + /* active popup window for the current thread */ + hWndParent = GetActiveWindow(); + if (hWndParent != NULL) + hWndParent = GetLastActivePopup(hWndParent); + + /* set message box flags */ + nFlags = MB_TASKMODAL|MB_ICONHAND|MB_ABORTRETRYIGNORE|MB_SETFOREGROUND; + if (hWndParent == NULL) + nFlags |= MB_SERVICE_NOTIFICATION; + + /* display the assert */ + nCode = MessageBox(hWndParent, szMessage, "Assertion Failed!", nFlags); + + if (nCode == IDABORT) + PostQuitMessage(-1); + + if (nCode == IDIGNORE) + return sal_False; /* ignore */ + + if (nCode == IDRETRY) + 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); + + /* set message box flags */ + nFlags = MB_TASKMODAL|MB_ICONHAND|MB_ABORTRETRYIGNORE|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..57389013ea5e --- /dev/null +++ b/sal/osl/w32/dllentry.c @@ -0,0 +1,224 @@ +/************************************************************************* + * + * $RCSfile: dllentry.c,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:17:23 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +#include +#include + +#include +#include +#include +#include +#include + + +#define _DIRW9X_INITIALIZE_ +#include "dirW9X.h" + +extern HRESULT (WINAPI *_CoInitializeEx) (LPVOID pvReserved, DWORD dwCoInit); +extern LPWSTR *lpArgvW; + +extern DWORD g_dwTLSTextEncodingIndex; + +/* remember plattform */ +DWORD g_dwPlatformId = VER_PLATFORM_WIN32_WINDOWS; + +#include + +#define ERR_GENERAL_WRONG_CPU 101 +#define ERR_WINSOCK_INIT_FAILED 102 +#define ERR_WINSOCK_WRONG_VERSION 103 + +static sal_Bool showMessage(int MessageId) +{ + const char *pStr = "unknown error"; + + switch (MessageId) + { + case ERR_GENERAL_WRONG_CPU: + pStr = "x486 or Pentium compatible CPU required!\nThe application may not run stable."; + break; + + case ERR_WINSOCK_INIT_FAILED: + pStr = "Failed to initialize WINSOCK library!\nThe application may not run stable."; + break; + + case ERR_WINSOCK_WRONG_VERSION: + pStr = "Wrong version of WINSOCK library!\nThe application may not run stable."; + break; + + default: + pStr = "Unknown error while initialization!\nThe application may not run stable."; + } + + MessageBox(NULL, pStr, "Sun Microsystems - System Abstraction Layer", MB_OK | MB_ICONWARNING | MB_TASKMODAL); + + return (sal_True); +} + +static void InitDCOM(void) +{ + HINSTANCE hInstance = LoadLibrary("ole32.dll"); + + if(hInstance) + { + FARPROC pFunc = GetProcAddress(hInstance, "CoInitializeEx"); + + if(pFunc) + _CoInitializeEx = (HRESULT (WINAPI *) (LPVOID, DWORD)) pFunc; + + FreeLibrary(hInstance); + } +} + +__declspec( dllexport ) sal_Bool WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) +{ + switch (fdwReason) + { + case DLL_PROCESS_ATTACH: + { + OSVERSIONINFO aInfo; + WORD wVersionRequested; + WSADATA wsaData; + int error; +#ifdef _M_IX86 + SYSTEM_INFO SystemInfo; + + GetSystemInfo(&SystemInfo); + + if ((SystemInfo.dwProcessorType != PROCESSOR_INTEL_486) && + (SystemInfo.dwProcessorType != PROCESSOR_INTEL_PENTIUM)) + showMessage(ERR_GENERAL_WRONG_CPU); +#endif + wVersionRequested = MAKEWORD(2, 2); + + error = WSAStartup(wVersionRequested, &wsaData); + if (error == 0) + { + WORD wMajorVersionRequired = 1; + WORD wMinorVersionRequired = 1; + + if ((LOBYTE(wsaData.wVersion) < wMajorVersionRequired) || + (LOBYTE(wsaData.wVersion) == wMajorVersionRequired) && + ((HIBYTE(wsaData.wVersion) < wMinorVersionRequired))) + showMessage(ERR_WINSOCK_WRONG_VERSION); + } + else + showMessage(ERR_WINSOCK_INIT_FAILED); + + /* initialize Win9x unicode functions */ + aInfo.dwOSVersionInfoSize = sizeof(aInfo); + if (GetVersionEx(&aInfo)) + { + Kernel9xInit(&aInfo); + Advapi9xInit(&aInfo); + Comdlg9xInit(&aInfo); + Shell9xInit(&aInfo); + User9xInit(&aInfo); + + if (aInfo.dwPlatformId==VER_PLATFORM_WIN32_NT) + { + lpfnFindFirstFile = FindFirstFileW; + lpfnFindNextFile = FindNextFileW; + lpfnCreateFile = CreateFileW; + lpfnSetFileAttributes = SetFileAttributesW; + lpfnSearchPath = SearchPathW; + lpfnCreateProcess = CreateProcessW; + lpfnCreateProcessAsUser = CreateProcessAsUserW; + lpfnGetEnvironmentVariable=GetEnvironmentVariableW; + lpfnWNetAddConnection2=WNetAddConnection2W; + lpfnWNetCancelConnection2=WNetCancelConnection2W; + lpfnWNetGetUser=WNetGetUserW; + lpfnGetWindowsDirectory=GetWindowsDirectoryW; + lpfnCreateDirectory=CreateDirectoryW; + lpfnWritePrivateProfileString=WritePrivateProfileStringW; + lpfnGetPrivateProfileString=GetPrivateProfileStringW; + } + + g_dwPlatformId = aInfo.dwPlatformId; + } + + g_dwTLSTextEncodingIndex = TlsAlloc(); + +// InitDCOM(); + + break; + } + + case DLL_PROCESS_DETACH: + { + Advapi9xDeInit(); + Comdlg9xDeInit(); + Kernel9xDeInit(); + Shell9xDeInit(); + User9xDeInit(); + + WSACleanup(); + if (lpArgvW) + GlobalFree(lpArgvW); + break; + + TlsFree( g_dwTLSTextEncodingIndex ); + } + } + + return (sal_True); +} + diff --git a/sal/osl/w32/interlck.c b/sal/osl/w32/interlck.c new file mode 100644 index 000000000000..d2170b7a672e --- /dev/null +++ b/sal/osl/w32/interlck.c @@ -0,0 +1,144 @@ +/************************************************************************* + * + * $RCSfile: interlck.c,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:17:23 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +#include "system.h" + +#include +#include + +/* 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 +#pragma warning(disable: 4035) +{ + __asm + { + mov ecx, pCount + mov eax, 1 + lock xadd dword ptr [ecx],eax + inc eax + } +} +#pragma warning(default: 4035) +#else +#pragma message("WARNING: Using system InterlockedIncrement") +{ + return (InterlockedIncrement(pCount)); +} +#endif + +/*****************************************************************************/ +/* osl_decrementInterlockedCount */ +/*****************************************************************************/ +oslInterlockedCount SAL_CALL osl_decrementInterlockedCount(oslInterlockedCount* pCount) +#ifdef _M_IX86 +#pragma warning(disable: 4035) +{ + __asm + { + mov ecx, pCount + mov eax, -1 + lock xadd dword ptr [ecx],eax + dec eax + } +} +#pragma warning(default: 4035) +#else +#pragma message("WARNING: Using system InterlockedDecrement") +{ + return (InterlockedDecrement(pCount)); +} +#endif + +/************************************************************************* +* +* $Log: not supported by cvs2svn $ +* Revision 1.6 2000/09/18 14:29:01 willem.vandorp +* OpenOffice header added. +* +* Revision 1.5 1999/10/27 15:13:35 mfe +* Change of Copyright, removed compiler warnings, code clean up, ... +* +* Revision 1.4 1999/03/02 15:23:11 rh +* #62469 MessageBox if Winsock failed, and new interlocked count in assembler +* +* Revision 1.3 1999/02/15 15:36:06 mm +* #61896 W95 fix, mutex instead of sytem call +* +* Revision 1.2 1999/01/20 19:09:49 jsc +* #61011# Typumstellung +* +* Revision 1.1 1998/09/22 14:57:55 rh +* added interlock functions +* +*************************************************************************/ + diff --git a/sal/osl/w32/libutil.c b/sal/osl/w32/libutil.c new file mode 100644 index 000000000000..9c35c9b73206 --- /dev/null +++ b/sal/osl/w32/libutil.c @@ -0,0 +1,94 @@ +/************************************************************************* + * + * $RCSfile: libutil.c,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:17:23 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +#include + +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; +} + +/************************************************************************* +* +* $Log: not supported by cvs2svn $ +* Revision 1.2 2000/09/18 14:29:01 willem.vandorp +* OpenOffice header added. +* +* Revision 1.1 2000/05/22 15:29:08 obr +* unicode changes channel/pipe +* +* +*************************************************************************/ diff --git a/sal/osl/w32/module.c b/sal/osl/w32/module.c new file mode 100644 index 000000000000..2c0aeefe596e --- /dev/null +++ b/sal/osl/w32/module.c @@ -0,0 +1,187 @@ +/************************************************************************* + * + * $RCSfile: module.c,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:17:23 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + + +#include "system.h" + +#include +#include +#include +#include +#include +#include + + +/* + 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; + + OSL_ASSERT(strModuleName); + + if (strModuleName->buffer[0] == L'/' && strModuleName->buffer[1] == L'/') + osl_getSystemPathFromNormalizedPath(strModuleName, &Module); + else + rtl_uString_assign(&Module, strModuleName); + + hInstance = LoadLibraryW(Module->buffer); + + if (hInstance <= (HINSTANCE)HINSTANCE_ERROR) + hInstance = 0; + + rtl_uString_release(Module); + SetErrorMode(errorMode); + return (oslModule)hInstance; +} + +/*****************************************************************************/ +/* osl_unloadModule */ +/*****************************************************************************/ +void SAL_CALL osl_unloadModule(oslModule Module) +{ + OSL_ASSERT(Module); + FreeLibrary((HINSTANCE)Module); +} + +/*****************************************************************************/ +/* osl_getSymbol */ +/*****************************************************************************/ +void* SAL_CALL osl_getSymbol(oslModule Module, rtl_uString *strSymbolName) +{ + rtl_String *symbolName = NULL; + void *address; + + OSL_ASSERT(Module); + OSL_ASSERT(strSymbolName); + + rtl_uString2String( + &symbolName, + strSymbolName->buffer, + strSymbolName->length, + RTL_TEXTENCODING_UTF8, + OUSTRING_TO_OSTRING_CVTFLAGS + ); + + address=(void*)GetProcAddress((HINSTANCE)Module, rtl_string_getStr(symbolName)); + rtl_string_release(symbolName); + + return address; +} + +/*****************************************************************************/ +/* osl_getSymbolA */ +/*****************************************************************************/ + +void* SAL_CALL osl_getSymbolA(oslModule Module, const char *pszSymbolName) +{ + OSL_ASSERT(Module); + OSL_ASSERT(pszSymbolName); + + return (void*) GetProcAddress((HINSTANCE)Module, pszSymbolName); +} + +/************************************************************************* +* +* $Log: not supported by cvs2svn $ +* Revision 1.11 2000/09/18 14:29:01 willem.vandorp +* OpenOffice header added. +* +* Revision 1.10 2000/06/18 12:06:35 obr +* function names have to be ascii +* +* Revision 1.9 2000/05/22 15:30:35 obr +* moved some unicode wrapper for 9x to kernel9x.lib +* +* Revision 1.8 2000/03/31 15:55:14 rs +* UNICODE-Changes +* +* Revision 1.7 2000/01/06 11:50:21 mfe +* #71540# : for incompatible z'en +* +* Revision 1.6 2000/01/04 14:06:15 mfe +* osl_loadModule takes 2nd parameter +* +* Revision 1.5 1999/10/27 15:13:35 mfe +* Change of Copyright, removed compiler warnings, code clean up, ... +* +* Revision 1.4 1999/04/13 11:50:24 jsc +* #62178# Keine ErrorBox, wenn eine dynamisch angezogene DLL eines Modules nicht gefunden wird und das Module durch loadOnCall angezogen wird +* +* Revision 1.3 1999/01/20 19:09:49 jsc +* #61011# Typumstellung +* +* Revision 1.2 1997/07/15 19:02:03 rh +* system.h inserted +* +* Revision 1.1 1997/07/03 10:04:32 rh +* Module handling added +* +*************************************************************************/ + diff --git a/sal/osl/w32/mutex.c b/sal/osl/w32/mutex.c new file mode 100644 index 000000000000..444aa0c98284 --- /dev/null +++ b/sal/osl/w32/mutex.c @@ -0,0 +1,261 @@ +/************************************************************************* + * + * $RCSfile: mutex.c,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:17:23 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +#include "system.h" + +#include +#include + +/* + 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() +{ + 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 lpfTryEnterCriticalSection(&pMutexImpl->m_Mutex); + 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; +} + +/************************************************************************* +* +* $Log: not supported by cvs2svn $ +* Revision 1.9 2000/09/18 14:29:01 willem.vandorp +* OpenOffice header added. +* +* Revision 1.8 1999/10/27 15:13:35 mfe +* Change of Copyright, removed compiler warnings, code clean up, ... +* +* Revision 1.7 1999/01/20 19:09:49 jsc +* #61011# Typumstellung +* +* Revision 1.6 1998/12/22 13:05:22 ts +* #60565# TryEnterCriticalSection() nicht unter W98 +* +* Revision 1.5 1998/12/10 12:49:54 th +* #55723# - tryToAquire sollte jetzt auch unter W95 funktionieren (Lock wird jetzt abgefragt) +* +* Revision 1.4 1998/05/15 11:53:39 rh +* Fix for TryToAcquire +* +* Revision 1.3 1998/04/22 07:01:54 rh +* Added internal mutex for TryToAcquire +* +* Revision 1.2 1998/03/21 12:36:16 rh +* Implementation TryToAcquire for Windows 95 +* +* Revision 1.1 1998/02/16 19:34:58 rh +* Cleanup of ports, integration of Size_t, features for process +* +*************************************************************************/ + diff --git a/sal/osl/w32/pipe.c b/sal/osl/w32/pipe.c new file mode 100644 index 000000000000..9b956772fe6d --- /dev/null +++ b/sal/osl/w32/pipe.c @@ -0,0 +1,1063 @@ +/************************************************************************* + * + * $RCSfile: pipe.c,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:17:23 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + + +#include "system.h" + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#define PIPEWINDOWCLASS "__OSL_PIPE_WNDCLASS__" +#define PIPESYSTEM "\\\\.\\pipe\\" +#define PIPEPREFIX "OSL_PIPE_" + +#define WND_PIPE_TIMERID 1 +#define WND_PIPE_INTERVALL 1000 + +typedef enum { + MSG_OFF = 0xDEADBEEF, + MSG_SYN, + MSG_FIN, + MSG_DATA, + MSG_UNKNOWN +} MessageType; + +typedef struct +{ + sal_uInt32 m_Size; + sal_uInt32 m_ReadPos; + sal_uInt32 m_WritePos; + BYTE m_Data[1]; + +} oslPipeBuffer; + +/*****************************************************************************/ +/* oslPipeImpl */ +/*****************************************************************************/ + +typedef struct _oslPipePacket { + struct _oslPipePacket* m_Next; + DWORD m_Bytes; + BYTE m_Data[1]; +} oslPipePacket; + +typedef struct _oslPipeImpl { + oslInterlockedCount m_Reference; + HANDLE m_File; + HWND m_SrcWnd; + HWND m_DstWnd; + PSECURITY_ATTRIBUTES m_Security; + HANDLE m_ReadEvent; + HANDLE m_WriteEvent; + HANDLE m_AcceptEvent; + rtl_uString* m_Name; + rtl_String* m_NameA; + struct _oslPipeImpl* m_Next; + oslMutex m_Mutex; + oslThread m_Thread; + oslSemaphore m_Acception; + oslCondition m_ThreadStartUpCond; + struct _oslPipeImpl* m_Acceptions; + oslSemaphore m_Packet; + struct _oslPipePacket* m_Packets; + oslPipeError m_Error; + sal_Bool *m_pbAbortAccept; +} oslPipeImpl; + + +/*****************************************************************************/ +/* __osl_PipeWndProc */ +/*****************************************************************************/ + +LRESULT CALLBACK __osl_PipeWndProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam) +{ + sal_Int32 processMessage(oslPipeImpl *, HWND, COPYDATASTRUCT *); + void __osl_destroyPipeImpl(oslPipeImpl *); + + switch (Msg) + { + case WM_COPYDATA: + { + oslPipeImpl* pPipeImpl; + + if (pPipeImpl = (oslPipeImpl*)GetWindowLong(hWnd, 0)) + return (processMessage(pPipeImpl, (HWND)wParam, (COPYDATASTRUCT *)lParam)); + + break; + } + + case WM_CREATE: + { + LPCREATESTRUCT lpCS = (LPCREATESTRUCT)lParam; + oslPipeImpl* pPipeImpl = (oslPipeImpl*)lpCS->lpCreateParams; + SetWindowLong(hWnd, 0, (LONG)pPipeImpl); + + /* if we are not an accepted pipe, signal creation of window; + for any accepted pipe start a timer for alive checking */ + if (pPipeImpl->m_DstWnd == NULL) + osl_releaseSemaphore(pPipeImpl->m_Acception); + else + SetTimer(hWnd, WND_PIPE_TIMERID, WND_PIPE_INTERVALL, NULL); + + return 0; + } + + case WM_DESTROY: + { + oslPipeImpl* pPipeImpl; + + KillTimer(hWnd, WND_PIPE_TIMERID); + + if (pPipeImpl = (oslPipeImpl*)GetWindowLong(hWnd, 0)) + { + osl_acquireMutex(pPipeImpl->m_Mutex); + + /* release any waiting threads */ + do + { + osl_releaseSemaphore(pPipeImpl->m_Packet); + } + while (! osl_tryToAcquireSemaphore(pPipeImpl->m_Packet)); + + pPipeImpl->m_SrcWnd = NULL; + + osl_releaseMutex(pPipeImpl->m_Mutex); + } + + PostQuitMessage(0); + return 0; + } + + case WM_TIMER: + { + oslPipeImpl* pPipeImpl; + + /* check if we have lost our partner */ + if ((pPipeImpl = (oslPipeImpl*)GetWindowLong(hWnd, 0)) && + (pPipeImpl->m_DstWnd != NULL) && (! IsWindow(pPipeImpl->m_DstWnd))) + { + COPYDATASTRUCT CopyData; + + CopyData.dwData = (DWORD)MSG_FIN; + CopyData.cbData = 0; + CopyData.lpData = NULL; + + SendMessage(hWnd, WM_COPYDATA, + (WPARAM)hWnd, (LPARAM)&CopyData); + + } + break; + } + } + + return DefWindowProc(hWnd, Msg, wParam, lParam); +} + + +/*****************************************************************************/ +/* PipeThreadProc */ +/*****************************************************************************/ + +static void SAL_CALL PipeThreadProc(void *pData) +{ + oslPipeImpl* pPipeImpl = (oslPipeImpl*)pData; + + pPipeImpl->m_SrcWnd = CreateWindow(PIPEWINDOWCLASS, pPipeImpl->m_NameA->buffer, + WS_OVERLAPPEDWINDOW, + 0, 0, 0, 0, + (HWND)NULL, /* no parent */ + (HMENU)NULL, /* use class menu */ + (HANDLE)GetModuleHandle(NULL), + (LPSTR)pData); + + /* if we are an accepted pipe, notify creator of new window handle */ + if ((pPipeImpl->m_DstWnd != NULL) && IsWindow(pPipeImpl->m_DstWnd)) + { + COPYDATASTRUCT CopyData; + + CopyData.dwData = (DWORD)MSG_SYN; + CopyData.cbData = 0; + CopyData.lpData = NULL; + + SendMessage(pPipeImpl->m_DstWnd, WM_COPYDATA, + (WPARAM)pPipeImpl->m_SrcWnd, (LPARAM)&CopyData); + } + + /* notify pipe client that this thread starts up and source window was created */ + osl_setCondition(pPipeImpl->m_ThreadStartUpCond); + + while (osl_scheduleThread(pPipeImpl->m_Thread)) + { + MSG Msg; + + if (IsWindow(pPipeImpl->m_SrcWnd) && GetMessage(&Msg, pPipeImpl->m_SrcWnd, 0, 0)) + { + TranslateMessage(&Msg); + DispatchMessage(&Msg); + } + else + break; + } +} + +/*****************************************************************************/ +/* osl_create/destroy-PipeImpl */ +/*****************************************************************************/ + +static oslInterlockedCount nPipes = 0; + +oslPipeImpl* __osl_createPipeImpl() +{ + oslPipeImpl* pPipeImpl; + + pPipeImpl = (oslPipeImpl*) rtl_allocateZeroMemory(sizeof(oslPipeImpl)); + + pPipeImpl->m_Reference = 0; + pPipeImpl->m_Name = NULL; + pPipeImpl->m_NameA = NULL; + pPipeImpl->m_File = INVALID_HANDLE_VALUE; + pPipeImpl->m_pbAbortAccept = 0; + + if (!IS_NT) + { + if (osl_incrementInterlockedCount(&nPipes) == 1) + { + WNDCLASS Class; + + Class.hCursor = NULL; // this window never shown, so no + Class.hIcon = NULL; // cursor or icon are necessary + Class.lpszMenuName = NULL; + Class.lpszClassName = PIPEWINDOWCLASS; + Class.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1); + Class.hInstance = GetModuleHandle(NULL); + Class.style = 0; + Class.lpfnWndProc = __osl_PipeWndProc; + Class.cbWndExtra = sizeof(void *); + Class.cbClsExtra = 0; + + OSL_VERIFY(RegisterClass(&Class)); + } + } + + pPipeImpl->m_Mutex = osl_createMutex(); + pPipeImpl->m_Acception = osl_createSemaphore(0); + pPipeImpl->m_Packet = osl_createSemaphore(0); + pPipeImpl->m_ThreadStartUpCond = osl_createCondition(); + + pPipeImpl->m_ReadEvent = CreateEvent(NULL, TRUE, FALSE, NULL); + pPipeImpl->m_WriteEvent = CreateEvent(NULL, TRUE, FALSE, NULL); + pPipeImpl->m_AcceptEvent = CreateEvent(NULL, TRUE, FALSE, NULL); + + return (pPipeImpl); +} + +void __osl_destroyPipeImpl(oslPipeImpl *pImpl) +{ + if (pImpl != NULL) + { + osl_destroyMutex(pImpl->m_Mutex); + // terminate the accept + osl_releaseSemaphore(pImpl->m_Acception); + osl_destroySemaphore(pImpl->m_Acception); + osl_destroySemaphore(pImpl->m_Packet); + osl_destroyCondition(pImpl->m_ThreadStartUpCond); + + if (pImpl->m_Security != NULL) + { + rtl_freeMemory(pImpl->m_Security->lpSecurityDescriptor); + rtl_freeMemory(pImpl->m_Security); + } + + if (!IS_NT) + { + CloseHandle(pImpl->m_ReadEvent); + CloseHandle(pImpl->m_WriteEvent); + CloseHandle(pImpl->m_AcceptEvent); + + if (osl_decrementInterlockedCount(&nPipes) == 0) + UnregisterClass(PIPEWINDOWCLASS, GetModuleHandle(NULL)); + } + + if (pImpl->m_Name) + rtl_uString_release(pImpl->m_Name); + if (pImpl->m_NameA) + rtl_string_release(pImpl->m_NameA); + + rtl_freeMemory(pImpl); + } +} + + +/*****************************************************************************/ +/* processMessage */ +/*****************************************************************************/ + +static sal_Int32 processMessage(oslPipeImpl *pPipeImpl, HWND Sender, COPYDATASTRUCT *pData) +{ + sal_Int32 Result = -1; + + osl_acquireMutex(pPipeImpl->m_Mutex); + + switch (pData->dwData) + { + case MSG_SYN: + /* new connection */ + if (pPipeImpl->m_DstWnd == NULL) + { + oslPipeImpl *pAccept; + + pAccept = __osl_createPipeImpl(); + + rtl_string_assign(&( pAccept->m_NameA ) , pPipeImpl->m_NameA ); + pAccept->m_DstWnd = Sender; + + if (pAccept->m_Thread = osl_createSuspendedThread(PipeThreadProc, pAccept)) + osl_resumeThread(pAccept->m_Thread); + + if (pPipeImpl->m_Acceptions == NULL) + pPipeImpl->m_Acceptions = pAccept; + else + { + oslPipeImpl *pInsert = pPipeImpl->m_Acceptions; + while (pInsert->m_Next != NULL) + pInsert = pInsert->m_Next; + + pInsert->m_Next = pAccept; + } + } + else + pPipeImpl->m_DstWnd = Sender; + + Result = 0; + osl_releaseSemaphore(pPipeImpl->m_Acception); + break; + + case MSG_FIN: + DestroyWindow(pPipeImpl->m_SrcWnd); + Result = 0; + break; + + + case MSG_DATA: + if (pData->cbData > 0) + { + oslPipePacket *pPacket = calloc(1, sizeof(oslPipePacket) + pData->cbData); + + if (pPacket) + { + pPacket->m_Bytes = pData->cbData; + rtl_copyMemory(pPacket->m_Data, pData->lpData, pData->cbData); + + if (pPipeImpl->m_Packets == NULL) + pPipeImpl->m_Packets = pPacket; + else + { + oslPipePacket *pInsert = pPipeImpl->m_Packets; + + while (pInsert->m_Next != NULL) + pInsert = pInsert->m_Next; + + pInsert->m_Next = pPacket; + } + + Result = pData->cbData; + + osl_releaseSemaphore(pPipeImpl->m_Packet); + } + else + OSL_TRACE("Failed to allocate pipe data buffer\n"); + } + break; + + default: + OSL_TRACE("Invalid pipe message\n"); + break; + } + + osl_releaseMutex(pPipeImpl->m_Mutex); + + return (Result); +} + +/*****************************************************************************/ +/* 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; + oslPipeImpl* pPipeImpl; + + PSECURITY_ATTRIBUTES pSecAttr = NULL; + + rtl_uString_newFromAscii(&path, PIPESYSTEM); + rtl_uString_newFromAscii(&name, PIPEPREFIX); + + if (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 */ + pPipeImpl= __osl_createPipeImpl(); + osl_incrementInterlockedCount(&(pPipeImpl->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) + { + pPipeImpl->m_Security = pSecAttr; + rtl_uString_assign(&pPipeImpl->m_Name, name); + + if (IS_NT) + { + /* try to open system pipe */ + pPipeImpl->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, + pPipeImpl->m_Security); + + if (pPipeImpl->m_File != INVALID_HANDLE_VALUE) + return pPipeImpl; + } + else + { + rtl_uString2String( + &pPipeImpl->m_NameA, + name->buffer, + name->length, + RTL_TEXTENCODING_UTF8, + OUSTRING_TO_OSTRING_CVTFLAGS); + + /* check if pipe already exists */ + if (FindWindow(PIPEWINDOWCLASS, pPipeImpl->m_NameA->buffer) == NULL) + { + if (pPipeImpl->m_Thread = osl_createSuspendedThread(PipeThreadProc, pPipeImpl)) + { + osl_resumeThread(pPipeImpl->m_Thread); + + /* wait for creation */ + osl_acquireSemaphore(pPipeImpl->m_Acception); + + /* wait for thread start ups */ + osl_waitCondition(pPipeImpl->m_ThreadStartUpCond, NULL); + + return (pPipeImpl); + } + else + OSL_TRACE("osl_createPipe failed to start thread.\n"); + } + } + } + else + { + if (IS_NT) + { + /* first try to open system pipe */ + if ((pPipeImpl->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)) != INVALID_HANDLE_VALUE) + return (pPipeImpl); + } + else + { + rtl_uString2String( + &pPipeImpl->m_NameA, + name->buffer, + name->length, + RTL_TEXTENCODING_UTF8, + OUSTRING_TO_OSTRING_CVTFLAGS); + + /* next try window emulation */ + if ((pPipeImpl->m_DstWnd = FindWindow(PIPEWINDOWCLASS, pPipeImpl->m_NameA->buffer)) != NULL) + { + if (pPipeImpl->m_Thread = osl_createSuspendedThread(PipeThreadProc, pPipeImpl)) + { + osl_resumeThread(pPipeImpl->m_Thread); + + /* wait for creation */ + osl_acquireSemaphore(pPipeImpl->m_Acception); + + return (pPipeImpl); + } + else + OSL_TRACE("osl_createPipe failed to start thread.\n"); + } + } + } + + /* if we reach here something went wrong */ + __osl_destroyPipeImpl(pPipeImpl); + + return NULL; +} + +/*****************************************************************************/ +/* osl_copyPipe */ +/*****************************************************************************/ +oslPipe SAL_CALL osl_copyPipe(oslPipe Pipe) +{ + oslPipeImpl* pPipeImpl; + oslPipeImpl* pParamPipeImpl; + + OSL_ASSERT(Pipe); + + /* alloc memory */ + pPipeImpl= __osl_createPipeImpl(); + + OSL_ASSERT(pPipeImpl); + + if(pPipeImpl==NULL) + return NULL; + + pParamPipeImpl= (oslPipeImpl*)Pipe; + + osl_incrementInterlockedCount(&(pPipeImpl->m_Reference)); + + return (oslPipe)pPipeImpl; +} + + +/*****************************************************************************/ +/* osl_destroyPipe */ +/*****************************************************************************/ +void SAL_CALL osl_destroyPipe(oslPipe Pipe) +{ + oslPipeImpl* pPipeImpl, *pAccept; + oslPipePacket *pData; + + /* socket already invalid */ + if(Pipe==NULL) + return; + + pPipeImpl= (oslPipeImpl*)Pipe; + + if (osl_decrementInterlockedCount(&(pPipeImpl->m_Reference)) == 0) + { + if (IS_NT) + { + /* if we have a system pipe close it */ + if (pPipeImpl->m_File != INVALID_HANDLE_VALUE) + { + /* FlushFileBuffers(pPipeImpl->m_File); */ + DisconnectNamedPipe(pPipeImpl->m_File); + CloseHandle(pPipeImpl->m_File); + } + } + else + { + /* send finito message outher side */ + if( pPipeImpl->m_pbAbortAccept ) + { + *(pPipeImpl->m_pbAbortAccept) = sal_True; + } + + if ((pPipeImpl->m_DstWnd != 0) && IsWindow(pPipeImpl->m_DstWnd)) + { + COPYDATASTRUCT CopyData; + oslPipeImpl* pPipeImpl; + + OSL_ASSERT(Pipe); + + pPipeImpl= (oslPipeImpl*)Pipe; + + CopyData.dwData = (DWORD)MSG_FIN; + CopyData.cbData = 0; + CopyData.lpData = NULL; + + SendMessage(pPipeImpl->m_DstWnd, WM_COPYDATA, + (WPARAM)pPipeImpl->m_SrcWnd, (LPARAM)&CopyData); + } + + /* send finito message himself */ + if ((pPipeImpl->m_SrcWnd!= 0) && IsWindow(pPipeImpl->m_SrcWnd)) + { + COPYDATASTRUCT CopyData; + oslPipeImpl* pPipeImpl; + + OSL_ASSERT(Pipe); + + pPipeImpl= (oslPipeImpl*)Pipe; + + CopyData.dwData = (DWORD)MSG_FIN; + CopyData.cbData = 0; + CopyData.lpData = NULL; + + SendMessage(pPipeImpl->m_SrcWnd, WM_COPYDATA, + (WPARAM)pPipeImpl->m_SrcWnd, (LPARAM)&CopyData); + } + } + + osl_acquireMutex(pPipeImpl->m_Mutex); + + /* delete any outstanding packets */ + while (pData = pPipeImpl->m_Packets) + { + pPipeImpl->m_Packets = pData->m_Next; + rtl_freeMemory(pData); + } + + /* delete any outstanding connections */ + while (pAccept = pPipeImpl->m_Acceptions) + { + pPipeImpl->m_Acceptions = pAccept->m_Next; + osl_destroyPipe(pAccept); + } + + osl_releaseMutex(pPipeImpl->m_Mutex); + + __osl_destroyPipeImpl(pPipeImpl); + } +} + +/*****************************************************************************/ +/* osl_acceptPipe */ +/*****************************************************************************/ +oslPipe SAL_CALL osl_acceptPipe(oslPipe Pipe) +{ + DWORD i; + oslPipeImpl* pPipeImpl = NULL; + oslPipeImpl* pParamPipeImpl; + HANDLE Event; + OVERLAPPED os; + + OSL_ASSERT(Pipe); + + pParamPipeImpl= (oslPipeImpl*)Pipe; + + + if (IS_NT) + { + DWORD nBytesTransfered; + rtl_uString* path = NULL; + rtl_uString* temp = NULL; + + OSL_ASSERT (pParamPipeImpl->m_File != INVALID_HANDLE_VALUE); + + Event = pParamPipeImpl->m_AcceptEvent; + rtl_zeroMemory(&os, sizeof(OVERLAPPED)); + os.hEvent = pParamPipeImpl->m_AcceptEvent; + ResetEvent(pParamPipeImpl->m_AcceptEvent); + + ConnectNamedPipe(pParamPipeImpl->m_File, &os); + + // blocking call to accept + if( ! GetOverlappedResult( + pParamPipeImpl->m_File, + &os, + &nBytesTransfered, + TRUE ) ) + { + // check, if between ConnectNamePipe and GetOverlappedResult + // a successful connect took place + DWORD dw = GetLastError(); + if( ERROR_PIPE_CONNECTED != dw ) + { + // no successful connect (in general, pipe has been destroyed) + return 0; + } + } + + pPipeImpl= __osl_createPipeImpl(); + OSL_ASSERT(pPipeImpl); + + osl_incrementInterlockedCount(&(pPipeImpl->m_Reference)); + rtl_uString_assign(&pPipeImpl->m_Name, pParamPipeImpl->m_Name); + pPipeImpl->m_File = pParamPipeImpl->m_File; + + rtl_uString_newFromAscii(&temp, PIPESYSTEM); + rtl_uString_newConcat(&path, temp, pParamPipeImpl->m_Name); + rtl_uString_release(temp); + + // prepare for next accept + pParamPipeImpl->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, + pPipeImpl->m_Security); + + } + else + { + sal_Bool bAbort = sal_False; + Event = (HANDLE)pParamPipeImpl->m_Acception; + + pParamPipeImpl->m_pbAbortAccept = &bAbort; + while ((i = MsgWaitForMultipleObjects(1, &Event, FALSE, INFINITE, QS_SENDMESSAGE)) + == (WAIT_OBJECT_0 + 1)) + { + MSG msg; + + while (PeekMessage(&msg, NULL, WM_USER - 1, WM_USER - 1, PM_REMOVE)) + { + TranslateMessage(&msg); + DispatchMessage(&msg); + } + } + pParamPipeImpl->m_pbAbortAccept = 0; + + if( bAbort ) + { + return 0; + } + + OSL_ASSERT(pParamPipeImpl->m_DstWnd == 0); + + osl_acquireMutex(pParamPipeImpl->m_Mutex); + + if (pParamPipeImpl->m_Acceptions) + { + pPipeImpl = pParamPipeImpl->m_Acceptions; + pParamPipeImpl->m_Acceptions = pPipeImpl->m_Next; + + /* wait for thread start ups */ + osl_waitCondition(pPipeImpl->m_ThreadStartUpCond, NULL); + } + + osl_releaseMutex(pParamPipeImpl->m_Mutex); + } + + return (oslPipe)pPipeImpl; +} + +/*****************************************************************************/ +/* osl_receivePipe */ +/*****************************************************************************/ +sal_Int32 SAL_CALL osl_receivePipe(oslPipe Pipe, + void* pBuffer, + sal_uInt32 BytesToRead) +{ + sal_Int32 nBytes; + oslPipeImpl* pPipeImpl; + + OSL_ASSERT(Pipe); + + pPipeImpl= (oslPipeImpl*)Pipe; + + /* if we have a system pipe use it */ + if (pPipeImpl->m_File != INVALID_HANDLE_VALUE) + { + OVERLAPPED os; + rtl_zeroMemory(&os,sizeof(OVERLAPPED)); + os.hEvent = pPipeImpl->m_ReadEvent; + + ResetEvent(pPipeImpl->m_ReadEvent); + + if (! ReadFile(pPipeImpl->m_File, pBuffer, BytesToRead, &nBytes, &os) && + ((GetLastError() != ERROR_IO_PENDING) || + ! GetOverlappedResult(pPipeImpl->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 = -1; + + pPipeImpl->m_Error = osl_Pipe_E_ConnectionAbort; + } + } + } + else + { + if (osl_tryToAcquireSemaphore(pPipeImpl->m_Packet) || + (IsWindow(pPipeImpl->m_SrcWnd) && IsWindow(pPipeImpl->m_DstWnd) && + osl_acquireSemaphore(pPipeImpl->m_Packet))) + { + osl_acquireMutex(pPipeImpl->m_Mutex); + + if (pPipeImpl->m_Packets != NULL) + { + oslPipePacket *pData; + + pData = pPipeImpl->m_Packets; + + nBytes = min(BytesToRead, pData->m_Bytes); + + rtl_copyMemory(pBuffer, pData->m_Data, nBytes); + + if (nBytes < (sal_Int32)pData->m_Bytes) + { + rtl_copyMemory(pData->m_Data, &pData->m_Data[nBytes], pData->m_Bytes - nBytes); + pData->m_Bytes -= nBytes; + + osl_releaseSemaphore(pPipeImpl->m_Packet); + } + else + { + pPipeImpl->m_Packets = pData->m_Next; + rtl_freeMemory(pData); + } + } + else + nBytes = 0; + + osl_releaseMutex(pPipeImpl->m_Mutex); + } + else + nBytes = 0; + } + + return (nBytes); +} + +/*****************************************************************************/ +/* osl_sendPipe */ +/*****************************************************************************/ +sal_Int32 SAL_CALL osl_sendPipe(oslPipe Pipe, + const void* pBuffer, + sal_uInt32 BytesToSend) +{ + sal_Int32 nBytes = -1; + oslPipeImpl* pPipeImpl; + + OSL_ASSERT(Pipe); + + pPipeImpl= (oslPipeImpl*)Pipe; + + if (pPipeImpl->m_File != INVALID_HANDLE_VALUE) + { + OVERLAPPED os; + rtl_zeroMemory(&os, sizeof(OVERLAPPED)); + os.hEvent = pPipeImpl->m_WriteEvent; + ResetEvent(pPipeImpl->m_WriteEvent); + + if (! WriteFile(pPipeImpl->m_File, pBuffer, BytesToSend, &nBytes, &os) && + ((GetLastError() != ERROR_IO_PENDING) || + ! GetOverlappedResult(pPipeImpl->m_File, &os, &nBytes, TRUE))) + { + if (GetLastError() == ERROR_PIPE_NOT_CONNECTED) + nBytes = 0; + else + nBytes = -1; + + pPipeImpl->m_Error = osl_Pipe_E_ConnectionAbort; + } + } + else + { + COPYDATASTRUCT CopyData; + + CopyData.dwData = (DWORD)MSG_DATA; + CopyData.cbData = BytesToSend; + CopyData.lpData = (void *)pBuffer; + + if (IsWindow(pPipeImpl->m_DstWnd)) + return (SendMessage(pPipeImpl->m_DstWnd, WM_COPYDATA, + (WPARAM)pPipeImpl->m_SrcWnd, (LPARAM)&CopyData)); + + pPipeImpl->m_Error = osl_Pipe_E_ConnectionAbort; + } + + return (nBytes); +} + + +/*****************************************************************************/ +/* osl_getLastPipeError */ +/*****************************************************************************/ +oslPipeError SAL_CALL osl_getLastPipeError(oslPipe Pipe) +{ + oslPipeError Error; + oslPipeImpl* pPipeImpl; + + pPipeImpl= (oslPipeImpl*)Pipe; + + if (pPipeImpl != NULL) + { + Error = pPipeImpl->m_Error; + pPipeImpl->m_Error = osl_Pipe_E_None; + } + else + Error = osl_Pipe_E_None; + + return (Error); +} + +/************************************************************************* +* +* $Log: not supported by cvs2svn $ +* Revision 1.21 2000/09/18 14:29:02 willem.vandorp +* OpenOffice header added. +* +* Revision 1.20 2000/08/17 16:55:06 jbu +* #77354# WIN98 pipe runs now, NT acceptPipe changed, so that accept retuns a null pipe on closing accepting pipe +* +* Revision 1.19 2000/05/29 16:35:50 hro +* SRC591: Explicite SAL_CALL calling convention +* +* Revision 1.18 2000/05/22 15:29:08 obr +* unicode changes channel/pipe +* +* Revision 1.17 2000/04/07 13:41:04 obr +* Unicode changes +* +* Revision 1.16 1999/10/27 15:13:35 mfe +* Change of Copyright, removed compiler warnings, code clean up, ... +* +* Revision 1.15 1999/04/29 10:09:11 ts +* #65460# osl_acceptPipe() warted auf des anlegen des Windows in der PipeWindowProc +* +* Revision 1.14 1999/04/22 16:25:45 tlx +* #64892# Flush beim destroyPipe rausgenommen wg. Deadlock +* +* Revision 1.13 1999/04/22 13:25:30 rh +* #64126# Implemented TIMER for alice checking, and releasing of receiving threads +* +* Revision 1.12 1999/03/11 14:47:20 ts +* #58701# RefCounting an oslPipeImpl gerichtet, DestroyWindow() im richtigen Thread, nPipes geschuetzt +* +* Revision 1.11 1999/03/04 10:01:23 rh +* #62429 code cleanup +* +* Revision 1.10 1999/03/02 15:21:25 rh +* #62321 use "UNKNOWN" as user name, if it could not be determined +* +* Revision 1.9 1999/02/09 09:34:32 rh +* #61503, #61593 Bugfix: receiving any message on pipe window -> acceptPipe fails +* +* Revision 1.8 1999/01/20 19:09:49 jsc +* #61011# Typumstellung +* +* Revision 1.7 1998/12/08 13:41:05 ts +* #52712# Pipe-Bugs unter NT behoben +* +* Revision 1.6 1998/12/07 17:44:13 ts +* #52712# pipes unter NT +* +* Revision 1.5 1998/12/07 16:04:09 rh +* #53351# added system pipes and emulation for pipes via messages +* +* Revision 1.4 1998/12/07 14:07:01 ts +* #52712# systempipes +* +* Revision 1.3 1998/12/04 15:11:51 ts +* #52712# pipes +* +* Revision 1.2 1998/03/22 13:36:14 rh +* Chnages for Win16 +* +* Revision 1.1 1998/03/13 15:07:44 rh +* Cleanup of enum chaos and implemntation of pipes +* +*************************************************************************/ diff --git a/sal/osl/w32/process.c b/sal/osl/w32/process.c new file mode 100644 index 000000000000..ec806c5c72d5 --- /dev/null +++ b/sal/osl/w32/process.c @@ -0,0 +1,918 @@ +/************************************************************************* + * + * $RCSfile: process.c,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:17:23 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +#include "system.h" +#include +#include + +#include +#include + +#include "procimpl.h" +#include "sockimpl.h" +#include "secimpl.h" +#include "dirW9X.h" + +#define MAX_ARGS 255 +#define PIPENAMEMASK "\\\\.\\PIPE\\OSL_PIPE_%u" +#define SEMNAMEMASK "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 { + HANDLE m_hPipe; +} Pipe; + +typedef struct _oslSocketCallbackArg { + HANDLE m_socket; + Pipe* m_pipe; +} oslSocketCallbackArg; + +LPWSTR *lpArgvW = NULL; +int nArgnW = 0; + +static Pipe* openPipe(DWORD pid) +{ + HANDLE hpipe, hsem; + Pipe* ppipe; + sal_Char pipeName[_MAX_PATH]; + sal_Char semName[_MAX_PATH]; + + sprintf(pipeName, PIPENAMEMASK, pid == 0 ? GetCurrentProcessId() : pid); + sprintf(semName, SEMNAMEMASK, pid == 0 ? GetCurrentProcessId() : pid); + + if (pid == 0) + { + hsem = CreateSemaphore(NULL, 0, 1, semName); + + hpipe = CreateNamedPipe(pipeName, + PIPE_ACCESS_DUPLEX, /* 2 way pipe */ + PIPE_WAIT | /* Wait on messages */ + PIPE_TYPE_MESSAGE, + 1, /* Instance limit */ + sizeof(Message), /* Buffer sizes */ + sizeof(Message), + NMPWAIT_USE_DEFAULT_WAIT, /* Specify time out */ + NULL); /* Security attributes */ + + ReleaseSemaphore(hsem, 1, NULL); + + ConnectNamedPipe(hpipe, NULL); + + CloseHandle(hsem); + + ppipe = malloc(sizeof(Pipe)); + ppipe->m_hPipe = hpipe; + } + else + { + hsem = CreateSemaphore(NULL, 0, 1, semName); + + WaitForSingleObject(hsem, INFINITE); + + CloseHandle(hsem); + + hpipe = CreateFile(pipeName, + GENERIC_WRITE | GENERIC_READ, + FILE_SHARE_READ | FILE_SHARE_WRITE, + NULL, + OPEN_EXISTING, + 0, + NULL); + + + ppipe = malloc(sizeof(Pipe)); + ppipe->m_hPipe = hpipe; + } + + return ppipe; +} + +static void closePipe(Pipe* pipe) +{ + if (pipe->m_hPipe != INVALID_HANDLE_VALUE) + CloseHandle(pipe->m_hPipe); + + free(pipe); +} + +/* Callback is called when the socket is closed by the owner */ +static void* SAL_CALL socketCloseCallback(void* pArg) +{ + if (pArg != NULL) + { + oslSocketCallbackArg* callbackArg = (oslSocketCallbackArg*) pArg; + Message msg; + DWORD nbytes; + + msg.m_Type = MSG_REL; + msg.m_Data = osl_Process_TypeSocket; + msg.m_Flags = 0; + msg.m_Value = callbackArg->m_socket; + WriteFile(callbackArg->m_pipe->m_hPipe, &msg, sizeof(msg), &nbytes, NULL); + + if (ReadFile(callbackArg->m_pipe->m_hPipe, &msg, sizeof(msg), &nbytes, NULL) + && (nbytes == sizeof(msg))) + { + if (msg.m_Type == MSG_END) + closePipe(callbackArg->m_pipe); + } + + free (callbackArg); + } + + return NULL; +} + + +static sal_Bool sendIOResources(Pipe* pipe, oslIOResource ioRes[], HANDLE hChild) +{ + SOCKET socket; + HANDLE handle; + DWORD nbytes; + Message msg; + oslIOResource* pIORes = ioRes; + oslSocketCallbackArg* callbackArg; + + while (pIORes->Type != osl_Process_TypeNone) + { + switch (pIORes->Type) + { + case osl_Process_TypeSocket: + socket = ((oslSocketImpl *)(pIORes->Descriptor.Socket))->m_Socket; + + DuplicateHandle(GetCurrentProcess(), (HANDLE)socket, hChild, &handle, + 0, FALSE, DUPLICATE_SAME_ACCESS); + + if (pIORes->Flags & osl_Process_DFWAIT) + { + callbackArg = malloc(sizeof(oslSocketCallbackArg)); + + callbackArg->m_socket = handle; + callbackArg->m_pipe = pipe; + + ((oslSocketImpl *)(pIORes->Descriptor.Socket))->m_CloseCallback = &socketCloseCallback; + ((oslSocketImpl *)(pIORes->Descriptor.Socket))->m_CallbackArg = callbackArg; + } + + msg.m_Type = MSG_DATA; + msg.m_Data = osl_Process_TypeSocket; + msg.m_Flags = pIORes->Flags; + msg.m_Value = handle; + if (! WriteFile( pipe->m_hPipe, &msg, sizeof(msg), &nbytes, NULL) + || (nbytes != sizeof(msg))) + return sal_False; + break; + + default: + OSL_TRACE("Not implemented"); + OSL_ASSERT(sal_False); + break; + } + + pIORes++; + } + + msg.m_Type = MSG_END; + msg.m_Data = osl_Process_TypeNone; + msg.m_Flags = 0; + msg.m_Value = 0; + + WriteFile(pipe->m_hPipe, &msg, sizeof(msg), &nbytes, NULL); + + if (ReadFile(pipe->m_hPipe, &msg, sizeof(msg), &nbytes, NULL) + && (nbytes == sizeof(msg)) && + ((msg.m_Type == MSG_ACK) || (msg.m_Type == MSG_END))) + { + if (msg.m_Type == MSG_END) + closePipe(pipe); + + return sal_True; + } + else + { + closePipe(pipe); + + return sal_False; + } +} + + +oslProcessError SAL_CALL osl_executeProcess(rtl_uString *strImageName, + rtl_uString *strArguments[], + sal_uInt32 nArguments, + oslProcessOption Options, + oslSecurity Security, + rtl_uString *strWorkDir, + rtl_uString *strEnvironment[], + sal_uInt32 nEnvironmentVars, + oslIOResource* pResources, + oslProcess *pProcess) +{ + sal_uInt32 i, first=0; + sal_Int32 n; + Pipe* pipe; + sal_Unicode* args; + DWORD flags; + BOOL started; + STARTUPINFOW startinfo; + PROCESS_INFORMATION procinfo; + sal_Unicode desktopName[] = L""; + rtl_uString *strPath=NULL; + LPCWSTR pCurrentWorkDir = NULL; + + if ((strImageName == NULL) && nArguments) + strImageName = strArguments[first++]; + + OSL_ASSERT(strImageName != NULL); + + if (!(Options & osl_Process_SEARCHPATH) || + (osl_searchNormalizedPath( strImageName, NULL, &strPath) != osl_Process_E_None)) + { + rtl_uString_newFromString( &strPath, strImageName); + } + + n = rtl_uString_getLength(strPath) + 1; + + /* added space for quoting if not already quoted */ + if (*rtl_uString_getStr(strPath) != L'"') + n += 2; + + for (i = first; i first) + wcscat(args,L" "); + + for (i = first; i < nArguments; i++) + { + sal_Unicode *pSpace = wcschr( rtl_uString_getStr(strArguments[i]), L' ' ); + + if ( pSpace ) + wcscat( args, L"\"" ); + + wcscat(args, rtl_uString_getStr(strArguments[i])); + + if ( pSpace ) + wcscat( args, L"\"" ); + + if ((i + 1 ) < nArguments) + wcscat(args, L" "); + } + + if (strEnvironment) + { + sal_uInt32 nVar; + for (nVar=0; nVar < nEnvironmentVars; nVar++) + _wputenv(rtl_uString_getStr(strEnvironment[nVar])); + } + + flags = NORMAL_PRIORITY_CLASS; + + if (Options & osl_Process_DETACHED) + flags |= DETACHED_PROCESS; + + memset(&startinfo, 0, sizeof(startinfo)); + + startinfo.cb = sizeof(startinfo); + startinfo.dwFlags = STARTF_USESHOWWINDOW; + startinfo.lpDesktop = desktopName; + + switch (Options & (osl_Process_NORMAL | osl_Process_HIDDEN | + osl_Process_MINIMIZED | osl_Process_MAXIMIZED | + osl_Process_FULLSCREEN)) + { + case osl_Process_HIDDEN: + startinfo.wShowWindow = SW_HIDE; + break; + + case osl_Process_MINIMIZED: + startinfo.wShowWindow = SW_MINIMIZE; + break; + + case osl_Process_MAXIMIZED: + case osl_Process_FULLSCREEN: + startinfo.wShowWindow = SW_MAXIMIZE; + break; + + default: + startinfo.wShowWindow = SW_NORMAL; + } + + if ( strWorkDir->length ) + pCurrentWorkDir = rtl_uString_getStr(strWorkDir); + + + if ((Security != NULL) && (((oslSecurityImpl*)Security)->m_hToken != NULL)) + { + started = lpfnCreateProcessAsUser(((oslSecurityImpl*)Security)->m_hToken, + NULL, args, NULL, NULL, + FALSE, flags, NULL, pCurrentWorkDir, + &startinfo, &procinfo); + } + else + { + started = lpfnCreateProcess(NULL, args, NULL, NULL, + FALSE, flags, NULL, pCurrentWorkDir, + &startinfo, &procinfo); + } + + free(args); + + if (started) + { + oslProcessImpl* pProcImpl; + + CloseHandle(procinfo.hThread); + + if (pResources) + { + pipe = openPipe(procinfo.dwProcessId); + + sendIOResources(pipe, pResources, procinfo.hProcess); + } + + pProcImpl = malloc(sizeof(oslProcessImpl)); + pProcImpl->m_hProcess = procinfo.hProcess; + pProcImpl->m_IdProcess = procinfo.dwProcessId; + + *pProcess = (oslProcess)pProcImpl; + + if (Options & osl_Process_WAIT) + WaitForSingleObject(pProcImpl->m_hProcess, INFINITE); + + return osl_Process_E_None; + } + + return osl_Process_E_Unknown; +} + +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) +{ + HANDLE hProcess; + oslProcessImpl* pProcImpl; + + if (hProcess = OpenProcess(STANDARD_RIGHTS_REQUIRED | + PROCESS_QUERY_INFORMATION | SYNCHRONIZE, FALSE, (DWORD)Ident)) + { + pProcImpl = malloc(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); + + free((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) +{ + if (Process == NULL) + return osl_Process_E_Unknown; + + WaitForSingleObject(((oslProcessImpl*)Process)->m_hProcess, INFINITE); + + return osl_Process_E_None; +} + +oslProcessError SAL_CALL osl_getExecutableFile(rtl_uString **strFile) +{ + sal_Unicode buffer[MAX_PATH]; + sal_Int32 nLen; + + nLen=GetModuleFileNameW(NULL, buffer, MAX_PATH); + if (nLen>0) + { + rtl_uString *strTmp = NULL; + rtl_uString_newFromStr_WithLength( &strTmp, buffer, nLen ); + osl_normalizePath(strTmp, strFile); + rtl_uString_release(strTmp); + return osl_Process_E_None; + } + else + { + return osl_Process_E_Unknown; + } +} + +oslProcessError SAL_CALL osl_getEnvironment(rtl_uString *strVar, rtl_uString **strValue) +{ + sal_Unicode buffer[MAX_PATH]; + sal_Int32 nLen; + + nLen=lpfnGetEnvironmentVariable(rtl_uString_getStr(strVar), buffer, MAX_PATH); + if (nLen>0 && nLen<=MAX_PATH) + { + rtl_uString_newFromStr_WithLength( strValue, buffer, nLen ); + return osl_Process_E_None; + } + else + { + return osl_Process_E_Unknown; + } +} + +oslProcessError SAL_CALL osl_getIOResources(oslIOResource Resources[], sal_uInt32 Max) +{ + oslProcessError ret = osl_Process_E_Unknown; + int wait = 0; + int i = 0; + Message msg; + DWORD nbytes; + Pipe* pipe; + + pipe = openPipe(0); + + while ((ReadFile(pipe->m_hPipe, &msg, sizeof(msg), &nbytes, NULL)) + && (nbytes == sizeof(msg)) + && (msg.m_Type != MSG_END)) + { + if (i < (int)Max) + { + switch (msg.m_Type) + { + case MSG_DATA: + switch (msg.m_Data) + { + case osl_Process_TypeSocket: + { + oslSocketImpl *pImpl = __osl_createSocketImpl(0); + + pImpl->m_Socket = (SOCKET)msg.m_Value; + + Resources[i].Type = osl_Process_TypeSocket; + Resources[i].Flags = msg.m_Flags; + Resources[i].Descriptor.Socket = (oslSocket)pImpl; + + if (msg.m_Flags & osl_Process_DFWAIT) + wait++; + + i++; + + break; + } + + default: + OSL_TRACE("Not implemented"); + OSL_ASSERT(sal_False); + break; + } + } + } + } + + Resources[i].Type = osl_Process_TypeNone; + + if (msg.m_Type == MSG_END) + { + if (wait > 0) + { + msg.m_Type = MSG_ACK; + msg.m_Data = osl_Process_TypeNone; + msg.m_Flags = 0; + WriteFile(pipe->m_hPipe, &msg, sizeof(msg), &nbytes, NULL); + + do + { + if ((! ReadFile(pipe->m_hPipe, &msg, sizeof(msg), &nbytes, NULL)) + || (nbytes != sizeof(msg)) + || (msg.m_Type != MSG_REL)) + break; + + switch (msg.m_Data) + { + case osl_Process_TypeSocket: + { + for (i = 0; Resources[i].Type != osl_Process_TypeNone; i++) + { + if (((oslSocketImpl *)Resources[i].Descriptor.Socket)->m_Socket + == (SOCKET)msg.m_Value) + { + OSL_ASSERT(Resources[i].Type == msg.m_Data); + OSL_ASSERT(Resources[i].Flags & osl_Process_DFWAIT); + + Resources[i].Flags &= ~osl_Process_DFWAIT; + + if (--wait > 0) + { + msg.m_Type = MSG_ACK; + msg.m_Data = osl_Process_TypeNone; + msg.m_Flags = 0; + WriteFile(pipe->m_hPipe, &msg, sizeof(msg), &nbytes, NULL); + } + + break; + } + } + break; + } + + default: + OSL_TRACE("Not implemented"); + OSL_ASSERT(sal_False); + break; + } + + } + while (wait > 0); + } + + msg.m_Type = MSG_END; + msg.m_Data = osl_Process_TypeNone; + msg.m_Flags = 0; + WriteFile(pipe->m_hPipe, &msg, sizeof(msg), &nbytes, NULL); + + ret = osl_Process_E_None; + } + + closePipe(pipe); + + return ret; +} + +sal_uInt32 SAL_CALL osl_getCommandArgCount() +{ + if (lpArgvW == NULL) + { + lpArgvW = CommandLineToArgvW( GetCommandLineW(), &nArgnW ); + } + + return nArgnW ? nArgnW - 1 : 0; +} + +oslProcessError SAL_CALL osl_getCommandArg( sal_uInt32 nArg, rtl_uString **strCommandArg) +{ + if (lpArgvW == NULL) + { + lpArgvW = CommandLineToArgvW( GetCommandLineW(), &nArgnW ); + } + + if (++nArg < (sal_uInt32)nArgnW) + { + rtl_uString_newFromStr(strCommandArg, lpArgvW[nArg]); + } + + return osl_Process_E_None; +} + + +/* get environment variable - use same emulation as nspr on MAC OS < X */ +const char * getPREnv(const char * envVar) +{ + return getenv( envVar ); +} + + +sal_Bool SAL_CALL osl_sendResourcePipe(oslPipe Pipe, oslSocket Socket) +{ + /* mfe: for portal not implemented in Windows yet*/ + return sal_False; +} + + +oslSocket SAL_CALL osl_receiveResourcePipe(oslPipe Pipe) +{ + /* mfe: for portal not implemented in Windows yet*/ + return 0; +} + + + +/************************************************************************* +* +* $Log: not supported by cvs2svn $ +* Revision 1.47 2000/09/18 14:29:02 willem.vandorp +* OpenOffice header added. +* +* Revision 1.46 2000/07/31 17:01:58 mfe +* send and receive resource dummy implemented +* +* Revision 1.45 2000/06/19 08:36:44 obr +* getenv implementation for nspr filehandle inheritance. +* +* Revision 1.44 2000/06/08 09:22:15 cd +* change check for arguments +* +* Revision 1.43 2000/05/29 16:35:50 hro +* SRC591: Explicite SAL_CALL calling convention +* +* Revision 1.42 2000/05/23 13:25:34 obr +* don't link against shell32.lib +* +* Revision 1.41 2000/05/22 15:30:35 obr +* moved some unicode wrapper for 9x to kernel9x.lib +* +* Revision 1.40 2000/05/16 16:50:44 hro +* osl_getCommandArg[0] retrieves first argument rather than filename +* +* Revision 1.39 2000/05/16 14:35:37 obr +* Unicode bugfixes +* +* Revision 1.38 2000/04/20 14:50:38 jsc +* bugfix osl_executeProcess +* +* Revision 1.37 2000/04/07 13:41:04 obr +* Unicode changes +* +* Revision 1.36 2000/03/31 16:36:42 rs +* UNICODE-Changes +* +* Revision 1.35 2000/03/08 15:38:24 hro +* #74005# Allocate extra space for quoting of arguments +* +* Revision 1.34 2000/03/03 12:06:11 hro +* #72441# Quote arguments with spaces +* +* Revision 1.33 1999/11/19 15:22:38 ts +* load user profile before executing processes as user +* +* Revision 1.32 1999/11/18 09:51:00 mfe +* removed loadUserprofile completely +* +* Revision 1.31 1999/11/18 09:35:51 mfe +* loadUserprofile moved from process.c to security.c +* +* Revision 1.30 1999/10/27 15:13:35 mfe +* Change of Copyright, removed compiler warnings, code clean up, ... +* +* Revision 1.29 1999/10/21 16:18:35 ts +* #68926# LoadUserProfile() before CreateProcessAsUser() +* +* Revision 1.28 1999/03/04 10:01:23 rh +* #62429 code cleanup +* +* Revision 1.27 1999/01/20 19:09:50 jsc +* #61011# Typumstellung +* +* Revision 1.26 1998/07/16 10:42:02 rh +* Bugfix: getProcessInfo|Exitcode if Process is still active +* +* Revision 1.25 1998/04/22 07:03:07 rh +* #49468, #49660 Bugfixes for NT starting COM-files and spaces in path +* +* Revision 1.24 1998/03/21 12:55:08 rh +* In MSG_REL check if we type of resource match +* +* Revision 1.23 1998/03/13 15:07:44 rh +* Cleanup of enum chaos and implemntation of pipes +* +* Revision 1.22 1998/03/12 14:24:38 jsc +* osl_executeProcess korrigiert, malloc Groesse +* +* Revision 1.21 1998/03/06 15:42:11 rh +* Added signal handling +* +* Revision 1.20 1998/02/16 19:34:59 rh +* Cleanup of ports, integration of Size_t, features for process +* +* Revision 1.19 1997/11/28 15:34:41 ts +* bugfix: bei weitergereichten Sockets wird der kindprozess solange blockiert, bis der vaterprozess diese Sockets closed +* +* Revision 1.18 1997/11/28 10:58:47 sb +* osl_executeProcess calls strlen only for non NULL args +* +* Revision 1.17 1997/10/20 12:09:51 ts +* StartProcessAsUser wieder reingenommen +* +* Revision 1.16 1997/10/17 16:03:10 ts +* bugfix: osl_executeProcess programmname als erstes argument mitubebergeben +* +* Revision 1.15 1997/10/13 12:18:15 fm +* *** empty log message *** +* +* Revision 1.14 1997/09/22 17:36:59 rh +* terminate added +* +* Revision 1.13 1997/09/22 16:36:28 rh +* terminate addedterminate added +* +* Revision 1.12 1997/09/17 21:14:36 rh +* GetArgs +* +* Revision 1.11 1997/09/08 18:55:43 ts +* *** empty log message *** +* +* Revision 1.10 1997/09/07 11:22:45 rh +* *** empty log message *** +* +* Revision 1.9 1997/09/07 08:56:35 rh +* exefile name +* +* Revision 1.8 1997/08/23 20:36:46 rh +* return value for name resolving +* +* Revision 1.7 1997/07/24 16:52:34 rh +* bugfixes +* +* Revision 1.6 1997/07/24 15:19:58 ts +* *** empty log message *** +* +* Revision 1.5 1997/07/24 08:21:10 rh +* *** empty log message *** +* +* Revision 1.4 1997/07/22 16:55:00 rh +* Bugfix +* +* Revision 1.3 1997/07/22 14:29:34 rh +* process added +* +* Revision 1.2 1997/07/21 19:13:15 rh +* getSystemTime added +* +* Revision 1.1 1997/07/15 19:02:04 rh +* system.h inserted +* +*************************************************************************/ + diff --git a/sal/osl/w32/procimpl.h b/sal/osl/w32/procimpl.h new file mode 100644 index 000000000000..cdbd6a10b6a3 --- /dev/null +++ b/sal/osl/w32/procimpl.h @@ -0,0 +1,100 @@ +/************************************************************************* + * + * $RCSfile: procimpl.h,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:17:23 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +#ifndef _OSL_PROCIMPL_H_ +#define _OSL_PROCIMPL_H_ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct _oslProcessImpl { + HANDLE m_hProcess; + DWORD m_IdProcess; +} oslProcessImpl; + +#ifdef __cplusplus +} +#endif + +#endif + +/************************************************************************* +* +* $Log: not supported by cvs2svn $ +* Revision 1.4 2000/09/18 14:29:02 willem.vandorp +* OpenOffice header added. +* +* Revision 1.3 1999/10/27 15:13:36 mfe +* Change of Copyright, removed compiler warnings, code clean up, ... +* +* Revision 1.2 1998/02/16 19:34:59 rh +* Cleanup of ports, integration of Size_t, features for process +* +* Revision 1.1 1997/07/22 14:56:03 rh +* added +* +*************************************************************************/ + + + diff --git a/sal/osl/w32/profile.c b/sal/osl/w32/profile.c new file mode 100644 index 000000000000..4be4b0e292c0 --- /dev/null +++ b/sal/osl/w32/profile.c @@ -0,0 +1,3019 @@ +/************************************************************************* + * + * $RCSfile: profile.c,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:17:23 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + + +#include "system.h" +#include "dirw9x.h" + +#include +#include +#include +#include +#include +#include +#include + +#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; + sal_Bool m_bIsSoffice; +} 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_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_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 bGlobalSofficeFlag=sal_False; + +/*****************************************************************************/ +/* Exported Module Functions */ +/*****************************************************************************/ + +oslProfile SAL_CALL osl_openProfile(rtl_uString *strProfileName, sal_uInt32 Flags) +{ + osl_TFile* pFile; + osl_TProfileImpl* pProfile; + rtl_uString *FileName=NULL; + rtl_uString* ustrSoffice=0; + +#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_getSystemPathFromNormalizedPath(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 + return (NULL); + } + + + pProfile = (osl_TProfileImpl*)calloc(1, sizeof(osl_TProfileImpl)); + + + pProfile->m_bIsSoffice = sal_False; + + rtl_uString_newFromAscii(&ustrSoffice,"soffice.ini"); + + if ( rtl_ustr_indexOfStr( FileName->buffer, ustrSoffice->buffer ) > 0 ) + { + if ( bGlobalSofficeFlag == sal_True ) + { + OSL_ENSURE(0,"Attempt to open soffice.ini more than once\n"); + } + else + { + bGlobalSofficeFlag=sal_True; + } + pProfile->m_bIsSoffice=sal_True; + } + + rtl_uString_release(ustrSoffice); + + + pProfile->m_Flags = Flags & FLG_USER; + osl_getSystemPathFromNormalizedPath(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 + 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->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; +} + +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 ) + { + DWORD nError = GetLastError(); + + 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; + 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 + { + CHAR szFileName[MAX_PATH]; + + WideCharToMultiByte(CP_ACP,0, pProfile->m_strFileName->buffer, -1, szFileName, MAX_PATH, NULL, NULL); + GetPrivateProfileString(pszSection, pszEntry, pszDefault, pszString, MaxLen, szFileName); + } + + 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[1024]; + 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 + { + CHAR szFileName[MAX_PATH]; + + WideCharToMultiByte(CP_ACP,0, pProfile->m_strFileName->buffer, -1, szFileName, MAX_PATH, NULL, NULL); + WritePrivateProfileString(pszSection, pszEntry, pszString, szFileName); + } + + 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 + { + CHAR szFileName[MAX_PATH]; + + WideCharToMultiByte(CP_ACP,0, pProfile->m_strFileName->buffer, -1, szFileName, MAX_PATH, NULL, NULL); + WritePrivateProfileString(pszSection, pszEntry, NULL, szFileName); + } + + 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 + { + CHAR szFileName[MAX_PATH]; + + WideCharToMultiByte(CP_ACP,0, pProfile->m_strFileName->buffer, -1, szFileName, MAX_PATH, NULL, NULL); + n = GetPrivateProfileString(pszSection, NULL, NULL, pszBuffer, MaxLen, szFileName); + } + + 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; + sal_Unicode wcsFile[MAX_PATH]; + sal_Unicode wcsPath[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; + + wcscpy(wcsFile, strName->buffer); + nFileLen = strName->length; + + if (rtl_ustr_indexOfChar( wcsFile, L'.' ) == -1) + { + if (nFileLen + wcslen(STR_INI_EXTENSION) >= MAX_PATH) + return sal_False; + + /* add default extension */ + wcscpy(wcsFile + nFileLen, STR_INI_EXTENSION); + 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) >= MAX_PATH) + return sal_False; + + wcsncpy(wcsFile, pProgName + nOffset, nFileLen); + + if (nFileLen + wcslen(STR_INI_EXTENSION) >= MAX_PATH) + return sal_False; + + /* add default extension */ + wcscpy(wcsFile + nFileLen, STR_INI_EXTENSION); + nFileLen += wcslen(STR_INI_EXTENSION); + + rtl_uString_release( strProgName ); + } + + if (wcsFile[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; + + wcscpy( wcsPath, 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; + + wcscpy(wcsPath + 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; + + wcscpy( wcsPath, 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; + + wcscpy(wcsPath + 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 = lpfnGetWindowsDirectory(wcsPath, 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; + + wcscpy(wcsPath + 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), wcsFile, wcsPath)) + return (sal_False); + + nPathLen = wcslen(wcsPath); + } + + else if(nLen < MAX_PATH) + { + wcscpy(wcsPath, pPath); + nPathLen = wcslen(wcsPath); + } + 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; + + wcscpy(wcsPath, strConfigDir->buffer); + nPathLen = strConfigDir->length; + } + + if (nPathLen && (wcsPath[nPathLen - 1] != L'/') && (wcsPath[nPathLen - 1] != L'\\')) + { + wcsPath[nPathLen++] = L'\\'; + wcsPath[nPathLen] = 0; + } + + if (nPathLen + nFileLen >= MAX_PATH) + return sal_False; + + /* append file name */ + wcscpy(wcsPath + nPathLen, wcsFile); + nPathLen += nFileLen; + + /* copy filename */ + rtl_uString_newFromStr_WithLength(&strTmp, wcsPath, nPathLen); + nError = osl_normalizePath(strTmp, strProfileName); + rtl_uString_release(strTmp); + + return 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 + { + CHAR szFileName[MAX_PATH]; + + WideCharToMultiByte(CP_ACP,0, pProfile->m_strFileName->buffer, -1, szFileName, MAX_PATH, NULL, NULL); + n = GetPrivateProfileSectionNames(pszBuffer, MaxLen, szFileName); + } + + 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 = UnlockFileEx(pFile->m_Handle, 0, 0xFFFFFFFF, 0, &Overlapped); + break; + + case read_lock: + status = LockFileEx(pFile->m_Handle, 0, 0, 0xFFFFFFFF, 0, &Overlapped); + break; + + case write_lock: + status = 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 = 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 = lpfnCreateFile( 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 = lpfnCreateFile( 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) +{ + int Max, 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; + + 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) +{ +#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 ( pProfile->m_bIsSoffice == sal_True ) + { +/* OSL_ENSURE( ( ( pTmpFile->m_nWriteBufLen - pTmpFile->m_nWriteBufFree ) > 5000 ), "Profile to write is less than 5000 bytes\n"); */ +/* OSL_ENSURE( ( pProfile->m_NoSections > 15 ), "Profile to write has less than 15 Sections\n"); */ +/* OSL_ENSURE( ( pProfile->m_NoLines > 170 ), "Profile to write has less than 170 lines\n"); */ +/* OSL_ENSURE( ( i > 170 ), "less than 170 lines to be written in Profile\n"); */ + } + + 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; + } + + + osl_getSystemPathFromNormalizedPath(ustrTmpName, &ustrTmpName); + + 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( rtl_uString_getStr( ustrBakFile ) ); + + /* rename ini bak */ + MoveFileExW( rtl_uString_getStr( ustrIniFile ), rtl_uString_getStr( ustrBakFile ), MOVEFILE_COPY_ALLOWED | MOVEFILE_WRITE_THROUGH ); + + /* rename tmp ini */ + MoveFileExW( rtl_uString_getStr( ustrTmpFile ), 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_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); + } + } + } + } + + 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; + } + } + } + +#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[1024] = ""; + sal_Char Product[132] = ""; + sal_Char szSUPD[20] = ""; + + WCHAR wcsPath[MAX_PATH] = L""; + DWORD dwPathLen = 0; + + if (*strPath == L'"') + { + int i = 0; + + strPath++; + + while ((strPath[i] != L'"') && (strPath[i] != L'\0')) + i++; + + WideCharToMultiByte(CP_ACP,0, 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; + sal_Char Dir[MAX_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))) + { + 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); + 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))) + { + 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); + 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; + wcsncpy(wcsPath, pCommandArg + nStart + 1, dwPathLen ); + wcsPath[dwPathLen] = 0; + + /* build full path */ + if ((wcsPath[dwPathLen - 1] != L'/') && (wcsPath[dwPathLen - 1] != L'\\')) + { + wcscpy(wcsPath + dwPathLen++, L"/"); + } + + if (*strPath) + { + wcscpy(wcsPath + dwPathLen, strPath); + dwPathLen += wcslen(strPath); + } + else + { + CHAR szPath[MAX_PATH]; + int n; + + if ((n = WideCharToMultiByte(CP_ACP,0, wcsPath, -1, szPath, MAX_PATH, NULL, NULL)) > 0) + { + strcpy(szPath + n, SVERSION_USER); + if (access(szPath, 0) >= 0) + { + dwPathLen += MultiByteToWideChar( CP_ACP, 0, SVERSION_USER, -1, wcsPath + dwPathLen, MAX_PATH - 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_getSystemPathFromNormalizedPath(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 + { + wcsncpy(wcsPath, strExecutable->buffer, nPos ); + wcsPath[nPos] = 0; + dwPathLen = nPos; + } + } + else + { + wcsncpy(wcsPath, strExecutable->buffer, nPos ); + dwPathLen = nPos; + wcsPath[dwPathLen] = 0; + } + + /* if we have no product identification use the executable file name */ + if (*Product == 0) + { + WideCharToMultiByte(CP_ACP,0, 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(wcsPath, L'\\'); + + wcscpy(wcsPath + dwPathLen++, L"\\"); + + if (*strPath) + { + wcscpy(wcsPath + dwPathLen, strPath); + dwPathLen += wcslen(strPath); + } + + { + CHAR szPath[MAX_PATH]; + + WideCharToMultiByte(CP_ACP,0, wcsPath, -1, szPath, MAX_PATH, NULL, NULL); + + /* if file not exists, remove any specified subdirectories + like "bin" or "program" */ + + if (((access(szPath, 0) < 0) && (nPos != -1)) || (*strPath == 0)) + { + static sal_Char *SubDirs[] = SVERSION_DIRS; + + int i = 0; + pStr = szPath + 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(szPath, 0) < 0 ) + { + *(pStr+1)='\0'; + } + else + { + dwPathLen = nPos + MultiByteToWideChar( CP_ACP, 0, SVERSION_USER, -1, wcsPath + nPos + 1, MAX_PATH - (nPos + 1) ); + } + } + else + { + wcscpy(wcsPath + nPos + 1, strPath); + dwPathLen = nPos + 1 + wcslen(strPath); + } + + break; + } + } + } + + if ((wcsPath[dwPathLen - 1] != L'/') && (wcsPath[dwPathLen - 1] != L'\\')) + { + wcsPath[dwPathLen++] = L'\\'; + wcsPath[dwPathLen] = 0; + } + + wcscpy(wcsPath + dwPathLen, strFile); + + { + CHAR szPath[MAX_PATH]; + + WideCharToMultiByte(CP_ACP,0, wcsPath, -1, szPath, MAX_PATH, NULL, NULL); + + if ((access(szPath, 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))) + { + pChr = &Product[strlen(Product)]; + + /* append build number */ + strcat(Product, "/"); + _itoa( osl_getSUPD(), szSUPD, 10 ); + strcat(Product, szSUPD); + + 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(strSVFallback, strSVName, &strSVProfile)) && + (hProfile = osl_openProfile(strSVProfile, 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) + { + dwPathLen = MultiByteToWideChar( CP_ACP, 0, Buffer, -1, wcsPath, MAX_PATH ); + dwPathLen -=1; + + /* build full path */ + if ((wcsPath[dwPathLen - 1] != L'/') && (wcsPath[dwPathLen - 1] != L'\\')) + { + wcscpy(wcsPath + dwPathLen++, L"\\"); + } + + if (*strPath) + { + wcscpy(wcsPath + dwPathLen, strPath); + dwPathLen += wcslen(strPath); + } + else + { + CHAR szPath[MAX_PATH]; + int n; + + if ((n = WideCharToMultiByte(CP_ACP,0, wcsPath, -1, szPath, MAX_PATH, NULL, NULL)) > 0) + { + strcpy(szPath + n, SVERSION_USER); + if (access(szPath, 0) >= 0) + { + dwPathLen += MultiByteToWideChar( CP_ACP, 0, SVERSION_USER, -1, wcsPath + dwPathLen, MAX_PATH - dwPathLen ); + } + } + } + } + + rtl_uString_release(strSVProfile); + } + + rtl_uString_release(strSVFallback); + rtl_uString_release(strSVLocation); + rtl_uString_release(strSVName); + } + } + + wcsPath[dwPathLen] = 0; + } + + /* copy filename */ + wcscpy(strProfile, wcsPath); + + return sal_True; +} + + +/************************************************************************* +* +* $Log: not supported by cvs2svn $ +* Revision 1.75 2000/09/18 14:29:02 willem.vandorp +* OpenOffice header added. +* +* Revision 1.74 2000/08/30 12:40:08 hro +* #77887# Include kernel9x.h to access Windows 9x UNICODE wrapper functions +* +* Revision 1.73 2000/08/10 13:57:43 obr +* #77463# +* +* Revision 1.72 2000/07/28 15:39:30 mm +* compareTo +* +* Revision 1.71 2000/07/21 08:41:13 mfe +* disabled soffice.ini asserts +* +* Revision 1.70 2000/07/12 10:41:28 mfe +* #76736# : bug from change to unicode +* +* Revision 1.69 2000/07/03 12:38:34 mfe +* closeProfile didn't wrote Profile +* +* Revision 1.68 2000/06/28 09:13:34 hro +* Close temoprary profile +* +* Revision 1.67 2000/06/28 08:59:39 pl +* tmp file is now closed properly +* +* Revision 1.66 2000/06/23 13:28:56 mfe +* #76396# : open temp file with correct modes in DEFAULT mode +* +* Revision 1.65 2000/06/22 10:04:54 mfe +* checks only for soffice.ini +* +* Revision 1.64 2000/06/22 08:44:18 mfe +* write in temp file and renaming +* +* Revision 1.63 2000/06/20 08:38:21 pl +* count string length correctly +* +* Revision 1.62 2000/06/16 14:34:27 mfe +* assertions for clean profile write +* +* Revision 1.61 2000/06/08 13:57:19 obr +* #76049# osl_openProfile fixed +* +* Revision 1.60 2000/06/08 09:10:31 cd +* changed check for arguments +* +* Revision 1.59 2000/05/25 08:46:49 gh +* UNICODE changes +* +* Revision 1.58 2000/05/17 09:54:07 obr +* Uniode Bugfixes +* +* Revision 1.57 2000/05/16 07:46:05 obr +* Unicode bugfixes +* +* Revision 1.56 2000/05/15 15:14:11 mba +* first UniCode Bugfixes +* +* Revision 1.55 2000/04/07 13:30:44 obr +* Unicode changes +* +* Revision 1.54 2000/04/06 12:50:48 mfe +* #74820# : read_locked files were not closed properly +* +* Revision 1.53 2000/04/05 12:35:32 mfe +* #74578# : ini files creation changed +* +* Revision 1.52 2000/04/05 12:10:08 mfe +* #74578# : ini files creation changed +* +* Revision 1.51 2000/03/23 18:04:30 mfe +* #74442# : false parameter type (i hate c) +* +* Revision 1.50 2000/03/23 16:17:25 mfe +* #74442# : check return of acquireProfile +* +* Revision 1.49 2000/03/22 17:49:39 mfe +* #73273# #72225# : new Option for writing via flush without lock +* +* Revision 1.48 2000/03/22 17:47:02 mfe +* #73273# #72225# : new Option for writing via flush without lock +* +* Revision 1.47 2000/03/16 14:18:24 mm +* #74230# setSUPD +* +* Revision 1.46 2000/03/06 13:41:15 mfe +* #73273# : just one write(2) when storing profile.c +* : clean implementation of osl_flushProfile +* +* Revision 1.45 2000/03/02 10:55:01 mfe +* #73476# : reset memory of Sections and Lines +* +* Revision 1.44 2000/03/01 16:11:48 mfe +* #72373# : buffer init in lookupprofile +* +* Revision 1.43 2000/02/11 14:39:29 as +* #72933# readprofilestring return false for non existing keys +* +* Revision 1.42 2000/01/25 10:25:12 ts +* #71746# reset free array element to 0 +* +* Revision 1.41 2000/01/20 14:11:19 mfe +* #70066# : an invalid Profile handle shall not be closed! +* +* Revision 1.40 2000/01/14 15:37:29 mfe +* #71746# : assert array index IN bounds +* +* Revision 1.39 2000/01/11 16:18:27 mfe +* #71746# : fix of memory leaks +* +* Revision 1.38 1999/12/20 14:28:25 mfe +* #71093# : pass whole array to setEntry either +* +* Revision 1.37 1999/12/09 15:20:52 mfe +* #70294# catch NULL pointer n _closeFile +* +* Revision 1.36 1999/12/01 16:05:31 mfe +* #70340# : pass whole entry array to addEntry +* +* Revision 1.35 1999/11/24 09:50:54 mfe +* empty profile line fix +* +* Revision 1.34 1999/11/16 11:19:13 mfe +* more code clean up and #69879# TAB writing removed +* +* Revision 1.33 1999/11/12 14:03:45 mfe +* putLine didn't return sal_True at the end +* +* Revision 1.32 1999/10/27 15:13:36 mfe +* Change of Copyright, removed compiler warnings, code clean up, ... +* +* Revision 1.31 1999/09/27 17:14:41 mh +* chg: SYNTAXXX +* +* Revision 1.30 1999/09/22 15:32:15 mfe +* #68805# : sofficerc will now be searched in 'user' directory/folder +* +* Revision 1.29 1999/09/16 13:51:51 mfe +* Bounds Checking Error in stripBlanks ... Fixed +* +* Revision 1.28 1999/06/01 10:49:29 ts +* wenn nur noch ein Byte im Buffer frei ist, wurde ein beliebiges Zeichen in das Profile geschrieben +* +* Revision 1.27 1999/05/20 18:44:05 rh +* #65095# Lookup of sversion.ini in ?^and ?$ +* +* Revision 1.26 1999/04/28 14:20:44 dbo +* #65477# 0-Ptr abgefangen; identisch gefixt fuer w32, unx, os2 +* +* Revision 1.25 1999/04/27 15:59:31 rh +* #65039# Check all entries in sversion.ini +* +* Revision 1.24 1999/04/22 13:48:07 rh +* #65201# implement procedure for locating soffice.ini via sversion.ini +* +* Revision 1.23 1999/04/21 11:42:21 tlx +* #65084# Bufferoverwrite in putLine +* +* Revision 1.22 1999/01/28 08:31:11 ts +* #60461# TimeStamp richtig setzen und Abbruchbedingung bei getLine() berichtigt +* +* Revision 1.21 1999/01/20 19:09:50 jsc +* #61011# Typumstellung +* +* Revision 1.20 1998/09/25 07:20:21 rh +* branches: 1.20.2; +* #56015# remove empty lines in profiles, when deleting a section +* +* Revision 1.19 1998/09/19 16:32:30 rh +* #56688# Inidateien suchen +* +* Revision 1.18 1998/09/18 15:33:43 rh +* #56761# neue locations f?r cfg/ini files +* +* Revision 1.17 1998/07/20 17:17:34 rh +* #53072, #53073 Bugfixes for 5.0 +* +* Revision 1.16 1998/05/04 10:44:05 rh +* Added osl_getProfileSections, minor changes on Unix signals, +* starting every process under unix in a separate thread, +* fix unix thread problem, when freeing a handle of a running thread +* +* Revision 1.15 1998/03/13 15:07:44 rh +* Cleanup of enum chaos and implemntation of pipes +* +* Revision 1.14 1998/02/24 18:41:22 rh +* Moved getFullPath to new filesystem interface file.h +* +* Revision 1.13 1998/02/24 17:24:58 rh +* Bugfix : getFullPathName at mountpoints and extensions in getProfileName +* +* Revision 1.12 1998/02/16 19:34:59 rh +* Cleanup of ports, integration of Size_t, features for process +* +* Revision 1.11 1997/12/18 17:56:12 rh +* Little tuning in closeFile +* +* Revision 1.10 1997/12/18 17:45:08 rh +* BugFix in rewindFile +* +* Revision 1.9 1997/12/18 17:37:32 rh +* Bugfix : Dot between extension in getProfileName +* +* Revision 1.8 1997/12/17 19:58:11 rh +* Changed locking and minor bugfixes in buffering +* +* Revision 1.7 1997/12/16 14:16:59 rh +* Added locking and CR/LF conversion +* +* Revision 1.6 1997/12/16 10:55:58 rh +* Added locking and CR/LF conversion +* +* Revision 1.5 1997/09/18 13:20:50 ts +* bugfix : osl_getProfileName +* +* Revision 1.4 1997/09/18 10:57:54 rh +* getProfileName added +* +* Revision 1.3 1997/08/23 20:36:47 rh +* return value for name resolving +* +* Revision 1.2 1997/07/29 08:40:26 rh +* Bugfixes +* +* Revision 1.1 1997/07/17 11:02:31 rh +* Header adapted and profile added +* +* Revision 1.20.2.1 1999/01/28 08:14:49 ts +* #60461# FileStamp richtig setzen und Abbruchbedingung bei getLine() korrigiert +* +*************************************************************************/ diff --git a/sal/osl/w32/secimpl.h b/sal/osl/w32/secimpl.h new file mode 100644 index 000000000000..476e894b0c2a --- /dev/null +++ b/sal/osl/w32/secimpl.h @@ -0,0 +1,116 @@ +/************************************************************************* + * + * $RCSfile: secimpl.h,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:17:23 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +#ifndef _OSL_SECURITYIMPL_H_ +#define _OSL_SECURITYIMPL_H_ + +#include + +#include + +#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 + +/************************************************************************* +* +* $Log: not supported by cvs2svn $ +* Revision 1.8 2000/09/18 14:29:02 willem.vandorp +* OpenOffice header added. +* +* Revision 1.7 2000/03/31 16:29:19 rs +* UNICODE-Changes +* +* Revision 1.6 1999/11/18 09:35:51 mfe +* loadUserprofile moved from process.c to security.c +* +* Revision 1.5 1999/10/27 15:13:36 mfe +* Change of Copyright, removed compiler warnings, code clean up, ... +* +* Revision 1.4 1999/01/20 19:09:50 jsc +* #61011# Typumstellung +* +* Revision 1.3 1998/02/16 19:34:59 rh +* Cleanup of ports, integration of Size_t, features for process +* +* Revision 1.2 1997/10/17 16:01:36 ts +* osl_logonUserOnFileServer hinzugefuegt +* +* Revision 1.1 1997/07/22 14:56:04 rh +* added +* +*************************************************************************/ diff --git a/sal/osl/w32/security.c b/sal/osl/w32/security.c new file mode 100644 index 000000000000..b7d9e60412a2 --- /dev/null +++ b/sal/osl/w32/security.c @@ -0,0 +1,1155 @@ +/************************************************************************* + * + * $RCSfile: security.c,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:17:23 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + + +#include "system.h" + +#include +#include +#include +#include "dirW9X.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 +); + + +/*****************************************************************************/ +/* Static Module Function Declarations */ +/*****************************************************************************/ + +static sal_Bool isWNT(); +static sal_Bool GetSpecialFolder(rtl_uString **strPath,int nFolder); +static BOOL ObtainProfilePath(LPTSTR pszSid, LPTSTR pszProfilePath, DWORD dwPathSize); +static BOOL Privilege(LPTSTR pszPrivilege, BOOL bEnable); +static BOOL CheckHive(LPTSTR pszSid); +static BOOL Hive(LPTSTR pszSid, LPTSTR pszProfilePath, BOOL bLoad); +static sal_Bool SAL_CALL getUserNameImpl(oslSecurity Security, rtl_uString **strName, sal_Bool bIncludeDomain); + +/*****************************************************************************/ +/* Exported Module Functions */ +/*****************************************************************************/ + +oslSecurity SAL_CALL osl_getCurrentSecurity() +{ + 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; + LUID luid; + + if (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; +} + +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 hAccessToken = ((oslSecurityImpl*)Security)->m_hToken; + UCHAR InfoBuffer[1024]; + PTOKEN_GROUPS ptgGroups = (PTOKEN_GROUPS)InfoBuffer; + DWORD dwInfoBufferSize; + PSID psidAdministrators; + SID_IDENTIFIER_AUTHORITY siaNtAuthority = SECURITY_NT_AUTHORITY; + UINT x; + sal_Bool bSuccess = sal_False; + + + if (hAccessToken == NULL) + OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, &hAccessToken); + + if (GetTokenInformation(hAccessToken, TokenGroups, + InfoBuffer, 1024, + &dwInfoBufferSize)) + { + if (AllocateAndInitializeSid(&siaNtAuthority, + 2, + SECURITY_BUILTIN_DOMAIN_RID, + DOMAIN_ALIAS_RID_ADMINS, + 0, 0, 0, 0, 0, 0, + &psidAdministrators)) + { + for (x = 0; (!bSuccess) && (x < ptgGroups->GroupCount); x++) + { + if (EqualSid(psidAdministrators, ptgGroups->Groups[x].Sid)) + bSuccess = sal_True; + } + + FreeSid(psidAdministrators); + } + } + + if (((oslSecurityImpl*)Security)->m_hToken == NULL) + CloseHandle(hAccessToken); + + return (bSuccess); + } + } + else + return (sal_False); +} + + +void SAL_CALL osl_freeSecurityHandle(oslSecurity Security) +{ + if (Security) + { + oslSecurityImpl *pSecImpl = (oslSecurityImpl*)Security; + + if (pSecImpl->m_pNetResource != NULL) + { + DWORD ret = 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_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 (lpfnWNetGetUser(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 **strDirectory) +{ + if (Security != NULL) + { + oslSecurityImpl *pSecImpl = (oslSecurityImpl*)Security; + + if (pSecImpl->m_pNetResource != NULL) + { + rtl_uString_newFromStr( strDirectory, pSecImpl->m_pNetResource->lpRemoteName); + + return (sal_True); + } + 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 + return (GetSpecialFolder(strDirectory, CSIDL_PERSONAL)); + } + } + + return sal_False; +} + +sal_Bool SAL_CALL osl_getConfigDir(oslSecurity Security, rtl_uString **strDirectory) +{ + if (Security != NULL) + { + oslSecurityImpl *pSecImpl = (oslSecurityImpl*)Security; + + if (pSecImpl->m_pNetResource != NULL) + { + rtl_uString_newFromStr( strDirectory, pSecImpl->m_pNetResource->lpRemoteName); + + return (sal_True); + } + else + { + if (pSecImpl->m_hToken) + { + /* not implemented */ + OSL_ASSERT(sal_False); + } + else + { + rtl_uString *file=0; + sal_Unicode sFile[_MAX_PATH]; + + if (! GetSpecialFolder(&file, CSIDL_APPDATA)) + { + OSL_VERIFY(lpfnGetWindowsDirectory(sFile, _MAX_DIR) > 0); + + rtl_uString_newFromStr( &file, sFile); + } + + rtl_uString_newFromString( strDirectory, file); + rtl_uString_release(file); + + return (sal_True); + } + } + } + + return sal_False; +} + + +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; + + LONG myError = 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 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); + + if (pSHGetSpecialFolderPathA = (BOOL (WINAPI *)(HWND, LPSTR, int, BOOL))GetProcAddress(hLibrary, "SHGetSpecialFolderPathA")) + { + if (pSHGetSpecialFolderPathA(GetActiveWindow(), PathA, nFolder, TRUE)) + { + rtl_string2UString( strPath, PathA, strlen(PathA), osl_getThreadTextEncoding(), OUSTRING_TO_OSTRING_CVTFLAGS); + bRet = sal_True; + } + } + else if (pSHGetSpecialFolderPathW = (BOOL (WINAPI *)(HWND, LPWSTR, int, BOOL))GetProcAddress(hLibrary, "SHGetSpecialFolderPathW")) + { + 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, lSize = sizeof(PathW); + DWORD Type; + + switch (nFolder) + { + case CSIDL_APPDATA: + lRet = RegQueryValueEx(hRegKey, "AppData", NULL, &Type, PathA, &lSize); + break; + + case CSIDL_PERSONAL: + lRet = RegQueryValueEx(hRegKey, "Personal", NULL, &Type, 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) + lpfnCreateDirectory(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); + bRet = sal_True; + } + } + + if (SUCCEEDED(pSHGetMalloc(&pMalloc))) + { + pMalloc->lpVtbl->Free(pMalloc, pidl); + pMalloc->lpVtbl->Release(pMalloc); + } + } + } + } + + FreeLibrary(hLibrary); + + return (bRet); +} + + +static sal_Bool isWNT() +{ + 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 ObtainProfilePath(LPTSTR strSid, LPTSTR strProfilePath, DWORD dwPathSize) +{ + TCHAR szRegKey[1024] = TEXT("SOFTWARE\\Microsoft\\"); + TCHAR szTemp[256] = TEXT(""); + DWORD dwSizeProfilePath = dwPathSize; + DWORD dwType; + HKEY hKey; + LONG lErrorCode; + + /* + concat sid + */ + strcat(szRegKey, TEXT("Windows NT\\CurrentVersion\\ProfileList\\")); + strcat(szRegKey, strSid); + + /* + find the hive in the registry + */ + lErrorCode = RegOpenKeyEx(HKEY_LOCAL_MACHINE, szRegKey, 0, KEY_READ, &hKey); + if (lErrorCode != ERROR_SUCCESS) + return FALSE; + + /* + query the value + */ + lErrorCode = RegQueryValueEx(hKey, TEXT("ProfileImagePath"), NULL, &dwType, (LPBYTE)strProfilePath, &dwSizeProfilePath); + if (lErrorCode != ERROR_SUCCESS) + return FALSE; + + /* + fix profile path by replacing "%SystemRoot%" with the actual path + */ + strcpy(szTemp, strProfilePath); + ZeroMemory(strProfilePath, dwPathSize); + if (!ExpandEnvironmentStrings(szTemp, strProfilePath,dwPathSize)) + return FALSE; + + /* + determine if it is a file or directory, WinNT 4.0 it is a + directory + WinNT 3.51 it is a file + */ + if ((GetFileAttributes(strProfilePath) & FILE_ATTRIBUTE_DIRECTORY) == FILE_ATTRIBUTE_DIRECTORY) + strcat(strProfilePath, TEXT("\\ntuser.dat")); + + /* + close the key + */ + lErrorCode = RegCloseKey(hKey); + if (lErrorCode != ERROR_SUCCESS) + return FALSE; + + return TRUE; +} + +static BOOL Privilege(LPTSTR strPrivilege, BOOL bEnable) +{ + HANDLE hToken; + TOKEN_PRIVILEGES tp; + + /* + obtain the processes token + */ + if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_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 BOOL Hive(LPTSTR strSid, LPTSTR strProfilePath, BOOL bLoad) +{ + LONG lErrorCode; + + if (bLoad) + { + lErrorCode = RegLoadKey(HKEY_USERS, strSid, strProfilePath); + if (lErrorCode != ERROR_SUCCESS) + return FALSE; + } + else + { + lErrorCode = RegUnLoadKey(HKEY_USERS, strSid); + if (lErrorCode != ERROR_SUCCESS) + return FALSE; + } + return TRUE; +} + +static BOOL CheckHive(LPTSTR strSid) +{ + LONG lErrorCode; + HKEY hKey = NULL; + + lErrorCode = RegOpenKey(HKEY_USERS, strSid, &hKey); + + if (lErrorCode == ERROR_SUCCESS) + { + lErrorCode = RegCloseKey(hKey); + return TRUE; + } + return FALSE; +} + +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_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; + + lpfnWNetGetUser(NULL, NULL, &needed); + pNameW = malloc (needed*sizeof(sal_Unicode)); + + if (lpfnWNetGetUser(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; +} + +/************************************************************************* +* +* $Log: not supported by cvs2svn $ +* Revision 1.30 2000/09/18 14:29:02 willem.vandorp +* OpenOffice header added. +* +* Revision 1.29 2000/08/28 14:04:03 cd +* #78211# use correct malloc size for WNetGetUser call +* +* Revision 1.28 2000/06/08 10:07:55 cd +* change LogonUserW call +* +* Revision 1.27 2000/06/08 09:16:36 cd +* initialize string pointer with zero +* +* Revision 1.26 2000/05/30 11:29:42 obr +* lstrcpyW, ... not functional in Win95 +* +* Revision 1.25 2000/05/22 15:30:35 obr +* moved some unicode wrapper for 9x to kernel9x.lib +* +* Revision 1.24 2000/05/16 07:46:05 obr +* Unicode bugfixes +* +* Revision 1.23 2000/05/15 15:14:11 mba +* first UniCode Bugfixes +* +* Revision 1.22 2000/03/31 16:28:09 rs +* UNICODE-Changes +* +* Revision 1.21 1999/12/09 14:21:01 ts +* #70662# m_hProfile not initialized +* +* Revision 1.20 1999/11/19 15:22:38 ts +* load user profile before executing processes as user +* +* Revision 1.19 1999/11/18 09:35:51 mfe +* loadUserprofile moved from process.c to security.c +* +* Revision 1.18 1999/10/27 15:13:36 mfe +* Change of Copyright, removed compiler warnings, code clean up, ... +* +* Revision 1.17 1999/04/26 12:01:41 jsc +* #65104# GetSpecialFolder angepasst +* +* Revision 1.16 1999/03/19 10:32:24 ts +* #63572# Win95: logon user geht jetz immer, sdaemon hidden starten +* +* Revision 1.15 1999/03/04 10:01:23 rh +* #62429 code cleanup +* +* Revision 1.14 1999/02/15 13:32:32 ts +* #61287# unter W95 gilt jeder Benutzer als Administrator +* +* Revision 1.13 1999/02/15 13:26:10 ts +* #61287# unter W95 gilt jeder Benutzer als Administrator +* +* Revision 1.12 1999/02/11 16:16:40 rh +* #61556 Bugfix getUserIdent - convert SID to text string +* +* Revision 1.11 1999/01/20 19:09:50 jsc +* #61011# Typumstellung +* +* Revision 1.10 1998/12/08 13:41:05 ts +* #52712# Pipe-Bugs unter NT behoben +* +* Revision 1.9 1998/09/21 09:28:47 rh +* #56688# Create special folder if not exists +* +* Revision 1.8 1998/09/19 16:32:30 rh +* #56688# Inidateien suchen +* +* Revision 1.7 1998/09/18 15:33:44 rh +* #56761# neue locations f?r cfg/ini files +* +* Revision 1.6 1998/03/13 15:07:45 rh +* Cleanup of enum chaos and implemntation of pipes +* +* Revision 1.5 1998/02/16 19:34:59 rh +* Cleanup of ports, integration of Size_t, features for process +* +* Revision 1.4 1997/10/21 14:23:09 ts +* Abfrage, ob ein Benutzer Adminstratorrechte hat eingebaut +* +* Revision 1.3 1997/10/17 16:01:37 ts +* osl_logonUserOnFileServer hinzugefuegt +* +* Revision 1.2 1997/07/24 15:19:59 ts +* *** empty log message *** +* +* Revision 1.1 1997/07/23 12:00:13 rh +* added +* +*************************************************************************/ + + diff --git a/sal/osl/w32/semaphor.c b/sal/osl/w32/semaphor.c new file mode 100644 index 000000000000..4b5ddafd6266 --- /dev/null +++ b/sal/osl/w32/semaphor.c @@ -0,0 +1,196 @@ +/************************************************************************* + * + * $RCSfile: semaphor.c,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:17:23 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +#include "system.h" + +#include +#include + +/* + 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); + + while(1) + { + switch (MsgWaitForMultipleObjects(1, &((HANDLE)Semaphore), + FALSE, INFINITE, QS_SENDMESSAGE)) + { + case WAIT_OBJECT_0: + return sal_True; + + case WAIT_OBJECT_0 + 1: + { + MSG msg; + + while (PeekMessage(&msg, NULL, WM_USER - 1, WM_USER - 1, PM_REMOVE)) + { + TranslateMessage(&msg); + DispatchMessage(&msg); + } + break; + } + + default: + return (sal_False); + } + } +} + +/*****************************************************************************/ +/* osl_tryToAcquireSemaphore */ +/*****************************************************************************/ +sal_Bool SAL_CALL osl_tryToAcquireSemaphore(oslSemaphore Semaphore) +{ + OSL_ASSERT(Semaphore != 0); + return (WaitForSingleObject((HANDLE)Semaphore, 0) == WAIT_OBJECT_0); +} + + +/*****************************************************************************/ +/* osl_releaseSemaphore */ +/*****************************************************************************/ +sal_Bool SAL_CALL osl_releaseSemaphore(oslSemaphore Semaphore) +{ + OSL_ASSERT(Semaphore != 0); + + return (ReleaseSemaphore((HANDLE)Semaphore, + 1, /* increase count by one */ + NULL)); /* not interested in previous count */ +} + + + +/************************************************************************* +* +* $Log: not supported by cvs2svn $ +* Revision 1.10 2000/09/18 14:29:02 willem.vandorp +* OpenOffice header added. +* +* Revision 1.9 1999/10/27 15:13:36 mfe +* Change of Copyright, removed compiler warnings, code clean up, ... +* +* Revision 1.8 1999/10/13 10:42:54 rt +* undo last changes +* +* Revision 1.7 1999/10/11 12:47:09 rt +* gcc for windows: syntax change +* +* Revision 1.6 1999/01/20 19:09:50 jsc +* #61011# Typumstellung +* +* Revision 1.5 1998/07/16 10:41:02 rh +* Beautify the source +* +* Revision 1.4 1998/07/16 10:25:15 rh +* Change WaitForObject to MsgWaitForObject to process Messages while waiting +* +* Revision 1.3 1997/07/15 19:02:04 rh +* system.h inserted +* +* Revision 1.2 1997/07/02 10:54:01 rh +* Anpassung fuer Diagnose Macros +* +* Revision 1.1 1997/06/19 13:10:43 bho +* first version of OSL. +* +*************************************************************************/ diff --git a/sal/osl/w32/signal.c b/sal/osl/w32/signal.c new file mode 100644 index 000000000000..eb15feaf00c0 --- /dev/null +++ b/sal/osl/w32/signal.c @@ -0,0 +1,323 @@ +/************************************************************************* + * + * $RCSfile: signal.c,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:17:23 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + + +/* system headers */ +#include "system.h" + +#include +#include +#include + +typedef struct _oslSignalHandlerImpl +{ + oslSignalHandlerFunction Handler; + void* pData; + struct _oslSignalHandlerImpl* pNext; +} oslSignalHandlerImpl; + +static sal_Bool bInitSignal = sal_False; +static oslMutex SignalListMutex; +static oslSignalHandlerImpl* SignalList; + +long WINAPI SignalHandlerFunction(LPEXCEPTION_POINTERS lpEP); + +static sal_Bool InitSignal() +{ + SignalListMutex = osl_createMutex(); + + SetUnhandledExceptionFilter(SignalHandlerFunction); + + return sal_True; +} + +static sal_Bool DeInitSignal() +{ + 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 */ +/*****************************************************************************/ + +static BOOL WINAPI IsWin95A() +{ + 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; +} + +static long WINAPI SignalHandlerFunction(LPEXCEPTION_POINTERS lpEP) +{ + oslSignalInfo Info; + oslSignalAction Action; + + Info.UserSignal = lpEP->ExceptionRecord->ExceptionCode; + Info.UserData = NULL; + + switch (lpEP->ExceptionRecord->ExceptionCode) + { + case EXCEPTION_ACCESS_VIOLATION: + Info.Signal = osl_Signal_AccessViolation; + break; + + case EXCEPTION_INT_DIVIDE_BY_ZERO: + Info.Signal = osl_Signal_IntegerDivideByZero; + break; + + case EXCEPTION_FLT_DIVIDE_BY_ZERO: + Info.Signal = osl_Signal_FloatDivideByZero; + break; + + case EXCEPTION_BREAKPOINT: + Info.Signal = osl_Signal_DebugBreak; + break; + + default: + Info.Signal = osl_Signal_System; + break; + } + + Action = CallSignalHandler(&Info); + + if ( IsWin95A() ) + 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; + } + + 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 = 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); +} + +/************************************************************************* +* +* $Log: not supported by cvs2svn $ +* Revision 1.10 2000/09/18 14:29:02 willem.vandorp +* OpenOffice header added. +* +* Revision 1.9 2000/04/18 09:49:32 hro +* #72428# Fixed wrong compare of osPlatformID +* +* Revision 1.8 2000/04/06 10:24:28 hro +* #72428# On Win95A Build 4.00.950 abort before returning from sinal handler +* +* Revision 1.6 1999/10/27 15:13:36 mfe +* Change of Copyright, removed compiler warnings, code clean up, ... +* +* Revision 1.5 1999/04/22 07:52:49 rh +* #63033# Deliver breakpoints via signal TSignal_DebugBreak +* +* Revision 1.4 1999/01/20 19:09:50 jsc +* #61011# Typumstellung +* +* Revision 1.3 1998/03/13 15:07:45 rh +* Cleanup of enum chaos and implemntation of pipes +* +* Revision 1.2 1998/03/06 16:36:27 rh +* Added signal.c for W16 and deinit-routines +* +* Revision 1.1 1998/03/06 15:42:11 rh +* Added signal handling +* +*************************************************************************/ diff --git a/sal/osl/w32/sockimpl.h b/sal/osl/w32/sockimpl.h new file mode 100644 index 000000000000..463229bb30b3 --- /dev/null +++ b/sal/osl/w32/sockimpl.h @@ -0,0 +1,168 @@ +/************************************************************************* + * + * $RCSfile: sockimpl.h,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:17:23 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +#ifndef _OSL_SOCKETIMPL_H_ +#define _OSL_SOCKETIMPL_H_ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/*****************************************************************************/ +/* oslSocketImpl */ +/*****************************************************************************/ +#define OSL_SOCKET_FLAGS_NONBLOCKING 0x0001 + +typedef void* (SAL_CALL * oslCloseCallback) (void*); + +typedef struct _oslSocketImpl { + SOCKET m_Socket; + int m_Flags; + oslCloseCallback m_CloseCallback; + void* m_CallbackArg; +} oslSocketImpl; + +oslSocketImpl* __osl_createSocketImpl(SOCKET Socket); +void __osl_destroySocketImpl(oslSocketImpl *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 + + +/************************************************************************* +* +* $Log: not supported by cvs2svn $ +* Revision 1.10 2000/09/18 14:29:02 willem.vandorp +* OpenOffice header added. +* +* Revision 1.9 2000/05/29 16:34:15 hro +* SRC591: Explicite SAL_CALL calling convention +* +* Revision 1.8 1999/10/27 15:13:37 mfe +* Change of Copyright, removed compiler warnings, code clean up, ... +* +* Revision 1.7 1999/02/16 20:09:23 mhu +* Fixed WININET calling convention (WINAPI instead of __cdecl) (#49995#). +* +* Revision 1.6 1999/02/13 18:18:17 mhu +* Added support for modem dialup handling (oslSocketDialupImpl) (#49995#). +* +* Revision 1.5 1998/03/06 15:42:12 rh +* Added signal handling +* +* Revision 1.4 1997/11/28 15:34:42 ts +* bugfix: bei weitergereichten Sockets wird der kindprozess solange blockiert, bis der vaterprozess diese Sockets closed +* +* Revision 1.3 1997/09/04 09:51:47 rh +* Blockmode +* +* Revision 1.2 1997/07/15 19:34:39 rh +* inserted #ifdefs +* +* Revision 1.1 1997/07/15 19:24:13 rh +* *** empty log message *** +* +*************************************************************************/ diff --git a/sal/osl/w32/system.h b/sal/osl/w32/system.h new file mode 100644 index 000000000000..6be81bf18f60 --- /dev/null +++ b/sal/osl/w32/system.h @@ -0,0 +1,159 @@ +/************************************************************************* + * + * $RCSfile: system.h,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:17:23 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +#ifdef NDEBUG +# define NO_DEBUG_CRT +#endif + +#ifndef _WIN32_WINNT +# define _WIN32_WINNT 0x0400 +# define _CTYPE_DISABLE_MACROS /* wg. dynamischer C-Runtime MH */ +#endif + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#ifdef GCC +# include +#else +# include +# include +#endif + +#include +#include + +#ifndef NO_DEBUG_CRT +# include +#endif + +#define _MAX_CMD 4096 /* maximum length of commandline */ +#define _MAX_ENV 4096 /* maximum length of environment var */ + +#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 _DLL_ +extern DWORD g_dwPlatformId; +#define IS_NT (g_dwPlatformId == VER_PLATFORM_WIN32_NT) +#else +extern DWORD GetPlatformId(); +#define IS_NT (GetPlatformId() == VER_PLATFORM_WIN32_NT) +#endif + + +/************************************************************************* +* +* $Log: not supported by cvs2svn $ +* Revision 1.9 2000/09/18 14:29:02 willem.vandorp +* OpenOffice header added. +* +* Revision 1.8 2000/05/22 15:29:08 obr +* unicode changes channel/pipe +* +* Revision 1.7 1999/10/27 15:13:37 mfe +* Change of Copyright, removed compiler warnings, code clean up, ... +* +* Revision 1.6 1999/10/11 12:57:57 rt +* gcc for windows: includes and defines +* +* Revision 1.5 1998/09/18 15:33:44 rh +* #56761# neue locations f?r cfg/ini files +* +* Revision 1.4 1998/07/21 07:36:21 mh +* dynamische C-Runtime +* +* Revision 1.3 1998/02/16 19:35:00 rh +* Cleanup of ports, integration of Size_t, features for process +* +* Revision 1.2 1997/12/16 14:16:59 rh +* Added locking and CR/LF conversion +* +* Revision 1.1 1997/07/15 19:02:06 rh +* system.h inserted +* +*************************************************************************/ diff --git a/sal/osl/w32/thread.c b/sal/osl/w32/thread.c new file mode 100644 index 000000000000..f6013310caf1 --- /dev/null +++ b/sal/osl/w32/thread.c @@ -0,0 +1,820 @@ +/************************************************************************* + * + * $RCSfile: thread.c,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:17:23 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +#include "system.h" + +#include +#include + +/* + Thread-data structure hidden behind oslThread: +*/ +typedef struct _osl_TThreadImpl +{ + HANDLE m_hThread; /* OS-handle used for all thread-functions */ + sal_uInt32 m_ThreadId; /* identifier for this thread */ + sal_uInt32 m_Flags; + HANDLE m_hEvent; + DWORD m_Timeout; + CRITICAL_SECTION m_Mutex; + oslWorkerFunction m_WorkerFunction; + void* m_pData; + +} osl_TThreadImpl; + +#define THREADIMPL_FLAGS_TERMINATE 0x0001 +#define THREADIMPL_FLAGS_SLEEP 0x0002 + +static sal_uInt32 __stdcall oslWorkerWrapperFunction(void* pData); +static oslThread oslCreateThread(oslWorkerFunction pWorker, void* pThreadData, sal_uInt32 nFlags); +static HRESULT WINAPI osl_CoInitializeEx(LPVOID pvReserved, DWORD dwCoInit); + +typedef HRESULT (WINAPI *CoInitializeEx_PROC)(LPVOID pvReserved, DWORD dwCoInit); + +CoInitializeEx_PROC _CoInitializeEx = osl_CoInitializeEx; + +/*****************************************************************************/ +/* oslWorkerWrapperFunction */ +/*****************************************************************************/ +static sal_uInt32 __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_Flags = 0; + pThreadImpl->m_hEvent = 0; + pThreadImpl->m_Timeout = 0; + + InitializeCriticalSection(&pThreadImpl->m_Mutex); + + 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 */ + if (pThreadImpl->m_hEvent != 0) + CloseHandle(pThreadImpl->m_hEvent); + + DeleteCriticalSection(&pThreadImpl->m_Mutex); + + free(pThreadImpl); + return 0; + } + + return (oslThread)pThreadImpl; +} + +/*****************************************************************************/ +/* osl_ CoInitializeEx */ +/*****************************************************************************/ + +static HRESULT WINAPI osl_CoInitializeEx(LPVOID pvReserved, DWORD dwCoInit) +{ +#ifdef _WIN32_DCOM // DCOM + return CoInitializeEx( pvReserved, dwCoInit ); +#else + return CoInitialize( pvReserved ); +#endif +} + +/*****************************************************************************/ +/* 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; + } + + if (pThreadImpl->m_hThread != 0) /* valid handle ? */ + { + /* cancel thread */ + TerminateThread(pThreadImpl->m_hThread, 0); + } +} + +/*****************************************************************************/ +/* 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) + CloseHandle(pThreadImpl->m_hEvent); + + DeleteCriticalSection(&pThreadImpl->m_Mutex); + + /* 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 (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_sleepThread */ +/*****************************************************************************/ +oslThreadSleep SAL_CALL osl_sleepThread(oslThread Thread, const TimeValue* pDelay) +{ + DWORD millisecs; + osl_TThreadImpl* pThreadImpl= (osl_TThreadImpl*)Thread; + + /* invalid arguments?*/ + if (pThreadImpl==0 || pThreadImpl->m_hThread==0 || pDelay==0) + return osl_Thread_SleepError; + + if (pThreadImpl->m_Flags & THREADIMPL_FLAGS_SLEEP) + return osl_Thread_SleepActive; + + EnterCriticalSection(&pThreadImpl->m_Mutex); + + millisecs = pDelay->Seconds * 1000L + pDelay->Nanosec / 1000000L; + + if (pThreadImpl->m_hEvent == 0) + pThreadImpl->m_hEvent= CreateEvent(NULL, FALSE, FALSE, NULL); + else + ResetEvent(pThreadImpl->m_hEvent); + + if (pThreadImpl->m_ThreadId == GetCurrentThreadId()) + { + DWORD ret; + + pThreadImpl->m_Timeout = 0; + pThreadImpl->m_Flags |= THREADIMPL_FLAGS_SLEEP; + + LeaveCriticalSection(&pThreadImpl->m_Mutex); + + ret = WaitForSingleObject(pThreadImpl->m_hEvent, millisecs); + + EnterCriticalSection(&pThreadImpl->m_Mutex); + + pThreadImpl->m_Flags &= ~THREADIMPL_FLAGS_SLEEP; + + LeaveCriticalSection(&pThreadImpl->m_Mutex); + + return (ret == WAIT_TIMEOUT) ? osl_Thread_SleepNormal : + osl_Thread_SleepCancel; + } + else + { + pThreadImpl->m_Timeout = millisecs; + pThreadImpl->m_Flags |= THREADIMPL_FLAGS_SLEEP; + + LeaveCriticalSection(&pThreadImpl->m_Mutex); + + return osl_Thread_SleepPending; + } +} + +/*****************************************************************************/ +/* osl_awakeThread */ +/*****************************************************************************/ +sal_Bool SAL_CALL osl_awakeThread(oslThread Thread) +{ + osl_TThreadImpl* pThreadImpl= (osl_TThreadImpl*)Thread; + + /* invalid arguments?*/ + if (pThreadImpl==0 || pThreadImpl->m_hThread==0) + { + /* assume thread is not running */ + return sal_False; + } + + EnterCriticalSection(&pThreadImpl->m_Mutex); + + if (pThreadImpl->m_Flags & THREADIMPL_FLAGS_SLEEP) + { + SetEvent(pThreadImpl->m_hEvent); + } + + pThreadImpl->m_Flags &= ~THREADIMPL_FLAGS_SLEEP; + + LeaveCriticalSection(&pThreadImpl->m_Mutex); + + return sal_True; +} + +/*****************************************************************************/ +/* 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; + } + + EnterCriticalSection(&pThreadImpl->m_Mutex); + pThreadImpl->m_Flags |= THREADIMPL_FLAGS_TERMINATE; + LeaveCriticalSection(&pThreadImpl->m_Mutex); +} + + +/*****************************************************************************/ +/* 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; + } + + if (pThreadImpl->m_Flags & THREADIMPL_FLAGS_SLEEP) + { + OSL_ASSERT (pThreadImpl->m_hEvent != 0); + + WaitForSingleObject(pThreadImpl->m_hEvent, pThreadImpl->m_Timeout); + + EnterCriticalSection(&pThreadImpl->m_Mutex); + + pThreadImpl->m_Timeout = 0; + + pThreadImpl->m_Flags &= ~THREADIMPL_FLAGS_SLEEP; + + LeaveCriticalSection(&pThreadImpl->m_Mutex); + } + + return ((pThreadImpl->m_Flags & THREADIMPL_FLAGS_TERMINATE) == 0); +} + +/*****************************************************************************/ +/* osl_yieldThread */ +/*****************************************************************************/ +void SAL_CALL osl_yieldThread() +{ + Sleep(0); +} + + +/*****************************************************************************/ +/* osl_createThreadKey */ +/*****************************************************************************/ +oslThreadKey SAL_CALL osl_createThreadKey(void) +{ + DWORD index; + + /* increment index by one, to have a key which is not equal to zero */ + if ((index = TlsAlloc()) != 0xFFFFFFFF) + index += 1; + else + index = 0; + + return ((oslThreadKey)index); +} + +/*****************************************************************************/ +/* osl_destroyThreadKey */ +/*****************************************************************************/ +void SAL_CALL osl_destroyThreadKey(oslThreadKey Key) +{ + if (Key != 0) + TlsFree((DWORD)Key - 1); +} + +/*****************************************************************************/ +/* osl_getThreadKeyData */ +/*****************************************************************************/ +void* SAL_CALL osl_getThreadKeyData(oslThreadKey Key) +{ + if (Key != 0) + return (TlsGetValue((DWORD)Key - 1)); + + return (NULL); +} + +/*****************************************************************************/ +/* osl_setThreadKeyData */ +/*****************************************************************************/ +sal_Bool SAL_CALL osl_setThreadKeyData(oslThreadKey Key, void *pData) +{ + if (Key != 0) + return (TlsSetValue(((DWORD)Key - 1), pData) != 0); + + return (sal_False); +} + + +/*****************************************************************************/ +/* osl_getThreadTextEncoding */ +/*****************************************************************************/ + +DWORD g_dwTLSTextEncodingIndex = (DWORD)-1; + + +rtl_TextEncoding SAL_CALL osl_getThreadTextEncoding() +{ + 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 ) + { + switch ( GetACP() ) + { + case 1200: + _encoding = RTL_TEXTENCODING_UNICODE; + break; + case 1252: + _encoding = RTL_TEXTENCODING_MS_1252; + break; + case 1250: + _encoding = RTL_TEXTENCODING_MS_1250; + break; + case 1251: + _encoding = RTL_TEXTENCODING_MS_1251; + break; + case 1253: + _encoding = RTL_TEXTENCODING_MS_1253; + break; + case 1254: + _encoding = RTL_TEXTENCODING_MS_1254; + break; + case 1255: + _encoding = RTL_TEXTENCODING_MS_1255; + break; + case 1256: + _encoding = RTL_TEXTENCODING_MS_1256; + break; + case 1257: + _encoding = RTL_TEXTENCODING_MS_1257; + break; + case 1258: + _encoding = RTL_TEXTENCODING_MS_1258; + break; + case 874: + _encoding = RTL_TEXTENCODING_MS_874; + break; + case 932: + _encoding = RTL_TEXTENCODING_MS_932; + break; + case 936: + _encoding = RTL_TEXTENCODING_MS_936; + break; + case 949: + _encoding = RTL_TEXTENCODING_MS_949; + break; + case 950: + _encoding = RTL_TEXTENCODING_MS_950; + break; + default: + _encoding = RTL_TEXTENCODING_DONTKNOW; + break; + } + + 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; +} + + +/************************************************************************* +* +* $Log: not supported by cvs2svn $ +* Revision 1.30 2000/09/18 14:29:03 willem.vandorp +* OpenOffice header added. +* +* Revision 1.29 2000/06/09 13:26:45 hro +* No TLS allocation via runtime library +* +* Revision 1.28 2000/04/03 09:44:54 hro +* Missing return statement in osl_CoInitializeEx +* +* Revision 1.27 2000/03/31 16:44:52 rs +* tools.c +* +* Revision 1.26 2000/03/27 09:13:26 hro +* UNICODE New osl_getThreadTextEncoding +* +* Revision 1.25 2000/02/02 15:31:24 obr +* #70588# load CoInitialzeEx on call +* +* Revision 1.24 1999/12/22 13:40:13 mfe +* #71232# : shared createthread code for normal and suspended threads +* +* Revision 1.23 1999/10/27 15:13:37 mfe +* Change of Copyright, removed compiler warnings, code clean up, ... +* +* Revision 1.22 1999/10/01 12:25:35 hro +* #68919# Nur noch CoInitialize rufen da Win95 kein DCOM hat +* +* Revision 1.21 1999/09/16 14:58:19 hro +* Every thread must initialize COM +* +* Revision 1.20 1999/03/19 09:06:38 jsc +* #60455# osl_isCurrentThresad entfernt +* +* Revision 1.19 1999/01/20 19:09:50 jsc +* #61011# Typumstellung +* +* Revision 1.18 1998/11/05 11:13:18 rh +* #59037# Thread local storage implementation +* +* Revision 1.17 1998/07/22 10:57:11 rh +* #53540 destroyThread : don't wait for termination, because of hangup in Win95 +* +* Revision 1.16 1998/03/13 15:07:46 rh +* Cleanup of enum chaos and implemntation of pipes +* +* Revision 1.15 1998/02/26 18:35:29 rh +* Avoid unix zombies and rename oslThreadHandle to oslThread +* +* Revision 1.14 1998/02/16 19:35:01 rh +* Cleanup of ports, integration of Size_t, features for process +* +* Revision 1.13 1997/10/16 16:25:50 rh +* *** empty log message *** +* +* Revision 1.12 1997/10/13 18:41:04 rh +* BugFix +* +* Revision 1.11 1997/08/22 14:47:48 rh +* TimeValue inserted +* +* Revision 1.10 1997/07/25 11:37:15 rh +* new arrangment for terminating threads +* +* Revision 1.9 1997/07/22 14:29:35 rh +* process added +* +* Revision 1.8 1997/07/18 17:43:58 mhu +* Renamed "osl_freeThreadHandle()" into "osl_freeHandleOfThread()" +* (as declared in ). +* +* Revision 1.7 1997/07/17 11:02:32 rh +* Header adapted and profile added +* +* Revision 1.6 1997/07/15 19:02:06 rh +* system.h inserted +* +* Revision 1.5 1997/07/14 16:12:07 rh +* *** empty log message *** +* +* Revision 1.4 1997/07/14 09:09:15 rh +* Adaptions for killable sleeps +* +* Revision 1.3 1997/07/13 11:29:49 mhu +* Corrected check for valid handle in osl_destroyThread. +* +* Revision 1.2 1997/07/02 10:54:03 rh +* Anpassung fuer Diagnose Macros +* +* Revision 1.1 1997/06/19 13:10:45 bho +* first version of OSL. +* +*************************************************************************/ + + diff --git a/sal/osl/w32/time.c b/sal/osl/w32/time.c new file mode 100644 index 000000000000..a3533f059268 --- /dev/null +++ b/sal/osl/w32/time.c @@ -0,0 +1,256 @@ +/************************************************************************* + * + * $RCSfile: time.c,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:17:24 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +#include "system.h" + +#include +#include + +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; +} + + +/************************************************************************* +* +* $Log: not supported by cvs2svn $ +* Revision 1.8 2000/09/18 14:29:03 willem.vandorp +* OpenOffice header added. +* +* Revision 1.7 2000/08/18 14:03:25 rs +* new time functions +* +* Revision 1.6 2000/07/26 15:12:35 rs +* DateTime functions +* +* Revision 1.5 1999/10/27 15:13:37 mfe +* Change of Copyright, removed compiler warnings, code clean up, ... +* +* Revision 1.4 1999/01/20 19:09:51 jsc +* #61011# Typumstellung +* +* Revision 1.3 1997/08/22 14:47:49 rh +* TimeValue inserted +* +* Revision 1.2 1997/07/23 07:29:10 rh +* micro to nanosecs +* +* Revision 1.1 1997/07/21 19:13:15 rh +* getSystemTime added +* +*************************************************************************/ diff --git a/sal/osl/w32/util.c b/sal/osl/w32/util.c new file mode 100644 index 000000000000..f371b1376444 --- /dev/null +++ b/sal/osl/w32/util.c @@ -0,0 +1,94 @@ +/************************************************************************* + * + * $RCSfile: util.c,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:17:24 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +#include "osl/util.h" + + + +extern sal_Bool osl_getEtherAddr(sal_Char* pszAddr, sal_uInt16 BufferSize) +{ + return sal_False; +} + +extern sal_Bool SAL_CALL osl_getEthernetAddress( sal_uInt8 *pAddr ) +{ + return sal_False; +} + + + +/************************************************************************* +* +* $Log: not supported by cvs2svn $ +* Revision 1.3 2000/09/18 14:29:03 willem.vandorp +* OpenOffice header added. +* +* Revision 1.2 1999/12/06 15:01:58 jbu +* #70413# +* +* Revision 1.1 1999/10/25 09:47:15 mfe +* added getEtherAddr +* +* Revision 1.1 1999/10/25 09:45:54 mfe +* added getEtherAddr +* +* +*************************************************************************/ diff --git a/sal/prj/d.lst b/sal/prj/d.lst new file mode 100644 index 000000000000..2ff18ccae17a --- /dev/null +++ b/sal/prj/d.lst @@ -0,0 +1,42 @@ +mkdir: %_DEST%\inc%_EXT%\sal +mkdir: %_DEST%\inc%_EXT%\osl +mkdir: %_DEST%\inc%_EXT%\rtl + +..\inc\sal\*.h %_DEST%\inc%_EXT%\sal\*.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\rtl\ustring %_DEST%\inc%_EXT%\rtl\ustring +..\inc\systools\*.h %_DEST%\inc%_EXT%\*.h +..\inc\systools\win32\*.h %_DEST%\inc%_EXT%\*.h +..\inc\systools\unx\*.h %_DEST%\inc%_EXT%\*.h + +..\%__SRC%\lib\*.so %_DEST%\lib%_EXT%\*.so +..\%__SRC%\lib\*.so.* %_DEST%\lib%_EXT%\*.so.* +..\%__SRC%\lib\*.sl %_DEST%\lib%_EXT%\*.sl +..\%__SRC%\lib\*.dylib %_DEST%\lib%_EXT%\*.dylib +..\%__SRC%\lib\*.a %_DEST%\lib%_EXT%\*.a + +..\%__SRC%\lib\sal.lib %_DEST%\lib%_EXT%\sal.lib +..\%__SRC%\slb\sal.lib %_DEST%\lib%_EXT%\xsal.lib +..\%__SRC%\lib\asal.lib %_DEST%\lib%_EXT%\asal.lib +..\%__SRC%\lib\isal.lib %_DEST%\lib%_EXT%\isal.lib +..\%__SRC%\bin\sal*.dll %_DEST%\bin%_EXT%\sal*.dll + +..\%__SRC%\bin\sdaemon.sh %_DEST%\bin%_EXT%\sdaemon.sh +..\%__SRC%\bin\sdaemon %_DEST%\bin%_EXT%\sdaemon +..\%__SRC%\bin\sdaemon.exe %_DEST%\bin%_EXT%\sdaemon.exe +..\%__SRC%\bin\sdaemon.cmd %_DEST%\bin%_EXT%\sdaemon.cmd +..\version.mk %_DEST%\inc%_EXT%\sal\version.mk + + +..\%__SRC%\bin\*.dll %_DEST%\bin%_EXT%\*.dll +..\%__SRC%\lib\*.lib %_DEST%\lib%_EXT%\*.lib +..\%__SRC%\lib\*.so %_DEST%\lib%_EXT%\*.so +..\%__SRC%\lib\*.sl %_DEST%\lib%_EXT%\*.sl +..\%__SRC%\lib\*.dylib %_DEST%\lib%_EXT%\*.dylib +..\%__SRC%\bin\*.bin %_DEST%\bin%_EXT%\*.bin +..\%__SRC%\misc\*.hid %_DEST%\bin%_EXT%\*.hid +..\%__SRC%\bin\*.res %_DEST%\bin%_EXT%\*.res + diff --git a/sal/rtl/source/alloc.c b/sal/rtl/source/alloc.c new file mode 100644 index 000000000000..70b839e2c77a --- /dev/null +++ b/sal/rtl/source/alloc.c @@ -0,0 +1,187 @@ +/************************************************************************* + * + * $RCSfile: alloc.c,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:17:24 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +#ifndef MAC + #ifdef MACOSX + #include + #include + #else + #include +#endif +#else +#include +#endif +#include + +#include + +/* + * rtl_allocateMemory. + */ +void * SAL_CALL rtl_allocateMemory(sal_uInt32 Bytes) +{ + if (Bytes == 0) + return (NULL); + +#ifdef _WIN16 + return (farmalloc(Bytes)); +#else + return (malloc(Bytes)); +#endif +} + +/* + * rtl_reallocateMemory. + */ +void * SAL_CALL rtl_reallocateMemory(void *Ptr, sal_uInt32 Bytes) +{ + if (Bytes == 0) + { + if (Ptr != NULL) + rtl_freeMemory(Ptr); + + return (NULL); + } + + if (Ptr == NULL) + return (rtl_allocateMemory(Bytes)); + +#ifdef _WIN16 + return (farrealloc(Ptr, Bytes)); +#else + return (realloc(Ptr, Bytes)); +#endif +} + +/* + * rtl_freeMemory. + */ +void SAL_CALL rtl_freeMemory(void *Ptr) +{ + if (Ptr != NULL) +#ifdef _WIN16 + farfree(Ptr); +#else + free(Ptr); +#endif +} + +/* + * rtl_allocateZeroMemory. + */ +void * SAL_CALL rtl_allocateZeroMemory (sal_uInt32 Bytes) +{ + if (Bytes == 0) + return (NULL); + +#ifdef _WIN16 + return (farcalloc (Bytes)); +#else + return (calloc (Bytes, 1)); +#endif +} + +/* + * rtl_freeZeroMemory. + */ +void SAL_CALL rtl_freeZeroMemory (void *Ptr, sal_uInt32 Bytes) +{ + if (Ptr != NULL) + { +#ifdef _WIN16 + _fmemset (Ptr, 0, Bytes); + farfree (Ptr); +#else + memset (Ptr, 0, Bytes); + free (Ptr); +#endif + } +} + +#ifdef LINUX + +#if defined(MALLOC_HOOKS) +extern void *(*__malloc_hook) (size_t __size, const void* caller); +#endif + +void * calloc (size_t n, size_t elem_size) +{ + size_t sz; + void *mem; + + sz = n * elem_size; + +# if defined(MALLOC_HOOKS) + if ( __malloc_hook != NULL ) + mem = (*__malloc_hook) (sz, __builtin_return_address(0) ); + else +# endif + + mem = malloc(sz); + + if (mem != NULL) + memset (mem, 0, sz); + + return mem; +} + +#endif /* LINUX */ + diff --git a/sal/rtl/source/byteseq.c b/sal/rtl/source/byteseq.c new file mode 100644 index 000000000000..28ad9f2b2c4b --- /dev/null +++ b/sal/rtl/source/byteseq.c @@ -0,0 +1,263 @@ +/************************************************************************* + * + * $RCSfile: byteseq.c,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:17:24 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +#include +#include + +#include +#include +#include + +/* 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_ENSHURE( ppSequence, "### null ptr!" ); + pSequence = *ppSequence; + + if (pSequence->nRefCount > 1) + { + nElements = pSequence->nElements; + if (nElements) + { + pNew = (sal_Sequence *)rtl_allocateMemory( SAL_SEQUENCE_HEADER_SIZE + nElements ); + + 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 ); + } + + 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_ENSHURE( 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 (nSize > nElements) + { + rtl_copyMemory( pNew->elements, pSequence->elements, nElements ); + rtl_zeroMemory( pNew->elements + nElements, nSize - nElements ); + } + else + { + rtl_copyMemory( pNew->elements, pSequence->elements, nElements ); + } + + if (! osl_decrementInterlockedCount( &pSequence->nRefCount )) + rtl_freeMemory( pSequence ); + + pSequence = pNew; + } + else + { + pSequence = (sal_Sequence *)rtl_reallocateMemory( + pSequence, SAL_SEQUENCE_HEADER_SIZE + nSize ); + } + 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 ) +{ + OSL_ASSERT( pSequence ); + 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 ); + + (*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 ); + + (*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 ); + 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 (0 == rtl_compareMemory( pSequence1->elements, pSequence2->elements, pSequence1->nElements )); +} + + +//================================================================================================== +const sal_Int8 *SAL_CALL rtl_byte_sequence_getConstArray( sal_Sequence *pSequence ) +{ + return 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..86c1747ef10b --- /dev/null +++ b/sal/rtl/source/cipher.c @@ -0,0 +1,1177 @@ +/************************************************************************* + * + * $RCSfile: cipher.c,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:17:24 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +#define _RTL_CIPHER_C_ "$Revision: 1.1.1.1 $" + +#ifndef _SAL_TYPES_H_ +#include +#endif + +#ifndef _RTL_ALLOC_H_ +#include +#endif +#ifndef _RTL_MEMORY_H_ +#include +#endif + +#ifndef _RTL_CIPHER_H_ +#include +#endif + +/*======================================================================== + * + * 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_uInt32 nKeyLen, + const sal_uInt8 *pArgData, sal_uInt32 nArgLen); + +typedef rtlCipherError (SAL_CALL cipher_update_t) ( + rtlCipher Cipher, + const void *pData, sal_uInt32 nDatLen, + sal_uInt8 *pBuffer, sal_uInt32 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; + + 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_uInt32 nKeyLen, + const sal_uInt8 *pArgData, sal_uInt32 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_uInt32 nDatLen, + sal_uInt8 *pBuffer, sal_uInt32 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_uInt32 nDatLen, + sal_uInt8 *pBuffer, sal_uInt32 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_uInt32 nKeyLen, + const sal_uInt8 *pArgData, sal_uInt32 nArgLen); + +/** __rtl_cipherBF_update. + */ +static rtlCipherError __rtl_cipherBF_update ( + CipherContextBF *ctx, + rtlCipherMode eMode, + rtlCipherDirection eDirection, + const sal_uInt8 *pData, sal_uInt32 nDatLen, + sal_uInt8 *pBuffer, sal_uInt32 nBufLen); + +/** __rtl_cipherBF_updateECB. + */ +static void __rtl_cipherBF_updateECB ( + CipherContextBF *ctx, + rtlCipherDirection direction, + const sal_uInt8 *pData, + sal_uInt8 *pBuffer, + sal_uInt32 nLength); + +/** __rtl_cipherBF_updateCBC. + */ +static void __rtl_cipherBF_updateCBC ( + CipherContextBF *ctx, + rtlCipherDirection direction, + const sal_uInt8 *pData, + sal_uInt8 *pBuffer, + sal_uInt32 nLength); + +/** __rtl_cipherBF_updateCFB. + */ +static void __rtl_cipherBF_updateCFB ( + CipherContextBF *ctx, + rtlCipherDirection direction, + const sal_uInt8 *pData, + sal_uInt8 *pBuffer, + sal_uInt32 nLength); + +/** __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_uInt32 nKeyLen, + const sal_uInt8 *pArgData, sal_uInt32 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_uInt32 nDatLen, + sal_uInt8 *pBuffer, sal_uInt32 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, 1); + 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_uInt32 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_uInt32 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_uInt32 nLength) +{ + 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_uInt32 nKeyLen, + const sal_uInt8 *pArgData, sal_uInt32 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_uInt32 nDatLen, + sal_uInt8 *pBuffer, sal_uInt32 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_uInt32 nDatLen, + sal_uInt8 *pBuffer, sal_uInt32 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); + } +} + diff --git a/sal/rtl/source/crc.c b/sal/rtl/source/crc.c new file mode 100644 index 000000000000..7fe5bc4e4d2f --- /dev/null +++ b/sal/rtl/source/crc.c @@ -0,0 +1,203 @@ +/************************************************************************* + * + * $RCSfile: crc.c,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:17:24 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +#define _RTL_CRC_C_ "$Revision: 1.1.1.1 $" + +#ifndef _SAL_TYPES_H_ +#include +#endif + +#ifndef _RTL_CRC_H_ +#include +#endif + +/*======================================================================== + * + * 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/digest.c b/sal/rtl/source/digest.c new file mode 100644 index 000000000000..643b994b6b4d --- /dev/null +++ b/sal/rtl/source/digest.c @@ -0,0 +1,1464 @@ +/************************************************************************* + * + * $RCSfile: digest.c,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:17:24 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +#define _RTL_DIGEST_C_ "$Revision: 1.1.1.1 $" + +#ifndef _SAL_TYPES_H_ +#include +#endif + +#ifndef _RTL_ALLOC_H_ +#include +#endif + +#ifndef _RTL_MEMORY_H_ +#include +#endif + +#ifndef _RTL_DIGEST_H_ +#include +#endif + +/*======================================================================== + * + * rtlDigest internals. + * + *======================================================================*/ +#ifndef SAL_W32 +#define RTL_DIGEST_ROTL(a,n) (((a) << (n)) | ((a) >> (32 - (n)))) +#else +#define RTL_DIGEST_ROTL(a,n) (_rotl((a), (n))) +#endif + +#define RTL_DIGEST_SWAPLONG(x) \ + ((((x) >> 24) & 0x000000ff) | (((x) & 0x00ff0000) >> 8) | \ + (((x) & 0x0000ff00) << 8) | (((x) & 0x000000ff) << 24) ) + +#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 void* (SAL_CALL Digest_new_t) (void); +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_new_t *m_new; + Digest_delete_t *m_delete; + Digest_update_t *m_update; + Digest_get_t *m_get; +} Digest_Impl; + +/*======================================================================== + * + * 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; + + 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_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_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) +{ + rtlDigestError Result = rtl_Digest_E_Memory; + rtlDigest Digest = rtl_digest_createMD2(); + if (Digest) + { + Result = rtl_digest_updateMD2 (Digest, pData, nDatLen); + if (Result == rtl_Digest_E_None) + Result = rtl_digest_getMD2 (Digest, pBuffer, nBufLen); + rtl_digest_destroyMD2 (Digest); + } + return Result; +} + +/* + * rtl_digest_createMD2. + */ +rtlDigest SAL_CALL rtl_digest_createMD2 (void) +{ + DigestMD2_Impl *pImpl = (DigestMD2_Impl*)NULL; + pImpl = ((DigestMD2_Impl*)rtl_allocateZeroMemory (sizeof(DigestMD2_Impl))); + if (pImpl) + { + pImpl->m_digest.m_algorithm = rtl_Digest_AlgorithmMD2; + pImpl->m_digest.m_length = RTL_DIGEST_LENGTH_MD2; + + pImpl->m_digest.m_delete = rtl_digest_destroyMD2; + pImpl->m_digest.m_update = rtl_digest_updateMD2; + pImpl->m_digest.m_get = rtl_digest_getMD2; + + __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_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); + + 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) +{ + rtlDigestError Result = rtl_Digest_E_Memory; + rtlDigest Digest = rtl_digest_createMD5(); + if (Digest) + { + Result = rtl_digest_updateMD5 (Digest, pData, nDatLen); + if (Result == rtl_Digest_E_None) + Result = rtl_digest_getMD5 (Digest, pBuffer, nBufLen); + rtl_digest_destroyMD5 (Digest); + } + return Result; +} + +/* + * rtl_digest_createMD5. + */ +rtlDigest SAL_CALL rtl_digest_createMD5 (void) +{ + DigestMD5_Impl *pImpl = (DigestMD5_Impl*)NULL; + pImpl = ((DigestMD5_Impl*)rtl_allocateZeroMemory (sizeof(DigestMD5_Impl))); + if (pImpl) + { + pImpl->m_digest.m_algorithm = rtl_Digest_AlgorithmMD5; + pImpl->m_digest.m_length = RTL_DIGEST_LENGTH_MD5; + + pImpl->m_digest.m_delete = rtl_digest_destroyMD5; + pImpl->m_digest.m_update = rtl_digest_updateMD5; + pImpl->m_digest.m_get = rtl_digest_getMD5; + + __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; + + __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; + + __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_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); + +static void __rtl_digest_swapLong (sal_uInt32 *pData, sal_uInt32 nDatLen); + +#define K_00_19 0x5a827999L +#define K_20_39 0x6ed9eba1L +#define K_40_59 0x8f1bbcdcL +#define K_60_79 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); + + 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; + + __rtl_digest_swapLong (X, i); + + 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_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] = RTL_DIGEST_SWAPLONG(X[i]); +} + +/*======================================================================== + * + * rtl_digest_SHA internals. + * + *======================================================================*/ +/* + * __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) +{ + rtlDigestError Result = rtl_Digest_E_Memory; + rtlDigest Digest = rtl_digest_createSHA(); + if (Digest) + { + Result = rtl_digest_updateSHA (Digest, pData, nDatLen); + if (Result == rtl_Digest_E_None) + Result = rtl_digest_getSHA (Digest, pBuffer, nBufLen); + rtl_digest_destroySHA (Digest); + } + return Result; +} + +/* + * rtl_digest_createSHA. + */ +rtlDigest SAL_CALL rtl_digest_createSHA (void) +{ + DigestSHA_Impl *pImpl = (DigestSHA_Impl*)NULL; + pImpl = ((DigestSHA_Impl*)rtl_allocateZeroMemory (sizeof(DigestSHA_Impl))); + if (pImpl) + { + pImpl->m_digest.m_algorithm = rtl_Digest_AlgorithmSHA; + pImpl->m_digest.m_length = RTL_DIGEST_LENGTH_SHA; + + pImpl->m_digest.m_delete = rtl_digest_destroySHA; + pImpl->m_digest.m_update = rtl_digest_updateSHA; + pImpl->m_digest.m_get = rtl_digest_getSHA; + + __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; + + __rtl_digest_swapLong (ctx->m_pData, DIGEST_LBLOCK_SHA); + __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; + + __rtl_digest_swapLong (ctx->m_pData, DIGEST_LBLOCK_SHA); + __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_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) +{ + rtlDigestError Result = rtl_Digest_E_Memory; + rtlDigest Digest = rtl_digest_createSHA1(); + if (Digest) + { + Result = rtl_digest_updateSHA1 (Digest, pData, nDatLen); + if (Result == rtl_Digest_E_None) + Result = rtl_digest_getSHA1 (Digest, pBuffer, nBufLen); + rtl_digest_destroySHA1 (Digest); + } + return Result; +} + +/* + * rtl_digest_createSHA1. + */ +rtlDigest SAL_CALL rtl_digest_createSHA1 (void) +{ + DigestSHA_Impl *pImpl = (DigestSHA_Impl*)NULL; + pImpl = ((DigestSHA_Impl*)rtl_allocateZeroMemory (sizeof(DigestSHA_Impl))); + if (pImpl) + { + pImpl->m_digest.m_algorithm = rtl_Digest_AlgorithmSHA1; + pImpl->m_digest.m_length = RTL_DIGEST_LENGTH_SHA1; + + pImpl->m_digest.m_delete = rtl_digest_destroySHA1; + pImpl->m_digest.m_update = rtl_digest_updateSHA1; + pImpl->m_digest.m_get = rtl_digest_getSHA1; + + __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; + + __rtl_digest_swapLong (ctx->m_pData, DIGEST_LBLOCK_SHA); + __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; + + __rtl_digest_swapLong (ctx->m_pData, DIGEST_LBLOCK_SHA); + __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); + } +} + diff --git a/sal/rtl/source/locale.c b/sal/rtl/source/locale.c new file mode 100644 index 000000000000..d99e298f79c2 --- /dev/null +++ b/sal/rtl/source/locale.c @@ -0,0 +1,367 @@ +/************************************************************************* + * + * $RCSfile: locale.c,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:17:24 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +#ifndef _OSL_INTERLOCK_H_ +#include +#endif + +#ifndef _RTL_LOCALE_H_ +#include +#endif + +#ifndef _RTL_MEMORY_H_ +#include +#endif + +#ifndef _RTL_ALLOC_H_ +#include +#endif + +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* pLocaleTable = NULL; + +static rtl_Locale* pDefaultLocale = NULL; + + +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); +} + +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 (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(sal_Int32 key, sal_Int32 hashCode, rtl_Locale** pValue) +{ + if (!pLocaleTable) + return sal_False; + + if (pLocaleTable->Table[key]) + { + RTL_HASHENTRY *pEntry = pLocaleTable->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_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 (!pLocaleTable) + rtl_hashtable_init(&pLocaleTable, 1); + + hashCode = rtl_ustr_hashCode(language) ^ rtl_ustr_hashCode(country) ^ rtl_ustr_hashCode(variant); + key = rtl_hashfunc(pLocaleTable, hashCode); + + if (rtl_hashtable_find(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(&pLocaleTable, newLocale); + + return newLocale; +} + +/************************************************************************* + * rtl_locale_getDefault + */ +rtl_Locale * SAL_CALL rtl_locale_getDefault() +{ + return pDefaultLocale; +} + +/************************************************************************* + * rtl_locale_setDefault + */ +void SAL_CALL rtl_locale_setDefault( const sal_Unicode * language, const sal_Unicode * country, const sal_Unicode * variant ) +{ + 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/makefile.mk b/sal/rtl/source/makefile.mk new file mode 100644 index 000000000000..e3e3fb1a23d2 --- /dev/null +++ b/sal/rtl/source/makefile.mk @@ -0,0 +1,131 @@ +#************************************************************************* +# +# $RCSfile: makefile.mk,v $ +# +# $Revision: 1.1.1.1 $ +# +# last change: $Author: hr $ $Date: 2000-09-18 15:17:24 $ +# +# The Contents of this file are made available subject to the terms of +# either of the following licenses +# +# - GNU Lesser General Public License Version 2.1 +# - Sun Industry Standards Source License Version 1.1 +# +# Sun Microsystems Inc., October, 2000 +# +# GNU Lesser General Public License Version 2.1 +# ============================================= +# Copyright 2000 by Sun Microsystems, Inc. +# 901 San Antonio Road, Palo Alto, CA 94303, USA +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License version 2.1, as published by the Free Software Foundation. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, +# MA 02111-1307 USA +# +# +# Sun Industry Standards Source License Version 1.1 +# ================================================= +# The contents of this file are subject to the Sun Industry Standards +# Source License Version 1.1 (the "License"); You may not use this file +# except in compliance with the License. You may obtain a copy of the +# License at http://www.openoffice.org/license.html. +# +# Software provided under this License is provided on an "AS IS" basis, +# WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, +# WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, +# MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. +# See the License for the specific provisions governing your rights and +# obligations concerning the Software. +# +# The Initial Developer of the Original Code is: Sun Microsystems, Inc. +# +# Copyright: 2000 by Sun Microsystems, Inc. +# +# All Rights Reserved. +# +# Contributor(s): _______________________________________ +# +# +# +#************************************************************************* + +PRJ=..$/.. + +PRJNAME=sal +TARGET=cpprtl +USE_LDUMP2=TRUE + +PROJECTPCH4DLL=TRUE +PROJECTPCH=cont_pch +PROJECTPCHSOURCE=cont_pch + +# --- Settings ----------------------------------------------------- + +.INCLUDE : svpre.mk +.INCLUDE : settings.mk +.INCLUDE : sv.mk + +# --- Files -------------------------------------------------------- + +.IF "$(header)" == "" + +SLOFILES= $(SLO)$/alloc.obj \ + $(SLO)$/memory.obj \ + $(SLO)$/cipher.obj \ + $(SLO)$/crc.obj \ + $(SLO)$/digest.obj \ + $(SLO)$/random.obj \ + $(SLO)$/char.obj \ + $(SLO)$/ustring.obj \ + $(SLO)$/locale.obj \ + $(SLO)$/rtl_process.obj \ + $(SLO)$/string.obj \ + $(SLO)$/strbuf.obj \ + $(SLO)$/uuid.obj \ + $(SLO)$/ustrbuf.obj \ + $(SLO)$/byteseq.obj + +.IF "$(GUI)" == "WIN" +SLOFILES+= $(SLO)$/tcwin16.obj +.ENDIF + +#.IF "$(UPDATER)"=="YES" +OBJFILES= $(OBJ)$/alloc.obj \ + $(OBJ)$/memory.obj \ + $(OBJ)$/cipher.obj \ + $(OBJ)$/crc.obj \ + $(OBJ)$/digest.obj \ + $(OBJ)$/random.obj \ + $(OBJ)$/char.obj \ + $(OBJ)$/ustring.obj \ + $(OBJ)$/locale.obj \ + $(OBJ)$/rtl_process.obj \ + $(OBJ)$/string.obj \ + $(OBJ)$/strbuf.obj \ + $(OBJ)$/uuid.obj \ + $(OBJ)$/ustrbuf.obj \ + $(OBJ)$/byteseq.obj +#.ENDIF + +.IF "$(GUI)" == "WIN" +OBJFILES+= $(OBJ)$/tcwin16.obj + +.ENDIF + +.ENDIF + +# --- Targets ------------------------------------------------------ + +.INCLUDE : target.mk + diff --git a/sal/rtl/source/memory.c b/sal/rtl/source/memory.c new file mode 100644 index 000000000000..ea31af3db75b --- /dev/null +++ b/sal/rtl/source/memory.c @@ -0,0 +1,124 @@ +/************************************************************************* + * + * $RCSfile: memory.c,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:17:24 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + + +#ifndef MAC +#include +#endif +#include + +#include + +void SAL_CALL rtl_zeroMemory(void *Ptr, sal_uInt32 Bytes) +{ +#ifdef _WIN16 + _fmemset(Ptr, 0, Bytes); +#else + memset(Ptr, 0, Bytes); +#endif +} + +void SAL_CALL rtl_fillMemory(void *Ptr, sal_uInt32 Bytes, sal_uInt8 Fill) +{ +#ifdef _WIN16 + _fmemset(Ptr, Fill, Bytes); +#else + memset(Ptr, Fill, Bytes); +#endif +} + +void SAL_CALL rtl_copyMemory(void *Dst, const void *Src, sal_uInt32 Bytes) +{ +#ifdef _WIN16 + _fmemcpy(Dst, Src, Bytes); +#else + memcpy(Dst, Src, Bytes); +#endif +} + +void SAL_CALL rtl_moveMemory(void *Dst, const void *Src, sal_uInt32 Bytes) +{ +#ifdef _WIN16 + _fmemmove(Dst, Src, Bytes); +#else + memmove(Dst, Src, Bytes); +#endif +} + +sal_Int32 SAL_CALL rtl_compareMemory(const void *MemA, const void *MemB, sal_uInt32 Bytes) +{ +#ifdef _WIN16 + return _fmemcmp(MemA, MemB, Bytes); +#else + return memcmp(MemA, MemB, Bytes); +#endif +} + +void* SAL_CALL rtl_findInMemory(const void *MemA, sal_uInt8 ch, sal_uInt32 Bytes) +{ +#ifdef _WIN16 + return _fmemchr(MemA, ch, Bytes); +#else + return memchr(MemA, ch, Bytes); +#endif +} + + diff --git a/sal/rtl/source/random.c b/sal/rtl/source/random.c new file mode 100644 index 000000000000..8b7e102fc3e5 --- /dev/null +++ b/sal/rtl/source/random.c @@ -0,0 +1,383 @@ +/************************************************************************* + * + * $RCSfile: random.c,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:17:24 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +#define _RTL_RANDOM_C_ "$Revision: 1.1.1.1 $" + +#ifndef _SAL_TYPES_H_ +#include +#endif + +#ifndef _OSL_THREAD_H_ +#include +#endif + +#ifndef _OSL_TIME_H_ +#include +#endif + +#ifndef _RTL_ALLOC_H_ +#include +#endif + +#ifndef _RTL_DIGEST_H_ +#include +#endif + +#ifndef _RTL_RANDOM_H_ +#include +#endif + +/*======================================================================== + * + * 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_uInt32 nBufLen); + +/** __rtl_random_readPool. + */ +static void __rtl_random_readPool ( + RandomPool_Impl *pImpl, sal_uInt8 *pBuffer, sal_uInt32 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; + + __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_uInt32 nBufLen) +{ + sal_uInt32 i; + sal_Int32 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_uInt32 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); + rtl_digest_update ( + pImpl->m_hDigest, pBuffer, j); + + 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_uInt32 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_uInt32 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..ad804a772be8 --- /dev/null +++ b/sal/rtl/source/rtl_process.c @@ -0,0 +1,83 @@ +/************************************************************************* + * + * $RCSfile: rtl_process.c,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:17:24 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ +#include +#include +#include + + +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..8afb054d96c1 --- /dev/null +++ b/sal/rtl/source/strbuf.c @@ -0,0 +1,192 @@ +/************************************************************************* + * + * $RCSfile: strbuf.c,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:17:24 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +#ifndef _OSL_INTERLOCK_H_ +#include +#endif + +#ifndef _RTL_STRING_HXX_ +#include +#endif + +#ifndef _RTL_MEMORY_H_ +#include +#endif + +/* +#ifndef _RTL_ALLOC_H_ +#include +#endif +*/ + + + +/************************************************************************* + * 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; + } + + if (*newStr) + rtl_string_release(*newStr); + + 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 (*newStr) + rtl_string_release(*newStr); + + if (newCapacity < oldStr->length) + newCapacity = oldStr->length; + + rtl_string_new_WithLength( newStr, newCapacity ); + (*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/string.c b/sal/rtl/source/string.c new file mode 100644 index 000000000000..a81ea1c69dd1 --- /dev/null +++ b/sal/rtl/source/string.c @@ -0,0 +1,1015 @@ +/************************************************************************* + * + * $RCSfile: string.c,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:17:24 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +#ifndef _OSL_INTERLOCK_H_ +#include +#endif + +#ifndef _OSL_DIAGNOSE_H_ +#include +#endif + +#ifndef _RTL_STRING_H_ +#include +#endif + +#ifndef _RTL_STRING_HXX_ +#include +#endif + +#ifndef _RTL_MEMORY_H_ +#include +#endif + +#ifndef _RTL_ALLOC_H_ +#include +#endif + +static sal_Char RTL_STR_DIGITS[] = +{ + '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 data to be referenced by all empty strings + * the refCount is predefined to 1 and must never become 0 ! + */ +static rtl_String aEmpty_rtl_String = +{ + 1, /* sal_Int32 refCount; */ + 0, /* sal_Int32 length; */ + '\0' /* sal_Char buffer[1]; */ +}; + +/************************************************************************* + * rtl_str_getLength + */ +sal_Int32 SAL_CALL rtl_str_getLength( const sal_Char * str ) +{ + const sal_Char * pTempStr = (sal_Char *)rtl_findInMemory(str, '\0', 0x80000000); + + return pTempStr - str; +} + +/************************************************************************* + * rtl_str_compareIgnoreCase_WithLength + */ +sal_Int32 SAL_CALL +rtl_str_compareIgnoreCase_WithLength( const sal_Char *first, + const sal_Char *second, + sal_Int32 len ) +{ + sal_Char a; + sal_Char b; + + while ( len ) + { + a = *first; + b = *second; + if ( (a >= 97) && (a <= 122) ) + a -= 32; + + if ( (b >= 97) && (b <= 122) ) + b -= 32; + + /* Naechstes Zeichen */ + first++; + second++; + len--; + + /* If characters don't match but case may be ignored, + try converting both characters to uppercase. + If the results match, then the comparison scan should + continue. */ + + if ( a == b ) + continue; + + return (sal_Int32)a - (sal_Int32)b; + } + + return 0; /* strings are equal */ +} + +/************************************************************************* + * rtl_str_compareIgnoreCase + */ +sal_Int32 SAL_CALL +rtl_str_compareIgnoreCase( const sal_Char * first, const sal_Char * second ) +{ + sal_Int32 firstLen = rtl_str_getLength(first); + sal_Int32 secondLen = rtl_str_getLength(second); + sal_Int32 shortestLen = 1 + (firstLen < secondLen ? firstLen : secondLen); + + return rtl_str_compareIgnoreCase_WithLength( first, second, shortestLen ); +} + +/************************************************************************* + * rtl_str_equalsIgnoreCase_WithLength + */ +sal_Bool SAL_CALL +rtl_str_equalsIgnoreCase_WithLength( const sal_Char * first, + sal_Int32 firstLen, + const sal_Char * second, + sal_Int32 secondLen ) +{ + if (firstLen != secondLen) + return sal_False; + + return rtl_str_compareIgnoreCase_WithLength(first, second, firstLen) == 0; +} + + +/************************************************************************* + * rtl_str_equalsIgnoreCase + */ +sal_Bool SAL_CALL +rtl_str_equalsIgnoreCase( const sal_Char * first, const sal_Char * second ) +{ + return rtl_str_equalsIgnoreCase_WithLength( + first, rtl_str_getLength(first), + second, rtl_str_getLength(second)); +} + +/************************************************************************* + * rtl_str_compare_WithLength + */ +sal_Int32 SAL_CALL rtl_str_compare_WithLength( const sal_Char * first, + sal_Int32 firstLen, + const sal_Char * second, + sal_Int32 secondLen ) +{ + const sal_Char * firstEnd = first + firstLen; + const sal_Char * secondEnd = second + secondLen; + sal_Int32 nResult = 0; + while( first < firstEnd && second < secondEnd + && (0 == (nResult = (sal_Int32)*first++ - (sal_Int32)*second++ ) ) ) + ; + if( nResult ) + return nResult; + + return firstLen - secondLen; +} + +/************************************************************************* + * rtl_str_compare + */ +sal_Int32 SAL_CALL rtl_str_compare( const sal_Char * first, const sal_Char * second ) +{ + sal_Int32 nRet; + while ( ((nRet = ((sal_Int32)(*first))-((sal_Int32)(*second))) == 0) && + *second ) + { + first++; + second++; + } + + return nRet; +} + +/************************************************************************* + * rtl_str_hashCode_WithLength + */ +sal_Int32 SAL_CALL rtl_str_hashCode_WithLength( const sal_Char * str, sal_Int32 len ) +{ + sal_Int32 h = 0; + const sal_Char * pVal = str; + sal_Int32 length = len; + + if( length < 16 ) + { + while( *pVal ) + h = (h * 37) + *pVal++; + } + else + { + sal_Int32 off = 0; + sal_Int32 i; + /* only sample some characters */ + sal_Int32 skip = length / 8; + for( i = length ; i > 0; i -= skip, off += skip ) + { + h = (h * 39) + pVal[off]; + } + } + + return h; +} + +/************************************************************************* + * rtl_str_hashCode + */ +sal_Int32 SAL_CALL rtl_str_hashCode( const sal_Char * str ) +{ + return rtl_str_hashCode_WithLength(str, rtl_str_getLength(str)); +} + +/************************************************************************* + * rtl_str_indexOfChar_WithLength + */ +sal_Int32 SAL_CALL rtl_str_indexOfChar_WithLength( const sal_Char * str, + sal_Int32 len, + sal_Char ch ) +{ + sal_Char* pTmp = (sal_Char*) rtl_findInMemory(str, ch, len); + + if (pTmp == NULL) + /* Zeichen nicht gefunden */ + return (-1); + else + return(pTmp - str); +} + +/************************************************************************* + * rtl_str_indexOfChar + */ +sal_Int32 SAL_CALL rtl_str_indexOfChar( const sal_Char * str, sal_Char ch ) +{ + return rtl_str_indexOfChar_WithLength(str, rtl_str_getLength(str), ch); +} + +/************************************************************************* + * rtl_str_lastIndexOfChar_WithLength + */ +sal_Int32 SAL_CALL rtl_str_lastIndexOfChar_WithLength( const sal_Char * str, + sal_Int32 len, + sal_Char ch ) +{ + sal_Int32 index = len - 1; + + while ( index >= 0 ) + { + if ( *(str + index) == ch ) + /* Zeichen gefunden */ + return index; + + /* Naechstes Zeichen */ + index--; + } + + /* Zeichen nicht gefunden */ + return -1; +} + +/************************************************************************* + * rtl_str_lastIndexOfChar + */ +sal_Int32 SAL_CALL rtl_str_lastIndexOfChar( const sal_Char * str, sal_Char ch ) +{ + return rtl_str_lastIndexOfChar_WithLength(str, rtl_str_getLength(str), ch); +} + +/************************************************************************* + * rtl_str_indexOfStr_WithLength + */ +sal_Int32 SAL_CALL rtl_str_indexOfStr_WithLength( const sal_Char * str, + sal_Int32 len, + const sal_Char * subStr, + sal_Int32 subLen ) +{ + sal_Int32 index = 0; + + if (len < subLen) + return -1; + + while ( *str ) + { + if ( *str == *subStr) + { + sal_Int32 offset = 0; + + /* wenn die restliche Laenge kleiner als der zu suchende string ist + kann der nicht mehr gefunden werden */ + if ((len - index) < subLen) + return -1; + + while ( offset != subLen) + { + if ( *(str + offset) != *(subStr + offset)) + break; + + offset++; + } + + /* Schleife komplett durchlaufen, d.h. string gefunden */ + if ( offset == subLen) + return index; + } + + index++; + str++; + } + + return -1; +} + +/************************************************************************* + * rtl_str_indexOfStr + */ +sal_Int32 SAL_CALL rtl_str_indexOfStr( const sal_Char * str, const sal_Char * subStr ) +{ + return rtl_str_indexOfStr_WithLength( str, rtl_str_getLength(str), + subStr, rtl_str_getLength(subStr) ); +} + +/************************************************************************* + * rtl_str_lastIndexOfStr_WithLength + */ +sal_Int32 SAL_CALL rtl_str_lastIndexOfStr_WithLength( const sal_Char * pSource, + sal_Int32 len, + const sal_Char * pSearch, + sal_Int32 nSearchLen ) +{ + const sal_Char * pRunSource = pSource + len -1; + while( pRunSource >= pSource && pRunSource - pSource >= nSearchLen ) + { + const sal_Char * pRunSearch = pSearch + nSearchLen -1; + const sal_Char * pSaveRunSource = pRunSource; + while( pRunSearch >= pSearch && *pRunSearch == *(pRunSource--) ) + pRunSearch--; + + if( pRunSearch < pSearch ) + return pRunSource - pSource +1; + pRunSource = pSaveRunSource; + pRunSource--; + } + return -1; +} + +/************************************************************************* + * rtl_str_lastIndexOfStrPtr + */ +sal_Int32 SAL_CALL rtl_str_lastIndexOfStr( const sal_Char * str, const sal_Char * subStr ) +{ + return rtl_str_lastIndexOfStr_WithLength( str, rtl_str_getLength(str), + subStr, rtl_str_getLength(subStr) ); +} + +/************************************************************************* + * rtl_str_replaceChar_WithLength + */ +void SAL_CALL rtl_str_replaceChar_WithLength( sal_Char * str, + sal_Int32 len, + sal_Char oldChar, + sal_Char newChar) +{ + while ( *str ) + { + if ( *str == oldChar) + *str = newChar; + + str++; + } +} + +/************************************************************************* + * rtl_str_replaceChar + */ +void SAL_CALL rtl_str_replaceChar( sal_Char * str, sal_Char oldChar, sal_Char newChar) +{ + while ( *str ) + { + if ( *str == oldChar) + *str = newChar; + + str++; + } +} + +/************************************************************************* + * rtl_str_toAsciiLowerCase_WithLength + */ +void SAL_CALL rtl_str_toAsciiLowerCase_WithLength( sal_Char * str, sal_Int32 len ) +{ + while ( *str ) + { + if ( (*str >= 65) && (*str <= 90) ) + *str += 32; + + str++; + } +} + +/************************************************************************* + * rtl_str_toAsciiLowerCase + */ +void SAL_CALL rtl_str_toAsciiLowerCase( sal_Char * str ) +{ + while ( *str ) + { + if ( (*str >= 65) && (*str <= 90) ) + *str += 32; + + str++; + } +} + +/************************************************************************* + * rtl_str_toAsciiUpperCase_WithLength + */ +void SAL_CALL rtl_str_toAsciiUpperCase_WithLength( sal_Char * str, sal_Int32 len ) +{ + while ( *str ) + { + if ( (*str >= 97) && (*str <= 122) ) + *str -= 32; + + str++; + } +} + +/************************************************************************* + * rtl_str_toAsciiUpperCase + */ +void SAL_CALL rtl_str_toAsciiUpperCase( sal_Char * str ) +{ + while ( *str ) + { + if ( (*str >= 97) && (*str <= 122) ) + *str -= 32; + + str++; + } +} + +/************************************************************************* + * rtl_str_trim_WithLength + */ +sal_Int32 SAL_CALL rtl_str_trim_WithLength( sal_Char * str, sal_Int32 len ) +{ + sal_Int32 preSpaces = 0; + sal_Int32 postSpaces = 0; + sal_Int32 newLen = 0; + sal_Int32 index = len - 1; + + while ( (preSpaces < len) && (*(str+preSpaces) == ' ') ) + preSpaces++; + + while ( (index > preSpaces) && (*(str+index) == ' ') ) + { + postSpaces++; + index--; + } + + newLen = len - preSpaces - postSpaces; + + if ( newLen != len ) + { + sal_Char *newStr = str + preSpaces; + index = 0; + + while ( index != newLen ) + { + *(str + index) = *(newStr + index); + index++; + } + *(str + index) = '\0'; + } + + return newLen; +} + +/************************************************************************* + * rtl_str_trim + */ +sal_Int32 SAL_CALL rtl_str_trim( sal_Char * str ) +{ + return rtl_str_trim_WithLength(str, rtl_str_getLength(str)); +} + +/************************************************************************* + * rtl_str_valueOfosl_BOOL + */ +sal_Int32 SAL_CALL rtl_str_valueOfBoolean( sal_Char * str, sal_Bool b ) +{ + if (b) + { + sal_Char *tmpStr = "True"; + rtl_copyMemory(str, tmpStr, 5); + return 4; + } else + { + sal_Char *tmpStr = "False"; + rtl_copyMemory(str, tmpStr, 6); + return 5; + } +} + +/************************************************************************* + * rtl_str_valueOfChar + */ +sal_Int32 SAL_CALL rtl_str_valueOfChar( sal_Char * str, sal_Char ch ) +{ + str[0] = ch; + str[1] = L'\0'; + return 1; +} + +/************************************************************************* + * rtl_str_valueOfosl_INT32 + */ +sal_Int32 SAL_CALL rtl_str_valueOfInt32(sal_Char * str, sal_Int32 i, sal_Int16 radix ) +{ + sal_Char buf[RTL_STR_MAX_VALUEOFINT32]; + sal_Bool negative = (i < 0); + sal_Int32 charPos = RTL_STR_MAX_VALUEOFINT32 - 1; + + if (radix < RTL_STR_MIN_RADIX || radix > RTL_STR_MAX_RADIX) + radix = 10; + + if (!negative) { + i = -i; + } + + while (i <= -radix) { + buf[charPos--] = RTL_STR_DIGITS[-(i % radix)]; + i = i / radix; + } + buf[charPos] = RTL_STR_DIGITS[-i]; + + if (negative) { + buf[--charPos] = '-'; + } + + rtl_copyMemory(str, buf + charPos, RTL_STR_MAX_VALUEOFINT32 - charPos); + + return (RTL_STR_MAX_VALUEOFINT32 - charPos); +} + +/************************************************************************* + * rtl_str_valueOfosl_INT64 + */ +sal_Int32 SAL_CALL rtl_str_valueOfInt64(sal_Char * str, sal_Int64 l, sal_Int16 radix ) +{ +#ifndef SAL_INT64_IS_STRUCT + sal_Char buf[RTL_STR_MAX_VALUEOFINT64]; + sal_Int32 charPos = RTL_STR_MAX_VALUEOFINT64 - 1; + sal_Bool negative = (l < 0); + + if (radix < RTL_STR_MIN_RADIX || radix > RTL_STR_MAX_RADIX) + radix = 10; + + if (!negative) { + l = -l; + } + + while (l <= -radix) { + buf[charPos--] = RTL_STR_DIGITS[(sal_Int32)(-(l % radix))]; + l = l / radix; + } + buf[charPos] = RTL_STR_DIGITS[(sal_Int32)(-l)]; + + if (negative) { + buf[--charPos] = '-'; + } + + rtl_copyMemory(str, buf + charPos, RTL_STR_MAX_VALUEOFINT64 - charPos ); + + return (RTL_STR_MAX_VALUEOFINT64 - charPos); +#else + return 0; +#endif +} + +/************************************************************************* + * rtl_str_valueOfFloat + */ +sal_Int32 SAL_CALL rtl_str_valueOfFloat( sal_Char * This, float f) +{ + return 0; +} + +/************************************************************************* + * rtl_str_valueOfDouble + */ +sal_Int32 SAL_CALL rtl_str_valueOfDouble( sal_Char * This, double d) +{ + return 0; +} + +/************************************************************************* + * + * rtl_string_XXX Functions + * +/************************************************************************* + +/************************************************************************* + * rtl_string_acquire + */ +void SAL_CALL rtl_string_acquire( rtl_String * value ) +{ + osl_incrementInterlockedCount(&value->refCount); +} + +/************************************************************************* + * rtl_string_release + */ +void SAL_CALL rtl_string_release( rtl_String * value ) +{ + if( 0 == osl_decrementInterlockedCount(&value->refCount) ) + { + OSL_ENSHURE( value != &aEmpty_rtl_String, "static empty string: refCount==0"); + rtl_freeMemory(value); + } +} + +/************************************************************************* + * rtl_string_new + */ +void SAL_CALL rtl_string_new( rtl_String ** newStr ) +{ + if (*newStr) + rtl_string_release(*newStr); + + *newStr = &aEmpty_rtl_String; + rtl_string_acquire( *newStr ); +} + +/************************************************************************* + * rtl_string_new_WithLength + */ +void SAL_CALL rtl_string_new_WithLength( rtl_String ** newStr, sal_Int32 nLen ) +{ + if (*newStr) + rtl_string_release(*newStr); + + *newStr = (rtl_String*)rtl_allocateMemory( sizeof(rtl_String) + nLen ); + + if (!(*newStr)) return; + + (*newStr)->refCount = 1; + (*newStr)->length = 0; + + rtl_zeroMemory((*newStr)->buffer, nLen + 1); +} + +/************************************************************************* + * rtl_string_newFromString + */ +void SAL_CALL rtl_string_newFromString( rtl_String ** newStr, rtl_String * value ) +{ + rtl_String * pOrg; + + if (value->length == 0) + { + rtl_string_new(newStr); + return; + } + + pOrg = *newStr; + *newStr = (rtl_String*)rtl_allocateMemory( sizeof(rtl_String) + value->length ); + if ( *newStr ) + { + (*newStr)->refCount = 1; + (*newStr)->length = value->length; + rtl_copyMemory( (*newStr)->buffer, value->buffer, value->length+1 ); + } + + /* must be done at least, if left == *newStr */ + if ( pOrg ) + rtl_string_release(pOrg); +} + +/************************************************************************* + * rtl_string_newFromStr + */ +void SAL_CALL rtl_string_newFromStr( rtl_String ** newStr, const sal_Char * value ) +{ + rtl_String * pOrg; + sal_Int32 length; + + if (!value) + { + rtl_string_new(newStr); + return; + } + + length = rtl_str_getLength(value); + + pOrg = *newStr; + *newStr = (rtl_String*)rtl_allocateMemory( sizeof(rtl_String) + length ); + if ( *newStr ) + { + (*newStr)->refCount = 1; + (*newStr)->length = length; + rtl_copyMemory((*newStr)->buffer, value, length+1 ); + } + + /* must be done at least, if left == *newStr */ + if ( pOrg ) + rtl_string_release(pOrg); +} + +/************************************************************************* + * rtl_string_newFromStr_WithLength + */ +void SAL_CALL rtl_string_newFromStr_WithLength( rtl_String ** newStr, const sal_Char * value, sal_Int32 len ) +{ + rtl_String * pOrg; + + if ( !value || len < 0 ) + { + rtl_string_new(newStr); + return; + } + + pOrg = *newStr; + *newStr = (rtl_String*)rtl_allocateMemory( sizeof(rtl_String) + len ); + if ( *newStr ) + { + (*newStr)->refCount = 1; + (*newStr)->length = len; + rtl_copyMemory((*newStr)->buffer, value, len ); + (*newStr)->buffer[len] = 0; + } + + /* must be done at least, if left == *newStr */ + if ( pOrg ) + rtl_string_release(pOrg); +} + +/************************************************************************* + * rtl_string_assign + */ +void SAL_CALL rtl_string_assign( /*inout*/rtl_String ** str, rtl_String * rightValue ) +{ + rtl_string_acquire(rightValue); + + if (*str) + rtl_string_release(*str); + + *str = rightValue; +} + +/************************************************************************* + * rtl_string_getLength + */ +sal_Int32 SAL_CALL rtl_string_getLength( rtl_String * str ) +{ + return str->length; +} + +/************************************************************************* + * rtl_string_getStr + */ +sal_Char * SAL_CALL rtl_string_getStr( rtl_String * str ) +{ + return str->buffer; +} + +/************************************************************************* + * rtl_string_newConcat + */ +void SAL_CALL rtl_string_newConcat( rtl_String ** newStr, rtl_String * left, rtl_String * right ) +{ + rtl_String * pOrg = *newStr; + if( !right->length ) + { + *newStr = left; + rtl_string_acquire( left ); + } + else if( !left->length ) + { + *newStr = right; + rtl_string_acquire( right ); + } + else + { + rtl_String *tmpStr = NULL; + sal_Int32 nNewLen = left->length + right->length; + rtl_string_new_WithLength(&tmpStr, nNewLen); + tmpStr->length = nNewLen; + + rtl_copyMemory( tmpStr->buffer, left->buffer, left->length ); + rtl_copyMemory( tmpStr->buffer + left->length, right->buffer, right->length ); + tmpStr->buffer[nNewLen] = 0; + *newStr = tmpStr; + } + /* must be done at least, if left == *newStr */ + if( pOrg ) + rtl_string_release(pOrg); +} + +/************************************************************************* + * rtl_string_newReplace + */ +void SAL_CALL rtl_string_newReplace( rtl_String ** newStr, + rtl_String * str, + sal_Char oldChar, + sal_Char newChar) +{ + rtl_string_newFromString(newStr, str); + + if (!(*newStr)) return; + + rtl_str_replaceChar_WithLength( (*newStr)->buffer, (*newStr)->length, oldChar, newChar ); +} + +/************************************************************************* + * rtl_string_newReplaceStrAt + */ +void SAL_CALL rtl_string_newReplaceStrAt( rtl_String ** newStr, + rtl_String * str, + sal_Int32 index, + sal_Int32 count, + rtl_String * newSub) +{ + sal_Char *pBuffer = NULL; + + if (count == 0 && newSub->length == 0) + { + rtl_string_newFromString(newStr, str); + return; + } + + if (count == 0) + { + rtl_string_new_WithLength(newStr, str->length + newSub->length); + if (!(*newStr)) return; + pBuffer = (*newStr)->buffer; + (*newStr)->length = str->length + newSub->length; + rtl_copyMemory(pBuffer, str->buffer, index); + rtl_copyMemory(pBuffer + index, newSub->buffer, newSub->length); + rtl_copyMemory(pBuffer + index + newSub->length, str->buffer + index, str->length - index); + + return; + } + + if (newSub->length == 0) + { + rtl_string_new_WithLength(newStr, str->length - count); + if (!(*newStr)) return; + pBuffer = (*newStr)->buffer; + (*newStr)->length = str->length - count; + rtl_copyMemory(pBuffer, str->buffer, index); + rtl_copyMemory(pBuffer + index, str->buffer + index + count, str->length - index - count); + + return; + } + + rtl_string_new_WithLength(newStr, str->length - count + newSub->length); + if (!(*newStr)) return; + pBuffer = (*newStr)->buffer; + (*newStr)->length = str->length - count + newSub->length; + rtl_copyMemory(pBuffer, str->buffer, index); + rtl_copyMemory(pBuffer + index, newSub->buffer, newSub->length); + rtl_copyMemory(pBuffer + index + newSub->length, str->buffer + index + count, + str->length - index - count); + + return; +} + +/************************************************************************* + * rtl_String_newToLowerCase + */ +void SAL_CALL rtl_string_newToLowerCase( rtl_String ** newStr, rtl_String * str) +{ + rtl_string_newFromString(newStr, str); + + if (!(*newStr)) return; + + rtl_str_toAsciiLowerCase_WithLength((*newStr)->buffer, (*newStr)->length); +} + +/************************************************************************* + * rtl_String_newToUpperCase + */ +void SAL_CALL rtl_string_newToUpperCase( rtl_String ** newStr, rtl_String * str) +{ + rtl_string_newFromString(newStr, str); + + if (!(*newStr)) return; + + rtl_str_toAsciiUpperCase_WithLength((*newStr)->buffer, (*newStr)->length); +} + +/************************************************************************* + * rtl_string_newTrim + */ +void SAL_CALL rtl_string_newTrim( rtl_String ** newStr, rtl_String * str ) +{ + rtl_string_newFromString(newStr, str); + + if (!(*newStr)) return; + + (*newStr)->length = rtl_str_trim_WithLength((*newStr)->buffer, (*newStr)->length); +} + +/************************************************************************* + * rtl_string_getTokenCount + */ +sal_Int32 SAL_CALL rtl_string_getTokenCount( rtl_String * str , sal_Char cTok) +{ + sal_Int32 count = 0; + sal_Int32 index1 = 0; + sal_Int32 index2 = 0; + sal_Char *buffer = str->buffer; + + while ((index2 = rtl_str_indexOfChar_WithLength(buffer + index1, str->length - index1, cTok)) >= 0) + { + if (index2 <= (str->length - index1) && index2 >= 0) + count++; + + index1 += index2 + 1; + } + + if (index2 < 0 && index1 <= str->length) + count++; + + return count; +} + +/************************************************************************* + * rtl_string_getToken + */ +void SAL_CALL rtl_string_getToken( rtl_String ** newStr , rtl_String * str, sal_Int32 nToken, sal_Char cTok) +{ + sal_Int32 count = 0; + sal_Int32 index1 = 0; + sal_Int32 index2 = 0; + sal_Char *buffer = str->buffer; + + while ((index2 = rtl_str_indexOfChar_WithLength(buffer + index1, str->length - index1, cTok)) >= 0) + { + if (count == nToken) + { + rtl_string_newFromStr_WithLength( newStr, buffer + index1, index2 ); + return; + } + + if (index2 <= (str->length - index1) && index2 >= 0) + count++; + + index1 += index2 + 1; + } + + if (nToken == 0 || nToken == count) + rtl_string_newFromStr_WithLength( newStr, buffer + index1, str->length - index1 ); + else + rtl_string_new(newStr); + + return; +} + diff --git a/sal/rtl/source/ustrbuf.c b/sal/rtl/source/ustrbuf.c new file mode 100644 index 000000000000..7e31c50af8c2 --- /dev/null +++ b/sal/rtl/source/ustrbuf.c @@ -0,0 +1,234 @@ +/************************************************************************* + * + * $RCSfile: ustrbuf.c,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:17:24 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +#ifndef _OSL_INTERLOCK_H_ +#include +#endif + +#ifndef _RTL_STRING_HXX_ +#include +#endif + +#ifndef _RTL_MEMORY_H_ +#include +#endif + +/* +#ifndef _RTL_ALLOC_H_ +#include +#endif +*/ + + + +/************************************************************************* + * 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; + } + + if (*newStr) + rtl_uString_release(*newStr); + + 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 (*newStr) + rtl_uString_release(*newStr); + + if (newCapacity < oldStr->length) + newCapacity = oldStr->length; + + rtl_uString_new_WithLength( newStr, newCapacity ); + (*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; + } +} + +/************************************************************************* + * 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_ENSHURE( (*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..fe97fedb7aa2 --- /dev/null +++ b/sal/rtl/source/ustring.c @@ -0,0 +1,1774 @@ +/************************************************************************* + * + * $RCSfile: ustring.c,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:17:24 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +#ifndef _OSL_INTERLOCK_H_ +#include +#endif + +#ifndef _OSL_DIAGNOSE_H_ +#include +#endif + +#ifndef _SAL_CONFIG_H_ +#include +#endif + +#ifndef _RTL_CHAR_H_ +#include +#endif + +#ifndef _RTL_USTRING_H_ +#include +#endif + +#ifndef _RTL_USTRING_ +#include +#endif + +#ifndef _RTL_LOCALE_H_ +#include +#endif + +#ifndef _RTL_MEMORY_H_ +#include +#endif + +#ifndef _RTL_ALLOC_H_ +#include +#endif + +#ifndef _RTL_TEXTCVT_H +#include +#endif + +#ifndef _RTL_TENCINFO_H +#include +#endif + +#include + + +static sal_Char const RTL_STR_DIGITS[] = +{ + '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 data to be referenced by all empty strings + * the refCount is predefined to 1 and must never become 0 ! + */ +static rtl_uString aEmpty_rtl_wString = +{ + 1, /* sal_Int32 refCount; */ + 0, /* sal_Int32 length; */ + 0 /* sal_Unicode buffer[1]; */ +}; + +/************************************************************************* + * rtl_ustr_getLength + */ +sal_Int32 SAL_CALL rtl_ustr_getLength( const sal_Unicode * str ) +{ + const sal_Unicode * pTempStr = str; + while( *pTempStr ) pTempStr++; + return pTempStr - str; +} + +/************************************************************************* + * rtl_ustr_equalsIgnoreCase_WithLength + */ +sal_Bool SAL_CALL rtl_ustr_equalsIgnoreCase_WithLength( const sal_Unicode * first, + sal_Int32 firstLen, + const sal_Unicode * second, + sal_Int32 secondLen ) +{ + sal_Unicode a; + sal_Unicode b; + + if (firstLen != secondLen) + return sal_False; + + while ( firstLen ) + { + a = rtl_char_toUpperCase(*first); + b = rtl_char_toUpperCase(*second); + + /* Naechstes Zeichen */ + first++; + second++; + firstLen--; + + /* If characters don't match but case may be ignored, + try converting both characters to uppercase. + If the results match, then the comparison scan should + continue. */ + if ( a == b ) + continue; + + /* Unfortunately, conversion to uppercase does not work properly + for the Georgian alphabet, which has strange rules about case + conversion. So we need to make one last check before + exiting. */ + if ( rtl_char_toLowerCase(a) == rtl_char_toLowerCase(b) ) + continue; + + return sal_False; + } + + return sal_True; /* Strings sind gleich */ +} + +/************************************************************************* + * rtl_ustr_equalsIgnoreCase + */ +sal_Bool SAL_CALL rtl_ustr_equalsIgnoreCase( const sal_Unicode * first, const sal_Unicode * second ) +{ + return rtl_ustr_equalsIgnoreCase_WithLength( first, rtl_ustr_getLength(first), + second, rtl_ustr_getLength(second) ); +} + +/************************************************************************* + * rtl_ustr_compare_WithLength + */ +sal_Int32 SAL_CALL rtl_ustr_compare_WithLength( const sal_Unicode * first, + sal_Int32 firstLen, + const sal_Unicode * second, + sal_Int32 secondLen ) +{ + const sal_Unicode * firstEnd = first + firstLen; + const sal_Unicode * secondEnd = second + secondLen; + sal_Int32 nResult = 0; + while( first < firstEnd && second < secondEnd + && (0 == (nResult = (sal_Int32)*first++ - (sal_Int32)*second++ ) ) ) + ; + if( nResult ) + return nResult; + return firstLen - secondLen; +} + +/************************************************************************* + * rtl_ustr_compare_WithLength + */ +sal_Int32 SAL_CALL rtl_ustr_shortenedCompare_WithLength( const sal_Unicode * first, + sal_Int32 firstLen, + const sal_Unicode * second, + sal_Int32 secondLen, + sal_Int32 shortenedLength ) +{ + const sal_Unicode * firstEnd = first + firstLen; + const sal_Unicode * secondEnd = second + secondLen; + sal_Int32 nResult = 0; + while( shortenedLength-- && first < firstEnd && second < secondEnd + && (0 == (nResult = (sal_Int32)*first++ - (sal_Int32)*second++ ) ) ) + ; + if( nResult || !(shortenedLength != -1) ) + return nResult; + return firstLen - secondLen; +} + +/************************************************************************* + * rtl_ustr_compare + */ +sal_Int32 SAL_CALL rtl_ustr_compare( const sal_Unicode * first, const sal_Unicode * second ) +{ + sal_Int32 nRet; + while ( ((nRet = ((sal_Int32)*first)-((sal_Int32)*second)) == 0) && + *second ) + { + first++; + second++; + } + + return nRet; +} + +/************************************************************************* + * rtl_ustr_ascii_compare_WithLength + */ +sal_Int32 SAL_CALL rtl_ustr_ascii_compare_WithLength( const sal_Unicode * first, + sal_Int32 firstLen, + const sal_Char * second ) +{ + return rtl_ustr_ascii_shortenedCompare_WithLength( first, firstLen, second, 0x7FFFFFF ); +} + +/************************************************************************* + * rtl_ustr_ascii_compare + */ +sal_Int32 SAL_CALL rtl_ustr_ascii_compare( const sal_Unicode * first, const sal_Char * second ) +{ + sal_Int32 nRet; + while ( ((nRet = ((sal_Int32)*first)-((sal_Int32)*second)) == 0) && + *second ) + { + first++; + second++; + } + + return nRet; +} + +/************************************************************************* + * rtl_ustr_ascii_shortenedCompare_WithLength + */ +sal_Int32 SAL_CALL rtl_ustr_ascii_shortenedCompare_WithLength( const sal_Unicode * first, + sal_Int32 firstLen, + const sal_Char * second, + sal_Int32 shortenedLength ) +{ + const sal_Unicode * firstEnd = first + firstLen; + sal_Int32 nResult = 0; + while( shortenedLength-- + && first < firstEnd + && *second // necessary if 0 is allowed in Unicode + && (0 == (nResult = (sal_Int32)*first++ - (sal_Int32)*second++ ) ) ) + { + /* Check ASCII range */ + OSL_ENSHURE( (*(second-1) & 0x80) == 0, "Found ASCII char > 127"); + } + if( !nResult && (shortenedLength != -1) ) + { + if( *second ) + { + OSL_ENSHURE( first == firstEnd, "first == firstEnd failed" ); + // first is a substring of the second string => less (negative value) + nResult = -1; + } + else + // greater or equal + nResult = firstEnd - first; + } + + return nResult; +} + +/************************************************************************* + * rtl_ustr_asciil_reverseCompare_WithLength + */ +sal_Int32 SAL_CALL rtl_ustr_asciil_reverseCompare_WithLength( const sal_Unicode * first, sal_Int32 firstLen, + const sal_Char * second, sal_Int32 secondLen ) +{ + const sal_Unicode * firstRun = first + firstLen; + const sal_Char * secondRun = second + secondLen; + sal_Int32 nResult = 0; + while( first < firstRun && second < secondRun + && (0 == (nResult = (sal_Int32)*--firstRun - (sal_Int32)*--secondRun ) ) ) + ; + if( nResult ) + return nResult; + return firstLen - secondLen; +} + + +/************************************************************************* + * rtl_ustr_hashCode_WithLength + */ +sal_Int32 SAL_CALL rtl_ustr_hashCode_WithLength( const sal_Unicode * str, sal_Int32 len ) +{ + sal_Int32 h = 0; + const sal_Unicode * pVal = str; + sal_Int32 length = len; + + if( length < 16 ) + { + while( *pVal ) + h = (h * 37) + *pVal++; + } + else + { + sal_Int32 off = 0; + sal_Int32 i; + /* only sample some characters */ + sal_Int32 skip = length / 8; + for( i = length ; i > 0; i -= skip, off += skip ) + { + h = (h * 39) + pVal[off]; + } + } + + return h; +} + +/************************************************************************* + * rtl_ustr_hashCode + */ +sal_Int32 SAL_CALL rtl_ustr_hashCode( const sal_Unicode * str ) +{ + return rtl_ustr_hashCode_WithLength(str, rtl_ustr_getLength(str)); +} + +/************************************************************************* + * rtl_ustr_indexOfChar_WithLength + */ +sal_Int32 SAL_CALL rtl_ustr_indexOfChar_WithLength( const sal_Unicode * str, + sal_Int32 len, + sal_Unicode ch ) +{ + sal_Int32 index = 0; + + while ( index != len ) + { + if (!(*str)) + return -1;; + + if ( *str == ch ) + /* Zeichen gefunden */ + return index; + + /* Naechstes Zeichen */ + index++; + str++; + } + + /* Zeichen nicht gefunden */ + return -1; +} + +/************************************************************************* + * rtl_ustr_indexOfChar + */ +sal_Int32 SAL_CALL rtl_ustr_indexOfChar( const sal_Unicode * str, sal_Unicode ch ) +{ + return rtl_ustr_indexOfChar_WithLength(str, rtl_ustr_getLength(str), ch); +} + +/************************************************************************* + * rtl_ustr_lastIndexOfChar_WithLength + */ +sal_Int32 SAL_CALL rtl_ustr_lastIndexOfChar_WithLength( const sal_Unicode * str, + sal_Int32 len, + sal_Unicode ch ) +{ + sal_Int32 index = len - 1; + + while ( index >= 0 ) + { + if ( *(str + index) == ch ) + /* Zeichen gefunden */ + return index; + + /* Naechstes Zeichen */ + index--; + } + + /* Zeichen nicht gefunden */ + return -1; +} + +/************************************************************************* + * rtl_ustr_lastIndexOfChar + */ +sal_Int32 SAL_CALL rtl_ustr_lastIndexOfChar( const sal_Unicode * str, sal_Unicode ch ) +{ + return rtl_ustr_lastIndexOfChar_WithLength(str, rtl_ustr_getLength(str), ch); +} + +/************************************************************************* + * rtl_ustr_indexOfStr_WithLength + */ +sal_Int32 SAL_CALL rtl_ustr_indexOfStr_WithLength( const sal_Unicode * str, + sal_Int32 len, + const sal_Unicode * subStr, + sal_Int32 subLen ) +{ + sal_Int32 index = 0; + + if (len < subLen) + return -1; + + while ( *str ) + { + if ( *str == *subStr) + { + sal_Int32 offset = 0; + + /* wenn die restliche Laenge kleiner als der zu suchende string ist + kann der nicht mehr gefunden werden */ + if ((len - index) < subLen) + return -1; + + while ( offset != subLen) + { + if ( *(str + offset) != *(subStr + offset)) + break; + + offset++; + } + + /* Schleife komplett durchlaufen, d.h. string gefunden */ + if ( offset == subLen) + return index; + } + + index++; + str++; + } + + return -1; +} + +/************************************************************************* + * rtl_ustr_indexOfStr + */ +sal_Int32 SAL_CALL rtl_ustr_indexOfStr( const sal_Unicode * str, const sal_Unicode * subStr ) +{ + return rtl_ustr_indexOfStr_WithLength( str, rtl_ustr_getLength(str), + subStr, rtl_ustr_getLength(subStr) ); +} + +/************************************************************************* + * rtl_ustr_lastIndexOfStr_WithLength + */ +sal_Int32 SAL_CALL rtl_ustr_lastIndexOfStr_WithLength( const sal_Unicode * pSource, + sal_Int32 len, + const sal_Unicode * pSearch, + sal_Int32 nSearchLen ) +{ + const sal_Unicode * pRunSource = pSource + len -1; + while( pRunSource >= pSource && pRunSource - pSource >= nSearchLen ) + { + const sal_Unicode * pRunSearch = pSearch + nSearchLen -1; + const sal_Unicode * pSaveRunSource = pRunSource; + while( pRunSearch >= pSearch && *(pRunSearch--) == *(pRunSource--) ) + ; + if( pRunSearch < pSearch ) + return pRunSource - pSource +1; + pRunSource = pSaveRunSource; + pRunSource--; + } + return -1; +} + +/************************************************************************* + * rtl_ustr_lastIndexOfStrPtr + */ +sal_Int32 SAL_CALL rtl_ustr_lastIndexOfStr( const sal_Unicode * str, const sal_Unicode * subStr ) +{ + return rtl_ustr_lastIndexOfStr_WithLength( str, rtl_ustr_getLength(str), + subStr, rtl_ustr_getLength(subStr) ); +} + +/************************************************************************* + * rtl_ustr_replaceChar_WithLength + */ +void SAL_CALL rtl_ustr_replaceChar_WithLength( sal_Unicode * str, + sal_Int32 len, + sal_Unicode oldChar, + sal_Unicode newChar) +{ + while ( *str ) + { + if ( *str == oldChar) + *str = newChar; + + str++; + } +} + +/************************************************************************* + * rtl_ustr_replaceChar + */ +void SAL_CALL rtl_ustr_replaceChar( sal_Unicode * str, sal_Unicode oldChar, sal_Unicode newChar) +{ + while ( *str ) + { + if ( *str == oldChar) + *str = newChar; + + str++; + } +} + +/************************************************************************* + * rtl_ustr_toAsciiLowerCase_WithLength + */ +void SAL_CALL rtl_ustr_toAsciiLowerCase_WithLength( sal_Unicode * str, sal_Int32 len ) +{ + sal_Unicode ch; + + while ( *str ) + { + ch = *str; + *str = rtl_char_toLowerCase(ch); + str++; + } +} + +/************************************************************************* + * rtl_ustr_toAsciiLowerCase + */ +void SAL_CALL rtl_ustr_toAsciiLowerCase( sal_Unicode * str ) +{ + sal_Unicode ch; + + while ( *str ) + { + ch = *str; + *str = rtl_char_toLowerCase(ch); + str++; + } +} + +/************************************************************************* + * rtl_ustr_toAsciiUpperCase_WithLength + */ +void SAL_CALL rtl_ustr_toAsciiUpperCase_WithLength(sal_Unicode * str, sal_Int32 len) +{ + sal_Unicode ch; + + while ( *str ) + { + ch = *str; + *str = rtl_char_toUpperCase(ch); + str++; + } +} + +/************************************************************************* + * rtl_ustr_toAsciiUpperCase + */ +void SAL_CALL rtl_ustr_toAsciiUpperCase(sal_Unicode * str) +{ + sal_Unicode ch; + + while ( *str ) + { + ch = *str; + *str = rtl_char_toUpperCase(ch); + str++; + } +} + +/************************************************************************* + * rtl_ustr_trim_WithLength + */ +sal_Int32 SAL_CALL rtl_ustr_trim_WithLength( sal_Unicode * str, sal_Int32 len ) +{ + sal_Int32 preSpaces = 0; + sal_Int32 postSpaces = 0; + sal_Int32 newLen = 0; + sal_Int32 index = len - 1; + + while ( (preSpaces < len) && rtl_char_isWhitespace(*(str+preSpaces)) ) + preSpaces++; + + while ( (index > preSpaces) && rtl_char_isWhitespace(*(str+index)) ) + { + postSpaces++; + index--; + } + + newLen = len - preSpaces - postSpaces; + + if ( newLen != len ) + { + sal_Unicode *newStr = str + preSpaces; + index = 0; + + while ( index != newLen ) + { + *(str + index) = *(newStr + index); + index++; + } + *(str + index) = 0; + } + + return newLen; +} + +/************************************************************************* + * rtl_ustr_trim + */ +sal_Int32 SAL_CALL rtl_ustr_trim( sal_Unicode * str ) +{ + return rtl_ustr_trim_WithLength(str, rtl_ustr_getLength(str)); +} + +/************************************************************************* + * rtl_ustr_valueOfosl_BOOL + */ +sal_Int32 SAL_CALL rtl_ustr_valueOfBoolean( sal_Unicode * str, sal_Bool b ) +{ + if (b) + { + sal_Unicode *tmpStr = L"True"; + rtl_copyMemory(str, tmpStr, 5 * sizeof(sal_Unicode)); + return 4; + } else + { + sal_Unicode *tmpStr = L"False"; + rtl_copyMemory(str, tmpStr, 6 * sizeof(sal_Unicode)); + return 5; + } +} + +/************************************************************************* + * rtl_ustr_valueOfChar + */ +sal_Int32 SAL_CALL rtl_ustr_valueOfChar( sal_Unicode * str, sal_Unicode ch ) +{ + str[0] = ch; + str[1] = L'\0'; + return 1; +} + +/************************************************************************* + * rtl_ustr_valueOfosl_INT32 + */ +sal_Int32 SAL_CALL rtl_ustr_valueOfInt32(sal_Unicode * str, sal_Int32 i, sal_Int16 radix ) +{ + sal_Unicode buf[RTL_USTR_MAX_VALUEOFINT32]; + sal_Bool negative = (i < 0); + sal_Int32 charPos = RTL_USTR_MAX_VALUEOFINT32 - 1; + + if (radix < RTL_USTR_MIN_RADIX || radix > RTL_USTR_MAX_RADIX) + radix = 10; + + if (!negative) { + i = -i; + } + + while (i <= -radix) { + buf[charPos--] = RTL_STR_DIGITS[-(i % radix)]; + i = i / radix; + } + buf[charPos] = RTL_STR_DIGITS[-i]; + + if (negative) { + buf[--charPos] = '-'; + } + + rtl_copyMemory(str, buf + charPos, (RTL_USTR_MAX_VALUEOFINT32 - charPos) * sizeof(sal_Unicode)); + + return (RTL_USTR_MAX_VALUEOFINT32 - charPos); +} + +/************************************************************************* + * rtl_ustr_valueOfosl_INT64 + */ +sal_Int32 SAL_CALL rtl_ustr_valueOfInt64(sal_Unicode * str, sal_Int64 l, sal_Int16 radix ) +{ +#ifndef SAL_INT64_IS_STRUCT + sal_Unicode buf[RTL_USTR_MAX_VALUEOFINT64]; + sal_Int32 charPos = RTL_USTR_MAX_VALUEOFINT64 - 1; + sal_Bool negative = (l < 0); + + if (radix < RTL_USTR_MIN_RADIX || radix > RTL_USTR_MAX_RADIX) + radix = 10; + + if (!negative) { + l = -l; + } + + while (l <= -radix) { + buf[charPos--] = RTL_STR_DIGITS[(sal_Int32)(-(l % radix))]; + l = l / radix; + } + buf[charPos] = RTL_STR_DIGITS[(sal_Int32)(-l)]; + + if (negative) { + buf[--charPos] = '-'; + } + + rtl_copyMemory(str, buf + charPos, (RTL_USTR_MAX_VALUEOFINT64 - charPos) * sizeof(sal_Unicode)); + + return (RTL_USTR_MAX_VALUEOFINT64 - charPos); +#else + return 0; +#endif +} + +/************************************************************************* + * numberToStringImpl + */ + +#define FLOAT_MAX_POS ( 3.402823e+38) +#define FLOAT_MAX_NEG (-3.402823e+38) +#define FLOAT_MIN_POS ( 1.175494351e-38) +#define FLOAT_MIN_NEG (-1.175494351e-38) + + +sal_Int32 SAL_CALL numberToStringImpl(sal_Unicode * str, double d, sal_Int16 significantDigits ) +{ + /* Make it very simple without any formatting, + * (similar to Double.toString() in Java) */ + sal_Unicode buf[ RTL_USTR_MAX_VALUEOFDOUBLE ]; + sal_Unicode* charPos = buf; + sal_Int16 i, len, dig, dotPos; + sal_Int16 lastNonZeroPos; + sal_Int16 nExpDigits; + sal_Bool bExp; + double dExp; + + if( d == 0 ) + { + *(charPos++) = L'0'; + *(charPos++) = L'.'; + *(charPos++) = L'0'; + } + else + { + if( d < 0 ) + { + *(charPos++) = L'-'; + d = -d; + } + + dExp = log10( d ); + bExp = sal_False; + if( dExp > 7 || dExp <= -7 ) + bExp = sal_True; + + dExp = floor( dExp ); + d /= pow( 10, dExp ); + while( d > 10 ) + { + d /= 10.0; + dExp += 1.0; + } + + if( d < 1.0 ) + significantDigits++; + + dotPos = bExp ? 0 : (sal_Int16)dExp; + lastNonZeroPos = 0; + for( i = 0 ; i < significantDigits ; i++ ) + { + dig = (sal_Int16)d; + if( dig ) + lastNonZeroPos = i; + *(charPos++) = L'0' + dig; + if( i == dotPos ) + *(charPos++) = L'.'; + d -= (double)dig; + d *= 10.0; + } + + /* Kill trailing zeros */ + if( lastNonZeroPos > dotPos + 1 ) + charPos -= (significantDigits - 1 - lastNonZeroPos); + + /* exponent */ + if( bExp ) + { + *(charPos++) = L'E'; + if( dExp < 0.0 ) + { + dExp = -dExp; + *(charPos++) = L'-'; + } + + nExpDigits = 1; + while( dExp >= 10.0 ) + { + nExpDigits++; + dExp /= 10; + } + for( i = 0 ; i < nExpDigits ; i++ ) + { + dig = (sal_Int16)dExp; + *(charPos++) = L'0' + dig; + dExp -= (double)dig; + dExp *= 10.0; + } + } + } + + *(charPos++) = 0; + len = charPos - buf; + rtl_copyMemory( str, buf, len * sizeof(sal_Unicode) ); + return len - 1; +} + +/*************************************************************************/ + +sal_Int32 SAL_CALL getInfinityStr(sal_Unicode * This, sal_Bool bNeg) +{ + sal_Char InfinityStr[] = "-Infinity"; + sal_Char* pStr = bNeg ? InfinityStr : InfinityStr + 1; + sal_Int32 len = bNeg ? 9 : 8; + sal_Int32 i; + for ( i = 0; i < len+1; i++ ) + *(This+i) = *(pStr+i); + return len; +} + +sal_Int32 SAL_CALL getNaNStr(sal_Unicode * This) +{ + sal_Char NaNStr[] = "NaN"; + sal_Int32 len = 3; + sal_Int32 i; + for ( i = 0; i < len+1; i++ ) + *(This+i) = NaNStr[i]; + return len; +} + +/************************************************************************* + * rtl_ustr_valueOfFloat + */ +#define singleSignMask ((sal_uInt32)0x80000000) +#define singleExpMask ((sal_uInt32)0x7f800000) +#define singleFractMask (~(singleSignMask|singleExpMask)) +#define singleExpShift ((sal_uInt32)23) + +sal_Int32 SAL_CALL rtl_ustr_valueOfFloat(sal_Unicode * This, float f) +{ + /* Discover obvious special cases of NaN and Infinity + * (like in Java Ctor FloatingDecimal( float f ) ) */ + sal_uInt32 fBits = *(sal_uInt32*)(&f); + sal_uInt32 binExp = (sal_uInt32)( (fBits & singleExpMask) >> singleExpShift ); + sal_uInt32 fractBits = fBits & singleFractMask; + if ( binExp == (sal_uInt32)(singleExpMask>>singleExpShift) ) + { + if ( fractBits == 0L ) + return getInfinityStr(This, (sal_Bool)(f < 0.0)); + else + return getNaNStr(This); + } + return numberToStringImpl( This, (double)f, 8 ); +} + +/************************************************************************* + * rtl_ustr_valueOfDouble + */ +#ifndef WNT +#define signMask ((sal_uInt64)0x8000000000000000LL) +#define expMask ((sal_uInt64)0x7ff0000000000000LL) +#else +#define signMask ((sal_uInt64)0x8000000000000000L) +#define expMask ((sal_uInt64)0x7ff0000000000000L) +#endif + +#define fractMask (~(signMask|expMask)) +#define expShift ((sal_uInt32)52) + +sal_Int32 SAL_CALL rtl_ustr_valueOfDouble(sal_Unicode * This, double d) +{ +#ifndef SAL_INT64_IS_STRUCT + /* Discover obvious special cases of NaN and Infinity. + * (like in Java Ctor FloatingDecimal( double d ) ) */ + sal_uInt64 dBits = *(sal_uInt64*)(&d); + sal_uInt32 binExp = (sal_uInt32)( (dBits & expMask) >> expShift ); + sal_uInt64 fractBits = dBits & fractMask; + if ( binExp == (int)(expMask >> expShift) ) + { + if ( fractBits == 0L ) + return getInfinityStr(This, (sal_Bool)(d < 0.0)); + else + return getNaNStr(This); + } +#endif + return numberToStringImpl( This, d, 17 ); +} + +/************************************************************************* + * rtl_ustr_toInt32 + */ +sal_Int32 SAL_CALL rtl_ustr_toInt32( sal_Unicode * str, sal_Int16 radix ) +{ + sal_Char* stopstring; + sal_Char* CharStr; + sal_Char* pChar; + sal_Int32 length, i, nVal; + sal_Unicode wc; + + /* simple conversion to 8 bit string */ + length = rtl_ustr_getLength( str ); + CharStr = (sal_Char*)rtl_allocateMemory( length + 1 ); + pChar = CharStr; + for( i = 0 ; i < length ; i++ ) + { + wc = *(str++); + *(pChar++) = ( wc <= 255 ) ? (sal_Char)wc : 0; + } + CharStr[ length ] = 0; + nVal = strtol( CharStr, &stopstring, radix ); + rtl_freeMemory( CharStr ); + return nVal; +} + +/************************************************************************* + * Help function for rtl_ustr_toInt64 + */ +sal_Int16 getDigit( sal_Unicode ch, sal_Int16 radix ) +{ + sal_Int16 value = -1; + if( ch >= L'0' && ch <= L'9' ) + value = ch - L'0'; + else if( ch >= L'a' && ch <= L'z' ) + value = ch - L'a' + 10; + else if( ch >= L'A' && ch <= L'Z' ) + value = ch - L'A' + 10; + return ( value < radix ) ? value : -1; +} + +#ifndef WNT +#define INT64_MIN_VALUE 0x8000000000000000LL; +#define INT64_MAX_VALUE 0x7fffffffffffffffLL; +#else +#define INT64_MIN_VALUE 0x8000000000000000L; +#define INT64_MAX_VALUE 0x7fffffffffffffffL; +#endif + +/************************************************************************* + * rtl_ustr_toInt64 (like in Java) + */ +sal_Int64 SAL_CALL rtl_ustr_toInt64( sal_Unicode * str, sal_Int16 radix ) +{ +#ifndef SAL_INT64_IS_STRUCT + sal_Int64 result = 0; + sal_Bool negative = sal_False; + sal_Int32 i = 0; + sal_Int32 max = rtl_ustr_getLength( str ); + sal_Int64 limit; + sal_Int64 multmin; + sal_Int32 digit; + + if( max == 0 ) + return 0; + + if( radix < RTL_USTR_MIN_RADIX || radix > RTL_USTR_MAX_RADIX ) + radix = 10; + + while( i < max && (str[i] == L' ' || str[i] == L'\t') ) + i++; + + if( str[i] == L'-' ) + { + negative = sal_True; + limit = INT64_MIN_VALUE; + i++; + } + else + { + limit = -INT64_MAX_VALUE; + } + multmin = limit / radix; + if( i < max ) + { + digit = getDigit( str[i++], radix ); + if( digit < 0 ) + return 0; + result = -digit; + } + while( i < max ) + { + // Accumulating negatively avoids surprises near MAX_VALUE + digit = getDigit( str[i++], radix ); + if( digit < 0 ) + break; + + if( result < multmin ) + break; + + result *= radix; + if( result < limit + digit ) + break; + + result -= digit; + } + if( negative ) + return result; + else + return -result; + +#endif + return 0; +} + +/************************************************************************* + * rtl_ustr_toFloat + */ +float SAL_CALL rtl_ustr_toFloat( sal_Unicode * str ) +{ + sal_Char* stopstring; + sal_Char* CharStr; + sal_Char* pChar; + sal_Int32 length, i; + sal_Unicode wc; + double dVal; + + /* simple conversion to 8 bit string */ + length = rtl_ustr_getLength( str ); + CharStr = (sal_Char*)rtl_allocateMemory( length + 1); + pChar = CharStr; + for( i = 0 ; i < length ; i++ ) + { + wc = *(str++); + *(pChar++) = ( wc <= 255 ) ? (sal_Char)wc : 0; + } + CharStr[ length ] = 0; + dVal = strtod( CharStr, &stopstring ); + + /* float range? */ + if( dVal > FLOAT_MAX_POS || + dVal < FLOAT_MAX_NEG || + ( dVal > 0 && dVal < FLOAT_MIN_POS ) || + ( dVal < 0 && dVal > FLOAT_MIN_NEG ) ) + { + dVal = 0.0; + } + rtl_freeMemory( CharStr ); + return (float)dVal; +} + +/************************************************************************* + * rtl_ustr_toDouble + */ +double SAL_CALL rtl_ustr_toDouble( sal_Unicode * str ) +{ + sal_Char* stopstring; + sal_Char* CharStr; + sal_Char* pChar; + sal_Int32 length, i; + sal_Unicode wc; + double dVal; + + /* simple conversion to 8 bit string */ + length = rtl_ustr_getLength( str ); + CharStr = (sal_Char*)rtl_allocateMemory( length + 1 ); + pChar = CharStr; + for( i = 0 ; i < length ; i++ ) + { + wc = *(str++); + *(pChar++) = ( wc <= 255 ) ? (sal_Char)wc : 0; + } + CharStr[ length ] = 0; + dVal = strtod( CharStr, &stopstring ); + rtl_freeMemory( CharStr ); + return dVal; +} + + +/************************************************************************* + * + * rtl_uString_XXX Functions + * +/************************************************************************* + +/************************************************************************* + * rtl_uString_acquire + */ +void SAL_CALL rtl_uString_acquire( rtl_uString * value ) +{ + osl_incrementInterlockedCount(&value->refCount); +} + +/************************************************************************* + * rtl_uString_release + */ +void SAL_CALL rtl_uString_release( rtl_uString * value ) +{ + if( 0 == osl_decrementInterlockedCount(&value->refCount) ) + { + OSL_ENSHURE( value != &aEmpty_rtl_wString, "static empty string: refCount==0"); + rtl_freeMemory(value); + } +} + +/************************************************************************* + * rtl_uString_new + */ +void SAL_CALL rtl_uString_new( rtl_uString ** newStr ) +{ + if (*newStr) + rtl_uString_release(*newStr); + + *newStr = &aEmpty_rtl_wString; + rtl_uString_acquire( *newStr ); +} + +/************************************************************************* + * rtl_uString_new_WithLength + */ +void SAL_CALL rtl_uString_new_WithLength( rtl_uString ** newStr, sal_Int32 nLen ) +{ + if (*newStr) + rtl_uString_release(*newStr); + + *newStr = (rtl_uString*)rtl_allocateMemory( sizeof(rtl_uString) + (nLen * sizeof(sal_Unicode)) ); + + if (!(*newStr)) return; + + (*newStr)->refCount = 1; + (*newStr)->length = 0; + *((*newStr)->buffer + nLen) = L'\0'; + + rtl_zeroMemory((*newStr)->buffer, nLen * sizeof(sal_Unicode)); +} + +/************************************************************************* + * rtl_uString_newFromString + */ +void SAL_CALL rtl_uString_newFromString( rtl_uString ** newStr, rtl_uString * value ) +{ + rtl_uString * pOrg; + + if (value->length == 0) + { + rtl_uString_new(newStr); + return; + } + + pOrg = *newStr; + *newStr = (rtl_uString*)rtl_allocateMemory( sizeof(rtl_uString) + (value->length * sizeof(sal_Unicode)) ); + if ( *newStr ) + { + (*newStr)->refCount = 1; + (*newStr)->length = value->length; + rtl_copyMemory((*newStr)->buffer, value->buffer, (value->length+1) * sizeof(sal_Unicode)); + } + + /* must be done at least, if left == *newStr */ + if ( pOrg ) + rtl_uString_release( pOrg ); +} + +/************************************************************************* + * rtl_uString_newFromStr + */ +void SAL_CALL rtl_uString_newFromStr( rtl_uString ** newStr, const sal_Unicode * value ) +{ + rtl_uString * pOrg; + sal_Int32 length; + + if (!value) + { + rtl_uString_new(newStr); + return; + } + + length = rtl_ustr_getLength(value); + + pOrg = *newStr; + *newStr = (rtl_uString*)rtl_allocateMemory( sizeof(rtl_uString) + (length * sizeof(sal_Unicode)) ); + if ( *newStr ) + { + (*newStr)->refCount = 1; + (*newStr)->length = length; + rtl_copyMemory((*newStr)->buffer, value, (length+1) * sizeof(sal_Unicode)); + } + + /* must be done at least, if left == *newStr */ + if ( pOrg ) + rtl_uString_release( pOrg ); +} + +/************************************************************************* + * rtl_uString_newFromStr_WithLength + */ +void SAL_CALL rtl_uString_newFromStr_WithLength( rtl_uString ** newStr, + const sal_Unicode * value, + sal_Int32 len) +{ + rtl_uString * pOrg; + + if (!value || len < 0 ) + { + rtl_uString_new(newStr); + return; + } + + pOrg = *newStr; + *newStr = (rtl_uString*)rtl_allocateMemory( sizeof(rtl_uString) + (len * sizeof(sal_Unicode)) ); + if ( *newStr ) + { + (*newStr)->refCount = 1; + (*newStr)->length = len; + rtl_copyMemory((*newStr)->buffer, value, len * sizeof(sal_Unicode)); + (*newStr)->buffer[len] = 0; + } + + /* must be done at least, if left == *newStr */ + if ( pOrg ) + rtl_uString_release( pOrg ); +} + +/************************************************************************* + * rtl_wstr_getLength + */ +static sal_Int32 SAL_CALL rtl_wstr_getLength( const wchar_t* str ) +{ + const wchar_t * pTempStr = str; + while( *pTempStr ) pTempStr++; + return pTempStr - str; +} + +/************************************************************************* + * rtl_uString_newFromWStr + */ +void SAL_CALL rtl_uString_newFromWStr( rtl_uString ** newStr, const wchar_t * value ) +{ + sal_Int32 length; + sal_Unicode* p; + + if (!value) + { + rtl_uString_new(newStr); + return; + } + + length = rtl_wstr_getLength(value); + + if (*newStr) + rtl_uString_release(*newStr); + + *newStr = (rtl_uString*)rtl_allocateMemory( sizeof(rtl_uString) + (length * sizeof(sal_Unicode)) ); + if ( *newStr ) + { + (*newStr)->refCount = 1; + (*newStr)->length = length; + + p = (*newStr)->buffer; + while ( length ) + { + *p = (sal_Unicode)(*value); + p++; + value++; + length--; + } + *p = 0; + } +} + +/************************************************************************* + * rtl_uString_newFromWStr_WithLength + */ +void SAL_CALL rtl_uString_newFromWStr_WithLength( rtl_uString ** newStr, + const wchar_t * value, + sal_Int32 len) +{ + sal_Unicode* p; + + if (!value || len < 0) + { + rtl_uString_new(newStr); + return; + } + + if (*newStr) + rtl_uString_release(*newStr); + + *newStr = (rtl_uString*)rtl_allocateMemory( sizeof(rtl_uString) + (len * sizeof(sal_Unicode)) ); + if ( *newStr ) + { + (*newStr)->refCount = 1; + (*newStr)->length = len; + + p = (*newStr)->buffer; + while ( len ) + { + *p = (sal_Unicode)(*value); + p++; + value++; + len--; + } + *p = 0; + } +} + +/************************************************************************* + * rtl_uString_newFromASCII + */ +void SAL_CALL rtl_uString_newFromAscii( rtl_uString ** newStr, const sal_Char * value ) +{ + sal_Int32 length; + sal_Unicode* p; + + if (!value) + { + rtl_uString_new(newStr); + return; + } + + length = rtl_str_getLength( value ); + + if (*newStr) + rtl_uString_release(*newStr); + + *newStr = (rtl_uString*)rtl_allocateMemory( sizeof(rtl_uString) + (length * sizeof(sal_Unicode)) ); + if ( *newStr ) + { + (*newStr)->refCount = 1; + (*newStr)->length = length; + + p = (*newStr)->buffer; + while ( length ) + { + /* Check ASCII range */ + OSL_ENSHURE( (*value & 0x80) == 0, "Found ASCII char > 127"); + + *p = (sal_Unicode)(*value); + p++; + value++; + length--; + } + *p = 0; + } +} + +/************************************************************************* + * rtl_uString_assign + */ +void SAL_CALL rtl_uString_assign( /*inout*/rtl_uString ** str, rtl_uString * rightValue ) +{ + rtl_uString_acquire(rightValue); + + if (*str) + rtl_uString_release(*str); + + *str = rightValue; +} + +/************************************************************************* + * rtl_uString_getLength + */ +sal_Int32 SAL_CALL rtl_uString_getLength( rtl_uString * str ) +{ + return str->length; +} + +/************************************************************************* + * rtl_uString_getStr + */ +sal_Unicode * SAL_CALL rtl_uString_getStr( rtl_uString * str ) +{ + return str->buffer; +} + +/************************************************************************* + * rtl_uString_newConcat + */ +void SAL_CALL rtl_uString_newConcat( rtl_uString ** newStr, rtl_uString * left, rtl_uString * right ) +{ + rtl_uString * pOrg = *newStr; + if( !right->length ) + { + *newStr = left; + rtl_uString_acquire( left ); + } + else if( !left->length ) + { + *newStr = right; + rtl_uString_acquire( right ); + } + else + { + rtl_uString *tmpStr = NULL; + sal_Int32 nNewLen = left->length + right->length; + rtl_uString_new_WithLength(&tmpStr, nNewLen); + tmpStr->length = nNewLen; + + rtl_copyMemory( tmpStr->buffer, left->buffer, left->length * sizeof(sal_Unicode)); + rtl_copyMemory( tmpStr->buffer + left->length, right->buffer, right->length * sizeof(sal_Unicode)); + tmpStr->buffer[nNewLen] = 0; + *newStr = tmpStr; + } + /* must be done at least, if left == *newStr */ + if( pOrg ) + rtl_uString_release(pOrg); +} + +/************************************************************************* + * rtl_uString_newReplace + */ +void SAL_CALL rtl_uString_newReplace( rtl_uString ** newStr, + rtl_uString * str, + sal_Unicode oldChar, + sal_Unicode newChar) +{ + rtl_uString_newFromString(newStr, str); + + if (!(*newStr)) return; + + rtl_ustr_replaceChar_WithLength((*newStr)->buffer, (*newStr)->length, oldChar, newChar); +} + +/************************************************************************* + * rtl_uString_newReplaceStrAt + */ +void SAL_CALL rtl_uString_newReplaceStrAt( rtl_uString ** newStr, + rtl_uString * str, + sal_Int32 index, + sal_Int32 count, + rtl_uString * newSub) +{ + sal_Unicode *pBuffer = NULL; + sal_Int32 size = sizeof(sal_Unicode); + + if (count == 0 && newSub->length == 0) + { + rtl_uString_newFromString(newStr, str); + return; + } + + if (count == 0) + { + rtl_uString_new_WithLength(newStr, str->length + newSub->length); + if (!(*newStr)) return; + pBuffer = (*newStr)->buffer; + (*newStr)->length = str->length + newSub->length; + rtl_copyMemory(pBuffer, str->buffer, index * size); + rtl_copyMemory(pBuffer + index, newSub->buffer, newSub->length * size); + rtl_copyMemory(pBuffer + index + newSub->length, str->buffer + index, + (str->length - index) * size); + + return; + } + + if (newSub->length == 0) + { + rtl_uString_new_WithLength(newStr, str->length - count); + if (!(*newStr)) return; + pBuffer = (*newStr)->buffer; + (*newStr)->length = str->length - count; + rtl_copyMemory(pBuffer, str->buffer, index * size); + rtl_copyMemory(pBuffer + index, str->buffer + index + count, + (str->length - index - count) * size); + + return; + } + + rtl_uString_new_WithLength(newStr, str->length - count + newSub->length); + if (!(*newStr)) return; + pBuffer = (*newStr)->buffer; + (*newStr)->length = str->length - count + newSub->length; + rtl_copyMemory(pBuffer, str->buffer, index * size); + rtl_copyMemory(pBuffer + index, newSub->buffer, newSub->length * size); + rtl_copyMemory(pBuffer + index + newSub->length, str->buffer + index + count, + (str->length - index - count) * size); + + return; +} + +/************************************************************************* + * rtl_uString_newToLowerCase + */ +void SAL_CALL rtl_uString_newToLowerCase( rtl_uString ** newStr, + rtl_uString * str, + struct _rtl_Locale * locale ) +{ + if (locale && locale->Language->length == 2 + && locale->Language->buffer[0] == 't' + && locale->Language->buffer[0] == 'r' ) + { + sal_Int32 i; + sal_Int32 len = str->length; + + rtl_uString_new_WithLength(newStr, str->length); + + if (!(*newStr)) return; + + (*newStr)->length = str->length; + + /* special loop for Turkey */ + for (i = 0; i < len; i++) + { + sal_Unicode ch = str->buffer[i]; + if (ch == L'I') + { + (*newStr)->buffer[i] = (sal_Unicode)0x0131; /* dotless small i */ + continue; + } + if ((sal_uInt16)ch == 0x0130) /* dotted I */ + { + (*newStr)->buffer[i] = L'i'; /* dotted i */ + continue; + } + (*newStr)->buffer[i] = rtl_char_toLowerCase(ch); + } + } else + { + rtl_uString_newFromString(newStr, str); + + if (!(*newStr)) return; + + rtl_ustr_toAsciiLowerCase_WithLength((*newStr)->buffer, (*newStr)->length); + } +} + +/************************************************************************* + * rtl_uString_newToUpperCase + */ +void SAL_CALL rtl_uString_newToUpperCase( rtl_uString ** newStr, + rtl_uString * str, + struct _rtl_Locale * locale ) +{ + sal_Int32 i; + sal_Int32 len = str->length; + sal_Int32 resultOffset = 0; + sal_Unicode *result = (sal_Unicode*)rtl_allocateMemory((len + 1)* sizeof(sal_Unicode)); + + if (locale && locale->Language->length == 2 + && locale->Language->buffer[0] == 't' + && locale->Language->buffer[0] == 'r' ) + { + /* special loop for Turkey */ + for (i = 0; i < len; i++) + { + sal_Unicode ch = str->buffer[i]; + if ((sal_uInt16)ch == 0x0131) /* dotless i */ + { + result[i+resultOffset] = L'I'; /* cap I */ + continue; + } + if (ch == L'i') + { + result[i+resultOffset] = (sal_Unicode)0x0130; /* dotted cap i */ + continue; + } + if ((sal_uInt16)ch == 0x00DF) /* sharp s */ + { + /* Grow result. */ + sal_Unicode *result2 = (sal_Unicode*)rtl_allocateMemory((len + 1 + resultOffset + 1) * sizeof(sal_Unicode)); + rtl_copyMemory(result2, result, (i + resultOffset) * sizeof(sal_Unicode)); + result2[i+resultOffset] = L'S'; + resultOffset++; + result2[i+resultOffset] = L'S'; + rtl_freeMemory(result); + result = result2; + continue; + } + result[i+resultOffset] = rtl_char_toUpperCase(ch); + } + } else + { + for (i = 0; i < len; i++) + { + sal_Unicode ch = str->buffer[i]; + + if ((sal_uInt16)ch == 0x00DF) /* sharp s */ + { + /* Grow result. */ + sal_Unicode *result2 = (sal_Unicode*)rtl_allocateMemory((len + 1 + resultOffset + 1) * sizeof(sal_Unicode)); + rtl_copyMemory(result2, result, (i + resultOffset) * sizeof(sal_Unicode)); + result2[i+resultOffset] = L'S'; + resultOffset++; + result2[i+resultOffset] = L'S'; + rtl_freeMemory(result); + result = result2; + continue; + } + result[i+resultOffset] = rtl_char_toUpperCase(ch); + } + + } + + result[len + resultOffset] = L'\0'; + rtl_uString_newFromStr_WithLength(newStr, result, len + resultOffset); + rtl_freeMemory(result); +} + +/************************************************************************* + * rtl_uString_newTrim + */ +void SAL_CALL rtl_uString_newTrim( rtl_uString ** newStr, rtl_uString * str ) +{ + rtl_uString_newFromString(newStr, str); + + if (!(*newStr)) return; + + (*newStr)->length = rtl_ustr_trim_WithLength((*newStr)->buffer, (*newStr)->length); +} + +/************************************************************************* + * rtl_uString_getTokenCount + */ +sal_Int32 SAL_CALL rtl_uString_getTokenCount( rtl_uString * str , sal_Unicode cTok) +{ + sal_Int32 count = 0; + sal_Int32 index1 = 0; + sal_Int32 index2 = 0; + sal_Unicode * buffer = str->buffer; + + while ((index2 = rtl_ustr_indexOfChar_WithLength(buffer + index1, str->length - index1, cTok)) >= 0) + { + if (index2 <= (str->length - index1) && index2 >= 0) + count++; + + index1 += index2 + 1; + } + + if (index2 < 0 && index1 <= str->length) + count++; + + return count; +} + +/************************************************************************* + * rtl_uString_getToken + */ +void SAL_CALL rtl_uString_getToken( rtl_uString ** newStr , rtl_uString * str, sal_Int32 nToken, sal_Unicode cTok) +{ + sal_Int32 count = 0; + sal_Int32 index1 = 0; + sal_Int32 index2 = 0; + sal_Unicode * buffer = str->buffer; + + while ((index2 = rtl_ustr_indexOfChar_WithLength(buffer + index1, str->length - index1, cTok)) >= 0) + { + if (count == nToken) + { + rtl_uString_newFromStr_WithLength( newStr, buffer + index1, index2 ); + return; + } + + if (index2 <= (str->length - index1) && index2 >= 0) + count++; + + index1 += index2 + 1; + } + + if (nToken == 0 || nToken == count) + rtl_uString_newFromStr_WithLength( newStr, buffer + index1, str->length - index1 ); + else + rtl_uString_new(newStr); + + return; +} + + +void SAL_CALL rtl_string2UString( rtl_uString** newStr, const sal_Char* pStr, sal_Int32 nLen, + rtl_TextEncoding encoding, sal_uInt32 nCvtFlags ) +{ + if (nLen) + { + sal_Unicode* pData; + rtl_TextEncodingInfo aTextEncInfo; + rtl_TextToUnicodeConverter hConverter = rtl_createTextToUnicodeConverter( encoding ); + sal_uInt32 nInfo; + sal_Size nSrcBytes; + sal_Size nDestChars; + sal_Size nNewLen; + + /* get TextEncodingInfo */ + aTextEncInfo.StructSize = sizeof( aTextEncInfo ); + rtl_getTextEncodingInfo( encoding, &aTextEncInfo ); + + /* Zuerst konvertieren wir mit der wahrscheinlichen Anzahl */ + /* der zu konvertierenden Zeichen */ + nNewLen = nLen; /* (aTextEncInfo.AverageCharSize ? aTextEncInfo.AverageCharSize : 1); */ + + pData = (sal_Unicode*)rtl_allocateMemory( (1 + nNewLen) * sizeof(sal_Unicode) ); + nDestChars = rtl_convertTextToUnicode( hConverter, 0, + pStr, nLen, + pData, nNewLen, + nCvtFlags, + &nInfo, &nSrcBytes ); + + /* String entsprechend der durch das Konvertieren tatsaechlich */ + /* entstehenden Bytes anpassen */ + pData[nDestChars] = L'\0'; + + rtl_uString_newFromStr_WithLength(newStr, pData, nDestChars); + + rtl_destroyTextToUnicodeConverter( hConverter ); + rtl_freeMemory( pData ); + } else + { + rtl_uString_new(newStr); + } +} + +void SAL_CALL rtl_uString2String( rtl_String** newStr, const sal_Unicode * pWStr, sal_Int32 nWLen, + rtl_TextEncoding encoding, sal_uInt32 nCvtFlags ) +{ + if (nWLen) + { + sal_Char* pData; + rtl_TextEncodingInfo aTextEncInfo; + rtl_UnicodeToTextConverter hConverter = rtl_createUnicodeToTextConverter( encoding ); + sal_Size nSrcChars; + sal_Size nDestBytes; + sal_Size nNewLen; + sal_uInt32 nInfo; + + /* get TextEncodingInfo */ + aTextEncInfo.StructSize = sizeof( aTextEncInfo ); + rtl_getTextEncodingInfo( encoding, &aTextEncInfo ); + + /* Zuerst konvertieren wir mit der wahrscheinlichen Anzahl */ + /* der zu konvertierenden Zeichen */ + nNewLen = nWLen * (aTextEncInfo.AverageCharSize ? aTextEncInfo.AverageCharSize : 1) * 6; + + pData = (sal_Char*)rtl_allocateMemory( nNewLen ); + nDestBytes = rtl_convertUnicodeToText( hConverter, 0, + pWStr, nWLen, + pData, nNewLen, + nCvtFlags, + &nInfo, &nSrcChars ); + pData[nDestBytes] = '\0'; + + rtl_string_newFromStr_WithLength(newStr, pData, nDestBytes); + + rtl_destroyUnicodeToTextConverter( hConverter ); + rtl_freeMemory( pData ); + } else + { + rtl_string_new(newStr); + } +} + + diff --git a/sal/test/makefile.mk b/sal/test/makefile.mk new file mode 100644 index 000000000000..0de5fcd6b7b7 --- /dev/null +++ b/sal/test/makefile.mk @@ -0,0 +1,123 @@ +#************************************************************************* +# +# $RCSfile: makefile.mk,v $ +# +# $Revision: 1.1.1.1 $ +# +# last change: $Author: hr $ $Date: 2000-09-18 15:17:27 $ +# +# The Contents of this file are made available subject to the terms of +# either of the following licenses +# +# - GNU Lesser General Public License Version 2.1 +# - Sun Industry Standards Source License Version 1.1 +# +# Sun Microsystems Inc., October, 2000 +# +# GNU Lesser General Public License Version 2.1 +# ============================================= +# Copyright 2000 by Sun Microsystems, Inc. +# 901 San Antonio Road, Palo Alto, CA 94303, USA +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License version 2.1, as published by the Free Software Foundation. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, +# MA 02111-1307 USA +# +# +# Sun Industry Standards Source License Version 1.1 +# ================================================= +# The contents of this file are subject to the Sun Industry Standards +# Source License Version 1.1 (the "License"); You may not use this file +# except in compliance with the License. You may obtain a copy of the +# License at http://www.openoffice.org/license.html. +# +# Software provided under this License is provided on an "AS IS" basis, +# WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, +# WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, +# MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. +# See the License for the specific provisions governing your rights and +# obligations concerning the Software. +# +# The Initial Developer of the Original Code is: Sun Microsystems, Inc. +# +# Copyright: 2000 by Sun Microsystems, Inc. +# +# All Rights Reserved. +# +# Contributor(s): _______________________________________ +# +# +# +#************************************************************************* + +PRJ=.. + +PRJNAME=sal +TARGET=saltest +TARGETTYPE=CUI + +USE_LDUMP2=TRUE +#LDUMP2=LDUMP3 + + +# --- Settings ----------------------------------------------------- +.INCLUDE : svpre.mk +.INCLUDE : settings.mk +.INCLUDE : sv.mk + + +# ------------------------------------------------------------------ + +LIB1TARGET= $(SLB)$/$(TARGET).lib + +OBJFILES= \ + $(OBJ)$/testprofile.obj \ + $(OBJ)$/testint64.obj \ + $(OBJ)$/teststring.obj \ + $(OBJ)$/testuuid.obj \ + $(OBJ)$/testowstring.obj \ + $(OBJ)$/teststrbuf.obj \ + $(OBJ)$/testbyteseq.obj \ + $(OBJ)$/test.obj + +.IF "$(GUI)" == "WNT" +SALLIB= isal.lib +.ELSE +SALLIB= -lsal1 +.ENDIF + + +APP2TARGET= test +APP2OBJS= $(OBJFILES) +APP2STDLIBS=$(SALLIB) $(TSLLIB) +# APP2DEPN= $(SLB)$/sal.lib + + +# --- Targets ------------------------------------------------------ + +#all: \ +# ALLTAR + +.INCLUDE : target.mk + +# --- SO2-Filter-Datei --- + + +$(MISC)$/tsl$(UPD)$(DLLPOSTFIX).flt: + @echo ------------------------------ + @echo Making: $@ + @echo WEP>$@ + @echo LIBMAIN>>$@ + @echo LibMain>>$@ + + diff --git a/sal/textenc/makefile.mk b/sal/textenc/makefile.mk new file mode 100644 index 000000000000..84f3e55f2fe7 --- /dev/null +++ b/sal/textenc/makefile.mk @@ -0,0 +1,98 @@ +#************************************************************************* +# +# $RCSfile: makefile.mk,v $ +# +# $Revision: 1.1.1.1 $ +# +# last change: $Author: hr $ $Date: 2000-09-18 15:17:27 $ +# +# The Contents of this file are made available subject to the terms of +# either of the following licenses +# +# - GNU Lesser General Public License Version 2.1 +# - Sun Industry Standards Source License Version 1.1 +# +# Sun Microsystems Inc., October, 2000 +# +# GNU Lesser General Public License Version 2.1 +# ============================================= +# Copyright 2000 by Sun Microsystems, Inc. +# 901 San Antonio Road, Palo Alto, CA 94303, USA +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License version 2.1, as published by the Free Software Foundation. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, +# MA 02111-1307 USA +# +# +# Sun Industry Standards Source License Version 1.1 +# ================================================= +# The contents of this file are subject to the Sun Industry Standards +# Source License Version 1.1 (the "License"); You may not use this file +# except in compliance with the License. You may obtain a copy of the +# License at http://www.openoffice.org/license.html. +# +# Software provided under this License is provided on an "AS IS" basis, +# WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, +# WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, +# MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. +# See the License for the specific provisions governing your rights and +# obligations concerning the Software. +# +# The Initial Developer of the Original Code is: Sun Microsystems, Inc. +# +# Copyright: 2000 by Sun Microsystems, Inc. +# +# All Rights Reserved. +# +# Contributor(s): _______________________________________ +# +# +# +#************************************************************************* + +PRJ=.. + +PRJNAME=sal +TARGET=textenc + +# --- Settings ----------------------------------------------------- + +.INCLUDE : svpre.mk +.INCLUDE : settings.mk +.INCLUDE : sv.mk + +# --- Files -------------------------------------------------------- + +SLOFILES= $(SLO)$/textenc.obj \ + $(SLO)$/tencinfo.obj \ + $(SLO)$/tenchelp.obj \ + $(SLO)$/textcvt.obj \ + $(SLO)$/tcvtbyte.obj \ + $(SLO)$/tcvtmb.obj \ + $(SLO)$/tcvtutf7.obj \ + $(SLO)$/tcvtutf8.obj + +.IF "$(UPDATER)"!="" +OBJFILES= $(OBJ)$/textenc.obj \ + $(OBJ)$/tencinfo.obj \ + $(OBJ)$/tenchelp.obj \ + $(OBJ)$/textcvt.obj \ + $(OBJ)$/tcvtbyte.obj \ + $(OBJ)$/tcvtmb.obj \ + $(OBJ)$/tcvtutf7.obj \ + $(OBJ)$/tcvtutf8.obj +.ENDIF + +# --- Targets ------------------------------------------------------ + +.INCLUDE : target.mk diff --git a/sal/textenc/tcvtarb1.tab b/sal/textenc/tcvtarb1.tab new file mode 100644 index 000000000000..d4d0498ab144 --- /dev/null +++ b/sal/textenc/tcvtarb1.tab @@ -0,0 +1,1078 @@ +/************************************************************************* + * + * $RCSfile: tcvtarb1.tab,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:17:28 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRUNTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRUNTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc.. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +/* ======================================================================= */ + +/* 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 }, + { 0x00A1, 0xAD }, + { 0x00A2, 0x9B }, + { 0x00A3, 0x9C }, + { 0x00A5, 0x9D }, + { 0x00AA, 0xA6 }, + { 0x00AB, 0xAE }, + { 0x00AC, 0xAA }, + { 0x00B0, 0xF8 }, + { 0x00B1, 0xF1 }, + { 0x00B2, 0xFD }, + { 0x00B5, 0xE6 }, + { 0x00B7, 0xFA }, + { 0x00BA, 0xA7 }, + { 0x00BB, 0xAF }, + { 0x00BC, 0xAC }, + { 0x00BD, 0xAB }, + { 0x00BF, 0xA8 }, + { 0x00D1, 0xA5 }, + { 0x00DF, 0xE1 }, + { 0x00E1, 0xA0 }, + { 0x00ED, 0xA1 }, + { 0x00F1, 0xA4 }, + { 0x00F3, 0xA2 }, + { 0x00F7, 0xF6 }, + { 0x00FA, 0xA3 }, + { 0x0192, 0x9F }, + { 0x0393, 0xE2 }, + { 0x0398, 0xE9 }, + { 0x03A3, 0xE4 }, + { 0x03A6, 0xE8 }, + { 0x03A9, 0xEA }, + { 0x03B1, 0xE0 }, + { 0x03B4, 0xEB }, + { 0x03B5, 0xEE }, + { 0x03C0, 0xE3 }, + { 0x03C3, 0xE5 }, + { 0x03C4, 0xE7 }, + { 0x03C6, 0xED }, + { 0x207F, 0xFC }, + { 0x20A7, 0x9E }, + { 0x2219, 0xF9 }, + { 0x221A, 0xFB }, + { 0x221E, 0xEC }, + { 0x2229, 0xEF }, + { 0x2248, 0xF7 }, + { 0x2261, 0xF0 }, + { 0x2264, 0xF3 }, + { 0x2265, 0xF2 }, + { 0x2310, 0xA9 }, + { 0x2320, 0xF4 }, + { 0x2321, 0xF5 }, + { 0x2500, 0xC4 }, + { 0x2502, 0xB3 }, + { 0x250C, 0xDA }, + { 0x2510, 0xBF }, + { 0x2514, 0xC0 }, + { 0x2518, 0xD9 }, + { 0x251C, 0xC3 }, + { 0x2524, 0xB4 }, + { 0x252C, 0xC2 }, + { 0x2534, 0xC1 }, + { 0x253C, 0xC5 }, + { 0x2550, 0xCD }, + { 0x2551, 0xBA }, + { 0x2552, 0xD5 }, + { 0x2553, 0xD6 }, + { 0x2554, 0xC9 }, + { 0x2555, 0xB8 }, + { 0x2556, 0xB7 }, + { 0x2557, 0xBB }, + { 0x2558, 0xD4 }, + { 0x2559, 0xD3 }, + { 0x255A, 0xC8 }, + { 0x255B, 0xBE }, + { 0x255C, 0xBD }, + { 0x255D, 0xBC }, + { 0x255E, 0xC6 }, + { 0x255F, 0xC7 }, + { 0x2560, 0xCC }, + { 0x2561, 0xB5 }, + { 0x2562, 0xB6 }, + { 0x2563, 0xB9 }, + { 0x2564, 0xD1 }, + { 0x2565, 0xD2 }, + { 0x2566, 0xCB }, + { 0x2567, 0xCF }, + { 0x2568, 0xD0 }, + { 0x2569, 0xCA }, + { 0x256A, 0xD8 }, + { 0x256B, 0xD7 }, + { 0x256C, 0xCE }, + { 0x2580, 0xDF }, + { 0x2584, 0xDC }, + { 0x2588, 0xDB }, + { 0x258C, 0xDD }, + { 0x2590, 0xDE }, + { 0x2591, 0xB0 }, + { 0x2592, 0xB1 }, + { 0x2593, 0xB2 }, + { 0x25A0, 0xFE } +}; + +/* ----------------------------------------------------------------------- */ + +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 ImplTextConverterData const aImplIBM862TextConverterData = +{ + &aImplIBM862ByteCvtData, + NULL, + RTL_UNICODE_CHAR_DEFAULT +}; + +/* ----------------------------------------------------------------------- */ + +static ImplTextConverter const aImplIBM862TextConverter = +{ + &aImplIBM862TextConverterData, + ImplCharToUnicode, + ImplUnicodeToChar, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL +}; + +/* ----------------------------------------------------------------------- */ + +static ImplTextEncodingData const aImplIBM862TextEncodingData = +{ + &aImplIBM862TextConverter, + RTL_TEXTENCODING_IBM_862, + 1, 1, 1, + 177, + 862, + 5, + (const sal_Char*)"iso8859-8", + (const sal_Char*)"iso-8859-8", + RTL_TEXTENCODING_INFO_ASCII | + RTL_TEXTENCODING_INFO_R2L | + RTL_TEXTENCODING_INFO_DOS_OS2, + SCRIPT_HEBREW +}; + +/* ======================================================================= */ + +/* 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 }, + { 0x00A2, 0xC0 }, + { 0x00A3, 0xA3 }, + { 0x00A4, 0xA4 }, + { 0x00A6, 0xDB }, + { 0x00AB, 0x97 }, + { 0x00AC, 0xDC }, + { 0x00AD, 0xA1 }, + { 0x00B0, 0x80 }, + { 0x00B1, 0x93 }, + { 0x00B7, 0x81 }, + { 0x00BB, 0x98 }, + { 0x00BC, 0x95 }, + { 0x00BD, 0x94 }, + { 0x00D7, 0xDE }, + { 0x00F7, 0xDD }, + { 0x03B2, 0x90 }, + { 0x03C6, 0x92 }, + { 0x060C, 0xAC }, + { 0x061B, 0xBB }, + { 0x061F, 0xBF }, + { 0x0640, 0xE0 }, + { 0x0651, 0xF1 }, + { 0x0660, 0xB0 }, + { 0x0661, 0xB1 }, + { 0x0662, 0xB2 }, + { 0x0663, 0xB3 }, + { 0x0664, 0xB4 }, + { 0x0665, 0xB5 }, + { 0x0666, 0xB6 }, + { 0x0667, 0xB7 }, + { 0x0668, 0xB8 }, + { 0x0669, 0xB9 }, + { 0x066A, 0x25 }, + { 0x2219, 0x82 }, + { 0x221A, 0x83 }, + { 0x221E, 0x91 }, + { 0x2248, 0x96 }, + { 0x2500, 0x85 }, + { 0x2502, 0x86 }, + { 0x250C, 0x8D }, + { 0x2510, 0x8C }, + { 0x2514, 0x8E }, + { 0x2518, 0x8F }, + { 0x251C, 0x8A }, + { 0x2524, 0x88 }, + { 0x252C, 0x89 }, + { 0x2534, 0x8B }, + { 0x253C, 0x87 }, + { 0x2592, 0x84 }, + { 0x25A0, 0xFE } +}; + +/* ----------------------------------------------------------------------- */ + +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 ImplTextConverterData const aImplIBM864TextConverterData = +{ + &aImplIBM864ByteCvtData, + NULL, + RTL_UNICODE_CHAR_DEFAULT +}; + +/* ----------------------------------------------------------------------- */ + +static ImplTextConverter const aImplIBM864TextConverter = +{ + &aImplIBM864TextConverterData, + ImplCharToUnicode, + ImplUnicodeToChar, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL +}; + +/* ----------------------------------------------------------------------- */ + +static ImplTextEncodingData const aImplIBM864TextEncodingData = +{ + &aImplIBM864TextConverter, + RTL_TEXTENCODING_IBM_864, + 1, 1, 1, + 178, + 864, + 4, + (const sal_Char*)"iso8859-6", + (const sal_Char*)"iso-8859-6", + RTL_TEXTENCODING_INFO_ASCII | + RTL_TEXTENCODING_INFO_R2L | + RTL_TEXTENCODING_INFO_DOS_OS2, + SCRIPT_ARABIC +}; + +/* ======================================================================= */ + +/* 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, 0x0081, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021, /* 0x80 */ + 0x02C6, 0x2030, 0x008A, 0x2039, 0x008C, 0x008D, 0x008E, 0x008F, /* 0x80 */ + 0x0090, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, /* 0x90 */ + 0x02DC, 0x2122, 0x009A, 0x203A, 0x009C, 0x009D, 0x009E, 0x009F, /* 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 }, + { 0x00A1, 0xA1 }, + { 0x00A2, 0xA2 }, + { 0x00A3, 0xA3 }, + { 0x00A5, 0xA5 }, + { 0x00A6, 0xA6 }, + { 0x00A7, 0xA7 }, + { 0x00A8, 0xA8 }, + { 0x00A9, 0xA9 }, + { 0x00AB, 0xAB }, + { 0x00AC, 0xAC }, + { 0x00AD, 0xAD }, + { 0x00AE, 0xAE }, + { 0x00AF, 0xAF }, + { 0x00B0, 0xB0 }, + { 0x00B1, 0xB1 }, + { 0x00B2, 0xB2 }, + { 0x00B3, 0xB3 }, + { 0x00B4, 0xB4 }, + { 0x00B5, 0xB5 }, + { 0x00B6, 0xB6 }, + { 0x00B7, 0xB7 }, + { 0x00B8, 0xB8 }, + { 0x00B9, 0xB9 }, + { 0x00BB, 0xBB }, + { 0x00BC, 0xBC }, + { 0x00BD, 0xBD }, + { 0x00BE, 0xBE }, + { 0x00BF, 0xBF }, + { 0x00D7, 0xAA }, + { 0x00F7, 0xBA }, + { 0x0192, 0x83 }, + { 0x02C6, 0x88 }, + { 0x02DC, 0x98 }, + { 0x200E, 0xFD }, + { 0x200F, 0xFE }, + { 0x2013, 0x96 }, + { 0x2014, 0x97 }, + { 0x2018, 0x91 }, + { 0x2019, 0x92 }, + { 0x201A, 0x82 }, + { 0x201C, 0x93 }, + { 0x201D, 0x94 }, + { 0x201E, 0x84 }, + { 0x2020, 0x86 }, + { 0x2021, 0x87 }, + { 0x2022, 0x95 }, + { 0x2026, 0x85 }, + { 0x2030, 0x89 }, + { 0x2039, 0x8B }, + { 0x203A, 0x9B }, + { 0x20AA, 0xA4 }, + { 0x20AC, 0x80 }, + { 0x2122, 0x99 } +}; + +/* ----------------------------------------------------------------------- */ + +static ImplByteConvertData const aImplMS1255ByteCvtData = +{ + aImplMS1255ToUniTab, + NULL, + MS1255UNI_START, MS1255UNI_END, + NOTABUNI_START, NOTABUNI_END, + aImplMS1255ToCharTab, + aImpl8090SameToCharTab, + aImplMS1255ToCharTabEx, + MS1255CHAR_START, MS1255CHAR_END, + SAME8090CHAR_START, SAME8090CHAR_END, + MS1255TOCHARTABEX_COUNT +}; + +/* ----------------------------------------------------------------------- */ + +static ImplTextConverterData const aImplMS1255TextConverterData = +{ + &aImplMS1255ByteCvtData, + NULL, + RTL_UNICODE_CHAR_DEFAULT +}; + +/* ----------------------------------------------------------------------- */ + +static ImplTextConverter const aImplMS1255TextConverter = +{ + &aImplMS1255TextConverterData, + ImplCharToUnicode, + ImplUnicodeToChar, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL +}; + +/* ----------------------------------------------------------------------- */ + +static ImplTextEncodingData const aImplMS1255TextEncodingData = +{ + &aImplMS1255TextConverter, + RTL_TEXTENCODING_MS_1255, + 1, 1, 1, + 177, + 862, + 5, + (const sal_Char*)"iso8859-8", + (const sal_Char*)"iso-8859-8", + RTL_TEXTENCODING_INFO_ASCII | + RTL_TEXTENCODING_INFO_R2L | + RTL_TEXTENCODING_INFO_WIN, + SCRIPT_HEBREW +}; + +/* ======================================================================= */ + +/* MS-1256 */ +/* Windows Standard CharSet for Arabic */ +/* 1-Byte, 0x00-0x7F ASCII ohne Ausnahme */ +/* Convert-Tables: mappings/vendors/micsft/windows/cp1256.txt from 04/15/98 Version 2.01 */ +/* Last-Changes from us: */ + +/* ----------------------------------------------------------------------- */ + +#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, 0x008A, 0x2039, 0x0152, 0x0686, 0x0698, 0x008F, /* 0x80 */ + 0x06AF, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, /* 0x90 */ + 0x0098, 0x2122, 0x009A, 0x203A, 0x0153, 0x200C, 0x200D, 0x009F, /* 0x90 */ + 0x00A0, 0x060C, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7, /* 0xA0 */ + 0x00A8, 0x00A9, 0, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF, /* 0xA0 */ + 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7, /* 0xB0 */ + 0x00B8, 0x00B9, 0x061B, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 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, 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, 0 /* 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 73 +static ImplUniCharTabData const aImplMS1256ToCharTabEx[MS1256TOCHARTABEX_COUNT] = +{ + { 0x00A0, 0xA0 }, + { 0x00A2, 0xA2 }, + { 0x00A3, 0xA3 }, + { 0x00A4, 0xA4 }, + { 0x00A5, 0xA5 }, + { 0x00A6, 0xA6 }, + { 0x00A7, 0xA7 }, + { 0x00A8, 0xA8 }, + { 0x00A9, 0xA9 }, + { 0x00AB, 0xAB }, + { 0x00AC, 0xAC }, + { 0x00AD, 0xAD }, + { 0x00AE, 0xAE }, + { 0x00AF, 0xAF }, + { 0x00B0, 0xB0 }, + { 0x00B1, 0xB1 }, + { 0x00B2, 0xB2 }, + { 0x00B3, 0xB3 }, + { 0x00B4, 0xB4 }, + { 0x00B5, 0xB5 }, + { 0x00B6, 0xB6 }, + { 0x00B7, 0xB7 }, + { 0x00B8, 0xB8 }, + { 0x00B9, 0xB9 }, + { 0x00BB, 0xBB }, + { 0x00BC, 0xBC }, + { 0x00BD, 0xBD }, + { 0x00BE, 0xBE }, + { 0x00D7, 0xD7 }, + { 0x00E0, 0xE0 }, + { 0x00E2, 0xE2 }, + { 0x00E7, 0xE7 }, + { 0x00E8, 0xE8 }, + { 0x00E9, 0xE9 }, + { 0x00EA, 0xEA }, + { 0x00EB, 0xEB }, + { 0x00EE, 0xEE }, + { 0x00EF, 0xEF }, + { 0x00F4, 0xF4 }, + { 0x00F7, 0xF7 }, + { 0x00F9, 0xF9 }, + { 0x00FB, 0xFB }, + { 0x00FC, 0xFC }, + { 0x0152, 0x8C }, + { 0x0153, 0x9C }, + { 0x0192, 0x83 }, + { 0x02C6, 0x88 }, + { 0x060C, 0xA1 }, + { 0x067E, 0x81 }, + { 0x0686, 0x8D }, + { 0x0698, 0x8E }, + { 0x06AF, 0x90 }, + { 0x200C, 0x9D }, + { 0x200D, 0x9E }, + { 0x200E, 0xFD }, + { 0x200F, 0xFE }, + { 0x2013, 0x96 }, + { 0x2014, 0x97 }, + { 0x2018, 0x91 }, + { 0x2019, 0x92 }, + { 0x201A, 0x82 }, + { 0x201C, 0x93 }, + { 0x201D, 0x94 }, + { 0x201E, 0x84 }, + { 0x2020, 0x86 }, + { 0x2021, 0x87 }, + { 0x2022, 0x95 }, + { 0x2026, 0x85 }, + { 0x2030, 0x89 }, + { 0x2039, 0x8B }, + { 0x203A, 0x9B }, + { 0x20AC, 0x80 }, + { 0x2122, 0x99 } +}; + +/* ----------------------------------------------------------------------- */ + +static ImplByteConvertData const aImplMS1256ByteCvtData = +{ + aImplMS1256ToUniTab, + NULL, + MS1256UNI_START, MS1256UNI_END, + NOTABUNI_START, NOTABUNI_END, + aImplMS1256ToCharTab, + aImpl8090SameToCharTab, + aImplMS1256ToCharTabEx, + MS1256CHAR_START, MS1256CHAR_END, + SAME8090CHAR_START, SAME8090CHAR_END, + MS1256TOCHARTABEX_COUNT +}; + +/* ----------------------------------------------------------------------- */ + +static ImplTextConverterData const aImplMS1256TextConverterData = +{ + &aImplMS1256ByteCvtData, + NULL, + RTL_UNICODE_CHAR_DEFAULT +}; + +/* ----------------------------------------------------------------------- */ + +static ImplTextConverter const aImplMS1256TextConverter = +{ + &aImplMS1256TextConverterData, + ImplCharToUnicode, + ImplUnicodeToChar, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL +}; + +/* ----------------------------------------------------------------------- */ + +static ImplTextEncodingData const aImplMS1256TextEncodingData = +{ + &aImplMS1256TextConverter, + RTL_TEXTENCODING_MS_1256, + 1, 1, 1, + 178, + 864, + 4, + (const sal_Char*)"iso8859-6", + (const sal_Char*)"iso-8859-6", + RTL_TEXTENCODING_INFO_ASCII | + RTL_TEXTENCODING_INFO_R2L | + RTL_TEXTENCODING_INFO_WIN, + SCRIPT_ARABIC +}; + +/* ======================================================================= */ + +/* 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 }, + { 0x00A4, 0xA4 }, + { 0x00AD, 0xAD }, + { 0x060C, 0xAC } +}; + +/* ----------------------------------------------------------------------- */ + +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 ImplTextConverterData const aImplISO88596TextConverterData = +{ + &aImplISO88596ByteCvtData, + NULL, + RTL_UNICODE_CHAR_DEFAULT +}; + +/* ----------------------------------------------------------------------- */ + +static ImplTextConverter const aImplISO88596TextConverter = +{ + &aImplISO88596TextConverterData, + ImplCharToUnicode, + ImplUnicodeToChar, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL +}; + +/* ----------------------------------------------------------------------- */ + +static ImplTextEncodingData const aImplISO88596TextEncodingData = +{ + &aImplISO88596TextConverter, + RTL_TEXTENCODING_ISO_8859_8, + 1, 1, 1, + 178, + 864, + 4, + (const sal_Char*)"iso8859-6", + (const sal_Char*)"iso-8859-6", + RTL_TEXTENCODING_INFO_ASCII | + RTL_TEXTENCODING_INFO_R2L | + RTL_TEXTENCODING_INFO_MIME, + SCRIPT_ARABIC +}; + + +/* ======================================================================= */ + +/* 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 07/27/99 Version 1.0 (based on Unicode 3.0) */ +/* Last-Changes from us: */ + +#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, 0x203E, /* 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 }, + { 0x00A2, 0xA2 }, + { 0x00A3, 0xA3 }, + { 0x00A4, 0xA4 }, + { 0x00A5, 0xA5 }, + { 0x00A6, 0xA6 }, + { 0x00A7, 0xA7 }, + { 0x00A8, 0xA8 }, + { 0x00A9, 0xA9 }, + { 0x00AB, 0xAB }, + { 0x00AC, 0xAC }, + { 0x00AD, 0xAD }, + { 0x00AE, 0xAE }, + { 0x00B0, 0xB0 }, + { 0x00B1, 0xB1 }, + { 0x00B2, 0xB2 }, + { 0x00B3, 0xB3 }, + { 0x00B4, 0xB4 }, + { 0x00B5, 0xB5 }, + { 0x00B6, 0xB6 }, + { 0x00B7, 0xB7 }, + { 0x00B8, 0xB8 }, + { 0x00B9, 0xB9 }, + { 0x00BB, 0xBB }, + { 0x00BC, 0xBC }, + { 0x00BD, 0xBD }, + { 0x00BE, 0xBE }, + { 0x00D7, 0xAA }, + { 0x00F7, 0xBA }, + { 0x200E, 0xFD }, + { 0x200F, 0xFE }, + { 0x2017, 0xDF }, + { 0x203E, 0xAF } +}; + +/* ----------------------------------------------------------------------- */ + +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 ImplTextConverterData const aImplISO88598TextConverterData = +{ + &aImplISO88598ByteCvtData, + NULL, + RTL_UNICODE_CHAR_DEFAULT +}; + +/* ----------------------------------------------------------------------- */ + +static ImplTextConverter const aImplISO88598TextConverter = +{ + &aImplISO88598TextConverterData, + ImplCharToUnicode, + ImplUnicodeToChar, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL +}; + +/* ----------------------------------------------------------------------- */ + +static ImplTextEncodingData const aImplISO88598TextEncodingData = +{ + &aImplISO88598TextConverter, + RTL_TEXTENCODING_ISO_8859_8, + 1, 1, 1, + 177, + 862, + 5, + (const sal_Char*)"iso8859-8", + (const sal_Char*)"iso-8859-8", + RTL_TEXTENCODING_INFO_ASCII | + RTL_TEXTENCODING_INFO_R2L | + RTL_TEXTENCODING_INFO_MIME, + SCRIPT_HEBREW +}; diff --git a/sal/textenc/tcvtbyte.c b/sal/textenc/tcvtbyte.c new file mode 100644 index 000000000000..0e1e2d5e821b --- /dev/null +++ b/sal/textenc/tcvtbyte.c @@ -0,0 +1,407 @@ +/************************************************************************* + * + * $RCSfile: tcvtbyte.c,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:17:28 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +#define _RTL_TCVTBYTE_C + +#ifndef _RTL_TENCHELP_H +#include +#endif +#ifndef _RTL_TEXTCVT_H +#include +#endif + +/* ======================================================================= */ + +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; + + *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 ) +{ + int nAction; + sal_Unicode c; + sal_Char* pEndDestBuf; + const sal_Unicode* pEndSrcBuf; + + *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) */ + nAction = ImplHandleUndefinedUnicodeToTextChar( pData, + &pSrcBuf, pEndSrcBuf, + &pDestBuf, pEndDestBuf, + nFlags, pInfo ); + if ( nAction == IMPL_TEXTCVT_BREAK ) + 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->mpConvertTables); + sal_Unicode* pEndDestBuf; + const sal_Char* pEndSrcBuf; + + *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, pData ); + } + } + + 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)); +} + +/* ----------------------------------------------------------------------- */ + +static sal_Char ImplConvertUnicodeCharToChar( const ImplByteConvertData* pConvertData, + sal_Unicode c ) +{ + sal_Char cConv; + const ImplUniCharTabData* pToCharExTab; + + if ( c < 0x80 ) + cConv = (sal_Char)c; + else + { + if ( (c >= pConvertData->mnToCharStart1) && (c <= pConvertData->mnToCharEnd1) ) + cConv = (sal_Char)pConvertData->mpToCharTab1[c-pConvertData->mnToCharStart1]; + else if ( (c >= pConvertData->mnToCharStart2) && (c <= pConvertData->mnToCharEnd2) ) + cConv = (sal_Char)pConvertData->mpToCharTab2[c-pConvertData->mnToCharStart2]; + else + { + cConv = 0x00; + + 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 + { + cConv = (sal_Char)pCharExData->mnChar; + break; + } + } + } + while ( nLow <= nHigh ); + } + } + } + + return cConv; +} + +/* ----------------------------------------------------------------------- */ + +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 ) +{ + int nAction; + sal_Unicode c; + sal_Char cConv; + const ImplByteConvertData* pConvertData = (const ImplByteConvertData*)(pData->mpConvertTables); + sal_Char* pEndDestBuf; + const sal_Unicode* pEndSrcBuf; + int i; + int n; + sal_uInt16 cTemp; + sal_Char aTempBuf[IMPL_MAX_REPLACECHAR+1]; + const sal_uInt16* pReplace; + + *pInfo = 0; + pEndDestBuf = pDestBuf+nDestBytes; + pEndSrcBuf = pSrcBuf+nSrcChars; + while ( pSrcBuf < pEndSrcBuf ) + { + c = *pSrcBuf; + if ( c < 0x80 ) + cConv = (sal_Char)c; + else + { + cConv = ImplConvertUnicodeCharToChar( pConvertData, c ); + + if ( !cConv ) + { + if ( nFlags & RTL_UNICODETOTEXT_FLAGS_UNDEFINED_REPLACE ) + { + cTemp = ImplGetReplaceChar( c ); + if ( cTemp ) + cConv = ImplConvertUnicodeCharToChar( pConvertData, cTemp ); + } + + if ( !cConv ) + { + if ( nFlags & RTL_UNICODETOTEXT_FLAGS_UNDEFINED_REPLACESTR ) + { + pReplace = ImplGetReplaceString( c ); + if ( pReplace ) + { + i = 0; + while ( *pReplace && (i < IMPL_MAX_REPLACECHAR) ) + { + cConv = ImplConvertUnicodeCharToChar( pConvertData, *pReplace ); + if ( !cConv ) + break; + aTempBuf[i] = cConv; + pReplace++; + i++; + } + + if ( cConv ) + { + if ( pDestBuf+i >= pEndDestBuf ) + { + *pInfo |= RTL_UNICODETOTEXT_INFO_ERROR | RTL_UNICODETOTEXT_INFO_DESTBUFFERTOSMALL; + break; + } + + n = 0; + while ( n < i ) + { + *pDestBuf = aTempBuf[n]; + pDestBuf++; + n++; + } + pSrcBuf++; + continue; + } + } + } + + /* Handle undefined and surrogates characters */ + /* (all surrogates characters are undefined) */ + nAction = ImplHandleUndefinedUnicodeToTextChar( pData, + &pSrcBuf, pEndSrcBuf, + &pDestBuf, pEndDestBuf, + nFlags, pInfo ); + if ( nAction == IMPL_TEXTCVT_BREAK ) + break; + else + continue; + } + } + } + + if ( pDestBuf == pEndDestBuf ) + { + *pInfo |= RTL_UNICODETOTEXT_INFO_ERROR | RTL_UNICODETOTEXT_INFO_DESTBUFFERTOSMALL; + break; + } + + *pDestBuf = cConv; + pDestBuf++; + 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..e6e2d4420f9f --- /dev/null +++ b/sal/textenc/tcvteas1.tab @@ -0,0 +1,353 @@ +/************************************************************************* + * + * $RCSfile: tcvteas1.tab,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:17:28 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRUNTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRUNTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc.. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +/* ======================================================================= */ + +/* 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, 0x0081, 0x0082, 0x0083, 0x0084, 0x2026, 0x0086, 0x0087, /* 0x80 */ + 0x0088, 0x0089, 0x008A, 0x008B, 0x008C, 0x008D, 0x008E, 0x008F, /* 0x80 */ + 0x0090, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, /* 0x90 */ + 0x0098, 0x0099, 0x009A, 0x009B, 0x009C, 0x009D, 0x009E, 0x009F, /* 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 }, + { 0x2013, 0x96 }, + { 0x2014, 0x97 }, + { 0x2018, 0x91 }, + { 0x2019, 0x92 }, + { 0x201C, 0x93 }, + { 0x201D, 0x94 }, + { 0x2022, 0x95 }, + { 0x2026, 0x85 }, + { 0x20AC, 0x80 } +}; + +/* ----------------------------------------------------------------------- */ + +static ImplByteConvertData const aImplMS874ByteCvtData = +{ + aImplMS874ToUniTab, + NULL, + MS874UNI_START, MS874UNI_END, + NOTABUNI_START, NOTABUNI_END, + aImplMS874ToCharTab, + aImpl8090SameToCharTab, + aImplMS874ToCharTabEx, + MS874CHAR_START, MS874CHAR_END, + SAME8090CHAR_START, SAME8090CHAR_END, + MS874TOCHARTABEX_COUNT +}; + +/* ----------------------------------------------------------------------- */ + +static ImplTextConverterData const aImplMS874TextConverterData = +{ + &aImplMS874ByteCvtData, + NULL, + RTL_UNICODE_CHAR_DEFAULT +}; + +/* ----------------------------------------------------------------------- */ + +static ImplTextConverter const aImplMS874TextConverter = +{ + &aImplMS874TextConverterData, + ImplCharToUnicode, + ImplUnicodeToChar, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL +}; + +/* ----------------------------------------------------------------------- */ + +static ImplTextEncodingData const aImplMS874TextEncodingData = +{ + &aImplMS874TextConverter, + RTL_TEXTENCODING_MS_874, + 1, 1, 1, + 222, + 874, + 21, + (const sal_Char*)"iso8859-1", /* ??? */ + (const sal_Char*)"iso-8859-1", /* ??? */ + RTL_TEXTENCODING_INFO_ASCII | + RTL_TEXTENCODING_INFO_WIN | + RTL_TEXTENCODING_INFO_DOS_OS2, + SCRIPT_THAI +}; + +/* ======================================================================= */ + +/* 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, 0x0081, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021, /* 0x80 */ + 0x02C6, 0x2030, 0x008A, 0x2039, 0x0152, 0x008D, 0x008E, 0x008F, /* 0x80 */ + 0x0090, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, /* 0x90 */ + 0x02DC, 0x2122, 0x009A, 0x203A, 0x0153, 0x009D, 0x009E, 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 */ +}; + +/* ----------------------------------------------------------------------- */ + +#define MS1258TOCHARTABEX_COUNT 37 +static ImplUniCharTabData const aImplMS1258ToCharTabEx[MS1258TOCHARTABEX_COUNT] = +{ + { 0x0102, 0xC3 }, + { 0x0103, 0xE3 }, + { 0x0110, 0xD0 }, + { 0x0111, 0xF0 }, + { 0x0152, 0x8C }, + { 0x0153, 0x9C }, + { 0x0178, 0x9F }, + { 0x0192, 0x83 }, + { 0x01A0, 0xD5 }, + { 0x01A1, 0xF5 }, + { 0x01AF, 0xDD }, + { 0x01B0, 0xFD }, + { 0x02C6, 0x88 }, + { 0x02DC, 0x98 }, + { 0x0300, 0xCC }, + { 0x0301, 0xEC }, + { 0x0303, 0xDE }, + { 0x0309, 0xD2 }, + { 0x0323, 0xF2 }, + { 0x2013, 0x96 }, + { 0x2014, 0x97 }, + { 0x2018, 0x91 }, + { 0x2019, 0x92 }, + { 0x201A, 0x82 }, + { 0x201C, 0x93 }, + { 0x201D, 0x94 }, + { 0x201E, 0x84 }, + { 0x2020, 0x86 }, + { 0x2021, 0x87 }, + { 0x2022, 0x95 }, + { 0x2026, 0x85 }, + { 0x2030, 0x89 }, + { 0x2039, 0x8B }, + { 0x203A, 0x9B }, + { 0x20AB, 0xFE }, + { 0x20AC, 0x80 }, + { 0x2122, 0x99 }, +}; + +/* ----------------------------------------------------------------------- */ + +static ImplByteConvertData const aImplMS1258ByteCvtData = +{ + aImplMS1258ToUniTab, + NULL, + MS1258UNI_START, MS1258UNI_END, + NOTABUNI_START, NOTABUNI_END, + aImplMS1258ToCharTab, + aImpl8090SameToCharTab, + aImplMS1258ToCharTabEx, + MS1258CHAR_START, MS1258CHAR_END, + SAME8090CHAR_START, SAME8090CHAR_END, + MS1258TOCHARTABEX_COUNT +}; + +/* ----------------------------------------------------------------------- */ + +static ImplTextConverterData const aImplMS1258TextConverterData = +{ + &aImplMS1258ByteCvtData, + NULL, + RTL_UNICODE_CHAR_DEFAULT +}; + +/* ----------------------------------------------------------------------- */ + +static ImplTextConverter const aImplMS1258TextConverter = +{ + &aImplMS1258TextConverterData, + ImplCharToUnicode, + ImplUnicodeToChar, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL +}; + +/* ----------------------------------------------------------------------- */ + +static ImplTextEncodingData const aImplMS1258TextEncodingData = +{ + &aImplMS1258TextConverter, + RTL_TEXTENCODING_MS_1258, + 1, 1, 1, + 163, + 0, + 30, + (const sal_Char*)"iso8859-1", /* ??? */ + (const sal_Char*)"iso-8859-1", /* ??? */ + RTL_TEXTENCODING_INFO_ASCII | + RTL_TEXTENCODING_INFO_WIN, + SCRIPT_VIETNAMESE +}; diff --git a/sal/textenc/tcvtest1.tab b/sal/textenc/tcvtest1.tab new file mode 100644 index 000000000000..0cb3282a2b50 --- /dev/null +++ b/sal/textenc/tcvtest1.tab @@ -0,0 +1,4862 @@ +/************************************************************************* + * + * $RCSfile: tcvtest1.tab,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:17:28 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRUNTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRUNTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc.. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +/* ======================================================================= */ + +/* 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 }, + { 0x00B0, 0xF8 }, + { 0x00B1, 0xF1 }, + { 0x00B2, 0xFD }, + { 0x00B7, 0xFA }, + { 0x00F7, 0xF6 }, + { 0x207F, 0xFC }, + { 0x2219, 0xF9 }, + { 0x221A, 0xFB }, + { 0x2248, 0xF7 }, + { 0x2264, 0xF3 }, + { 0x2265, 0xF2 }, + { 0x2500, 0xC4 }, + { 0x2502, 0xB3 }, + { 0x250C, 0xDA }, + { 0x2510, 0xBF }, + { 0x2514, 0xC0 }, + { 0x2518, 0xD9 }, + { 0x251C, 0xC3 }, + { 0x2524, 0xB4 }, + { 0x252C, 0xC2 }, + { 0x2534, 0xC1 }, + { 0x253C, 0xC5 }, + { 0x2550, 0xCD }, + { 0x2551, 0xBA }, + { 0x2552, 0xD5 }, + { 0x2553, 0xD6 }, + { 0x2554, 0xC9 }, + { 0x2555, 0xB8 }, + { 0x2556, 0xB7 }, + { 0x2557, 0xBB }, + { 0x2558, 0xD4 }, + { 0x2559, 0xD3 }, + { 0x255A, 0xC8 }, + { 0x255B, 0xBE }, + { 0x255C, 0xBD }, + { 0x255D, 0xBC }, + { 0x255E, 0xC6 }, + { 0x255F, 0xC7 }, + { 0x2560, 0xCC }, + { 0x2561, 0xB5 }, + { 0x2562, 0xB6 }, + { 0x2563, 0xB9 }, + { 0x2564, 0xD1 }, + { 0x2565, 0xD2 }, + { 0x2566, 0xCB }, + { 0x2567, 0xCF }, + { 0x2568, 0xD0 }, + { 0x2569, 0xCA }, + { 0x256A, 0xD8 }, + { 0x256B, 0xD7 }, + { 0x256C, 0xCE }, + { 0x2580, 0xDF }, + { 0x2584, 0xDC }, + { 0x2588, 0xDB }, + { 0x258C, 0xDD }, + { 0x2590, 0xDE }, + { 0x2591, 0xB0 }, + { 0x2592, 0xB1 }, + { 0x2593, 0xB2 }, + { 0x25A0, 0xFE } +}; + +/* ----------------------------------------------------------------------- */ + +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 ImplTextConverterData const aImplIBM737TextConverterData = +{ + &aImplIBM737ByteCvtData, + NULL, + RTL_UNICODE_CHAR_DEFAULT +}; + +/* ----------------------------------------------------------------------- */ + +static ImplTextConverter const aImplIBM737TextConverter = +{ + &aImplIBM737TextConverterData, + ImplCharToUnicode, + ImplUnicodeToChar, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL +}; + +/* ----------------------------------------------------------------------- */ + +static ImplTextEncodingData const aImplIBM737TextEncodingData = +{ + &aImplIBM737TextConverter, + RTL_TEXTENCODING_IBM_737, + 1, 1, 1, + 161, + 737, + 6, + (const sal_Char*)"iso8859-7", + (const sal_Char*)"iso-8859-7", + RTL_TEXTENCODING_INFO_ASCII | + RTL_TEXTENCODING_INFO_DOS_OS2, + SCRIPT_GREEK +}; + +/* ======================================================================= */ + +/* 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 }, + { 0x00A2, 0x96 }, + { 0x00A3, 0x9C }, + { 0x00A4, 0x9F }, + { 0x00A6, 0xA7 }, + { 0x00A7, 0xF5 }, + { 0x00A9, 0xA8 }, + { 0x00AB, 0xAE }, + { 0x00AC, 0xAA }, + { 0x00AD, 0xF0 }, + { 0x00AE, 0xA9 }, + { 0x00B0, 0xF8 }, + { 0x00B1, 0xF1 }, + { 0x00B2, 0xFD }, + { 0x00B3, 0xFC }, + { 0x00B5, 0xE6 }, + { 0x00B6, 0xF4 }, + { 0x00B7, 0xFA }, + { 0x00B9, 0xFB }, + { 0x00BB, 0xAF }, + { 0x00BC, 0xAC }, + { 0x00BD, 0xAB }, + { 0x00BE, 0xF3 }, + { 0x00C4, 0x8E }, + { 0x00C5, 0x8F }, + { 0x00C6, 0x92 }, + { 0x00C9, 0x90 }, + { 0x00D3, 0xE0 }, + { 0x00D5, 0xE5 }, + { 0x00D6, 0x99 }, + { 0x00D7, 0x9E }, + { 0x00D8, 0x9D }, + { 0x00DC, 0x9A }, + { 0x00DF, 0xE1 }, + { 0x00E4, 0x84 }, + { 0x00E5, 0x86 }, + { 0x00E6, 0x91 }, + { 0x00E9, 0x82 }, + { 0x00F3, 0xA2 }, + { 0x00F5, 0xE4 }, + { 0x00F6, 0x94 }, + { 0x00F7, 0xF6 }, + { 0x00F8, 0x9B }, + { 0x00FC, 0x81 }, + { 0x0100, 0xA0 }, + { 0x0101, 0x83 }, + { 0x0104, 0xB5 }, + { 0x0105, 0xD0 }, + { 0x0106, 0x80 }, + { 0x0107, 0x87 }, + { 0x010C, 0xB6 }, + { 0x010D, 0xD1 }, + { 0x0112, 0xED }, + { 0x0113, 0x89 }, + { 0x0116, 0xB8 }, + { 0x0117, 0xD3 }, + { 0x0118, 0xB7 }, + { 0x0119, 0xD2 }, + { 0x0122, 0x95 }, + { 0x0123, 0x85 }, + { 0x012A, 0xA1 }, + { 0x012B, 0x8C }, + { 0x012E, 0xBD }, + { 0x012F, 0xD4 }, + { 0x0136, 0xE8 }, + { 0x0137, 0xE9 }, + { 0x013B, 0xEA }, + { 0x013C, 0xEB }, + { 0x0141, 0xAD }, + { 0x0142, 0x88 }, + { 0x0143, 0xE3 }, + { 0x0144, 0xE7 }, + { 0x0145, 0xEE }, + { 0x0146, 0xEC }, + { 0x014C, 0xE2 }, + { 0x014D, 0x93 }, + { 0x0156, 0x8A }, + { 0x0157, 0x8B }, + { 0x015A, 0x97 }, + { 0x015B, 0x98 }, + { 0x0160, 0xBE }, + { 0x0161, 0xD5 }, + { 0x016A, 0xC7 }, + { 0x016B, 0xD7 }, + { 0x0172, 0xC6 }, + { 0x0173, 0xD6 }, + { 0x0179, 0x8D }, + { 0x017A, 0xA5 }, + { 0x017B, 0xA3 }, + { 0x017C, 0xA4 }, + { 0x017D, 0xCF }, + { 0x017E, 0xD8 }, + { 0x2019, 0xEF }, + { 0x201C, 0xF2 }, + { 0x201D, 0xA6 }, + { 0x201E, 0xF7 }, + { 0x2219, 0xF9 }, + { 0x2500, 0xC4 }, + { 0x2502, 0xB3 }, + { 0x250C, 0xDA }, + { 0x2510, 0xBF }, + { 0x2514, 0xC0 }, + { 0x2518, 0xD9 }, + { 0x251C, 0xC3 }, + { 0x2524, 0xB4 }, + { 0x252C, 0xC2 }, + { 0x2534, 0xC1 }, + { 0x253C, 0xC5 }, + { 0x2550, 0xCD }, + { 0x2551, 0xBA }, + { 0x2554, 0xC9 }, + { 0x2557, 0xBB }, + { 0x255A, 0xC8 }, + { 0x255D, 0xBC }, + { 0x2560, 0xCC }, + { 0x2563, 0xB9 }, + { 0x2566, 0xCB }, + { 0x2569, 0xCA }, + { 0x256C, 0xCE }, + { 0x2580, 0xDF }, + { 0x2584, 0xDC }, + { 0x2588, 0xDB }, + { 0x258C, 0xDD }, + { 0x2590, 0xDE }, + { 0x2591, 0xB0 }, + { 0x2592, 0xB1 }, + { 0x2593, 0xB2 }, + { 0x25A0, 0xFE } +}; + +/* ----------------------------------------------------------------------- */ + +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 ImplTextConverterData const aImplIBM775TextConverterData = +{ + &aImplIBM775ByteCvtData, + NULL, + RTL_UNICODE_CHAR_DEFAULT +}; + +/* ----------------------------------------------------------------------- */ + +static ImplTextConverter const aImplIBM775TextConverter = +{ + &aImplIBM775TextConverterData, + ImplCharToUnicode, + ImplUnicodeToChar, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL +}; + +/* ----------------------------------------------------------------------- */ + +static ImplTextEncodingData const aImplIBM775TextEncodingData = +{ + &aImplIBM775TextConverter, + RTL_TEXTENCODING_IBM_775, + 1, 1, 1, + 186, + 775, + 29, /* ??? */ + (const sal_Char*)"iso8859-4", + (const sal_Char*)"iso-8859-4", + RTL_TEXTENCODING_INFO_ASCII | + RTL_TEXTENCODING_INFO_DOS_OS2, + SCRIPT_BALTIC +}; + +/* ======================================================================= */ + +/* 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 }, + { 0x00A4, 0xCF }, + { 0x00A7, 0xF5 }, + { 0x00A8, 0xF9 }, + { 0x00AB, 0xAE }, + { 0x00AC, 0xAA }, + { 0x00AD, 0xF0 }, + { 0x00B0, 0xF8 }, + { 0x00B4, 0xEF }, + { 0x00B8, 0xF7 }, + { 0x00BB, 0xAF }, + { 0x00C1, 0xB5 }, + { 0x00C2, 0xB6 }, + { 0x00C4, 0x8E }, + { 0x00C7, 0x80 }, + { 0x00C9, 0x90 }, + { 0x00CB, 0xD3 }, + { 0x00CD, 0xD6 }, + { 0x00CE, 0xD7 }, + { 0x00D3, 0xE0 }, + { 0x00D4, 0xE2 }, + { 0x00D6, 0x99 }, + { 0x00D7, 0x9E }, + { 0x00DA, 0xE9 }, + { 0x00DC, 0x9A }, + { 0x00DD, 0xED }, + { 0x00DF, 0xE1 }, + { 0x00E1, 0xA0 }, + { 0x00E2, 0x83 }, + { 0x00E4, 0x84 }, + { 0x00E7, 0x87 }, + { 0x00E9, 0x82 }, + { 0x00EB, 0x89 }, + { 0x00ED, 0xA1 }, + { 0x00EE, 0x8C }, + { 0x00F3, 0xA2 }, + { 0x00F4, 0x93 }, + { 0x00F6, 0x94 }, + { 0x00F7, 0xF6 }, + { 0x00FA, 0xA3 }, + { 0x00FC, 0x81 }, + { 0x00FD, 0xEC }, + { 0x0102, 0xC6 }, + { 0x0103, 0xC7 }, + { 0x0104, 0xA4 }, + { 0x0105, 0xA5 }, + { 0x0106, 0x8F }, + { 0x0107, 0x86 }, + { 0x010C, 0xAC }, + { 0x010D, 0x9F }, + { 0x010E, 0xD2 }, + { 0x010F, 0xD4 }, + { 0x0110, 0xD1 }, + { 0x0111, 0xD0 }, + { 0x0118, 0xA8 }, + { 0x0119, 0xA9 }, + { 0x011A, 0xB7 }, + { 0x011B, 0xD8 }, + { 0x0139, 0x91 }, + { 0x013A, 0x92 }, + { 0x013D, 0x95 }, + { 0x013E, 0x96 }, + { 0x0141, 0x9D }, + { 0x0142, 0x88 }, + { 0x0143, 0xE3 }, + { 0x0144, 0xE4 }, + { 0x0147, 0xD5 }, + { 0x0148, 0xE5 }, + { 0x0150, 0x8A }, + { 0x0151, 0x8B }, + { 0x0154, 0xE8 }, + { 0x0155, 0xEA }, + { 0x0158, 0xFC }, + { 0x0159, 0xFD }, + { 0x015A, 0x97 }, + { 0x015B, 0x98 }, + { 0x015E, 0xB8 }, + { 0x015F, 0xAD }, + { 0x0160, 0xE6 }, + { 0x0161, 0xE7 }, + { 0x0162, 0xDD }, + { 0x0163, 0xEE }, + { 0x0164, 0x9B }, + { 0x0165, 0x9C }, + { 0x016E, 0xDE }, + { 0x016F, 0x85 }, + { 0x0170, 0xEB }, + { 0x0171, 0xFB }, + { 0x0179, 0x8D }, + { 0x017A, 0xAB }, + { 0x017B, 0xBD }, + { 0x017C, 0xBE }, + { 0x017D, 0xA6 }, + { 0x017E, 0xA7 }, + { 0x02C7, 0xF3 }, + { 0x02D8, 0xF4 }, + { 0x02D9, 0xFA }, + { 0x02DB, 0xF2 }, + { 0x02DD, 0xF1 }, + { 0x2500, 0xC4 }, + { 0x2502, 0xB3 }, + { 0x250C, 0xDA }, + { 0x2510, 0xBF }, + { 0x2514, 0xC0 }, + { 0x2518, 0xD9 }, + { 0x251C, 0xC3 }, + { 0x2524, 0xB4 }, + { 0x252C, 0xC2 }, + { 0x2534, 0xC1 }, + { 0x253C, 0xC5 }, + { 0x2550, 0xCD }, + { 0x2551, 0xBA }, + { 0x2554, 0xC9 }, + { 0x2557, 0xBB }, + { 0x255A, 0xC8 }, + { 0x255D, 0xBC }, + { 0x2560, 0xCC }, + { 0x2563, 0xB9 }, + { 0x2566, 0xCB }, + { 0x2569, 0xCA }, + { 0x256C, 0xCE }, + { 0x2580, 0xDF }, + { 0x2584, 0xDC }, + { 0x2588, 0xDB }, + { 0x2591, 0xB0 }, + { 0x2592, 0xB1 }, + { 0x2593, 0xB2 }, + { 0x25A0, 0xFE } +}; + +/* ----------------------------------------------------------------------- */ + +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 ImplTextConverterData const aImplIBM852TextConverterData = +{ + &aImplIBM852ByteCvtData, + NULL, + RTL_UNICODE_CHAR_DEFAULT +}; + +/* ----------------------------------------------------------------------- */ + +static ImplTextConverter const aImplIBM852TextConverter = +{ + &aImplIBM852TextConverterData, + ImplCharToUnicode, + ImplUnicodeToChar, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL +}; + +/* ----------------------------------------------------------------------- */ + +static ImplTextEncodingData const aImplIBM852TextEncodingData = +{ + &aImplIBM852TextConverter, + RTL_TEXTENCODING_IBM_852, + 1, 1, 1, + 238, + 852, + 29, + (const sal_Char*)"iso8859-2", + (const sal_Char*)"iso-8859-2", + RTL_TEXTENCODING_INFO_ASCII | + RTL_TEXTENCODING_INFO_DOS_OS2, + SCRIPT_EASTEUROPE +}; + +/* ======================================================================= */ + +/* 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 }, + { 0x00A4, 0xCF }, + { 0x00A7, 0xFD }, + { 0x00AB, 0xAE }, + { 0x00AD, 0xF0 }, + { 0x00BB, 0xAF }, + { 0x2116, 0xEF }, + { 0x2500, 0xC4 }, + { 0x2502, 0xB3 }, + { 0x250C, 0xDA }, + { 0x2510, 0xBF }, + { 0x2514, 0xC0 }, + { 0x2518, 0xD9 }, + { 0x251C, 0xC3 }, + { 0x2524, 0xB4 }, + { 0x252C, 0xC2 }, + { 0x2534, 0xC1 }, + { 0x253C, 0xC5 }, + { 0x2550, 0xCD }, + { 0x2551, 0xBA }, + { 0x2554, 0xC9 }, + { 0x2557, 0xBB }, + { 0x255A, 0xC8 }, + { 0x255D, 0xBC }, + { 0x2560, 0xCC }, + { 0x2563, 0xB9 }, + { 0x2566, 0xCB }, + { 0x2569, 0xCA }, + { 0x256C, 0xCE }, + { 0x2580, 0xDF }, + { 0x2584, 0xDC }, + { 0x2588, 0xDB }, + { 0x2591, 0xB0 }, + { 0x2592, 0xB1 }, + { 0x2593, 0xB2 }, + { 0x25A0, 0xFE } +}; + +/* ----------------------------------------------------------------------- */ + +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 ImplTextConverterData const aImplIBM855TextConverterData = +{ + &aImplIBM855ByteCvtData, + NULL, + RTL_UNICODE_CHAR_DEFAULT +}; + +/* ----------------------------------------------------------------------- */ + +static ImplTextConverter const aImplIBM855TextConverter = +{ + &aImplIBM855TextConverterData, + ImplCharToUnicode, + ImplUnicodeToChar, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL +}; + +/* ----------------------------------------------------------------------- */ + +static ImplTextEncodingData const aImplIBM855TextEncodingData = +{ + &aImplIBM855TextConverter, + RTL_TEXTENCODING_IBM_855, + 1, 1, 1, + 204, + 855, + 7, + (const sal_Char*)"iso8859-5", + (const sal_Char*)"iso-8859-5", + RTL_TEXTENCODING_INFO_ASCII | + RTL_TEXTENCODING_INFO_DOS_OS2, + SCRIPT_CYRILLIC +}; + +/* ======================================================================= */ + +/* 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 }, + { 0x011F, 0xA7 }, + { 0x0130, 0x98 }, + { 0x0131, 0x8D }, + { 0x015E, 0x9E }, + { 0x015F, 0x9F }, + { 0x2500, 0xC4 }, + { 0x2502, 0xB3 }, + { 0x250C, 0xDA }, + { 0x2510, 0xBF }, + { 0x2514, 0xC0 }, + { 0x2518, 0xD9 }, + { 0x251C, 0xC3 }, + { 0x2524, 0xB4 }, + { 0x252C, 0xC2 }, + { 0x2534, 0xC1 }, + { 0x253C, 0xC5 }, + { 0x2550, 0xCD }, + { 0x2551, 0xBA }, + { 0x2554, 0xC9 }, + { 0x2557, 0xBB }, + { 0x255A, 0xC8 }, + { 0x255D, 0xBC }, + { 0x2560, 0xCC }, + { 0x2563, 0xB9 }, + { 0x2566, 0xCB }, + { 0x2569, 0xCA }, + { 0x256C, 0xCE }, + { 0x2580, 0xDF }, + { 0x2584, 0xDC }, + { 0x2588, 0xDB }, + { 0x2591, 0xB0 }, + { 0x2592, 0xB1 }, + { 0x2593, 0xB2 }, + { 0x25A0, 0xFE } +}; + +/* ----------------------------------------------------------------------- */ + +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 ImplTextConverterData const aImplIBM857TextConverterData = +{ + &aImplIBM857ByteCvtData, + NULL, + RTL_UNICODE_CHAR_DEFAULT +}; + +/* ----------------------------------------------------------------------- */ + +static ImplTextConverter const aImplIBM857TextConverter = +{ + &aImplIBM857TextConverterData, + ImplCharToUnicode, + ImplUnicodeToChar, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL +}; + +/* ----------------------------------------------------------------------- */ + +static ImplTextEncodingData const aImplIBM857TextEncodingData = +{ + &aImplIBM857TextConverter, + RTL_TEXTENCODING_IBM_857, + 1, 1, 1, + 162, + 857, + 35, + (const sal_Char*)"iso8859-9", + (const sal_Char*)"iso-8859-9", + RTL_TEXTENCODING_INFO_ASCII | + RTL_TEXTENCODING_INFO_DOS_OS2, + SCRIPT_TURKISH +}; + +/* ======================================================================= */ + +/* 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 }, + { 0x00A4, 0xFD }, + { 0x00B0, 0xF8 }, + { 0x00B7, 0xFA }, + { 0x2116, 0xFC }, + { 0x2219, 0xF9 }, + { 0x221A, 0xFB }, + { 0x2500, 0xC4 }, + { 0x2502, 0xB3 }, + { 0x250C, 0xDA }, + { 0x2510, 0xBF }, + { 0x2514, 0xC0 }, + { 0x2518, 0xD9 }, + { 0x251C, 0xC3 }, + { 0x2524, 0xB4 }, + { 0x252C, 0xC2 }, + { 0x2534, 0xC1 }, + { 0x253C, 0xC5 }, + { 0x2550, 0xCD }, + { 0x2551, 0xBA }, + { 0x2552, 0xD5 }, + { 0x2553, 0xD6 }, + { 0x2554, 0xC9 }, + { 0x2555, 0xB8 }, + { 0x2556, 0xB7 }, + { 0x2557, 0xBB }, + { 0x2558, 0xD4 }, + { 0x2559, 0xD3 }, + { 0x255A, 0xC8 }, + { 0x255B, 0xBE }, + { 0x255C, 0xBD }, + { 0x255D, 0xBC }, + { 0x255E, 0xC6 }, + { 0x255F, 0xC7 }, + { 0x2560, 0xCC }, + { 0x2561, 0xB5 }, + { 0x2562, 0xB6 }, + { 0x2563, 0xB9 }, + { 0x2564, 0xD1 }, + { 0x2565, 0xD2 }, + { 0x2566, 0xCB }, + { 0x2567, 0xCF }, + { 0x2568, 0xD0 }, + { 0x2569, 0xCA }, + { 0x256A, 0xD8 }, + { 0x256B, 0xD7 }, + { 0x256C, 0xCE }, + { 0x2580, 0xDF }, + { 0x2584, 0xDC }, + { 0x2588, 0xDB }, + { 0x258C, 0xDD }, + { 0x2590, 0xDE }, + { 0x2591, 0xB0 }, + { 0x2592, 0xB1 }, + { 0x2593, 0xB2 }, + { 0x25A0, 0xFE } +}; + +/* ----------------------------------------------------------------------- */ + +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 ImplTextConverterData const aImplIBM866TextConverterData = +{ + &aImplIBM866ByteCvtData, + NULL, + RTL_UNICODE_CHAR_DEFAULT +}; + +/* ----------------------------------------------------------------------- */ + +static ImplTextConverter const aImplIBM866TextConverter = +{ + &aImplIBM866TextConverterData, + ImplCharToUnicode, + ImplUnicodeToChar, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL +}; + +/* ----------------------------------------------------------------------- */ + +static ImplTextEncodingData const aImplIBM866TextEncodingData = +{ + &aImplIBM866TextConverter, + RTL_TEXTENCODING_IBM_866, + 1, 1, 1, + 204, + 866, + 7, + (const sal_Char*)"iso8859-5", + (const sal_Char*)"iso-8859-5", + RTL_TEXTENCODING_INFO_ASCII | + RTL_TEXTENCODING_INFO_DOS_OS2, + SCRIPT_LATIN +}; + +/* ======================================================================= */ + +/* 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 }, + { 0x00A3, 0x9C }, + { 0x00A6, 0x8A }, + { 0x00A7, 0xF5 }, + { 0x00A8, 0xF9 }, + { 0x00A9, 0x97 }, + { 0x00AB, 0xAE }, + { 0x00AC, 0x89 }, + { 0x00AD, 0xF0 }, + { 0x00B0, 0xF8 }, + { 0x00B1, 0xF1 }, + { 0x00B2, 0x99 }, + { 0x00B3, 0x9A }, + { 0x00B7, 0x88 }, + { 0x00BB, 0xAF }, + { 0x00BD, 0xAB }, + { 0x2015, 0x8E }, + { 0x2018, 0x8B }, + { 0x2019, 0x8C }, + { 0x2500, 0xC4 }, + { 0x2502, 0xB3 }, + { 0x250C, 0xDA }, + { 0x2510, 0xBF }, + { 0x2514, 0xC0 }, + { 0x2518, 0xD9 }, + { 0x251C, 0xC3 }, + { 0x2524, 0xB4 }, + { 0x252C, 0xC2 }, + { 0x2534, 0xC1 }, + { 0x253C, 0xC5 }, + { 0x2550, 0xCD }, + { 0x2551, 0xBA }, + { 0x2554, 0xC9 }, + { 0x2557, 0xBB }, + { 0x255A, 0xC8 }, + { 0x255D, 0xBC }, + { 0x2560, 0xCC }, + { 0x2563, 0xB9 }, + { 0x2566, 0xCB }, + { 0x2569, 0xCA }, + { 0x256C, 0xCE }, + { 0x2580, 0xDF }, + { 0x2584, 0xDC }, + { 0x2588, 0xDB }, + { 0x2591, 0xB0 }, + { 0x2592, 0xB1 }, + { 0x2593, 0xB2 }, + { 0x25A0, 0xFE } +}; + +/* ----------------------------------------------------------------------- */ + +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 ImplTextConverterData const aImplIBM869TextConverterData = +{ + &aImplIBM869ByteCvtData, + NULL, + RTL_UNICODE_CHAR_DEFAULT +}; + +/* ----------------------------------------------------------------------- */ + +static ImplTextConverter const aImplIBM869TextConverter = +{ + &aImplIBM869TextConverterData, + ImplCharToUnicode, + ImplUnicodeToChar, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL +}; + +/* ----------------------------------------------------------------------- */ + +static ImplTextEncodingData const aImplIBM869TextEncodingData = +{ + &aImplIBM869TextConverter, + RTL_TEXTENCODING_IBM_869, + 1, 1, 1, + 161, + 869, + 6, + (const sal_Char*)"iso8859-7", + (const sal_Char*)"iso-8859-7", + RTL_TEXTENCODING_INFO_ASCII | + RTL_TEXTENCODING_INFO_DOS_OS2, + SCRIPT_LATIN +}; + +/* ======================================================================= */ + +/* 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, 0x0081, 0x0082, 0x0083, 0x201E, 0x2026, 0x2020, 0x2021, /* 0x80 */ + 0x0088, 0x2030, 0x0160, 0x2039, 0x015A, 0x0164, 0x017D, 0x0179, /* 0x80 */ + 0x0090, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, /* 0x90 */ + 0x0098, 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 }, + { 0x00A4, 0xA4 }, + { 0x00A6, 0xA6 }, + { 0x00A7, 0xA7 }, + { 0x00A8, 0xA8 }, + { 0x00A9, 0xA9 }, + { 0x00AB, 0xAB }, + { 0x00AC, 0xAC }, + { 0x00AD, 0xAD }, + { 0x00AE, 0xAE }, + { 0x00B0, 0xB0 }, + { 0x00B1, 0xB1 }, + { 0x00B4, 0xB4 }, + { 0x00B5, 0xB5 }, + { 0x00B6, 0xB6 }, + { 0x00B7, 0xB7 }, + { 0x00B8, 0xB8 }, + { 0x00BB, 0xBB }, + { 0x00C1, 0xC1 }, + { 0x00C2, 0xC2 }, + { 0x00C4, 0xC4 }, + { 0x00C7, 0xC7 }, + { 0x00C9, 0xC9 }, + { 0x00CB, 0xCB }, + { 0x00CD, 0xCD }, + { 0x00CE, 0xCE }, + { 0x00D3, 0xD3 }, + { 0x00D4, 0xD4 }, + { 0x00D6, 0xD6 }, + { 0x00D7, 0xD7 }, + { 0x00DA, 0xDA }, + { 0x00DC, 0xDC }, + { 0x00DD, 0xDD }, + { 0x00DF, 0xDF }, + { 0x00E1, 0xE1 }, + { 0x00E2, 0xE2 }, + { 0x00E4, 0xE4 }, + { 0x00E7, 0xE7 }, + { 0x00E9, 0xE9 }, + { 0x00EB, 0xEB }, + { 0x00ED, 0xED }, + { 0x00EE, 0xEE }, + { 0x00F3, 0xF3 }, + { 0x00F4, 0xF4 }, + { 0x00F6, 0xF6 }, + { 0x00F7, 0xF7 }, + { 0x00FA, 0xFA }, + { 0x00FC, 0xFC }, + { 0x00FD, 0xFD }, + { 0x0102, 0xC3 }, + { 0x0103, 0xE3 }, + { 0x0104, 0xA5 }, + { 0x0105, 0xB9 }, + { 0x0106, 0xC6 }, + { 0x0107, 0xE6 }, + { 0x010C, 0xC8 }, + { 0x010D, 0xE8 }, + { 0x010E, 0xCF }, + { 0x010F, 0xEF }, + { 0x0110, 0xD0 }, + { 0x0111, 0xF0 }, + { 0x0118, 0xCA }, + { 0x0119, 0xEA }, + { 0x011A, 0xCC }, + { 0x011B, 0xEC }, + { 0x0139, 0xC5 }, + { 0x013A, 0xE5 }, + { 0x013D, 0xBC }, + { 0x013E, 0xBE }, + { 0x0141, 0xA3 }, + { 0x0142, 0xB3 }, + { 0x0143, 0xD1 }, + { 0x0144, 0xF1 }, + { 0x0147, 0xD2 }, + { 0x0148, 0xF2 }, + { 0x0150, 0xD5 }, + { 0x0151, 0xF5 }, + { 0x0154, 0xC0 }, + { 0x0155, 0xE0 }, + { 0x0158, 0xD8 }, + { 0x0159, 0xF8 }, + { 0x015A, 0x8C }, + { 0x015B, 0x9C }, + { 0x015E, 0xAA }, + { 0x015F, 0xBA }, + { 0x0160, 0x8A }, + { 0x0161, 0x9A }, + { 0x0162, 0xDE }, + { 0x0163, 0xFE }, + { 0x0164, 0x8D }, + { 0x0165, 0x9D }, + { 0x016E, 0xD9 }, + { 0x016F, 0xF9 }, + { 0x0170, 0xDB }, + { 0x0171, 0xFB }, + { 0x0179, 0x8F }, + { 0x017A, 0x9F }, + { 0x017B, 0xAF }, + { 0x017C, 0xBF }, + { 0x017D, 0x8E }, + { 0x017E, 0x9E }, + { 0x02C7, 0xA1 }, + { 0x02D8, 0xA2 }, + { 0x02D9, 0xFF }, + { 0x02DB, 0xB2 }, + { 0x02DD, 0xBD }, + { 0x2013, 0x96 }, + { 0x2014, 0x97 }, + { 0x2018, 0x91 }, + { 0x2019, 0x92 }, + { 0x201A, 0x82 }, + { 0x201C, 0x93 }, + { 0x201D, 0x94 }, + { 0x201E, 0x84 }, + { 0x2020, 0x86 }, + { 0x2021, 0x87 }, + { 0x2022, 0x95 }, + { 0x2026, 0x85 }, + { 0x2030, 0x89 }, + { 0x2039, 0x8B }, + { 0x203A, 0x9B }, + { 0x20AC, 0x80 }, + { 0x2122, 0x99 } +}; + +/* ----------------------------------------------------------------------- */ + +static ImplByteConvertData const aImplMS1250ByteCvtData = +{ + aImplMS1250ToUniTab, + NULL, + MS1250UNI_START, MS1250UNI_END, + NOTABUNI_START, NOTABUNI_END, + aImpl8090SameToCharTab, + NULL, + aImplMS1250ToCharTabEx, + SAME8090CHAR_START, SAME8090CHAR_END, + NOTABCHAR_START, NOTABCHAR_END, + MS1250TOCHARTABEX_COUNT +}; + +/* ----------------------------------------------------------------------- */ + +static ImplTextConverterData const aImplMS1250TextConverterData = +{ + &aImplMS1250ByteCvtData, + NULL, + RTL_UNICODE_CHAR_DEFAULT +}; + +/* ----------------------------------------------------------------------- */ + +static ImplTextConverter const aImplMS1250TextConverter = +{ + &aImplMS1250TextConverterData, + ImplCharToUnicode, + ImplUnicodeToChar, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL +}; + +/* ----------------------------------------------------------------------- */ + +static ImplTextEncodingData const aImplMS1250TextEncodingData = +{ + &aImplMS1250TextConverter, + RTL_TEXTENCODING_MS_1250, + 1, 1, 1, + 238, + 852, + 29, + (const sal_Char*)"iso8859-2", + (const sal_Char*)"iso-8859-2", + RTL_TEXTENCODING_INFO_ASCII | + RTL_TEXTENCODING_INFO_WIN, + SCRIPT_EASTEUROPE +}; + +/* ======================================================================= */ + +/* 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 */ + 0x0098, 0x2122, 0x0459, 0x009B, 0x009C, 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 }, + { 0x00A4, 0xA4 }, + { 0x00A6, 0xA6 }, + { 0x00A7, 0xA7 }, + { 0x00A9, 0xA9 }, + { 0x00AB, 0xAB }, + { 0x00AC, 0xAC }, + { 0x00AD, 0xAD }, + { 0x00AE, 0xAE }, + { 0x00B0, 0xB0 }, + { 0x00B1, 0xB1 }, + { 0x00B5, 0xB5 }, + { 0x00B6, 0xB6 }, + { 0x00B7, 0xB7 }, + { 0x00BB, 0xBB }, + { 0x0490, 0xA5 }, + { 0x0491, 0xB4 }, + { 0x2013, 0x96 }, + { 0x2014, 0x97 }, + { 0x2018, 0x91 }, + { 0x2019, 0x92 }, + { 0x201A, 0x82 }, + { 0x201C, 0x93 }, + { 0x201D, 0x94 }, + { 0x201E, 0x84 }, + { 0x2020, 0x86 }, + { 0x2021, 0x87 }, + { 0x2022, 0x95 }, + { 0x2026, 0x85 }, + { 0x2030, 0x89 }, + { 0x2039, 0x8B }, + { 0x203A, 0x9B }, + { 0x20AC, 0x88 }, + { 0x2116, 0xB9 }, + { 0x2122, 0x99 } +}; + +/* ----------------------------------------------------------------------- */ + +static ImplByteConvertData const aImplMS1251ByteCvtData = +{ + aImplMS1251ToUniTab, + NULL, + MS1251UNI_START, MS1251UNI_END, + NOTABUNI_START, NOTABUNI_END, + aImplMS1251ToCharTab, + aImpl8090SameToCharTab, + aImplMS1251ToCharTabEx, + MS1251CHAR_START, MS1251CHAR_END, + SAME8090CHAR_START, SAME8090CHAR_END, + MS1251TOCHARTABEX_COUNT +}; + +/* ----------------------------------------------------------------------- */ + +static ImplTextConverterData const aImplMS1251TextConverterData = +{ + &aImplMS1251ByteCvtData, + NULL, + RTL_UNICODE_CHAR_DEFAULT +}; + +/* ----------------------------------------------------------------------- */ + +static ImplTextConverter const aImplMS1251TextConverter = +{ + &aImplMS1251TextConverterData, + ImplCharToUnicode, + ImplUnicodeToChar, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL +}; + +/* ----------------------------------------------------------------------- */ + +static ImplTextEncodingData const aImplMS1251TextEncodingData = +{ + &aImplMS1251TextConverter, + RTL_TEXTENCODING_MS_1251, + 1, 1, 1, + 204, + 866, /* ??? 855 */ + 7, + (const sal_Char*)"iso8859-5", + (const sal_Char*)"iso-8859-5", + RTL_TEXTENCODING_INFO_ASCII | + RTL_TEXTENCODING_INFO_WIN, + SCRIPT_CYRILLIC +}; + +/* ======================================================================= */ + +/* 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, 0x0081, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021, /* 0x80 */ + 0x0088, 0x2030, 0x008A, 0x2039, 0x008C, 0x008D, 0x008E, 0x008F, /* 0x80 */ + 0x0090, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, /* 0x90 */ + 0x0098, 0x2122, 0x009A, 0x203A, 0x009C, 0x009D, 0x009E, 0x009F, /* 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 }, + { 0x00A3, 0xA3 }, + { 0x00A4, 0xA4 }, + { 0x00A5, 0xA5 }, + { 0x00A6, 0xA6 }, + { 0x00A7, 0xA7 }, + { 0x00A8, 0xA8 }, + { 0x00A9, 0xA9 }, + { 0x00AB, 0xAB }, + { 0x00AC, 0xAC }, + { 0x00AD, 0xAD }, + { 0x00AE, 0xAE }, + { 0x00B0, 0xB0 }, + { 0x00B1, 0xB1 }, + { 0x00B2, 0xB2 }, + { 0x00B3, 0xB3 }, + { 0x00B5, 0xB5 }, + { 0x00B6, 0xB6 }, + { 0x00B7, 0xB7 }, + { 0x00BB, 0xBB }, + { 0x00BD, 0xBD }, + { 0x0192, 0x83 }, + { 0x2013, 0x96 }, + { 0x2014, 0x97 }, + { 0x2015, 0xAF }, + { 0x2018, 0x91 }, + { 0x2019, 0x92 }, + { 0x201A, 0x82 }, + { 0x201C, 0x93 }, + { 0x201D, 0x94 }, + { 0x201E, 0x84 }, + { 0x2020, 0x86 }, + { 0x2021, 0x87 }, + { 0x2022, 0x95 }, + { 0x2026, 0x85 }, + { 0x2030, 0x89 }, + { 0x2039, 0x8B }, + { 0x203A, 0x9B }, + { 0x20AC, 0x80 }, + { 0x2122, 0x99 } +}; + +/* ----------------------------------------------------------------------- */ + +static ImplByteConvertData const aImplMS1253ByteCvtData = +{ + aImplMS1253ToUniTab, + NULL, + MS1253UNI_START, MS1253UNI_END, + NOTABUNI_START, NOTABUNI_END, + aImplMS1253ToCharTab, + aImpl8090SameToCharTab, + aImplMS1253ToCharTabEx, + MS1253CHAR_START, MS1253CHAR_END, + SAME8090CHAR_START, SAME8090CHAR_END, + MS1253TOCHARTABEX_COUNT +}; + +/* ----------------------------------------------------------------------- */ + +static ImplTextConverterData const aImplMS1253TextConverterData = +{ + &aImplMS1253ByteCvtData, + NULL, + RTL_UNICODE_CHAR_DEFAULT +}; + +/* ----------------------------------------------------------------------- */ + +static ImplTextConverter const aImplMS1253TextConverter = +{ + &aImplMS1253TextConverterData, + ImplCharToUnicode, + ImplUnicodeToChar, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL +}; + +/* ----------------------------------------------------------------------- */ + +static ImplTextEncodingData const aImplMS1253TextEncodingData = +{ + &aImplMS1253TextConverter, + RTL_TEXTENCODING_MS_1253, + 1, 1, 1, + 161, + 869, + 6, + (const sal_Char*)"iso8859-7", + (const sal_Char*)"iso-8859-7", + RTL_TEXTENCODING_INFO_ASCII | + RTL_TEXTENCODING_INFO_WIN, + SCRIPT_GREEK +}; + +/* ======================================================================= */ + +/* 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, 0x0081, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021, /* 0x80 */ + 0x02C6, 0x2030, 0x0160, 0x2039, 0x0152, 0x008D, 0x008E, 0x008F, /* 0x80 */ + 0x0090, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, /* 0x90 */ + 0x02DC, 0x2122, 0x0161, 0x203A, 0x0153, 0x009D, 0x009E, 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 }, + { 0x011F, 0xF0 }, + { 0x0130, 0xDD }, + { 0x0131, 0xFD }, + { 0x0152, 0x8C }, + { 0x0153, 0x9C }, + { 0x015E, 0xDE }, + { 0x015F, 0xFE }, + { 0x0160, 0x8A }, + { 0x0161, 0x9A }, + { 0x0178, 0x9F }, + { 0x0192, 0x83 }, + { 0x02C6, 0x88 }, + { 0x02DC, 0x98 }, + { 0x2013, 0x96 }, + { 0x2014, 0x97 }, + { 0x2018, 0x91 }, + { 0x2019, 0x92 }, + { 0x201A, 0x82 }, + { 0x201C, 0x93 }, + { 0x201D, 0x94 }, + { 0x201E, 0x84 }, + { 0x2020, 0x86 }, + { 0x2021, 0x87 }, + { 0x2022, 0x95 }, + { 0x2026, 0x85 }, + { 0x2030, 0x89 }, + { 0x2039, 0x8B }, + { 0x203A, 0x9B }, + { 0x20AC, 0x80 }, + { 0x2122, 0x99 } +}; + +/* ----------------------------------------------------------------------- */ + +static ImplByteConvertData const aImplMS1254ByteCvtData = +{ + aImplMS1254ToUniTab, + NULL, + MS1254UNI_START, MS1254UNI_END, + NOTABUNI_START, NOTABUNI_END, + aImplMS1254ToCharTab, + aImpl8090SameToCharTab, + aImplMS1254ToCharTabEx, + MS1254CHAR_START, MS1254CHAR_END, + SAME8090CHAR_START, SAME8090CHAR_END, + MS1254TOCHARTABEX_COUNT, +}; + +/* ----------------------------------------------------------------------- */ + +static ImplTextConverterData const aImplMS1254TextConverterData = +{ + &aImplMS1254ByteCvtData, + NULL, + RTL_UNICODE_CHAR_DEFAULT +}; + +/* ----------------------------------------------------------------------- */ + +static ImplTextConverter const aImplMS1254TextConverter = +{ + &aImplMS1254TextConverterData, + ImplCharToUnicode, + ImplUnicodeToChar, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL +}; + +/* ----------------------------------------------------------------------- */ + +static ImplTextEncodingData const aImplMS1254TextEncodingData = +{ + &aImplMS1254TextConverter, + RTL_TEXTENCODING_MS_1254, + 1, 1, 1, + 162, + 857, + 35, + (const sal_Char*)"iso8859-9", + (const sal_Char*)"iso-8859-9", + RTL_TEXTENCODING_INFO_ASCII | + RTL_TEXTENCODING_INFO_WIN, + SCRIPT_TURKISH +}; + +/* ======================================================================= */ + +/* 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, 0x0081, 0x201A, 0x0083, 0x201E, 0x2026, 0x2020, 0x2021, /* 0x80 */ + 0x0088, 0x2030, 0x008A, 0x2039, 0x008C, 0x00A8, 0x02C7, 0x00B8, /* 0x80 */ + 0x0090, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, /* 0x90 */ + 0x0098, 0x2122, 0x009A, 0x203A, 0x009C, 0x00AF, 0x02DB, 0x009F, /* 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 }, + { 0x02D9, 0xFF }, + { 0x02DB, 0x9E }, + { 0x2013, 0x96 }, + { 0x2014, 0x97 }, + { 0x2018, 0x91 }, + { 0x2019, 0x92 }, + { 0x201A, 0x82 }, + { 0x201C, 0x93 }, + { 0x201D, 0x94 }, + { 0x201E, 0x84 }, + { 0x2020, 0x86 }, + { 0x2021, 0x87 }, + { 0x2022, 0x95 }, + { 0x2026, 0x85 }, + { 0x2030, 0x89 }, + { 0x2039, 0x8B }, + { 0x203A, 0x9B }, + { 0x20AC, 0x80 }, + { 0x2122, 0x99 } +}; + +/* ----------------------------------------------------------------------- */ + +static ImplByteConvertData const aImplMS1257ByteCvtData = +{ + aImplMS1257ToUniTab, + NULL, + MS1257UNI_START, MS1257UNI_END, + NOTABUNI_START, NOTABUNI_END, + aImplMS1257ToCharTab, + aImpl8090SameToCharTab, + aImplMS1257ToCharTabEx, + MS1257CHAR_START, MS1257CHAR_END, + SAME8090CHAR_START, SAME8090CHAR_END, + MS1257TOCHARTABEX_COUNT, +}; + +/* ----------------------------------------------------------------------- */ + +static ImplTextConverterData const aImplMS1257TextConverterData = +{ + &aImplMS1257ByteCvtData, + NULL, + RTL_UNICODE_CHAR_DEFAULT +}; + +/* ----------------------------------------------------------------------- */ + +static ImplTextConverter const aImplMS1257TextConverter = +{ + &aImplMS1257TextConverterData, + ImplCharToUnicode, + ImplUnicodeToChar, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL +}; + +/* ----------------------------------------------------------------------- */ + +static ImplTextEncodingData const aImplMS1257TextEncodingData = +{ + &aImplMS1257TextConverter, + RTL_TEXTENCODING_MS_1257, + 1, 1, 1, + 186, + 775, + 29, + (const sal_Char*)"iso8859-4", + (const sal_Char*)"iso-8859-4", + RTL_TEXTENCODING_INFO_ASCII | + RTL_TEXTENCODING_INFO_WIN, + SCRIPT_BALTIC +}; + +/* ======================================================================= */ + +/* 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 }, + { 0x00A4, 0xA4 }, + { 0x00A7, 0xA7 }, + { 0x00A8, 0xA8 }, + { 0x00AD, 0xAD }, + { 0x00B0, 0xB0 }, + { 0x00B4, 0xB4 }, + { 0x00B8, 0xB8 }, + { 0x00C1, 0xC1 }, + { 0x00C2, 0xC2 }, + { 0x00C4, 0xC4 }, + { 0x00C7, 0xC7 }, + { 0x00C9, 0xC9 }, + { 0x00CB, 0xCB }, + { 0x00CD, 0xCD }, + { 0x00CE, 0xCE }, + { 0x00D3, 0xD3 }, + { 0x00D4, 0xD4 }, + { 0x00D6, 0xD6 }, + { 0x00D7, 0xD7 }, + { 0x00DA, 0xDA }, + { 0x00DC, 0xDC }, + { 0x00DD, 0xDD }, + { 0x00DF, 0xDF }, + { 0x00E1, 0xE1 }, + { 0x00E2, 0xE2 }, + { 0x00E4, 0xE4 }, + { 0x00E7, 0xE7 }, + { 0x00E9, 0xE9 }, + { 0x00EB, 0xEB }, + { 0x00ED, 0xED }, + { 0x00EE, 0xEE }, + { 0x00F3, 0xF3 }, + { 0x00F4, 0xF4 }, + { 0x00F6, 0xF6 }, + { 0x00F7, 0xF7 }, + { 0x00FA, 0xFA }, + { 0x00FC, 0xFC }, + { 0x00FD, 0xFD }, + { 0x0102, 0xC3 }, + { 0x0103, 0xE3 }, + { 0x0104, 0xA1 }, + { 0x0105, 0xB1 }, + { 0x0106, 0xC6 }, + { 0x0107, 0xE6 }, + { 0x010C, 0xC8 }, + { 0x010D, 0xE8 }, + { 0x010E, 0xCF }, + { 0x010F, 0xEF }, + { 0x0110, 0xD0 }, + { 0x0111, 0xF0 }, + { 0x0118, 0xCA }, + { 0x0119, 0xEA }, + { 0x011A, 0xCC }, + { 0x011B, 0xEC }, + { 0x0139, 0xC5 }, + { 0x013A, 0xE5 }, + { 0x013D, 0xA5 }, + { 0x013E, 0xB5 }, + { 0x0141, 0xA3 }, + { 0x0142, 0xB3 }, + { 0x0143, 0xD1 }, + { 0x0144, 0xF1 }, + { 0x0147, 0xD2 }, + { 0x0148, 0xF2 }, + { 0x0150, 0xD5 }, + { 0x0151, 0xF5 }, + { 0x0154, 0xC0 }, + { 0x0155, 0xE0 }, + { 0x0158, 0xD8 }, + { 0x0159, 0xF8 }, + { 0x015A, 0xA6 }, + { 0x015B, 0xB6 }, + { 0x015E, 0xAA }, + { 0x015F, 0xBA }, + { 0x0160, 0xA9 }, + { 0x0161, 0xB9 }, + { 0x0162, 0xDE }, + { 0x0163, 0xFE }, + { 0x0164, 0xAB }, + { 0x0165, 0xBB }, + { 0x016E, 0xD9 }, + { 0x016F, 0xF9 }, + { 0x0170, 0xDB }, + { 0x0171, 0xFB }, + { 0x0179, 0xAC }, + { 0x017A, 0xBC }, + { 0x017B, 0xAF }, + { 0x017C, 0xBF }, + { 0x017D, 0xAE }, + { 0x017E, 0xBE }, + { 0x02C7, 0xB7 }, + { 0x02D8, 0xA2 }, + { 0x02D9, 0xFF }, + { 0x02DB, 0xB2 }, + { 0x02DD, 0xBD } +}; + +/* ----------------------------------------------------------------------- */ + +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 ImplTextConverterData const aImplISO88592TextConverterData = +{ + &aImplISO88592ByteCvtData, + NULL, + RTL_UNICODE_CHAR_DEFAULT +}; + +/* ----------------------------------------------------------------------- */ + +static ImplTextConverter const aImplISO88592TextConverter = +{ + &aImplISO88592TextConverterData, + ImplCharToUnicode, + ImplUnicodeToChar, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL +}; + +/* ----------------------------------------------------------------------- */ + +static ImplTextEncodingData const aImplISO88592TextEncodingData = +{ + &aImplISO88592TextConverter, + RTL_TEXTENCODING_ISO_8859_2, + 1, 1, 1, + 238, + 852, + 29, + (const sal_Char*)"iso8859-2", + (const sal_Char*)"iso-8859-2", + RTL_TEXTENCODING_INFO_ASCII | + RTL_TEXTENCODING_INFO_MIME, + SCRIPT_EASTEUROPE +}; + +/* ======================================================================= */ + +/* 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 }, + { 0x00A3, 0xA3 }, + { 0x00A4, 0xA4 }, + { 0x00A7, 0xA7 }, + { 0x00A8, 0xA8 }, + { 0x00AD, 0xAD }, + { 0x00B0, 0xB0 }, + { 0x00B2, 0xB2 }, + { 0x00B3, 0xB3 }, + { 0x00B4, 0xB4 }, + { 0x00B5, 0xB5 }, + { 0x00B7, 0xB7 }, + { 0x00B8, 0xB8 }, + { 0x00BD, 0xBD }, + { 0x00C0, 0xC0 }, + { 0x00C1, 0xC1 }, + { 0x00C2, 0xC2 }, + { 0x00C4, 0xC4 }, + { 0x00C7, 0xC7 }, + { 0x00C8, 0xC8 }, + { 0x00C9, 0xC9 }, + { 0x00CA, 0xCA }, + { 0x00CB, 0xCB }, + { 0x00CC, 0xCC }, + { 0x00CD, 0xCD }, + { 0x00CE, 0xCE }, + { 0x00CF, 0xCF }, + { 0x00D1, 0xD1 }, + { 0x00D2, 0xD2 }, + { 0x00D3, 0xD3 }, + { 0x00D4, 0xD4 }, + { 0x00D6, 0xD6 }, + { 0x00D7, 0xD7 }, + { 0x00D9, 0xD9 }, + { 0x00DA, 0xDA }, + { 0x00DB, 0xDB }, + { 0x00DC, 0xDC }, + { 0x00DF, 0xDF }, + { 0x00E0, 0xE0 }, + { 0x00E1, 0xE1 }, + { 0x00E2, 0xE2 }, + { 0x00E4, 0xE4 }, + { 0x00E7, 0xE7 }, + { 0x00E8, 0xE8 }, + { 0x00E9, 0xE9 }, + { 0x00EA, 0xEA }, + { 0x00EB, 0xEB }, + { 0x00EC, 0xEC }, + { 0x00ED, 0xED }, + { 0x00EE, 0xEE }, + { 0x00EF, 0xEF }, + { 0x00F1, 0xF1 }, + { 0x00F2, 0xF2 }, + { 0x00F3, 0xF3 }, + { 0x00F4, 0xF4 }, + { 0x00F6, 0xF6 }, + { 0x00F7, 0xF7 }, + { 0x00F9, 0xF9 }, + { 0x00FA, 0xFA }, + { 0x00FB, 0xFB }, + { 0x00FC, 0xFC }, + { 0x0108, 0xC6 }, + { 0x0109, 0xE6 }, + { 0x010A, 0xC5 }, + { 0x010B, 0xE5 }, + { 0x011C, 0xD8 }, + { 0x011D, 0xF8 }, + { 0x011E, 0xAB }, + { 0x011F, 0xBB }, + { 0x0120, 0xD5 }, + { 0x0121, 0xF5 }, + { 0x0124, 0xA6 }, + { 0x0125, 0xB6 }, + { 0x0126, 0xA1 }, + { 0x0127, 0xB1 }, + { 0x0130, 0xA9 }, + { 0x0131, 0xB9 }, + { 0x0134, 0xAC }, + { 0x0135, 0xBC }, + { 0x015C, 0xDE }, + { 0x015D, 0xFE }, + { 0x015E, 0xAA }, + { 0x015F, 0xBA }, + { 0x016C, 0xDD }, + { 0x016D, 0xFD }, + { 0x017B, 0xAF }, + { 0x017C, 0xBF }, + { 0x02D8, 0xA2 }, + { 0x02D9, 0xFF } +}; + +/* ----------------------------------------------------------------------- */ + +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 ImplTextConverterData const aImplISO88593TextConverterData = +{ + &aImplISO88593ByteCvtData, + NULL, + RTL_UNICODE_CHAR_DEFAULT +}; + +/* ----------------------------------------------------------------------- */ + +static ImplTextConverter const aImplISO88593TextConverter = +{ + &aImplISO88593TextConverterData, + ImplCharToUnicode, + ImplUnicodeToChar, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL +}; + +/* ----------------------------------------------------------------------- */ + +static ImplTextEncodingData const aImplISO88593TextEncodingData = +{ + &aImplISO88593TextConverter, + RTL_TEXTENCODING_ISO_8859_3, + 1, 1, 1, + 0, + 850, + 0, + (const sal_Char*)"iso8859-3", + (const sal_Char*)"iso-8859-3", + RTL_TEXTENCODING_INFO_ASCII | + RTL_TEXTENCODING_INFO_MIME, + SCRIPT_LATIN +}; + +/* ======================================================================= */ + +/* 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 }, + { 0x00A4, 0xA4 }, + { 0x00A7, 0xA7 }, + { 0x00A8, 0xA8 }, + { 0x00AD, 0xAD }, + { 0x00AF, 0xAF }, + { 0x00B0, 0xB0 }, + { 0x00B4, 0xB4 }, + { 0x00B8, 0xB8 }, + { 0x00C1, 0xC1 }, + { 0x00C2, 0xC2 }, + { 0x00C3, 0xC3 }, + { 0x00C4, 0xC4 }, + { 0x00C5, 0xC5 }, + { 0x00C6, 0xC6 }, + { 0x00C9, 0xC9 }, + { 0x00CB, 0xCB }, + { 0x00CD, 0xCD }, + { 0x00CE, 0xCE }, + { 0x00D4, 0xD4 }, + { 0x00D5, 0xD5 }, + { 0x00D6, 0xD6 }, + { 0x00D7, 0xD7 }, + { 0x00D8, 0xD8 }, + { 0x00DA, 0xDA }, + { 0x00DB, 0xDB }, + { 0x00DC, 0xDC }, + { 0x00DF, 0xDF }, + { 0x00E1, 0xE1 }, + { 0x00E2, 0xE2 }, + { 0x00E3, 0xE3 }, + { 0x00E4, 0xE4 }, + { 0x00E5, 0xE5 }, + { 0x00E6, 0xE6 }, + { 0x00E9, 0xE9 }, + { 0x00EB, 0xEB }, + { 0x00ED, 0xED }, + { 0x00EE, 0xEE }, + { 0x00F4, 0xF4 }, + { 0x00F5, 0xF5 }, + { 0x00F6, 0xF6 }, + { 0x00F7, 0xF7 }, + { 0x00F8, 0xF8 }, + { 0x00FA, 0xFA }, + { 0x00FB, 0xFB }, + { 0x00FC, 0xFC }, + { 0x0100, 0xC0 }, + { 0x0101, 0xE0 }, + { 0x0104, 0xA1 }, + { 0x0105, 0xB1 }, + { 0x010C, 0xC8 }, + { 0x010D, 0xE8 }, + { 0x0110, 0xD0 }, + { 0x0111, 0xF0 }, + { 0x0112, 0xAA }, + { 0x0113, 0xBA }, + { 0x0116, 0xCC }, + { 0x0117, 0xEC }, + { 0x0118, 0xCA }, + { 0x0119, 0xEA }, + { 0x0122, 0xAB }, + { 0x0123, 0xBB }, + { 0x0128, 0xA5 }, + { 0x0129, 0xB5 }, + { 0x012A, 0xCF }, + { 0x012B, 0xEF }, + { 0x012E, 0xC7 }, + { 0x012F, 0xE7 }, + { 0x0136, 0xD3 }, + { 0x0137, 0xF3 }, + { 0x0138, 0xA2 }, + { 0x013B, 0xA6 }, + { 0x013C, 0xB6 }, + { 0x0145, 0xD1 }, + { 0x0146, 0xF1 }, + { 0x014A, 0xBD }, + { 0x014B, 0xBF }, + { 0x014C, 0xD2 }, + { 0x014D, 0xF2 }, + { 0x0156, 0xA3 }, + { 0x0157, 0xB3 }, + { 0x0160, 0xA9 }, + { 0x0161, 0xB9 }, + { 0x0166, 0xAC }, + { 0x0167, 0xBC }, + { 0x0168, 0xDD }, + { 0x0169, 0xFD }, + { 0x016A, 0xDE }, + { 0x016B, 0xFE }, + { 0x0172, 0xD9 }, + { 0x0173, 0xF9 }, + { 0x017D, 0xAE }, + { 0x017E, 0xBE }, + { 0x02C7, 0xB7 }, + { 0x02D9, 0xFF }, + { 0x02DB, 0xB2 } +}; + +/* ----------------------------------------------------------------------- */ + +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 ImplTextConverterData const aImplISO88594TextConverterData = +{ + &aImplISO88594ByteCvtData, + NULL, + RTL_UNICODE_CHAR_DEFAULT +}; + +/* ----------------------------------------------------------------------- */ + +static ImplTextConverter const aImplISO88594TextConverter = +{ + &aImplISO88594TextConverterData, + ImplCharToUnicode, + ImplUnicodeToChar, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL +}; + +/* ----------------------------------------------------------------------- */ + +static ImplTextEncodingData const aImplISO88594TextEncodingData = +{ + &aImplISO88594TextConverter, + RTL_TEXTENCODING_ISO_8859_4, + 1, 1, 1, + 186, + 775, + 29, /* ??? */ + (const sal_Char*)"iso8859-4", + (const sal_Char*)"iso-8859-4", + RTL_TEXTENCODING_INFO_ASCII | + RTL_TEXTENCODING_INFO_MIME, + SCRIPT_BALTIC +}; + +/* ======================================================================= */ + +/* 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 }, + { 0x00A7, 0xFD }, + { 0x00AD, 0xAD }, + { 0x2116, 0xF0 } +}; + +/* ----------------------------------------------------------------------- */ + +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 ImplTextConverterData const aImplISO88595TextConverterData = +{ + &aImplISO88595ByteCvtData, + NULL, + RTL_UNICODE_CHAR_DEFAULT +}; + +/* ----------------------------------------------------------------------- */ + +static ImplTextConverter const aImplISO88595TextConverter = +{ + &aImplISO88595TextConverterData, + ImplCharToUnicode, + ImplUnicodeToChar, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL +}; + +/* ----------------------------------------------------------------------- */ + +static ImplTextEncodingData const aImplISO88595TextEncodingData = +{ + &aImplISO88595TextConverter, + RTL_TEXTENCODING_ISO_8859_5, + 1, 1, 1, + 204, + 866, /* ??? 855 */ + 7, + (const sal_Char*)"iso8859-5", + (const sal_Char*)"iso-8859-5", + RTL_TEXTENCODING_INFO_ASCII | + RTL_TEXTENCODING_INFO_MIME, + SCRIPT_CYRILLIC +}; + +/* ======================================================================= */ + +/* 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 }, + { 0x00A3, 0xA3 }, + { 0x00A6, 0xA6 }, + { 0x00A7, 0xA7 }, + { 0x00A8, 0xA8 }, + { 0x00A9, 0xA9 }, + { 0x00AB, 0xAB }, + { 0x00AC, 0xAC }, + { 0x00AD, 0xAD }, + { 0x00B0, 0xB0 }, + { 0x00B1, 0xB1 }, + { 0x00B2, 0xB2 }, + { 0x00B3, 0xB3 }, + { 0x00B7, 0xB7 }, + { 0x00BB, 0xBB }, + { 0x00BD, 0xBD }, + { 0x2015, 0xAF }, + { 0x2018, 0xA1 }, + { 0x2019, 0xA2 } +}; + +/* ----------------------------------------------------------------------- */ + +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 ImplTextConverterData const aImplISO88597TextConverterData = +{ + &aImplISO88597ByteCvtData, + NULL, + RTL_UNICODE_CHAR_DEFAULT +}; + +/* ----------------------------------------------------------------------- */ + +static ImplTextConverter const aImplISO88597TextConverter = +{ + &aImplISO88597TextConverterData, + ImplCharToUnicode, + ImplUnicodeToChar, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL +}; + +/* ----------------------------------------------------------------------- */ + +static ImplTextEncodingData const aImplISO88597TextEncodingData = +{ + &aImplISO88597TextConverter, + RTL_TEXTENCODING_ISO_8859_7, + 1, 1, 1, + 161, + 869, + 6, + (const sal_Char*)"iso8859-7", + (const sal_Char*)"iso-8859-7", + RTL_TEXTENCODING_INFO_ASCII | + RTL_TEXTENCODING_INFO_MIME, + SCRIPT_GREEK +}; + +/* ======================================================================= */ + +/* 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 }, + { 0x011F, 0xF0 }, + { 0x0130, 0xDD }, + { 0x0131, 0xFD }, + { 0x015E, 0xDE }, + { 0x015F, 0xFE } +}; + +/* ----------------------------------------------------------------------- */ + +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 ImplTextConverterData const aImplISO88599TextConverterData = +{ + &aImplISO88599ByteCvtData, + NULL, + RTL_UNICODE_CHAR_DEFAULT +}; + +/* ----------------------------------------------------------------------- */ + +static ImplTextConverter const aImplISO88599TextConverter = +{ + &aImplISO88599TextConverterData, + ImplCharToUnicode, + ImplUnicodeToChar, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL +}; + +/* ----------------------------------------------------------------------- */ + +static ImplTextEncodingData const aImplISO88599TextEncodingData = +{ + &aImplISO88599TextConverter, + RTL_TEXTENCODING_ISO_8859_9, + 1, 1, 1, + 162, + 857, + 35, + (const sal_Char*)"iso8859-9", + (const sal_Char*)"iso-8859-9", + RTL_TEXTENCODING_INFO_ASCII | + RTL_TEXTENCODING_INFO_MIME, + SCRIPT_TURKISH +}; + +/* ======================================================================= */ + +/* 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 }, + { 0x00A7, 0xA7 }, + { 0x00AD, 0xAD }, + { 0x00B0, 0xB0 }, + { 0x00B7, 0xB7 }, + { 0x0100, 0xC0 }, + { 0x0101, 0xE0 }, + { 0x0104, 0xA1 }, + { 0x0105, 0xB1 }, + { 0x010C, 0xC8 }, + { 0x010D, 0xE8 }, + { 0x0110, 0xA9 }, + { 0x0111, 0xB9 }, + { 0x0112, 0xA2 }, + { 0x0113, 0xB2 }, + { 0x0116, 0xCC }, + { 0x0117, 0xEC }, + { 0x0118, 0xCA }, + { 0x0119, 0xEA }, + { 0x0122, 0xA3 }, + { 0x0123, 0xB3 }, + { 0x0128, 0xA5 }, + { 0x0129, 0xB5 }, + { 0x012A, 0xA4 }, + { 0x012B, 0xB4 }, + { 0x012E, 0xC7 }, + { 0x012F, 0xE7 }, + { 0x0136, 0xA6 }, + { 0x0137, 0xB6 }, + { 0x0138, 0xFF }, + { 0x013B, 0xA8 }, + { 0x013C, 0xB8 }, + { 0x0145, 0xD1 }, + { 0x0146, 0xF1 }, + { 0x014A, 0xAF }, + { 0x014B, 0xBF }, + { 0x014C, 0xD2 }, + { 0x014D, 0xF2 }, + { 0x0160, 0xAA }, + { 0x0161, 0xBA }, + { 0x0166, 0xAB }, + { 0x0167, 0xBB }, + { 0x0168, 0xD7 }, + { 0x0169, 0xF7 }, + { 0x016A, 0xAE }, + { 0x016B, 0xBE }, + { 0x0172, 0xD9 }, + { 0x0173, 0xF9 }, + { 0x017D, 0xAC }, + { 0x017E, 0xBC }, + { 0x2015, 0xBD } +}; + +/* ----------------------------------------------------------------------- */ + +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 ImplTextConverterData const aImplISO885910TextConverterData = +{ + &aImplISO885910ByteCvtData, + NULL, + RTL_UNICODE_CHAR_DEFAULT +}; + +/* ----------------------------------------------------------------------- */ + +static ImplTextConverter const aImplISO885910TextConverter = +{ + &aImplISO885910TextConverterData, + ImplCharToUnicode, + ImplUnicodeToChar, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL +}; + +/* ----------------------------------------------------------------------- */ + +static ImplTextEncodingData const aImplISO885910TextEncodingData = +{ + &aImplISO885910TextConverter, + RTL_TEXTENCODING_ISO_8859_10, + 1, 1, 1, + 238, + 852, + 29, + (const sal_Char*)"iso8859-10", + (const sal_Char*)"iso-8859-10", + RTL_TEXTENCODING_INFO_ASCII | + RTL_TEXTENCODING_INFO_MIME, + SCRIPT_EASTEUROPE +}; + +/* ======================================================================= */ + +/* 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 }, + { 0x00A2, 0xA2 }, + { 0x00A3, 0xA3 }, + { 0x00A4, 0xA4 }, + { 0x00A6, 0xA6 }, + { 0x00A7, 0xA7 }, + { 0x00A9, 0xA9 }, + { 0x00AB, 0xAB }, + { 0x00AC, 0xAC }, + { 0x00AD, 0xAD }, + { 0x00AE, 0xAE }, + { 0x00B0, 0xB0 }, + { 0x00B1, 0xB1 }, + { 0x00B2, 0xB2 }, + { 0x00B3, 0xB3 }, + { 0x00B5, 0xB5 }, + { 0x00B6, 0xB6 }, + { 0x00B7, 0xB7 }, + { 0x00B9, 0xB9 }, + { 0x00BB, 0xBB }, + { 0x00BC, 0xBC }, + { 0x00BD, 0xBD }, + { 0x00BE, 0xBE }, + { 0x00C4, 0xC4 }, + { 0x00C5, 0xC5 }, + { 0x00C6, 0xAF }, + { 0x00C9, 0xC9 }, + { 0x00D3, 0xD3 }, + { 0x00D5, 0xD5 }, + { 0x00D6, 0xD6 }, + { 0x00D7, 0xD7 }, + { 0x00D8, 0xA8 }, + { 0x00DC, 0xDC }, + { 0x00DF, 0xDF }, + { 0x00E4, 0xE4 }, + { 0x00E5, 0xE5 }, + { 0x00E6, 0xBF }, + { 0x00E9, 0xE9 }, + { 0x00F3, 0xF3 }, + { 0x00F5, 0xF5 }, + { 0x00F6, 0xF6 }, + { 0x00F7, 0xF7 }, + { 0x00F8, 0xB8 }, + { 0x00FC, 0xFC }, + { 0x0100, 0xC2 }, + { 0x0101, 0xE2 }, + { 0x0104, 0xC0 }, + { 0x0105, 0xE0 }, + { 0x0106, 0xC3 }, + { 0x0107, 0xE3 }, + { 0x010C, 0xC8 }, + { 0x010D, 0xE8 }, + { 0x0112, 0xC7 }, + { 0x0113, 0xE7 }, + { 0x0116, 0xCB }, + { 0x0117, 0xEB }, + { 0x0118, 0xC6 }, + { 0x0119, 0xE6 }, + { 0x0122, 0xCC }, + { 0x0123, 0xEC }, + { 0x012A, 0xCE }, + { 0x012B, 0xEE }, + { 0x012E, 0xC1 }, + { 0x012F, 0xE1 }, + { 0x0136, 0xCD }, + { 0x0137, 0xED }, + { 0x013B, 0xCF }, + { 0x013C, 0xEF }, + { 0x0141, 0xD9 }, + { 0x0142, 0xF9 }, + { 0x0143, 0xD1 }, + { 0x0144, 0xF1 }, + { 0x0145, 0xD2 }, + { 0x0146, 0xF2 }, + { 0x014C, 0xD4 }, + { 0x014D, 0xF4 }, + { 0x0156, 0xAA }, + { 0x0157, 0xBA }, + { 0x015A, 0xDA }, + { 0x015B, 0xFA }, + { 0x0160, 0xD0 }, + { 0x0161, 0xF0 }, + { 0x016A, 0xDB }, + { 0x016B, 0xFB }, + { 0x0172, 0xD8 }, + { 0x0173, 0xF8 }, + { 0x0179, 0xCA }, + { 0x017A, 0xEA }, + { 0x017B, 0xDD }, + { 0x017C, 0xFD }, + { 0x017D, 0xDE }, + { 0x017E, 0xFE }, + { 0x2019, 0xFF }, + { 0x201C, 0xB4 }, + { 0x201D, 0xA1 }, + { 0x201E, 0xA5 } +}; + +/* ----------------------------------------------------------------------- */ + +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 ImplTextConverterData const aImplISO885913TextConverterData = +{ + &aImplISO885913ByteCvtData, + NULL, + RTL_UNICODE_CHAR_DEFAULT +}; + +/* ----------------------------------------------------------------------- */ + +static ImplTextConverter const aImplISO885913TextConverter = +{ + &aImplISO885913TextConverterData, + ImplCharToUnicode, + ImplUnicodeToChar, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL +}; + +/* ----------------------------------------------------------------------- */ + +static ImplTextEncodingData const aImplISO885913TextEncodingData = +{ + &aImplISO885913TextConverter, + RTL_TEXTENCODING_ISO_8859_13, + 1, 1, 1, + 238, + 852, + 29, + (const sal_Char*)"iso8859-13", + (const sal_Char*)"iso-8859-13", + RTL_TEXTENCODING_INFO_ASCII | + RTL_TEXTENCODING_INFO_MIME, + SCRIPT_EASTEUROPE +}; + +/* ======================================================================= */ + +/* 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 }, + { 0x00A3, 0xA3 }, + { 0x00A7, 0xA4 }, + { 0x00A8, 0xAC }, + { 0x00A9, 0xA9 }, + { 0x00AB, 0xC7 }, + { 0x00AC, 0xC2 }, + { 0x00AE, 0xA8 }, + { 0x00B0, 0xA1 }, + { 0x00B6, 0xA6 }, + { 0x00BB, 0xC8 }, + { 0x00C1, 0xE7 }, + { 0x00C4, 0x80 }, + { 0x00C9, 0x83 }, + { 0x00CD, 0xEA }, + { 0x00D3, 0xEE }, + { 0x00D4, 0xEF }, + { 0x00D5, 0xCD }, + { 0x00D6, 0x85 }, + { 0x00DA, 0xF2 }, + { 0x00DC, 0x86 }, + { 0x00DD, 0xF8 }, + { 0x00DF, 0xA7 }, + { 0x00E1, 0x87 }, + { 0x00E4, 0x8A }, + { 0x00E9, 0x8E }, + { 0x00ED, 0x92 }, + { 0x00F3, 0x97 }, + { 0x00F4, 0x99 }, + { 0x00F5, 0x9B }, + { 0x00F6, 0x9A }, + { 0x00F7, 0xD6 }, + { 0x00FA, 0x9C }, + { 0x00FC, 0x9F }, + { 0x00FD, 0xF9 }, + { 0x0100, 0x81 }, + { 0x0101, 0x82 }, + { 0x0104, 0x84 }, + { 0x0105, 0x88 }, + { 0x0106, 0x8C }, + { 0x0107, 0x8D }, + { 0x010C, 0x89 }, + { 0x010D, 0x8B }, + { 0x010E, 0x91 }, + { 0x010F, 0x93 }, + { 0x0112, 0x94 }, + { 0x0113, 0x95 }, + { 0x0116, 0x96 }, + { 0x0117, 0x98 }, + { 0x0118, 0xA2 }, + { 0x0119, 0xAB }, + { 0x011A, 0x9D }, + { 0x011B, 0x9E }, + { 0x0122, 0xFE }, + { 0x0123, 0xAE }, + { 0x012A, 0xB1 }, + { 0x012B, 0xB4 }, + { 0x012E, 0xAF }, + { 0x012F, 0xB0 }, + { 0x0136, 0xB5 }, + { 0x0137, 0xFA }, + { 0x0139, 0xBD }, + { 0x013A, 0xBE }, + { 0x013B, 0xB9 }, + { 0x013C, 0xBA }, + { 0x013D, 0xBB }, + { 0x013E, 0xBC }, + { 0x0141, 0xFC }, + { 0x0142, 0xB8 }, + { 0x0143, 0xC1 }, + { 0x0144, 0xC4 }, + { 0x0145, 0xBF }, + { 0x0146, 0xC0 }, + { 0x0147, 0xC5 }, + { 0x0148, 0xCB }, + { 0x014C, 0xCF }, + { 0x014D, 0xD8 }, + { 0x0150, 0xCC }, + { 0x0151, 0xCE }, + { 0x0154, 0xD9 }, + { 0x0155, 0xDA }, + { 0x0156, 0xDF }, + { 0x0157, 0xE0 }, + { 0x0158, 0xDB }, + { 0x0159, 0xDE }, + { 0x015A, 0xE5 }, + { 0x015B, 0xE6 }, + { 0x0160, 0xE1 }, + { 0x0161, 0xE4 }, + { 0x0164, 0xE8 }, + { 0x0165, 0xE9 }, + { 0x016A, 0xED }, + { 0x016B, 0xF0 }, + { 0x016E, 0xF1 }, + { 0x016F, 0xF3 }, + { 0x0170, 0xF4 }, + { 0x0171, 0xF5 }, + { 0x0172, 0xF6 }, + { 0x0173, 0xF7 }, + { 0x0179, 0x8F }, + { 0x017A, 0x90 }, + { 0x017B, 0xFB }, + { 0x017C, 0xFD }, + { 0x017D, 0xEB }, + { 0x017E, 0xEC }, + { 0x02C7, 0xFF }, + { 0x2013, 0xD0 }, + { 0x2014, 0xD1 }, + { 0x2018, 0xD4 }, + { 0x2019, 0xD5 }, + { 0x201A, 0xE2 }, + { 0x201C, 0xD2 }, + { 0x201D, 0xD3 }, + { 0x201E, 0xE3 }, + { 0x2020, 0xA0 }, + { 0x2022, 0xA5 }, + { 0x2026, 0xC9 }, + { 0x2039, 0xDC }, + { 0x203A, 0xDD }, + { 0x2122, 0xAA }, + { 0x2202, 0xB6 }, + { 0x2206, 0xC6 }, + { 0x2211, 0xB7 }, + { 0x221A, 0xC3 }, + { 0x2260, 0xAD }, + { 0x2264, 0xB2 }, + { 0x2265, 0xB3 }, + { 0x25CA, 0xD7 } +}; + +/* ----------------------------------------------------------------------- */ + +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 ImplTextConverterData const aImplAPPLECENTEUROTextConverterData = +{ + &aImplAPPLECENTEUROByteCvtData, + NULL, + RTL_UNICODE_CHAR_DEFAULT +}; + +/* ----------------------------------------------------------------------- */ + +static ImplTextConverter const aImplAPPLECENTEUROTextConverter = +{ + &aImplAPPLECENTEUROTextConverterData, + ImplCharToUnicode, + ImplUnicodeToChar, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL +}; + +/* ----------------------------------------------------------------------- */ + +static ImplTextEncodingData const aImplAPPLECENTEUROTextEncodingData = +{ + &aImplAPPLECENTEUROTextConverter, + RTL_TEXTENCODING_APPLE_CENTEURO, + 1, 1, 1, + 238, + 852, + 29, + (const sal_Char*)"iso8859-2", + (const sal_Char*)"iso-8859-2", + RTL_TEXTENCODING_INFO_ASCII | + RTL_TEXTENCODING_INFO_MAC, + SCRIPT_EASTEUROPE +}; + +/* ======================================================================= */ + +/* 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 }, + { 0x0107, 0xE6 }, + { 0x010C, 0xC8 }, + { 0x010D, 0xE8 }, + { 0x0110, 0xD0 }, + { 0x0111, 0xF0 }, + { 0x0131, 0xF5 }, + { 0x0152, 0xCE }, + { 0x0153, 0xCF }, + { 0x0160, 0xA9 }, + { 0x0161, 0xB9 }, + { 0x017D, 0xAE }, + { 0x017E, 0xBE }, + { 0x0192, 0xC4 }, + { 0x02C6, 0xF6 }, + { 0x02C7, 0xFF }, + { 0x02DA, 0xFB }, + { 0x02DC, 0xF7 }, + { 0x03A9, 0xBD }, + { 0x03C0, 0xF9 }, + { 0x2013, 0xE0 }, + { 0x2014, 0xD1 }, + { 0x2018, 0xD4 }, + { 0x2019, 0xD5 }, + { 0x201A, 0xE2 }, + { 0x201C, 0xD2 }, + { 0x201D, 0xD3 }, + { 0x201E, 0xE3 }, + { 0x2020, 0xA0 }, + { 0x2022, 0xA5 }, + { 0x2026, 0xC9 }, + { 0x2030, 0xE4 }, + { 0x2039, 0xDC }, + { 0x203A, 0xDD }, + { 0x2044, 0xDA }, + { 0x2122, 0xAA }, + { 0x2202, 0xB6 }, + { 0x2206, 0xB4 }, + { 0x220F, 0xB8 }, + { 0x2211, 0xB7 }, + { 0x221A, 0xC3 }, + { 0x221E, 0xB0 }, + { 0x222B, 0xBA }, + { 0x2248, 0xC5 }, + { 0x2260, 0xAD }, + { 0x2264, 0xB2 }, + { 0x2265, 0xB3 }, + { 0x25CA, 0xD7 }, + { 0xF8FF, 0xD8 } +}; + +/* ----------------------------------------------------------------------- */ + +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 ImplTextConverterData const aImplAPPLECROATIANTextConverterData = +{ + &aImplAPPLECROATIANByteCvtData, + NULL, + RTL_UNICODE_CHAR_DEFAULT +}; + +/* ----------------------------------------------------------------------- */ + +static ImplTextConverter const aImplAPPLECROATIANTextConverter = +{ + &aImplAPPLECROATIANTextConverterData, + ImplCharToUnicode, + ImplUnicodeToChar, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL +}; + +/* ----------------------------------------------------------------------- */ + +static ImplTextEncodingData const aImplAPPLECROATIANTextEncodingData = +{ + &aImplAPPLECROATIANTextConverter, + RTL_TEXTENCODING_APPLE_CROATIAN, + 1, 1, 1, + 238, + 852, + 36, + (const sal_Char*)"iso8859-2", + (const sal_Char*)"iso-8859-2", + RTL_TEXTENCODING_INFO_ASCII | + RTL_TEXTENCODING_INFO_MAC, + SCRIPT_EASTEUROPE +}; + +/* ======================================================================= */ + +/* 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 }, + { 0x00A2, 0xA2 }, + { 0x00A3, 0xA3 }, + { 0x00A4, 0xFF }, + { 0x00A7, 0xA4 }, + { 0x00A9, 0xA9 }, + { 0x00AB, 0xC7 }, + { 0x00AC, 0xC2 }, + { 0x00AE, 0xA8 }, + { 0x00B0, 0xA1 }, + { 0x00B1, 0xB1 }, + { 0x00B5, 0xB5 }, + { 0x00B6, 0xA6 }, + { 0x00BB, 0xC8 }, + { 0x00F7, 0xD6 }, + { 0x0192, 0xC4 }, + { 0x2013, 0xD0 }, + { 0x2014, 0xD1 }, + { 0x2018, 0xD4 }, + { 0x2019, 0xD5 }, + { 0x201C, 0xD2 }, + { 0x201D, 0xD3 }, + { 0x201E, 0xD7 }, + { 0x2020, 0xA0 }, + { 0x2022, 0xA5 }, + { 0x2026, 0xC9 }, + { 0x2116, 0xDC }, + { 0x2122, 0xAA }, + { 0x2202, 0xB6 }, + { 0x2206, 0xC6 }, + { 0x221A, 0xC3 }, + { 0x221E, 0xB0 }, + { 0x2248, 0xC5 }, + { 0x2260, 0xAD }, + { 0x2264, 0xB2 }, + { 0x2265, 0xB3 } +}; + +/* ----------------------------------------------------------------------- */ + +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 ImplTextConverterData const aImplAPPLECYRILLICTextConverterData = +{ + &aImplAPPLECYRILLICByteCvtData, + NULL, + RTL_UNICODE_CHAR_DEFAULT +}; + +/* ----------------------------------------------------------------------- */ + +static ImplTextConverter const aImplAPPLECYRILLICTextConverter = +{ + &aImplAPPLECYRILLICTextConverterData, + ImplCharToUnicode, + ImplUnicodeToChar, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL +}; + +/* ----------------------------------------------------------------------- */ + +static ImplTextEncodingData const aImplAPPLECYRILLICTextEncodingData = +{ + &aImplAPPLECYRILLICTextConverter, + RTL_TEXTENCODING_APPLE_CYRILLIC, + 1, 1, 1, + 204, + 866, /* ??? 855 */ + 7, + (const sal_Char*)"iso8859-5", + (const sal_Char*)"iso-8859-5", + RTL_TEXTENCODING_INFO_ASCII | + RTL_TEXTENCODING_INFO_MAC, + SCRIPT_CYRILLIC +}; + +/* ======================================================================= */ + +/* 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 }, + { 0x00A3, 0x92 }, + { 0x00A5, 0xB4 }, + { 0x00A6, 0x9B }, + { 0x00A7, 0xAC }, + { 0x00A8, 0x8C }, + { 0x00A9, 0xA9 }, + { 0x00AB, 0xC7 }, + { 0x00AC, 0xC2 }, + { 0x00AD, 0x9C }, + { 0x00AE, 0xA8 }, + { 0x00B0, 0xAE }, + { 0x00B1, 0xB1 }, + { 0x00B2, 0x82 }, + { 0x00B3, 0x84 }, + { 0x00B7, 0xAF }, + { 0x00B9, 0x81 }, + { 0x00BB, 0xC8 }, + { 0x00BD, 0x97 }, + { 0x00C4, 0x80 }, + { 0x00C9, 0x83 }, + { 0x00D6, 0x85 }, + { 0x00DC, 0x86 }, + { 0x00DF, 0xA7 }, + { 0x00E0, 0x88 }, + { 0x00E2, 0x89 }, + { 0x00E4, 0x8A }, + { 0x00E7, 0x8D }, + { 0x00E8, 0x8F }, + { 0x00E9, 0x8E }, + { 0x00EA, 0x90 }, + { 0x00EB, 0x91 }, + { 0x00EE, 0x94 }, + { 0x00EF, 0x95 }, + { 0x00F4, 0x99 }, + { 0x00F6, 0x9A }, + { 0x00F7, 0xD6 }, + { 0x00F9, 0x9D }, + { 0x00FB, 0x9E }, + { 0x00FC, 0x9F }, + { 0x0153, 0xCF }, + { 0x2013, 0xD0 }, + { 0x2015, 0xD1 }, + { 0x2018, 0xD4 }, + { 0x2019, 0xD5 }, + { 0x201C, 0xD2 }, + { 0x201D, 0xD3 }, + { 0x2020, 0xA0 }, + { 0x2022, 0x96 }, + { 0x2026, 0xC9 }, + { 0x2030, 0x98 }, + { 0x2122, 0x93 }, + { 0x2248, 0xC5 }, + { 0x2260, 0xAD }, + { 0x2264, 0xB2 }, + { 0x2265, 0xB3 }, + { 0xF8A0, 0xFF } +}; + +/* ----------------------------------------------------------------------- */ + +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 ImplTextConverterData const aImplAPPLEGREEKTextConverterData = +{ + &aImplAPPLEGREEKByteCvtData, + NULL, + RTL_UNICODE_CHAR_DEFAULT +}; + +/* ----------------------------------------------------------------------- */ + +static ImplTextConverter const aImplAPPLEGREEKTextConverter = +{ + &aImplAPPLEGREEKTextConverterData, + ImplCharToUnicode, + ImplUnicodeToChar, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL +}; + +/* ----------------------------------------------------------------------- */ + +static ImplTextEncodingData const aImplAPPLEGREEKTextEncodingData = +{ + &aImplAPPLEGREEKTextConverter, + RTL_TEXTENCODING_APPLE_GREEK, + 1, 1, 1, + 161, + 869, + 6, + (const sal_Char*)"iso8859-7", + (const sal_Char*)"iso-8859-7", + RTL_TEXTENCODING_INFO_ASCII | + RTL_TEXTENCODING_INFO_MAC, + SCRIPT_GREEK +}; + +/* ======================================================================= */ + +/* 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 }, + { 0x0103, 0xBE }, + { 0x0131, 0xF5 }, + { 0x0152, 0xCE }, + { 0x0153, 0xCF }, + { 0x015E, 0xAF }, + { 0x015F, 0xBF }, + { 0x0162, 0xDE }, + { 0x0163, 0xDF }, + { 0x0178, 0xD9 }, + { 0x0192, 0xC4 }, + { 0x02C6, 0xF6 }, + { 0x02C7, 0xFF }, + { 0x02D8, 0xF9 }, + { 0x02D9, 0xFA }, + { 0x02DA, 0xFB }, + { 0x02DB, 0xFE }, + { 0x02DC, 0xF7 }, + { 0x02DD, 0xFD }, + { 0x03A9, 0xBD }, + { 0x03C0, 0xB9 }, + { 0x2013, 0xD0 }, + { 0x2014, 0xD1 }, + { 0x2018, 0xD4 }, + { 0x2019, 0xD5 }, + { 0x201A, 0xE2 }, + { 0x201C, 0xD2 }, + { 0x201D, 0xD3 }, + { 0x201E, 0xE3 }, + { 0x2020, 0xA0 }, + { 0x2021, 0xE0 }, + { 0x2022, 0xA5 }, + { 0x2026, 0xC9 }, + { 0x2030, 0xE4 }, + { 0x2039, 0xDC }, + { 0x203A, 0xDD }, + { 0x2044, 0xDA }, + { 0x2122, 0xAA }, + { 0x2202, 0xB6 }, + { 0x2206, 0xC6 }, + { 0x220F, 0xB8 }, + { 0x2211, 0xB7 }, + { 0x221A, 0xC3 }, + { 0x221E, 0xB0 }, + { 0x222B, 0xBA }, + { 0x2248, 0xC5 }, + { 0x2260, 0xAD }, + { 0x2264, 0xB2 }, + { 0x2265, 0xB3 }, + { 0x25CA, 0xD7 }, + { 0xF8FF, 0xF0 } +}; + +/* ----------------------------------------------------------------------- */ + +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 ImplTextConverterData const aImplAPPLEROMANIANTextConverterData = +{ + &aImplAPPLEROMANIANByteCvtData, + NULL, + RTL_UNICODE_CHAR_DEFAULT +}; + +/* ----------------------------------------------------------------------- */ + +static ImplTextConverter const aImplAPPLEROMANIANTextConverter = +{ + &aImplAPPLEROMANIANTextConverterData, + ImplCharToUnicode, + ImplUnicodeToChar, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL +}; + +/* ----------------------------------------------------------------------- */ + +static ImplTextEncodingData const aImplAPPLEROMANIANTextEncodingData = +{ + &aImplAPPLEROMANIANTextConverter, + RTL_TEXTENCODING_APPLE_ROMANIAN, + 1, 1, 1, + 238, + 852, + 38, + (const sal_Char*)"iso8859-2", + (const sal_Char*)"iso-8859-2", + RTL_TEXTENCODING_INFO_ASCII | + RTL_TEXTENCODING_INFO_MAC, + SCRIPT_EASTEUROPE +}; + +/* ======================================================================= */ + +/* 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 }, + { 0x011F, 0xDB }, + { 0x0130, 0xDC }, + { 0x0131, 0xDD }, + { 0x0152, 0xCE }, + { 0x0153, 0xCF }, + { 0x015E, 0xDE }, + { 0x015F, 0xDF }, + { 0x0178, 0xD9 }, + { 0x0192, 0xC4 }, + { 0x02C6, 0xF6 }, + { 0x02C7, 0xFF }, + { 0x02D8, 0xF9 }, + { 0x02D9, 0xFA }, + { 0x02DA, 0xFB }, + { 0x02DB, 0xFE }, + { 0x02DC, 0xF7 }, + { 0x02DD, 0xFD }, + { 0x03A9, 0xBD }, + { 0x03C0, 0xB9 }, + { 0x2013, 0xD0 }, + { 0x2014, 0xD1 }, + { 0x2018, 0xD4 }, + { 0x2019, 0xD5 }, + { 0x201A, 0xE2 }, + { 0x201C, 0xD2 }, + { 0x201D, 0xD3 }, + { 0x201E, 0xE3 }, + { 0x2020, 0xA0 }, + { 0x2021, 0xE0 }, + { 0x2022, 0xA5 }, + { 0x2026, 0xC9 }, + { 0x2030, 0xE4 }, + { 0x2122, 0xAA }, + { 0x2202, 0xB6 }, + { 0x2206, 0xC6 }, + { 0x220F, 0xB8 }, + { 0x2211, 0xB7 }, + { 0x221A, 0xC3 }, + { 0x221E, 0xB0 }, + { 0x222B, 0xBA }, + { 0x2248, 0xC5 }, + { 0x2260, 0xAD }, + { 0x2264, 0xB2 }, + { 0x2265, 0xB3 }, + { 0x25CA, 0xD7 }, + { 0xF8A0, 0xF5 }, + { 0xF8FF, 0xF0 } +}; + +/* ----------------------------------------------------------------------- */ + +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 ImplTextConverterData const aImplAPPLETURKISHTextConverterData = +{ + &aImplAPPLETURKISHByteCvtData, + NULL, + RTL_UNICODE_CHAR_DEFAULT +}; + +/* ----------------------------------------------------------------------- */ + +static ImplTextConverter const aImplAPPLETURKISHTextConverter = +{ + &aImplAPPLETURKISHTextConverterData, + ImplCharToUnicode, + ImplUnicodeToChar, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL +}; + +/* ----------------------------------------------------------------------- */ + +static ImplTextEncodingData const aImplAPPLETURKISHTextEncodingData = +{ + &aImplAPPLETURKISHTextConverter, + RTL_TEXTENCODING_APPLE_TURKISH, + 1, 1, 1, + 162, + 857, + 35, + (const sal_Char*)"iso8859-9", + (const sal_Char*)"iso-8859-9", + RTL_TEXTENCODING_INFO_ASCII | + RTL_TEXTENCODING_INFO_MAC, + SCRIPT_TURKISH +}; + +/* ======================================================================= */ + +/* 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 }, + { 0x00A3, 0xA3 }, + { 0x00A4, 0xFF }, + { 0x00A7, 0xA4 }, + { 0x00A9, 0xA9 }, + { 0x00AB, 0xC7 }, + { 0x00AC, 0xC2 }, + { 0x00AE, 0xA8 }, + { 0x00B0, 0xA1 }, + { 0x00B1, 0xB1 }, + { 0x00B5, 0xB5 }, + { 0x00B6, 0xA6 }, + { 0x00BB, 0xC8 }, + { 0x00F7, 0xD6 }, + { 0x0192, 0xC4 }, + { 0x0490, 0xA2 }, + { 0x0491, 0xB6 }, + { 0x2013, 0xD0 }, + { 0x2014, 0xD1 }, + { 0x2018, 0xD4 }, + { 0x2019, 0xD5 }, + { 0x201C, 0xD2 }, + { 0x201D, 0xD3 }, + { 0x201E, 0xD7 }, + { 0x2020, 0xA0 }, + { 0x2022, 0xA5 }, + { 0x2026, 0xC9 }, + { 0x2116, 0xDC }, + { 0x2122, 0xAA }, + { 0x2206, 0xC6 }, + { 0x221A, 0xC3 }, + { 0x221E, 0xB0 }, + { 0x2248, 0xC5 }, + { 0x2260, 0xAD }, + { 0x2264, 0xB2 }, + { 0x2265, 0xB3 } +}; + +/* ----------------------------------------------------------------------- */ + +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 ImplTextConverterData const aImplAPPLEUKRAINIANTextConverterData = +{ + &aImplAPPLEUKRAINIANByteCvtData, + NULL, + RTL_UNICODE_CHAR_DEFAULT +}; + +/* ----------------------------------------------------------------------- */ + +static ImplTextConverter const aImplAPPLEUKRAINIANTextConverter = +{ + &aImplAPPLEUKRAINIANTextConverterData, + ImplCharToUnicode, + ImplUnicodeToChar, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL +}; + +/* ----------------------------------------------------------------------- */ + +static ImplTextEncodingData const aImplAPPLEUKRAINIANTextEncodingData = +{ + &aImplAPPLEUKRAINIANTextConverter, + RTL_TEXTENCODING_APPLE_UKRAINIAN, + 1, 1, 1, + 204, + 866, /* ??? 855 */ + 0x98, /* Only available from MAC 8.5 */ + (const sal_Char*)"iso8859-5", + (const sal_Char*)"iso-8859-5", + RTL_TEXTENCODING_INFO_ASCII | + RTL_TEXTENCODING_INFO_MAC, + SCRIPT_CYRILLIC +}; + +/* ======================================================================= */ + +/* 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 }, + { 0x00A9, 0xBF }, + { 0x00B0, 0x9C }, + { 0x00B2, 0x9D }, + { 0x00B7, 0x9E }, + { 0x00F7, 0x9F }, + { 0x0401, 0xB3 }, + { 0x0451, 0xA3 }, + { 0x2219, 0x95 }, + { 0x221A, 0x96 }, + { 0x2248, 0x97 }, + { 0x2264, 0x98 }, + { 0x2265, 0x99 }, + { 0x2320, 0x93 }, + { 0x2321, 0x9B }, + { 0x2500, 0x80 }, + { 0x2502, 0x81 }, + { 0x250C, 0x82 }, + { 0x2510, 0x83 }, + { 0x2514, 0x84 }, + { 0x2518, 0x85 }, + { 0x251C, 0x86 }, + { 0x2524, 0x87 }, + { 0x252C, 0x88 }, + { 0x2534, 0x89 }, + { 0x253C, 0x8A }, + { 0x2550, 0xA0 }, + { 0x2551, 0xA1 }, + { 0x2552, 0xA2 }, + { 0x2553, 0xA4 }, + { 0x2554, 0xA5 }, + { 0x2555, 0xA6 }, + { 0x2556, 0xA7 }, + { 0x2557, 0xA8 }, + { 0x2558, 0xA9 }, + { 0x2559, 0xAA }, + { 0x255A, 0xAB }, + { 0x255B, 0xAC }, + { 0x255C, 0xAD }, + { 0x255D, 0xAE }, + { 0x255E, 0xAF }, + { 0x255F, 0xB0 }, + { 0x2560, 0xB1 }, + { 0x2561, 0xB2 }, + { 0x2562, 0xB4 }, + { 0x2563, 0xB5 }, + { 0x2564, 0xB6 }, + { 0x2565, 0xB7 }, + { 0x2566, 0xB8 }, + { 0x2567, 0xB9 }, + { 0x2568, 0xBA }, + { 0x2569, 0xBB }, + { 0x256A, 0xBC }, + { 0x256B, 0xBD }, + { 0x256C, 0xBE }, + { 0x2580, 0x8B }, + { 0x2584, 0x8C }, + { 0x2588, 0x8D }, + { 0x258C, 0x8E }, + { 0x2590, 0x8F }, + { 0x2591, 0x90 }, + { 0x2592, 0x91 }, + { 0x2593, 0x92 }, + { 0x25A0, 0x94 } +}; + +/* ----------------------------------------------------------------------- */ + +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 ImplTextConverterData const aImplKOI8RTextConverterData = +{ + &aImplKOI8RByteCvtData, + NULL, + RTL_UNICODE_CHAR_DEFAULT +}; + +/* ----------------------------------------------------------------------- */ + +static ImplTextConverter const aImplKOI8RTextConverter = +{ + &aImplKOI8RTextConverterData, + ImplCharToUnicode, + ImplUnicodeToChar, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL +}; + +/* ----------------------------------------------------------------------- */ + +static ImplTextEncodingData const aImplKOI8RTextEncodingData = +{ + &aImplKOI8RTextConverter, + RTL_TEXTENCODING_KOI8_R, + 1, 1, 1, + 204, + 866, /* ??? 855 */ + 7, + (const sal_Char*)"koi8-r", + (const sal_Char*)"koi8-r", + 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..d78b6e7ed22e --- /dev/null +++ b/sal/textenc/tcvtjp1.tab @@ -0,0 +1,1590 @@ +/************************************************************************* + * + * $RCSfile: tcvtjp1.tab,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:17:28 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRUNTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRUNTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc.. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +/* ======================================================================= */ + +/* 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..e213a70d220a --- /dev/null +++ b/sal/textenc/tcvtjp2.tab @@ -0,0 +1,3961 @@ +/************************************************************************* + * + * $RCSfile: tcvtjp2.tab,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:17:28 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRUNTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRUNTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc.. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +/* ======================================================================= */ + +/* This file contain the UniCode to DBCS tables for the following */ +/* japanese charsets: SJIS, MS932, APPLE_JAPANESE */ + +/* ======================================================================= */ + +/* 0x00A0 --> 0x00A0 - APPLE_JAPANESE, but I think, this extension is better than the replacment char */ +/* 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 */ +/* 0x00A9 --> 0x00FD - 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 */ + 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..2bcdf7dcbcb6 --- /dev/null +++ b/sal/textenc/tcvtjp3.tab @@ -0,0 +1,2921 @@ +/************************************************************************* + * + * $RCSfile: tcvtjp3.tab,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:17:28 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRUNTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRUNTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc.. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +/* ======================================================================= */ + +/* This file contain the DBCS to UniCode tables for the following */ +/* japanese charsets: JIS201, JIS208, JIS212 */ + +/* ======================================================================= */ + +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_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..ce1cdd813952 --- /dev/null +++ b/sal/textenc/tcvtjp4.tab @@ -0,0 +1,3548 @@ +/************************************************************************* + * + * $RCSfile: tcvtjp4.tab,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:17:28 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRUNTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRUNTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc.. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +/* ======================================================================= */ + +/* 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, 0, 0, /* 0x10 */ + 0, 0, 0, 0, 0, 0, 0, 0, /* 0x10 */ + 0, 0, 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 */ + 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 */ + 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, 0, 0x215D, 0, 0, 0, 0, 0, /* 0x10 */ + 0, 0, 0x2265, 0, 0, 0x2267, 0x2167, 0, /* 0x10 */ + 0x225C, 0, 0, 0, 0, 0, 0, 0x224A, /* 0x20 */ + 0x224B, 0x2241, 0x2240, 0x2269, 0x226A, 0, 0, 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 /* 0xA0 */ + /* 0xA0 */ +}; + +/* ----------------------------------------------------------------------- */ + +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_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, 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, 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_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..46a7922e7d12 --- /dev/null +++ b/sal/textenc/tcvtjp5.tab @@ -0,0 +1,3384 @@ +/************************************************************************* + * + * $RCSfile: tcvtjp5.tab,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:17:28 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRUNTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRUNTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc.. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +/* ======================================================================= */ + +/* 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..fc78041c8bf1 --- /dev/null +++ b/sal/textenc/tcvtjp6.tab @@ -0,0 +1,2769 @@ +/************************************************************************* + * + * $RCSfile: tcvtjp6.tab,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:17:28 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRUNTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRUNTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc.. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +/* ======================================================================= */ + +/* This file contain the information tables for all japanese charsets: */ +/* SJIS, MS932, APPLE_JAPANESE, EUC_JP */ + +/* ======================================================================= */ + +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 */ /* EUC Range */ + { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0xF1 */ /* EUC Range */ + { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0xF2 */ /* EUC Range */ + { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0xF3 */ /* EUC Range */ + { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0xF4 */ /* EUC Range */ + { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0xF5 */ /* EUC Range */ + { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0xF6 */ /* EUC Range */ + { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0xF7 */ /* EUC Range */ + { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0xF8 */ /* EUC Range */ + { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0xF9 */ /* EUC 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 */ +}; + +/* ----------------------------------------------------------------------- */ + +#define DBCS_EUC_SJIS_COUNT 1 +static ImplDBCSEUCData const aImplSJISDBCSEUCTab[DBCS_EUC_SJIS_COUNT] = +{ + /* EUC-Range */ + /* Lead: F0-FC */ + /* Trail: 40-7E, 80-FC */ + { 0xF0, 0xF9, 0x40, 0x7E, 0x7F, 0xFC, 0, 0, 2, 0xBC, 0xE000, 0xE757 } +}; + +/* ----------------------------------------------------------------------- */ + +static ImplDBCSConvertData const aImplSJISDBCSCvtData = +{ + aSJISUniLeadTab, + aSJISDBCSHighTab, + 0x40, 0xFC, + aImplSJISDBCSEUCTab, + DBCS_EUC_SJIS_COUNT +}; + +/* ----------------------------------------------------------------------- */ + +static ImplTextConverterData const aImplSJISTextConverterData = +{ + &aImplSJISDBCSCvtData, + NULL, + RTL_UNICODE_CHAR_DEFAULT +}; + +/* ----------------------------------------------------------------------- */ + +static ImplTextConverter const aImplSJISTextConverter = +{ + &aImplSJISTextConverterData, + ImplDBCSToUnicode, + ImplUnicodeToDBCS, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL +}; + +/* ----------------------------------------------------------------------- */ + +static ImplTextEncodingData const aImplSJISTextEncodingData = +{ + &aImplSJISTextConverter, + RTL_TEXTENCODING_SHIFT_JIS, + 1, 2, 2, + 128, + 932, + 1, + (const sal_Char*)"euc-jp", /* ??? JISX0208.1990-0 */ + (const sal_Char*)"shift_jis", + RTL_TEXTENCODING_INFO_ASCII | + RTL_TEXTENCODING_INFO_MULTIBYTE | + RTL_TEXTENCODING_INFO_MIME, + SCRIPT_JAPANESE +}; + +/* ======================================================================= */ + +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 */ /* EUC Range */ + { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0xF1 */ /* EUC Range */ + { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0xF2 */ /* EUC Range */ + { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0xF3 */ /* EUC Range */ + { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0xF4 */ /* EUC Range */ + { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0xF5 */ /* EUC Range */ + { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0xF6 */ /* EUC Range */ + { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0xF7 */ /* EUC Range */ + { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0xF8 */ /* EUC Range */ + { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0xF9 */ /* EUC 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, + 0x40, 0xFC, + aImplSJISDBCSEUCTab, + DBCS_EUC_SJIS_COUNT +}; + +/* ----------------------------------------------------------------------- */ + +static ImplTextConverterData const aImplMS932TextConverterData = +{ + &aImplMS932DBCSCvtData, + NULL, + RTL_UNICODE_CHAR_DEFAULT +}; + +/* ----------------------------------------------------------------------- */ + +static ImplTextConverter const aImplMS932TextConverter = +{ + &aImplMS932TextConverterData, + ImplDBCSToUnicode, + ImplUnicodeToDBCS, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL +}; + +/* ----------------------------------------------------------------------- */ + +static ImplTextEncodingData const aImplMS932TextEncodingData = +{ + &aImplMS932TextConverter, + RTL_TEXTENCODING_MS_932, + 1, 2, 2, + 128, + 932, + 1, + (const sal_Char*)"euc-jp", /* ??? JISX0208.1990-0 */ + (const sal_Char*)"shift_jis", + RTL_TEXTENCODING_INFO_ASCII | + RTL_TEXTENCODING_INFO_MULTIBYTE | + RTL_TEXTENCODING_INFO_WIN | + RTL_TEXTENCODING_INFO_DOS_OS2, + SCRIPT_JAPANESE +}; + +/* ======================================================================= */ + +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 */ /* EUC Range */ + { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0xF1 */ /* EUC Range */ + { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0xF2 */ /* EUC Range */ + { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0xF3 */ /* EUC Range */ + { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0xF4 */ /* EUC Range */ + { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0xF5 */ /* EUC Range */ + { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0xF6 */ /* EUC Range */ + { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0xF7 */ /* EUC Range */ + { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0xF8 */ /* EUC Range */ + { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0xF9 */ /* EUC 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_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, 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, + 0x40, 0xFC, + aImplSJISDBCSEUCTab, + DBCS_EUC_SJIS_COUNT +}; + +/* ----------------------------------------------------------------------- */ + +static ImplTextConverterData const aImplAPPLEJAPANESETextConverterData = +{ + &aImplAPPLEJAPANESEDBCSCvtData, + NULL, + RTL_UNICODE_CHAR_DEFAULT +}; + +/* ----------------------------------------------------------------------- */ + +static ImplTextConverter const aImplAPPLEJAPANESETextConverter = +{ + &aImplAPPLEJAPANESETextConverterData, + ImplDBCSToUnicode, + ImplUnicodeToDBCS, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL +}; + +/* ----------------------------------------------------------------------- */ + +static ImplTextEncodingData const aImplAPPLEJAPANESETextEncodingData = +{ + &aImplAPPLEJAPANESETextConverter, + RTL_TEXTENCODING_APPLE_JAPANESE, + 1, 2, 2, + 128, + 932, + 1, + (const sal_Char*)"euc-jp", /* ??? JISX0208.1990-0 */ + (const sal_Char*)"shift_jis", + RTL_TEXTENCODING_INFO_ASCII | + RTL_TEXTENCODING_INFO_MULTIBYTE | + RTL_TEXTENCODING_INFO_MAC, + SCRIPT_JAPANESE +}; + +/* ======================================================================= */ + +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, 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_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, 0xA5, aImplUniToDBCSTab_JIS0208_22 }, /* 0x22 */ + { 0x12, 0x12, aImplUniToDBCSTab_JIS0208_23 }, /* 0x23 */ + { 1, 0, NULL }, /* 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 */ + { 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 */ + { 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 */ + { 0x19, 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 ImplTextConverterData const aImplEUCJPTextConverterData = +{ + &aImplEUCJPCvtData, + NULL, + RTL_UNICODE_CHAR_DEFAULT +}; + +/* ----------------------------------------------------------------------- */ + +static ImplTextConverter const aImplEUCJPTextConverter = +{ + &aImplEUCJPTextConverterData, + ImplEUCJPToUnicode, + ImplUnicodeToEUCJP, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL +}; + +/* ----------------------------------------------------------------------- */ + +static ImplTextEncodingData const aImplEUCJPTextEncodingData = +{ + &aImplEUCJPTextConverter, + RTL_TEXTENCODING_EUC_JP, + 1, 3, 2, + 128, + 932, + 1, + (const sal_Char*)"euc-jp", /* ??? JISX0208.1990-0 */ + (const sal_Char*)"euc-jp", + RTL_TEXTENCODING_INFO_ASCII | + RTL_TEXTENCODING_INFO_MULTIBYTE | + RTL_TEXTENCODING_INFO_MIME, + SCRIPT_JAPANESE +}; + +/* ======================================================================= */ + +/* !!! JIS - X Encodings not complete !!! */ + +static ImplTextConverterData aImplJISX0208TextConverterData = +{ + aJIS0208DBCSHighTab, + NULL, + RTL_UNICODE_CHAR_DEFAULT, +}; + +static ImplTextConverter aImplJISX0208TextConverter = +{ + &aImplJISX0208TextConverterData, + NULL, + ImplUnicodeToJISX0208, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL +}; + +static ImplTextEncodingData aImplJISX0208TextEncodingData = +{ + &aImplJISX0208TextConverter, + RTL_TEXTENCODING_JIS_X_0208, + 2, 2, 2, + 128, + 932, + 1, + (const sal_Char*)"euc-jp", /* ??? JISX0208.1990-0 */ + (const sal_Char*)"euc-jp", + RTL_TEXTENCODING_INFO_MULTIBYTE, + SCRIPT_JAPANESE, +}; + +/* ======================================================================= */ + +#define HALFWIDTHKANA_START 0xFF61 +#define HALFWIDTHKANA_END 0xFF9F + +static sal_uChar 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 aImplJISX0201ByteCvtData = +{ + NULL, + NULL, + 0, 0, + 0, 0, + aImplJISX0201Tab, + NULL, + NULL, + HALFWIDTHKANA_START, HALFWIDTHKANA_END, + 0, 0, + 0 +}; + +static ImplTextConverterData aImplJISX0201TextConverterData = +{ + &aImplJISX0201ByteCvtData, + NULL, + RTL_UNICODE_CHAR_DEFAULT +}; + +static ImplTextConverter aImplJISX0201TextConverter = +{ + &aImplJISX0201TextConverterData, + NULL, + ImplUnicodeToChar, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL +}; + +static ImplTextEncodingData aImplJISX0201TextEncodingData = +{ + &aImplJISX0201TextConverter, + RTL_TEXTENCODING_JIS_X_0201, + 1, 1, 1, + 128, + 923, + 1, + (const sal_Char*)"euc-jp", /* ??? JISX0208.1990-0 */ + (const sal_Char*)"euc-jp", + RTL_TEXTENCODING_INFO_MULTIBYTE, + SCRIPT_JAPANESE, +}; + +/* ======================================================================= */ + +static ImplTextEncodingData aImplJISX0212TextEncodingData = +{ + NULL, + RTL_TEXTENCODING_JIS_X_0212, + 2, 2, 2, + 128, + 923, + 1, + (const sal_Char*)"euc-jp", /* ??? JISX0208.1990-0 */ + (const sal_Char*)"euc-jp", + RTL_TEXTENCODING_INFO_MULTIBYTE, + SCRIPT_JAPANESE, +}; diff --git a/sal/textenc/tcvtkr1.tab b/sal/textenc/tcvtkr1.tab new file mode 100644 index 000000000000..62aa9149a937 --- /dev/null +++ b/sal/textenc/tcvtkr1.tab @@ -0,0 +1,3344 @@ +/************************************************************************* + * + * $RCSfile: tcvtkr1.tab,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:17:28 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRUNTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRUNTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc.. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +/* ======================================================================= */ + +/* 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 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..2ceaaecc0bf9 --- /dev/null +++ b/sal/textenc/tcvtkr2.tab @@ -0,0 +1,5449 @@ +/************************************************************************* + * + * $RCSfile: tcvtkr2.tab,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:17:28 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRUNTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRUNTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc.. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +/* ======================================================================= */ + +/* 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..25a506ae0557 --- /dev/null +++ b/sal/textenc/tcvtkr4.tab @@ -0,0 +1,71 @@ +/************************************************************************* + * + * $RCSfile: tcvtkr4.tab,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:17:28 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRUNTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRUNTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc.. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +/* ======================================================================= */ + +/* This file contain the DBCS to UniCode tables for the following */ +/* korean charsets: */ +/* */ + +/* ======================================================================= */ + +/* ----------------------------------------------------------------------- */ + diff --git a/sal/textenc/tcvtkr5.tab b/sal/textenc/tcvtkr5.tab new file mode 100644 index 000000000000..bc404882aa80 --- /dev/null +++ b/sal/textenc/tcvtkr5.tab @@ -0,0 +1,71 @@ +/************************************************************************* + * + * $RCSfile: tcvtkr5.tab,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:17:28 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRUNTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRUNTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc.. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +/* ======================================================================= */ + +/* This file contain the DBCS to UniCode tables for the following */ +/* korean charsets: */ +/* */ + +/* ======================================================================= */ + +/* ----------------------------------------------------------------------- */ + diff --git a/sal/textenc/tcvtkr6.tab b/sal/textenc/tcvtkr6.tab new file mode 100644 index 000000000000..23b5fef3714b --- /dev/null +++ b/sal/textenc/tcvtkr6.tab @@ -0,0 +1,708 @@ +/************************************************************************* + * + * $RCSfile: tcvtkr6.tab,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:17:29 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRUNTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRUNTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc.. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +/* ======================================================================= */ + +/* This file contain the information tables for all */ +/* korean charsets: */ +/* KSC5601, CP949 */ + +/* ======================================================================= */ + +/* We use this EUC range also for .... */ +/* C9A1-C9FE -> E000-E05D */ +/* FEA1-FEFE -> E05E-E0BB */ +#define DBCS_EUC_MS949_COUNT 2 +static ImplDBCSEUCData const aImplMS949DBCSEUCTab[DBCS_EUC_MS949_COUNT] = +{ + /* EUC-Range */ + /* Lead: C9-C9 */ + /* Trail: A1-FE */ + { 0xC9, 0xC9, 0xA1, 0xFE, 0, 0, 0, 0, 1, 0x5D, 0xE000, 0xE05D }, + /* Lead: FE-FE */ + /* Trail: A1-FE */ + { 0xFE, 0xFE, 0xA1, 0xFE, 0, 0, 0, 0, 1, 0x5D, 0xE05E, 0xE0BB } +}; + +/* ----------------------------------------------------------------------- */ + + +/* ----------------------------------------------------------------------- */ + +/* ======================================================================= */ + +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, 0xA1, aImplDBCSToUniTab_KSC5601_AE }, /* 0xAE */ + { 0, 0x41, 0xA1, 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 */ /* We convert this as double byte */ + { 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, NULL }, /* 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, 0xFE, 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, 0xFF, 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, 0xFE, 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 */ +}; + +/* ----------------------------------------------------------------------- */ + +static ImplDBCSConvertData const aImplKSC5601DBCSCvtData = +{ + aKSC5601UniLeadTab, + aKSC5601DBCSHighTab, + 0x41, 0xFE, + aImplMS949DBCSEUCTab, + DBCS_EUC_MS949_COUNT +}; + +/* ----------------------------------------------------------------------- */ + +static ImplTextConverterData const aImplKSC5601TextConverterData = +{ + &aImplKSC5601DBCSCvtData, + NULL, + RTL_UNICODE_CHAR_DEFAULT +}; + +/* ----------------------------------------------------------------------- */ + +static ImplTextConverter const aImplKSC5601TextConverter = +{ + &aImplKSC5601TextConverterData, + ImplDBCSToUnicode, + ImplUnicodeToDBCS, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL +}; + +/* ======================================================================= */ + +/* Currently no KSC_5601, because I don't know, if someone need this because it is equal to MS949 and EUC-KR */ + +/* ======================================================================= */ + +static ImplTextEncodingData const aImplEUCKRTextEncodingData = +{ + &aImplKSC5601TextConverter, + RTL_TEXTENCODING_EUC_KR, + 1, 2, 2, + 129, + 934, + 3, + (const sal_Char*)"euc-kr", + (const sal_Char*)"euc-kr", + RTL_TEXTENCODING_INFO_ASCII | + RTL_TEXTENCODING_INFO_MULTIBYTE | + RTL_TEXTENCODING_INFO_MIME, + SCRIPT_KOREAN +}; + +/* ======================================================================= */ + +static ImplTextEncodingData const aImplMS949TextEncodingData = +{ + &aImplKSC5601TextConverter, + RTL_TEXTENCODING_MS_949, + 1, 2, 2, + 129, + 934, + 3, + (const sal_Char*)"euc-kr", + (const sal_Char*)"euc-kr", + RTL_TEXTENCODING_INFO_ASCII | + RTL_TEXTENCODING_INFO_MULTIBYTE | + RTL_TEXTENCODING_INFO_WIN | + RTL_TEXTENCODING_INFO_DOS_OS2, + SCRIPT_KOREAN +}; + +/* ======================================================================= */ + +/* Apple has some extension, which we don't support */ + +static ImplTextEncodingData const aImplAPPLEKOREANTextEncodingData = +{ + &aImplKSC5601TextConverter, + RTL_TEXTENCODING_APPLE_KOREAN, + 1, 2, 2, + 129, + 934, + 3, + (const sal_Char*)"euc-kr", + (const sal_Char*)"euc-kr", + RTL_TEXTENCODING_INFO_ASCII | + RTL_TEXTENCODING_INFO_MULTIBYTE | + RTL_TEXTENCODING_INFO_MAC | + SCRIPT_KOREAN +}; diff --git a/sal/textenc/tcvtlat1.tab b/sal/textenc/tcvtlat1.tab new file mode 100644 index 000000000000..54b437f5cd2a --- /dev/null +++ b/sal/textenc/tcvtlat1.tab @@ -0,0 +1,2130 @@ +/************************************************************************* + * + * $RCSfile: tcvtlat1.tab,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:17:29 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRUNTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRUNTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc.. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +/* ======================================================================= */ + +/* This file contain the tables for all 1 byte charsets, for the */ +/* following scripts: latin, iceland, nordic */ + +/* ======================================================================= */ + +/* Hilfstabellen, die fuer mehrere Zeichensaetze gelten */ + +/* ----------------------------------------------------------------------- */ + +#define NOTABCHAR_START 0xFFFF +#define NOTABCHAR_END 0x0000 +#define NOTABUNI_START 0xFF +#define NOTABUNI_END 0x00 + +/* ----------------------------------------------------------------------- */ + +#define SAME8090UNI_START 0x80 +#define SAME8090UNI_END 0x9F +static sal_uInt16 const aImpl8090SameToUniTab[SAME8090UNI_END - SAME8090UNI_START + 1] = +{ +/* 0 1 2 3 4 5 6 7 */ +/* 8 9 A B C D E F */ + 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, /* 0x80 */ + 0x0088, 0x0089, 0x008A, 0x008B, 0x008C, 0x008D, 0x008E, 0x008F, /* 0x80 */ + 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, /* 0x90 */ + 0x0098, 0x0099, 0x009A, 0x009B, 0x009C, 0x009D, 0x009E, 0x009F, /* 0x90 */ +}; + +/* ----------------------------------------------------------------------- */ + +#define SAME8090CHAR_START 0x0080 +#define SAME8090CHAR_END 0x009F +static sal_uChar const aImpl8090SameToCharTab[SAME8090CHAR_END - SAME8090CHAR_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, /* 0x0080 */ + 0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F, /* 0x0080 */ + 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, /* 0x0090 */ + 0x98, 0x99, 0x9A, 0x9B, 0x9C, 0x9D, 0x9E, 0x9F /* 0x0090 */ +}; + +/* ----------------------------------------------------------------------- */ + +#define SAMEA0FFCHAR_START 0x00A0 +#define SAMEA0FFCHAR_END 0x00FF +static sal_uChar const aImplA0FFSameToCharTab[SAMEA0FFCHAR_END - SAMEA0FFCHAR_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 */ + 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 */ +}; + +/* ======================================================================= */ + +/* 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 }, + { 0x0393, 0xE2 }, + { 0x0398, 0xE9 }, + { 0x03A3, 0xE4 }, + { 0x03A6, 0xE8 }, + { 0x03A9, 0xEA }, + { 0x03B1, 0xE0 }, + { 0x03B4, 0xEB }, + { 0x03B5, 0xEE }, + { 0x03C0, 0xE3 }, + { 0x03C3, 0xE5 }, + { 0x03C4, 0xE7 }, + { 0x03C6, 0xED }, + { 0x207F, 0xFC }, + { 0x20A7, 0x9E }, + { 0x2219, 0xF9 }, + { 0x221A, 0xFB }, + { 0x221E, 0xEC }, + { 0x2229, 0xEF }, + { 0x2248, 0xF7 }, + { 0x2261, 0xF0 }, + { 0x2264, 0xF3 }, + { 0x2265, 0xF2 }, + { 0x2310, 0xA9 }, + { 0x2320, 0xF4 }, + { 0x2321, 0xF5 }, + { 0x2500, 0xC4 }, + { 0x2502, 0xB3 }, + { 0x250C, 0xDA }, + { 0x2510, 0xBF }, + { 0x2514, 0xC0 }, + { 0x2518, 0xD9 }, + { 0x251C, 0xC3 }, + { 0x2524, 0xB4 }, + { 0x252C, 0xC2 }, + { 0x2534, 0xC1 }, + { 0x253C, 0xC5 }, + { 0x2550, 0xCD }, + { 0x2551, 0xBA }, + { 0x2552, 0xD5 }, + { 0x2553, 0xD6 }, + { 0x2554, 0xC9 }, + { 0x2555, 0xB8 }, + { 0x2556, 0xB7 }, + { 0x2557, 0xBB }, + { 0x2558, 0xD4 }, + { 0x2559, 0xD3 }, + { 0x255A, 0xC8 }, + { 0x255B, 0xBE }, + { 0x255C, 0xBD }, + { 0x255D, 0xBC }, + { 0x255E, 0xC6 }, + { 0x255F, 0xC7 }, + { 0x2560, 0xCC }, + { 0x2561, 0xB5 }, + { 0x2562, 0xB6 }, + { 0x2563, 0xB9 }, + { 0x2564, 0xD1 }, + { 0x2565, 0xD2 }, + { 0x2566, 0xCB }, + { 0x2567, 0xCF }, + { 0x2568, 0xD0 }, + { 0x2569, 0xCA }, + { 0x256A, 0xD8 }, + { 0x256B, 0xD7 }, + { 0x256C, 0xCE }, + { 0x2580, 0xDF }, + { 0x2584, 0xDC }, + { 0x2588, 0xDB }, + { 0x258C, 0xDD }, + { 0x2590, 0xDE }, + { 0x2591, 0xB0 }, + { 0x2592, 0xB1 }, + { 0x2593, 0xB2 }, + { 0x25A0, 0xFE } +}; + +/* ----------------------------------------------------------------------- */ + +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 ImplTextConverterData const aImplIBM437TextConverterData = +{ + &aImplIBM437ByteCvtData, + NULL, + RTL_UNICODE_CHAR_DEFAULT +}; + +/* ----------------------------------------------------------------------- */ + +static ImplTextConverter const aImplIBM437TextConverter = +{ + &aImplIBM437TextConverterData, + ImplCharToUnicode, + ImplUnicodeToChar, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL +}; + +/* ----------------------------------------------------------------------- */ + +static ImplTextEncodingData const aImplIBM437TextEncodingData = +{ + &aImplIBM437TextConverter, + RTL_TEXTENCODING_IBM_437, + 1, 1, 1, + 0, + 437, + 0, + (const sal_Char*)"iso8859-1", + (const sal_Char*)"iso-8859-1", + RTL_TEXTENCODING_INFO_ASCII | + RTL_TEXTENCODING_INFO_DOS_OS2, + SCRIPT_LATIN +}; + +/* ======================================================================= */ + +/* 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 }, + { 0x0192, 0x9F }, + { 0x2017, 0xF2 }, + { 0x20AC, 0xD5 }, + { 0x2500, 0xC4 }, + { 0x2502, 0xB3 }, + { 0x250C, 0xDA }, + { 0x2510, 0xBF }, + { 0x2514, 0xC0 }, + { 0x2518, 0xD9 }, + { 0x251C, 0xC3 }, + { 0x2524, 0xB4 }, + { 0x252C, 0xC2 }, + { 0x2534, 0xC1 }, + { 0x253C, 0xC5 }, + { 0x2550, 0xCD }, + { 0x2551, 0xBA }, + { 0x2554, 0xC9 }, + { 0x2557, 0xBB }, + { 0x255A, 0xC8 }, + { 0x255D, 0xBC }, + { 0x2560, 0xCC }, + { 0x2563, 0xB9 }, + { 0x2566, 0xCB }, + { 0x2569, 0xCA }, + { 0x256C, 0xCE }, + { 0x2580, 0xDF }, + { 0x2584, 0xDC }, + { 0x2588, 0xDB }, + { 0x2591, 0xB0 }, + { 0x2592, 0xB1 }, + { 0x2593, 0xB2 }, + { 0x25A0, 0xFE } +}; + +/* ----------------------------------------------------------------------- */ + +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 ImplTextConverterData const aImplIBM850TextConverterData = +{ + &aImplIBM850ByteCvtData, + NULL, + RTL_UNICODE_CHAR_DEFAULT +}; + +/* ----------------------------------------------------------------------- */ + +static ImplTextConverter const aImplIBM850TextConverter = +{ + &aImplIBM850TextConverterData, + ImplCharToUnicode, + ImplUnicodeToChar, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL +}; + +/* ----------------------------------------------------------------------- */ + +static ImplTextEncodingData const aImplIBM850TextEncodingData = +{ + &aImplIBM850TextConverter, + RTL_TEXTENCODING_IBM_850, + 1, 1, 1, + 0, + 850, + 0, + (const sal_Char*)"iso8859-1", + (const sal_Char*)"iso-8859-1", + RTL_TEXTENCODING_INFO_ASCII | + RTL_TEXTENCODING_INFO_DOS_OS2, + SCRIPT_LATIN +}; + +/* ======================================================================= */ + +/* 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 }, + { 0x0398, 0xE9 }, + { 0x03A3, 0xE4 }, + { 0x03A6, 0xE8 }, + { 0x03A9, 0xEA }, + { 0x03B1, 0xE0 }, + { 0x03B4, 0xEB }, + { 0x03B5, 0xEE }, + { 0x03C0, 0xE3 }, + { 0x03C3, 0xE5 }, + { 0x03C4, 0xE7 }, + { 0x03C6, 0xED }, + { 0x207F, 0xFC }, + { 0x20A7, 0x9E }, + { 0x2219, 0xF9 }, + { 0x221A, 0xFB }, + { 0x221E, 0xEC }, + { 0x2229, 0xEF }, + { 0x2248, 0xF7 }, + { 0x2261, 0xF0 }, + { 0x2264, 0xF3 }, + { 0x2265, 0xF2 }, + { 0x2320, 0xF4 }, + { 0x2321, 0xF5 }, + { 0x2500, 0xC4 }, + { 0x2502, 0xB3 }, + { 0x250C, 0xDA }, + { 0x2510, 0xBF }, + { 0x2514, 0xC0 }, + { 0x2518, 0xD9 }, + { 0x251C, 0xC3 }, + { 0x2524, 0xB4 }, + { 0x252C, 0xC2 }, + { 0x2534, 0xC1 }, + { 0x253C, 0xC5 }, + { 0x2550, 0xCD }, + { 0x2551, 0xBA }, + { 0x2552, 0xD5 }, + { 0x2553, 0xD6 }, + { 0x2554, 0xC9 }, + { 0x2555, 0xB8 }, + { 0x2556, 0xB7 }, + { 0x2557, 0xBB }, + { 0x2558, 0xD4 }, + { 0x2559, 0xD3 }, + { 0x255A, 0xC8 }, + { 0x255B, 0xBE }, + { 0x255C, 0xBD }, + { 0x255D, 0xBC }, + { 0x255E, 0xC6 }, + { 0x255F, 0xC7 }, + { 0x2560, 0xCC }, + { 0x2561, 0xB5 }, + { 0x2562, 0xB6 }, + { 0x2563, 0xB9 }, + { 0x2564, 0xD1 }, + { 0x2565, 0xD2 }, + { 0x2566, 0xCB }, + { 0x2567, 0xCF }, + { 0x2568, 0xD0 }, + { 0x2569, 0xCA }, + { 0x256A, 0xD8 }, + { 0x256B, 0xD7 }, + { 0x256C, 0xCE }, + { 0x2580, 0xDF }, + { 0x2584, 0xDC }, + { 0x2588, 0xDB }, + { 0x258C, 0xDD }, + { 0x2590, 0xDE }, + { 0x2591, 0xB0 }, + { 0x2592, 0xB1 }, + { 0x2593, 0xB2 }, + { 0x25A0, 0xFE } +}; + +/* ----------------------------------------------------------------------- */ + +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 ImplTextConverterData const aImplIBM860TextConverterData = +{ + &aImplIBM860ByteCvtData, + NULL, + RTL_UNICODE_CHAR_DEFAULT +}; + +/* ----------------------------------------------------------------------- */ + +static ImplTextConverter const aImplIBM860TextConverter = +{ + &aImplIBM860TextConverterData, + ImplCharToUnicode, + ImplUnicodeToChar, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL +}; + +/* ----------------------------------------------------------------------- */ + +static ImplTextEncodingData const aImplIBM860TextEncodingData = +{ + &aImplIBM860TextConverter, + RTL_TEXTENCODING_IBM_860, + 1, 1, 1, + 0, + 860, + 0, + (const sal_Char*)"iso8859-1", + (const sal_Char*)"iso-8859-1", + RTL_TEXTENCODING_INFO_ASCII | + RTL_TEXTENCODING_INFO_DOS_OS2, + SCRIPT_LATIN +}; + +/* ======================================================================= */ + +/* 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 }, + { 0x0393, 0xE2 }, + { 0x0398, 0xE9 }, + { 0x03A3, 0xE4 }, + { 0x03A6, 0xE8 }, + { 0x03A9, 0xEA }, + { 0x03B1, 0xE0 }, + { 0x03B4, 0xEB }, + { 0x03B5, 0xEE }, + { 0x03C0, 0xE3 }, + { 0x03C3, 0xE5 }, + { 0x03C4, 0xE7 }, + { 0x03C6, 0xED }, + { 0x207F, 0xFC }, + { 0x20A7, 0x9E }, + { 0x2219, 0xF9 }, + { 0x221A, 0xFB }, + { 0x221E, 0xEC }, + { 0x2229, 0xEF }, + { 0x2248, 0xF7 }, + { 0x2261, 0xF0 }, + { 0x2264, 0xF3 }, + { 0x2265, 0xF2 }, + { 0x2310, 0xA9 }, + { 0x2320, 0xF4 }, + { 0x2321, 0xF5 }, + { 0x2500, 0xC4 }, + { 0x2502, 0xB3 }, + { 0x250C, 0xDA }, + { 0x2510, 0xBF }, + { 0x2514, 0xC0 }, + { 0x2518, 0xD9 }, + { 0x251C, 0xC3 }, + { 0x2524, 0xB4 }, + { 0x252C, 0xC2 }, + { 0x2534, 0xC1 }, + { 0x253C, 0xC5 }, + { 0x2550, 0xCD }, + { 0x2551, 0xBA }, + { 0x2552, 0xD5 }, + { 0x2553, 0xD6 }, + { 0x2554, 0xC9 }, + { 0x2555, 0xB8 }, + { 0x2556, 0xB7 }, + { 0x2557, 0xBB }, + { 0x2558, 0xD4 }, + { 0x2559, 0xD3 }, + { 0x255A, 0xC8 }, + { 0x255B, 0xBE }, + { 0x255C, 0xBD }, + { 0x255D, 0xBC }, + { 0x255E, 0xC6 }, + { 0x255F, 0xC7 }, + { 0x2560, 0xCC }, + { 0x2561, 0xB5 }, + { 0x2562, 0xB6 }, + { 0x2563, 0xB9 }, + { 0x2564, 0xD1 }, + { 0x2565, 0xD2 }, + { 0x2566, 0xCB }, + { 0x2567, 0xCF }, + { 0x2568, 0xD0 }, + { 0x2569, 0xCA }, + { 0x256A, 0xD8 }, + { 0x256B, 0xD7 }, + { 0x256C, 0xCE }, + { 0x2580, 0xDF }, + { 0x2584, 0xDC }, + { 0x2588, 0xDB }, + { 0x258C, 0xDD }, + { 0x2590, 0xDE }, + { 0x2591, 0xB0 }, + { 0x2592, 0xB1 }, + { 0x2593, 0xB2 }, + { 0x25A0, 0xFE } +}; + +/* ----------------------------------------------------------------------- */ + +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 ImplTextConverterData const aImplIBM861TextConverterData = +{ + &aImplIBM861ByteCvtData, + NULL, + RTL_UNICODE_CHAR_DEFAULT +}; + +/* ----------------------------------------------------------------------- */ + +static ImplTextConverter const aImplIBM861TextConverter = +{ + &aImplIBM861TextConverterData, + ImplCharToUnicode, + ImplUnicodeToChar, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL +}; + +/* ----------------------------------------------------------------------- */ + +static ImplTextEncodingData const aImplIBM861TextEncodingData = +{ + &aImplIBM861TextConverter, + RTL_TEXTENCODING_IBM_861, + 1, 1, 1, + 0, + 861, + 37, + (const sal_Char*)"iso8859-1", + (const sal_Char*)"iso-8859-1", + RTL_TEXTENCODING_INFO_ASCII | + RTL_TEXTENCODING_INFO_DOS_OS2, + SCRIPT_LATIN +}; + +/* ======================================================================= */ + +/* 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 }, + { 0x0393, 0xE2 }, + { 0x0398, 0xE9 }, + { 0x03A3, 0xE4 }, + { 0x03A6, 0xE8 }, + { 0x03A9, 0xEA }, + { 0x03B1, 0xE0 }, + { 0x03B4, 0xEB }, + { 0x03B5, 0xEE }, + { 0x03C0, 0xE3 }, + { 0x03C3, 0xE5 }, + { 0x03C4, 0xE7 }, + { 0x03C6, 0xED }, + { 0x2017, 0x8D }, + { 0x207F, 0xFC }, + { 0x2219, 0xF9 }, + { 0x221A, 0xFB }, + { 0x221E, 0xEC }, + { 0x2229, 0xEF }, + { 0x2248, 0xF7 }, + { 0x2261, 0xF0 }, + { 0x2264, 0xF3 }, + { 0x2265, 0xF2 }, + { 0x2310, 0xA9 }, + { 0x2320, 0xF4 }, + { 0x2321, 0xF5 }, + { 0x2500, 0xC4 }, + { 0x2502, 0xB3 }, + { 0x250C, 0xDA }, + { 0x2510, 0xBF }, + { 0x2514, 0xC0 }, + { 0x2518, 0xD9 }, + { 0x251C, 0xC3 }, + { 0x2524, 0xB4 }, + { 0x252C, 0xC2 }, + { 0x2534, 0xC1 }, + { 0x253C, 0xC5 }, + { 0x2550, 0xCD }, + { 0x2551, 0xBA }, + { 0x2552, 0xD5 }, + { 0x2553, 0xD6 }, + { 0x2554, 0xC9 }, + { 0x2555, 0xB8 }, + { 0x2556, 0xB7 }, + { 0x2557, 0xBB }, + { 0x2558, 0xD4 }, + { 0x2559, 0xD3 }, + { 0x255A, 0xC8 }, + { 0x255B, 0xBE }, + { 0x255C, 0xBD }, + { 0x255D, 0xBC }, + { 0x255E, 0xC6 }, + { 0x255F, 0xC7 }, + { 0x2560, 0xCC }, + { 0x2561, 0xB5 }, + { 0x2562, 0xB6 }, + { 0x2563, 0xB9 }, + { 0x2564, 0xD1 }, + { 0x2565, 0xD2 }, + { 0x2566, 0xCB }, + { 0x2567, 0xCF }, + { 0x2568, 0xD0 }, + { 0x2569, 0xCA }, + { 0x256A, 0xD8 }, + { 0x256B, 0xD7 }, + { 0x256C, 0xCE }, + { 0x2580, 0xDF }, + { 0x2584, 0xDC }, + { 0x2588, 0xDB }, + { 0x258C, 0xDD }, + { 0x2590, 0xDE }, + { 0x2591, 0xB0 }, + { 0x2592, 0xB1 }, + { 0x2593, 0xB2 }, + { 0x25A0, 0xFE } +}; + +/* ----------------------------------------------------------------------- */ + +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 ImplTextConverterData const aImplIBM863TextConverterData = +{ + &aImplIBM863ByteCvtData, + NULL, + RTL_UNICODE_CHAR_DEFAULT +}; + +/* ----------------------------------------------------------------------- */ + +static ImplTextConverter const aImplIBM863TextConverter = +{ + &aImplIBM863TextConverterData, + ImplCharToUnicode, + ImplUnicodeToChar, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL +}; + +/* ----------------------------------------------------------------------- */ + +static ImplTextEncodingData const aImplIBM863TextEncodingData = +{ + &aImplIBM863TextConverter, + RTL_TEXTENCODING_IBM_863, + 1, 1, 1, + 0, + 863, + 0, + (const sal_Char*)"iso8859-1", + (const sal_Char*)"iso-8859-1", + RTL_TEXTENCODING_INFO_ASCII | + RTL_TEXTENCODING_INFO_DOS_OS2, + SCRIPT_LATIN +}; + +/* ======================================================================= */ + +/* 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 }, + { 0x0393, 0xE2 }, + { 0x0398, 0xE9 }, + { 0x03A3, 0xE4 }, + { 0x03A6, 0xE8 }, + { 0x03A9, 0xEA }, + { 0x03B1, 0xE0 }, + { 0x03B4, 0xEB }, + { 0x03B5, 0xEE }, + { 0x03C0, 0xE3 }, + { 0x03C3, 0xE5 }, + { 0x03C4, 0xE7 }, + { 0x03C6, 0xED }, + { 0x207F, 0xFC }, + { 0x20A7, 0x9E }, + { 0x2219, 0xF9 }, + { 0x221A, 0xFB }, + { 0x221E, 0xEC }, + { 0x2229, 0xEF }, + { 0x2248, 0xF7 }, + { 0x2261, 0xF0 }, + { 0x2264, 0xF3 }, + { 0x2265, 0xF2 }, + { 0x2310, 0xA9 }, + { 0x2320, 0xF4 }, + { 0x2321, 0xF5 }, + { 0x2500, 0xC4 }, + { 0x2502, 0xB3 }, + { 0x250C, 0xDA }, + { 0x2510, 0xBF }, + { 0x2514, 0xC0 }, + { 0x2518, 0xD9 }, + { 0x251C, 0xC3 }, + { 0x2524, 0xB4 }, + { 0x252C, 0xC2 }, + { 0x2534, 0xC1 }, + { 0x253C, 0xC5 }, + { 0x2550, 0xCD }, + { 0x2551, 0xBA }, + { 0x2552, 0xD5 }, + { 0x2553, 0xD6 }, + { 0x2554, 0xC9 }, + { 0x2555, 0xB8 }, + { 0x2556, 0xB7 }, + { 0x2557, 0xBB }, + { 0x2558, 0xD4 }, + { 0x2559, 0xD3 }, + { 0x255A, 0xC8 }, + { 0x255B, 0xBE }, + { 0x255C, 0xBD }, + { 0x255D, 0xBC }, + { 0x255E, 0xC6 }, + { 0x255F, 0xC7 }, + { 0x2560, 0xCC }, + { 0x2561, 0xB5 }, + { 0x2562, 0xB6 }, + { 0x2563, 0xB9 }, + { 0x2564, 0xD1 }, + { 0x2565, 0xD2 }, + { 0x2566, 0xCB }, + { 0x2567, 0xCF }, + { 0x2568, 0xD0 }, + { 0x2569, 0xCA }, + { 0x256A, 0xD8 }, + { 0x256B, 0xD7 }, + { 0x256C, 0xCE }, + { 0x2580, 0xDF }, + { 0x2584, 0xDC }, + { 0x2588, 0xDB }, + { 0x258C, 0xDD }, + { 0x2590, 0xDE }, + { 0x2591, 0xB0 }, + { 0x2592, 0xB1 }, + { 0x2593, 0xB2 }, + { 0x25A0, 0xFE } +}; + +/* ----------------------------------------------------------------------- */ + +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 ImplTextConverterData const aImplIBM865TextConverterData = +{ + &aImplIBM865ByteCvtData, + NULL, + RTL_UNICODE_CHAR_DEFAULT +}; + +/* ----------------------------------------------------------------------- */ + +static ImplTextConverter const aImplIBM865TextConverter = +{ + &aImplIBM865TextConverterData, + ImplCharToUnicode, + ImplUnicodeToChar, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL +}; + +/* ----------------------------------------------------------------------- */ + +static ImplTextEncodingData const aImplIBM865TextEncodingData = +{ + &aImplIBM865TextConverter, + RTL_TEXTENCODING_IBM_865, + 1, 1, 1, + 0, + 865, + 0, + (const sal_Char*)"iso8859-1", + (const sal_Char*)"iso-8859-1", + RTL_TEXTENCODING_INFO_ASCII | + RTL_TEXTENCODING_INFO_DOS_OS2, + SCRIPT_LATIN +}; + +/* ======================================================================= */ + +/* 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, 0x0081, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021, /* 0x80 */ + 0x02C6, 0x2030, 0x0160, 0x2039, 0x0152, 0x008D, 0x017D, 0x008F, /* 0x80 */ + 0x0090, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, /* 0x90 */ + 0x02DC, 0x2122, 0x0161, 0x203A, 0x0153, 0x009D, 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 }, + { 0x0153, 0x9C }, + { 0x0160, 0x8A }, + { 0x0161, 0x9A }, + { 0x0178, 0x9F }, + { 0x017D, 0x8E }, + { 0x017E, 0x9E }, + { 0x0192, 0x83 }, + { 0x02C6, 0x88 }, + { 0x02DC, 0x98 }, + { 0x2013, 0x96 }, + { 0x2014, 0x97 }, + { 0x2018, 0x91 }, + { 0x2019, 0x92 }, + { 0x201A, 0x82 }, + { 0x201C, 0x93 }, + { 0x201D, 0x94 }, + { 0x201E, 0x84 }, + { 0x2020, 0x86 }, + { 0x2021, 0x87 }, + { 0x2022, 0x95 }, + { 0x2026, 0x85 }, + { 0x2030, 0x89 }, + { 0x2039, 0x8B }, + { 0x203A, 0x9B }, + { 0x20AC, 0x80 }, + { 0x2122, 0x99 }, +}; + +/* ----------------------------------------------------------------------- */ + +static ImplByteConvertData const aImplMS1252ByteCvtData = +{ + aImplMS1252ToUniTab, + NULL, + MS1252UNI_START, MS1252UNI_END, + NOTABUNI_START, NOTABUNI_END, + aImplA0FFSameToCharTab, + aImpl8090SameToCharTab, + aImplMS1252ToCharTabEx, + SAMEA0FFCHAR_START, SAMEA0FFCHAR_END, + SAME8090CHAR_START, SAME8090CHAR_END, + MS1252TOCHARTABEX_COUNT +}; + +/* ----------------------------------------------------------------------- */ + +static ImplTextConverterData const aImplMS1252TextConverterData = +{ + &aImplMS1252ByteCvtData, + NULL, + RTL_UNICODE_CHAR_DEFAULT +}; + +/* ----------------------------------------------------------------------- */ + +static ImplTextConverter const aImplMS1252TextConverter = +{ + &aImplMS1252TextConverterData, + ImplCharToUnicode, + ImplUnicodeToChar, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL +}; + +/* ----------------------------------------------------------------------- */ + +static ImplTextEncodingData const aImplMS1252TextEncodingData = +{ + &aImplMS1252TextConverter, + RTL_TEXTENCODING_MS_1252, + 1, 1, 1, + 0, + 850, + 0, + (const sal_Char*)"iso8859-1", + (const sal_Char*)"iso-8859-1", + RTL_TEXTENCODING_INFO_ASCII | + RTL_TEXTENCODING_INFO_WIN, + SCRIPT_LATIN +}; + +/* ======================================================================= */ + +/* 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 ImplTextConverterData const aImplISO88591TextConverterData = +{ + &aImplISO88591ByteCvtData, + NULL, + RTL_UNICODE_CHAR_DEFAULT +}; + +/* ----------------------------------------------------------------------- */ + +static ImplTextConverter const aImplISO88591TextConverter = +{ + &aImplISO88591TextConverterData, + ImplCharToUnicode, + ImplUnicodeToChar, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL +}; + +/* ----------------------------------------------------------------------- */ + +static ImplTextEncodingData const aImplISO88591TextEncodingData = +{ + &aImplISO88591TextConverter, + RTL_TEXTENCODING_ISO_8859_1, + 1, 1, 1, + 0, + 850, + 0, + (const sal_Char*)"iso8859-1", + (const sal_Char*)"iso-8859-1", + RTL_TEXTENCODING_INFO_ASCII | + RTL_TEXTENCODING_INFO_MIME, + SCRIPT_LATIN +}; + +/* ======================================================================= */ + +/* 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 }, + { 0x00A3, 0xA3 }, + { 0x00A7, 0xA7 }, + { 0x00A9, 0xA9 }, + { 0x00AD, 0xAD }, + { 0x00AE, 0xAE }, + { 0x00B6, 0xB6 }, + { 0x010A, 0xA4 }, + { 0x010B, 0xA5 }, + { 0x0120, 0xB2 }, + { 0x0121, 0xB3 }, + { 0x0174, 0xD0 }, + { 0x0175, 0xF0 }, + { 0x0176, 0xDE }, + { 0x0177, 0xFE }, + { 0x0178, 0xAF }, + { 0x1E02, 0xA1 }, + { 0x1E03, 0xA2 }, + { 0x1E0A, 0xA6 }, + { 0x1E0B, 0xAB }, + { 0x1E1E, 0xB0 }, + { 0x1E1F, 0xB1 }, + { 0x1E40, 0xB4 }, + { 0x1E41, 0xB5 }, + { 0x1E56, 0xB7 }, + { 0x1E57, 0xB9 }, + { 0x1E60, 0xBB }, + { 0x1E61, 0xBF }, + { 0x1E6A, 0xD7 }, + { 0x1E6B, 0xF7 }, + { 0x1E80, 0xA8 }, + { 0x1E81, 0xB8 }, + { 0x1E82, 0xAA }, + { 0x1E83, 0xBA }, + { 0x1E84, 0xBD }, + { 0x1E85, 0xBE }, + { 0x1EF2, 0xAC }, + { 0x1EF3, 0xBC } +}; + +/* ----------------------------------------------------------------------- */ + +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 ImplTextConverterData const aImplISO885914TextConverterData = +{ + &aImplISO885914ByteCvtData, + NULL, + RTL_UNICODE_CHAR_DEFAULT +}; + +/* ----------------------------------------------------------------------- */ + +static ImplTextConverter const aImplISO885914TextConverter = +{ + &aImplISO885914TextConverterData, + ImplCharToUnicode, + ImplUnicodeToChar, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL +}; + +/* ----------------------------------------------------------------------- */ + +static ImplTextEncodingData const aImplISO885914TextEncodingData = +{ + &aImplISO885914TextConverter, + RTL_TEXTENCODING_ISO_8859_14, + 1, 1, 1, + 0, + 850, + 0, + (const sal_Char*)"iso8859-14", + (const sal_Char*)"iso-8859-14", + RTL_TEXTENCODING_INFO_ASCII | + RTL_TEXTENCODING_INFO_MIME, + SCRIPT_LATIN +}; + +/* ======================================================================= */ + +/* 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 }, + { 0x0153, 0xBD }, + { 0x0160, 0xA6 }, + { 0x0161, 0xA8 }, + { 0x0178, 0xBE }, + { 0x017D, 0xB4 }, + { 0x017E, 0xB8 }, + { 0x20AC, 0xA4 } +}; + +/* ----------------------------------------------------------------------- */ + +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 ImplTextConverterData const aImplISO885915TextConverterData = +{ + &aImplISO885915ByteCvtData, + NULL, + RTL_UNICODE_CHAR_DEFAULT +}; + +/* ----------------------------------------------------------------------- */ + +static ImplTextConverter const aImplISO885915TextConverter = +{ + &aImplISO885915TextConverterData, + ImplCharToUnicode, + ImplUnicodeToChar, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL +}; + +/* ----------------------------------------------------------------------- */ + +static ImplTextEncodingData const aImplISO885915TextEncodingData = +{ + &aImplISO885915TextConverter, + RTL_TEXTENCODING_ISO_8859_15, + 1, 1, 1, + 0, + 850, + 0, + (const sal_Char*)"iso8859-15", + (const sal_Char*)"iso-8859-15", + RTL_TEXTENCODING_INFO_ASCII | + RTL_TEXTENCODING_INFO_MIME, + SCRIPT_LATIN +}; + +/* ======================================================================= */ + +/* 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 }, + { 0x0152, 0xCE }, + { 0x0153, 0xCF }, + { 0x0178, 0xD9 }, + { 0x0192, 0xC4 }, + { 0x02C6, 0xF6 }, + { 0x02C7, 0xFF }, + { 0x02D8, 0xF9 }, + { 0x02D9, 0xFA }, + { 0x02DA, 0xFB }, + { 0x02DB, 0xFE }, + { 0x02DC, 0xF7 }, + { 0x02DD, 0xFD }, + { 0x03A9, 0xBD }, + { 0x03C0, 0xB9 }, + { 0x2013, 0xD0 }, + { 0x2014, 0xD1 }, + { 0x2018, 0xD4 }, + { 0x2019, 0xD5 }, + { 0x201A, 0xE2 }, + { 0x201C, 0xD2 }, + { 0x201D, 0xD3 }, + { 0x201E, 0xE3 }, + { 0x2022, 0xA5 }, + { 0x2026, 0xC9 }, + { 0x2030, 0xE4 }, + { 0x2044, 0xDA }, + { 0x2122, 0xAA }, + { 0x2202, 0xB6 }, + { 0x2206, 0xC6 }, + { 0x220F, 0xB8 }, + { 0x2211, 0xB7 }, + { 0x221A, 0xC3 }, + { 0x221E, 0xB0 }, + { 0x222B, 0xBA }, + { 0x2248, 0xC5 }, + { 0x2260, 0xAD }, + { 0x2264, 0xB2 }, + { 0x2265, 0xB3 }, + { 0x25CA, 0xD7 }, + { 0xF8FF, 0xF0 } +}; + +/* ----------------------------------------------------------------------- */ + +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 ImplTextConverterData const aImplAPPLEICELANDTextConverterData = +{ + &aImplAPPLEICELANDByteCvtData, + NULL, + RTL_UNICODE_CHAR_DEFAULT +}; + +/* ----------------------------------------------------------------------- */ + +static ImplTextConverter const aImplAPPLEICELANDTextConverter = +{ + &aImplAPPLEICELANDTextConverterData, + ImplCharToUnicode, + ImplUnicodeToChar, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL +}; + +/* ----------------------------------------------------------------------- */ + +static ImplTextEncodingData const aImplAPPLEICELANDTextEncodingData = +{ + &aImplAPPLEICELANDTextConverter, + RTL_TEXTENCODING_APPLE_ICELAND, + 1, 1, 1, + 0, + 861, + 37, + (const sal_Char*)"iso8859-1", + (const sal_Char*)"iso-8859-1", + RTL_TEXTENCODING_INFO_ASCII | + RTL_TEXTENCODING_INFO_MAC, + SCRIPT_LATIN +}; + +/* ======================================================================= */ + +/* 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 }, + { 0x0152, 0xCE }, + { 0x0153, 0xCF }, + { 0x0178, 0xD9 }, + { 0x0192, 0xC4 }, + { 0x02C6, 0xF6 }, + { 0x02C7, 0xFF }, + { 0x02D8, 0xF9 }, + { 0x02D9, 0xFA }, + { 0x02DA, 0xFB }, + { 0x02DB, 0xFE }, + { 0x02DC, 0xF7 }, + { 0x02DD, 0xFD }, + { 0x03A9, 0xBD }, + { 0x03C0, 0xB9 }, + { 0x2013, 0xD0 }, + { 0x2014, 0xD1 }, + { 0x2018, 0xD4 }, + { 0x2019, 0xD5 }, + { 0x201A, 0xE2 }, + { 0x201C, 0xD2 }, + { 0x201D, 0xD3 }, + { 0x201E, 0xE3 }, + { 0x2020, 0xA0 }, + { 0x2021, 0xE0 }, + { 0x2022, 0xA5 }, + { 0x2026, 0xC9 }, + { 0x2030, 0xE4 }, + { 0x2039, 0xDC }, + { 0x203A, 0xDD }, + { 0x2044, 0xDA }, + { 0x20AC, 0xDB }, + { 0x2122, 0xAA }, + { 0x2202, 0xB6 }, + { 0x2206, 0xC6 }, + { 0x220F, 0xB8 }, + { 0x2211, 0xB7 }, + { 0x221A, 0xC3 }, + { 0x221E, 0xB0 }, + { 0x222B, 0xBA }, + { 0x2248, 0xC5 }, + { 0x2260, 0xAD }, + { 0x2264, 0xB2 }, + { 0x2265, 0xB3 }, + { 0x25CA, 0xD7 }, + { 0xF8FF, 0xF0 }, + { 0xFB01, 0xDE }, + { 0xFB02, 0xDF } +}; + +/* ----------------------------------------------------------------------- */ + +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 ImplTextConverterData const aImplAPPLEROMANTextConverterData = +{ + &aImplAPPLEROMANByteCvtData, + NULL, + RTL_UNICODE_CHAR_DEFAULT +}; + +/* ----------------------------------------------------------------------- */ + +static ImplTextConverter const aImplAPPLEROMANTextConverter = +{ + &aImplAPPLEROMANTextConverterData, + ImplCharToUnicode, + ImplUnicodeToChar, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL +}; + +/* ----------------------------------------------------------------------- */ + +static ImplTextEncodingData const aImplAPPLEROMANTextEncodingData = +{ + &aImplAPPLEROMANTextConverter, + RTL_TEXTENCODING_APPLE_ROMAN, + 1, 1, 1, + 77, + 850, + 0, + (const sal_Char*)"iso8859-1", + (const sal_Char*)"iso-8859-1", + RTL_TEXTENCODING_INFO_ASCII | + RTL_TEXTENCODING_INFO_MAC, + SCRIPT_LATIN +}; + +/* ======================================================================= */ + +/* 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 ImplTextConverterData const aImplUSASCIITextConverterData = +{ + &aImplUSASCIIByteCvtData, + NULL, + RTL_UNICODE_CHAR_DEFAULT +}; + +/* ----------------------------------------------------------------------- */ + +static ImplTextConverter const aImplUSASCIITextConverter = +{ + &aImplUSASCIITextConverterData, + ImplCharToUnicode, + ImplUnicodeToChar, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL +}; + +/* ----------------------------------------------------------------------- */ + +static ImplTextEncodingData const aImplUSASCIITextEncodingData = +{ + &aImplUSASCIITextConverter, + RTL_TEXTENCODING_ASCII_US, + 1, 1, 1, + 0, + 437, + 0, + (const sal_Char*)"iso8859-1", + (const sal_Char*)"us-ascii", + RTL_TEXTENCODING_INFO_ASCII | + RTL_TEXTENCODING_INFO_7BIT | + RTL_TEXTENCODING_INFO_MIME, + SCRIPT_LATIN +}; + diff --git a/sal/textenc/tcvtmb.c b/sal/textenc/tcvtmb.c new file mode 100644 index 000000000000..ef1efdd14e3c --- /dev/null +++ b/sal/textenc/tcvtmb.c @@ -0,0 +1,745 @@ +/************************************************************************* + * + * $RCSfile: tcvtmb.c,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:17:29 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +#define _RTL_TCVTMB_C + +#ifndef _RTL_TENCHELP_H +#include +#endif +#ifndef _RTL_TEXTCVT_H +#include +#endif + +/* ======================================================================= */ + +/* 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->mpConvertTables); + const ImplDBCSToUniLeadTab* pLeadTab = pConvertData->mpToUniLeadTab; + sal_Unicode* pEndDestBuf; + const sal_Char* pEndSrcBuf; + + *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 ) + { + 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, pData ); + } + } + else + { + /* Source buffer to small */ + if ( pSrcBuf == 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 ) + { + /* EUC Ranges */ + sal_uInt16 i; + const ImplDBCSEUCData* pEUCTab = pConvertData->mpEUCTab; + for ( i = 0; i < pConvertData->mnEUCCount; i++ ) + { + if ( (cLead >= pEUCTab->mnLeadStart) && + (cLead <= pEUCTab->mnLeadEnd) ) + { + sal_uInt16 nTrailCount = 0; + if ( (cTrail >= pEUCTab->mnTrail1Start) && + (cTrail <= pEUCTab->mnTrail1End) ) + { + cConv = pEUCTab->mnUniStart+ + ((cLead-pEUCTab->mnLeadStart)*pEUCTab->mnTrailRangeCount)+ + (cTrail-pEUCTab->mnTrail1Start); + break; + } + else + { + nTrailCount = pEUCTab->mnTrail1End-pEUCTab->mnTrail1Start+1; + if ( (pEUCTab->mnTrailCount >= 2) && + (cTrail >= pEUCTab->mnTrail2Start) && + (cTrail <= pEUCTab->mnTrail2End) ) + { + cConv = pEUCTab->mnUniStart+ + ((cLead-pEUCTab->mnLeadStart)*pEUCTab->mnTrailRangeCount)+ + nTrailCount+ + (cTrail-pEUCTab->mnTrail2Start); + break; + } + else + { + nTrailCount = pEUCTab->mnTrail2End-pEUCTab->mnTrail2Start+1; + if ( (pEUCTab->mnTrailCount >= 3) && + (cTrail >= pEUCTab->mnTrail3Start) && + (cTrail <= pEUCTab->mnTrail3End) ) + { + cConv = pEUCTab->mnUniStart+ + ((cLead-pEUCTab->mnLeadStart)*pEUCTab->mnTrailRangeCount)+ + nTrailCount+ + (cTrail-pEUCTab->mnTrail3Start); + break; + } + } + } + } + + pEUCTab++; + } + + 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 ( (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_UNICODE_CHAR_DEFAULT; + } + 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_UNICODE_CHAR_DEFAULT; + } + } + } + } + + 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 ) +{ + int nAction; + sal_uInt16 cConv; + sal_Unicode c; + sal_uChar nHighChar; + sal_uChar nLowChar; + const ImplUniToDBCSHighTab* pHighEntry; + const ImplDBCSConvertData* pConvertData = (const ImplDBCSConvertData*)(pData->mpConvertTables); + const ImplUniToDBCSHighTab* pHighTab = pConvertData->mpToDBCSHighTab; + sal_Char* pEndDestBuf; + const sal_Unicode* pEndSrcBuf; + + *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]; + else + cConv = 0; + + if ( !cConv && !c ) + { + /* EUC Ranges */ + sal_uInt16 i; + const ImplDBCSEUCData* pEUCTab = pConvertData->mpEUCTab; + for ( i = 0; i < pConvertData->mnEUCCount; i++ ) + { + if ( (c >= pEUCTab->mnUniStart) && (c <= pEUCTab->mnUniEnd) ) + { + sal_uInt16 nLead = (c-pEUCTab->mnUniStart) / pEUCTab->mnTrailRangeCount; + sal_uInt16 nOff = c-(nLead*pEUCTab->mnTrailRangeCount); + cConv = pEUCTab->mnLeadStart+nLead; + cConv <<= 8; + if ( nOff < (pEUCTab->mnTrail1End-pEUCTab->mnTrail1Start+1) ) + cConv += pEUCTab->mnTrail1Start+nOff; + else + { + nOff -= pEUCTab->mnTrail1End-pEUCTab->mnTrail1Start+1; + if ( nOff < (pEUCTab->mnTrail2End-pEUCTab->mnTrail2Start+1) ) + cConv += pEUCTab->mnTrail2Start+nOff; + else + { + nOff -= pEUCTab->mnTrail2End-pEUCTab->mnTrail2Start+1; + cConv += pEUCTab->mnTrail3Start+nOff; + } + } + + break; + } + + pEUCTab++; + } + + if ( (c >= 0xF100) && (c <= 0xF1FF) ) + { + 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) */ + nAction = ImplHandleUndefinedUnicodeToTextChar( pData, + &pSrcBuf, pEndSrcBuf, + &pDestBuf, pEndDestBuf, + nFlags, pInfo ); + if ( nAction == IMPL_TEXTCVT_BREAK ) + break; + else + continue; + } + } + + /* 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; + sal_uChar cTrail; + sal_Unicode cConv; + const ImplDBCSToUniLeadTab* pLeadEntry; + const ImplDBCSToUniLeadTab* pLeadTab; + const ImplEUCJPConvertData* pConvertData = (const ImplEUCJPConvertData*)(pData->mpConvertTables); + sal_Unicode* pEndDestBuf; + const sal_Char* pEndSrcBuf; + + *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 == pEndSrcBuf ) + { + *pInfo |= RTL_TEXTTOUNICODE_INFO_ERROR | 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 ( pSrcBuf+1 == pEndSrcBuf ) + { + *pInfo |= RTL_TEXTTOUNICODE_INFO_ERROR | 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 == pEndSrcBuf ) + { + *pInfo |= RTL_TEXTTOUNICODE_INFO_ERROR | 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_UNICODE_CHAR_DEFAULT; + } + 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_UNICODE_CHAR_DEFAULT; + } + } + } + + 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 ) +{ + int nAction; + sal_uInt32 cConv; + sal_Unicode c; + sal_uChar nHighChar; + sal_uChar nLowChar; + const ImplUniToDBCSHighTab* pHighEntry; + const ImplUniToDBCSHighTab* pHighTab; + const ImplEUCJPConvertData* pConvertData = (const ImplEUCJPConvertData*)(pData->mpConvertTables); + sal_Char* pEndDestBuf; + const sal_Unicode* pEndSrcBuf; + + *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]; + cConv |= 0x8080; + } + else + cConv = 0; + + /* JIS 0212 */ + if ( !cConv ) + { + pHighTab = pConvertData->mpUniToJIS0212HighTab; + pHighEntry = pHighTab+nHighChar; + if ( (nLowChar >= pHighEntry->mnLowStart) && (nLowChar <= pHighEntry->mnLowEnd) ) + { + cConv = 0x8F0000+(pHighEntry->mpToUniTrailTab[nLowChar-pHighEntry->mnLowStart]); + cConv |= 0x8080; + } + + 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) */ + nAction = ImplHandleUndefinedUnicodeToTextChar( pData, + &pSrcBuf, pEndSrcBuf, + &pDestBuf, pEndDestBuf, + nFlags, pInfo ); + if ( nAction == IMPL_TEXTCVT_BREAK ) + break; + else + continue; + } + } + } + + /* 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)); +} + +/* ======================================================================= */ + +sal_Size ImplUnicodeToJISX0208( 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_uChar nHighChar; + sal_uChar nLowChar; + const ImplUniToDBCSHighTab* pHighTab; + const ImplUniToDBCSHighTab* pHighEntry; + sal_uInt16 cConv; + sal_Char* pEndDestBuf; + const sal_Unicode* pEndSrcBuf; + + pEndDestBuf = pDestBuf+nDestBytes; + pEndSrcBuf = pSrcBuf+nSrcChars; + + *pInfo = 0; + pHighTab = (ImplUniToDBCSHighTab*)pData->mpConvertTables; + + while ( pSrcBuf < pEndSrcBuf) + { + c = *pSrcBuf; + nHighChar = (sal_uChar)((c >> 8) & 0xFF); + nLowChar = (sal_uChar)(c & 0xFF); + + pHighEntry = pHighTab + nHighChar; + if ( (nLowChar >= pHighEntry->mnLowStart) && (nLowChar <= pHighEntry->mnLowEnd) ) + cConv = pHighEntry->mpToUniTrailTab[nLowChar-pHighEntry->mnLowStart]; + else + cConv = 0; + + if (cConv != 0) + { + 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)); +} diff --git a/sal/textenc/tcvtscn1.tab b/sal/textenc/tcvtscn1.tab new file mode 100644 index 000000000000..d93ef574456d --- /dev/null +++ b/sal/textenc/tcvtscn1.tab @@ -0,0 +1,3884 @@ +/************************************************************************* + * + * $RCSfile: tcvtscn1.tab,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:17:29 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRUNTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRUNTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc.. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +/* ======================================================================= */ + +/* 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 */ +}; diff --git a/sal/textenc/tcvtscn2.tab b/sal/textenc/tcvtscn2.tab new file mode 100644 index 000000000000..1b48a0f52805 --- /dev/null +++ b/sal/textenc/tcvtscn2.tab @@ -0,0 +1,4205 @@ +/************************************************************************* + * + * $RCSfile: tcvtscn2.tab,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:17:29 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRUNTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRUNTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc.. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +/* ======================================================================= */ + +/* 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_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_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..85af1fc127ec --- /dev/null +++ b/sal/textenc/tcvtscn3.tab @@ -0,0 +1,1536 @@ +/************************************************************************* + * + * $RCSfile: tcvtscn3.tab,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:17:29 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRUNTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRUNTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc.. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +/* ======================================================================= */ + +/* 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..e405f940c5f7 --- /dev/null +++ b/sal/textenc/tcvtscn4.tab @@ -0,0 +1,3104 @@ +/************************************************************************* + * + * $RCSfile: tcvtscn4.tab,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:17:29 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRUNTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRUNTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc.. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +/* ======================================================================= */ + +/* 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..35bc153e179a --- /dev/null +++ b/sal/textenc/tcvtscn5.tab @@ -0,0 +1,3269 @@ +/************************************************************************* + * + * $RCSfile: tcvtscn5.tab,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:17:29 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRUNTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRUNTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc.. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +/* ======================================================================= */ + +/* 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..ea7d5ec657e3 --- /dev/null +++ b/sal/textenc/tcvtscn6.tab @@ -0,0 +1,2994 @@ +/************************************************************************* + * + * $RCSfile: tcvtscn6.tab,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:17:29 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRUNTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRUNTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc.. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +/* ======================================================================= */ + +/* 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 + +/* ======================================================================= */ + +/* We use this EUC range also for GB, GBT and GBK */ +#define DBCS_EUC_MS936_COUNT 2 +static ImplDBCSEUCData const aImplMS936DBCSEUCTab[DBCS_EUC_MS936_COUNT] = +{ + /* EUC-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 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 */ +}; + +/* ----------------------------------------------------------------------- */ + +static ImplDBCSConvertData const aImplGB2312DBCSCvtData = +{ + aGB2312UniLeadTab, + aGB2312DBCSHighTab, + 0xA1, 0xFE, + aImplMS936DBCSEUCTab, + DBCS_EUC_MS936_COUNT +}; + +/* ----------------------------------------------------------------------- */ + +static ImplTextConverterData const aImplGB2312TextConverterData = +{ + &aImplGB2312DBCSCvtData, + NULL, + RTL_UNICODE_CHAR_DEFAULT +}; + +/* ----------------------------------------------------------------------- */ + +static ImplTextConverter const aImplGB2312TextConverter = +{ + &aImplGB2312TextConverterData, + ImplDBCSToUnicode, + ImplUnicodeToDBCS, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL +}; + +/* ----------------------------------------------------------------------- */ + +static ImplTextEncodingData const aImplGB2312TextEncodingData = +{ + &aImplGB2312TextConverter, + RTL_TEXTENCODING_GB_2312, + 1, 2, 2, + 134, + 936, + 25, + (const sal_Char*)"euc-cn", /* ??? */ + (const sal_Char*)"gb2312", + RTL_TEXTENCODING_INFO_ASCII | + RTL_TEXTENCODING_INFO_MULTIBYTE | + RTL_TEXTENCODING_INFO_MIME, + SCRIPT_CHINESE_SIMPLIFIED +}; + +/* ======================================================================= */ + +static ImplTextEncodingData aImplEUCCNTextEncodingData = +{ + &aImplGB2312TextConverter, + RTL_TEXTENCODING_EUC_CN, + 1, 2, 2, + 134, + 936, + 25, + (const sal_Char*)"euc-cn", /* ??? */ + (const sal_Char*)"gb2312", + RTL_TEXTENCODING_INFO_ASCII | + RTL_TEXTENCODING_INFO_MULTIBYTE, + SCRIPT_CHINESE_SIMPLIFIED +}; + +/* ======================================================================= */ + +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, + 0xA1, 0xFE, + aImplMS936DBCSEUCTab, + DBCS_EUC_MS936_COUNT +}; + +/* ----------------------------------------------------------------------- */ + +static ImplTextConverterData const aImplGBT12345TextConverterData = +{ + &aImplGBT12345DBCSCvtData, + NULL, + RTL_UNICODE_CHAR_DEFAULT +}; + +/* ----------------------------------------------------------------------- */ + +static ImplTextConverter const aImplGBT12345TextConverter = +{ + &aImplGBT12345TextConverterData, + ImplDBCSToUnicode, + ImplUnicodeToDBCS, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL +}; + +/* ----------------------------------------------------------------------- */ + +static ImplTextEncodingData const aImplGBT12345TextEncodingData = +{ + &aImplGBT12345TextConverter, + RTL_TEXTENCODING_GBT_12345, + 1, 2, 2, + 134, + 936, + 25, + (const sal_Char*)"euc-cn", /* ??? */ + (const sal_Char*)"cn-gb-12345", + RTL_TEXTENCODING_INFO_ASCII | + RTL_TEXTENCODING_INFO_MULTIBYTE | + RTL_TEXTENCODING_INFO_MIME, + SCRIPT_CHINESE_SIMPLIFIED +}; + +/* ======================================================================= */ + +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, 0x4F, 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 */ + { 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, 0x75, 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, + 0x40, 0xFE, + aImplMS936DBCSEUCTab, + DBCS_EUC_MS936_COUNT +}; + +/* ----------------------------------------------------------------------- */ + +static ImplTextConverterData const aImplGBKTextConverterData = +{ + &aImplGBKDBCSCvtData, + NULL, + RTL_UNICODE_CHAR_DEFAULT +}; + +/* ----------------------------------------------------------------------- */ + +static ImplTextConverter const aImplGBKTextConverter = +{ + &aImplGBKTextConverterData, + ImplDBCSToUnicode, + ImplUnicodeToDBCS, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL +}; + +/* ----------------------------------------------------------------------- */ + +static ImplTextEncodingData const aImplGBKTextEncodingData = +{ + &aImplGBKTextConverter, + RTL_TEXTENCODING_GBK, + 1, 2, 2, + 134, + 936, + 25, + (const sal_Char*)"euc-cn", /* ??? */ + (const sal_Char*)"gb2312", + RTL_TEXTENCODING_INFO_ASCII | + RTL_TEXTENCODING_INFO_MULTIBYTE | + RTL_TEXTENCODING_INFO_MIME, + SCRIPT_CHINESE_SIMPLIFIED +}; + +/* ======================================================================= */ + +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, 0x75, 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, + 0x40, 0xFE, + aImplMS936DBCSEUCTab, + DBCS_EUC_MS936_COUNT +}; + +/* ----------------------------------------------------------------------- */ + +static ImplTextConverterData const aImplMS936TextConverterData = +{ + &aImplMS936DBCSCvtData, + NULL, + RTL_UNICODE_CHAR_DEFAULT +}; + +/* ----------------------------------------------------------------------- */ + +static ImplTextConverter const aImplMS936TextConverter = +{ + &aImplMS936TextConverterData, + ImplDBCSToUnicode, + ImplUnicodeToDBCS, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL +}; + +/* ----------------------------------------------------------------------- */ + +static ImplTextEncodingData const aImplMS936TextEncodingData = +{ + &aImplMS936TextConverter, + RTL_TEXTENCODING_MS_936, + 1, 2, 2, + 134, + 936, + 25, + (const sal_Char*)"euc-cn", /* ??? */ + (const sal_Char*)"gb2312", + RTL_TEXTENCODING_INFO_ASCII | + RTL_TEXTENCODING_INFO_MULTIBYTE | + RTL_TEXTENCODING_INFO_WIN | + RTL_TEXTENCODING_INFO_DOS_OS2, + SCRIPT_CHINESE_SIMPLIFIED +}; + +/* ======================================================================= */ + +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, + 0xA1, 0xFE, + NULL, + 0 +}; + +/* ----------------------------------------------------------------------- */ + +static ImplTextConverterData const aImplAPPLECHINSIMPTextConverterData = +{ + &aImplAPPLECHINSIMPDBCSCvtData, + NULL, + RTL_UNICODE_CHAR_DEFAULT +}; + +/* ----------------------------------------------------------------------- */ + +static ImplTextConverter const aImplAPPLECHINSIMPTextConverter = +{ + &aImplAPPLECHINSIMPTextConverterData, + ImplDBCSToUnicode, + ImplUnicodeToDBCS, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL +}; + +/* ----------------------------------------------------------------------- */ + +static ImplTextEncodingData const aImplAPPLECHINSIMPTextEncodingData = +{ + &aImplAPPLECHINSIMPTextConverter, + RTL_TEXTENCODING_APPLE_CHINSIMP, + 1, 2, 2, + 134, + 936, + 25, + (const sal_Char*)"euc-cn", /* ??? */ + (const sal_Char*)"gb2312", + RTL_TEXTENCODING_INFO_ASCII | + RTL_TEXTENCODING_INFO_MULTIBYTE | + RTL_TEXTENCODING_INFO_MAC, + SCRIPT_CHINESE_SIMPLIFIED +}; diff --git a/sal/textenc/tcvtsym1.tab b/sal/textenc/tcvtsym1.tab new file mode 100644 index 000000000000..bd3d20af4d8d --- /dev/null +++ b/sal/textenc/tcvtsym1.tab @@ -0,0 +1,108 @@ +/************************************************************************* + * + * $RCSfile: tcvtsym1.tab,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:17:29 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRUNTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRUNTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc.. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +/* ======================================================================= */ + +/* This file contain the tables for 1 byte symbol charsets */ + +/* ======================================================================= */ + +/* Symbol */ + +/* ----------------------------------------------------------------------- */ + +static ImplTextConverterData const aImplSYMBOLTextConverterData = +{ + NULL, + NULL, + RTL_UNICODE_CHAR_DEFAULT +}; + +/* ----------------------------------------------------------------------- */ + +static ImplTextConverter const aImplSYMBOLTextConverter = +{ + &aImplSYMBOLTextConverterData, + ImplSymbolToUnicode, + ImplUnicodeToSymbol, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL +}; + +/* ----------------------------------------------------------------------- */ + +static ImplTextEncodingData const aImplSYMBOLTextEncodingData = +{ + &aImplSYMBOLTextConverter, + RTL_TEXTENCODING_SYMBOL, + 1, 1, 1, + 2, + 65400, + 32, + (const sal_Char*)"adobe-fontspecific", + (const sal_Char*)"invariant", + RTL_TEXTENCODING_INFO_SYMBOL, + SCRIPT_SYMBOL +}; diff --git a/sal/textenc/tcvttcn1.tab b/sal/textenc/tcvttcn1.tab new file mode 100644 index 000000000000..da402e944671 --- /dev/null +++ b/sal/textenc/tcvttcn1.tab @@ -0,0 +1,2926 @@ +/************************************************************************* + * + * $RCSfile: tcvttcn1.tab,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:17:29 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRUNTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRUNTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc.. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +/* ======================================================================= */ + +/* 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 */ + +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 */ + +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..df13e52be2e8 --- /dev/null +++ b/sal/textenc/tcvttcn2.tab @@ -0,0 +1,3749 @@ +/************************************************************************* + * + * $RCSfile: tcvttcn2.tab,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:17:30 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRUNTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRUNTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc.. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +/* ======================================================================= */ + +/* 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..eeeef67e46d9 --- /dev/null +++ b/sal/textenc/tcvttcn6.tab @@ -0,0 +1,1819 @@ +/************************************************************************* + * + * $RCSfile: tcvttcn6.tab,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:17:30 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRUNTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRUNTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc.. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +/* ======================================================================= */ + +/* This file contain the information tables for all */ +/* chinese traditional (Taiwan/HongKong) charsets: */ +/* BIG5, MS950, APPLE_CHINTRAD */ + +/* ======================================================================= */ + +/* We use this EUC range also for BIG5 */ +/* !!! because I don't know how the ms mapping works, I use my own mapping !!! */ +/* tables like MS doku: */ +/* FA40-FEFE --> E000-E310 5*9D = 311 - E310-E000 = 311 */ +/* 8E40-A0FE --> E311-EEB7 3*9D = 1D7 - EEB7-E311 = BA7 */ +/* 8140-8DFE --> EEB8-F6B0 13*9D = BA7 - F6B=-EEB8 = 7F9 */ +/* C6A1-C8FE --> F6B1-F8FF 3*5E = 11A - F8FF-F6B1 = 24F */ +#define DBCS_EUC_MS950_COUNT 2 +static ImplDBCSEUCData const aImplMS950DBCSEUCTab[DBCS_EUC_MS950_COUNT] = +{ + /* EUC-Range */ + /* Lead: FA-FE */ + /* Trail: 40-7E, A1-FE */ + { 0xFA, 0xFE, 0x40, 0x7E, 0xA1, 0xFE, 0, 0, 2, 0x9D, 0xE000, 0xE310 }, + /* Lead: 81-8D */ + /* Trail: 40-7E, A1-FE */ + { 0x81, 0x8D, 0x40, 0x7E, 0xA1, 0xFE, 0, 0, 2, 0x9D, 0xE311, 0xEEB7 } +}; + +/* ----------------------------------------------------------------------- */ + +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, 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, 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 */ + { 0x20, 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 */ + { 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_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 aImplBIG5DBCSCvtData = +{ + aBIG5UniLeadTab, + aBIG5DBCSHighTab, + 0x40, 0xFE, + aImplMS950DBCSEUCTab, + DBCS_EUC_MS950_COUNT +}; + +/* ----------------------------------------------------------------------- */ + +static ImplTextConverterData const aImplBIG5TextConverterData = +{ + &aImplBIG5DBCSCvtData, + NULL, + RTL_UNICODE_CHAR_DEFAULT +}; + +/* ----------------------------------------------------------------------- */ + +static ImplTextConverter const aImplBIG5TextConverter = +{ + &aImplBIG5TextConverterData, + ImplDBCSToUnicode, + ImplUnicodeToDBCS, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL +}; + +/* ----------------------------------------------------------------------- */ + +static ImplTextEncodingData const aImplBIG5TextEncodingData = +{ + &aImplBIG5TextConverter, + RTL_TEXTENCODING_BIG5, + 1, 2, 2, + 136, + 950, + 2, + (const sal_Char*)"euc-tw", /* ??? */ + (const sal_Char*)"big5", + RTL_TEXTENCODING_INFO_ASCII | + RTL_TEXTENCODING_INFO_MULTIBYTE | + RTL_TEXTENCODING_INFO_MIME, + SCRIPT_CHINESE_TRADITIONAL +}; + +/* ======================================================================= */ + +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, 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 */ + { 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 */ + { 0x20, 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 */ + { 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_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, + 0x40, 0xFE, + aImplMS950DBCSEUCTab, + DBCS_EUC_MS950_COUNT +}; + +/* ----------------------------------------------------------------------- */ + +static ImplTextConverterData const aImplMS950TextConverterData = +{ + &aImplMS950DBCSCvtData, + NULL, + RTL_UNICODE_CHAR_DEFAULT +}; + +/* ----------------------------------------------------------------------- */ + +static ImplTextConverter const aImplMS950TextConverter = +{ + &aImplMS950TextConverterData, + ImplDBCSToUnicode, + ImplUnicodeToDBCS, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL +}; + +/* ----------------------------------------------------------------------- */ + +static ImplTextEncodingData const aImplMS950TextEncodingData = +{ + &aImplMS950TextConverter, + RTL_TEXTENCODING_MS_950, + 1, 2, 2, + 136, + 950, + 2, + (const sal_Char*)"euc-tw", /* ??? */ + (const sal_Char*)"big5", + RTL_TEXTENCODING_INFO_ASCII | + RTL_TEXTENCODING_INFO_MULTIBYTE | + RTL_TEXTENCODING_INFO_WIN | + RTL_TEXTENCODING_INFO_DOS_OS2, + SCRIPT_CHINESE_TRADITIONAL +}; + +/* ======================================================================= */ + +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 */ + { 0x20, 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 */ + { 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_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, + 0x40, 0xFE, + NULL, + 0 +}; + +/* ----------------------------------------------------------------------- */ + +static ImplTextConverterData const aImplAPPLECHINTRADTextConverterData = +{ + &aImplAPPLECHINTRADDBCSCvtData, + NULL, + RTL_UNICODE_CHAR_DEFAULT +}; + +/* ----------------------------------------------------------------------- */ + +static ImplTextConverter const aImplAPPLECHINTRADTextConverter = +{ + &aImplAPPLECHINTRADTextConverterData, + ImplDBCSToUnicode, + ImplUnicodeToDBCS, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL +}; + +/* ----------------------------------------------------------------------- */ + +static ImplTextEncodingData const aImplAPPLECHINTRADTextEncodingData = +{ + &aImplAPPLECHINTRADTextConverter, + RTL_TEXTENCODING_APPLE_CHINTRAD, + 1, 2, 2, + 136, + 950, + 2, + (const sal_Char*)"euc-tw", /* ??? */ + (const sal_Char*)"big5", + RTL_TEXTENCODING_INFO_ASCII | + RTL_TEXTENCODING_INFO_MULTIBYTE | + RTL_TEXTENCODING_INFO_MAC, + SCRIPT_CHINESE_TRADITIONAL +}; diff --git a/sal/textenc/tcvtuni1.tab b/sal/textenc/tcvtuni1.tab new file mode 100644 index 000000000000..a0c4a14bb84e --- /dev/null +++ b/sal/textenc/tcvtuni1.tab @@ -0,0 +1,159 @@ +/************************************************************************* + * + * $RCSfile: tcvtuni1.tab,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:17:30 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRUNTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRUNTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc.. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +/* ======================================================================= */ + +/* This file contain the tables for all unicode enabled text encodings */ + +/* ======================================================================= */ + +/* UTF7 */ + +/* ----------------------------------------------------------------------- */ + +static ImplTextConverterData const aImplUTF7TextConverterData = +{ + NULL, + NULL, + RTL_UNICODE_CHAR_DEFAULT +}; + +/* ----------------------------------------------------------------------- */ + +static ImplTextConverter const aImplUTF7TextConverter = +{ + &aImplUTF7TextConverterData, + ImplUTF7ToUnicode, + ImplUnicodeToUTF7, + ImplUTF7CreateUTF7TextToUnicodeContext, + ImplUTF7DestroyTextToUnicodeContext, + ImplUTF7ResetTextToUnicodeContext, + ImplUTF7CreateUnicodeToTextContext, + ImplUTF7DestroyUnicodeToTextContext, + ImplUTF7ResetUnicodeToTextContext +}; + +/* ----------------------------------------------------------------------- */ + +static ImplTextEncodingData const aImplUTF7TextEncodingData = +{ + &aImplUTF7TextConverter, + RTL_TEXTENCODING_UTF7, + 1, 6, 1, + 0, + 850, + 0, + (const sal_Char*)"iso8859-1", + (const sal_Char*)"utf-7", + RTL_TEXTENCODING_INFO_CONTEXT | + RTL_TEXTENCODING_INFO_UNICODE | + RTL_TEXTENCODING_INFO_7BIT | + RTL_TEXTENCODING_INFO_MULTIBYTE | + RTL_TEXTENCODING_INFO_MIME, + SCRIPT_UNICODE +}; + +/* ======================================================================= */ + +/* UTF8 */ + +/* ----------------------------------------------------------------------- */ + +static ImplTextConverterData const aImplUTF8TextConverterData = +{ + NULL, + NULL, + RTL_UNICODE_CHAR_DEFAULT +}; + +/* ----------------------------------------------------------------------- */ + +static ImplTextConverter const aImplUTF8TextConverter = +{ + &aImplUTF8TextConverterData, + ImplUTF8ToUnicode, + ImplUnicodeToUTF8, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL +}; + +/* ----------------------------------------------------------------------- */ + +static ImplTextEncodingData const aImplUTF8TextEncodingData = +{ + &aImplUTF8TextConverter, + RTL_TEXTENCODING_UTF8, + 1, 6, 1, + 0, + 850, + 0, + (const sal_Char*)"iso8859-1", + (const sal_Char*)"utf-8", + RTL_TEXTENCODING_INFO_ASCII | + RTL_TEXTENCODING_INFO_UNICODE | + RTL_TEXTENCODING_INFO_MULTIBYTE | + RTL_TEXTENCODING_INFO_MIME, + SCRIPT_UNICODE +}; diff --git a/sal/textenc/tcvtutf7.c b/sal/textenc/tcvtutf7.c new file mode 100644 index 000000000000..649d4c264632 --- /dev/null +++ b/sal/textenc/tcvtutf7.c @@ -0,0 +1,622 @@ +/************************************************************************* + * + * $RCSfile: tcvtutf7.c,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:17:30 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +#define _RTL_CCVTUTF7_C + +#ifndef _RTL_ALLOC_H +#include +#endif + +#ifndef _RTL_TENCHELP_H +#include +#endif +#ifndef _RTL_TEXTCVT_H +#include +#endif + +/* ======================================================================= */ + +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 _ImplUTF7ToUCContextData +{ + 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; + sal_uChar nBase64Value; + 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; + +/* !!! 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_UNICODE_CHAR_DEFAULT; + pDestBuf++; + } + } + + } + + 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_UNICODE_CHAR_DEFAULT; + pDestBuf++; + } + } + + /* 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 _ImplUTF7FromUCContextData +{ + 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; + int bEnd = sal_False; + int bShifted; + int bNeedShift; + sal_uInt32 nBitBuffer; + sal_uInt32 nBitBufferTemp; + sal_uInt32 nBufferBits; + sal_Char* pEndDestBuf; + const sal_Unicode* pEndSrcBuf; + +/* !!! 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_ERROR | 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_ERROR | 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_ERROR | RTL_UNICODETOTEXT_INFO_DESTBUFFERTOSMALL; + break; + } + + /* Write SHIFT_OUT_CHAR, when needed */ + if ( !bNeedShift ) + { + if ( pDestBuf >= pEndDestBuf ) + { + *pInfo |= RTL_UNICODETOTEXT_INFO_ERROR | 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_ERROR | 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..9ae71ee1c78a --- /dev/null +++ b/sal/textenc/tcvtutf8.c @@ -0,0 +1,433 @@ +/************************************************************************* + * + * $RCSfile: tcvtutf8.c,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:17:30 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +#define _RTL_TCVTUTF8_C + +#ifndef _RTL_TENCHELP_H +#include +#endif +#ifndef _RTL_TEXTCVT_H +#include +#endif + +/* ======================================================================= */ + +#define TEXTCVT_MAX_UNICHAR 0x0010FFFF + +/* ----------------------------------------------------------------------- */ + +sal_Size ImplUTF8ToUnicode( 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 ) +{ + static sal_uInt8 const nExtraBytesFromUTF8Tab[16] = + { + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 5, 5, 0, 0 + }; + static sal_uInt8 const nFirstByteMaskTab[3] = + { + 0x07, 0x03, 0x01 + }; + + sal_uInt8 nBytes; + sal_uInt8 nTempBytes; + sal_uChar c; + sal_uInt32 cConv; + sal_Unicode* pEndDestBuf; + const sal_Char* pEndSrcBuf; + + *pInfo = 0; + pEndDestBuf = pDestBuf+nDestChars; + pEndSrcBuf = pSrcBuf+nSrcBytes; + while ( pSrcBuf < pEndSrcBuf ) + { + if ( pDestBuf == pEndDestBuf ) + { + *pInfo |= RTL_TEXTTOUNICODE_INFO_ERROR | RTL_TEXTTOUNICODE_INFO_DESTBUFFERTOSMALL; + break; + } + + c = (sal_uChar)*pSrcBuf; + + /* 1 Byte */ + /* 0aaaaaaa (000000000aaaaaaa) */ + if ( !(c & 0x80) ) + { + *pDestBuf = (sal_Unicode)c; + pDestBuf++; + pSrcBuf++; + } + /* 2-3 Bytes */ + else if ( (c & 0xF0) != 0xF0 ) + { + /* 110aaaaa 10bbbbbb (00000aaaaabbbbbb) */ + if ( (c & 0xE0) == 0xC0 ) + { + nBytes = 2; + c &= 0x1F; /* 00001111; */ + } + /* 1110aaaa 10bbbbbb 10cccccc (aaaabbbbbbcccccc) */ + else if ( (c & 0xF0) == 0xE0 ) + { + nBytes = 3; + c &= 0x0F; /* 00001111; */ + } + 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_UNICODE_CHAR_DEFAULT; + pDestBuf++; + } + pSrcBuf++; + continue; + } + + if ( pSrcBuf+nBytes > pEndSrcBuf ) + { + *pInfo |= RTL_TEXTTOUNICODE_INFO_ERROR | RTL_TEXTTOUNICODE_INFO_SRCBUFFERTOSMALL; + break; + } + + cConv = c; + pSrcBuf++; + if ( (*pSrcBuf & 0xC0) != 0x80 ) + { + *pInfo |= RTL_TEXTTOUNICODE_INFO_INVALID; + if ( (nFlags & RTL_TEXTTOUNICODE_FLAGS_INVALID_MASK) == RTL_TEXTTOUNICODE_FLAGS_INVALID_ERROR ) + { + pSrcBuf--; + *pInfo |= RTL_TEXTTOUNICODE_INFO_ERROR; + break; + } + else if ( (nFlags & RTL_TEXTTOUNICODE_FLAGS_INVALID_MASK) != RTL_TEXTTOUNICODE_FLAGS_INVALID_IGNORE ) + { + *pDestBuf = RTL_UNICODE_CHAR_DEFAULT; + pDestBuf++; + } + continue; + } + else + { + c = (sal_uChar)*pSrcBuf; + cConv <<= 6; + cConv += c & 0x3F; /* 00111111 */ + } + if ( nBytes == 3 ) + { + pSrcBuf++; + if ( (*pSrcBuf & 0xC0) != 0x80 ) + { + *pInfo |= RTL_TEXTTOUNICODE_INFO_INVALID; + if ( (nFlags & RTL_TEXTTOUNICODE_FLAGS_INVALID_MASK) == RTL_TEXTTOUNICODE_FLAGS_INVALID_ERROR ) + { + pSrcBuf -= 2; + *pInfo |= RTL_TEXTTOUNICODE_INFO_ERROR; + break; + } + else if ( (nFlags & RTL_TEXTTOUNICODE_FLAGS_INVALID_MASK) != RTL_TEXTTOUNICODE_FLAGS_INVALID_IGNORE ) + { + *pDestBuf = RTL_UNICODE_CHAR_DEFAULT; + pDestBuf++; + } + continue; + } + else + { + c = (sal_uChar)*pSrcBuf; + cConv <<= 6; + cConv += c & 0x3F; /* 00111111 */ + } + } + *pDestBuf = (sal_Unicode)cConv; + pDestBuf++; + pSrcBuf++; + } + /* 4-6 Bytes */ + else + { + /* convert to ucs4 */ + nBytes = nExtraBytesFromUTF8Tab[c & 0x0F]; + if ( !nBytes ) + { + *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_UNICODE_CHAR_DEFAULT; + pDestBuf++; + } + pSrcBuf++; + continue; + } + else if ( pSrcBuf+nBytes+1 > pEndSrcBuf ) + { + *pInfo |= RTL_TEXTTOUNICODE_INFO_ERROR | RTL_TEXTTOUNICODE_INFO_SRCBUFFERTOSMALL; + break; + } + + cConv = c & nFirstByteMaskTab[nBytes-3]; + nTempBytes = nBytes; + do + { + pSrcBuf++; + if ( (*pSrcBuf & 0xC0) != 0x80 ) + break; + c = (sal_uChar)*pSrcBuf; + cConv <<= 6; + cConv += c & 0x3F; /* 00111111 */ + nTempBytes--; + } + while ( nTempBytes ); + if ( nTempBytes ) + { + *pInfo |= RTL_TEXTTOUNICODE_INFO_INVALID; + if ( (nFlags & RTL_TEXTTOUNICODE_FLAGS_INVALID_MASK) == RTL_TEXTTOUNICODE_FLAGS_INVALID_ERROR ) + { + pSrcBuf -= nBytes-nTempBytes+1; + *pInfo |= RTL_TEXTTOUNICODE_INFO_ERROR; + break; + } + else if ( (nFlags & RTL_TEXTTOUNICODE_FLAGS_INVALID_MASK) != RTL_TEXTTOUNICODE_FLAGS_INVALID_IGNORE ) + { + *pDestBuf = RTL_UNICODE_CHAR_DEFAULT; + pDestBuf++; + } + pSrcBuf++; + continue; + } + else + { + pSrcBuf++; + if ( cConv > TEXTCVT_MAX_UNICHAR ) + { + *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 ) + { + *pDestBuf = RTL_UNICODE_CHAR_DEFAULT; + pDestBuf++; + } + } + else if ( pDestBuf+2 > pEndDestBuf ) + { + *pInfo |= RTL_TEXTTOUNICODE_INFO_ERROR | RTL_TEXTTOUNICODE_INFO_DESTBUFFERTOSMALL; + break; + } + else + { + cConv -= RTL_UNICODE_SURROGATES_HALFBASE; + *pDestBuf = ((sal_Unicode)(cConv >> RTL_UNICODE_SURROGATES_HALFSHIFT)) + RTL_UNICODE_START_HIGH_SURROGATES; + pDestBuf++; + *pDestBuf = ((sal_Unicode)(cConv & RTL_UNICODE_SURROGATES_HALFMASK)) + RTL_UNICODE_START_LOW_SURROGATES; + pDestBuf++; + } + } + } + } + + *pSrcCvtBytes = nSrcBytes - (pEndSrcBuf-pSrcBuf); + return (nDestChars - (pEndDestBuf-pDestBuf)); +} + +/* ----------------------------------------------------------------------- */ + +sal_Size ImplUnicodeToUTF8( 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 ) +{ + static sal_uInt8 const nFirstByteMarkTab[6] = + { + 0x00, 0xC0, 0xE0, 0xF0, 0xF8, 0xFC + }; + + sal_Unicode c; + sal_Unicode c2; + sal_uInt32 nUCS4Char; + sal_uInt8 nBytes; + sal_Char* pTempDestBuf; + sal_Char* pEndDestBuf; + const sal_Unicode* pEndSrcBuf; + + *pInfo = 0; + pEndDestBuf = pDestBuf+nDestBytes; + pEndSrcBuf = pSrcBuf+nSrcChars; + while ( pSrcBuf < pEndSrcBuf ) + { + c = *pSrcBuf; + if ( c < 0x80 ) + { + if ( pDestBuf == pEndDestBuf ) + { + *pInfo |= RTL_UNICODETOTEXT_INFO_ERROR | RTL_UNICODETOTEXT_INFO_DESTBUFFERTOSMALL; + break; + } + + *pDestBuf = (sal_Char)(sal_uChar)c; + pDestBuf++; + pSrcBuf++; + } + else + { + nUCS4Char = c; + if ( nUCS4Char < 0x800 ) + nBytes = 2; + else + { + if ( (c >= RTL_UNICODE_START_HIGH_SURROGATES) && + (c <= RTL_UNICODE_END_HIGH_SURROGATES) ) + { + if ( pSrcBuf == pEndSrcBuf ) + { + *pInfo |= RTL_UNICODETOTEXT_INFO_ERROR | RTL_UNICODETOTEXT_INFO_SRCBUFFERTOSMALL; + break; + } + + c2 = *(pSrcBuf+1); + if ( (c2 >= RTL_UNICODE_START_LOW_SURROGATES) && + (c2 <= RTL_UNICODE_END_LOW_SURROGATES) ) + { + nUCS4Char = (c-RTL_UNICODE_START_HIGH_SURROGATES); + nUCS4Char <<= RTL_UNICODE_SURROGATES_HALFSHIFT; + nUCS4Char += (c2-RTL_UNICODE_START_LOW_SURROGATES) + RTL_UNICODE_SURROGATES_HALFBASE; + pSrcBuf++; + } + else + { + *pInfo |= RTL_UNICODETOTEXT_INFO_INVALID; + if ( (nFlags & RTL_UNICODETOTEXT_FLAGS_INVALID_MASK) == RTL_UNICODETOTEXT_FLAGS_INVALID_ERROR ) + { + *pInfo |= RTL_UNICODETOTEXT_INFO_ERROR; + break; + } + else if ( (nFlags & RTL_UNICODETOTEXT_FLAGS_INVALID_MASK) == RTL_UNICODETOTEXT_FLAGS_INVALID_IGNORE ) + { + pSrcBuf++; + continue; + } + /* in UTF8 we save the original code. I think */ + /* this is better than the default char, */ + /* because it is a unicode format. */ + } + } + + if ( nUCS4Char < 0x10000 ) + nBytes = 3; + else if ( nUCS4Char < 0x200000 ) + nBytes = 4; + else if ( nUCS4Char < 0x4000000 ) + nBytes = 5; + else + nBytes = 6; + } + + if ( pDestBuf+nBytes > pEndDestBuf ) + { + *pInfo |= RTL_UNICODETOTEXT_INFO_ERROR | RTL_UNICODETOTEXT_INFO_DESTBUFFERTOSMALL; + break; + } + pDestBuf += nBytes; + pTempDestBuf = pDestBuf; + switch ( nBytes ) /* no breaks, only jump table */ + { + case 6: pTempDestBuf--; *pTempDestBuf = (sal_Char)((((sal_uChar)nUCS4Char) | 0x80) & 0xBF); nUCS4Char >>= 6; + case 5: pTempDestBuf--; *pTempDestBuf = (sal_Char)((((sal_uChar)nUCS4Char) | 0x80) & 0xBF); nUCS4Char >>= 6; + case 4: pTempDestBuf--; *pTempDestBuf = (sal_Char)((((sal_uChar)nUCS4Char) | 0x80) & 0xBF); nUCS4Char >>= 6; + case 3: pTempDestBuf--; *pTempDestBuf = (sal_Char)((((sal_uChar)nUCS4Char) | 0x80) & 0xBF); nUCS4Char >>= 6; + case 2: pTempDestBuf--; *pTempDestBuf = (sal_Char)((((sal_uChar)nUCS4Char) | 0x80) & 0xBF); nUCS4Char >>= 6; + }; + pTempDestBuf--; + *pTempDestBuf = (sal_Char)(((sal_uChar)nUCS4Char) | nFirstByteMarkTab[nBytes-1]); + pSrcBuf++; + } + } + + *pSrcCvtChars = nSrcChars - (pEndSrcBuf-pSrcBuf); + return (nDestBytes - (pEndDestBuf-pDestBuf)); +} diff --git a/sal/textenc/tenchelp.c b/sal/textenc/tenchelp.c new file mode 100644 index 000000000000..1f00ccb9192c --- /dev/null +++ b/sal/textenc/tenchelp.c @@ -0,0 +1,732 @@ +/************************************************************************* + * + * $RCSfile: tenchelp.c,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:17:30 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +#define _RTL_TENCHELP_C + +#include + +#ifndef _RTL_MEMORY_H +#include +#endif +#ifndef _RTL_TENCHELP_H +#include +#endif +#ifndef _RTL_TEXTCVT_H +#include +#endif + +/* ======================================================================= */ + +sal_Unicode ImplGetUndefinedUnicodeChar( sal_uChar c, sal_uInt32 nFlags, const ImplTextConverterData* pData ) +{ + sal_Unicode nUniChar; + + nFlags &= RTL_TEXTTOUNICODE_FLAGS_UNDEFINED_MASK; + if ( nFlags == RTL_TEXTTOUNICODE_FLAGS_UNDEFINED_MAPTOPRIVATE ) + nUniChar = 0xF100+c; + else + { + if ( pData ) + nUniChar = pData->mcUnicodeDefChar; + else + nUniChar = RTL_UNICODE_CHAR_DEFAULT; + } + + return nUniChar; +} + +/* ----------------------------------------------------------------------- */ + +sal_Size ImplGetUndefinedAsciiMultiByte( sal_uInt32 nFlags, const ImplTextConverterData* pData, sal_Char* pBuf, sal_Size nMaxLen ) +{ + sal_Size nLen = 0; + + if ( nMaxLen ) + { + switch ( nFlags & RTL_UNICODETOTEXT_FLAGS_UNDEFINED_MASK ) + { + case RTL_UNICODETOTEXT_FLAGS_UNDEFINED_0: + nLen = 1; + *pBuf = (sal_Char)0x00; + break; + case RTL_UNICODETOTEXT_FLAGS_UNDEFINED_QUESTIONMARK: + nLen = 1; + *pBuf = (sal_Char)0x3F; + break; + case RTL_UNICODETOTEXT_FLAGS_UNDEFINED_UNDERLINE: + nLen = 1; + *pBuf = (sal_Char)0x5F; + break; + default: /* RTL_UNICODETOTEXT_FLAGS_UNDEFINED_DEFAULT */ + if ( pData && pData->mpTextDefChar ) + { + nLen = strlen( pData->mpTextDefChar ); + if ( nLen < nMaxLen ) + rtl_copyMemory( pBuf, pData->mpTextDefChar, nLen ); + else + nLen = 0; + } + else + { + nLen = 1; + *pBuf = (sal_Char)0x3F; + } + break; + } + } + + return nLen; +} + +/* ----------------------------------------------------------------------- */ + +sal_Size ImplGetInvalidAsciiMultiByte( sal_uInt32 nFlags, const ImplTextConverterData* pData, sal_Char* pBuf, sal_Size nMaxLen ) +{ + sal_Size nLen = 0; + + if ( nMaxLen ) + { + switch ( nFlags & RTL_UNICODETOTEXT_FLAGS_UNDEFINED_MASK ) + { + case RTL_UNICODETOTEXT_FLAGS_INVALID_0: + nLen = 1; + *pBuf = (sal_Char)0x00; + break; + case RTL_UNICODETOTEXT_FLAGS_INVALID_QUESTIONMARK: + nLen = 1; + *pBuf = (sal_Char)0x3F; + break; + case RTL_UNICODETOTEXT_FLAGS_INVALID_UNDERLINE: + nLen = 1; + *pBuf = (sal_Char)0x5F; + break; + default: /* RTL_UNICODETOTEXT_FLAGS_INVALID_DEFAULT */ + if ( pData && pData->mpTextDefChar ) + { + nLen = strlen( pData->mpTextDefChar ); + if ( nLen < nMaxLen ) + rtl_copyMemory( pBuf, pData->mpTextDefChar, nLen ); + else + nLen = 0; + } + else + { + nLen = 1; + *pBuf = (sal_Char)0x3F; + } + break; + } + } + + return nLen; +} + +/* ----------------------------------------------------------------------- */ + +int ImplHandleUndefinedUnicodeToTextChar( const ImplTextConverterData* pData, + const sal_Unicode** ppSrcBuf, const sal_Unicode* pEndSrcBuf, + sal_Char** ppDestBuf, const sal_Char* pEndDestBuf, + sal_uInt32 nFlags, sal_uInt32* pInfo ) +{ + sal_Unicode c = **ppSrcBuf; + + /* 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 IMPL_TEXTCVT_CONTINUE; + } + } + + /* Should this character ignored (Private, Non Spacing, Control) */ + if ( ImplIsUnicodeIgnoreChar( c, nFlags ) ) + { + (*ppSrcBuf)++; + return IMPL_TEXTCVT_CONTINUE; + } + + /* Surrogates Characters should result in */ + /* one replacement character */ + if ( (c >= RTL_UNICODE_START_HIGH_SURROGATES) && + (c <= RTL_UNICODE_END_HIGH_SURROGATES) ) + { + if ( *ppSrcBuf == pEndSrcBuf ) + { + *pInfo |= RTL_UNICODETOTEXT_INFO_ERROR | RTL_UNICODETOTEXT_INFO_SRCBUFFERTOSMALL; + return IMPL_TEXTCVT_BREAK; + } + + c = *((*ppSrcBuf)+1); + if ( (c >= RTL_UNICODE_START_LOW_SURROGATES) && + (c <= RTL_UNICODE_END_LOW_SURROGATES) ) + (*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 IMPL_TEXTCVT_BREAK; + } + else if ( (nFlags & RTL_UNICODETOTEXT_FLAGS_INVALID_MASK) == RTL_UNICODETOTEXT_FLAGS_INVALID_IGNORE ) + { + (*ppSrcBuf)++; + return IMPL_TEXTCVT_CONTINUE; + } + else + { + sal_Size nDefLen = ImplGetInvalidAsciiMultiByte( nFlags, pData, + *ppDestBuf, pEndDestBuf-*ppDestBuf ); + if ( nDefLen ) + { + *ppDestBuf += nDefLen; + (*ppSrcBuf)++; + return IMPL_TEXTCVT_CONTINUE; + } + else + { + *pInfo |= RTL_UNICODETOTEXT_INFO_ERROR | RTL_UNICODETOTEXT_INFO_DESTBUFFERTOSMALL; + return IMPL_TEXTCVT_BREAK; + } + } + } + } + + *pInfo |= RTL_UNICODETOTEXT_INFO_UNDEFINED; + if ( (nFlags & RTL_UNICODETOTEXT_FLAGS_UNDEFINED_MASK) == RTL_UNICODETOTEXT_FLAGS_UNDEFINED_ERROR ) + { + *pInfo |= RTL_UNICODETOTEXT_INFO_ERROR; + return IMPL_TEXTCVT_BREAK; + } + else if ( (nFlags & RTL_UNICODETOTEXT_FLAGS_UNDEFINED_MASK) == RTL_UNICODETOTEXT_FLAGS_UNDEFINED_IGNORE ) + (*ppSrcBuf)++; + else + { + sal_Size nDefLen = ImplGetUndefinedAsciiMultiByte( nFlags, pData, + *ppDestBuf, pEndDestBuf-*ppDestBuf ); + if ( nDefLen ) + { + *ppDestBuf += nDefLen; + (*ppSrcBuf)++; + } + else + { + *pInfo |= RTL_UNICODETOTEXT_INFO_ERROR | RTL_UNICODETOTEXT_INFO_DESTBUFFERTOSMALL; + return IMPL_TEXTCVT_BREAK; + } + } + + return IMPL_TEXTCVT_CONTINUE; +} + +/* ----------------------------------------------------------------------- */ + +int ImplIsUnicodeIgnoreChar( sal_Unicode c, sal_uInt32 nFlags ) +{ + if ( nFlags & RTL_UNICODETOTEXT_FLAGS_NONSPACING_IGNORE ) + { + /* !!! */ + } + + if ( nFlags & RTL_UNICODETOTEXT_FLAGS_CONTROL_IGNORE ) + { + /* !!! */ + } + + if ( nFlags & RTL_UNICODETOTEXT_FLAGS_PRIVATE_IGNORE ) + { + if ( (c >= 0xE000) && (c <= 0xF8FF) ) + return sal_True; + } + + return sal_False; +} + +/* ----------------------------------------------------------------------- */ + +typedef struct _ImplReplaceCharData +{ + 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 _ImplReplaceCharStrData +{ + 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; +} diff --git a/sal/textenc/tenchelp.h b/sal/textenc/tenchelp.h new file mode 100644 index 000000000000..1f6654c58fbd --- /dev/null +++ b/sal/textenc/tenchelp.h @@ -0,0 +1,366 @@ +/************************************************************************* + * + * $RCSfile: tenchelp.h,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:17:30 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +#ifndef _RTL_TENCHELP_H +#define _RTL_TENCHELP_H + +#ifndef _RTL_TEXTENC_H +#include +#endif +#ifndef _RTL_TENCINFO_H +#include +#endif + +/* -------- */ +/* - Help - */ +/* -------- */ + +#ifndef NULL +#define NULL ((void*)0 +#endif + +#define RTL_UNICODE_START_HIGH_SURROGATES 0xD800 +#define RTL_UNICODE_END_HIGH_SURROGATES 0xDBFF +#define RTL_UNICODE_START_LOW_SURROGATES 0xDC00 +#define RTL_UNICODE_END_LOW_SURROGATES 0xDFFF + +#define RTL_UNICODE_SURROGATES_HALFMASK 0x03FFUL +#define RTL_UNICODE_SURROGATES_HALFBASE 0x0010000UL +#define RTL_UNICODE_SURROGATES_HALFSHIFT 10 + +#define RTL_UNICODE_CHAR_DEFAULT 0xFFFD + +#define RTL_TEXTCVT_BYTE_PRIVATE_START 0xF100 +#define RTL_TEXTCVT_BYTE_PRIVATE_END 0xF1FF + +/* ----------------- */ +/* - TextConverter - */ +/* ----------------- */ + +typedef struct _ImplTextConverterData +{ + const void* mpConvertTables; + sal_Char* mpTextDefChar; + sal_Unicode mcUnicodeDefChar; +} ImplTextConverterData; + +typedef sal_Size (*ImplConvertToUnicodeProc)( 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 ); +typedef sal_Size (*ImplConvertToTextProc)( 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 ); +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 _ImplTextConverter +{ + const ImplTextConverterData* mpConvertData; + ImplConvertToUnicodeProc mpConvertTextToUnicodeProc; + ImplConvertToTextProc mpConvertUnicodeToTextProc; + ImplCreateTextContextProc mpCreateTextToUnicodeContext; + ImplDestroyTextContextProc mpDestroyTextToUnicodeContext; + ImplResetTextContextProc mpResetTextToUnicodeContext; + ImplCreateUnicodeContextProc mpCreateUnicodeToTextContext; + ImplDestroyUnicodeContextProc mpDestroyUnicodeToTextContext; + ImplResetUnicodeContextProc mpResetUnicodeToTextContext; +} ImplTextConverter; + +#define RTL_TEXTTOUNICODECONTEXT_NOTUSED ((rtl_TextToUnicodeContext)1) +#define RTL_UNICODETOTEXTCONTEXT_NOTUSED ((rtl_UnicodeToTextContext)1) + +/* ---------------------------- */ +/* - TextEncoding - InfoFlags - */ +/* ---------------------------- */ + +#define RTL_TEXTENCODING_INFO_WIN ((sal_uInt32)0x0100) +#define RTL_TEXTENCODING_INFO_DOS_OS2 ((sal_uInt32)0x0200) +#define RTL_TEXTENCODING_INFO_MAC ((sal_uInt32)0x0400) + +/* ----------------------------- */ +/* - TextEncoding - Structures - */ +/* ----------------------------- */ + +typedef struct _ImplTextEncodingData +{ + const ImplTextConverter* mpConverter; + rtl_TextEncoding meTextEncoding; + sal_uInt8 mnMinCharSize; + sal_uInt8 mnMaxCharSize; + sal_uInt8 mnAveCharSize; + sal_uInt8 mnBestWindowsCharset; + sal_uInt32 mnBestPCCodePage; + sal_uInt32 mnBestMacTextEncoding; + const sal_Char* mpBestUnixCharset; + const sal_Char* mpBestMimeCharset; + sal_uInt32 mnInfoFlags; + rtl_Script mnScript; +} ImplTextEncodingData; + + +/* ----------------------------------- */ +/* - TextConverter - Byte-Structures - */ +/* ----------------------------------- */ + +typedef struct _ImplUniCharTabData +{ + sal_uInt16 mnUniChar; + sal_uChar mnChar; +} ImplUniCharTabData; + +typedef struct _ImplByteConvertData +{ + 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 _ImplDBCSEUCData +{ + 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; +} ImplDBCSEUCData; + +typedef struct _ImplDBCSToUniLeadTab +{ + sal_uInt16 mnUniChar; + sal_uInt8 mnTrailStart; + sal_uInt8 mnTrailEnd; + const sal_uInt16* mpToUniTrailTab; +} ImplDBCSToUniLeadTab; + +typedef struct _ImplUniToDBCSHighTab +{ + sal_uInt8 mnLowStart; + sal_uInt8 mnLowEnd; + const sal_uInt16* mpToUniTrailTab; +} ImplUniToDBCSHighTab; + +typedef struct _ImplDBCSConvertData +{ + const ImplDBCSToUniLeadTab* mpToUniLeadTab; + const ImplUniToDBCSHighTab* mpToDBCSHighTab; + sal_uChar mnTrailStart; + sal_uChar mnTrailEnd; + const ImplDBCSEUCData* mpEUCTab; + sal_uInt16 mnEUCCount; +} ImplDBCSConvertData; + +/* ---------------------------------- */ +/* - TextConverter - EUC-Structures - */ +/* ---------------------------------- */ + +typedef struct _ImplEUCJPConvertData +{ + const ImplDBCSToUniLeadTab* mpJIS0208ToUniLeadTab; + const ImplDBCSToUniLeadTab* mpJIS0212ToUniLeadTab; + const ImplUniToDBCSHighTab* mpUniToJIS0208HighTab; + const ImplUniToDBCSHighTab* mpUniToJIS0212HighTab; +} ImplEUCJPConvertData; + +/* -------------------------------------- */ +/* - TextConverter - ISO2022-Structures - */ +/* -------------------------------------- */ + +/* ---------------------------- */ +/* - TextEncoding - Functions - */ +/* ---------------------------- */ + +const ImplTextEncodingData* Impl_getTextEncodingData( rtl_TextEncoding eTextEncoding ); + +/* --------------------------------- */ +/* - TextConverter - HelpFunctions - */ +/* --------------------------------- */ + +sal_Unicode ImplGetUndefinedUnicodeChar( sal_uChar c, sal_uInt32 nFlags, const ImplTextConverterData* pData ); +sal_Size ImplGetUndefinedAsciiMultiByte( sal_uInt32 nFlags, const ImplTextConverterData* pData, sal_Char* pBuf, sal_Size nMaxLen ); +sal_Size ImplGetInvalidAsciiMultiByte( sal_uInt32 nFlags, const ImplTextConverterData* pData, sal_Char* pBuf, sal_Size nMaxLen ); + +#define IMPL_TEXTCVT_BREAK 1 +#define IMPL_TEXTCVT_CONTINUE 2 +int ImplHandleUndefinedUnicodeToTextChar( const ImplTextConverterData* pData, + const sal_Unicode** ppSrcBuf, const sal_Unicode* pEndSrcBuf, + sal_Char** ppDestBuf, const sal_Char* pEndDestBuf, + sal_uInt32 nFlags, sal_uInt32* pInfo ); + +int ImplIsUnicodeIgnoreChar( sal_Unicode c, sal_uInt32 nFlags ); + +/* ----------------------------- */ +/* - 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 ); +sal_Size ImplUTF8ToUnicode( 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 ImplUnicodeToUTF8( 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 ); + +/* !!! Not finished, because should be merged with DBCS function !!! */ +sal_Size ImplUnicodeToJISX0208( 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 ); + +/* ------------------------------------ */ +/* - TextConverter - ReplaceFunctions - */ +/* ------------------------------------ */ + +#define IMPL_MAX_REPLACECHAR 5 +sal_uInt16 ImplGetReplaceChar( sal_Unicode c ); +const sal_uInt16* ImplGetReplaceString( sal_Unicode c ); + +#endif /* _RTL_CCVTHELP_HXX */ diff --git a/sal/textenc/tencinfo.c b/sal/textenc/tencinfo.c new file mode 100644 index 000000000000..a2c25136d638 --- /dev/null +++ b/sal/textenc/tencinfo.c @@ -0,0 +1,972 @@ +/************************************************************************* + * + * $RCSfile: tencinfo.c,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:17:30 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +#define _RTL_TENCINFO_C + +#include + +#ifndef _RTL_ALLOC_H +#include +#endif +#ifndef _RTL_TENCINFO_H +#include +#endif +#ifndef _RTL_TENCHELP_H +#include +#endif + +/* ======================================================================= */ + +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 _ImplStrCharsetDef +{ + const sal_Char* mpCharsetStr; + rtl_TextEncoding meTextEncoding; +} ImplStrCharsetDef; + +typedef struct _ImplStrFirstPartCharsetDef +{ + 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; + + if ( pEncInfo->StructSize < 14 ) + return sal_True; + pEncInfo->Script = SCRIPT_DONTKNOW; + 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; + + if ( pEncInfo->StructSize < 14 ) + return sal_True; + pEncInfo->Script = pData->mnScript; + + 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: eCharset = 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; +} + +/* ----------------------------------------------------------------------- */ + +rtl_TextEncoding SAL_CALL rtl_getTextEncodingFromPCCodePage( sal_uInt32 nCodePage ) +{ + rtl_TextEncoding eTextEncoding; + + switch ( nCodePage ) + { + case 437: eTextEncoding = RTL_TEXTENCODING_IBM_437; break; + case 850: eTextEncoding = RTL_TEXTENCODING_IBM_850; break; + case 860: eTextEncoding = RTL_TEXTENCODING_IBM_860; break; + case 861: eTextEncoding = RTL_TEXTENCODING_IBM_861; break; + case 863: eTextEncoding = RTL_TEXTENCODING_IBM_863; break; + case 865: eTextEncoding = RTL_TEXTENCODING_IBM_865; break; + case 737: eTextEncoding = RTL_TEXTENCODING_IBM_737; break; + case 775: eTextEncoding = RTL_TEXTENCODING_IBM_775; break; + case 852: eTextEncoding = RTL_TEXTENCODING_IBM_852; break; + case 855: eTextEncoding = RTL_TEXTENCODING_IBM_855; break; + case 857: eTextEncoding = RTL_TEXTENCODING_IBM_857; break; + case 862: eTextEncoding = RTL_TEXTENCODING_IBM_862; break; + case 864: eTextEncoding = RTL_TEXTENCODING_IBM_864; break; + case 866: eTextEncoding = RTL_TEXTENCODING_IBM_866; break; + case 869: eTextEncoding = RTL_TEXTENCODING_IBM_869; break; + case 874: eTextEncoding = RTL_TEXTENCODING_MS_874; break; + case 932: eTextEncoding = RTL_TEXTENCODING_MS_932; break; + case 949: eTextEncoding = RTL_TEXTENCODING_MS_949; break; + case 950: eTextEncoding = RTL_TEXTENCODING_MS_950; break; + case 1004: eTextEncoding = RTL_TEXTENCODING_MS_1252; break; + case 65400: eTextEncoding = RTL_TEXTENCODING_SYMBOL; break; + default: eTextEncoding = RTL_TEXTENCODING_DONTKNOW; break; + }; + + return eTextEncoding; +} + +/* ----------------------------------------------------------------------- */ + +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 */ + /* !!! KSC_5601_87 = 0x640 */ /* same as KSC 5601-92 without Johab annex */ + /* !!! KSC_5601_92_Johab = 0x641 */ /* 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 */ + /* !!! EUC_KR = 0x940 */ /* 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; +} + +/* ----------------------------------------------------------------------- */ + +rtl_TextEncoding SAL_CALL rtl_getTextEncodingFromUnixCharset( const sal_Char* pUnixCharset ) +{ + /* 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 }, + { "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 }, + { "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 }, + { 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 }, + { 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 aUnixCharsetBIG5Tab[] = + { + { NULL, RTL_TEXTENCODING_BIG5 } + }; + + 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 } + }; + + static ImplStrFirstPartCharsetDef const aUnixCharsetFirstPartTab[] = + { + { "iso8859", aUnixCharsetISOTab }, + { "adobe", aUnixCharsetADOBETab }, + { "ansi", aUnixCharsetMSTab }, + { "microsoft", aUnixCharsetMSTab }, + { "ibm", aUnixCharsetIBMTab }, + { "koi8", aUnixCharsetKOI8Tab }, + { "jisx0208", aUnixCharsetJISX0208Tab }, + { "jisx0201", aUnixCharsetJISX0201Tab }, + { "jisx0212", aUnixCharsetJISX0212Tab }, + { "gb2312", aUnixCharsetGBTab }, + { "big5", aUnixCharsetBIG5Tab }, + { "iso10646", aUnixCharsetISO10646Tab }, + { "unicode", aUnixCharsetUNICODETab }, + { "sunolcursor", aUnixCharsetSymbolTab }, + { "sunolglyph", aUnixCharsetSymbolTab }, +/* { "ksc5601.1992", }, */ +/* { "tis620.2553", }, */ +/* { "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 }, + { "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 }, + { "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 }, + { "ascii", RTL_TEXTENCODING_ASCII_US }, + { "us", RTL_TEXTENCODING_ASCII_US }, + { 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; +} + +/* ----------------------------------------------------------------------- */ + +sal_uInt32 SAL_CALL rtl_getBestPCCodePageFromTextEncoding( rtl_TextEncoding eTextEncoding ) +{ + const ImplTextEncodingData* pData = Impl_getTextEncodingData( eTextEncoding ); + if ( pData ) + return pData->mnBestPCCodePage; + else + return 0; +} + +/* ----------------------------------------------------------------------- */ + +sal_uInt32 SAL_CALL rtl_getBestMacTextEncodingFromTextEncoding( rtl_TextEncoding eTextEncoding ) +{ + const ImplTextEncodingData* pData = Impl_getTextEncodingData( eTextEncoding ); + if ( pData ) + return pData->mnBestMacTextEncoding; + else + return 0xFFFFFFFF; +} + +/* ----------------------------------------------------------------------- */ + +const sal_Char* SAL_CALL rtl_getBestUnixCharsetFromTextEncoding( rtl_TextEncoding eTextEncoding ) +{ + const ImplTextEncodingData* pData = Impl_getTextEncodingData( eTextEncoding ); + if ( pData ) + return pData->mpBestUnixCharset; + else + return 0; +} + +/* ----------------------------------------------------------------------- */ + +const sal_Char* SAL_CALL rtl_getBestMimeCharsetFromTextEncoding( rtl_TextEncoding eTextEncoding ) +{ + const ImplTextEncodingData* pData = Impl_getTextEncodingData( eTextEncoding ); + if ( pData ) + return pData->mpBestMimeCharset; + else + return 0; +} diff --git a/sal/textenc/textcvt.c b/sal/textenc/textcvt.c new file mode 100644 index 000000000000..20780f7188e4 --- /dev/null +++ b/sal/textenc/textcvt.c @@ -0,0 +1,301 @@ +/************************************************************************* + * + * $RCSfile: textcvt.c,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:17:30 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +#define _RTL_TEXTCVT_C + +#ifndef _RTL_TENCHELP_H +#include +#endif +#ifndef _RTL_TEXTCVT_H +#include +#endif + +/* ======================================================================= */ + +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->mpConverter; + else + return 0; +} + +/* ----------------------------------------------------------------------- */ + +void SAL_CALL rtl_destroyTextToUnicodeConverter( rtl_TextToUnicodeConverter hContext ) +{ +} + +/* ----------------------------------------------------------------------- */ + +rtl_TextToUnicodeContext SAL_CALL rtl_createTextToUnicodeContext( rtl_TextToUnicodeConverter hConverter ) +{ + const ImplTextConverter* pConverter = (const ImplTextConverter*)hConverter; + if ( !pConverter ) + return 0; + if ( pConverter->mpCreateTextToUnicodeContext ) + return (rtl_TextToUnicodeContext)pConverter->mpCreateTextToUnicodeContext(); + else + return RTL_TEXTTOUNICODECONTEXT_NOTUSED; +} + +/* ----------------------------------------------------------------------- */ + +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->mpConverter; + else + return 0; +} + +/* ----------------------------------------------------------------------- */ + +void SAL_CALL rtl_destroyUnicodeToTextConverter( rtl_UnicodeToTextConverter hConverter ) +{ +} + +/* ----------------------------------------------------------------------- */ + +rtl_UnicodeToTextContext SAL_CALL rtl_createUnicodeToTextContext( rtl_UnicodeToTextConverter hConverter ) +{ + const ImplTextConverter* pConverter = (const ImplTextConverter*)hConverter; + if ( !pConverter ) + return 0; + if ( pConverter->mpCreateUnicodeToTextContext ) + return (rtl_UnicodeToTextContext)pConverter->mpCreateUnicodeToTextContext(); + else + return RTL_UNICODETOTEXTCONTEXT_NOTUSED; +} + +/* ----------------------------------------------------------------------- */ + +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/unosdk.mk b/sal/unosdk.mk new file mode 100644 index 000000000000..89ef00871aa2 --- /dev/null +++ b/sal/unosdk.mk @@ -0,0 +1,82 @@ +#************************************************************************* +# +# $RCSfile: unosdk.mk,v $ +# +# $Revision: 1.1.1.1 $ +# +# last change: $Author: hr $ $Date: 2000-09-18 15:17:12 $ +# +# The Contents of this file are made available subject to the terms of +# either of the following licenses +# +# - GNU Lesser General Public License Version 2.1 +# - Sun Industry Standards Source License Version 1.1 +# +# Sun Microsystems Inc., October, 2000 +# +# GNU Lesser General Public License Version 2.1 +# ============================================= +# Copyright 2000 by Sun Microsystems, Inc. +# 901 San Antonio Road, Palo Alto, CA 94303, USA +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License version 2.1, as published by the Free Software Foundation. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, +# MA 02111-1307 USA +# +# +# Sun Industry Standards Source License Version 1.1 +# ================================================= +# The contents of this file are subject to the Sun Industry Standards +# Source License Version 1.1 (the "License"); You may not use this file +# except in compliance with the License. You may obtain a copy of the +# License at http://www.openoffice.org/license.html. +# +# Software provided under this License is provided on an "AS IS" basis, +# WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, +# WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, +# MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. +# See the License for the specific provisions governing your rights and +# obligations concerning the Software. +# +# The Initial Developer of the Original Code is: Sun Microsystems, Inc. +# +# Copyright: 2000 by Sun Microsystems, Inc. +# +# All Rights Reserved. +# +# Contributor(s): _______________________________________ +# +# +# +#************************************************************************* + +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..cf2cafc6520e --- /dev/null +++ b/sal/util/makefile.mk @@ -0,0 +1,229 @@ +#************************************************************************* +# +# $RCSfile: makefile.mk,v $ +# +# $Revision: 1.1.1.1 $ +# +# last change: $Author: hr $ $Date: 2000-09-18 15:17:30 $ +# +# The Contents of this file are made available subject to the terms of +# either of the following licenses +# +# - GNU Lesser General Public License Version 2.1 +# - Sun Industry Standards Source License Version 1.1 +# +# Sun Microsystems Inc., October, 2000 +# +# GNU Lesser General Public License Version 2.1 +# ============================================= +# Copyright 2000 by Sun Microsystems, Inc. +# 901 San Antonio Road, Palo Alto, CA 94303, USA +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License version 2.1, as published by the Free Software Foundation. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, +# MA 02111-1307 USA +# +# +# Sun Industry Standards Source License Version 1.1 +# ================================================= +# The contents of this file are subject to the Sun Industry Standards +# Source License Version 1.1 (the "License"); You may not use this file +# except in compliance with the License. You may obtain a copy of the +# License at http://www.openoffice.org/license.html. +# +# Software provided under this License is provided on an "AS IS" basis, +# WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, +# WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, +# MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. +# See the License for the specific provisions governing your rights and +# obligations concerning the Software. +# +# The Initial Developer of the Original Code is: Sun Microsystems, Inc. +# +# Copyright: 2000 by Sun Microsystems, Inc. +# +# All Rights Reserved. +# +# Contributor(s): _______________________________________ +# +# +# +#************************************************************************* + +PRJ=.. + +$(PRJPCH)= + +PRJNAME=sal +TARGET=sal +USE_LDUMP2=TRUE + +.IF "$(GUI)"!="OS2" +USE_DEFFILE=TRUE +.ENDIF + +# --- Settings ----------------------------------------------------- + +.INCLUDE : svpre.mk +.INCLUDE : settings.mk +.INCLUDE : sv.mk +.INCLUDE : ..$/version.mk + +.IF "$(depend)" == "" +# --- Files -------------------------------------------------------- + +.IF "$(header)" == "" +LIB1TARGET=$(SLB)$/$(TARGET).lib +LIB1FILES=$(SLB)$/cpposl.lib $(SLB)$/oslall.lib $(SLB)$/cpprtl.lib +.IF "$(GUI)"=="WIN" +LIB1FILES+=$(SLB)$/shell9x.lib $(SLB)$/kernel9x.lib $(SLB)$/user9x.lib $(SLB)$/comdlg9x.lib $(SLB)$/tools32.lib +.ELSE +LIB1FILES+=$(SLB)$/textenc.lib +.ENDIF + +LIB3TARGET=$(LB)$/a$(TARGET).lib +LIB3ARCHIV=$(LB)$/lib$(TARGET)$(SAL_MAJOR)$(DLLPOSTFIX).a +LIB3FILES=$(LB)$/cpposl.lib $(LB)$/oslall.lib $(LB)$/cpprtl.lib + +.IF "$(UPDATER)"!="" +.IF "$(GUI)"!="WIN" +LIB3FILES+=$(LB)$/textenc.lib +.ENDIF +.ENDIF + +SHL1TARGET= $(SAL_TARGET)$(SAL_MAJOR) +SHL1IMPLIB= i$(TARGET) + +.IF "$(GUI)"=="WNT" +.IF "$(COM)"!="GCC" +SHL1STDLIBS= \ + advapi32.lib\ + advapi9x.lib\ + kernel9x.lib\ + shell9x.lib\ + user9x.lib\ + comdlg9x.lib\ + wsock32.lib\ + mpr.lib\ + ole32.lib\ + shell32.lib\ + tools32.lib\ + comdlg32.lib\ + user32.lib +.ELSE +SHL1STDLIBS= -ladvapi32 -lwsock32 -lmpr -lole32 +.ENDIF +.ENDIF + +.IF "$(GUI)"=="WIN" +SHL1STDLIBS= winsock.lib +.ENDIF + + + +.IF "$(GUI)"=="MAC" +SHL1STDLIBS=-L$(shell $(UNIX2MACPATH) $(MW_HOME)$/Metrowerks\ CodeWarrior$/MacOS\ Support$/OpenTransport$/Open\ Tpt\ Client\ Developer$/PPC\ Libraries) \ + -weakimport -lOpenTransportLib -weakimport -lOpenTptInternetLib \ + -lOpenTransportExtnPPC.o -lOpenTptInetPPC.o +SHL1STDLIBS+=-init InitLibrary -term ExitLibrary +.ENDIF + +.IF "$(GUI)"=="UNX" +.IF "$(OS)"=="SOLARIS" +SHL1STDLIBS= -lpthread -lposix4 +.IF "$(COM)" == "C50" +SHL1STDLIBS+= -z allextract -staticlib=Crun -z defaultextract +.ENDIF +.ENDIF +.ENDIF + +.IF "$(GUI)"=="OS2" +SHL1STDLIBS=n:\toolkit4\lib\so32dll.lib\ + n:\toolkit4\lib\tcp32dll.lib\ + os2286.lib + +.ENDIF + +SHL1LIBS= $(SLB)$/$(TARGET).lib + +.IF "$(linkinc)" != "" +SHL11FILE=$(MISC)$/sal.slo +.ELSE +.IF "$(GUI)"=="UNX" +SHL1OBJS= +.ELSE +.IF "$(GUI)"=="MAC" +SHL1OBJS= \ + $(OBJ)$/dllentry.obj +.ELSE +SHL1OBJS= \ + $(SLO)$/dllentry.obj +.ENDIF +.ENDIF +.ENDIF + +SHL1DEPN= +SHL1DEF= $(MISC)$/$(SHL1TARGET).def + +DEF1NAME =$(SHL1TARGET) +.IF "$(GUI)"=="WIN" +DEF1EXPORTFILE= sal.w16 +.ELSE +DEF1EXPORTFILE= sal.dxp +.ENDIF + +.IF "$(GUI)"=="OS2" +DEF1EXPORT1=SignalHandlerFunction +.ENDIF + +# --- tec --- + +#SALLIB= isal.lib + +#.IF "$(GUI)"!="WIN" +#LIB2TARGET= $(SLB)$/tec.lib +#LIB2ARCHIV= $(LB)$/libtec$(UPD)$(DLLPOSTFIX).a +#LIB2FILES= $(SLB)$/textenc.lib + +#.IF "$(UPDATER)"=="YES" +#LIB2TARGET= $(LB)$/atec.lib +#LIB2ARCHIV= $(LB)$/libtec$(UPD)$(DLLPOSTFIX).a +#LIB2FILES= $(LB)$/textenc.lib +#.ENDIF + +#SHL2TARGET= tec$(UPD)$(DLLPOSTFIX) +#SHL2IMPLIB= itec + +#SHL2STDLIBS= $(SALLIB) + +#SHL2LIBS= $(SLB)$/textenc.lib +#.IF "$(linkinc)" != "" +#SHL21FILE= $(MISC)$/tec.slo +#.ENDIF + +#SHL2DEPN= +#SHL2DEF= $(MISC)$/$(SHL2TARGET).def + +#DEF2NAME= $(SHL2TARGET) +#DEF2EXPORTFILE= tec.dxp +#.ENDIF + + +# --- Targets ------------------------------------------------------ + +.ENDIF + +.ENDIF # $(depend)!="" + +.INCLUDE : target.mk + diff --git a/sal/version.mk b/sal/version.mk new file mode 100644 index 000000000000..7b65a9026245 --- /dev/null +++ b/sal/version.mk @@ -0,0 +1,75 @@ +#************************************************************************* +# +# $RCSfile: version.mk,v $ +# +# $Revision: 1.1.1.1 $ +# +# last change: $Author: hr $ $Date: 2000-09-18 15:17:12 $ +# +# The Contents of this file are made available subject to the terms of +# either of the following licenses +# +# - GNU Lesser General Public License Version 2.1 +# - Sun Industry Standards Source License Version 1.1 +# +# Sun Microsystems Inc., October, 2000 +# +# GNU Lesser General Public License Version 2.1 +# ============================================= +# Copyright 2000 by Sun Microsystems, Inc. +# 901 San Antonio Road, Palo Alto, CA 94303, USA +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License version 2.1, as published by the Free Software Foundation. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, +# MA 02111-1307 USA +# +# +# Sun Industry Standards Source License Version 1.1 +# ================================================= +# The contents of this file are subject to the Sun Industry Standards +# Source License Version 1.1 (the "License"); You may not use this file +# except in compliance with the License. You may obtain a copy of the +# License at http://www.openoffice.org/license.html. +# +# Software provided under this License is provided on an "AS IS" basis, +# WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, +# WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, +# MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. +# See the License for the specific provisions governing your rights and +# obligations concerning the Software. +# +# The Initial Developer of the Original Code is: Sun Microsystems, Inc. +# +# Copyright: 2000 by Sun Microsystems, Inc. +# +# All Rights Reserved. +# +# Contributor(s): _______________________________________ +# +# +# +#************************************************************************* + +# 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/makefile.mk b/sal/workben/makefile.mk new file mode 100644 index 000000000000..6188ebc9ba4b --- /dev/null +++ b/sal/workben/makefile.mk @@ -0,0 +1,288 @@ +#************************************************************************* +# +# $RCSfile: makefile.mk,v $ +# +# $Revision: 1.1.1.1 $ +# +# last change: $Author: hr $ $Date: 2000-09-18 15:17:30 $ +# +# The Contents of this file are made available subject to the terms of +# either of the following licenses +# +# - GNU Lesser General Public License Version 2.1 +# - Sun Industry Standards Source License Version 1.1 +# +# Sun Microsystems Inc., October, 2000 +# +# GNU Lesser General Public License Version 2.1 +# ============================================= +# Copyright 2000 by Sun Microsystems, Inc. +# 901 San Antonio Road, Palo Alto, CA 94303, USA +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License version 2.1, as published by the Free Software Foundation. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, +# MA 02111-1307 USA +# +# +# Sun Industry Standards Source License Version 1.1 +# ================================================= +# The contents of this file are subject to the Sun Industry Standards +# Source License Version 1.1 (the "License"); You may not use this file +# except in compliance with the License. You may obtain a copy of the +# License at http://www.openoffice.org/license.html. +# +# Software provided under this License is provided on an "AS IS" basis, +# WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, +# WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, +# MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. +# See the License for the specific provisions governing your rights and +# obligations concerning the Software. +# +# The Initial Developer of the Original Code is: Sun Microsystems, Inc. +# +# Copyright: 2000 by Sun Microsystems, Inc. +# +# All Rights Reserved. +# +# Contributor(s): _______________________________________ +# +# +# +#************************************************************************* + +PRJ=.. + +PRJNAME=osl +TARGET=workben +LIBTARGET=NO +TARGETTYPE=CUI + +TESTAPP= + +#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 + +# --- Settings ----------------------------------------------------- + +.INCLUDE : svpre.mk +.INCLUDE : settings.mk +.INCLUDE : sv.mk + +# --- Files -------------------------------------------------------- + +# +# 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= isaltls.lib +.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= isalzip.lib +.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" + +CXXFILES= tgetpwnam.cxx +OBJFILES= $(OBJ)$/tgetpwnam.obj + +APP5TARGET= tgetpwnam +APP5OBJS= $(OBJFILES) +APP5STDLIBS=$(SALLIB) +APP5DEPN= $(SLB)$/sal.lib + +.ENDIF # (sco | netbsd) +.ENDIF # tgetpwname + +# --- Targets ------------------------------------------------------ + +.INCLUDE : target.mk + + diff --git a/sal/workben/t_cipher.c b/sal/workben/t_cipher.c new file mode 100644 index 000000000000..04d23b1bf3ee --- /dev/null +++ b/sal/workben/t_cipher.c @@ -0,0 +1,309 @@ +/************************************************************************* + * + * $RCSfile: t_cipher.c,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:17:30 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ +#include +#include +#include + +#include +#include + +#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 +}; + +int SAL_CALL main (int argc, char *argv) +{ + rtlCipher cipher; + + /* ECB */ + cipher = rtl_cipher_create (rtl_Cipher_AlgorithmBF, rtl_Cipher_ModeECB); + if (cipher) + { + 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); + if (cipher) + { + 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); + if (cipher) + { + 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); + } + + /* Done */ + return 0; +} diff --git a/sal/workben/t_digest.c b/sal/workben/t_digest.c new file mode 100644 index 000000000000..6bf781aa2e2d --- /dev/null +++ b/sal/workben/t_digest.c @@ -0,0 +1,279 @@ +/************************************************************************* + * + * $RCSfile: t_digest.c,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:17:30 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ +#include +#include +#include + +#include + +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 char *pt (unsigned char *md, int length) +{ + int i; + static char buf[80]; + + for (i=0; i +#endif +#ifndef _RTL_ALLOC_H_ +#include +#endif +#ifndef _OSL_DIAGNOSE_H_ +#include +#endif +#ifndef _OSL_INTERLCK_H_ +#include +#endif +#ifndef _OSL_ISOCKET_H_ +#include +#endif + +/*======================================================================== + * + * osl/debug.c + * + *======================================================================*/ +/* + * __osl_debug_create. + */ +static oslSocketResult SAL_CALL __osl_debug_create ( + oslSocketDescriptor *socket, + oslAddrFamily family, + oslSocketType type, + oslProtocol protocol) +{ + oslSocketResult result; + + if (!(socket->m_lower)) + { + oslSocketDescriptor *lower; + lower = osl_socket_createSocketLayer (osl_socket_getSocketMethods()); + osl_socket_pushSocketLayer (socket, lower); + } + + result = (socket->m_lower->m_methods->m_create)( + socket->m_lower, family, type, protocol); + if (!(result == osl_Socket_Ok)) + return (result); + + if (!(socket->m_private)) + { + /* ... */ + } + return (osl_Socket_Ok); +} + +/* + * __osl_debug_delete. + */ +static void SAL_CALL __osl_debug_delete (oslSocketDescriptor *socket) +{ + if (socket->m_private) + { + /* ... */ + } + if (socket->m_lower) + { + (socket->m_lower->m_methods->m_delete)(socket->m_lower); + osl_socket_deleteSocketLayer (socket->m_lower); + } +} + +/* + * __osl_debug_getOption. + */ +static oslSocketResult SAL_CALL __osl_debug_getOption ( + oslSocketDescriptor *socket, + oslSocketOptionLevel level, + oslSocketOption option, + void *buffer, + sal_uInt32 length) +{ + if (level == osl_Socket_LevelSocketLayer) + { + /* ... */ + return (osl_Socket_Ok); + } + + return (socket->m_lower->m_methods->m_getoption)( + socket->m_lower, level, option, buffer, length); +} + +/* + * __osl_debug_setOption. + */ +static oslSocketResult SAL_CALL __osl_debug_setOption ( + oslSocketDescriptor *socket, + oslSocketOptionLevel level, + oslSocketOption option, + const void *buffer, + sal_uInt32 length) +{ + if (level == osl_Socket_LevelSocketLayer) + { + /* ... */ + return (osl_Socket_Ok); + } + + return (socket->m_lower->m_methods->m_setoption)( + socket->m_lower, level, option, buffer, length); +} + +/* + * __osl_debug_accept. + */ +static oslSocketDescriptor* SAL_CALL __osl_debug_accept ( + oslSocketDescriptor *socket, oslSocketAddr *fromaddr) +{ + oslSocketDescriptor *lower; + lower = (socket->m_lower->m_methods->m_accept)(socket->m_lower, fromaddr); + if (lower) + { + oslSocketDescriptor *upper; + upper = osl_socket_createSocketLayer (socket->m_methods); + osl_socket_pushSocketLayer (upper, lower); + return (upper); + } + return ((oslSocketDescriptor*)NULL); +} + +/* + * __osl_debug_connect. + */ +static oslSocketResult SAL_CALL __osl_debug_connect ( + oslSocketDescriptor *socket, oslSocketAddr addr) +{ + return (socket->m_lower->m_methods->m_connect)(socket->m_lower, addr); +} + +/* + * __osl_debug_close. + */ +static void SAL_CALL __osl_debug_close (oslSocketDescriptor *socket) +{ + (socket->m_lower->m_methods->m_close)(socket->m_lower); +} + +/* + * __osl_shutdown. + */ +static void SAL_CALL __osl_debug_shutdown ( + oslSocketDescriptor *socket, oslSocketDirection direction) +{ + (socket->m_lower->m_methods->m_shutdown)(socket->m_lower, direction); +} + +/* + * __osl_debug_methods. + */ +static oslSocketMethods __osl_debug_methods = +{ + NULL /* initialized on demand */ +}; + +/* + * osl_debug_getSocketMethods. + */ +const oslSocketMethods* SAL_CALL osl_debug_getSocketMethods (void) +{ + static oslInterlockedCount nonce = 0; + if (osl_incrementInterlockedCount (&nonce) == 1) + { + const oslSocketMethods *methods = osl_socket_getDefaultSocketMethods(); + __osl_debug_methods = *methods; + + __osl_debug_methods.m_create = __osl_debug_create; + __osl_debug_methods.m_delete = __osl_debug_delete; + + __osl_debug_methods.m_getoption = __osl_debug_getOption; + __osl_debug_methods.m_setoption = __osl_debug_setOption; + + __osl_debug_methods.m_accept = __osl_debug_accept; + __osl_debug_methods.m_connect = __osl_debug_connect; + __osl_debug_methods.m_close = __osl_debug_close; + + __osl_debug_methods.m_shutdown = __osl_debug_shutdown; + + osl_incrementInterlockedCount (&nonce); + } + + osl_decrementInterlockedCount (&nonce); + return (&__osl_debug_methods); +} + +/*======================================================================== + * + * osl/socket.c (physical, bottom layer). + * + *======================================================================*/ +#if 0 /* NYI */ + +static oslSocketResult SAL_CALL __osl_socket_create ( + oslSocketDescriptor *socket, + oslAddrFamily family, + oslSocketType type, + oslProtocol protocol) +{ +#ifdef DEBUG + const oslSocketMethods *debug = osl_debug_getSocketMethods(); + if (!(socket->m_upper || socket->m_upper->m_methods == debug)) + { + oslSocketDescriptor *upper; + + upper = osl_socket_createSocketLayer (debug); + osl_socket_pushSocketLayer (upper, socket); + + return (upper->m_methods->m_create)(upper, family, type, protocol); + } +#endif /* DEBUG */ + if (!(socket->m_private)) + { + /* ... */ + socket->m_private = osl_createSocket (family, type, protocol); + } + return (osl_Socket_Ok); +} + +#endif /* NYI */ + +/*======================================================================== + * + * main. + * + *======================================================================*/ +int SAL_CALL main (int argc, char **argv) +{ + oslSocketDescriptor *socket; + + socket = osl_socket_createSocketLayer (osl_debug_getSocketMethods()); + if (socket) + { + oslSocketDescriptor *connection; + oslSocketResult result; + oslSocketAddr addr, from; + sal_Int32 option = 1; + + result = osl_socket_create ( + socket, + osl_Socket_FamilyInet, + osl_Socket_TypeStream, + osl_Socket_ProtocolIp); + OSL_ASSERT(result == osl_Socket_Ok); + + result = osl_socket_setOption ( + socket, + osl_Socket_LevelSocket, + osl_Socket_OptionReuseAddr, + &option, sizeof(option)); + OSL_ASSERT(result == osl_Socket_Ok); + + addr = osl_createEmptySocketAddr (osl_Socket_FamilyInet); + osl_setInetPortOfSocketAddr (addr, 7777); + + result = osl_socket_bind (socket, addr); + OSL_ASSERT(result == osl_Socket_Ok); + + result = osl_socket_listen (socket, 1); + OSL_ASSERT(result == osl_Socket_Ok); + + connection = osl_socket_accept (socket, &from); + if (connection) + { + sal_Char buffer[1024]; + sal_Int32 k, n = sizeof(buffer); + oslSocketMsgFlag flag = osl_Socket_MsgNormal; + + while ((k = osl_socket_recv (connection, buffer, n, flag)) > 0) + { + if (osl_socket_send (connection, buffer, k, flag) < 0) + break; + } + + osl_socket_close (connection); + osl_socket_delete (connection); + + osl_socket_deleteSocketLayer (connection); + } + + osl_socket_close (socket); + osl_socket_delete (socket); + + osl_socket_deleteSocketLayer (socket); + } + + return 0; +} + diff --git a/sal/workben/t_random.c b/sal/workben/t_random.c new file mode 100644 index 000000000000..d320fc06b367 --- /dev/null +++ b/sal/workben/t_random.c @@ -0,0 +1,99 @@ +/************************************************************************* + * + * $RCSfile: t_random.c,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:17:30 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ +#include +#include +#include + +#include + +static char *pt (unsigned char *md, int length) +{ + int i; + static char buf[80]; + + for (i=0; i +#endif +#ifndef _RTL_ALLOC_H_ +#include +#endif +#ifndef _RTL_USTRING_H_ +#include +#endif + +#ifndef _OSL_DIAGNOSE_H_ +#include +#endif +#ifndef _OSL_FILE_H_ +#include +#endif +#ifndef _OSL_INTERLCK_H_ +#include +#endif +#ifndef _OSL_ISOCKET_H_ +#include +#endif + +#ifndef _OSL_TLS_H_ +#include +#endif + +#include +#include + +/*======================================================================== + * + * Internals. + * + *======================================================================*/ +void SAL_CALL __rtl_sequence_release (sal_Sequence *value) +{ + if (value) + { + if (osl_decrementInterlockedCount (&(value->nRefCount)) == 0) + rtl_freeMemory (value); + } +} + +void SAL_CALL __rtl_sequence_new (sal_Sequence **value, sal_Int32 length) +{ + if (value) + { + __rtl_sequence_release (*value); + + *value = (sal_Sequence*)rtl_allocateMemory ( + SAL_SEQUENCE_HEADER_SIZE + length); + + (*value)->nRefCount = 1; + (*value)->nElements = 0; + } +} + +void load_sequence (sal_Sequence **ppSequence, const sal_Char *name) +{ + oslFileError result; + rtl_uString *pName, *pPath; + + if (ppSequence) + { + __rtl_sequence_release (*ppSequence); + *ppSequence = NULL; + } + + pName = NULL; + rtl_uString_newFromAscii (&pName, name); + + pPath = NULL; + result = osl_searchNormalizedPath (pName, NULL, &pPath); + if (result == osl_File_E_None) + { + oslFileHandle hFile; + + result = osl_openFile (pPath, &hFile, osl_File_OpenFlag_Read); + if (result == osl_File_E_None) + { + sal_uInt64 nSize = 0, nRead = 0; + + osl_setFilePos (hFile, osl_Pos_End, 0); + osl_getFilePos (hFile, &nSize); + osl_setFilePos (hFile, osl_Pos_Absolut, 0); + + __rtl_sequence_new (ppSequence, (sal_Int32)nSize); + + osl_readFile (hFile, (*ppSequence)->elements, nSize, &nRead); + (*ppSequence)->nElements = (sal_Int32)nRead; + } + osl_closeFile (hFile); + + rtl_uString_release (pPath); + } + + rtl_uString_release (pName); +} + +/*======================================================================== + * + * main. + * + *======================================================================*/ +int SAL_CALL main (int argc, char **argv) +{ + static const sal_Char p[] = "GET / HTTP/1.0\015\012\015\012"; + oslSocketDescriptor *socket; + + + socket = osl_socket_createSocketLayer (osl_tls_getSocketMethods()); + if (socket) + { + oslSocketAddr target; + oslSocketResult result; + oslSocketMsgFlag flag = osl_Socket_MsgNormal; + rtl_uString *dotted = NULL; + + + rtl_uString_newFromAscii (&dotted, argv[1]); + target = osl_createInetSocketAddr (dotted, 443); + rtl_uString_release (dotted); + + result = osl_socket_create ( + socket, + osl_Socket_FamilyInet, + osl_Socket_TypeStream, + osl_Socket_ProtocolIp); + OSL_ASSERT(result == osl_Socket_Ok); + + result = osl_socket_connect (socket, target); + osl_destroySocketAddr (target); + OSL_ASSERT(result == osl_Socket_Ok); + + result = osl_socket_connect_handshake (socket, target); + OSL_ASSERT(result == osl_Socket_Ok); + + if (osl_socket_send (socket, p, strlen(p), flag) > 0) + { + sal_Char buffer[1024]; + sal_Int32 k, n = sizeof(buffer); + + while ((k = osl_socket_recv (socket, buffer, n, flag)) > 0) + fwrite (buffer, 1, k, stdout); + } + + osl_socket_shutdown (socket, osl_Socket_DirReadWrite); + osl_socket_close (socket); + + osl_socket_delete (socket); + osl_socket_deleteSocketLayer (socket); + } + + + socket = osl_socket_createSocketLayer (osl_tls_getSocketMethods()); + if (socket) + { + oslSocketDescriptor *connection; + oslSocketResult result; + oslSocketAddr addr, from; + sal_Int32 option = 1; + sal_Sequence *data = NULL; + + + result = osl_socket_create ( + socket, + osl_Socket_FamilyInet, + osl_Socket_TypeStream, + osl_Socket_ProtocolIp); + OSL_ASSERT(result == osl_Socket_Ok); + + result = osl_socket_setOption ( + socket, + osl_Socket_LevelSocket, + osl_Socket_OptionReuseAddr, + &option, sizeof(option)); + OSL_ASSERT(result == osl_Socket_Ok); + + addr = osl_createEmptySocketAddr (osl_Socket_FamilyInet); + osl_setInetPortOfSocketAddr (addr, 7777); + + result = osl_socket_bind (socket, addr); + OSL_ASSERT(result == osl_Socket_Ok); + + load_sequence (&data, "s_cert.der"); + if (data && data->nElements) + { + result = osl_socket_setOption ( + socket, + osl_Socket_LevelTLS, + osl_Socket_OptionCertificate, + data->elements, data->nElements); + OSL_ASSERT(result == osl_Socket_Ok); + } + + load_sequence (&data, "s_pkey.der"); + if (data && data->nElements) + { + result = osl_socket_setOption ( + socket, + osl_Socket_LevelTLS, + osl_Socket_OptionPrivateKey, + data->elements, data->nElements); + OSL_ASSERT(result == osl_Socket_Ok); + } + __rtl_sequence_release (data); + + result = osl_socket_listen (socket, 1); + OSL_ASSERT(result == osl_Socket_Ok); + + connection = osl_socket_accept (socket, &from); + if (connection) + { + sal_Char buffer[1024]; + sal_Int32 k, n = sizeof(buffer); + oslSocketMsgFlag flag = osl_Socket_MsgNormal; + + result = osl_socket_accept_handshake (connection, from); + OSL_ASSERT(result == osl_Socket_Ok); + + while ((k = osl_socket_recv (connection, buffer, n, flag)) > 0) + { + if (osl_socket_send (connection, buffer, k, flag) < 0) + break; + } + + osl_socket_close (connection); + + osl_socket_delete (connection); + osl_socket_deleteSocketLayer (connection); + } + + osl_socket_delete (socket); + osl_socket_deleteSocketLayer (socket); + } + + return 0; +} + diff --git a/sal/workben/t_zip.c b/sal/workben/t_zip.c new file mode 100644 index 000000000000..6febc29554df --- /dev/null +++ b/sal/workben/t_zip.c @@ -0,0 +1,223 @@ +/************************************************************************* + * + * $RCSfile: t_zip.c,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:17:31 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +#ifndef _SAL_TYPES_H_ +#include +#endif +#ifndef _RTL_USTRING_H_ +#include +#endif + +#ifndef _OSL_DIAGNOSE_H_ +#include +#endif +#ifndef _OSL_THREAD_H_ +#include +#endif +#ifndef _OSL_ZSOCKET_H_ +#include +#endif + +#include + +/*======================================================================== + * + * internals. + * + *======================================================================*/ +void SAL_CALL clientSocketReader (void *pData) +{ + oslSocketDescriptor *socket; + + socket = (oslSocketDescriptor*)pData; + if (socket) + { + sal_Char buffer[128]; + sal_Int32 k, n = sizeof(buffer); + oslSocketMsgFlag flag = osl_Socket_MsgNormal; + + while ((k = osl_socket_recv (socket, buffer, n, flag)) > 0) + { + fwrite (buffer, 1, k, stdout); + fflush (stdout); + } + } +} + +/*======================================================================== + * + * main. + * + *======================================================================*/ +int SAL_CALL main (int argc, char **argv) +{ + oslSocketDescriptor *socket; + + socket = osl_socket_createSocketLayer (osl_zlib_getSocketMethods()); + if (socket) + { + oslSocketAddr addr = 0; + oslSocketResult result; + + result = osl_socket_create ( + socket, + osl_Socket_FamilyInet, + osl_Socket_TypeStream, + osl_Socket_ProtocolIp); + OSL_ASSERT(result == osl_Socket_Ok); + + if (argc > 1) + { + rtl_uString *host = 0; + + rtl_uString_newFromAscii (&host, argv[1]); + addr = osl_resolveHostname (host); + rtl_uString_release (host); + } + + if (addr) + { + sal_Char buffer[128]; + sal_Int32 k, n = sizeof(buffer); + oslSocketMsgFlag flag = osl_Socket_MsgNormal; + oslThread reader; + + osl_setInetPortOfSocketAddr (addr, 7777); + + result = osl_socket_connect (socket, addr); + OSL_ASSERT(result == osl_Socket_Ok); + + result = osl_socket_connect_handshake (socket, addr); + osl_destroySocketAddr (addr); + OSL_ASSERT(result == osl_Socket_Ok); + + reader = osl_createSuspendedThread (clientSocketReader, socket); + OSL_ASSERT(reader); + osl_resumeThread (reader); + + while ((k = fread (buffer, 1, n, stdin)) > 0) + { + if (osl_socket_send (socket, buffer, k, flag) < 0) + break; + } + + osl_socket_shutdown (socket, osl_Socket_DirReadWrite); + osl_socket_close (socket); + + osl_joinWithThread (reader); + osl_destroyThread (reader); + } + else + { + oslSocketDescriptor *connection; + oslSocketAddr from = 0; + sal_Int32 option = 1; + + addr = osl_createEmptySocketAddr (osl_Socket_FamilyInet); + osl_setInetPortOfSocketAddr (addr, 7777); + + result = osl_socket_setOption ( + socket, + osl_Socket_LevelSocket, + osl_Socket_OptionReuseAddr, + &option, sizeof(option)); + OSL_ASSERT(result == osl_Socket_Ok); + + result = osl_socket_bind (socket, addr); + osl_destroySocketAddr (addr); + OSL_ASSERT(result == osl_Socket_Ok); + + result = osl_socket_listen (socket, 1); + OSL_ASSERT(result == osl_Socket_Ok); + + connection = osl_socket_accept (socket, &from); + if (connection) + { + sal_Char buffer[64]; + sal_Int32 k, n = sizeof(buffer); + oslSocketMsgFlag flag = osl_Socket_MsgNormal; + + result = osl_socket_accept_handshake (connection, from); + osl_destroySocketAddr (from); + OSL_ASSERT(result == osl_Socket_Ok); + + while ((k = osl_socket_recv (connection, buffer, n, flag)) > 0) + { + if (osl_socket_send (connection, buffer, k, flag) < 0) + break; + } + + osl_socket_close (connection); + + osl_socket_delete (connection); + osl_socket_deleteSocketLayer (connection); + } + + osl_socket_close (socket); + } + + osl_socket_delete (socket); + osl_socket_deleteSocketLayer (socket); + } + + return 0; +} + diff --git a/sal/workben/test.cxx b/sal/workben/test.cxx new file mode 100644 index 000000000000..e47ec0e0d9d3 --- /dev/null +++ b/sal/workben/test.cxx @@ -0,0 +1,103 @@ +/************************************************************************* + * + * $RCSfile: test.cxx,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:17:31 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +#include + +#ifdef SOLARIS +extern "C" ChangeGlobalInit(); +#endif +#if (defined UNX) || (defined OS2) +int main( int argc, char * argv[] ) +#else +int _cdecl main( int argc, char * argv[] ) +#endif +{ +#ifdef SOLARIS + ChangeGlobalInit(); +#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..07986648525d --- /dev/null +++ b/sal/workben/testfile.cxx @@ -0,0 +1,2816 @@ +/************************************************************************* + * + * $RCSfile: testfile.cxx,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:17:31 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +#define UNICODE + + +#include +#include +#include +#include +#include +#include +#include +#include + + +#ifdef UNX +#include +#endif + +#ifdef WNT +#include +#endif + +using namespace osl; + +#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 *strExeFilePath=NULL; + oslProcessError ProcessError; + + rtl::OUString iniFilePath; + 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(&strExeFilePath); + + if ( ProcessError == osl_Process_E_None) + { + pExeFileCount=rtl_uString_getStr(strExeFilePath)+rtl_uString_getLength(strExeFilePath); + + // Search for the last slash in the Path + while (*pExeFileCount!=L'/' && pExeFileCount>rtl_uString_getStr(strExeFilePath)) + pExeFileCount--; + + // iniFilePath = strExeFilePath without the filename of the exe-File + iniFilePath=rtl::OUString( rtl_uString_getStr(strExeFilePath) ,(int) (pExeFileCount-rtl_uString_getStr(strExeFilePath)) ); + + // add "/testfile.ini" to iniFilePath + iniFilePath+=rtl::OUString::createFromAscii("/testfile.ini"); + + // Open the ini-File + pFile=new File( iniFilePath ); + rc=pFile->open( OpenFlag_Read | OpenFlag_Write ); + if ( rc!=FileBase::E_None ) + { + rtl_uString_release(strExeFilePath); + return sal_False; + } + } + else + { + rtl_uString_release(strExeFilePath); + return sal_False; + } + + // Get filesize of the ini-File + + rc=DirectoryItem::get( iniFilePath, 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( <ime ); + + 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: FilePath: "); + printFileName(pStatus->getFilePath() ); + 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: FilePath: "); + printFileName( pStatus->getFilePath() ); + 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: FilePath: "); + printFileName( pStatus->getFilePath() ); + 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" ); + + //-------------------------------------------------- + // GetFilePath + //-------------------------------------------------- + + rtl::OUString FilePath; + + printf( "\ngetFilePath:\n" ); + + FilePath=pStatus->getFilePath(); + printf( "FilePath: "); + printFileName( FilePath ); + printf( "\n" ); + + //-------------------------------------------------- + // GetNativePath + //-------------------------------------------------- + + rtl::OUString NativePath; + + printf( "\ngetNativePath:\n"); + + NativePath=pStatus->getNativePath(); + printf( "NativePath: "); + printFileName( NativePath ); + 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::normalizePath( strPath, strNormPath ); + + if ( rc == FileBase::E_None ) + { + printf( "Normalized Path: \t\t"); + printFileName( strNormPath ); + printf( "\n" ); + } + else + printf( "normalizePath: Error \n" ); + + //-------------------------------------------------- + // getFileURLFromNormalizedPath + //-------------------------------------------------- + + if ( strNormPath.getLength() != 0 ) + { + rc=FileBase::getFileURLFromNormalizedPath( strNormPath, strFileURL ); + + if ( rc == FileBase::E_None ) + { + printf( "File-URL: \t\t\t"); + printFileName( strFileURL ); + printf( "\n" ); + } + else + printf( "getFileURLFromNormalizedPath: Error \n" ); + } + else + printf( "getFileURLFromNormalizedPath: not tested \n" ); + + //-------------------------------------------------- + // getNormalizedPathFromFileURL + //-------------------------------------------------- + + if ( strFileURL.getLength() != 0 ) + { + rc=FileBase::getNormalizedPathFromFileURL( 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" ); + + + //-------------------------------------------------- + // getSystemPathFromNormalizedPath + //-------------------------------------------------- + + if ( strNormPath.getLength() != 0 ) + { + rc=FileBase::getSystemPathFromNormalizedPath( strNormPath, strSystemPath ); + + if ( rc == FileBase::E_None ) + { + printf( "System-Path: \t\t\t"); + printFileName( strSystemPath ); + printf( "\n"); + } + else + printf( "getSystemPathFromNormalizedPath: Error \n" ); + } + else + printf( "getSystemPathFromNormalizedPath: 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::getAbsolutePath( 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::getFileURLFromNormalizedPath( strNormPath, strFileURL ); + print_error( rtl::OString( "GetFileURLFromNormalizedPath" ), rc ); + rc=FileBase::getSystemPathFromNormalizedPath( strNormPath, strSystemPath ); + print_error( rtl::OString( "GetSystemPathFromNormalizedPath" ), rc ); + + //-------------------------------------------------- + // searchNormalizedPath (with a normalized path) + //-------------------------------------------------- + + if ( strNormPath.getLength() != 0 ) + { + printf( "\nSearch-Normalized-Path (with a normalized path) : "); + printFileName ( strNormPath ); + printf( "\n" ); + + rc=FileBase::searchNormalizedPath( strNormPath , rtl::OUString() , strResultPath ); + + if ( rc == FileBase::E_None ) + { + printf( "Result: \t\t\t"); + printFileName ( strResultPath ); + printf( "\n" ); + } + else + printf( "SearchNormalizedPath (with a normalized path): Error\n" ); + } + else + printf( "SearchNormalizedPath (with a normalized path): not tested\n" ); + + //-------------------------------------------------- + // searchNormalizedPath (with a File-URL) + //-------------------------------------------------- + + if ( strFileURL.getLength() != 0 ) + { + printf( "\nSearch-Normalized-Path (with a FileURL) : "); + printFileName( strFileURL ); + printf( "\n" ); + + rc=FileBase::searchNormalizedPath( strFileURL , rtl::OUString() , strResultPath ); + + if ( rc == FileBase::E_None ) + { + printf( "Result: \t\t\t"); + printFileName ( strResultPath ); + printf( "\n" ); + } + else + printf( "SearchNormalizedPath (with a FileURL path): Error\n" ); + } + else + printf( "SearchNormalizedPath (with a FileURL path): not tested\n" ); + + //-------------------------------------------------- + // searchNormalizedPath (with a systempath) + //-------------------------------------------------- + + if ( strSystemPath.getLength() != 0 ) + { + printf( "\nSearch-Normalized-Path (with a SystemPath) : "); + printFileName( strSystemPath ); + printf( "\n" ); + + rc=FileBase::searchNormalizedPath( strSystemPath , rtl::OUString() , strResultPath ); + + if ( rc == FileBase::E_None ) + { + printf( "Result: \t\t\t"); + printFileName( strResultPath ); + printf( "\n" ); + } + else + printf( "SearchNormalizedPath (with a systempath): Error\n" ); + } + else + printf( "SearchNormalizedPath (with a systempath): not tested\n" ); + + //-------------------------------------------------- + // searchNormalizedPath (File and no searchpath) + //-------------------------------------------------- + + printf( "\nSearchNormalizedPath: File (no searchpath) : "); + printFileName( file3 ); + printf( "\n" ); + + rc=FileBase::searchNormalizedPath( file3 , rtl::OUString::createFromAscii("") , strResultPath ); + + if ( rc == FileBase::E_None ) + { + printf( "Result: \t\t\t"); + printFileName( strResultPath ); + printf( "\n" ); + } + else + printf( "SearchNormalizedPath: File not found: OK ! \n" ); + + //-------------------------------------------------- + // searchNormalizedPath (File and Path) + //-------------------------------------------------- + + printf( "\nSearchNormalizedPath: File : "); + printFileName( file3 ); + printf( "\tSearchPath "); + printFileName( dir1 ); + printf( "\n"); + + rc=FileBase::searchNormalizedPath( file3 , dir1 , strResultPath ); + + if ( rc == FileBase::E_None ) + { + printf( "Result: \t\t\t"); + printFileName( strResultPath ); + printf( "\n"); + } + else + printf( "SearchNormalizedPath: File not found: Error\n" ); + + //------------------------------------------------------------ + // searchNormalizedPath (File and searchpath with two entries) + //------------------------------------------------------------ + + rtl::OUString strSearchPath( dir_not_exist ); + strSearchPath+=rtl::OUString::createFromAscii(";"); + strSearchPath+=dir_on_server; + + printf( "\nSearchNormalizedPath: File : "); + printFileName( file3 ); + printf( "SearchPath "); + printFileName( strSearchPath ); + printf( "\n"); + + rc=FileBase::searchNormalizedPath( file3 , strSearchPath , strResultPath ); + + if ( rc == FileBase::E_None ) + { + printf( "Result: \t\t\t"); + printFileName( strResultPath ); + printf( "\n" ); + } + else + printf( "SearchNormalizedPath: File not found: Error\n" ); + + //------------------------------------------------------------------- + // searchNormalizedPath (File and searchpath (with a wrong semantic)) + //------------------------------------------------------------------- + + strSearchPath=rtl::OUString( dir_wrong_semantic ); + + printf( "\nSearchNormalizedPath: File : "); + printFileName( file3 ); + printf( "SearchPath "); + printFileName( strSearchPath ); + printf( "\n"); + + rc=FileBase::searchNormalizedPath( file3 , strSearchPath , strResultPath ); + + if ( rc == FileBase::E_None ) + printf( "Error: Wrong Semantich but no error occurs !\n" ); + else + printf( "SearchNormalizedPath: 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 +#include + +#define INCL_DOSPROCESS +#include +#include + +// eindeutiger Name fr 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 zurck. + 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..6999b93c3abc --- /dev/null +++ b/sal/workben/testpipe.cxx @@ -0,0 +1,199 @@ +/************************************************************************* + * + * $RCSfile: testpipe.cxx,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:17:31 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + + +#include +#include +#include + +#include +#include +#include + +// eindeutiger Name fr 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 Rckgabewert 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..b358b392afcd --- /dev/null +++ b/sal/workben/testproc.cxx @@ -0,0 +1,108 @@ +/************************************************************************* + * + * $RCSfile: testproc.cxx,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:17:31 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + + +#include +#include + + +#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..e11fb799e10a --- /dev/null +++ b/sal/workben/tgetpwnam.cxx @@ -0,0 +1,279 @@ +/************************************************************************* + * + * $RCSfile: tgetpwnam.cxx,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:17:31 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#ifndef NETBSD +#include +#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); +} + + diff --git a/store/inc/store/filelckb.hxx b/store/inc/store/filelckb.hxx new file mode 100644 index 000000000000..a9ef520e94e5 --- /dev/null +++ b/store/inc/store/filelckb.hxx @@ -0,0 +1,209 @@ +/************************************************************************* + * + * $RCSfile: filelckb.hxx,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:18:31 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +#ifndef _STORE_FILELCKB_HXX_ +#define _STORE_FILELCKB_HXX_ "$Revision: 1.1.1.1 $" + +#ifndef _SAL_TYPES_H_ +#include +#endif + +#ifndef _RTL_USTRING_H_ +#include +#endif +#ifndef _OSL_MUTEX_HXX_ +#include +#endif + +#ifndef _STORE_MACROS_HXX_ +#include +#endif +#ifndef _STORE_OBJECT_HXX_ +#include +#endif +#ifndef _STORE_LOCKBYTE_HXX_ +#include +#endif + +#ifdef _USE_NAMESPACE +namespace store { +#endif + +class OFileLockBytes_Impl; + +/*======================================================================== + * + * OFileLockBytes interface. + * + *======================================================================*/ +class OFileLockBytes : + public NAMESPACE_STORE(ILockBytes), + public NAMESPACE_STORE(OStoreObject) +{ + VOS_DECLARE_CLASSINFO (VOS_NAMESPACE (OFileLockBytes, store)); + +public: + OFileLockBytes (void); + + /** create. + * @param pFilename [in] + * @param eAccessMode [in] + * @return store_E_None upon success + */ + storeError create ( + rtl_uString *pFilename, + storeAccessMode eAccessMode); + + /** Read at Offset into Buffer. + * @param nOffset [in] + * @param pBuffer [out] + * @param nBytes [in] + * @param rnDone [out] + * @return store_E_None upon success + */ + virtual storeError readAt ( + sal_uInt32 nOffset, + void *pBuffer, + sal_uInt32 nBytes, + sal_uInt32 &rnDone); + + /** Write at Offset from Buffer. + * @param nOffset [in] + * @param pBuffer [in] + * @param nBytes [in] + * @param rnDone [out] + * @return store_E_None upon success + */ + virtual storeError writeAt ( + sal_uInt32 nOffset, + const void *pBuffer, + sal_uInt32 nBytes, + sal_uInt32 &rnDone); + + /** flush. + * @return store_E_None upon success + */ + virtual storeError flush (void); + + /** setSize. + * @param nSize [in] + * @return store_E_None upon success + */ + virtual storeError setSize (sal_uInt32 nSize); + + /** stat. + * @param rnSize [out] + * @return store_E_None upon success + */ + virtual storeError stat (sal_uInt32 &rnSize); + + /** Lock range at Offset. + * @param nOffset [in] + * @param nBytes [in] + * @return store_E_None upon success + * store_E_LockingViolation + */ + virtual storeError lockRange ( + sal_uInt32 nOffset, + sal_uInt32 nBytes); + + /** Unlock range at Offset. + * @param nOffset [in] + * @param nBytes [in] + * @return store_E_None upon success + * store_E_LockingViolation + */ + virtual storeError unlockRange ( + sal_uInt32 nOffset, + sal_uInt32 nBytes); + + /** Delegate multiple inherited IReference. + */ + virtual RefCount SAL_CALL acquire (void); + virtual RefCount SAL_CALL release (void); + virtual RefCount SAL_CALL referenced (void) const; + +protected: + virtual ~OFileLockBytes (void); + +private: + /** Representation. + */ + NAMESPACE_OSL(Mutex) m_aMutex; + OFileLockBytes_Impl *m_pImpl; + + /** Not implemented. + */ + OFileLockBytes (const OFileLockBytes&); + OFileLockBytes& operator= (const OFileLockBytes&); +}; + +/*======================================================================== + * + * The End. + * + *======================================================================*/ +#ifdef _USE_NAMESPACE +} +#endif + +#endif /* !_STORE_FILELCKB_HXX_ */ + diff --git a/store/inc/store/lockbyte.hxx b/store/inc/store/lockbyte.hxx new file mode 100644 index 000000000000..dbab735cab4f --- /dev/null +++ b/store/inc/store/lockbyte.hxx @@ -0,0 +1,169 @@ +/************************************************************************* + * + * $RCSfile: lockbyte.hxx,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:18:31 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +#ifndef _STORE_LOCKBYTE_HXX_ +#define _STORE_LOCKBYTE_HXX_ "$Revision: 1.1.1.1 $" + +#ifndef _SAL_TYPES_H_ +#include +#endif + +#ifndef _VOS_REFERNCE_HXX_ +#include +#endif + +#ifndef _STORE_TYPES_H_ +#include +#endif +#ifndef _STORE_MACROS_HXX_ +#include +#endif + +#ifdef _USE_NAMESPACE +namespace store { +#endif + +/*======================================================================== + * + * ILockBytes interface. + * + *======================================================================*/ +class ILockBytes : public NAMESPACE_VOS(IReference) +{ +public: + /** + * @param nOffset [in] + * @param pBuffer [out] + * @param nBytes [in] + * @param rnDone [out] + * @return store_E_None upon success + */ + virtual storeError readAt ( + sal_uInt32 nOffset, + void *pBuffer, + sal_uInt32 nBytes, + sal_uInt32 &rnDone) = 0; + + /** + * @param nOffset [in] + * @param pBuffer [in] + * @param nBytes [in] + * @param rnDone [out] + * @return store_E_None upon success + */ + virtual storeError writeAt ( + sal_uInt32 nOffset, + const void *pBuffer, + sal_uInt32 nBytes, + sal_uInt32 &rnDone) = 0; + + /** + * @return store_E_None upon success + */ + virtual storeError flush (void) = 0; + + /** + * @param nSize [in] + * @return store_E_None upon success + */ + virtual storeError setSize (sal_uInt32 nSize) = 0; + + /** + * @param rnSize [out] + * @return store_E_None upon success + */ + virtual storeError stat (sal_uInt32 &rnSize) = 0; + + /** + * @param nOffset [in] + * @param nBytes [in] + * @return store_E_None upon success + * store_E_LockingViolation + */ + virtual storeError lockRange ( + sal_uInt32 nOffset, + sal_uInt32 nBytes) = 0; + + /** + * @param nOffset [in] + * @param nBytes [in] + * @return store_E_None upon success + * store_E_LockingViolation + */ + virtual storeError unlockRange ( + sal_uInt32 nOffset, + sal_uInt32 nBytes) = 0; + +protected: + virtual ~ILockBytes (void) {} +}; + +/*======================================================================== + * + * The End. + * + *======================================================================*/ +#ifdef _USE_NAMESPACE +} +#endif + +#endif /* !_STORE_LOCKBYTE_HXX_ */ + diff --git a/store/inc/store/memlckb.hxx b/store/inc/store/memlckb.hxx new file mode 100644 index 000000000000..a78b946b6b61 --- /dev/null +++ b/store/inc/store/memlckb.hxx @@ -0,0 +1,197 @@ +/************************************************************************* + * + * $RCSfile: memlckb.hxx,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:18:31 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +#ifndef _STORE_MEMLCKB_HXX_ +#define _STORE_MEMLCKB_HXX_ "$Revision: 1.1.1.1 $" + +#ifndef _SAL_TYPES_H_ +#include +#endif + +#ifndef _VOS_MUTEX_HXX_ +#include +#endif + +#ifndef _STORE_MACROS_HXX_ +#include +#endif +#ifndef _STORE_OBJECT_HXX_ +#include +#endif +#ifndef _STORE_LOCKBYTE_HXX_ +#include +#endif + +#ifdef _USE_NAMESPACE +namespace store { +#endif + +class OMemoryLockBytes_Impl; + +/*======================================================================== + * + * OMemoryLockBytes interface. + * + *======================================================================*/ +class OMemoryLockBytes : + public NAMESPACE_STORE(ILockBytes), + public NAMESPACE_STORE(OStoreObject) +{ + VOS_DECLARE_CLASSINFO (VOS_NAMESPACE (OMemoryLockBytes, store)); + +public: + OMemoryLockBytes (void); + + /** Read at Offset into Buffer. + * @param nOffset [in] + * @param pBuffer [out] + * @param nBytes [in] + * @param rnDone [out] + * @return store_E_None upon success + */ + virtual storeError readAt ( + sal_uInt32 nOffset, + void *pBuffer, + sal_uInt32 nBytes, + sal_uInt32 &rnDone); + + /** Write at Offset from Buffer. + * @param nOffset [in] + * @param pBuffer [in] + * @param nBytes [in] + * @param rnDone [out] + * @return store_E_None upon success + */ + virtual storeError writeAt ( + sal_uInt32 nOffset, + const void *pBuffer, + sal_uInt32 nBytes, + sal_uInt32 &rnDone); + + /** flush. + * @return store_E_None upon success + */ + virtual storeError flush (void); + + /** setSize. + * @param nSize [in] + * @return store_E_None upon success + */ + virtual storeError setSize (sal_uInt32 nSize); + + /** stat. + * @param rnSize [out] + * @return store_E_None upon success + */ + virtual storeError stat (sal_uInt32 &rnSize); + + /** Lock range at Offset. + * @param nOffset [in] + * @param nBytes [in] + * @return store_E_None upon success + * store_E_LockingViolation + */ + virtual storeError lockRange ( + sal_uInt32 nOffset, + sal_uInt32 nBytes); + + /** Unlock range at Offset. + * @param nOffset [in] + * @param nBytes [in] + * @return store_E_None upon success + * store_E_LockingViolation + */ + virtual storeError unlockRange ( + sal_uInt32 nOffset, + sal_uInt32 nBytes); + + /** Delegate multiple inherited IReference. + */ + virtual RefCount SAL_CALL acquire (void); + virtual RefCount SAL_CALL release (void); + virtual RefCount SAL_CALL referenced (void) const; + +protected: + virtual ~OMemoryLockBytes (void); + +private: + /** Representation. + */ + NAMESPACE_VOS(OMutex) m_aMutex; + OMemoryLockBytes_Impl *m_pImpl; + + /** Not implemented. + */ + OMemoryLockBytes (const OMemoryLockBytes&); + OMemoryLockBytes& operator= (const OMemoryLockBytes&); +}; + +/*======================================================================== + * + * The End. + * + *======================================================================*/ +#ifdef _USE_NAMESPACE +} +#endif + +#endif /* !_STORE_MEMLCKB_HXX_ */ + diff --git a/store/inc/store/object.hxx b/store/inc/store/object.hxx new file mode 100644 index 000000000000..c5caa83da5d4 --- /dev/null +++ b/store/inc/store/object.hxx @@ -0,0 +1,118 @@ +/************************************************************************* + * + * $RCSfile: object.hxx,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:18:31 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +#ifndef _STORE_OBJECT_HXX_ +#define _STORE_OBJECT_HXX_ "$Revision: 1.1.1.1 $" + +#ifndef _SAL_TYPES_H_ +#include +#endif + +#ifndef _VOS_OBJECT_HXX_ +#include +#endif +#ifndef _VOS_REFERNCE_HXX_ +#include +#endif + +#ifndef _STORE_MACROS_HXX_ +#include +#endif + +#ifdef _USE_NAMESPACE +namespace store { +#endif + +/*======================================================================== + * + * OStoreObject interface. + * + *======================================================================*/ +class OStoreObject : + public NAMESPACE_VOS(OReference), + public NAMESPACE_VOS(OObject) +{ + VOS_DECLARE_CLASSINFO (VOS_NAMESPACE (OStoreObject, store)); + +public: + OStoreObject (void); + +protected: + virtual ~OStoreObject (void); + +private: + /** Not implemented. + */ + OStoreObject (const OStoreObject&); + OStoreObject& operator= (const OStoreObject&); +}; + +/*======================================================================== + * + * The End. + * + *======================================================================*/ +#ifdef _USE_NAMESPACE +} +#endif + +#endif /* !_STORE_OBJECT_HXX_ */ + diff --git a/store/inc/store/store.h b/store/inc/store/store.h new file mode 100644 index 000000000000..2e8ea11ebefb --- /dev/null +++ b/store/inc/store/store.h @@ -0,0 +1,377 @@ +/************************************************************************* + * + * $RCSfile: store.h,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:18:31 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +#ifndef _STORE_STORE_H_ +#define _STORE_STORE_H_ "$Revision: 1.1.1.1 $" + +#ifndef _STORE_TYPES_H_ +#include +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/** Opaque type storeHandle. + */ +typedef void* storeHandle; + +/** store_acquireHandle. + * @param Handle [in] + * @return store_E_None upon success + */ +storeError SAL_CALL store_acquireHandle (storeHandle Handle); + +/** store_releaseHandle. + * @param Handle [in] + * @return store_E_None upon success, + * store_E_InvalidHandle otherwise. + */ +storeError SAL_CALL store_releaseHandle (storeHandle Handle); + + +/** Opaque type storeFileHandle. + */ +typedef void* storeFileHandle; + +/** store_createMemoryFile. + * @param nPageSize [in] the creation page size, + * integer multiple of minimum page size. + * @param phFile [out] + * @return store_E_None upon success + */ +storeError SAL_CALL store_createMemoryFile ( + sal_uInt16 nPageSize, + storeFileHandle *phFile); + +/** store_openFile. + * @param pFilename [in] the filename in host syntax. + * @param eAccessMode [in] the access mode. + * store_AccessCreate truncate existing and create, + * store_AccessReadCreate create not existing, + * store_AccessReadWrite write existing, + * store_AccessReadOnly never modifies. + * @param nPageSize [in] the creation page size, + * integer multiple of minimum page size. + * @param phFile [out] + * @return store_E_None upon success + */ +storeError SAL_CALL store_openFile ( + rtl_uString *pFilename, + storeAccessMode eAccessMode, + sal_uInt16 nPageSize, + storeFileHandle *phFile); + +/** store_closeFile. + * @param hFile [in] + * @return store_E_None upon success, + * store_E_InvalidHandle otherwise. + */ +storeError SAL_CALL store_closeFile ( + storeFileHandle hFile); + +/** store_flushFile. + * @param hFile [in] + * @return store_E_None upon success + */ +storeError SAL_CALL store_flushFile ( + storeFileHandle hFile); + +/** store_getFileRefererCount. + * @param hFile [in] + * @param pnRefCount [out] number of open directories and streams. + * @return store_E_None upon success + */ +storeError SAL_CALL store_getFileRefererCount ( + storeFileHandle hFile, + sal_uInt32 *pnRefCount); + +/** store_getFileSize. + * @param hFile [in] + * @param pnSize [out] + * @return store_E_None upon success + */ +storeError SAL_CALL store_getFileSize ( + storeFileHandle hFile, + sal_uInt32 *pnSize); + +/** store_rebuildFile. + * @param pSrcFilename [in] opened with store_AccessReadOnly. + * @param pDstFilename [in] created with store_AccessCreate. + * @return store_E_None upon success + */ +storeError SAL_CALL store_rebuildFile ( + rtl_uString *pSrcFilename, + rtl_uString *pDstFilename); + + +/** Opaque type storeDirectoryHandle. + */ +typedef void* storeDirectoryHandle; + +/** store_openDirectory. + * @param hFile [in] + * @param pPath [in] + * @param pName [in] + * @param eAccessMode [in] + * @param phDirectory [out] + * @return store_E_None upon success + */ +storeError SAL_CALL store_openDirectory ( + storeFileHandle hFile, + rtl_uString *pPath, + rtl_uString *pName, + storeAccessMode eAccessMode, + storeDirectoryHandle *phDirectory); + +/** store_closeDirectory. + * @param hDirectory [in] + * @return store_E_None upon success, + * store_E_InvalidHandle otherwise. + */ +storeError SAL_CALL store_closeDirectory ( + storeDirectoryHandle hDirectory); + +/** store_findFirst. + * @param hDirectory [in] + * @param pFindData [out] + * @return store_E_None upon success, + * store_E_NoMoreFile upon end of iteration. + */ +storeError SAL_CALL store_findFirst ( + storeDirectoryHandle hDirectory, + storeFindData *pFindData); + +/** store_findNext. + * @param hDirectory [in] + * @param pFindData [out] + * @return store_E_None upon success, + * store_E_NoMoreFile upon end of iteration. + */ +storeError SAL_CALL store_findNext ( + storeDirectoryHandle hDirectory, + storeFindData *pFindData); + + +/** Opaque type storeStreamHandle. + */ +typedef void* storeStreamHandle; + +/** store_openStream. + * @param hFile [in] + * @param pPath [in] + * @param pName [in] + * @param eAccessMode [in] + * @param phStrm [out] + * @return store_E_None upon success + */ +storeError SAL_CALL store_openStream ( + storeFileHandle hFile, + rtl_uString *pPath, + rtl_uString *pName, + storeAccessMode eMode, + storeStreamHandle *phStrm); + +/** store_closeStream. + * @param hStrm [in] + * @return store_E_None upon success, + * store_E_InvalidHandle otherwise. + */ +storeError SAL_CALL store_closeStream ( + storeStreamHandle hStrm); + +/** store_readStream. + * @param hStrm [in] + * @param nOffset [in] + * @param pBuffer [out] + * @param nBytes [in] + * @param pnDone [out] + * @return store_E_None upon success + */ +storeError SAL_CALL store_readStream ( + storeStreamHandle hStrm, + sal_uInt32 nOffset, + void *pBuffer, + sal_uInt32 nBytes, + sal_uInt32 *pnDone); + +/** store_writeStream. + * @param hStrm [in] + * @param nOffset [in] + * @param pBuffer [in] + * @param nBytes [in] + * @param pnDone [out] + * @return store_E_None upon success + */ +storeError SAL_CALL store_writeStream ( + storeStreamHandle hStrm, + sal_uInt32 nOffset, + const void *pBuffer, + sal_uInt32 nBytes, + sal_uInt32 *pnDone); + +/** store_flushStream. + * @param hStrm [in] + * @return store_E_None upon success + */ +storeError SAL_CALL store_flushStream ( + storeStreamHandle hStrm); + +/** store_getStreamSize. + * @param hStrm [in] + * @param pnSize [out] + * @return store_E_None upon success + */ +storeError SAL_CALL store_getStreamSize ( + storeStreamHandle hStrm, + sal_uInt32 *pnSize); + +/** store_setStreamSize. + * @param hStrm [in] + * @param nSize [in] + * @return store_E_None upon success + */ +storeError SAL_CALL store_setStreamSize ( + storeStreamHandle hStrm, + sal_uInt32 nSize); + +/** store_attrib. + * @param hFile [in] + * @param pPath [in] + * @param pName [in] + * @param nMask1 [in] + * @param nMask2 [in] + * @param pnAttrib [out] may be NULL. + * @return store_E_None upon success + */ +storeError SAL_CALL store_attrib ( + storeFileHandle hFile, + rtl_uString *pPath, + rtl_uString *pName, + sal_uInt32 nMask1, + sal_uInt32 nMask2, + sal_uInt32 *pnAttrib); + +/** store_link. + * @param hFile [in] + * @param pSrcPath [in] + * @param pSrcName [in] + * @param pDstPath [in] + * @param pDstName [in] + * @return store_E_None upon success + */ +storeError SAL_CALL store_link ( + storeFileHandle hFile, + rtl_uString *pSrcPath, rtl_uString *pSrcName, + rtl_uString *pDstPath, rtl_uString *pDstName); + +/** store_symlink. + * @param hFile [in] + * @param pSrcPath [in] + * @param pSrcName [in] + * @param pDstPath [in] + * @param pDstName [in] + * @return store_E_None upon success + */ +storeError SAL_CALL store_symlink ( + storeFileHandle hFile, + rtl_uString *pSrcPath, rtl_uString *pSrcName, + rtl_uString *pDstPath, rtl_uString *pDstName); + +/** store_rename. + * @param hFile [in] + * @param pSrcPath [in] + * @param pSrcName [in] + * @param pDstPath [in] + * @param pDstName [in] + * @return store_E_None upon success + */ +storeError SAL_CALL store_rename ( + storeFileHandle hFile, + rtl_uString *pSrcPath, rtl_uString *pSrcName, + rtl_uString *pDstPath, rtl_uString *pDstName); + +/** store_remove. + * @param hFile [in] + * @param pPath [in] + * @param pName [in] + * @return store_E_None upon success + */ +storeError SAL_CALL store_remove ( + storeFileHandle hFile, + rtl_uString *pPath, + rtl_uString *pName); + +/*======================================================================== + * + * The End. + * + *======================================================================*/ + +#ifdef __cplusplus +} +#endif + +#endif /* _STORE_STORE_H_ */ + + + + diff --git a/store/inc/store/store.hxx b/store/inc/store/store.hxx new file mode 100644 index 000000000000..11d7aba73286 --- /dev/null +++ b/store/inc/store/store.hxx @@ -0,0 +1,267 @@ +/************************************************************************* + * + * $RCSfile: store.hxx,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:18:31 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +#ifndef _STORE_STORE_HXX_ +#define _STORE_STORE_HXX_ "$Revision: 1.1.1.1 $" + +#ifndef _SAL_TYPES_H_ +#include +#endif + +#ifndef _RTL_USTRING_HXX_ +#include +#endif + +#ifndef _STORE_STORE_H_ +#include +#endif + +#ifdef _USE_NAMESPACE +namespace store { +#endif + +/*======================================================================== + * + * OStoreStream interface. + * + *======================================================================*/ +class OStoreStream +{ +public: + inline OStoreStream (void); + inline ~OStoreStream (void); + + inline OStoreStream (const OStoreStream& rOther); + inline OStoreStream& operator= (const OStoreStream& rOther); + + inline OStoreStream (storeStreamHandle Handle); + inline operator storeStreamHandle (void) const; + + inline sal_Bool isValid (void) const; + + inline storeError create ( + storeFileHandle hFile, + const rtl::OUString &rPath, + const rtl::OUString &rName, + storeAccessMode eMode); + + inline void close (void); + + inline storeError readAt ( + sal_uInt32 nOffset, + void *pBuffer, + sal_uInt32 nBytes, + sal_uInt32 &rnDone); + + inline storeError writeAt ( + sal_uInt32 nOffset, + const void *pBuffer, + sal_uInt32 nBytes, + sal_uInt32 &rnDone); + + inline storeError flush (void) const; + + inline storeError getSize (sal_uInt32 &rnSize) const; + + inline storeError setSize (sal_uInt32 nSize); + +private: + storeStreamHandle m_hImpl; +}; + +/*======================================================================== + * + * OStoreDirectory interface. + * + *======================================================================*/ +class OStoreDirectory +{ +public: + inline OStoreDirectory (void); + inline ~OStoreDirectory (void); + + inline OStoreDirectory (const OStoreDirectory& rOther); + inline OStoreDirectory& operator= (const OStoreDirectory& rOther); + + inline OStoreDirectory (storeDirectoryHandle Handle); + inline operator storeDirectoryHandle (void) const; + + inline sal_Bool isValid (void) const; + + /** create. + */ + inline storeError create ( + storeFileHandle hFile, + const rtl::OUString &rPath, + const rtl::OUString &rName, + storeAccessMode eMode); + + /** close. + */ + inline void close (void); + + /** Iteration. + */ + typedef storeFindData iterator; + + inline storeError first (iterator& it); + inline storeError next (iterator& it); + + /** Traversal. + */ + class traveller + { + public: + virtual sal_Bool visit (const iterator& it) = 0; + }; + + inline storeError travel (traveller& rTraveller) const; + +private: + storeDirectoryHandle m_hImpl; +}; + +/*======================================================================== + * + * OStoreFile interface. + * + *======================================================================*/ +class OStoreFile +{ +public: + inline OStoreFile (void); + inline ~OStoreFile (void); + + inline OStoreFile (const OStoreFile& rOther); + inline OStoreFile& operator= (const OStoreFile& rOther); + + inline OStoreFile (storeFileHandle Handle); + inline operator storeFileHandle (void) const; + + inline sal_Bool isValid (void) const; + + inline storeError create ( + const rtl::OUString &rFilename, + storeAccessMode eAccessMode, + sal_uInt16 nPageSize = STORE_DEFAULT_PAGESIZE); + + inline storeError createInMemory ( + sal_uInt16 nPageSize = STORE_DEFAULT_PAGESIZE); + + inline void close (void); + + inline storeError flush (void) const; + + inline storeError getRefererCount (sal_uInt32 &rnRefCount) const; + + inline storeError getSize (sal_uInt32 &rnSize) const; + + /** Directory and Stream Manipulation. + */ + inline storeError attrib ( + const rtl::OUString &rPath, + const rtl::OUString &rName, + sal_uInt32 nMask1, + sal_uInt32 nMask2, + sal_uInt32 &rnAttrib); + inline storeError attrib ( + const rtl::OUString &rPath, + const rtl::OUString &rName, + sal_uInt32 nMask1, + sal_uInt32 nMask2); + + inline storeError link ( + const rtl::OUString &rSrcPath, const rtl::OUString &rSrcName, + const rtl::OUString &rDstPath, const rtl::OUString &rDstName); + + inline storeError symlink ( + const rtl::OUString &rSrcPath, const rtl::OUString &rSrcName, + const rtl::OUString &rDstPath, const rtl::OUString &rDstName); + + inline storeError rename ( + const rtl::OUString &rSrcPath, const rtl::OUString &rSrcName, + const rtl::OUString &rDstPath, const rtl::OUString &rDstName); + + inline storeError remove ( + const rtl::OUString &rPath, + const rtl::OUString &rName); + +private: + storeFileHandle m_hImpl; +}; + +/*======================================================================== + * + * The End. + * + *======================================================================*/ + +#include + +#ifdef _USE_NAMESPACE +} +#endif + +#endif /* !_STORE_STORE_HXX_ */ + + + + diff --git a/store/inc/store/store.inl b/store/inc/store/store.inl new file mode 100644 index 000000000000..bfcc2d89adb0 --- /dev/null +++ b/store/inc/store/store.inl @@ -0,0 +1,472 @@ +/************************************************************************* + * + * $RCSfile: store.inl,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:18:31 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRUNTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRUNTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc.. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +#define _STORE_STORE_INL_ "$Revision: 1.1.1.1 $" + +/*======================================================================== + * + * OStoreStream implementation. + * + *======================================================================*/ +inline OStoreStream::OStoreStream (void) + : m_hImpl (0) +{ +} + +inline OStoreStream::~OStoreStream (void) +{ + if (m_hImpl) + store_releaseHandle (m_hImpl); +} + +inline OStoreStream::OStoreStream (const OStoreStream& rOther) + : m_hImpl (rOther.m_hImpl) +{ + if (m_hImpl) + store_acquireHandle (m_hImpl); +} + +inline OStoreStream& OStoreStream::operator= (const OStoreStream& rOther) +{ + if (m_hImpl) + store_releaseHandle (m_hImpl); + m_hImpl = rOther.m_hImpl; + if (m_hImpl) + store_acquireHandle (m_hImpl); + return *this; +} + +inline OStoreStream::OStoreStream (storeStreamHandle Handle) + : m_hImpl (Handle) +{ + if (m_hImpl) + store_acquireHandle (m_hImpl); +} + +inline OStoreStream::operator storeStreamHandle (void) const +{ + return m_hImpl; +} + +inline sal_Bool OStoreStream::isValid (void) const +{ + return (!!m_hImpl); +} + +inline storeError OStoreStream::create ( + storeFileHandle hFile, + const rtl::OUString &rPath, + const rtl::OUString &rName, + storeAccessMode eMode) +{ + if (m_hImpl) + { + store_releaseHandle (m_hImpl); + m_hImpl = 0; + } + return store_openStream ( + hFile, rPath.pData, rName.pData, eMode, &m_hImpl); +} + +inline void OStoreStream::close (void) +{ + if (m_hImpl) + { + store_closeStream (m_hImpl); + m_hImpl = 0; + } +} + +inline storeError OStoreStream::readAt ( + sal_uInt32 nOffset, + void *pBuffer, + sal_uInt32 nBytes, + sal_uInt32 &rnDone) +{ + if (!m_hImpl) + return store_E_InvalidHandle; + + return store_readStream ( + m_hImpl, nOffset, pBuffer, nBytes, &rnDone); +} + +inline storeError OStoreStream::writeAt ( + sal_uInt32 nOffset, + const void *pBuffer, + sal_uInt32 nBytes, + sal_uInt32 &rnDone) +{ + if (!m_hImpl) + return store_E_InvalidHandle; + + return store_writeStream ( + m_hImpl, nOffset, pBuffer, nBytes, &rnDone); +} + +inline storeError OStoreStream::flush (void) const +{ + if (!m_hImpl) + return store_E_InvalidHandle; + + return store_flushStream (m_hImpl); +} + +inline storeError OStoreStream::getSize (sal_uInt32 &rnSize) const +{ + if (!m_hImpl) + return store_E_InvalidHandle; + + return store_getStreamSize (m_hImpl, &rnSize); +} + +inline storeError OStoreStream::setSize (sal_uInt32 nSize) +{ + if (!m_hImpl) + return store_E_InvalidHandle; + + return store_setStreamSize (m_hImpl, nSize); +} + +/*======================================================================== + * + * OStoreDirectory implementation. + * + *======================================================================*/ +inline OStoreDirectory::OStoreDirectory (void) + : m_hImpl (0) +{ +} + +inline OStoreDirectory::~OStoreDirectory (void) +{ + if (m_hImpl) + store_releaseHandle (m_hImpl); +} + +inline OStoreDirectory::OStoreDirectory (const OStoreDirectory& rOther) + : m_hImpl (rOther.m_hImpl) +{ + if (m_hImpl) + store_acquireHandle (m_hImpl); +} + +inline OStoreDirectory& +OStoreDirectory::operator= (const OStoreDirectory& rOther) +{ + if (m_hImpl) + store_releaseHandle (m_hImpl); + m_hImpl = rOther.m_hImpl; + if (m_hImpl) + store_acquireHandle (m_hImpl); + return *this; +} + +inline OStoreDirectory::OStoreDirectory (storeDirectoryHandle Handle) + : m_hImpl (Handle) +{ + if (m_hImpl) + store_acquireHandle (m_hImpl); +} + +inline OStoreDirectory::operator storeDirectoryHandle (void) const +{ + return m_hImpl; +} + +inline sal_Bool OStoreDirectory::isValid (void) const +{ + return (!!m_hImpl); +} + +inline storeError OStoreDirectory::create ( + storeFileHandle hFile, + const rtl::OUString &rPath, + const rtl::OUString &rName, + storeAccessMode eMode) +{ + if (m_hImpl) + { + store_releaseHandle (m_hImpl); + m_hImpl = 0; + } + return store_openDirectory ( + hFile, rPath.pData, rName.pData, eMode, &m_hImpl); +} + +inline void OStoreDirectory::close (void) +{ + if (m_hImpl) + { + store_closeDirectory (m_hImpl); + m_hImpl = 0; + } +} + +inline storeError OStoreDirectory::first (iterator& it) +{ + if (!m_hImpl) + return store_E_InvalidHandle; + + return store_findFirst (m_hImpl, &it); +} + +inline storeError OStoreDirectory::next (iterator& it) +{ + if (!m_hImpl) + return store_E_InvalidHandle; + + return store_findNext (m_hImpl, &it); +} + +inline storeError OStoreDirectory::travel (traveller& rTraveller) const +{ + storeError eErrCode = store_E_InvalidHandle; + if (m_hImpl) + { + iterator it; + eErrCode = store_findFirst (m_hImpl, &it); + while ((eErrCode == store_E_None) && rTraveller.visit(it)) + eErrCode = store_findNext (m_hImpl, &it); + } + return eErrCode; +} + +/*======================================================================== + * + * OStoreFile implementation. + * + *======================================================================*/ +inline OStoreFile::OStoreFile (void) + : m_hImpl (0) +{ +} + +inline OStoreFile::~OStoreFile (void) +{ + if (m_hImpl) + store_releaseHandle (m_hImpl); +} + +inline OStoreFile::OStoreFile (const OStoreFile& rOther) + : m_hImpl (rOther.m_hImpl) +{ + if (m_hImpl) + store_acquireHandle (m_hImpl); +} + +inline OStoreFile& OStoreFile::operator= (const OStoreFile& rOther) +{ + if (m_hImpl) + store_releaseHandle (m_hImpl); + m_hImpl = rOther.m_hImpl; + if (m_hImpl) + store_acquireHandle (m_hImpl); + return *this; +} + +inline OStoreFile::OStoreFile (storeFileHandle Handle) + : m_hImpl (Handle) +{ + if (m_hImpl) + store_acquireHandle (m_hImpl); +} + +inline OStoreFile::operator storeFileHandle (void) const +{ + return m_hImpl; +} + +inline sal_Bool OStoreFile::isValid (void) const +{ + return (!!m_hImpl); +} + +inline storeError OStoreFile::create ( + const rtl::OUString &rFilename, + storeAccessMode eAccessMode, + sal_uInt16 nPageSize) +{ + if (m_hImpl) + { + store_releaseHandle (m_hImpl); + m_hImpl = 0; + } + return store_openFile (rFilename.pData, eAccessMode, nPageSize, &m_hImpl); +} + +inline storeError OStoreFile::createInMemory (sal_uInt16 nPageSize) +{ + if (m_hImpl) + { + store_releaseHandle (m_hImpl); + m_hImpl = 0; + } + return store_createMemoryFile (nPageSize, &m_hImpl); +} + +inline void OStoreFile::close (void) +{ + if (m_hImpl) + { + store_closeFile (m_hImpl); + m_hImpl = 0; + } +} + +inline storeError OStoreFile::flush (void) const +{ + if (!m_hImpl) + return store_E_InvalidHandle; + + return store_flushFile (m_hImpl); +} + +inline storeError OStoreFile::getRefererCount (sal_uInt32 &rnRefCount) const +{ + if (!m_hImpl) + return store_E_InvalidHandle; + + return store_getFileRefererCount (m_hImpl, &rnRefCount); +} + +inline storeError OStoreFile::getSize (sal_uInt32 &rnSize) const +{ + if (!m_hImpl) + return store_E_InvalidHandle; + + return store_getFileSize (m_hImpl, &rnSize); +} + +inline storeError OStoreFile::attrib ( + const rtl::OUString &rPath, + const rtl::OUString &rName, + sal_uInt32 nMask1, + sal_uInt32 nMask2, + sal_uInt32 &rnAttrib) +{ + if (!m_hImpl) + return store_E_InvalidHandle; + + return store_attrib ( + m_hImpl, rPath.pData, rName.pData, nMask1, nMask2, &rnAttrib); +} + +inline storeError OStoreFile::attrib ( + const rtl::OUString &rPath, + const rtl::OUString &rName, + sal_uInt32 nMask1, + sal_uInt32 nMask2) +{ + if (!m_hImpl) + return store_E_InvalidHandle; + + return store_attrib ( + m_hImpl, rPath.pData, rName.pData, nMask1, nMask2, NULL); +} + +inline storeError OStoreFile::link ( + const rtl::OUString &rSrcPath, const rtl::OUString &rSrcName, + const rtl::OUString &rDstPath, const rtl::OUString &rDstName) +{ + if (!m_hImpl) + return store_E_InvalidHandle; + + return store_link ( + m_hImpl, + rSrcPath.pData, rSrcName.pData, + rDstPath.pData, rDstName.pData); +} + +inline storeError OStoreFile::symlink ( + const rtl::OUString &rSrcPath, const rtl::OUString &rSrcName, + const rtl::OUString &rDstPath, const rtl::OUString &rDstName) +{ + if (!m_hImpl) + return store_E_InvalidHandle; + + return store_symlink ( + m_hImpl, + rSrcPath.pData, rSrcName.pData, + rDstPath.pData, rDstName.pData); +} + +inline storeError OStoreFile::rename ( + const rtl::OUString &rSrcPath, const rtl::OUString &rSrcName, + const rtl::OUString &rDstPath, const rtl::OUString &rDstName) +{ + if (!m_hImpl) + return store_E_InvalidHandle; + + return store_rename ( + m_hImpl, + rSrcPath.pData, rSrcName.pData, + rDstPath.pData, rDstName.pData); +} + +inline storeError OStoreFile::remove ( + const rtl::OUString &rPath, const rtl::OUString &rName) +{ + if (!m_hImpl) + return store_E_InvalidHandle; + + return store_remove (m_hImpl, rPath.pData, rName.pData); +} + diff --git a/store/inc/store/types.h b/store/inc/store/types.h new file mode 100644 index 000000000000..2024c980e1e9 --- /dev/null +++ b/store/inc/store/types.h @@ -0,0 +1,194 @@ +/************************************************************************* + * + * $RCSfile: types.h,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:18:31 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +#ifndef _STORE_TYPES_H_ +#define _STORE_TYPES_H_ "$Revision: 1.1.1.1 $" + +#ifndef _SAL_TYPES_H_ +#include +#endif + +#ifndef _RTL_USTRING_H_ +#include +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/** PageSize (recommended) default. + * @see store_openFile(). + */ +#define STORE_DEFAULT_PAGESIZE ((sal_uInt16)0x0400) + + +/** PageSize (enforced) limits. + * @see store_openFile(). + */ +#define STORE_MINIMUM_PAGESIZE ((sal_uInt16)0x0200) +#define STORE_MAXIMUM_PAGESIZE ((sal_uInt16)0x8000) + + +/** NameSize (enforced) limit. + * @see any param pName. + * @see store_E_NameTooLong + */ +#define STORE_MAXIMUM_NAMESIZE 256 + + +/** Attributes (predefined). + * @see store_attrib(). + */ +#define STORE_ATTRIB_ISLINK 0x10000000UL +#define STORE_ATTRIB_ISDIR 0x20000000UL +#define STORE_ATTRIB_ISFILE 0x40000000UL + + +/** storeAccessMode. + * @see store_openFile(). + * @see store_openDirectory(). + * @see store_openStream(). + */ +typedef enum +{ + store_AccessCreate, + store_AccessReadCreate, + store_AccessReadWrite, + store_AccessReadOnly, + store_Access_FORCE_EQUAL_SIZE = SAL_MAX_ENUM +} storeAccessMode; + + +/** storeError. + */ +typedef enum +{ + store_E_None = 0, + store_E_AccessViolation, + store_E_LockingViolation, + store_E_CantSeek, + store_E_CantRead, + store_E_CantWrite, + store_E_InvalidAccess, + store_E_InvalidHandle, + store_E_InvalidParameter, + store_E_InvalidChecksum, + store_E_AlreadyExists, + store_E_NotExists, + store_E_NotDirectory, + store_E_NotFile, + store_E_NoMoreFiles, + store_E_NameTooLong, + store_E_OutOfMemory, + store_E_OutOfSpace, + store_E_Pending, + store_E_WrongFormat, + store_E_WrongVersion, + store_E_Unknown, + store_E_FORCE_EQUAL_SIZE = SAL_MAX_ENUM +} storeError; + + +/** storeFindData. + * @see store_findFirst(). + * @see store_findNext(). + */ +typedef struct +{ + /** Name. + * @see m_nLength. + */ + sal_Unicode m_pszName[STORE_MAXIMUM_NAMESIZE]; + + /** Name Length. + * @see m_pszName. + */ + sal_Int32 m_nLength; + + /** Attributes. + * @see store_attrib(). + */ + sal_uInt32 m_nAttrib; + + /** Size. + * @see store_getStreamSize(). + * @see store_setStreamSize(). + */ + sal_uInt32 m_nSize; + + /** Reserved for internal use. + */ + sal_uInt32 m_nReserved; +} storeFindData; + + +/*======================================================================== + * + * The End. + * + *======================================================================*/ + +#ifdef __cplusplus +} +#endif + +#endif /* _STORE_TYPES_H_ */ + diff --git a/store/prj/d.lst b/store/prj/d.lst new file mode 100644 index 000000000000..12834ee9e665 --- /dev/null +++ b/store/prj/d.lst @@ -0,0 +1,8 @@ +mkdir: %_DEST%\inc%_EXT%\store +..\inc\store\*.h %_DEST%\inc%_EXT%\store\*.h +..\inc\store\store.hxx %_DEST%\inc%_EXT%\store\store.hxx +..\inc\store\store.inl %_DEST%\inc%_EXT%\store\store.inl +..\%__SRC%\lib\istore.lib %_DEST%\lib%_EXT%\istore.lib +..\%__SRC%\lib\libsto*.* %_DEST%\lib%_EXT%\libsto*.* +..\%__SRC%\bin\sto*.dll %_DEST%\bin%_EXT%\sto*.dll +..\version.mk %_DEST%\inc%_EXT%\store\version.mk diff --git a/store/source/filelckb.cxx b/store/source/filelckb.cxx new file mode 100644 index 000000000000..7beed1151a9c --- /dev/null +++ b/store/source/filelckb.cxx @@ -0,0 +1,936 @@ +/************************************************************************* + * + * $RCSfile: filelckb.cxx,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:18:31 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +#define _STORE_FILELCKB_CXX_ "$Revision: 1.1.1.1 $" + +#ifndef _SAL_TYPES_H_ +#include +#endif + +#ifndef _OSL_MUTEX_HXX_ +#include +#endif +#ifndef _RTL_STRING_HXX_ +#include +#endif + +#ifndef _STORE_MACROS_HXX_ +#include +#endif +#ifndef _STORE_OBJECT_HXX_ +#include +#endif +#ifndef _STORE_LOCKBYTE_HXX_ +#include +#endif +#ifndef _STORE_FILELCKB_HXX_ +#include +#endif + +#ifndef _STORE_TYPES_H_ +#include +#endif + +#ifdef _USE_NAMESPACE +using namespace rtl; +using namespace store; +#endif + +/*======================================================================== + * + * OFileLockBytes internals. + * + *======================================================================*/ +#ifdef DEBUG +#define inline static +#endif /* DEBUG */ + +/* + * __store_getProcessTextEncoding (@@@, platform specific). + */ +inline rtl_TextEncoding __store_getProcessTextEncoding (void) +{ + rtl_TextEncoding eEncoding; +#if defined(SAL_OS2) + eEncoding = RTL_TEXTENCODING_IBM850; +#elif defined(SAL_UNX) + eEncoding = RTL_TEXTENCODING_ISO_8859_1; +#elif defined(SAL_W32) + eEncoding = RTL_TEXTENCODING_MS_1252; +#else + eEncoding = RTL_TEXTENCODING_ASCII_US; +#endif + return eEncoding; +} + +/* + * __store_memcpy. + */ +#include +inline void __store_memcpy (void *dst, const void *src, sal_uInt32 n) +{ + ::memcpy (dst, src, n); +} + +/* + * __store_errcode_mapping. + */ +struct __store_errcode_mapping_st +{ + sal_uInt32 m_nErrno; + storeError m_nCode; +}; + +static storeError __store_errnoToErrCode (sal_uInt32 nErrno); +#define ERROR_FROM_NATIVE(e) __store_errnoToErrCode((sal_uInt32)(e)) + +/* + * __store_file (basic file I/O; platform specific; inline). + */ +#define store_File_OpenRead 0x01L +#define store_File_OpenWrite 0x02L +#define store_File_OpenNoBuffer 0x04L +#define store_File_OpenNoCreate 0x08L +#define store_File_OpenTruncate 0x10L + +#ifdef __STORE_IO_NATIVE +#undef __STORE_IO_NATIVE +#endif + +#ifdef SAL_OS2 +#include +#endif /* SAL_OS2 */ + +#ifdef SAL_UNX +#include +#endif /* SAL_UNX */ + +#ifdef SAL_W32 +#include +#endif /* SAL_W32 */ + +#ifndef __STORE_IO_NATIVE +#include +#endif /* !_STORE_IO_NATIVE */ + +/* + * __store_errnoToErrCode. + */ +static storeError __store_errnoToErrCode (sal_uInt32 nErrno) +{ + int i, n = sizeof(__store_errcode_map) / sizeof(__store_errcode_map[0]); + for (i = 0; i < n; i++) + { + if (__store_errcode_map[i].m_nErrno == nErrno) + return __store_errcode_map[i].m_nCode; + } + return store_E_Unknown; +} + +#ifdef DEBUG +#ifdef inline +#undef inline +#endif +#define inline +#endif /* DEBUG */ + +/*======================================================================== + * + * OMappingDescriptor_Impl. + * + *======================================================================*/ +struct OMappingDescriptor_Impl +{ + typedef OMappingDescriptor_Impl self; + + /** Representation. + */ + sal_uInt32 m_nOffset; + sal_uInt32 m_nSize; + sal_uInt8 *m_pData; + + /** Construction. + */ + inline OMappingDescriptor_Impl ( + sal_uInt32 nOffset = 0xffffffff, + sal_uInt32 nSize = 0); + + /** Assignment. + */ + inline self& operator= (const self& rDescr); + + /** Comparison. + */ + inline sal_Bool operator== (const self& rDescr) const; + inline sal_Bool operator<= (const self& rDescr) const; + + /** normalize. + */ + inline void normalize ( + sal_uInt32 nAlignment, + sal_uInt32 nSizeLimit); + + /** cleanup. + */ + inline void cleanup (void); + + /** unmap. + */ + inline void unmap (void); + + /** sync. + */ + inline void sync (void); +}; + +/* + * OMappingDescriptor_Impl. + */ +inline OMappingDescriptor_Impl::OMappingDescriptor_Impl ( + sal_uInt32 nOffset, sal_uInt32 nSize) + : m_nOffset (nOffset), + m_nSize (nSize), + m_pData (NULL) +{ +} + +/* + * operator=(). + */ +inline OMappingDescriptor_Impl& +OMappingDescriptor_Impl::operator= (const self& rDescr) +{ + m_nOffset = rDescr.m_nOffset; + m_nSize = rDescr.m_nSize; + m_pData = rDescr.m_pData; + + return *this; +} + +/* + * operator==(). + */ +inline sal_Bool +OMappingDescriptor_Impl::operator== (const self& rDescr) const +{ + return ((m_nOffset == rDescr.m_nOffset) && + (m_nSize == rDescr.m_nSize ) ); +} + +/* + * operator<=(). + */ +inline sal_Bool +OMappingDescriptor_Impl::operator<= (const self& rDescr) const +{ + return ((m_nOffset == rDescr.m_nOffset) && + (m_nSize <= rDescr.m_nSize ) ); +} + +/* + * normalize. + */ +inline void OMappingDescriptor_Impl::normalize ( + sal_uInt32 nAlignment, sal_uInt32 nSizeLimit) +{ + sal_uInt32 nRemain = (m_nSize % nAlignment); + if (nRemain) + m_nSize += (nAlignment - nRemain); + + m_nOffset -= (m_nOffset % nAlignment); + if ((m_nOffset + m_nSize) > nSizeLimit) + m_nSize = nSizeLimit - m_nOffset; +} + +/* + * unmap. + */ +inline void OMappingDescriptor_Impl::unmap (void) +{ + if (m_pData) + { + __store_munmap (m_pData, m_nSize); + m_pData = 0, m_nSize = 0; + } +} + +/* + * sync. + */ +inline void OMappingDescriptor_Impl::sync (void) +{ + if (m_pData) + __store_msync (m_pData, m_nSize); +} + +/* + * cleanup. + */ +inline void OMappingDescriptor_Impl::cleanup (void) +{ + if (m_pData) + { + __store_msync (m_pData, m_nSize); + __store_munmap (m_pData, m_nSize); + m_pData = 0, m_nSize = 0; + } +} + +/*======================================================================== + * + * OFileLockBytes_Impl interface. + * + *======================================================================*/ +#ifdef _USE_NAMESPACE +namespace store { +#endif + +class OFileLockBytes_Impl +{ + HSTORE m_hFile; +#ifdef DEBUG + sal_Char *m_pszFilename; +#endif /* DEBUG */ + sal_Bool m_bMemmap : 1; + sal_Bool m_bWriteable : 1; + + HSTORE m_hMap; // OMappingDescriptor (?) + sal_uInt32 m_nAlignment; // mapping alignment + sal_uInt32 m_nSize; // mapping size + + OMappingDescriptor_Impl m_aDescrOne; // OMemoryDescriptor (?) + OMappingDescriptor_Impl m_aDescrAny; + +public: + OFileLockBytes_Impl (void); + ~OFileLockBytes_Impl (void); + + sal_Bool isValid (void) const { return (!!m_hFile); } + + storeError close (void); + storeError create ( + const sal_Char *pszFilename, + storeAccessMode eAccessMode); + storeError create ( + rtl_uString *pFilename, + storeAccessMode eAccessMode); + + storeError memmap (OMappingDescriptor_Impl &rDescr); + storeError size (void); + + storeError resize (sal_uInt32 nSize); + + storeError readAt ( + sal_uInt32 nOffset, + void *pBuffer, + sal_uInt32 nBytes, + sal_uInt32 &rnDone); + storeError writeAt ( + sal_uInt32 nOffset, + const void *pBuffer, + sal_uInt32 nBytes, + sal_uInt32 &rnDone); + + storeError sync (void); + storeError stat (sal_uInt32 &rnSize); +}; + +#ifdef _USE_NAMESPACE +} +#endif + +/*======================================================================== + * + * OFileLockBytes_Impl (inline) implementation. + * + *======================================================================*/ +/* + * OFileLockBytes_Impl. + */ +inline OFileLockBytes_Impl::OFileLockBytes_Impl (void) + : m_hFile (0), +#ifdef DEBUG + m_pszFilename (0), +#endif /* DEBUG */ + m_bWriteable (sal_False), + m_hMap (0), + m_nSize (0) +{ + m_nAlignment = __store_malign(); + m_bMemmap = (!(m_nAlignment == (sal_uInt32)(-1))); +} + +/* + * ~OFileLockBytes_Impl. + */ +inline OFileLockBytes_Impl::~OFileLockBytes_Impl (void) +{ + if (m_hFile) + { + if (m_hMap) + { + m_aDescrOne.cleanup(); + m_aDescrAny.cleanup(); + + __store_funmap (m_hMap); + m_hMap = 0; + } + + __store_fclose (m_hFile); + m_hFile = 0; + } +#ifdef DEBUG + if (m_pszFilename) + { + ::free (m_pszFilename); + m_pszFilename = 0; + } +#endif /* DEBUG */ +} + +/* + * close. + */ +inline storeError OFileLockBytes_Impl::close (void) +{ + if (m_hFile) + { + if (m_hMap) + { + m_aDescrOne.cleanup(); + m_aDescrAny.cleanup(); + + __store_funmap (m_hMap); + m_hMap = 0; + } + + __store_fclose (m_hFile); + m_hFile = 0; + } + return store_E_None; +} + +/* + * create. + */ +inline storeError OFileLockBytes_Impl::create ( + const sal_Char *pszFilename, storeAccessMode eAccessMode) +{ + if (m_hFile) + { + if (m_hMap) + { + m_aDescrOne.cleanup(); + m_aDescrAny.cleanup(); + + __store_funmap (m_hMap); + m_hMap = 0; + } + + __store_fclose (m_hFile); + m_hFile = 0; + } + + m_bWriteable = (!(eAccessMode == store_AccessReadOnly)); + + sal_uInt32 nMode = store_File_OpenRead; + if (m_bWriteable) + nMode |= store_File_OpenWrite; + else + nMode |= store_File_OpenNoCreate; + + if (eAccessMode == store_AccessCreate) + nMode |= store_File_OpenTruncate; + if (eAccessMode == store_AccessReadWrite) + nMode |= store_File_OpenNoCreate; + + if (m_bMemmap) + nMode |= store_File_OpenNoBuffer; + + storeError eErrCode = __store_fopen (pszFilename, nMode, m_hFile); +#ifdef DEBUG + if (eErrCode == store_E_None) + { + sal_uInt32 nLen = ::strlen (pszFilename); + m_pszFilename = (sal_Char*)(::realloc (m_pszFilename, nLen + 1)); + ::memcpy (m_pszFilename, pszFilename, nLen + 1); + } +#endif /* DEBUG */ + return eErrCode; +} + +inline storeError OFileLockBytes_Impl::create ( + rtl_uString *pFilename, storeAccessMode eAccessMode) +{ + OString aFilename ( + pFilename->buffer, + pFilename->length, + __store_getProcessTextEncoding()); + + return create (aFilename.pData->buffer, eAccessMode); +} + +/* + * memmap. + */ +inline storeError OFileLockBytes_Impl::memmap (OMappingDescriptor_Impl &rDescr) +{ + if (rDescr <= m_aDescrOne) + rDescr = m_aDescrOne; + if (rDescr <= m_aDescrAny) + rDescr = m_aDescrAny; + + if (!rDescr.m_pData) + { + if (rDescr.m_nOffset == 0) + m_aDescrOne.unmap(); + else + m_aDescrAny.unmap(); + + if (!m_hMap) + { + if (m_bWriteable) + m_hMap = __store_fmap_rw (m_hFile); + else + m_hMap = __store_fmap_ro (m_hFile); + if (!m_hMap) + return ERROR_FROM_NATIVE(__store_errno()); + } + + if (m_bWriteable) + rDescr.m_pData = __store_mmap_rw ( + m_hMap, rDescr.m_nOffset, rDescr.m_nSize); + else + rDescr.m_pData = __store_mmap_ro ( + m_hMap, rDescr.m_nOffset, rDescr.m_nSize); + if (!rDescr.m_pData) + return ERROR_FROM_NATIVE(__store_errno()); + + if (rDescr.m_nOffset == 0) + m_aDescrOne = rDescr; + else + m_aDescrAny = rDescr; + } + return store_E_None; +} + +/* + * size. + */ +inline storeError OFileLockBytes_Impl::size (void) +{ + if (!m_hMap) + return __store_fsize (m_hFile, m_nSize); + else + return store_E_None; +} + +/* + * resize. + */ +inline storeError OFileLockBytes_Impl::resize (sal_uInt32 nSize) +{ + storeError eErrCode = size(); + if (eErrCode != store_E_None) + return eErrCode; + + if (nSize != m_nSize) + { + if (m_hMap) + { +#ifdef __STORE_FEATURE_WRITETHROUGH + // Note: file creation slowed down by about 60 percent. + m_aDescrOne.cleanup(); + m_aDescrAny.cleanup(); +#else + m_aDescrOne.unmap(); + m_aDescrAny.unmap(); +#endif /* __STORE_FEATURE_WRITETHROUGH */ + + __store_funmap (m_hMap); + m_hMap = 0; + } + + eErrCode = __store_ftrunc (m_hFile, nSize); + if (eErrCode != store_E_None) + return eErrCode; + + m_nSize = nSize; + } + return store_E_None; +} + +/* + * readAt. + */ +inline storeError OFileLockBytes_Impl::readAt ( + sal_uInt32 nOffset, + void *pBuffer, + sal_uInt32 nBytes, + sal_uInt32 &rnDone) +{ + storeError eErrCode = store_E_None; + if (m_bMemmap) + { + // Memory mapped I/O. + eErrCode = size(); + if (eErrCode != store_E_None) + return eErrCode; + + if (!(nOffset < m_nSize)) + return store_E_None; + + nBytes = VOS_MIN(nOffset + nBytes, m_nSize) - nOffset; + if (!(nBytes > 0)) + return store_E_None; + + OMappingDescriptor_Impl aDescr; + if (m_bWriteable) + aDescr = OMappingDescriptor_Impl (nOffset, nBytes); + else + aDescr = OMappingDescriptor_Impl (0, m_nSize); + aDescr.normalize (m_nAlignment, m_nSize); + + eErrCode = memmap (aDescr); + if (eErrCode != store_E_None) + return eErrCode; + + aDescr.m_pData += (nOffset - aDescr.m_nOffset); + __store_memcpy (pBuffer, aDescr.m_pData, nBytes); + + rnDone = nBytes; + } + else + { + // File I/O. + eErrCode = __store_fseek (m_hFile, nOffset); + if (eErrCode != store_E_None) + return eErrCode; + + eErrCode = __store_fread (m_hFile, pBuffer, nBytes, rnDone); + } + return eErrCode; +} + +/* + * writeAt. + */ +inline storeError OFileLockBytes_Impl::writeAt ( + sal_uInt32 nOffset, + const void *pBuffer, + sal_uInt32 nBytes, + sal_uInt32 &rnDone) +{ + storeError eErrCode = store_E_None; + if (m_bMemmap) + { + // Memory mapped I/O. Determine current size. + eErrCode = size(); + if (eErrCode != store_E_None) + return eErrCode; + + // Check current size. + if (m_nSize < (nOffset + nBytes)) + { + // Extend. + eErrCode = resize (nOffset + nBytes); + if (eErrCode != store_E_None) + return eErrCode; + } + + OMappingDescriptor_Impl aDescr (nOffset, nBytes); + aDescr.normalize (m_nAlignment, m_nSize); + + eErrCode = memmap (aDescr); + if (eErrCode != store_E_None) + return eErrCode; + + aDescr.m_pData += (nOffset - aDescr.m_nOffset); + __store_memcpy (aDescr.m_pData, pBuffer, nBytes); + + rnDone = nBytes; + } + else + { + // File I/O. + eErrCode = __store_fseek (m_hFile, nOffset); + if (eErrCode != store_E_None) + return eErrCode; + + eErrCode = __store_fwrite (m_hFile, pBuffer, nBytes, rnDone); + } + return eErrCode; +} + +/* + * sync. + */ +inline storeError OFileLockBytes_Impl::sync (void) +{ + if (m_bMemmap) + { + // Memory mapped I/O. + m_aDescrOne.sync(); + m_aDescrAny.sync(); + } + else + { + // File I/O. + __store_fsync (m_hFile); + } + return store_E_None; +} + +/* + * stat. + */ +inline storeError OFileLockBytes_Impl::stat (sal_uInt32 &rnSize) +{ + storeError eErrCode = size(); + if (eErrCode == store_E_None) + rnSize = m_nSize; + return eErrCode; +} + +/*======================================================================== + * + * OFileLockBytes implementation. + * + *======================================================================*/ +VOS_IMPLEMENT_CLASSINFO( + VOS_CLASSNAME (OFileLockBytes, store), + VOS_NAMESPACE (OFileLockBytes, store), + VOS_NAMESPACE (OStoreObject, store), + 0); + +/* + * OFileLockBytes. + */ +OFileLockBytes::OFileLockBytes (void) +{ + // Acquire exclusive access. + osl::Guard aGuard (m_aMutex); + m_pImpl = new OFileLockBytes_Impl(); +} + +/* + * ~OFileLockBytes. + */ +OFileLockBytes::~OFileLockBytes (void) +{ + // Acquire exclusive access. + osl::Guard aGuard (m_aMutex); + delete m_pImpl; +} + +/* + * acquire. + */ +NAMESPACE_VOS(IReference)::RefCount +SAL_CALL OFileLockBytes::acquire (void) +{ + return OStoreObject::acquire(); +} + +/* + * release. + */ +NAMESPACE_VOS(IReference)::RefCount +SAL_CALL OFileLockBytes::release (void) +{ + return OStoreObject::release(); +} + +/* + * referenced. + */ +NAMESPACE_VOS(IReference)::RefCount +SAL_CALL OFileLockBytes::referenced (void) const +{ + return OStoreObject::referenced(); +} + +/* + * create. + */ +storeError OFileLockBytes::create ( + rtl_uString *pFilename, + storeAccessMode eAccessMode) +{ + // Acquire exclusive access. + osl::Guard aGuard (m_aMutex); + + if (pFilename) + return m_pImpl->create (pFilename, eAccessMode); + else + return store_E_InvalidParameter; +} + +/* + * readAt. + */ +storeError OFileLockBytes::readAt ( + sal_uInt32 nOffset, + void *pBuffer, + sal_uInt32 nBytes, + sal_uInt32 &rnDone) +{ + // Initialize [out] param. + rnDone = 0; + + // Acquire exclusive access. + osl::Guard aGuard (m_aMutex); + if (m_pImpl->isValid()) + return m_pImpl->readAt (nOffset, pBuffer, nBytes, rnDone); + else + return store_E_InvalidHandle; +} + +/* + * writeAt. + */ +storeError OFileLockBytes::writeAt ( + sal_uInt32 nOffset, + const void *pBuffer, + sal_uInt32 nBytes, + sal_uInt32 &rnDone) +{ + // Initialize [out] param. + rnDone = 0; + + // Acquire exclusive access. + osl::Guard aGuard (m_aMutex); + if (m_pImpl->isValid()) + return m_pImpl->writeAt (nOffset, pBuffer, nBytes, rnDone); + else + return store_E_InvalidHandle; +} + +/* + * flush. + */ +storeError OFileLockBytes::flush (void) +{ + // Acquire exclusive access. + osl::Guard aGuard (m_aMutex); + if (m_pImpl->isValid()) + return m_pImpl->sync(); + else + return store_E_InvalidHandle; +} + +/* + * setSize. + */ +storeError OFileLockBytes::setSize (sal_uInt32 nSize) +{ + // Acquire exclusive access. + osl::Guard aGuard (m_aMutex); + if (m_pImpl->isValid()) + return m_pImpl->resize (nSize); + else + return store_E_InvalidHandle; +} + +/* + * stat. + */ +storeError OFileLockBytes::stat (sal_uInt32 &rnSize) +{ + // Initialize [out] param. + rnSize = 0; + + // Acquire exclusive access. + osl::Guard aGuard (m_aMutex); + if (m_pImpl->isValid()) + return m_pImpl->stat (rnSize); + else + return store_E_InvalidHandle; +} + +/* + * lockRange. + */ +storeError OFileLockBytes::lockRange ( + sal_uInt32 nOffset, sal_uInt32 nBytes) +{ + // Acquire exclusive access. + osl::Guard aGuard (m_aMutex); + if (m_pImpl->isValid()) + return store_E_None; // E_Unsupported + else + return store_E_InvalidHandle; +} + +/* + * unlockRange. + */ +storeError OFileLockBytes::unlockRange ( + sal_uInt32 nOffset, sal_uInt32 nBytes) +{ + // Acquire exclusive access. + osl::Guard aGuard (m_aMutex); + if (m_pImpl->isValid()) + return store_E_None; // E_Unsupported + else + return store_E_InvalidHandle; +} + diff --git a/store/source/makefile.mk b/store/source/makefile.mk new file mode 100644 index 000000000000..9b6d156d9917 --- /dev/null +++ b/store/source/makefile.mk @@ -0,0 +1,107 @@ +#************************************************************************* +# +# $RCSfile: makefile.mk,v $ +# +# $Revision: 1.1.1.1 $ +# +# last change: $Author: hr $ $Date: 2000-09-18 15:18:31 $ +# +# The Contents of this file are made available subject to the terms of +# either of the following licenses +# +# - GNU Lesser General Public License Version 2.1 +# - Sun Industry Standards Source License Version 1.1 +# +# Sun Microsystems Inc., October, 2000 +# +# GNU Lesser General Public License Version 2.1 +# ============================================= +# Copyright 2000 by Sun Microsystems, Inc. +# 901 San Antonio Road, Palo Alto, CA 94303, USA +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License version 2.1, as published by the Free Software Foundation. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, +# MA 02111-1307 USA +# +# +# Sun Industry Standards Source License Version 1.1 +# ================================================= +# The contents of this file are subject to the Sun Industry Standards +# Source License Version 1.1 (the "License"); You may not use this file +# except in compliance with the License. You may obtain a copy of the +# License at http://www.openoffice.org/license.html. +# +# Software provided under this License is provided on an "AS IS" basis, +# WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, +# WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, +# MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. +# See the License for the specific provisions governing your rights and +# obligations concerning the Software. +# +# The Initial Developer of the Original Code is: Sun Microsystems, Inc. +# +# Copyright: 2000 by Sun Microsystems, Inc. +# +# All Rights Reserved. +# +# Contributor(s): _______________________________________ +# +# +# +#************************************************************************* + +PRJ=.. + +PRJNAME=store +TARGET=store + +# --- Settings --- + +.INCLUDE : svpre.mk +.INCLUDE : settings.mk +.INCLUDE : sv.mk + +# --- Files --- + +SLOFILES= \ + $(SLO)$/object.obj \ + $(SLO)$/memlckb.obj \ + $(SLO)$/filelckb.obj \ + $(SLO)$/storbase.obj \ + $(SLO)$/storcach.obj \ + $(SLO)$/stordata.obj \ + $(SLO)$/stordmon.obj \ + $(SLO)$/storlckb.obj \ + $(SLO)$/stortree.obj \ + $(SLO)$/storpage.obj \ + $(SLO)$/store.obj + +.IF "$(debug)" != "" +OBJFILES= \ + $(OBJ)$/object.obj \ + $(OBJ)$/memlckb.obj \ + $(OBJ)$/filelckb.obj \ + $(OBJ)$/storbase.obj \ + $(OBJ)$/storcach.obj \ + $(OBJ)$/stordata.obj \ + $(OBJ)$/stordmon.obj \ + $(OBJ)$/storlckb.obj \ + $(OBJ)$/stortree.obj \ + $(OBJ)$/storpage.obj \ + $(OBJ)$/store.obj +.ENDIF # debug + +# --- Targets --- + +.INCLUDE : target.mk + diff --git a/store/source/memlckb.cxx b/store/source/memlckb.cxx new file mode 100644 index 000000000000..c854179b7cb7 --- /dev/null +++ b/store/source/memlckb.cxx @@ -0,0 +1,396 @@ +/************************************************************************* + * + * $RCSfile: memlckb.cxx,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:18:32 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +#define _STORE_MEMLCKB_CXX_ "$Revision: 1.1.1.1 $" + +#ifndef _SAL_TYPES_H_ +#include +#endif + +#ifndef _RTL_ALLOC_H_ +#include +#endif +#ifndef _RTL_MEMORY_H_ +#include +#endif + +#ifndef _VOS_MUTEX_HXX_ +#include +#endif + +#ifndef _STORE_MACROS_HXX_ +#include +#endif +#ifndef _STORE_OBJECT_HXX_ +#include +#endif +#ifndef _STORE_LOCKBYTE_HXX_ +#include +#endif +#ifndef _STORE_MEMLCKB_HXX_ +#include +#endif + +#ifndef _STORE_TYPES_H_ +#include +#endif + +#ifdef _USE_NAMESPACE +using namespace store; +#endif + +/*======================================================================== + * + * OMemoryLockBytes internals. + * + *======================================================================*/ +#ifdef DEBUG +#ifdef inline +#undef inline +#endif +#define inline +#endif /* DEBUG */ + +/*======================================================================== + * + * OMemoryLockBytes_Impl interface. + * + *======================================================================*/ +#ifdef _USE_NAMESPACE +namespace store { +#endif + +class OMemoryLockBytes_Impl +{ + sal_uInt8 *m_pBuffer; + sal_uInt32 m_nSize; + +public: + OMemoryLockBytes_Impl (void); + ~OMemoryLockBytes_Impl (void); + + storeError resize (sal_uInt32 nSize); + + storeError readAt ( + sal_uInt32 nOffset, + void *pBuffer, + sal_uInt32 nBytes, + sal_uInt32 &rnDone); + storeError writeAt ( + sal_uInt32 nOffset, + const void *pBuffer, + sal_uInt32 nBytes, + sal_uInt32 &rnDone); + + storeError stat (sal_uInt32 &rnSize); +}; + +#ifdef _USE_NAMESPACE +} +#endif + +/*======================================================================== + * + * OMemoryLockBytes_Impl (inline) implementation. + * + *======================================================================*/ +/* + * OMemoryLockBytes_Impl. + */ +inline OMemoryLockBytes_Impl::OMemoryLockBytes_Impl (void) + : m_pBuffer (0), m_nSize (0) +{ +} + +/* + * ~OMemoryLockBytes_Impl. + */ +inline OMemoryLockBytes_Impl::~OMemoryLockBytes_Impl (void) +{ + rtl_freeMemory (m_pBuffer); +} + +/* + * resize. + */ +inline storeError OMemoryLockBytes_Impl::resize (sal_uInt32 nSize) +{ + if (!(nSize == m_nSize)) + { + m_pBuffer = (sal_uInt8*)(rtl_reallocateMemory (m_pBuffer, nSize)); + if (!m_pBuffer) + { + m_nSize = 0; + if (nSize > 0) + return store_E_OutOfMemory; + else + return store_E_None; + } + + if (nSize > m_nSize) + rtl_zeroMemory (m_pBuffer + m_nSize, nSize - m_nSize); + m_nSize = nSize; + } + return store_E_None; +} + +/* + * readAt. + */ +inline storeError OMemoryLockBytes_Impl::readAt ( + sal_uInt32 nOffset, + void *pBuffer, + sal_uInt32 nBytes, + sal_uInt32 &rnDone) +{ + if (m_pBuffer) + { + if (!(nOffset < m_nSize)) + return store_E_None; + + nBytes = VOS_MIN(nOffset + nBytes, m_nSize) - nOffset; + if (!(nBytes > 0)) + return store_E_None; + + rtl_copyMemory (pBuffer, m_pBuffer + nOffset, nBytes); + rnDone = nBytes; + } + return store_E_None; +} + +/* + * writeAt. + */ +inline storeError OMemoryLockBytes_Impl::writeAt ( + sal_uInt32 nOffset, + const void *pBuffer, + sal_uInt32 nBytes, + sal_uInt32 &rnDone) +{ + if (m_nSize < (nOffset + nBytes)) + { + storeError eErrCode = resize (nOffset + nBytes); + if (eErrCode != store_E_None) + return eErrCode; + } + + rtl_copyMemory (m_pBuffer + nOffset, pBuffer, nBytes); + rnDone = nBytes; + + return store_E_None; +} + +/* + * stat. + */ +inline storeError OMemoryLockBytes_Impl::stat (sal_uInt32 &rnSize) +{ + rnSize = m_nSize; + return store_E_None; +} + +/*======================================================================== + * + * OMemoryLockBytes implementation. + * + *======================================================================*/ +VOS_IMPLEMENT_CLASSINFO( + VOS_CLASSNAME (OMemoryLockBytes, store), + VOS_NAMESPACE (OMemoryLockBytes, store), + VOS_NAMESPACE (OStoreObject, store), + 0); + +/* + * OMemoryLockBytes. + */ +OMemoryLockBytes::OMemoryLockBytes (void) +{ + // Acquire exclusive access. + NAMESPACE_VOS(OGuard) aGuard (m_aMutex); + m_pImpl = new OMemoryLockBytes_Impl(); +} + +/* + * ~OMemoryLockBytes. + */ +OMemoryLockBytes::~OMemoryLockBytes (void) +{ + // Acquire exclusive access. + NAMESPACE_VOS(OGuard) aGuard (m_aMutex); + delete m_pImpl; +} + +/* + * acquire. + */ +NAMESPACE_VOS(IReference)::RefCount +SAL_CALL OMemoryLockBytes::acquire (void) +{ + return OStoreObject::acquire(); +} + +/* + * release. + */ +NAMESPACE_VOS(IReference)::RefCount +SAL_CALL OMemoryLockBytes::release (void) +{ + return OStoreObject::release(); +} + +/* + * referenced. + */ +NAMESPACE_VOS(IReference)::RefCount +SAL_CALL OMemoryLockBytes::referenced (void) const +{ + return OStoreObject::referenced(); +} + +/* + * readAt. + */ +storeError OMemoryLockBytes::readAt ( + sal_uInt32 nOffset, + void *pBuffer, + sal_uInt32 nBytes, + sal_uInt32 &rnDone) +{ + // Initialize [out] param. + rnDone = 0; + + // Acquire exclusive access. + NAMESPACE_VOS(OGuard) aGuard (m_aMutex); + return m_pImpl->readAt (nOffset, pBuffer, nBytes, rnDone); +} + +/* + * writeAt. + */ +storeError OMemoryLockBytes::writeAt ( + sal_uInt32 nOffset, + const void *pBuffer, + sal_uInt32 nBytes, + sal_uInt32 &rnDone) +{ + // Initialize [out] param. + rnDone = 0; + + // Acquire exclusive access. + NAMESPACE_VOS(OGuard) aGuard (m_aMutex); + return m_pImpl->writeAt (nOffset, pBuffer, nBytes, rnDone); +} + +/* + * flush. + */ +storeError OMemoryLockBytes::flush (void) +{ + // Acquire exclusive access. + NAMESPACE_VOS(OGuard) aGuard (m_aMutex); + return store_E_None; +} + +/* + * setSize. + */ +storeError OMemoryLockBytes::setSize (sal_uInt32 nSize) +{ + // Acquire exclusive access. + NAMESPACE_VOS(OGuard) aGuard (m_aMutex); + return m_pImpl->resize (nSize); +} + +/* + * stat. + */ +storeError OMemoryLockBytes::stat (sal_uInt32 &rnSize) +{ + // Initialize [out] param. + rnSize = 0; + + // Acquire exclusive access. + NAMESPACE_VOS(OGuard) aGuard (m_aMutex); + return m_pImpl->stat (rnSize); +} + +/* + * lockRange. + */ +storeError OMemoryLockBytes::lockRange ( + sal_uInt32 nOffset, sal_uInt32 nBytes) +{ + // Acquire exclusive access. + NAMESPACE_VOS(OGuard) aGuard (m_aMutex); + return store_E_None; // E_Unsupported +} + +/* + * unlockRange. + */ +storeError OMemoryLockBytes::unlockRange ( + sal_uInt32 nOffset, sal_uInt32 nBytes) +{ + // Acquire exclusive access. + NAMESPACE_VOS(OGuard) aGuard (m_aMutex); + return store_E_None; // E_Unsupported +} + diff --git a/store/source/object.cxx b/store/source/object.cxx new file mode 100644 index 000000000000..ac392409eef7 --- /dev/null +++ b/store/source/object.cxx @@ -0,0 +1,103 @@ +/************************************************************************* + * + * $RCSfile: object.cxx,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:18:32 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +#define _STORE_OBJECT_CXX_ "$Revision: 1.1.1.1 $" + +#ifndef _SAL_TYPES_H_ +#include +#endif + +#ifndef _STORE_MACROS_HXX_ +#include +#endif +#ifndef _STORE_OBJECT_HXX_ +#include +#endif + +#ifdef _USE_NAMESPACE +using namespace store; +#endif + +/*======================================================================== + * + * OStoreObject implementation. + * + *======================================================================*/ +VOS_IMPLEMENT_CLASSINFO( + VOS_CLASSNAME (OStoreObject, store), + VOS_NAMESPACE (OStoreObject, store), + VOS_NAMESPACE (OObject, vos), + 0); + +/* + * OStoreObject. + */ +OStoreObject::OStoreObject (void) +{ +} + +/* + * ~OStoreObject. + */ +OStoreObject::~OStoreObject (void) +{ +} + diff --git a/store/source/storbase.cxx b/store/source/storbase.cxx new file mode 100644 index 000000000000..44c1ec32a4f2 --- /dev/null +++ b/store/source/storbase.cxx @@ -0,0 +1,1944 @@ +/************************************************************************* + * + * $RCSfile: storbase.cxx,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:18:32 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +#define _STORE_STORBASE_CXX_ "$Revision: 1.1.1.1 $" + +#ifndef __STL_USE_NEWALLOC +#define __STL_USE_NEWALLOC 1 +#endif +#ifndef __UTILITY__ +#include +#endif +#ifndef __HASH_MAP__ +#include +#endif + +#ifndef _SAL_TYPES_H_ +#include +#endif + +#ifndef _RTL_ALLOC_H_ +#include +#endif +#ifndef _RTL_MEMORY_H_ +#include +#endif + +#ifndef _VOS_DIAGNOSE_HXX_ +#include +#endif +#ifndef _VOS_MUTEX_HXX_ +#include +#endif +#ifndef _VOS_REF_HXX_ +#include +#endif + +#ifndef _STORE_TYPES_H_ +#include +#endif +#ifndef _STORE_MACROS_HXX_ +#include +#endif +#ifndef _STORE_OBJECT_HXX_ +#include +#endif +#ifndef _STORE_LOCKBYTE_HXX_ +#include +#endif + +#ifndef _STORE_STORBASE_HXX_ +#include +#endif + +#ifdef _USE_NAMESPACE +using namespace store; +#endif + +/*======================================================================== + * + * OStorePageGuard. + * + *======================================================================*/ +/* + * CRC polynomial 0xEDB88320. + */ +const sal_uInt32 NAMESPACE_STORE(OStorePageGuard)::m_pTable[] = +{ + /* 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 +}; + +/* + * crc32. + */ +sal_uInt32 OStorePageGuard::crc32 ( + sal_uInt32 nCRC32, const void *pData, sal_uInt32 nSize) +{ + if (pData) + { + register const sal_uInt8 *p = (const sal_uInt8*)pData; + register const sal_uInt8 *q = p + nSize; + + nCRC32 = ~nCRC32; + while (p < q) + nCRC32 = updcrc32 (nCRC32, *(p++)); + nCRC32 = ~nCRC32; + } + return nCRC32; +} + +/*======================================================================== + * + * OStorePageObject. + * + *======================================================================*/ +/* + * ~OStorePageObject. + */ +OStorePageObject::~OStorePageObject (void) +{ +} + +/* + * swap. + */ +void OStorePageObject::swap (const D& rDescr) +{ +#ifdef OSL_BIGENDIAN + m_rPage.swap (rDescr); +#endif /* OSL_BIGENDIAN */ +} + +/* + * guard. + */ +void OStorePageObject::guard (const D& rDescr) +{ + m_rPage.guard (rDescr); +} + +/* + * verify. + */ +storeError OStorePageObject::verify (const D& rDescr) +{ + return m_rPage.verify (rDescr); +} + +/*======================================================================== + * + * OStoreSuperBlock. + * + *======================================================================*/ +#define STORE_MAGIC_SUPERBLOCK 0x484D5343UL + +struct OStoreSuperBlock +{ + typedef OStorePageGuard G; + typedef OStorePageDescriptor D; + typedef OStorePageLink L; + + /** Representation. + */ + G m_aGuard; + D m_aDescr; + sal_uInt32 m_nMarked; + L m_aMarked; + sal_uInt32 m_nUnused; + L m_aUnused; + + /** size. + */ + static sal_uInt16 size (void) + { + return (sizeof(G) + sizeof(D) + 2 * (sizeof(L) + sizeof(sal_uInt32))); + } + + /** Construction. + */ + OStoreSuperBlock (void) + : m_aGuard (STORE_MAGIC_SUPERBLOCK), + m_nMarked (0), + m_aMarked (0), + m_nUnused (0), + m_aUnused (0) + {} + + OStoreSuperBlock (const OStoreSuperBlock& rOther) + : m_aGuard (rOther.m_aGuard), + m_aDescr (rOther.m_aDescr), + m_nMarked (rOther.m_nMarked), + m_aMarked (rOther.m_aMarked), + m_nUnused (rOther.m_nUnused), + m_aUnused (rOther.m_aUnused) + {} + + OStoreSuperBlock& operator= (const OStoreSuperBlock& rOther) + { + m_aGuard = rOther.m_aGuard; + m_aDescr = rOther.m_aDescr; + m_nMarked = rOther.m_nMarked; + m_aMarked = rOther.m_aMarked; + m_nUnused = rOther.m_nUnused; + m_aUnused = rOther.m_aUnused; + return *this; + } + + /** Comparison. + */ + sal_Bool operator== (const OStoreSuperBlock& rOther) const + { + return ((m_aGuard == rOther.m_aGuard ) && + (m_aDescr == rOther.m_aDescr ) && + (m_nMarked == rOther.m_nMarked) && + (m_aMarked == rOther.m_aMarked) && + (m_nUnused == rOther.m_nUnused) && + (m_aUnused == rOther.m_aUnused) ); + } + + /** create. + */ + void create (const D& rDescr) + { + m_aGuard = G(STORE_MAGIC_SUPERBLOCK); + m_aDescr = rDescr; + + m_nMarked = 0; + m_aMarked = L(0); + + m_nUnused = 0; + m_aUnused = L(0); + } + + /** unused(Count|Head|Insert|Remove|Reset). + */ + sal_uInt32 unusedCount (void) const + { + return m_nUnused; + } + const L& unusedHead (void) const + { + return m_aUnused; + } + void unusedInsert (const L& rLink) + { + m_nUnused++; + m_aUnused = rLink; + } + void unusedRemove (const L& rLink) + { + m_nUnused--; + m_aUnused = rLink; + } + void unusedReset (void) + { + m_nUnused = 0; + m_aUnused = L(0); + } + + /** swap (internal and external representation). + */ + void swap (void) + { +#ifdef OSL_BIGENDIAN + m_aGuard.swap(); + m_aDescr.swap(); + + m_nMarked = VOS_SWAPDWORD(m_nMarked); + m_aMarked.swap(); + + m_nUnused = VOS_SWAPDWORD(m_nUnused); + m_aUnused.swap(); +#endif /* OSL_BIGENDIAN */ + } + + /** guard (external representation). + */ + void guard (void) + { + sal_uInt32 nCRC32 = 0; + nCRC32 = G::crc32 (nCRC32, &m_aGuard.m_nMagic, sizeof(sal_uInt32)); + nCRC32 = G::crc32 (nCRC32, &m_aDescr, size() - sizeof(G)); +#ifdef OSL_BIGENDIAN + nCRC32 = VOS_SWAPDWORD(nCRC32); +#endif /* OSL_BIGENDIAN */ + m_aGuard.m_nCRC32 = nCRC32; + } + + /** verify (external representation). + */ + storeError verify (void) + { + sal_uInt32 nMagic = m_aGuard.m_nMagic; +#ifdef OSL_BIGENDIAN + nMagic = VOS_SWAPDWORD(nMagic); +#endif /* OSL_BIGENDIAN */ + if (nMagic != STORE_MAGIC_SUPERBLOCK) + store_E_WrongFormat; + + sal_uInt32 nCRC32 = 0; + nCRC32 = G::crc32 (nCRC32, &m_aGuard.m_nMagic, sizeof(sal_uInt32)); + nCRC32 = G::crc32 (nCRC32, &m_aDescr, size() - sizeof(G)); +#ifdef OSL_BIGENDIAN + nCRC32 = VOS_SWAPDWORD(nCRC32); +#endif /* OSL_BIGENDIAN */ + if (m_aGuard.m_nCRC32 != nCRC32) + return store_E_InvalidChecksum; + else + return store_E_None; + } +}; + +/*======================================================================== + * + * OStoreStateBlock. + * + *======================================================================*/ +struct OStoreStateBlock +{ + enum StateBits + { + STATE_CLEAN = 0, + STATE_CLOSE_WAIT = 1, + STATE_FLUSH_WAIT = 2 + }; + + /** Representation. + */ + sal_uInt32 m_nState; + + /** size. + */ + static sal_uInt16 size (void) + { + return sizeof(sal_uInt32); + } + + /** Construction. + */ + OStoreStateBlock (void) + : m_nState (STATE_CLEAN) + {} + + /** swap (internal and external representation). + */ + void swap (void) + { +#ifdef OSL_BIGENDIAN + m_nState = VOS_SWAPDWORD(m_nState); +#endif /* OSL_BIGENDIAN */ + } + + /** Operation. + */ + sal_Bool closePending (void) const + { + return ((m_nState & STATE_CLOSE_WAIT) ? 1 : 0); + } + void closed (void) + { + m_nState &= ~STATE_CLOSE_WAIT; + } + + sal_Bool flushPending (void) const + { + return ((m_nState & STATE_FLUSH_WAIT) ? 1 : 0); + } + void flushed (void) + { + m_nState &= ~STATE_FLUSH_WAIT; + } + + void modified (void) + { + m_nState |= (STATE_CLOSE_WAIT | STATE_FLUSH_WAIT); + } + void clean (void) + { + m_nState &= ~(STATE_CLOSE_WAIT | STATE_FLUSH_WAIT); + } +}; + +/*======================================================================== + * + * OStoreSuperBlockPage interface. + * + *======================================================================*/ +#ifdef _USE_NAMESPACE +namespace store { +#endif + +struct OStoreSuperBlockPage +{ + typedef OStoreSuperBlock SuperBlock; + typedef OStoreStateBlock StateBlock; + + /** Representation. + */ + SuperBlock m_aSuperOne; + SuperBlock m_aSuperTwo; + StateBlock m_aState; + + /** size. + */ + static sal_uInt16 size (void) + { + return (2 * SuperBlock::size() + StateBlock::size()); + } + + /** Construction. + */ + OStoreSuperBlockPage (void) + {} + + /** swap (internal and external representation). + */ + void swap (void) + { +#ifdef OSL_BIGENDIAN + m_aSuperOne.swap(); + m_aSuperTwo.swap(); + m_aState.swap(); +#endif /* OSL_BIGENDIAN */ + } + + /** load (w/o verification). + */ + storeError load (OStorePageBIOS &rBIOS) + { + // Read. + storeError eErrCode = rBIOS.read (0, this, size()); + +#ifdef OSL_BIGENDIAN + // Swap to internal representation. + swap(); +#endif /* OSL_BIGENDIAN */ + + // Done. + return eErrCode; + } + + /** save. + */ + storeError save (OStorePageBIOS &rBIOS) + { +#ifdef OSL_BIGENDIAN + // Swap to external representation. + swap(); +#endif /* OSL_BIGENDIAN */ + + // Guard. + m_aSuperOne.guard(); + m_aSuperTwo.guard(); + + // Write. + storeError eErrCode = rBIOS.write (0, this, size()); + +#ifdef OSL_BIGENDIAN + // Swap back to internal representation. + swap(); +#endif /* OSL_BIGENDIAN */ + + // Done. + return eErrCode; + } + + /** create. + */ + storeError create ( + OStorePageBIOS &rBIOS, + const OStorePageDescriptor &rDescr); + + /** close. + */ + storeError close ( + OStorePageBIOS &rBIOS); + + /** flush. + */ + storeError flush ( + OStorePageBIOS &rBIOS); + + /** modified. + */ + storeError modified ( + OStorePageBIOS &rBIOS); + + /** verify (with repair). + */ + storeError verify ( + OStorePageBIOS &rBIOS); +}; + +#ifdef _USE_NAMESPACE +} +#endif + +/*======================================================================== + * + * OStoreSuperBlockPage implementation. + * + *======================================================================*/ +/* + * create. + */ +storeError OStoreSuperBlockPage::create ( + OStorePageBIOS &rBIOS, + const OStorePageDescriptor &rDescr) +{ + // Setup initial Page. + void *p = rtl_allocateMemory (rDescr.m_nSize); + rtl_zeroMemory (p, rDescr.m_nSize); + + // Mark as modified. + m_aState.modified(); + + // Write initial Page. + storeError eErrCode = rBIOS.write (0, p, rDescr.m_nSize); + if (eErrCode == store_E_None) + { + // Setup 1st and 2nd SuperBlock copy. + m_aSuperOne.create (rDescr); + m_aSuperTwo = m_aSuperOne; + + // Mark as modified. + m_aState.modified(); + + // Save. + eErrCode = save (rBIOS); + } + + // Cleanup and finish. + rtl_freeMemory (p); + return eErrCode; +} + +/* + * close. + */ +storeError OStoreSuperBlockPage::close (OStorePageBIOS &rBIOS) +{ + storeError eErrCode = store_E_None; + if (m_aState.closePending()) + { + // Mark as modified. + m_aState.modified(); + + // Check access mode. + if (rBIOS.isWriteable()) + { + // Save StateBlock. + StateBlock aState (m_aState); + + // Mark as clean. + aState.clean(); + +#ifdef OSL_BIGENDIAN + // Swap to external representation. + aState.swap(); +#endif /* OSL_BIGENDIAN */ + + // Write behind SuperBlock. + sal_uInt32 nAddr = 2 * SuperBlock::size(); + eErrCode = rBIOS.write (nAddr, &aState, StateBlock::size()); + } + + // Mark as clean. + m_aState.clean(); + } + return eErrCode; +} + +/* + * flush. + */ +storeError OStoreSuperBlockPage::flush (OStorePageBIOS &rBIOS) +{ + storeError eErrCode = store_E_None; + if (m_aState.flushPending()) + { + // Check access mode. + if (rBIOS.isWriteable()) + { + // Save StateBlock. + StateBlock aState (m_aState); + + // Mark as flushed. + aState.flushed(); + +#ifdef OSL_BIGENDIAN + // Swap to external representation. + aState.swap(); +#endif /* OSL_BIGENDIAN */ + + // Write behind SuperBlock. + sal_uInt32 nAddr = 2 * SuperBlock::size(); + eErrCode = rBIOS.write (nAddr, &aState, StateBlock::size()); + } + + // Mark as flushed. + m_aState.flushed(); + } + return eErrCode; +} + +/* + * modified. + */ +storeError OStoreSuperBlockPage::modified (OStorePageBIOS &rBIOS) +{ + storeError eErrCode = store_E_None; + if (!m_aState.flushPending()) + { + // Mark as modified. + m_aState.modified(); + + // Check access mode. + if (rBIOS.isWriteable()) + { + // Save StateBlock. + StateBlock aState (m_aState); + +#ifdef OSL_BIGENDIAN + // Swap to external representation. + aState.swap(); +#endif /* OSL_BIGENDIAN */ + + // Write behind SuperBlock. + sal_uInt32 nAddr = 2 * SuperBlock::size(); + eErrCode = rBIOS.write (nAddr, &aState, StateBlock::size()); + } + } + return eErrCode; +} + +/* + * verify (with repair). + */ +storeError OStoreSuperBlockPage::verify (OStorePageBIOS &rBIOS) +{ +#ifdef OSL_BIGENDIAN + // Swap to external representation. + swap(); +#endif /* OSL_BIGENDIAN */ + + // Verify 1st copy. + storeError eErrCode = m_aSuperOne.verify(); + if (eErrCode == store_E_None) + { + // Ok. Verify 2nd copy. + eErrCode = m_aSuperTwo.verify(); + if (eErrCode == store_E_None) + { + // Ok. Ensure identical copies (1st copy wins). + if (!(m_aSuperOne == m_aSuperTwo)) + { + // Different. Replace 2nd copy with 1st copy. + m_aSuperTwo = m_aSuperOne; + + // Write back. + if (rBIOS.isWriteable()) + eErrCode = rBIOS.write (0, this, size()); + else + eErrCode = store_E_None; + } + } + else + { + // Failure. Replace 2nd copy with 1st copy. + m_aSuperTwo = m_aSuperOne; + + // Write back. + if (rBIOS.isWriteable()) + eErrCode = rBIOS.write (0, this, size()); + else + eErrCode = store_E_None; + } + } + else + { + // Failure. Verify 2nd copy. + eErrCode = m_aSuperTwo.verify(); + if (eErrCode == store_E_None) + { + // Ok. Replace 1st copy with 2nd copy. + m_aSuperOne = m_aSuperTwo; + + // Write back. + if (rBIOS.isWriteable()) + eErrCode = rBIOS.write (0, this, size()); + else + eErrCode = store_E_None; + } + else + { + // Double Failure. + VOS_TRACE("OStoreSuperBlockPage::verify(): double failure.\n"); + } + } + +#ifdef OSL_BIGENDIAN + // Swap back to internal representation. + swap(); +#endif /* OSL_BIGENDIAN */ + + // Done. + return eErrCode; +} + +/*======================================================================== + * + * OStorePageACL. + * + *======================================================================*/ +typedef sal_uInt32 key_type; +typedef sal_uInt32 val_type; + +typedef NAMESPACE_STD(hash) key_hash; +typedef NAMESPACE_STD(equal_to) key_cmp; + +typedef NAMESPACE_STD(hash_map) + map_type; + +#ifdef _USE_NAMESPACE +namespace store { +#endif + +struct OStorePageACL : public map_type +{ + /** Representation. + */ + sal_uInt32 m_nRefCount; + + /** Construction. + */ + OStorePageACL (void) + : m_nRefCount (0) + {} +}; + +#ifdef _USE_NAMESPACE +} +#endif + +/*======================================================================== + * + * OStorePageBIOS implementation. + * + *======================================================================*/ +VOS_IMPLEMENT_CLASSINFO( + VOS_CLASSNAME (OStorePageBIOS, store), + VOS_NAMESPACE (OStorePageBIOS, store), + VOS_NAMESPACE (OStoreObject, store), + 0); + +/* + * OStorePageBIOS. + */ +OStorePageBIOS::OStorePageBIOS (void) + : m_xLockBytes (NULL), + m_pAcl (NULL), + m_pSuper (NULL), + m_bModified (sal_False), + m_bWriteable (sal_False) +{ +} + +/* + * ~OStorePageBIOS. + */ +OStorePageBIOS::~OStorePageBIOS (void) +{ + OStorePageBIOS::close(); +} + +/* + * verify (SuperBlock with repair). + * Internal: Precond: initialized, exclusive access. + */ +storeError OStorePageBIOS::verify (SuperPage *&rpSuper) +{ + // Check SuperBlock page allocation. + if (rpSuper == NULL) + { + // Allocate. + rpSuper = new SuperPage(); + + // Load (w/o verification). + storeError eErrCode = rpSuper->load (*this); + if (eErrCode != store_E_None) + { + // Cleanup and fail. + __STORE_DELETEZ (rpSuper); + return eErrCode; + } + + // Check SuperBlock state. + if (rpSuper->m_aState.closePending()) + VOS_TRACE("OStorePageBIOS::verify(): close pending.\n"); + + if (rpSuper->m_aState.flushPending()) + VOS_TRACE("OStorePageBIOS::verify(): flush pending.\n"); + } + + // Verify SuperBlock page (with repair). + return rpSuper->verify (*this); +} + +/* + * repair (SuperBlock). + * Internal: Precond: initialized, exclusive access. + */ +storeError OStorePageBIOS::repair (SuperPage *&rpSuper) +{ + // Acquire Lock. + storeError eErrCode = acquireLock (0, SuperPage::size()); + if (eErrCode != store_E_None) + return eErrCode; + + // Verify SuperBlock page (with repair). + eErrCode = verify (rpSuper); + if (eErrCode != store_E_None) + { + // Failure. + releaseLock (0, SuperPage::size()); + return eErrCode; + } + + // ReleaseLock. + return releaseLock (0, SuperPage::size()); +} + +/* + * initialize. + * Precond: none. + */ +storeError OStorePageBIOS::initialize ( + ILockBytes *pLockBytes, + storeAccessMode eAccessMode) +{ + // Acquire exclusive access. + NAMESPACE_VOS(OGuard) aGuard (m_aMutex); + + // Check arguments. + storeError eErrCode = store_E_InvalidParameter; + if (pLockBytes) + { + // Cleanup. + __STORE_DELETEZ (m_pAcl); + __STORE_DELETEZ (m_pSuper); + + // Initialize. + m_xLockBytes = pLockBytes; + m_bModified = sal_False; + m_bWriteable = (!(eAccessMode == store_AccessReadOnly)); + + // Check access mode. + if (!(eAccessMode == store_AccessCreate)) + { + // Verify (repair) SuperBlock page. + if (!(eAccessMode == store_AccessReadOnly)) + eErrCode = repair (m_pSuper); + else + eErrCode = verify (m_pSuper); + if (eErrCode != store_E_None) + return eErrCode; + + // Obtain modified state. + m_bModified = m_pSuper->m_aState.flushPending(); + } + else + { + // Truncate to zero length. + eErrCode = m_xLockBytes->setSize(0); + if (eErrCode != store_E_None) + return eErrCode; + + // Commit. + eErrCode = m_xLockBytes->flush(); + if (eErrCode != store_E_None) + return eErrCode; + + // Mark not existent. + eErrCode = store_E_NotExists; + } + } + return eErrCode; +} + +/* + * create (SuperBlock). + * Precond: initialized, writeable (store_AccessCreate). + */ +storeError OStorePageBIOS::create (sal_uInt16 nPageSize) +{ + // Acquire exclusive access. + NAMESPACE_VOS(OGuard) aGuard (m_aMutex); + + // Check precond. + if (!m_xLockBytes.isValid()) + return store_E_InvalidAccess; + if (!m_bWriteable) + return store_E_AccessViolation; + + // Check PageSize. + sal_uInt16 nMinSize = SuperPage::size(); + nMinSize = VOS_MAX(nMinSize, STORE_MINIMUM_PAGESIZE); + + nPageSize = VOS_MAX(nPageSize, nMinSize); + nPageSize = VOS_MIN(nPageSize, STORE_MAXIMUM_PAGESIZE); + + sal_uInt16 nRemSize = nPageSize % nMinSize; + if (nRemSize) + nPageSize += (nMinSize - nRemSize); + + // Acquire Lock. + storeError eErrCode = acquireLock (0, SuperPage::size()); + if (eErrCode != store_E_None) + return eErrCode; + + // Check SuperBlock page allocation. + if (m_pSuper == NULL) + m_pSuper = new SuperPage(); + + // Create SuperBlock page. + eErrCode = m_pSuper->create ( + *this, OStorePageDescriptor (nPageSize, nPageSize, nMinSize)); + if (eErrCode != store_E_None) + { + // Cleanup and fail. + __STORE_DELETEZ (m_pSuper); + releaseLock (0, SuperPage::size()); + return eErrCode; + } + + // Flush SuperBlock page. + eErrCode = m_pSuper->flush (*this); + if (eErrCode != store_E_None) + { + // Cleanup and fail. + __STORE_DELETEZ (m_pSuper); + releaseLock (0, SuperPage::size()); + return eErrCode; + } + + // Commit. + eErrCode = m_xLockBytes->flush(); + VOS_POSTCOND( + eErrCode == store_E_None, + "OStorePageBIOS::create(): flush failed"); + if (eErrCode == store_E_None) + { + // Mark not modified. + m_bModified = sal_False; + } + + // Release Lock and finish. + return releaseLock (0, SuperPage::size()); +} + +/* + * getPageSize. + * Precond: initialized. + */ +storeError OStorePageBIOS::getPageSize (sal_uInt16 &rnPageSize) +{ + // Acquire exclusive access. + NAMESPACE_VOS(OGuard) aGuard (m_aMutex); + + // Initialize [out] param. + rnPageSize = 0; + + // Check precond. + if (!m_xLockBytes.isValid()) + return store_E_InvalidAccess; + + // Load SuperBlock and require good health. + storeError eErrCode = verify (m_pSuper); + if (eErrCode == store_E_None) + { + // Obtain PageSize. + rnPageSize = m_pSuper->m_aSuperOne.m_aDescr.m_nSize; + } + return eErrCode; +} + +/* + * acquireLock. + * Low Level: Precond: initialized, exclusive access. + */ +storeError OStorePageBIOS::acquireLock ( + sal_uInt32 nAddr, sal_uInt32 nSize) +{ + // Check precond. + if (!m_xLockBytes.isValid()) + return store_E_InvalidAccess; + + // Check Address. + VOS_PRECOND( + nAddr != STORE_PAGE_NULL, + "OStorePageBIOS::acquireLock(): invalid Address"); + if (nAddr == STORE_PAGE_NULL) + return store_E_CantSeek; + + // Acquire Lock. +#ifdef STORE_FEATURE_LOCKING + return m_xLockBytes->lockRegion (nAddr, nSize); +#else + return store_E_None; +#endif /* STORE_FEATURE_LOCKING */ +} + +/* + * releaseLock. + * Low Level: Precond: initialized, exclusive access. + */ +storeError OStorePageBIOS::releaseLock ( + sal_uInt32 nAddr, sal_uInt32 nSize) +{ + // Check precond. + if (!m_xLockBytes.isValid()) + return store_E_InvalidAccess; + + // Check Address. + VOS_PRECOND( + nAddr != STORE_PAGE_NULL, + "OStorePageBIOS::releaseLock(): invalid Address"); + if (nAddr == STORE_PAGE_NULL) + return store_E_CantSeek; + + // Release Lock. +#ifdef STORE_FEATURE_LOCKING + return m_xLockBytes->unlockRegion (nAddr, nSize); +#else + return store_E_None; +#endif /* STORE_FEATURE_LOCKING */ +} + +/* + * read. + * Low Level: Precond: initialized, exclusive access. + */ +storeError OStorePageBIOS::read ( + sal_uInt32 nAddr, void *pData, sal_uInt32 nSize) +{ + // Check precond. + if (!m_xLockBytes.isValid()) + return store_E_InvalidAccess; + + // Check Address. + VOS_PRECOND( + nAddr != STORE_PAGE_NULL, + "OStorePageBIOS::read(): invalid Address"); + if (nAddr == STORE_PAGE_NULL) + return store_E_CantSeek; + + // Check Data. + VOS_PRECOND(pData, "OStorePageBIOS::read(): no Data"); + if (pData == NULL) + return store_E_InvalidParameter; + + // Read Page. + sal_uInt32 nDone = 0; + storeError eErrCode = m_xLockBytes->readAt (nAddr, pData, nSize, nDone); + if ((eErrCode == store_E_None) && (nDone != nSize)) + { + // Page too short. + if (nDone == 0) + eErrCode = store_E_NotExists; + else + eErrCode = store_E_CantRead; + } + return eErrCode; +} + +/* + * write. + * Low Level: Precond: initialized, writeable, exclusive access. + */ +storeError OStorePageBIOS::write ( + sal_uInt32 nAddr, const void *pData, sal_uInt32 nSize) +{ + // Check precond. + if (!m_xLockBytes.isValid()) + return store_E_InvalidAccess; + if (!m_bWriteable) + return store_E_AccessViolation; + + // Check Address. + VOS_PRECOND( + nAddr != STORE_PAGE_NULL, + "OStorePageBIOS::write(): invalid Address"); + if (nAddr == STORE_PAGE_NULL) + return store_E_CantSeek; + + // Check Data. + VOS_PRECOND(pData, "OStorePageBIOS::write(): no Data"); + if (pData == NULL) + return store_E_InvalidParameter; + + // Check modified state. + storeError eErrCode = store_E_None; + if (!m_bModified) + { + // Mark as modified. + m_bModified = sal_True; + + // Mark SuperBlock modified. + eErrCode = m_pSuper->modified (*this); + if (eErrCode != store_E_None) + return eErrCode; + } + + // Write Data. + sal_uInt32 nDone = 0; + eErrCode = m_xLockBytes->writeAt (nAddr, pData, nSize, nDone); + if ((eErrCode == store_E_None) && (nDone != nSize)) + { + // Page too short. + eErrCode = store_E_CantWrite; + } + return eErrCode; +} + +/* + * acquirePage. + * Precond: initialized. + */ +storeError OStorePageBIOS::acquirePage ( + const OStorePageDescriptor& rDescr, storeAccessMode eMode) +{ + // Acquire exclusive access. + NAMESPACE_VOS(OGuard) aGuard (m_aMutex); + + // Check precond. + if (!m_xLockBytes.isValid()) + return store_E_InvalidAccess; + + // Check access mode. + if (!(m_bWriteable || (eMode == store_AccessReadOnly))) + return store_E_AccessViolation; + + // Check access control list. + if (!m_pAcl) + m_pAcl = new OStorePageACL(); + + // Find access control list entry. + map_type::iterator it = m_pAcl->find (rDescr.m_nAddr); + if (it != m_pAcl->end()) + { + // Acquire existing entry (with ShareDenyWrite). + if (eMode == store_AccessReadOnly) + (*it).second += 1; + else + return store_E_AccessViolation; + } + else + { + // Insert new entry. + typedef NAMESPACE_STD(pair) map_entry; + m_pAcl->insert (map_entry (rDescr.m_nAddr, 1)); + } + + // Increment total referer count and finish. + m_pAcl->m_nRefCount += 1; + return store_E_None; +} + +/* + * releasePage. + * Precond: initialized. + */ +storeError OStorePageBIOS::releasePage ( + const OStorePageDescriptor& rDescr, storeAccessMode eMode) +{ + // Acquire exclusive access. + NAMESPACE_VOS(OGuard) aGuard (m_aMutex); + + // Check precond. + if (!m_xLockBytes.isValid()) + return store_E_InvalidAccess; + + // Check access control list. + if (!m_pAcl) + return store_E_NotExists; + + // Find access control list entry. + map_type::iterator it = m_pAcl->find (rDescr.m_nAddr); + if (it == m_pAcl->end()) + return store_E_NotExists; + + // Release existing entry. + if ((*it).second > 1) + (*it).second -= 1; + else + m_pAcl->erase(it); + + // Decrement total referer count and finish. + m_pAcl->m_nRefCount -= 1; + return store_E_None; +} + +/* + * getRefererCount. + * Precond: none. + */ +sal_uInt32 OStorePageBIOS::getRefererCount (void) +{ + // Acquire exclusive access. + NAMESPACE_VOS(OGuard) aGuard (m_aMutex); + + // Obtain total referer count. + if (m_pAcl) + return m_pAcl->m_nRefCount; + else + return 0; +} + +/* + * allocate. + * Precond: initialized, writeable. + */ +storeError OStorePageBIOS::allocate ( + OStorePageObject& rPage, Allocation eAlloc) +{ + // Acquire exclusive access. + NAMESPACE_VOS(OGuard) aGuard (m_aMutex); + + // Check precond. + if (!m_xLockBytes.isValid()) + return store_E_InvalidAccess; + if (!m_bWriteable) + return store_E_AccessViolation; + + // Acquire SuperBlock Lock. + storeError eErrCode = acquireLock (0, SuperPage::size()); + if (eErrCode != store_E_None) + return eErrCode; + + // Load SuperBlock and require good health. + eErrCode = verify (m_pSuper); + if (eErrCode != store_E_None) + { + releaseLock (0, SuperPage::size()); + return eErrCode; + } + + // Check allocation. + if (eAlloc != ALLOCATE_EOF) + { + // Check FreeList. + OStorePageLink aListHead (m_pSuper->m_aSuperTwo.unusedHead()); + if (aListHead.m_nAddr) + { + // Allocate from FreeList. + OStorePageData aPageHead (OStorePageData::size()); + aPageHead.location (aListHead.m_nAddr); + + // Load PageHead. + eErrCode = peek (aPageHead); + if (eErrCode != store_E_None) + { + releaseLock (0, SuperPage::size()); + return eErrCode; + } + + // Verify FreeList head. + VOS_PRECOND( + aPageHead.m_aUnused.m_nAddr != STORE_PAGE_NULL, + "OStorePageBIOS::allocate(): page not free"); + if (aPageHead.m_aUnused.m_nAddr == STORE_PAGE_NULL) + { + // Recovery: Reset FreeList. + m_pSuper->m_aSuperTwo.unusedReset(); + m_pSuper->m_aSuperOne = m_pSuper->m_aSuperTwo; + + // Save SuperBlock page. + eErrCode = m_pSuper->save (*this); + + // Release SuperBlock Lock. + releaseLock (0, SuperPage::size()); + + // Recovery: Allocate from EOF. + if (eErrCode == store_E_None) + return allocate (rPage, ALLOCATE_EOF); + else + return store_E_Unknown; + } + + // Assign location. + OStorePageData &rData = rPage.getData(); + rData.location (aPageHead.m_aDescr.m_nAddr); + + // Pop from FreeList. + aListHead.m_nAddr = aPageHead.m_aUnused.m_nAddr; + rData.m_aUnused.m_nAddr = STORE_PAGE_NULL; + + // Save page. + eErrCode = poke (rPage); + if (eErrCode != store_E_None) + { + releaseLock (0, SuperPage::size()); + return eErrCode; + } + + // Save SuperBlock page. + m_pSuper->m_aSuperTwo.unusedRemove (aListHead); + m_pSuper->m_aSuperOne = m_pSuper->m_aSuperTwo; + + eErrCode = m_pSuper->save (*this); + VOS_POSTCOND( + eErrCode == store_E_None, + "OStorePageBIOS::allocate(): SuperBlock save failed"); + + // Release SuperBlock Lock and finish. + return releaseLock (0, SuperPage::size()); + } + } + + // Allocate from logical EOF. Determine physical EOF. + sal_uInt32 nAddr = STORE_PAGE_NULL; + eErrCode = m_xLockBytes->stat (nAddr); + if (eErrCode != store_E_None) + { + releaseLock (0, SuperPage::size()); + return eErrCode; + } + + // Obtain logical EOF. + OStorePageDescriptor aDescr (m_pSuper->m_aSuperTwo.m_aDescr); + if (aDescr.m_nAddr == 0) + aDescr.m_nAddr = nAddr; /* backward compatibility */ + + if (!(aDescr.m_nAddr < nAddr)) + { + // Check modified state. + if (!m_bModified) + { + // Mark modified. + m_bModified = sal_True; + + // Mark SuperBlock modified. + eErrCode = m_pSuper->modified (*this); + if (eErrCode != store_E_None) + { + releaseLock (0, SuperPage::size()); + return eErrCode; + } + } + + // Resize. + sal_uInt32 nAlign = VOS_MIN(nAddr, STORE_MAXIMUM_PAGESIZE); + nAddr = ((nAddr + nAlign) / nAlign) * nAlign; + + eErrCode = m_xLockBytes->setSize (nAddr); + if (eErrCode != store_E_None) + { + releaseLock (0, SuperPage::size()); + return eErrCode; + } + } + + // Save page. + rPage.location (aDescr.m_nAddr); + eErrCode = poke (rPage); + if (eErrCode != store_E_None) + { + releaseLock (0, SuperPage::size()); + return eErrCode; + } + + // Save SuperBlock page. + aDescr.m_nAddr += aDescr.m_nSize; + + m_pSuper->m_aSuperTwo.m_aDescr = aDescr; + m_pSuper->m_aSuperOne = m_pSuper->m_aSuperTwo; + + eErrCode = m_pSuper->save (*this); + VOS_POSTCOND( + eErrCode == store_E_None, + "OStorePageBIOS::allocate(): SuperBlock save failed"); + + // Release SuperBlock Lock and finish. + return releaseLock (0, SuperPage::size()); +} + +/* + * free. + * Precond: initialized, writeable. + */ +storeError OStorePageBIOS::free (OStorePageObject& rPage) +{ + // Acquire exclusive access. + NAMESPACE_VOS(OGuard) aGuard (m_aMutex); + + // Check precond. + if (!m_xLockBytes.isValid()) + return store_E_InvalidAccess; + if (!m_bWriteable) + return store_E_AccessViolation; + + // Acquire SuperBlock Lock. + storeError eErrCode = acquireLock (0, SuperPage::size()); + if (eErrCode != store_E_None) + return eErrCode; + + // Load SuperBlock and require good health. + eErrCode = verify (m_pSuper); + if (eErrCode != store_E_None) + { + releaseLock (0, SuperPage::size()); + return eErrCode; + } + + // Load PageHead. + OStorePageData &rData = rPage.getData(); + + eErrCode = peek (rData); + if (eErrCode != store_E_None) + { + releaseLock (0, SuperPage::size()); + return eErrCode; + } + + // Push onto FreeList. + OStorePageLink aListHead (m_pSuper->m_aSuperTwo.unusedHead()); + + rData.m_aUnused.m_nAddr = aListHead.m_nAddr; + aListHead.m_nAddr = rData.m_aDescr.m_nAddr; + + // Save PageHead. + eErrCode = poke (rData); + if (eErrCode != store_E_None) + { + releaseLock (0, SuperPage::size()); + return eErrCode; + } + + // Save SuperBlock page. + m_pSuper->m_aSuperTwo.unusedInsert (aListHead); + m_pSuper->m_aSuperOne = m_pSuper->m_aSuperTwo; + + eErrCode = m_pSuper->save (*this); + VOS_POSTCOND( + eErrCode == store_E_None, + "OStorePageBIOS::free(): SuperBlock save failed"); + + // Release SuperBlock Lock and finish. + return releaseLock (0, SuperPage::size()); +} + +/* + * load. + * Precond: initialized, readable. + */ +storeError OStorePageBIOS::load (OStorePageObject& rPage) +{ + // Acquire exclusive access. + NAMESPACE_VOS(OGuard) aGuard (m_aMutex); + + // Check precond. + if (!m_xLockBytes.isValid()) + return store_E_InvalidAccess; + + // Save PageDescriptor. + OStorePageData &rData = rPage.getData(); + OStorePageDescriptor aDescr (rData.m_aDescr); + + // Read page. + storeError eErrCode = read (aDescr.m_nAddr, &rData, aDescr.m_nSize); + if (eErrCode != store_E_None) + { + // Restore PageDescriptor. + rData.m_aDescr = aDescr; + return eErrCode; + } + + // Verify page. + eErrCode = rPage.verify (aDescr); + if (eErrCode != store_E_None) + { + // Restore PageDescriptor. + rData.m_aDescr = aDescr; + return eErrCode; + } + +#ifdef OSL_BIGENDIAN + // Swap to internal representation. + rPage.swap (aDescr); +#endif /* OSL_BIGENDIAN */ + + // Verify PageDescriptor. + if (!((aDescr == rData.m_aDescr) || + (aDescr <= rData.m_aDescr) )) + return store_E_InvalidAccess; + + // Mark page as clean. + rPage.clean(); + + // Done. + return store_E_None; +} + +/* + * save. + * Precond: initialized, writeable. + */ +storeError OStorePageBIOS::save (OStorePageObject& rPage) +{ + // Acquire exclusive access. + NAMESPACE_VOS(OGuard) aGuard (m_aMutex); + + // Check precond. + if (!m_xLockBytes.isValid()) + return store_E_InvalidAccess; + if (!m_bWriteable) + return store_E_AccessViolation; + + // Save Page. + return poke (rPage); +} + +/* + * close. + * Precond: none. + */ +storeError OStorePageBIOS::close (void) +{ + // Acquire exclusive access. + NAMESPACE_VOS(OGuard) aGuard (m_aMutex); + + // Check access control list. + if (m_pAcl) + { + // Check referer count. + if (m_pAcl->m_nRefCount) + { + // Report remaining referer count. + sal_uInt32 k = m_pAcl->m_nRefCount; + VOS_TRACE("OStorePageBIOS::close(): referer count: %d\n", k); + } + __STORE_DELETEZ (m_pAcl); + } + + // Check SuperBlock page. + if (m_pSuper) + { + // Release SuperBlock page. + m_pSuper->close (*this); + __STORE_DELETEZ (m_pSuper); + } + + // Check LockBytes. + if (m_xLockBytes.isValid()) + { + // Release LockBytes. + m_xLockBytes->flush(); + m_xLockBytes.unbind(); + } + return store_E_None; +} + +/* + * flush. + * Precond: initialized. + */ +storeError OStorePageBIOS::flush (void) +{ + // Acquire exclusive access. + NAMESPACE_VOS(OGuard) aGuard (m_aMutex); + + // Check precond. + if (!m_xLockBytes.isValid()) + return store_E_InvalidAccess; + + // Check mode and state. + if (!(m_bWriteable && m_bModified)) + return store_E_None; + + // Flush SuperBlock page. + storeError eErrCode = m_pSuper->flush (*this); + VOS_POSTCOND( + eErrCode == store_E_None, + "OStorePageBIOS::flush(): SuperBlock flush failed"); + + // Flush LockBytes. + eErrCode = m_xLockBytes->flush(); + VOS_POSTCOND( + eErrCode == store_E_None, + "OStorePageBIOS::flush(): LockBytes flush failed"); + if (eErrCode == store_E_None) + { + // Mark not modified. + m_bModified = sal_False; + } + return eErrCode; +} + +/* + * size. + * Precond: initialized. + */ +storeError OStorePageBIOS::size (sal_uInt32 &rnSize) +{ + // Acquire exclusive access. + NAMESPACE_VOS(OGuard) aGuard (m_aMutex); + + // Initialize [out] param. + rnSize = 0; + + // Check precond. + if (!m_xLockBytes.isValid()) + return store_E_InvalidAccess; + + // Obtain LockBytes size. + return m_xLockBytes->stat (rnSize); +} + +/* + * scanBegin. + * Precond: initialized. + */ +storeError OStorePageBIOS::scanBegin ( + ScanContext &rCtx, sal_uInt32 nMagic) +{ + // Acquire exclusive access. + NAMESPACE_VOS(OGuard) aGuard (m_aMutex); + + // Initialize [out] param. + rCtx.m_aDescr = OStorePageDescriptor(0, 0, 0); + rCtx.m_nSize = 0; + rCtx.m_nMagic = nMagic; + + // Check precond. + if (!m_xLockBytes.isValid()) + return store_E_InvalidAccess; + + // Check SuperBlock page. + storeError eErrCode = verify (m_pSuper); + if (eErrCode != store_E_None) + { + // Damaged. Determine page size (NYI). + VOS_TRACE ("OStorePageBIOS::scanBegin(): damaged.\n"); + return eErrCode; + } + + // Setup Context descriptor. + rCtx.m_aDescr = m_pSuper->m_aSuperOne.m_aDescr; + rCtx.m_aDescr.m_nAddr = rCtx.m_aDescr.m_nSize; + + // Setup Context size. + eErrCode = size (rCtx.m_nSize); + if (eErrCode != store_E_None) + rCtx.m_nSize = ((sal_uInt32)(~0)); + + // Done. + return store_E_None; +} + +/* + * scanNext. + * Precond: initialized. + */ +storeError OStorePageBIOS::scanNext ( + ScanContext &rCtx, OStorePageObject &rPage) +{ + // Acquire exclusive access. + NAMESPACE_VOS(OGuard) aGuard (m_aMutex); + + // Check precond. + if (!m_xLockBytes.isValid()) + return store_E_InvalidAccess; + + // Setup PageHead. + OStorePageData aPageHead (OStorePageData::size()); + + // Check context. + while (rCtx.isValid()) + { + // Assign next location. + aPageHead.location (rCtx.m_aDescr.m_nAddr); + rCtx.m_aDescr.m_nAddr += rCtx.m_aDescr.m_nSize; + + // Load PageHead. + storeError eErrCode = peek (aPageHead); + if (eErrCode != store_E_None) + continue; + + // Check PageHead Magic number. + if (aPageHead.m_aGuard.m_nMagic != rCtx.m_nMagic) + continue; + + // Check PageHead Unused link. + if (aPageHead.m_aUnused.m_nAddr != STORE_PAGE_NULL) + continue; + + // Load page. + rPage.location (aPageHead.location()); + eErrCode = OStorePageBIOS::load (rPage); + if (eErrCode != store_E_None) + continue; + + // Deliver page. + return store_E_None; + } + + // Done. + return store_E_CantSeek; +} + +/* + * peek (PageHead). + * Internal: Precond: initialized, readable, exclusive access. + */ +storeError OStorePageBIOS::peek (OStorePageData &rData) +{ + // Save PageDescriptor. + OStorePageDescriptor aDescr (rData.m_aDescr); + + // Read PageHead. + storeError eErrCode = read (aDescr.m_nAddr, &rData, rData.size()); + if (eErrCode != store_E_None) + { + // Restore PageDescriptor. + rData.m_aDescr = aDescr; + return eErrCode; + } + + // Verify PageHead. + eErrCode = rData.verify (aDescr); + if (eErrCode != store_E_None) + { + // Restore PageDescriptor. + rData.m_aDescr = aDescr; + return eErrCode; + } + +#ifdef OSL_BIGENDIAN + // Swap to internal representation. + rData.swap (aDescr); +#endif /* OSL_BIGENDIAN */ + + // Verify PageDescriptor. + if (!((aDescr == rData.m_aDescr) || + (aDescr <= rData.m_aDescr) )) + return store_E_InvalidAccess; + else + return store_E_None; +} + +/* + * poke (PageHead). + * Internal: Precond: initialized, writeable, exclusive access. + */ +storeError OStorePageBIOS::poke (OStorePageData &rData) +{ + // Save PageDescriptor. + OStorePageDescriptor aDescr (rData.m_aDescr); + +#ifdef OSL_BIGENDIAN + // Swap to external representation. + rData.swap (aDescr); +#endif /* OSL_BIGENDIAN */ + + // Guard PageHead. + rData.guard (aDescr); + + // Write PageHead. + storeError eErrCode = write (aDescr.m_nAddr, &rData, rData.size()); + +#ifdef OSL_BIGENDIAN + // Swap back to internal representation. + rData.swap (aDescr); +#endif /* OSL_BIGENDIAN */ + + // Done. + return eErrCode; +} + +/* + * poke (PageObject). + * Internal: Precond: initialized, writeable, exclusive access. + */ +storeError OStorePageBIOS::poke (OStorePageObject &rPage) +{ + // Save PageDescriptor. + OStorePageData &rData = rPage.getData(); + OStorePageDescriptor aDescr (rData.m_aDescr); + +#ifdef OSL_BIGENDIAN + // Swap to external representation. + rPage.swap (aDescr); +#endif /* OSL_BIGENDIAN */ + + // Guard page. + rPage.guard (aDescr); + + // Write page. + storeError eErrCode = write (aDescr.m_nAddr, &rData, aDescr.m_nSize); + +#ifdef OSL_BIGENDIAN + // Swap back to internal representation. + rPage.swap (aDescr); +#endif /* OSL_BIGENDIAN */ + + // Mark page as clean. + if (eErrCode == store_E_None) + rPage.clean(); + + // Done. + return eErrCode; +} + diff --git a/store/source/storbase.hxx b/store/source/storbase.hxx new file mode 100644 index 000000000000..cf149e14e525 --- /dev/null +++ b/store/source/storbase.hxx @@ -0,0 +1,916 @@ +/************************************************************************* + * + * $RCSfile: storbase.hxx,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:18:32 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +#ifndef _STORE_STORBASE_HXX_ +#define _STORE_STORBASE_HXX_ "$Revision: 1.1.1.1 $" + +#ifndef _SAL_TYPES_H_ +#include +#endif + +#ifndef _RTL_ALLOC_H_ +#include +#endif +#ifndef _RTL_MEMORY_H_ +#include +#endif +#ifndef _RTL_STRING_H_ +#include +#endif + +#ifndef _VOS_MACROS_HXX_ +#include +#endif +#ifndef _VOS_MUTEX_HXX_ +#include +#endif +#ifndef _VOS_REF_HXX_ +#include +#endif + +#ifndef _STORE_TYPES_H_ +#include +#endif +#ifndef _STORE_MACROS_HXX_ +#include +#endif +#ifndef _STORE_OBJECT_HXX_ +#include +#endif +#ifndef _STORE_LOCKBYTE_HXX_ +#include +#endif + +#ifndef __STORE_DELETEZ +#define __STORE_DELETEZ(p) (delete p, p = 0) +#endif + +#ifdef _USE_NAMESPACE +namespace store { +#endif + +/*======================================================================== + * + * OStorePageGuard. + * + *======================================================================*/ +struct OStorePageGuard +{ + /** Representation. + */ + sal_uInt32 m_nMagic; + sal_uInt32 m_nCRC32; + + /** Construction. + */ + OStorePageGuard (sal_uInt32 nMagic = 0, sal_uInt32 nCRC32 = 0) + : m_nMagic (nMagic), + m_nCRC32 (nCRC32) + {} + + OStorePageGuard (const OStorePageGuard& rOther) + : m_nMagic (rOther.m_nMagic), + m_nCRC32 (rOther.m_nCRC32) + {} + + OStorePageGuard& operator= (const OStorePageGuard& rOther) + { + m_nMagic = rOther.m_nMagic; + m_nCRC32 = rOther.m_nCRC32; + return *this; + } + + /** Comparison. + */ + sal_Bool operator== (const OStorePageGuard& rOther) const + { + return ((m_nMagic == rOther.m_nMagic) && + (m_nCRC32 == rOther.m_nCRC32) ); + } + + /** swap (internal and external representation). + */ + void swap (void) + { +#ifdef OSL_BIGENDIAN + m_nMagic = VOS_SWAPDWORD(m_nMagic); + m_nCRC32 = VOS_SWAPDWORD(m_nCRC32); +#endif /* OSL_BIGENDIAN */ + } + + /** CRC polynomial 0xEDB88320. + */ + static const sal_uInt32 m_pTable[256]; + + static sal_uInt32 updcrc32 (sal_uInt32 crc, sal_uInt8 octet) + { + return m_pTable[((crc) ^ (octet)) & 0xff] ^ ((crc) >> 8); + } + + static sal_uInt32 crc32 ( + sal_uInt32 nCRC32, const void *pData, sal_uInt32 nSize); +}; + +/*======================================================================== + * + * OStorePageDescriptor. + * + *======================================================================*/ +#define STORE_PAGE_NULL ((sal_uInt32)(~0)) + +struct OStorePageDescriptor +{ + /** Representation. + */ + sal_uInt32 m_nAddr; + sal_uInt16 m_nSize; + sal_uInt16 m_nUsed; + + /** Construction. + */ + OStorePageDescriptor ( + sal_uInt32 nAddr = STORE_PAGE_NULL, + sal_uInt16 nSize = 0, + sal_uInt16 nUsed = 0) + : m_nAddr (nAddr), + m_nSize (nSize), + m_nUsed (nUsed) + {} + + OStorePageDescriptor (const OStorePageDescriptor& rOther) + : m_nAddr (rOther.m_nAddr), + m_nSize (rOther.m_nSize), + m_nUsed (rOther.m_nUsed) + {} + + OStorePageDescriptor& operator= (const OStorePageDescriptor& rOther) + { + m_nAddr = rOther.m_nAddr; + m_nSize = rOther.m_nSize; + m_nUsed = rOther.m_nUsed; + return *this; + } + + /** Comparison. + */ + sal_Bool operator== (const OStorePageDescriptor& rOther) const + { + return ((m_nAddr == rOther.m_nAddr) && + (m_nSize == rOther.m_nSize) ); + } + + sal_Bool operator<= (const OStorePageDescriptor& rOther) const + { + return ((m_nAddr == rOther.m_nAddr) && + (m_nSize <= rOther.m_nSize) ); + } + + sal_Bool operator< (const OStorePageDescriptor& rOther) const + { + if (m_nAddr == rOther.m_nAddr) + return (m_nSize < rOther.m_nSize); + else + return (m_nAddr < rOther.m_nAddr); + } + + /** swap (internal and external representation). + */ + void swap (void) + { +#ifdef OSL_BIGENDIAN + m_nAddr = VOS_SWAPDWORD(m_nAddr); + m_nSize = VOS_SWAPWORD(m_nSize); + m_nUsed = VOS_SWAPWORD(m_nUsed); +#endif /* OSL_BIGENDIAN */ + } +}; + +/*======================================================================== + * + * OStorePageKey. + * + *======================================================================*/ +struct OStorePageKey +{ + /** Representation. + */ + sal_uInt32 m_nLow; + sal_uInt32 m_nHigh; + + /** Construction. + */ + OStorePageKey (sal_uInt32 nLow = 0, sal_uInt32 nHigh = 0) + : m_nLow (nLow), m_nHigh (nHigh) + {} + + OStorePageKey (const OStorePageKey& rOther) + : m_nLow (rOther.m_nLow), m_nHigh (rOther.m_nHigh) + {} + + OStorePageKey& operator= (const OStorePageKey& rOther) + { + m_nLow = rOther.m_nLow; + m_nHigh = rOther.m_nHigh; + return *this; + } + + /** Comparison. + */ + sal_Bool operator== (const OStorePageKey& rOther) const + { + return ((m_nLow == rOther.m_nLow ) && + (m_nHigh == rOther.m_nHigh) ); + } + + sal_Bool operator< (const OStorePageKey& rOther) const + { + if (m_nHigh == rOther.m_nHigh) + return (m_nLow < rOther.m_nLow); + else + return (m_nHigh < rOther.m_nHigh); + } + + /** swap (internal and external representation). + */ + void swap (void) + { +#ifdef OSL_BIGENDIAN + m_nLow = VOS_SWAPDWORD(m_nLow); + m_nHigh = VOS_SWAPDWORD(m_nHigh); +#endif /* OSL_BIGENDIAN */ + } +}; + +/*======================================================================== + * + * OStorePageLink. + * + *======================================================================*/ +struct OStorePageLink +{ + /** Representation. + */ + sal_uInt32 m_nAddr; + + /** Construction. + */ + OStorePageLink (sal_uInt32 nAddr = STORE_PAGE_NULL) + : m_nAddr (nAddr) + {} + + OStorePageLink (const OStorePageLink& rOther) + : m_nAddr (rOther.m_nAddr) + {} + + OStorePageLink& operator= (const OStorePageLink& rOther) + { + m_nAddr = rOther.m_nAddr; + return *this; + } + + /** Comparison. + */ + sal_Bool operator== (const OStorePageLink& rOther) const + { + return (m_nAddr == rOther.m_nAddr); + } + + sal_Bool operator< (const OStorePageLink& rOther) const + { + return (m_nAddr < rOther.m_nAddr); + } + + /** Operation. + */ + void link (OStorePageLink& rPred) + { + OStorePageLink tmp (rPred); + rPred = *this; + *this = tmp; + } + + void unlink (OStorePageLink& rPred) + { + rPred = *this; + *this = OStorePageLink(); + } + + /** swap (internal and external representation). + */ + void swap (void) + { +#ifdef OSL_BIGENDIAN + m_nAddr = VOS_SWAPDWORD(m_nAddr); +#endif /* OSL_BIGENDIAN */ + } +}; + +/*======================================================================== + * + * OStorePageNameBlock. + * + *======================================================================*/ +struct OStorePageNameBlock +{ + typedef OStorePageGuard G; + typedef OStorePageKey K; + + /** Representation. + */ + G m_aGuard; + K m_aKey; + sal_uInt32 m_nAttrib; + sal_Char m_pData[STORE_MAXIMUM_NAMESIZE]; + + /** size. + */ + static sal_uInt16 size (void) + { + return (sizeof(G) + sizeof(K) + sizeof(sal_uInt32) + + sizeof(sal_Char[STORE_MAXIMUM_NAMESIZE])); + } + + /** initialize. + */ + void initialize (void) + { + m_aGuard = G(); + m_aKey = K(); + m_nAttrib = 0; + rtl_zeroMemory (m_pData, sizeof(m_pData)); + } + + /** Construction. + */ + OStorePageNameBlock (void) + : m_nAttrib (0) + { + rtl_zeroMemory (m_pData, sizeof(m_pData)); + } + + /** Comparison. + */ + sal_Bool operator== (const OStorePageNameBlock& rOther) const + { + return (m_aGuard == rOther.m_aGuard); + } + + /** swap (internal and external representation). + */ + void swap (void) + { +#ifdef OSL_BIGENDIAN + m_aGuard.swap(); + m_aKey.swap(); + m_nAttrib = VOS_SWAPDWORD(m_nAttrib); +#endif /* OSL_BIGENDIAN */ + } + + /** guard (external representation). + */ + void guard (void) + { + sal_uInt32 nCRC32 = 0; + nCRC32 = G::crc32 (nCRC32, &m_aGuard.m_nMagic, sizeof(sal_uInt32)); + nCRC32 = G::crc32 (nCRC32, &m_aKey, size() - sizeof(G)); +#ifdef OSL_BIGENDIAN + nCRC32 = VOS_SWAPDWORD(nCRC32); +#endif /* OSL_BIGENDIAN */ + m_aGuard.m_nCRC32 = nCRC32; + } + + /** verify (external representation). + */ + storeError verify (void) + { + sal_uInt32 nCRC32 = 0; + nCRC32 = G::crc32 (nCRC32, &m_aGuard.m_nMagic, sizeof(sal_uInt32)); + nCRC32 = G::crc32 (nCRC32, &m_aKey, size() - sizeof(G)); +#ifdef OSL_BIGENDIAN + nCRC32 = VOS_SWAPDWORD(nCRC32); +#endif /* OSL_BIGENDIAN */ + if (m_aGuard.m_nCRC32 != nCRC32) + return store_E_InvalidChecksum; + else + return store_E_None; + } + + /** namei. + */ + static storeError namei ( + const rtl_String *pPath, const rtl_String *pName, K &rKey) + { + // Check parameter. + if (!(pPath && pName)) + return store_E_InvalidParameter; + + // Check name length. + if (!(pName->length < sizeof(sal_Char[STORE_MAXIMUM_NAMESIZE]))) + return store_E_NameTooLong; + + // Transform pathname into key. + rKey.m_nLow = G::crc32 (0, pName->buffer, pName->length); + rKey.m_nHigh = G::crc32 (0, pPath->buffer, pPath->length); + + // Done. + return store_E_None; + } +}; + +/*======================================================================== + * + * OStorePageData. + * + *======================================================================*/ +struct OStorePageData +{ + typedef OStorePageGuard G; + typedef OStorePageDescriptor D; + typedef OStorePageLink L; + + /** Representation. + */ + G m_aGuard; + D m_aDescr; + L m_aMarked; + L m_aUnused; + + /** size. + */ + static sal_uInt16 size (void) + { + return (sizeof(G) + sizeof(D) + 2 * sizeof(L)); + } + + /** location. + */ + sal_uInt32 location (void) const + { + return m_aDescr.m_nAddr; + } + + void location (sal_uInt32 nAddr) + { + m_aDescr.m_nAddr = nAddr; + } + + /** Allocation. + */ + static void* operator new (size_t n) + { + return rtl_allocateMemory (n); + } + + static void* operator new (size_t n, sal_uInt16 nPageSize) + { + return rtl_allocateMemory (nPageSize); + } + + static void operator delete (void *p) + { + rtl_freeMemory (p); + } + + /** Construction. + */ + OStorePageData (sal_uInt16 nPageSize) + { + m_aDescr.m_nSize = nPageSize; + m_aDescr.m_nUsed = size(); + } + + OStorePageData& operator= (const OStorePageData& rOther) + { + m_aGuard = rOther.m_aGuard; + m_aDescr = rOther.m_aDescr; + m_aMarked = rOther.m_aMarked; + m_aUnused = rOther.m_aUnused; + return *this; + } + + /** Comparison. + */ + sal_Bool operator== (const OStorePageData& rOther) const + { + return ((m_aGuard == rOther.m_aGuard ) && + (m_aDescr == rOther.m_aDescr ) && + (m_aMarked == rOther.m_aMarked) && + (m_aUnused == rOther.m_aUnused) ); + } + + /** swap (internal and external representation). + */ + void swap (const D& rDescr) + { +#ifdef OSL_BIGENDIAN + m_aGuard.swap(); + m_aDescr.swap(); + m_aMarked.swap(); + m_aUnused.swap(); +#endif /* OSL_BIGENDIAN */ + } + + /** guard (external representation). + */ + void guard (const D& rDescr) + { + sal_uInt32 nCRC32 = 0; + nCRC32 = G::crc32 (nCRC32, &m_aGuard.m_nMagic, sizeof(sal_uInt32)); + nCRC32 = G::crc32 (nCRC32, &m_aDescr, size() - sizeof(G)); +#ifdef OSL_BIGENDIAN + nCRC32 = VOS_SWAPDWORD(nCRC32); +#endif /* OSL_BIGENDIAN */ + m_aGuard.m_nCRC32 = nCRC32; + } + + /** verify (external representation). + */ + storeError verify (const D& rDescr) + { + sal_uInt32 nCRC32 = 0; + nCRC32 = G::crc32 (nCRC32, &m_aGuard.m_nMagic, sizeof(sal_uInt32)); + nCRC32 = G::crc32 (nCRC32, &m_aDescr, size() - sizeof(G)); +#ifdef OSL_BIGENDIAN + nCRC32 = VOS_SWAPDWORD(nCRC32); +#endif /* OSL_BIGENDIAN */ + if (m_aGuard.m_nCRC32 != nCRC32) + return store_E_InvalidChecksum; + else + return store_E_None; + } +}; + +/*======================================================================== + * + * OStorePageObject. + * + *======================================================================*/ +class OStorePageObject +{ + typedef OStorePageData page; + typedef OStorePageDescriptor D; + +public: + /** Construction. + */ + inline OStorePageObject (page& rPage); + + /** Destruction. + */ + virtual ~OStorePageObject (void); + + /** External representation. + */ + virtual void swap (const D& rDescr); + virtual void guard (const D& rDescr); + virtual storeError verify (const D& rDescr); + + /** Data. + */ + inline OStorePageData& getData (void); + + /** State. + */ + inline sal_Bool dirty (void) const; + inline void clean (void); + inline void touch (void); + + /** Location. + */ + inline sal_uInt32 location (void) const; + inline void location (sal_uInt32 nAddr); + +private: + /** Representation. + */ + page &m_rPage; + sal_Bool m_bDirty; +}; + +inline OStorePageObject::OStorePageObject (page& rPage) + : m_rPage (rPage), m_bDirty (sal_False) +{ +} + +inline OStorePageData& OStorePageObject::getData (void) +{ + return m_rPage; +} + +inline sal_Bool OStorePageObject::dirty (void) const +{ + return m_bDirty; +} + +inline void OStorePageObject::clean (void) +{ + m_bDirty = sal_False; +} + +inline void OStorePageObject::touch (void) +{ + m_bDirty = sal_True; +} + +inline sal_uInt32 OStorePageObject::location (void) const +{ + return m_rPage.location(); +} + +inline void OStorePageObject::location (sal_uInt32 nAddr) +{ + m_rPage.location (nAddr); + touch(); +} + +#define STORE_METHOD_ENTER(pMutex) \ + if ((pMutex)) (pMutex)->acquire() + +#define STORE_METHOD_LEAVE(pMutex, eErrCode) \ +{ \ + if ((pMutex)) (pMutex)->release(); \ + return (eErrCode); \ +} + +/*======================================================================== + * + * OStorePageBIOS. + * + *======================================================================*/ +struct OStoreSuperBlockPage; +struct OStorePageACL; + +class OStorePageBIOS : public NAMESPACE_STORE(OStoreObject) +{ + VOS_DECLARE_CLASSINFO (VOS_NAMESPACE (OStorePageBIOS, store)); + +public: + /** Construction. + */ + OStorePageBIOS (void); + + /** Conversion into IMutex& + */ + inline operator NAMESPACE_VOS(IMutex)& (void) const; + + /** Initialization. + * @param pLockBytes [in] + * @param eAccessMode [in] + * @return store_E_None upon success + */ + virtual storeError initialize ( + ILockBytes *pLockBytes, + storeAccessMode eAccessMode); + + /** getPageSize. + */ + storeError getPageSize (sal_uInt16 &rnPageSize); + + /** acquireLock. + */ + storeError acquireLock ( + sal_uInt32 nAddr, sal_uInt32 nSize); + + /** releaseLock. + */ + storeError releaseLock ( + sal_uInt32 nAddr, sal_uInt32 nSize); + + /** read. + */ + storeError read ( + sal_uInt32 nAddr, void *pData, sal_uInt32 nSize); + + /** write. + */ + storeError write ( + sal_uInt32 nAddr, const void *pData, sal_uInt32 nSize); + + /** isModified. + */ + inline sal_Bool isModified (void) const; + + /** isWriteable. + */ + inline sal_Bool isWriteable (void) const; + + /** isValid. + */ + inline sal_Bool isValid (void) const; + + /** Page Access. + */ + storeError acquirePage ( + const OStorePageDescriptor& rDescr, storeAccessMode eMode); + + storeError releasePage ( + const OStorePageDescriptor& rDescr, storeAccessMode eMode); + + sal_uInt32 getRefererCount (void); + + /** Page Allocation. + */ + enum Allocation + { + ALLOCATE_FIRST = 0, + ALLOCATE_BEST = 1, + ALLOCATE_EOF = 2 + }; + + storeError allocate ( + OStorePageObject& rPage, Allocation eAllocation = ALLOCATE_FIRST); + + virtual storeError free ( + OStorePageObject& rPage); + + /** Page I/O. + */ + virtual storeError load ( + OStorePageObject& rPage); + + virtual storeError save ( + OStorePageObject& rPage); + + /** close. + * @return store_E_None upon success. + */ + virtual storeError close (void); + + /** flush. + * @return store_E_None upon success. + */ + virtual storeError flush (void); + + /** size. + */ + storeError size (sal_uInt32 &rnSize); + + /** ScanContext. + */ + struct ScanContext + { + /** Representation. + */ + OStorePageDescriptor m_aDescr; + sal_uInt32 m_nSize; + sal_uInt32 m_nMagic; + + /** Construction. + */ + inline ScanContext (void); + + /** isValid. + */ + inline sal_Bool isValid (void) const; + }; + + /** scanBegin. + */ + storeError scanBegin ( + ScanContext &rCtx, + sal_uInt32 nMagic = 0); + + /** scanNext. + */ + storeError scanNext ( + ScanContext &rCtx, + OStorePageObject &rPage); + +protected: + /** Destruction (OReference). + */ + virtual ~OStorePageBIOS (void); + + /** create (SuperBlock). + */ + storeError create ( + sal_uInt16 nPageSize = STORE_DEFAULT_PAGESIZE); + + /** Page Maintenance. + */ + storeError peek ( + OStorePageData &rData); + storeError poke ( + OStorePageData &rData); + storeError poke ( + OStorePageObject &rPage); + +private: + /** Representation. + */ + NAMESPACE_VOS(ORef) m_xLockBytes; + NAMESPACE_VOS(OMutex) m_aMutex; + OStorePageACL *m_pAcl; + + typedef OStoreSuperBlockPage SuperPage; + SuperPage *m_pSuper; + + sal_Bool m_bModified : 1; + sal_Bool m_bWriteable : 1; + + /** SuperBlock verification and repair. + */ + storeError verify (SuperPage *&rpSuper); + storeError repair (SuperPage *&rpSuper); + + /** Not implemented. + */ + OStorePageBIOS (const OStorePageBIOS&); + OStorePageBIOS& operator= (const OStorePageBIOS&); +}; + +inline OStorePageBIOS::operator NAMESPACE_VOS(IMutex)& (void) const +{ + return (NAMESPACE_VOS(IMutex)&)m_aMutex; +} +inline sal_Bool OStorePageBIOS::isModified (void) const +{ + return m_bModified; +} +inline sal_Bool OStorePageBIOS::isWriteable (void) const +{ + return m_bWriteable; +} +inline sal_Bool OStorePageBIOS::isValid (void) const +{ + return m_xLockBytes.isValid(); +} + +inline OStorePageBIOS::ScanContext::ScanContext (void) + : m_aDescr (0, 0, 0), m_nSize (0), m_nMagic (0) +{ +} +inline sal_Bool OStorePageBIOS::ScanContext::isValid (void) const +{ + return (m_aDescr.m_nAddr < m_nSize); +} + +/*======================================================================== + * + * The End. + * + *======================================================================*/ +#ifdef _USE_NAMESPACE +} +#endif + +#endif /* !_STORE_STORBASE_HXX_ */ + diff --git a/store/source/storcach.cxx b/store/source/storcach.cxx new file mode 100644 index 000000000000..075f5dcd11cc --- /dev/null +++ b/store/source/storcach.cxx @@ -0,0 +1,696 @@ +/************************************************************************* + * + * $RCSfile: storcach.cxx,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:18:32 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +#define _STORE_STORCACH_CXX "$Revision: 1.1.1.1 $" + +#ifndef _SAL_TYPES_H_ +#include +#endif + +#ifndef _RTL_MEMORY_H_ +#include +#endif + +#ifndef _VOS_DIAGNOSE_HXX_ +#include +#endif +#ifndef _VOS_MUTEX_HXX_ +#include +#endif + +#ifndef _STORE_TYPES_H_ +#include +#endif +#ifndef _STORE_MACROS_HXX_ +#include +#endif + +#ifndef _STORE_STORBASE_HXX_ +#include +#endif +#ifndef _STORE_STORCACH_HXX_ +#include +#endif + +#include + +#ifdef _USE_NAMESPACE +using namespace store; +#endif + +/*======================================================================== + * + * OStorePageCache internals. + * + *======================================================================*/ +/* + * __store_memcpy. + */ +inline void __store_memcpy (void *dst, const void *src, sal_uInt32 n) +{ + // rtl_copyMemory (dst, src, n); + ::memcpy (dst, src, n); +} + +/*======================================================================== + * + * OStorePageCacheEntry. + * + *======================================================================*/ +#ifdef _USE_NAMESPACE +namespace store { +#endif + +struct OStorePageCacheEntry +{ + typedef OStorePageCacheEntry self; + typedef OStorePageData data; + typedef OStorePageDescriptor D; + + /** Representation. + */ + D m_aDescr; + data *m_pData; + self *m_pNext; + self *m_pPrev; + + /** Construction. + */ + OStorePageCacheEntry (const D& rDescr, const data& rData) + : m_aDescr (rDescr), m_pData (NULL), m_pNext (this), m_pPrev (this) + { + sal_uInt16 nSize = m_aDescr.m_nSize; + m_pData = new(nSize) data(nSize); + __store_memcpy (m_pData, &rData, nSize); + } + + /** Data assignment. + */ + void assign (const D& rDescr, const data& rData) + { + m_aDescr.m_nAddr = rDescr.m_nAddr; + if (!(m_aDescr.m_nSize == rDescr.m_nSize)) + { + delete m_pData; + m_pData = new(rDescr.m_nSize) data(rDescr.m_nSize); + m_aDescr.m_nSize = rDescr.m_nSize; + } + __store_memcpy (m_pData, &rData, m_aDescr.m_nSize); + } + + /** Destruction. + */ + ~OStorePageCacheEntry (void) + { + delete m_pData; + } + + /** Comparison. + */ + enum CompareResult + { + COMPARE_LESS = -1, + COMPARE_EQUAL = 0, + COMPARE_GREATER = 1 + }; + + CompareResult compare (const D& rDescr) const + { + if (m_aDescr.m_nAddr == rDescr.m_nAddr) + return COMPARE_EQUAL; + if (m_aDescr.m_nAddr < rDescr.m_nAddr) + return COMPARE_LESS; + else + return COMPARE_GREATER; + } + + CompareResult compare (const self& rOther) const + { + return compare (rOther.m_aDescr); + } + + /** Address operation. + */ + void invalidate (void) + { + m_aDescr.m_nAddr = STORE_PAGE_NULL; + } + + sal_Bool isValid (void) const + { + return (m_aDescr.m_nAddr != STORE_PAGE_NULL); + } + + /** Index operation. + */ + sal_uInt16 index (void) const + { + return (m_aDescr.m_nUsed & 0x7fff); + } + + void index (sal_uInt16 nIndex) + { + m_aDescr.m_nUsed = ((m_aDescr.m_nUsed & 0x8000) | (nIndex & 0x7fff)); + } + + /** DirtyBit operation. + */ + void clean (void) + { + m_aDescr.m_nUsed &= 0x7fff; + } + + void dirty (void) + { + m_aDescr.m_nUsed |= 0x8000; + } + + sal_Bool isDirty (void) const + { + return ((m_aDescr.m_nUsed & 0x8000) == 0x8000); + } + + /** List operation. + */ + void backlink (self& rOther) + { + rOther.m_pNext = this; + rOther.m_pPrev = m_pPrev; + m_pPrev = &rOther; + rOther.m_pPrev->m_pNext = &rOther; + } + + void unlink (void) + { + m_pNext->m_pPrev = m_pPrev; + m_pPrev->m_pNext = m_pNext; + m_pNext = this; + m_pPrev = this; + } +}; + +#ifdef _USE_NAMESPACE +} +#endif + +/*======================================================================== + * + * OStorePageCache debug internals. + * + *======================================================================*/ +/* + * __store_check_entry. + */ +static sal_Bool __store_check_entry ( + OStorePageCacheEntry **ppData, sal_uInt16 nUsed) +{ + if (nUsed > 1) + { + for (sal_uInt16 i = 0; i < nUsed - 1; i++) + { + sal_uInt32 ai = ppData[i ]->m_aDescr.m_nAddr; + sal_uInt32 ak = ppData[i + 1]->m_aDescr.m_nAddr; + if (!(ai <= ak)) + return sal_False; + if (!(i == ppData[i]->index())) + return sal_False; + } + } + return sal_True; +} + +/* + * __store_find_entry. + */ +static sal_uInt16 __store_find_entry ( + const OStorePageDescriptor &rDescr, + const OStorePageCacheEntry *pHead) +{ + if (pHead) + { + if (pHead->m_aDescr.m_nAddr == rDescr.m_nAddr) + return pHead->index(); + + OStorePageCacheEntry *pEntry = pHead->m_pNext; + while (pEntry != pHead) + { + if (pEntry->m_aDescr.m_nAddr == rDescr.m_nAddr) + return pEntry->index(); + else + pEntry = pEntry->m_pNext; + } + } + return ((sal_uInt16)(-1)); +} + +/*======================================================================== + * + * OStorePageCache implementation. + * + * (two-way association (sorted address array, LRU chain)). + * (external OStorePageData representation). + * + *======================================================================*/ +/* + * OStorePageCache. + */ +OStorePageCache::OStorePageCache (sal_uInt16 nPages) + : m_nSize (STORE_LIMIT_CACHEPAGES), + m_nUsed (0), + m_pHead (0), + m_nHit (0), + m_nMissed (0), + m_nUpdHit (0), + m_nUpdLRU (0), + m_nWrtBack (0) +{ + for (sal_uInt16 i = 0; i < m_nSize; i++) + m_pData[i] = NULL; + if (nPages < m_nSize) + m_nSize = nPages; +} + +/* + * ~OStorePageCache. + */ +OStorePageCache::~OStorePageCache (void) +{ + double x = hitRatio(); + for (sal_uInt16 i = 0; i < m_nSize; i++) + delete m_pData[i]; +} + +/* + * find. + */ +sal_uInt16 OStorePageCache::find (const OStorePageDescriptor &rDescr) const +{ + register sal_Int32 l = 0; + register sal_Int32 r = m_nUsed - 1; + + while (l < r) + { + register sal_Int32 m = ((l + r) >> 1); + + if (m_pData[m]->m_aDescr.m_nAddr == rDescr.m_nAddr) + return ((sal_uInt16)(m)); + if (m_pData[m]->m_aDescr.m_nAddr < rDescr.m_nAddr) + l = m + 1; + else + r = m - 1; + } + + // Match or insert position. Caller must do final compare. + return ((sal_uInt16)(r)); +} + +/* + * move. + */ +void OStorePageCache::move (sal_uInt16 nSI, sal_uInt16 nDI) +{ + entry *p = m_pData[nSI]; + if (nSI < nDI) + { + // shift left. + rtl_moveMemory ( + &m_pData[nSI ], + &m_pData[nSI + 1], + (nDI - nSI) * sizeof(entry*)); + + // re-index. + for (sal_uInt16 i = nSI; i < nDI; i++) + m_pData[i]->index(i); + } + if (nSI > nDI) + { + // shift right. + rtl_moveMemory ( + &m_pData[nDI + 1], + &m_pData[nDI ], + (nSI - nDI) * sizeof(entry*)); + + // re-index. + for (sal_uInt16 i = nSI; i > nDI; i--) + m_pData[i]->index(i); + } + m_pData[nDI] = p; + m_pData[nDI]->index(nDI); + +#if 0 /* DEBUG */ + VOS_POSTCOND( + __store_check_entry(&m_pData[0], m_nUsed), + "OStorePageCache::move(): check_entry() failed"); +#endif /* DEBUG */ +} + +/* + * insert. + */ +storeError OStorePageCache::insert ( + sal_uInt16 nDI, + const OStorePageDescriptor &rDescr, + const OStorePageData &rData, + OStorePageBIOS &rBIOS, + InsertMode eMode) +{ +#if 0 /* DEBUG */ + VOS_PRECOND( + __store_check_entry(&m_pData[0], m_nUsed), + "OStorePageCache::insert(): check_entry() failed"); +#endif /* DEBUG */ + + entry::CompareResult result = entry::COMPARE_EQUAL; + if (nDI < m_nUsed) + { + result = m_pData[nDI]->compare (rDescr); + if (result == entry::COMPARE_LESS) + nDI += 1; + } + + if (nDI == (sal_uInt16)(-1)) + nDI = 0; + if (nDI == m_nSize) + nDI -= 1; + + if (m_nUsed < m_nSize) + { + // Allocate cache entry. + m_pData[m_nUsed] = new entry (rDescr, rData); + move (m_nUsed, nDI); + m_nUsed++; + + // Update LRU. + if (m_pHead) + m_pHead->backlink (*m_pData[nDI]); + m_pHead = m_pData[nDI]; + } + else + { + // Check for invalidated cache entry. + sal_uInt16 nSI = m_nUsed - 1; + if (m_pData[nSI]->isValid()) + { + // Replace least recently used cache entry. + m_nUpdLRU++; + + m_pHead = m_pHead->m_pPrev; + nSI = m_pHead->index(); + + // Check DirtyBit. + if (m_pHead->isDirty()) + { + // Save PageDescriptor. + OStorePageDescriptor aDescr (m_pHead->m_aDescr); + + // Write page. + storeError eErrCode = rBIOS.write ( + aDescr.m_nAddr, m_pHead->m_pData, aDescr.m_nSize); + if (eErrCode != store_E_None) + return eErrCode; + + // Mark as clean. + m_pHead->clean(); + m_nWrtBack++; + } + } + else + { + // Replace invalidated cache entry. Check LRU. + if (!(m_pData[nSI] == m_pHead)) + { + // Update LRU. + m_pData[nSI]->unlink(); + m_pHead->backlink (*m_pData[nSI]); + m_pHead = m_pData[nSI]; + } + } + + // Check source and destination indices. + if (nSI < nDI) + { + result = m_pData[nDI]->compare(rDescr); + if (result == entry::COMPARE_GREATER) + nDI -= 1; + } + + // Assign data. + m_pData[nSI]->assign (rDescr, rData); + move (nSI, nDI); + } + + // Check InsertMode. + if (eMode == INSERT_CLEAN) + m_pHead->clean(); + else + m_pHead->dirty(); + + // Done. + return store_E_None; +} + +/* + * load. + */ +storeError OStorePageCache::load ( + const OStorePageDescriptor &rDescr, + OStorePageData &rData, + OStorePageBIOS &rBIOS, + NAMESPACE_VOS(IMutex) *pMutex) +{ + // Enter. + STORE_METHOD_ENTER(pMutex); + + // Find cache index. + sal_uInt16 i = find (rDescr); + if (i < m_nUsed) + { + if (m_pData[i]->compare(rDescr) == entry::COMPARE_EQUAL) + { + // Cache hit. + m_nHit++; + + if (!(m_pData[i] == m_pHead)) + { + // Update LRU. + m_pData[i]->unlink(); + m_pHead->backlink (*m_pData[i]); + m_pHead = m_pData[i]; + } + + // Load data and Leave. + __store_memcpy (&rData, m_pHead->m_pData, rDescr.m_nSize); + STORE_METHOD_LEAVE(pMutex, store_E_None); + } + } + + // Cache miss. + m_nMissed++; + + // Load data. + storeError eErrCode = rBIOS.read ( + rDescr.m_nAddr, &rData, rDescr.m_nSize); + if (eErrCode != store_E_None) + STORE_METHOD_LEAVE(pMutex, eErrCode); + + // Insert data. + eErrCode = insert (i, rDescr, rData, rBIOS, INSERT_CLEAN); + if (eErrCode != store_E_None) + STORE_METHOD_LEAVE(pMutex, eErrCode); + + // Leave with pending verification. + STORE_METHOD_LEAVE(pMutex, store_E_Pending); +} + +/* + * update. + */ +storeError OStorePageCache::update ( + const OStorePageDescriptor &rDescr, + const OStorePageData &rData, + OStorePageBIOS &rBIOS, + NAMESPACE_VOS(IMutex) *pMutex, + UpdateMode eMode) +{ + // Enter. + STORE_METHOD_ENTER(pMutex); + + // Check UpdateMode. + if (eMode == UPDATE_WRITE_THROUGH) + { + // Save data. + storeError eErrCode = rBIOS.write ( + rDescr.m_nAddr, &rData, rDescr.m_nSize); + if (eErrCode != store_E_None) + STORE_METHOD_LEAVE(pMutex, eErrCode); + m_nWrtBack++; + } + + // Find cache index. + sal_uInt16 i = find (rDescr); + if (i < m_nUsed) + { + if (m_pData[i]->compare(rDescr) == entry::COMPARE_EQUAL) + { + // Cache hit. Check LRU. + m_nUpdHit++; + if (!(m_pData[i] == m_pHead)) + { + // Update LRU. + m_pData[i]->unlink(); + m_pHead->backlink (*m_pData[i]); + m_pHead = m_pData[i]; + } + + // Check UpdateMode. + if (eMode == UPDATE_WRITE_THROUGH) + m_pHead->clean(); + else + m_pHead->dirty(); + + // Update data and leave. + __store_memcpy (m_pHead->m_pData, &rData, rDescr.m_nSize); + STORE_METHOD_LEAVE(pMutex, store_E_None); + } + } + + // Cache miss. Insert data and leave. + storeError eErrCode = insert ( + i, rDescr, rData, rBIOS, + ((eMode == UPDATE_WRITE_THROUGH) ? INSERT_CLEAN : INSERT_DIRTY)); + STORE_METHOD_LEAVE(pMutex, eErrCode); +} + +/* + * invalidate. + */ +storeError OStorePageCache::invalidate ( + const OStorePageDescriptor &rDescr, + NAMESPACE_VOS(IMutex) *pMutex) +{ + // Enter. + STORE_METHOD_ENTER(pMutex); + + // Find cache index. + sal_uInt16 i = find (rDescr); + if (i < m_nUsed) + { + if (m_pData[i]->compare(rDescr) == entry::COMPARE_EQUAL) + { + // Cache hit. Update LRU. + if (!(m_pData[i] == m_pHead)) + { + m_pData[i]->unlink(); + m_pHead->backlink (*m_pData[i]); + } + else + { + m_pHead = m_pHead->m_pNext; + } + + // Invalidate. + m_pData[i]->clean(); + m_pData[i]->invalidate(); + move (i, m_nUsed - 1); + } + } + + // Leave. + STORE_METHOD_LEAVE(pMutex, store_E_None); +} + +/* + * flush. + */ +storeError OStorePageCache::flush ( + OStorePageBIOS &rBIOS, + NAMESPACE_VOS(IMutex) *pMutex) +{ + // Enter. + STORE_METHOD_ENTER(pMutex); + + // Check all entries. + for (sal_uInt16 i = 0; i < m_nUsed; i++) + { + // Check for dirty entry. + if (m_pData[i]->isDirty() && m_pData[i]->isValid()) + { + // Save PageDescriptor. + OStorePageDescriptor aDescr (m_pData[i]->m_aDescr); + + // Write page. + storeError eErrCode = rBIOS.write ( + aDescr.m_nAddr, m_pData[i]->m_pData, aDescr.m_nSize); + VOS_POSTCOND( + eErrCode == store_E_None, + "OStorePageCache::flush(): write() failed"); + + // Mark entry clean. + if (eErrCode == store_E_None) + m_pData[i]->clean(); + m_nWrtBack++; + } + } + + // Leave. + STORE_METHOD_LEAVE(pMutex, store_E_None); +} + diff --git a/store/source/storcach.hxx b/store/source/storcach.hxx new file mode 100644 index 000000000000..b5d13003bb7e --- /dev/null +++ b/store/source/storcach.hxx @@ -0,0 +1,231 @@ +/************************************************************************* + * + * $RCSfile: storcach.hxx,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:18:32 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +#ifndef _STORE_STORCACH_HXX +#define _STORE_STORCACH_HXX "$Revision: 1.1.1.1 $" + +#ifndef _SAL_TYPES_H_ +#include +#endif + +#ifndef _VOS_MACROS_HXX_ +#include +#endif +#ifndef _VOS_MUTEX_HXX +#include +#endif + +#ifndef _STORE_TYPES_H_ +#include +#endif +#ifndef _STORE_MACROS_HXX_ +#include +#endif + +#ifdef _USE_NAMESPACE +namespace store { +#endif + +struct OStorePageDescriptor; +struct OStorePageData; +class OStorePageBIOS; + +/*======================================================================== + * + * OStorePageCache interface. + * (OStorePageData in external representation) + * + *======================================================================*/ +#define STORE_DEFAULT_CACHEPAGES 128 +#define STORE_LIMIT_CACHEPAGES 256 + +struct OStorePageCacheEntry; + +class OStorePageCache +{ + typedef OStorePageCacheEntry entry; + +public: + /** Construction. + */ + OStorePageCache ( + sal_uInt16 nPages = STORE_DEFAULT_CACHEPAGES); + + /** Destruction. + */ + ~OStorePageCache (void); + + /** load. + */ + storeError load ( + const OStorePageDescriptor &rDescr, + OStorePageData &rData, + OStorePageBIOS &rBIOS, + NAMESPACE_VOS(IMutex) *pMutex = NULL); + + /** update. + */ + enum UpdateMode + { + UPDATE_WRITE_THROUGH = 0, + UPDATE_WRITE_DELAYED = 1 + }; + + storeError update ( + const OStorePageDescriptor &rDescr, + const OStorePageData &rData, + OStorePageBIOS &rBIOS, + NAMESPACE_VOS(IMutex) *pMutex = NULL, + UpdateMode eMode = UPDATE_WRITE_THROUGH); + + /** invalidate. + */ + storeError invalidate ( + const OStorePageDescriptor &rDescr, + NAMESPACE_VOS(IMutex) *pMutex = NULL); + + /** flush. + */ + storeError flush ( + OStorePageBIOS &rBIOS, + NAMESPACE_VOS(IMutex) *pMutex = NULL); + + /** hitRatio [nHit / (nHit + nMissed)]. + */ + inline double hitRatio (void) const; + + /** usageRatio [nUsed / nSize]. + */ + inline double usageRatio (void) const; + +private: + /** Representation. + */ + sal_uInt16 m_nSize; + sal_uInt16 m_nUsed; + entry *m_pData[STORE_LIMIT_CACHEPAGES]; + entry *m_pHead; + + sal_uInt32 m_nHit; + sal_uInt32 m_nMissed; + sal_uInt32 m_nUpdHit; + sal_uInt32 m_nUpdLRU; + sal_uInt32 m_nWrtBack; + + /** Implementation. + */ + sal_uInt16 find (const OStorePageDescriptor &rDescr) const; + void move (sal_uInt16 nSI, sal_uInt16 nDI); + + /** insert. + */ + enum InsertMode + { + INSERT_CLEAN = 0, + INSERT_DIRTY = 1 + }; + + storeError insert ( + sal_uInt16 nIndex, + const OStorePageDescriptor &rDescr, + const OStorePageData &rData, + OStorePageBIOS &rBIOS, + InsertMode eMode = INSERT_CLEAN); + + /** Not implemented. + */ + OStorePageCache (const OStorePageCache& rOther); + OStorePageCache& operator= (const OStorePageCache& rOther); +}; + +/* + * hitRatio [nHit / (nHit + nMissed)]. + */ +inline double OStorePageCache::hitRatio (void) const +{ + if (m_nHit || m_nMissed) + return ((double)m_nHit / (double)(m_nHit + m_nMissed)); + else + return 1.0; +} + +/* + * usageRatio [nUsed / nSize]. + */ +inline double OStorePageCache::usageRatio (void) const +{ + if (m_nUsed < m_nSize) + return ((double)m_nUsed / (double)m_nSize); + else + return 1.0; +} + +/*======================================================================== + * + * The End. + * + *======================================================================*/ +#ifdef _USE_NAMESPACE +} +#endif + +#endif /* !_STORE_STORCACH_HXX */ + diff --git a/store/source/stordata.cxx b/store/source/stordata.cxx new file mode 100644 index 000000000000..06078297be14 --- /dev/null +++ b/store/source/stordata.cxx @@ -0,0 +1,1754 @@ +/************************************************************************* + * + * $RCSfile: stordata.cxx,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:18:32 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +#define _STORE_STORDATA_CXX_ "$Revision: 1.1.1.1 $" + +#ifndef _SAL_TYPES_H_ +#include +#endif + +#ifndef _VOS_DIAGNOSE_HXX_ +#include +#endif +#ifndef _VOS_MACROS_HXX_ +#include +#endif +#ifndef _VOS_MUTEX_HXX_ +#include +#endif + +#ifndef _STORE_TYPES_H_ +#include +#endif +#ifndef _STORE_MACROS_HXX_ +#include +#endif + +#ifndef _STORE_STORBASE_HXX_ +#include +#endif +#ifndef _STORE_STORDATA_HXX_ +#include +#endif + +#ifdef _USE_NAMESPACE +using namespace store; +#endif + +/*======================================================================== + * + * OStoreIndirectionPageData implementation. + * + *======================================================================*/ +/* + * OStoreIndirectionPageData. + */ +OStoreIndirectionPageData::OStoreIndirectionPageData (sal_uInt16 nPageSize) + : OStorePageData (nPageSize) +{ + initialize(); +} + +/* + * initialize. + */ +void OStoreIndirectionPageData::initialize (void) +{ + base::m_aGuard.m_nMagic = STORE_MAGIC_INDIRECTPAGE; + base::m_aDescr.m_nUsed += self::size(); + self::m_aGuard.m_nMagic = 0; + + sal_uInt16 i, n = capacityCount(); + for (i = 0; i < n; i++) + m_pData[i] = STORE_PAGE_NULL; +} + +/* + * swap. + */ +void OStoreIndirectionPageData::swap (const D& rDescr) +{ +#ifdef OSL_BIGENDIAN + m_aGuard.swap(); + + sal_uInt16 i, n = capacityCount (rDescr); + for (i = 0; i < n; i++) + m_pData[i] = VOS_SWAPDWORD(m_pData[i]); +#endif /* OSL_BIGENDIAN */ +} + +/*======================================================================== + * + * OStoreIndirectionPageObject implementation. + * + *======================================================================*/ +/* + * swap. + */ +void OStoreIndirectionPageObject::swap (const D& rDescr) +{ +#ifdef OSL_BIGENDIAN + base::swap (rDescr); + m_rPage.swap (rDescr); +#endif /* OSL_BIGENDIAN */ +} + +/* + * guard. + */ +void OStoreIndirectionPageObject::guard (const D& rDescr) +{ + base::guard (rDescr); + m_rPage.guard (rDescr); +} + +/* + * verify. + */ +storeError OStoreIndirectionPageObject::verify (const D& rDescr) +{ + storeError eErrCode = base::verify (rDescr); + if (eErrCode != store_E_None) + return eErrCode; + else + return m_rPage.verify (rDescr); +} + +/* + * get (single indirect). + */ +storeError OStoreIndirectionPageObject::get ( + sal_uInt16 nSingle, + OStoreDataPageObject &rData, + OStorePageBIOS &rBIOS, + NAMESPACE_VOS(IMutex) *pMutex) +{ + // Enter. + STORE_METHOD_ENTER(pMutex); + + // Check arguments. + if (!(nSingle < m_rPage.capacityCount())) + STORE_METHOD_LEAVE(pMutex, store_E_InvalidAccess); + + // Obtain data page location. + sal_uInt32 nAddr = m_rPage.m_pData[nSingle]; + if (nAddr == STORE_PAGE_NULL) + STORE_METHOD_LEAVE(pMutex, store_E_NotExists); + + // Load data page. + rData.location (nAddr); + storeError eErrCode = rBIOS.load (rData); + + // Leave. + STORE_METHOD_LEAVE(pMutex, eErrCode); +} + +/* + * get (double indirect). + */ +storeError OStoreIndirectionPageObject::get ( + sal_uInt16 nDouble, + sal_uInt16 nSingle, + page *&rpSingle, + OStoreDataPageObject &rData, + OStorePageBIOS &rBIOS, + NAMESPACE_VOS(IMutex) *pMutex) +{ + // Enter. + STORE_METHOD_ENTER(pMutex); + + // Check arguments. + if (!((nDouble < m_rPage.capacityCount()) && + (nSingle < m_rPage.capacityCount()) )) + STORE_METHOD_LEAVE(pMutex, store_E_InvalidAccess); + + // Check single indirect page location. + if (m_rPage.m_pData[nDouble] == STORE_PAGE_NULL) + STORE_METHOD_LEAVE(pMutex, store_E_NotExists); + + // Check single indirect page buffer. + if (rpSingle == NULL) + { + sal_uInt16 nPageSize = m_rPage.m_aDescr.m_nSize; + rpSingle = new(nPageSize) page(nPageSize); + } + + // Load single indirect page. + OStoreIndirectionPageObject aSingle (*rpSingle); + aSingle.location (m_rPage.m_pData[nDouble]); + + storeError eErrCode = rBIOS.load (aSingle); + if (eErrCode != store_E_None) + STORE_METHOD_LEAVE(pMutex, eErrCode); + + // Get single indirect. + eErrCode = aSingle.get (nSingle, rData, rBIOS, NULL); + + // Leave. + STORE_METHOD_LEAVE(pMutex, eErrCode); +} + +/* + * get (triple indirect). + */ +storeError OStoreIndirectionPageObject::get ( + sal_uInt16 nTriple, + sal_uInt16 nDouble, + sal_uInt16 nSingle, + page *&rpDouble, + page *&rpSingle, + OStoreDataPageObject &rData, + OStorePageBIOS &rBIOS, + NAMESPACE_VOS(IMutex) *pMutex) +{ + // Enter. + STORE_METHOD_ENTER(pMutex); + + // Check arguments. + if (!((nTriple < m_rPage.capacityCount()) && + (nDouble < m_rPage.capacityCount()) && + (nSingle < m_rPage.capacityCount()) )) + STORE_METHOD_LEAVE(pMutex, store_E_InvalidAccess); + + // Check double indirect page location. + if (m_rPage.m_pData[nTriple] == STORE_PAGE_NULL) + STORE_METHOD_LEAVE(pMutex, store_E_NotExists); + + // Check double indirect page buffer. + if (rpDouble == NULL) + { + sal_uInt16 nPageSize = m_rPage.m_aDescr.m_nSize; + rpDouble = new(nPageSize) page(nPageSize); + } + + // Load double indirect page. + OStoreIndirectionPageObject aDouble (*rpDouble); + aDouble.location (m_rPage.m_pData[nTriple]); + + storeError eErrCode = rBIOS.load (aDouble); + if (eErrCode != store_E_None) + STORE_METHOD_LEAVE(pMutex, eErrCode); + + // Get double indirect. + eErrCode = aDouble.get (nDouble, nSingle, rpSingle, rData, rBIOS, NULL); + + // Leave. + STORE_METHOD_LEAVE(pMutex, eErrCode); +} + +/* + * put (single indirect). + */ +storeError OStoreIndirectionPageObject::put ( + sal_uInt16 nSingle, + OStoreDataPageObject &rData, + OStorePageBIOS &rBIOS, + NAMESPACE_VOS(IMutex) *pMutex) +{ + // Enter. + STORE_METHOD_ENTER(pMutex); + + // Check arguments. + storeError eErrCode = store_E_InvalidAccess; + if (!(nSingle < m_rPage.capacityCount())) + STORE_METHOD_LEAVE(pMutex, eErrCode); + + // Obtain data page location. + rData.location (m_rPage.m_pData[nSingle]); + if (rData.location() == STORE_PAGE_NULL) + { + // Allocate data page. + eErrCode = rBIOS.allocate (rData); + if (eErrCode != store_E_None) + STORE_METHOD_LEAVE(pMutex, eErrCode); + + // Save data page location. + m_rPage.m_pData[nSingle] = rData.location(); + touch(); + + // Save this page. + eErrCode = rBIOS.save (*this); + if (eErrCode != store_E_None) + STORE_METHOD_LEAVE(pMutex, eErrCode); + } + else + { + // Save data page. + eErrCode = rBIOS.save (rData); + } + + // Leave. + STORE_METHOD_LEAVE(pMutex, eErrCode); +} + +/* + * put (double indirect). + */ +storeError OStoreIndirectionPageObject::put ( + sal_uInt16 nDouble, + sal_uInt16 nSingle, + page *&rpSingle, + OStoreDataPageObject &rData, + OStorePageBIOS &rBIOS, + NAMESPACE_VOS(IMutex) *pMutex) +{ + // Enter. + STORE_METHOD_ENTER(pMutex); + + // Check arguments. + storeError eErrCode = store_E_InvalidAccess; + if (!((nDouble < m_rPage.capacityCount()) && + (nSingle < m_rPage.capacityCount()) )) + STORE_METHOD_LEAVE(pMutex, eErrCode); + + // Check single indirect page buffer. + if (rpSingle == NULL) + { + sal_uInt16 nPageSize = m_rPage.m_aDescr.m_nSize; + rpSingle = new(nPageSize) page(nPageSize); + } + + // Obtain single indirect page location. + OStoreIndirectionPageObject aSingle (*rpSingle); + aSingle.location (m_rPage.m_pData[nDouble]); + if (aSingle.location() == STORE_PAGE_NULL) + { + // Initialize single indirect page buffer. + rpSingle->initialize(); + + // Allocate single indirect page. + eErrCode = rBIOS.allocate (aSingle); + if (eErrCode != store_E_None) + STORE_METHOD_LEAVE(pMutex, eErrCode); + + // Save single indirect page location. + m_rPage.m_pData[nDouble] = aSingle.location(); + touch(); + + // Save this page. + eErrCode = rBIOS.save (*this); + if (eErrCode != store_E_None) + STORE_METHOD_LEAVE(pMutex, eErrCode); + } + else + { + // Load single indirect page. + eErrCode = rBIOS.load (aSingle); + if (eErrCode != store_E_None) + STORE_METHOD_LEAVE(pMutex, eErrCode); + } + + // Put single indirect. + eErrCode = aSingle.put (nSingle, rData, rBIOS, NULL); + + // Leave. + STORE_METHOD_LEAVE(pMutex, eErrCode); +} + +/* + * put (triple indirect). + */ +storeError OStoreIndirectionPageObject::put ( + sal_uInt16 nTriple, + sal_uInt16 nDouble, + sal_uInt16 nSingle, + page *&rpDouble, + page *&rpSingle, + OStoreDataPageObject &rData, + OStorePageBIOS &rBIOS, + NAMESPACE_VOS(IMutex) *pMutex) +{ + // Enter. + STORE_METHOD_ENTER(pMutex); + + // Check arguments. + storeError eErrCode = store_E_InvalidAccess; + if (!((nTriple < m_rPage.capacityCount()) && + (nDouble < m_rPage.capacityCount()) && + (nSingle < m_rPage.capacityCount()) )) + STORE_METHOD_LEAVE(pMutex, eErrCode); + + // Check double indirect page buffer. + if (rpDouble == NULL) + { + sal_uInt16 nPageSize = m_rPage.m_aDescr.m_nSize; + rpDouble = new(nPageSize) page(nPageSize); + } + + // Obtain double indirect page location. + OStoreIndirectionPageObject aDouble (*rpDouble); + aDouble.location (m_rPage.m_pData[nTriple]); + if (aDouble.location() == STORE_PAGE_NULL) + { + // Initialize double indirect page buffer. + rpDouble->initialize(); + + // Allocate double indirect page. + eErrCode = rBIOS.allocate (aDouble); + if (eErrCode != store_E_None) + STORE_METHOD_LEAVE(pMutex, eErrCode); + + // Save double indirect page location. + m_rPage.m_pData[nTriple] = aDouble.location(); + touch(); + + // Save this page. + eErrCode = rBIOS.save (*this); + if (eErrCode != store_E_None) + STORE_METHOD_LEAVE(pMutex, eErrCode); + } + else + { + // Load double indirect page. + eErrCode = rBIOS.load (aDouble); + if (eErrCode != store_E_None) + STORE_METHOD_LEAVE(pMutex, eErrCode); + } + + // Put double indirect. + eErrCode = aDouble.put (nDouble, nSingle, rpSingle, rData, rBIOS, NULL); + + // Leave. + STORE_METHOD_LEAVE(pMutex, eErrCode); +} + +/* + * truncate (single indirect). + */ +storeError OStoreIndirectionPageObject::truncate ( + sal_uInt16 nSingle, + OStoreDataPageObject &rData, + OStorePageBIOS &rBIOS, + NAMESPACE_VOS(IMutex) *pMutex) +{ + // Enter. + STORE_METHOD_ENTER(pMutex); + + // Check arguments. + sal_uInt16 i, n = m_rPage.capacityCount(); + if (!(nSingle < n)) + STORE_METHOD_LEAVE(pMutex, store_E_InvalidAccess); + + // Save PageDescriptor. + D aDescr (m_rPage.m_aDescr); + + // Acquire Lock. + storeError eErrCode = rBIOS.acquireLock (aDescr.m_nAddr, aDescr.m_nSize); + if (eErrCode != store_E_None) + STORE_METHOD_LEAVE(pMutex, eErrCode); + + // Truncate. + for (i = n; i > nSingle; i--) + { + // Obtain data page location. + sal_uInt32 nAddr = m_rPage.m_pData[i - 1]; + if (nAddr == STORE_PAGE_NULL) continue; + + // Free data page. + rData.location (nAddr); + eErrCode = rBIOS.free (rData); + if (eErrCode != store_E_None) + { + rBIOS.releaseLock (aDescr.m_nAddr, aDescr.m_nSize); + STORE_METHOD_LEAVE(pMutex, eErrCode); + } + + // Clear pointer to data page. + m_rPage.m_pData[i - 1] = STORE_PAGE_NULL; + touch(); + } + + // Check for modified page. + if (dirty()) + { + // Save this page. + eErrCode = rBIOS.save (*this); + if (eErrCode != store_E_None) + { + // Must not happen. + VOS_TRACE("OStoreIndirectionPageObject::truncate(): save failed"); + + // Release Lock and Leave. + rBIOS.releaseLock (aDescr.m_nAddr, aDescr.m_nSize); + STORE_METHOD_LEAVE(pMutex, eErrCode); + } + } + + // Release Lock and Leave. + eErrCode = rBIOS.releaseLock (aDescr.m_nAddr, aDescr.m_nSize); + STORE_METHOD_LEAVE(pMutex, eErrCode); +} + +/* + * truncate (double indirect). + */ +storeError OStoreIndirectionPageObject::truncate ( + sal_uInt16 nDouble, + sal_uInt16 nSingle, + page *&rpSingle, + OStoreDataPageObject &rData, + OStorePageBIOS &rBIOS, + NAMESPACE_VOS(IMutex) *pMutex) +{ + // Acquire Mutex. + STORE_METHOD_ENTER(pMutex); + + // Check arguments. + if (!((nDouble < m_rPage.capacityCount()) && + (nSingle < m_rPage.capacityCount()) )) + STORE_METHOD_LEAVE(pMutex, store_E_InvalidAccess); + + // Save PageDescriptor. + D aDescr (m_rPage.m_aDescr); + + // Acquire Lock. + storeError eErrCode = rBIOS.acquireLock (aDescr.m_nAddr, aDescr.m_nSize); + if (eErrCode != store_E_None) + STORE_METHOD_LEAVE(pMutex, eErrCode); + + // Truncate. + sal_uInt16 i, n = m_rPage.capacityCount(); + for (i = n; i > nDouble + 1; i--) + { + // Obtain single indirect page location. + sal_uInt32 nAddr = m_rPage.m_pData[i - 1]; + if (nAddr == STORE_PAGE_NULL) continue; + + // Check single indirect page buffer. + if (rpSingle == NULL) + { + sal_uInt16 nPageSize = m_rPage.m_aDescr.m_nSize; + rpSingle = new(nPageSize) page(nPageSize); + } + + // Load single indirect page. + OStoreIndirectionPageObject aSingle (*rpSingle); + aSingle.location (nAddr); + + eErrCode = rBIOS.load (aSingle); + if (eErrCode == store_E_None) + { + // Truncate to zero direct pages. + eErrCode = aSingle.truncate (0, rData, rBIOS, NULL); + if (eErrCode != store_E_None) + { + rBIOS.releaseLock (aDescr.m_nAddr, aDescr.m_nSize); + STORE_METHOD_LEAVE(pMutex, eErrCode); + } + + // Free single indirect page. + eErrCode = rBIOS.free (aSingle); + if (eErrCode != store_E_None) + { + rBIOS.releaseLock (aDescr.m_nAddr, aDescr.m_nSize); + STORE_METHOD_LEAVE(pMutex, eErrCode); + } + } + else + { + if (eErrCode != store_E_InvalidChecksum) + { + rBIOS.releaseLock (aDescr.m_nAddr, aDescr.m_nSize); + STORE_METHOD_LEAVE(pMutex, eErrCode); + } + } + + // Clear pointer to single indirect page. + m_rPage.m_pData[i - 1] = STORE_PAGE_NULL; + touch(); + } + + // Obtain last single indirect page location. + sal_uInt32 nAddr = m_rPage.m_pData[nDouble]; + if (nAddr != STORE_PAGE_NULL) + { + // Check single indirect page buffer. + if (rpSingle == NULL) + { + sal_uInt16 nPageSize = m_rPage.m_aDescr.m_nSize; + rpSingle = new(nPageSize) page(nPageSize); + } + + // Load last single indirect page. + OStoreIndirectionPageObject aSingle (*rpSingle); + aSingle.location (nAddr); + + eErrCode = rBIOS.load (aSingle); + if (eErrCode == store_E_None) + { + // Truncate to 'nSingle' direct pages. + eErrCode = aSingle.truncate (nSingle, rData, rBIOS, NULL); + if (eErrCode != store_E_None) + { + rBIOS.releaseLock (aDescr.m_nAddr, aDescr.m_nSize); + STORE_METHOD_LEAVE(pMutex, eErrCode); + } + } + else + { + if (eErrCode != store_E_InvalidChecksum) + { + rBIOS.releaseLock (aDescr.m_nAddr, aDescr.m_nSize); + STORE_METHOD_LEAVE(pMutex, eErrCode); + } + } + + // Check for complete truncation. + if (nSingle == 0) + { + // Free last single indirect page. + eErrCode = rBIOS.free (aSingle); + if (eErrCode != store_E_None) + { + rBIOS.releaseLock (aDescr.m_nAddr, aDescr.m_nSize); + STORE_METHOD_LEAVE(pMutex, eErrCode); + } + + // Clear pointer to last single indirect page. + m_rPage.m_pData[nDouble] = STORE_PAGE_NULL; + touch(); + } + } + + // Check for modified page. + if (dirty()) + { + // Save this page. + eErrCode = rBIOS.save (*this); + if (eErrCode != store_E_None) + { + // Must not happen. + VOS_TRACE("OStoreIndirectionPageObject::truncate(): save failed"); + + // Release Lock and Leave. + rBIOS.releaseLock (aDescr.m_nAddr, aDescr.m_nSize); + STORE_METHOD_LEAVE(pMutex, eErrCode); + } + } + + // Release Lock and Leave. + eErrCode = rBIOS.releaseLock (aDescr.m_nAddr, aDescr.m_nSize); + STORE_METHOD_LEAVE(pMutex, eErrCode); +} + +/* + * truncate (triple indirect). + */ +storeError OStoreIndirectionPageObject::truncate ( + sal_uInt16 nTriple, + sal_uInt16 nDouble, + sal_uInt16 nSingle, + page *&rpDouble, + page *&rpSingle, + OStoreDataPageObject &rData, + OStorePageBIOS &rBIOS, + NAMESPACE_VOS(IMutex) *pMutex) +{ + // Enter. + STORE_METHOD_ENTER(pMutex); + + // Check arguments. + if (!((nTriple < m_rPage.capacityCount()) && + (nDouble < m_rPage.capacityCount()) && + (nSingle < m_rPage.capacityCount()) )) + STORE_METHOD_LEAVE(pMutex, store_E_InvalidAccess); + + // Save PageDescriptor. + D aDescr (m_rPage.m_aDescr); + + // Acquire Lock. + storeError eErrCode = rBIOS.acquireLock (aDescr.m_nAddr, aDescr.m_nSize); + if (eErrCode != store_E_None) + STORE_METHOD_LEAVE(pMutex, eErrCode); + + // Truncate. + sal_uInt16 i, n = m_rPage.capacityCount(); + for (i = n; i > nTriple + 1; i--) + { + // Obtain double indirect page location. + sal_uInt32 nAddr = m_rPage.m_pData[i - 1]; + if (nAddr == STORE_PAGE_NULL) continue; + + // Check double indirect page buffer. + if (rpDouble == NULL) + { + sal_uInt16 nPageSize = m_rPage.m_aDescr.m_nSize; + rpDouble = new(nPageSize) page(nPageSize); + } + + // Load double indirect page. + OStoreIndirectionPageObject aDouble (*rpDouble); + aDouble.location (nAddr); + + eErrCode = rBIOS.load (aDouble); + if (eErrCode == store_E_None) + { + // Truncate to zero single indirect pages. + eErrCode = aDouble.truncate ( + 0, 0, rpSingle, rData, rBIOS, NULL); + if (eErrCode != store_E_None) + { + rBIOS.releaseLock (aDescr.m_nAddr, aDescr.m_nSize); + STORE_METHOD_LEAVE(pMutex, eErrCode); + } + + // Free double indirect page. + eErrCode = rBIOS.free (aDouble); + if (eErrCode != store_E_None) + { + rBIOS.releaseLock (aDescr.m_nAddr, aDescr.m_nSize); + STORE_METHOD_LEAVE(pMutex, eErrCode); + } + } + else + { + if (eErrCode != store_E_InvalidChecksum) + { + rBIOS.releaseLock (aDescr.m_nAddr, aDescr.m_nSize); + STORE_METHOD_LEAVE(pMutex, eErrCode); + } + } + + // Clear pointer to double indirect page. + m_rPage.m_pData[i - 1] = STORE_PAGE_NULL; + touch(); + } + + // Obtain last double indirect page location. + sal_uInt32 nAddr = m_rPage.m_pData[nTriple]; + if (nAddr != STORE_PAGE_NULL) + { + // Check double indirect page buffer. + if (rpDouble == NULL) + { + sal_uInt16 nPageSize = m_rPage.m_aDescr.m_nSize; + rpDouble = new(nPageSize) page(nPageSize); + } + + // Load last double indirect page. + OStoreIndirectionPageObject aDouble (*rpDouble); + aDouble.location (nAddr); + + eErrCode = rBIOS.load (aDouble); + if (eErrCode == store_E_None) + { + // Truncate to 'nDouble', 'nSingle' pages. + eErrCode = aDouble.truncate ( + nDouble, nSingle, rpSingle, rData, rBIOS, NULL); + if (eErrCode != store_E_None) + { + rBIOS.releaseLock (aDescr.m_nAddr, aDescr.m_nSize); + STORE_METHOD_LEAVE(pMutex, eErrCode); + } + } + else + { + if (eErrCode != store_E_InvalidChecksum) + { + rBIOS.releaseLock (aDescr.m_nAddr, aDescr.m_nSize); + STORE_METHOD_LEAVE(pMutex, eErrCode); + } + } + + // Check for complete truncation. + if ((nDouble + nSingle) == 0) + { + // Free last double indirect page. + eErrCode = rBIOS.free (aDouble); + if (eErrCode != store_E_None) + { + rBIOS.releaseLock (aDescr.m_nAddr, aDescr.m_nSize); + STORE_METHOD_LEAVE(pMutex, eErrCode); + } + + // Clear pointer to last double indirect page. + m_rPage.m_pData[nTriple] = STORE_PAGE_NULL; + touch(); + } + } + + // Check for modified page. + if (dirty()) + { + // Save this page. + eErrCode = rBIOS.save (*this); + if (eErrCode != store_E_None) + { + // Must not happen. + VOS_TRACE("OStoreIndirectionPageObject::truncate(): save failed"); + + // Release Lock and Leave. + rBIOS.releaseLock (aDescr.m_nAddr, aDescr.m_nSize); + STORE_METHOD_LEAVE(pMutex, eErrCode); + } + } + + // Release Lock and Leave. + eErrCode = rBIOS.releaseLock (aDescr.m_nAddr, aDescr.m_nSize); + STORE_METHOD_LEAVE(pMutex, eErrCode); +} + +/*======================================================================== + * + * OStoreDirectoryDataBlock::LinkTable implementation. + * + *======================================================================*/ +/* + * LinkTable::LinkTable. + */ +OStoreDirectoryDataBlock::LinkTable::LinkTable (void) +{ + initialize(); +} + +/* + * LinkTable::initialize. + */ +void OStoreDirectoryDataBlock::LinkTable::initialize (void) +{ + sal_Int32 i; + for (i = 0; i < STORE_LIMIT_DATAPAGE_DIRECT; i++) + m_pDirect[i] = STORE_PAGE_NULL; + for (i = 0; i < STORE_LIMIT_DATAPAGE_SINGLE; i++) + m_pSingle[i] = STORE_PAGE_NULL; + for (i = 0; i < STORE_LIMIT_DATAPAGE_DOUBLE; i++) + m_pDouble[i] = STORE_PAGE_NULL; + for (i = 0; i < STORE_LIMIT_DATAPAGE_TRIPLE; i++) + m_pTriple[i] = STORE_PAGE_NULL; +} + +/* + * LinkTable::swap. + */ +void OStoreDirectoryDataBlock::LinkTable::swap (void) +{ +#ifdef OSL_BIGENDIAN + sal_Int32 i; + for (i = 0; i < STORE_LIMIT_DATAPAGE_DIRECT; i++) + m_pDirect[i] = VOS_SWAPDWORD(m_pDirect[i]); + for (i = 0; i < STORE_LIMIT_DATAPAGE_SINGLE; i++) + m_pSingle[i] = VOS_SWAPDWORD(m_pSingle[i]); + for (i = 0; i < STORE_LIMIT_DATAPAGE_DOUBLE; i++) + m_pDouble[i] = VOS_SWAPDWORD(m_pDouble[i]); + for (i = 0; i < STORE_LIMIT_DATAPAGE_TRIPLE; i++) + m_pTriple[i] = VOS_SWAPDWORD(m_pTriple[i]); +#endif /* OSL_BIGENDIAN */ +} + +/*======================================================================== + * + * OStoreDirectoryPageObject implementation. + * + *======================================================================*/ +/* + * swap. + */ +void OStoreDirectoryPageObject::swap (const D& rDescr) +{ +#ifdef OSL_BIGENDIAN + base::swap (rDescr); + m_rPage.swap (rDescr); +#endif /* OSL_BIGENDIAN */ +} + +/* + * guard. + */ +void OStoreDirectoryPageObject::guard (const D& rDescr) +{ + base::guard (rDescr); + m_rPage.guard (rDescr); +} + +/* + * verify. + */ +storeError OStoreDirectoryPageObject::verify (const D& rDescr) +{ + storeError eErrCode = base::verify (rDescr); + if (eErrCode != store_E_None) + return eErrCode; + else + return m_rPage.verify (rDescr); +} + +/* + * scope (external data page). + */ +OStoreDirectoryPageData::ChunkScope +OStoreDirectoryPageObject::scope ( + sal_uInt32 nPage, + page::DataBlock::LinkDescriptor &rDescr) const +{ + typedef OStoreIndirectionPageData indirect; + sal_uInt32 index0, index1, index2, index3; + + // direct. + sal_uInt32 nCount = m_rPage.m_aDataBlock.directCount(); + sal_uInt32 nLimit = nCount; + if (nPage < nLimit) + { + // Page to index reduction. + index0 = nPage; + + // Setup LinkDescriptor indices. + rDescr.m_nIndex0 = (sal_uInt16)(index0 & 0xffff); + + // Done. + return page::SCOPE_DIRECT; + } + nPage -= nLimit; + + // single indirect. + sal_uInt32 nCapacity = indirect::capacityCount(m_rPage.m_aDescr); + nCount = m_rPage.m_aDataBlock.singleCount(); + nLimit = nCount * nCapacity; + if (nPage < nLimit) + { + // Page to index reduction. + sal_uInt32 n = nPage; + + // Reduce to single indirect i(1), direct n = i(0). + index1 = n / nCapacity; + index0 = n % nCapacity; + + // Verify reduction. + n = index1 * nCapacity + index0; + VOS_POSTCOND(n == nPage, "wrong math on indirect indices"); + if (n != nPage) + return page::SCOPE_UNKNOWN; + + // Setup LinkDescriptor indices. + rDescr.m_nIndex0 = (sal_uInt16)(index0 & 0xffff); + rDescr.m_nIndex1 = (sal_uInt16)(index1 & 0xffff); + + // Done. + return page::SCOPE_SINGLE; + } + nPage -= nLimit; + + // double indirect. + nCount = m_rPage.m_aDataBlock.doubleCount(); + nLimit = nCount * nCapacity * nCapacity; + if (nPage < nLimit) + { + // Page to index reduction. + sal_uInt32 n = nPage; + + // Reduce to double indirect i(2), single indirect n = i(0). + index2 = n / (nCapacity * nCapacity); + n = n % (nCapacity * nCapacity); + + // Reduce to single indirect i(1), direct n = i(0). + index1 = n / nCapacity; + index0 = n % nCapacity; + + // Verify reduction. + n = index2 * nCapacity * nCapacity + + index1 * nCapacity + index0; + VOS_POSTCOND(n == nPage, "wrong math on double indirect indices"); + if (n != nPage) + return page::SCOPE_UNKNOWN; + + // Setup LinkDescriptor indices. + rDescr.m_nIndex0 = (sal_uInt16)(index0 & 0xffff); + rDescr.m_nIndex1 = (sal_uInt16)(index1 & 0xffff); + rDescr.m_nIndex2 = (sal_uInt16)(index2 & 0xffff); + + // Done. + return page::SCOPE_DOUBLE; + } + nPage -= nLimit; + + // triple indirect. + nCount = m_rPage.m_aDataBlock.tripleCount(); + nLimit = nCount * nCapacity * nCapacity * nCapacity; + if (nPage < nLimit) + { + // Page to index reduction. + sal_uInt32 n = nPage; + + // Reduce to triple indirect i(3), double indirect n. + index3 = n / (nCapacity * nCapacity * nCapacity); + n = n % (nCapacity * nCapacity * nCapacity); + + // Reduce to double indirect i(2), single indirect n. + index2 = n / (nCapacity * nCapacity); + n = n % (nCapacity * nCapacity); + + // Reduce to single indirect i(1), direct n = i(0). + index1 = n / nCapacity; + index0 = n % nCapacity; + + // Verify reduction. + n = index3 * nCapacity * nCapacity * nCapacity + + index2 * nCapacity * nCapacity + + index1 * nCapacity + index0; + VOS_POSTCOND(n == nPage, "wrong math on triple indirect indices"); + if (n != nPage) + return page::SCOPE_UNKNOWN; + + // Setup LinkDescriptor indices. + rDescr.m_nIndex0 = (sal_uInt16)(index0 & 0xffff); + rDescr.m_nIndex1 = (sal_uInt16)(index1 & 0xffff); + rDescr.m_nIndex2 = (sal_uInt16)(index2 & 0xffff); + rDescr.m_nIndex3 = (sal_uInt16)(index3 & 0xffff); + + // Done. + return page::SCOPE_TRIPLE; + } + + // Unreachable (more than triple indirect). + return page::SCOPE_UNREACHABLE; +} + +/* + * get (external data page). + */ +storeError OStoreDirectoryPageObject::get ( + sal_uInt32 nPage, + indirect *&rpSingle, + indirect *&rpDouble, + indirect *&rpTriple, + OStoreDataPageObject &rData, + OStorePageBIOS &rBIOS, + NAMESPACE_VOS(IMutex) *pMutex) +{ + // Enter. + STORE_METHOD_ENTER(pMutex); + + // Determine scope and link indices. + page::DataBlock::LinkDescriptor aLink; + page::ChunkScope eScope = scope (nPage, aLink); + + storeError eErrCode = store_E_None; + if (eScope == page::SCOPE_DIRECT) + { + sal_uInt32 nAddr = directLink (aLink.m_nIndex0); + if (nAddr == STORE_PAGE_NULL) + STORE_METHOD_LEAVE(pMutex, store_E_NotExists); + + rData.location (nAddr); + eErrCode = rBIOS.load (rData); + } + else if (eScope == page::SCOPE_SINGLE) + { + sal_uInt32 nAddr = singleLink (aLink.m_nIndex1); + if (nAddr == STORE_PAGE_NULL) + STORE_METHOD_LEAVE(pMutex, store_E_NotExists); + + if (rpSingle == NULL) + { + sal_uInt16 nPageSize = m_rPage.m_aDescr.m_nSize; + rpSingle = new(nPageSize) indirect(nPageSize); + } + + OStoreIndirectionPageObject aSingle (*rpSingle); + aSingle.location (nAddr); + + eErrCode = rBIOS.load (aSingle); + if (eErrCode != store_E_None) + STORE_METHOD_LEAVE(pMutex, eErrCode); + + eErrCode = aSingle.get ( + aLink.m_nIndex0, + rData, rBIOS, NULL); + } + else if (eScope == page::SCOPE_DOUBLE) + { + sal_uInt32 nAddr = doubleLink (aLink.m_nIndex2); + if (nAddr == STORE_PAGE_NULL) + STORE_METHOD_LEAVE(pMutex, store_E_NotExists); + + if (rpDouble == NULL) + { + sal_uInt16 nPageSize = m_rPage.m_aDescr.m_nSize; + rpDouble = new(nPageSize) indirect(nPageSize); + } + + OStoreIndirectionPageObject aDouble (*rpDouble); + aDouble.location (nAddr); + + eErrCode = rBIOS.load (aDouble); + if (eErrCode != store_E_None) + STORE_METHOD_LEAVE(pMutex, eErrCode); + + eErrCode = aDouble.get ( + aLink.m_nIndex1, + aLink.m_nIndex0, + rpSingle, + rData, rBIOS, NULL); + } + else if (eScope == page::SCOPE_TRIPLE) + { + sal_uInt32 nAddr = tripleLink (aLink.m_nIndex3); + if (nAddr == STORE_PAGE_NULL) + STORE_METHOD_LEAVE(pMutex, store_E_NotExists); + + if (rpTriple == NULL) + { + sal_uInt16 nPageSize = m_rPage.m_aDescr.m_nSize; + rpTriple = new(nPageSize) indirect(nPageSize); + } + + OStoreIndirectionPageObject aTriple (*rpTriple); + aTriple.location (nAddr); + + eErrCode = rBIOS.load (aTriple); + if (eErrCode != store_E_None) + STORE_METHOD_LEAVE(pMutex, eErrCode); + + eErrCode = aTriple.get ( + aLink.m_nIndex2, + aLink.m_nIndex1, + aLink.m_nIndex0, + rpDouble, + rpSingle, + rData, rBIOS, NULL); + } + else if (eScope == page::SCOPE_UNREACHABLE) + { + // Out of scope. + eErrCode = store_E_CantSeek; + } + else + { + // Unknown scope. + VOS_TRACE("OStoreDirectoryPageObject::get(): scope failed"); + eErrCode = store_E_Unknown; + } + + // Leave. + STORE_METHOD_LEAVE(pMutex, eErrCode); +} + +/* + * put (external data page). + */ +storeError OStoreDirectoryPageObject::put ( + sal_uInt32 nPage, + indirect *&rpSingle, + indirect *&rpDouble, + indirect *&rpTriple, + OStoreDataPageObject &rData, + OStorePageBIOS &rBIOS, + NAMESPACE_VOS(IMutex) *pMutex) +{ + // Enter. + STORE_METHOD_ENTER(pMutex); + + // Determine scope and link indices. + page::DataBlock::LinkDescriptor aLink; + page::ChunkScope eScope = scope (nPage, aLink); + + storeError eErrCode = store_E_None; + if (eScope == page::SCOPE_DIRECT) + { + rData.location (directLink (aLink.m_nIndex0)); + if (rData.location() == STORE_PAGE_NULL) + { + eErrCode = rBIOS.allocate (rData); + if (eErrCode != store_E_None) + STORE_METHOD_LEAVE(pMutex, eErrCode); + + directLink (aLink.m_nIndex0, rData.location()); + } + else + { + eErrCode = rBIOS.save (rData); + } + } + else if (eScope == page::SCOPE_SINGLE) + { + if (rpSingle == NULL) + { + sal_uInt16 nPageSize = m_rPage.m_aDescr.m_nSize; + rpSingle = new(nPageSize) indirect(nPageSize); + } + + OStoreIndirectionPageObject aSingle (*rpSingle); + aSingle.location (singleLink (aLink.m_nIndex1)); + if (aSingle.location() == STORE_PAGE_NULL) + { + rpSingle->initialize(); + + eErrCode = rBIOS.allocate (aSingle); + if (eErrCode != store_E_None) + STORE_METHOD_LEAVE(pMutex, eErrCode); + + singleLink (aLink.m_nIndex1, aSingle.location()); + } + else + { + eErrCode = rBIOS.load (aSingle); + if (eErrCode != store_E_None) + STORE_METHOD_LEAVE(pMutex, eErrCode); + } + + eErrCode = aSingle.put ( + aLink.m_nIndex0, + rData, rBIOS, NULL); + } + else if (eScope == page::SCOPE_DOUBLE) + { + if (rpDouble == NULL) + { + sal_uInt16 nPageSize = m_rPage.m_aDescr.m_nSize; + rpDouble = new(nPageSize) indirect(nPageSize); + } + + OStoreIndirectionPageObject aDouble (*rpDouble); + aDouble.location (doubleLink (aLink.m_nIndex2)); + if (aDouble.location() == STORE_PAGE_NULL) + { + rpDouble->initialize(); + + eErrCode = rBIOS.allocate (aDouble); + if (eErrCode != store_E_None) + STORE_METHOD_LEAVE(pMutex, eErrCode); + + doubleLink (aLink.m_nIndex2, aDouble.location()); + } + else + { + eErrCode = rBIOS.load (aDouble); + if (eErrCode != store_E_None) + STORE_METHOD_LEAVE(pMutex, eErrCode); + } + + eErrCode = aDouble.put ( + aLink.m_nIndex1, + aLink.m_nIndex0, + rpSingle, + rData, rBIOS, NULL); + } + else if (eScope == page::SCOPE_TRIPLE) + { + if (rpTriple == NULL) + { + sal_uInt16 nPageSize = m_rPage.m_aDescr.m_nSize; + rpTriple = new(nPageSize) indirect(nPageSize); + } + + OStoreIndirectionPageObject aTriple (*rpTriple); + aTriple.location (tripleLink (aLink.m_nIndex3)); + if (aTriple.location() == STORE_PAGE_NULL) + { + rpTriple->initialize(); + + eErrCode = rBIOS.allocate (aTriple); + if (eErrCode != store_E_None) + STORE_METHOD_LEAVE(pMutex, eErrCode); + + tripleLink (aLink.m_nIndex3, aTriple.location()); + } + else + { + eErrCode = rBIOS.load (aTriple); + if (eErrCode != store_E_None) + STORE_METHOD_LEAVE(pMutex, eErrCode); + } + + eErrCode = aTriple.put ( + aLink.m_nIndex2, + aLink.m_nIndex1, + aLink.m_nIndex0, + rpDouble, + rpSingle, + rData, rBIOS, NULL); + } + else if (eScope == page::SCOPE_UNREACHABLE) + { + // Out of scope. + eErrCode = store_E_CantSeek; + } + else + { + // Unknown scope. + VOS_TRACE("OStoreDirectoryPageObject::put(): scope failed"); + eErrCode = store_E_Unknown; + } + + // Leave. + STORE_METHOD_LEAVE(pMutex, eErrCode); +} + +/* + * truncate (external data page). + */ +storeError OStoreDirectoryPageObject::truncate ( + sal_uInt32 nPage, + indirect *&rpSingle, + indirect *&rpDouble, + indirect *&rpTriple, + OStoreDataPageObject &rData, + OStorePageBIOS &rBIOS, + NAMESPACE_VOS(IMutex) *pMutex) +{ + // Enter. + STORE_METHOD_ENTER(pMutex); + + // Determine scope and link indices. + page::DataBlock::LinkDescriptor aLink; + page::ChunkScope eScope = scope (nPage, aLink); + + storeError eErrCode = store_E_None; + if (eScope == page::SCOPE_DIRECT) + { + // Truncate all triple indirect pages. + eErrCode = truncate ( + page::SCOPE_TRIPLE, 0, + rpSingle, rpDouble, rpTriple, + rData, rBIOS, NULL); + if (eErrCode != store_E_None) + STORE_METHOD_LEAVE(pMutex, eErrCode); + + // Truncate all double indirect pages. + eErrCode = truncate ( + page::SCOPE_DOUBLE, 0, + rpSingle, rpDouble, rpTriple, + rData, rBIOS, NULL); + if (eErrCode != store_E_None) + STORE_METHOD_LEAVE(pMutex, eErrCode); + + // Truncate all single indirect pages. + eErrCode = truncate ( + page::SCOPE_SINGLE, 0, + rpSingle, rpDouble, rpTriple, + rData, rBIOS, NULL); + if (eErrCode != store_E_None) + STORE_METHOD_LEAVE(pMutex, eErrCode); + + // Truncate direct pages, including 'aLink.m_nIndex0'. + eErrCode = truncate ( + eScope, aLink.m_nIndex0, + rpSingle, rpDouble, rpTriple, + rData, rBIOS, NULL); + } + else if (eScope == page::SCOPE_SINGLE) + { + // Truncate all triple indirect pages. + eErrCode = truncate ( + page::SCOPE_TRIPLE, 0, + rpSingle, rpDouble, rpTriple, + rData, rBIOS, NULL); + if (eErrCode != store_E_None) + STORE_METHOD_LEAVE(pMutex, eErrCode); + + // Truncate all double indirect pages. + eErrCode = truncate ( + page::SCOPE_DOUBLE, 0, + rpSingle, rpDouble, rpTriple, + rData, rBIOS, NULL); + if (eErrCode != store_E_None) + STORE_METHOD_LEAVE(pMutex, eErrCode); + + // Truncate single indirect pages, downto 'aLink.m_nIndex1'. + eErrCode = truncate ( + eScope, aLink.m_nIndex1 + 1, + rpSingle, rpDouble, rpTriple, + rData, rBIOS, NULL); + if (eErrCode != store_E_None) + STORE_METHOD_LEAVE(pMutex, eErrCode); + + // Obtain last single indirect page location. + sal_uInt32 nAddr = singleLink (aLink.m_nIndex1); + if (nAddr != STORE_PAGE_NULL) + { + // Check single indirect page buffer. + if (rpSingle == NULL) + { + sal_uInt16 nPageSize = m_rPage.m_aDescr.m_nSize; + rpSingle = new(nPageSize) indirect(nPageSize); + } + + // Load last single indirect page. + OStoreIndirectionPageObject aSingle (*rpSingle); + aSingle.location (nAddr); + + eErrCode = rBIOS.load (aSingle); + if (eErrCode != store_E_None) + STORE_METHOD_LEAVE(pMutex, eErrCode); + + // Truncate to ... pages. + eErrCode = aSingle.truncate ( + aLink.m_nIndex0, + rData, rBIOS, NULL); + if (eErrCode != store_E_None) + STORE_METHOD_LEAVE(pMutex, eErrCode); + + // Check for complete truncation. + if (aLink.m_nIndex0 == 0) + { + // Free last single indirect page. + eErrCode = rBIOS.free (aSingle); + if (eErrCode != store_E_None) + STORE_METHOD_LEAVE(pMutex, eErrCode); + + // Clear pointer to last single indirect page. + singleLink (aLink.m_nIndex1, STORE_PAGE_NULL); + } + } + } + else if (eScope == page::SCOPE_DOUBLE) + { + // Truncate all triple indirect pages. + eErrCode = truncate ( + page::SCOPE_TRIPLE, 0, + rpSingle, rpDouble, rpTriple, + rData, rBIOS, NULL); + if (eErrCode != store_E_None) + STORE_METHOD_LEAVE(pMutex, eErrCode); + + // Truncate double indirect pages, downto 'aLink.m_nIndex2'. + eErrCode = truncate ( + eScope, aLink.m_nIndex2 + 1, + rpSingle, rpDouble, rpTriple, + rData, rBIOS, NULL); + if (eErrCode != store_E_None) + STORE_METHOD_LEAVE(pMutex, eErrCode); + + // Obtain last double indirect page location. + sal_uInt32 nAddr = doubleLink (aLink.m_nIndex2); + if (nAddr != STORE_PAGE_NULL) + { + // Check double indirect page buffer. + if (rpDouble == NULL) + { + sal_uInt16 nPageSize = m_rPage.m_aDescr.m_nSize; + rpDouble = new(nPageSize) indirect(nPageSize); + } + + // Load last double indirect page. + OStoreIndirectionPageObject aDouble (*rpDouble); + aDouble.location (nAddr); + + eErrCode = rBIOS.load (aDouble); + if (eErrCode != store_E_None) + STORE_METHOD_LEAVE(pMutex, eErrCode); + + // Truncate to ... pages. + eErrCode = aDouble.truncate ( + aLink.m_nIndex1, + aLink.m_nIndex0, + rpSingle, + rData, rBIOS, NULL); + if (eErrCode != store_E_None) + STORE_METHOD_LEAVE(pMutex, eErrCode); + + // Check for complete truncation. + if ((aLink.m_nIndex1 + aLink.m_nIndex0) == 0) + { + // Free last double indirect page. + eErrCode = rBIOS.free (aDouble); + if (eErrCode != store_E_None) + STORE_METHOD_LEAVE(pMutex, eErrCode); + + // Clear pointer to last double indirect page. + doubleLink (aLink.m_nIndex2, STORE_PAGE_NULL); + } + } + } + else if (eScope == page::SCOPE_TRIPLE) + { + // Truncate triple indirect pages, downto 'aLink.m_nIndex3'. + eErrCode = truncate ( + eScope, aLink.m_nIndex3 + 1, + rpSingle, rpDouble, rpTriple, + rData, rBIOS, NULL); + if (eErrCode != store_E_None) + STORE_METHOD_LEAVE(pMutex, eErrCode); + + // Obtain last triple indirect page location. + sal_uInt32 nAddr = tripleLink (aLink.m_nIndex3); + if (nAddr != STORE_PAGE_NULL) + { + // Check triple indirect page buffer. + if (rpTriple == NULL) + { + sal_uInt16 nPageSize = m_rPage.m_aDescr.m_nSize; + rpTriple = new(nPageSize) indirect(nPageSize); + } + + // Load last triple indirect page. + OStoreIndirectionPageObject aTriple (*rpTriple); + aTriple.location (nAddr); + + eErrCode = rBIOS.load (aTriple); + if (eErrCode != store_E_None) + STORE_METHOD_LEAVE(pMutex, eErrCode); + + // Truncate to ... pages. + eErrCode = aTriple.truncate ( + aLink.m_nIndex2, + aLink.m_nIndex1, + aLink.m_nIndex0, + rpDouble, rpSingle, + rData, rBIOS, NULL); + if (eErrCode != store_E_None) + STORE_METHOD_LEAVE(pMutex, eErrCode); + + // Check for complete truncation. + if ((aLink.m_nIndex2 + aLink.m_nIndex1 + aLink.m_nIndex0) == 0) + { + // Free last triple indirect page. + eErrCode = rBIOS.free (aTriple); + if (eErrCode != store_E_None) + STORE_METHOD_LEAVE(pMutex, eErrCode); + + // Clear pointer to last triple indirect page. + tripleLink (aLink.m_nIndex3, STORE_PAGE_NULL); + } + } + } + else if (eScope == page::SCOPE_UNREACHABLE) + { + // Out of scope. + eErrCode = store_E_CantSeek; + } + else + { + // Unknown scope. + VOS_TRACE("OStoreDirectoryPageObject::put(): scope failed"); + eErrCode = store_E_Unknown; + } + + // Leave. + STORE_METHOD_LEAVE(pMutex, eErrCode); +} + +/* + * truncate (external data page scope; private). + */ +storeError OStoreDirectoryPageObject::truncate ( + page::ChunkScope eScope, + sal_uInt16 nRemain, + indirect *&rpSingle, + indirect *&rpDouble, + indirect *&rpTriple, + OStoreDataPageObject &rData, + OStorePageBIOS &rBIOS, + NAMESPACE_VOS(IMutex) *pMutex) +{ + // Enter. + STORE_METHOD_ENTER(pMutex); + + storeError eErrCode = store_E_None; + if (eScope == page::SCOPE_DIRECT) + { + // Truncate direct data pages. + sal_uInt16 i, n = m_rPage.m_aDataBlock.directCount(); + for (i = n; i > nRemain; i--) + { + // Obtain data page location. + sal_uInt32 nAddr = directLink (i - 1); + if (nAddr == STORE_PAGE_NULL) continue; + + // Free data page. + rData.location (nAddr); + eErrCode = rBIOS.free (rData); + if (eErrCode != store_E_None) + break; + + // Clear pointer to data page. + directLink (i - 1, STORE_PAGE_NULL); + } + + // Done. + STORE_METHOD_LEAVE(pMutex, eErrCode); + } + + if (eScope == page::SCOPE_SINGLE) + { + // Truncate single indirect pages. + sal_uInt16 i, n = m_rPage.m_aDataBlock.singleCount(); + for (i = n; i > nRemain; i--) + { + // Obtain single indirect page location. + sal_uInt32 nAddr = singleLink (i - 1); + if (nAddr == STORE_PAGE_NULL) continue; + + // Check single indirect page buffer. + if (rpSingle == NULL) + { + sal_uInt16 nPageSize = m_rPage.m_aDescr.m_nSize; + rpSingle = new(nPageSize) indirect(nPageSize); + } + + OStoreIndirectionPageObject aSingle (*rpSingle); + aSingle.location (nAddr); + + // Load single indirect page. + eErrCode = rBIOS.load (aSingle); + if (eErrCode != store_E_None) + break; + + // Truncate to zero data pages. + eErrCode = aSingle.truncate ( + 0, rData, rBIOS, NULL); + if (eErrCode != store_E_None) + break; + + // Free single indirect page. + eErrCode = rBIOS.free (aSingle); + if (eErrCode != store_E_None) + break; + + // Clear pointer to single indirect page. + singleLink (i - 1, STORE_PAGE_NULL); + } + + // Done. + STORE_METHOD_LEAVE(pMutex, eErrCode); + } + + if (eScope == page::SCOPE_DOUBLE) + { + // Truncate double indirect pages. + sal_uInt16 i, n = m_rPage.m_aDataBlock.doubleCount(); + for (i = n; i > nRemain; i--) + { + // Obtain double indirect page location. + sal_uInt32 nAddr = doubleLink (i - 1); + if (nAddr == STORE_PAGE_NULL) continue; + + // Check double indirect page buffer. + if (rpDouble == NULL) + { + sal_uInt16 nPageSize = m_rPage.m_aDescr.m_nSize; + rpDouble = new(nPageSize) indirect(nPageSize); + } + + OStoreIndirectionPageObject aDouble (*rpDouble); + aDouble.location (nAddr); + + // Load double indirect page. + eErrCode = rBIOS.load (aDouble); + if (eErrCode != store_E_None) + break; + + // Truncate to zero single indirect pages. + eErrCode = aDouble.truncate ( + 0, 0, rpSingle, rData, rBIOS, NULL); + if (eErrCode != store_E_None) + break; + + // Free double indirect page. + eErrCode = rBIOS.free (aDouble); + if (eErrCode != store_E_None) + break; + + // Clear pointer to double indirect page. + doubleLink (i - 1, STORE_PAGE_NULL); + } + + // Done. + STORE_METHOD_LEAVE(pMutex, eErrCode); + } + + if (eScope == page::SCOPE_TRIPLE) + { + // Truncate triple indirect pages. + sal_uInt16 i, n = m_rPage.m_aDataBlock.tripleCount(); + for (i = n; i > nRemain; i--) + { + // Obtain triple indirect page location. + sal_uInt32 nAddr = tripleLink (i - 1); + if (nAddr == STORE_PAGE_NULL) continue; + + // Check triple indirect page buffer. + if (rpTriple == NULL) + { + sal_uInt16 nPageSize = m_rPage.m_aDescr.m_nSize; + rpTriple = new(nPageSize) indirect(nPageSize); + } + + OStoreIndirectionPageObject aTriple (*rpTriple); + aTriple.location (nAddr); + + // Load triple indirect page. + eErrCode = rBIOS.load (aTriple); + if (eErrCode != store_E_None) + break; + + // Truncate to zero double indirect pages. + eErrCode = aTriple.truncate ( + 0, 0, 0, rpDouble, rpSingle, rData, rBIOS, NULL); + if (eErrCode != store_E_None) + break; + + // Free triple indirect page. + eErrCode = rBIOS.free (aTriple); + if (eErrCode != store_E_None) + break; + + // Clear pointer to triple indirect page. + tripleLink (i - 1, STORE_PAGE_NULL); + } + + // Done. + STORE_METHOD_LEAVE(pMutex, eErrCode); + } + + // Invalid scope. + STORE_METHOD_LEAVE(pMutex, store_E_InvalidAccess); +} + diff --git a/store/source/stordata.hxx b/store/source/stordata.hxx new file mode 100644 index 000000000000..174f9a73bd76 --- /dev/null +++ b/store/source/stordata.hxx @@ -0,0 +1,934 @@ +/************************************************************************* + * + * $RCSfile: stordata.hxx,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:18:32 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +#ifndef _STORE_STORDATA_HXX_ +#define _STORE_STORDATA_HXX_ "$Revision: 1.1.1.1 $" + +#ifndef _SAL_TYPES_H_ +#include +#endif + +#ifndef _RTL_MEMORY_H_ +#include +#endif + +#ifndef _VOS_MACROS_HXX_ +#include +#endif +#ifndef _VOS_MUTEX_HXX_ +#include +#endif + +#ifndef _STORE_TYPES_H_ +#include +#endif +#ifndef _STORE_MACROS_HXX_ +#include +#endif + +#ifndef _STORE_STORBASE_HXX_ +#include +#endif + +#ifdef _USE_NAMESPACE +namespace store { +#endif + +/*======================================================================== + * + * OStoreDataPageData. + * + *======================================================================*/ +#define STORE_MAGIC_DATAPAGE 0x94190310UL + +struct OStoreDataPageData : + public NAMESPACE_STORE(OStorePageData) +{ + typedef OStorePageData base; + typedef OStoreDataPageData self; + + typedef OStorePageDescriptor D; + + /** Representation. + */ + sal_uInt8 m_pData[1]; + + /** size. + */ + static sal_uInt16 size (void) + { + return 0; + } + + /** capacity. + */ + static sal_uInt16 capacity (const D& rDescr) + { + return (rDescr.m_nSize - (base::size() + self::size())); + } + + sal_uInt16 capacity (void) const + { + return self::capacity (base::m_aDescr); + } + + /** usage. + */ + static sal_uInt16 usage (const D& rDescr) + { + return (rDescr.m_nUsed - (base::size() + self::size())); + } + + sal_uInt16 usage (void) const + { + return self::usage (base::m_aDescr); + } + + /** initialize. + */ + void initialize (void) + { + base::m_aGuard.m_nMagic = STORE_MAGIC_DATAPAGE; + base::m_aDescr.m_nUsed += self::size(); + rtl_zeroMemory (m_pData, capacity()); + } + + /** Construction. + */ + OStoreDataPageData (sal_uInt16 nPageSize) + : base (nPageSize) + { + initialize(); + } +}; + +/*======================================================================== + * + * OStoreDataPageObject. + * + *======================================================================*/ +class OStoreDataPageObject : + public NAMESPACE_STORE(OStorePageObject) +{ + typedef OStorePageObject base; + typedef OStoreDataPageData page; + +public: + /** Construction. + */ + inline OStoreDataPageObject (page& rPage); + +private: + /** Representation. + */ + page& m_rPage; +}; + +inline OStoreDataPageObject::OStoreDataPageObject (page& rPage) + : OStorePageObject (rPage), m_rPage (rPage) +{ +} + +/*======================================================================== + * + * OStoreIndirectionPageData. + * + *======================================================================*/ +#define STORE_MAGIC_INDIRECTPAGE 0x89191107UL + +struct OStoreIndirectionPageData : + public NAMESPACE_STORE(OStorePageData) +{ + typedef OStorePageData base; + typedef OStoreIndirectionPageData self; + + typedef OStorePageGuard G; + typedef OStorePageDescriptor D; + + /** Representation. + */ + G m_aGuard; + sal_uInt32 m_pData[1]; + + /** size. + */ + static sal_uInt16 size (void) + { + return (sizeof(G)); + } + + /** capacity. + */ + static sal_uInt16 capacity (const D& rDescr) + { + return (rDescr.m_nSize - (base::size() + self::size())); + } + sal_uInt16 capacity (void) const + { + return self::capacity (base::m_aDescr); + } + + /** capacityCount. + */ + static sal_uInt16 capacityCount (const D& rDescr) + { + return (capacity(rDescr) / sizeof(sal_uInt32)); + } + sal_uInt16 capacityCount (void) const + { + return (capacity() / sizeof(sal_uInt32)); + } + + /** Construction. + */ + OStoreIndirectionPageData (sal_uInt16 nPageSize); + void initialize (void); + + /** Comparison. + */ + sal_Bool operator== (const OStoreIndirectionPageData& rOther) const + { + return (base::operator==(rOther) && (m_aGuard == rOther.m_aGuard)); + } + + /** swap (internal and external representation). + */ + void swap (const D& rDescr); + + /** guard (external representation). + */ + void guard (const D& rDescr) + { + sal_uInt32 nCRC32 = 0; + nCRC32 = G::crc32 (nCRC32, &m_aGuard.m_nMagic, sizeof(sal_uInt32)); + nCRC32 = G::crc32 (nCRC32, m_pData, capacity(rDescr)); +#ifdef OSL_BIGENDIAN + nCRC32 = VOS_SWAPDWORD(nCRC32); +#endif /* OSL_BIGENDIAN */ + m_aGuard.m_nCRC32 = nCRC32; + } + + /** verify (external representation). + */ + storeError verify (const D& rDescr) + { + sal_uInt32 nCRC32 = 0; + nCRC32 = G::crc32 (nCRC32, &m_aGuard.m_nMagic, sizeof(sal_uInt32)); + nCRC32 = G::crc32 (nCRC32, m_pData, capacity(rDescr)); +#ifdef OSL_BIGENDIAN + nCRC32 = VOS_SWAPDWORD(nCRC32); +#endif /* OSL_BIGENDIAN */ + if (m_aGuard.m_nCRC32 != nCRC32) + return store_E_InvalidChecksum; + else + return store_E_None; + } +}; + +/*======================================================================== + * + * OStoreIndirectionPageObject. + * + *======================================================================*/ +class OStoreIndirectionPageObject : + public NAMESPACE_STORE(OStorePageObject) +{ + typedef OStorePageObject base; + typedef OStoreIndirectionPageData page; + + typedef OStorePageDescriptor D; + +public: + /** Construction. + */ + inline OStoreIndirectionPageObject (page& rPage); + + /** External representation. + */ + virtual void swap (const D& rDescr); + virtual void guard (const D& rDescr); + virtual storeError verify (const D& rDescr); + + /** get (indirect data page). + */ + storeError get ( + sal_uInt16 nSingle, + OStoreDataPageObject &rData, + OStorePageBIOS &rBIOS, + NAMESPACE_VOS(IMutex) *pMutex = NULL); + + storeError get ( + sal_uInt16 nDouble, + sal_uInt16 nSingle, + page *&rpSingle, + OStoreDataPageObject &rData, + OStorePageBIOS &rBIOS, + NAMESPACE_VOS(IMutex) *pMutex = NULL); + + storeError get ( + sal_uInt16 nTriple, + sal_uInt16 nDouble, + sal_uInt16 nSingle, + page *&rpDouble, + page *&rpSingle, + OStoreDataPageObject &rData, + OStorePageBIOS &rBIOS, + NAMESPACE_VOS(IMutex) *pMutex = NULL); + + /** put (indirect data page). + */ + storeError put ( + sal_uInt16 nSingle, + OStoreDataPageObject &rData, + OStorePageBIOS &rBIOS, + NAMESPACE_VOS(IMutex) *pMutex = NULL); + + storeError put ( + sal_uInt16 nDouble, + sal_uInt16 nSingle, + page *&rpSingle, + OStoreDataPageObject &rData, + OStorePageBIOS &rBIOS, + NAMESPACE_VOS(IMutex) *pMutex = NULL); + + storeError put ( + sal_uInt16 nTriple, + sal_uInt16 nDouble, + sal_uInt16 nSingle, + page *&rpDouble, + page *&rpSingle, + OStoreDataPageObject &rData, + OStorePageBIOS &rBIOS, + NAMESPACE_VOS(IMutex) *pMutex = NULL); + + /** truncate (indirect data page). + */ + storeError truncate ( + sal_uInt16 nSingle, + OStoreDataPageObject &rData, + OStorePageBIOS &rBIOS, + NAMESPACE_VOS(IMutex) *pMutex = NULL); + + storeError truncate ( + sal_uInt16 nDouble, + sal_uInt16 nSingle, + page *&rpSingle, + OStoreDataPageObject &rData, + OStorePageBIOS &rBIOS, + NAMESPACE_VOS(IMutex) *pMutex = NULL); + + storeError truncate ( + sal_uInt16 nTriple, + sal_uInt16 nDouble, + sal_uInt16 nSingle, + page *&rpDouble, + page *&rpSingle, + OStoreDataPageObject &rData, + OStorePageBIOS &rBIOS, + NAMESPACE_VOS(IMutex) *pMutex = NULL); + +private: + /** Representation. + */ + page& m_rPage; +}; + +inline OStoreIndirectionPageObject::OStoreIndirectionPageObject (page& rPage) + : OStorePageObject (rPage), m_rPage (rPage) +{ +} + +/*======================================================================== + * + * OStoreDirectoryDataBlock. + * + *======================================================================*/ +#define STORE_LIMIT_DATAPAGE_DIRECT 16 +#define STORE_LIMIT_DATAPAGE_SINGLE 8 +#define STORE_LIMIT_DATAPAGE_DOUBLE 1 +#define STORE_LIMIT_DATAPAGE_TRIPLE 1 + +struct OStoreDirectoryDataBlock +{ + typedef OStorePageGuard G; + + /** LinkDescriptor. + */ + struct LinkDescriptor + { + /** Representation. + */ + sal_uInt16 m_nIndex0; + sal_uInt16 m_nIndex1; + sal_uInt16 m_nIndex2; + sal_uInt16 m_nIndex3; + + /** Construction. + */ + LinkDescriptor (void) + : m_nIndex0 ((sal_uInt16)(~0)), + m_nIndex1 ((sal_uInt16)(~0)), + m_nIndex2 ((sal_uInt16)(~0)), + m_nIndex3 ((sal_uInt16)(~0)) + {} + }; + + /** LinkTable. + */ + struct LinkTable + { + /** Representation. + */ + sal_uInt32 m_pDirect[STORE_LIMIT_DATAPAGE_DIRECT]; + sal_uInt32 m_pSingle[STORE_LIMIT_DATAPAGE_SINGLE]; + sal_uInt32 m_pDouble[STORE_LIMIT_DATAPAGE_DOUBLE]; + sal_uInt32 m_pTriple[STORE_LIMIT_DATAPAGE_TRIPLE]; + + /** Construction. + */ + LinkTable (void); + void initialize (void); + + /** swap (internal and external representation). + */ + void swap (void); + }; + + /** Representation. + */ + G m_aGuard; + LinkTable m_aTable; + sal_uInt32 m_nDataLen; + + /** size. + */ + static sal_uInt16 size (void) + { + return (sizeof(G) + sizeof(LinkTable) + sizeof(sal_uInt32)); + } + + /** initialize. + */ + void initialize (void) + { + m_aGuard = G(); + m_aTable.initialize(); + m_nDataLen = 0; + } + + /** Construction. + */ + OStoreDirectoryDataBlock (void) + : m_nDataLen (0) + {} + + /** Comparison. + */ + sal_Bool operator== (const OStoreDirectoryDataBlock& rOther) const + { + return (m_aGuard == rOther.m_aGuard); + } + + /** swap (internal and external representation). + */ + void swap (void) + { +#ifdef OSL_BIGENDIAN + m_aGuard.swap(); + m_aTable.swap(); + m_nDataLen = VOS_SWAPDWORD(m_nDataLen); +#endif /* OSL_BIGENDIAN */ + } + + /** guard (external representation). + */ + void guard (void) + { + sal_uInt32 nCRC32 = 0; + nCRC32 = G::crc32 (nCRC32, &m_aGuard.m_nMagic, sizeof(sal_uInt32)); + nCRC32 = G::crc32 (nCRC32, &m_aTable, size() - sizeof(G)); +#ifdef OSL_BIGENDIAN + nCRC32 = VOS_SWAPDWORD(nCRC32); +#endif /* OSL_BIGENDIAN */ + m_aGuard.m_nCRC32 = nCRC32; + } + + /** verify (external representation). + */ + storeError verify (void) + { + sal_uInt32 nCRC32 = 0; + nCRC32 = G::crc32 (nCRC32, &m_aGuard.m_nMagic, sizeof(sal_uInt32)); + nCRC32 = G::crc32 (nCRC32, &m_aTable, size() - sizeof(G)); +#ifdef OSL_BIGENDIAN + nCRC32 = VOS_SWAPDWORD(nCRC32); +#endif /* OSL_BIGENDIAN */ + if (m_aGuard.m_nCRC32 != nCRC32) + return store_E_InvalidChecksum; + else + return store_E_None; + } + + /** direct. + */ + static sal_uInt16 directCount (void) + { + return ((sal_uInt16)(STORE_LIMIT_DATAPAGE_DIRECT)); + } + sal_uInt32 directLink (sal_uInt16 nIndex) const + { + if (nIndex < directCount()) + return m_aTable.m_pDirect[nIndex]; + else + return STORE_PAGE_NULL; + } + void directLink (sal_uInt16 nIndex, sal_uInt32 nAddr) + { + if (nIndex < directCount()) + m_aTable.m_pDirect[nIndex] = nAddr; + } + + /** single. + */ + static sal_uInt16 singleCount (void) + { + return ((sal_uInt16)(STORE_LIMIT_DATAPAGE_SINGLE)); + } + sal_uInt32 singleLink (sal_uInt16 nIndex) const + { + if (nIndex < singleCount()) + return m_aTable.m_pSingle[nIndex]; + else + return STORE_PAGE_NULL; + } + void singleLink (sal_uInt16 nIndex, sal_uInt32 nAddr) + { + if (nIndex < singleCount()) + m_aTable.m_pSingle[nIndex] = nAddr; + } + + /** double. + */ + static sal_uInt16 doubleCount (void) + { + return ((sal_uInt16)(STORE_LIMIT_DATAPAGE_DOUBLE)); + } + sal_uInt32 doubleLink (sal_uInt16 nIndex) const + { + if (nIndex < doubleCount()) + return m_aTable.m_pDouble[nIndex]; + else + return STORE_PAGE_NULL; + } + void doubleLink (sal_uInt16 nIndex, sal_uInt32 nAddr) + { + if (nIndex < doubleCount()) + m_aTable.m_pDouble[nIndex] = nAddr; + } + + /** triple. + */ + static sal_uInt16 tripleCount (void) + { + return ((sal_uInt16)(STORE_LIMIT_DATAPAGE_TRIPLE)); + } + sal_uInt32 tripleLink (sal_uInt16 nIndex) const + { + if (nIndex < tripleCount()) + return m_aTable.m_pTriple[nIndex]; + else + return STORE_PAGE_NULL; + } + void tripleLink (sal_uInt16 nIndex, sal_uInt32 nAddr) + { + if (nIndex < tripleCount()) + m_aTable.m_pTriple[nIndex] = nAddr; + } +}; + +/*======================================================================== + * + * OStoreDirectoryPageData. + * + *======================================================================*/ +#define STORE_MAGIC_DIRECTORYPAGE 0x62190120UL + +struct OStoreDirectoryPageData : + public NAMESPACE_STORE(OStorePageData) +{ + typedef OStorePageData base; + typedef OStoreDirectoryPageData self; + + typedef OStorePageDescriptor D; + typedef OStorePageNameBlock NameBlock; + typedef OStoreDirectoryDataBlock DataBlock; + + /** Representation. + */ + NameBlock m_aNameBlock; + DataBlock m_aDataBlock; + sal_uInt8 m_pData[1]; + + /** size. + */ + static sal_uInt16 size (void) + { + return (NameBlock::size() + DataBlock::size()); + } + + /** capacity. + */ + static sal_uInt16 capacity (const D& rDescr) + { + return (rDescr.m_nSize - (base::size() + self::size())); + } + sal_uInt16 capacity (void) const + { + return self::capacity (base::m_aDescr); + } + + /** usage. + */ + static sal_uInt16 usage (const D& rDescr) + { + return (rDescr.m_nUsed - (base::size() + self::size())); + } + sal_uInt16 usage (void) const + { + return self::usage (base::m_aDescr); + } + + /** initialize. + */ + void initialize (void) + { + base::m_aGuard.m_nMagic = STORE_MAGIC_DIRECTORYPAGE; + base::m_aDescr.m_nUsed = base::size() + self::size(); + + m_aNameBlock.initialize(); + m_aDataBlock.initialize(); + + rtl_zeroMemory (m_pData, capacity()); + } + + /** Construction. + */ + OStoreDirectoryPageData (sal_uInt16 nPageSize) + : base (nPageSize) + { + base::m_aGuard.m_nMagic = STORE_MAGIC_DIRECTORYPAGE; + base::m_aDescr.m_nUsed += self::size(); + rtl_zeroMemory (m_pData, capacity()); + } + + /** Comparsion. + */ + sal_Bool operator== (const OStoreDirectoryPageData& rOther) const + { + return ((base::operator==(rOther) ) && + (m_aNameBlock == rOther.m_aNameBlock) && + (m_aDataBlock == rOther.m_aDataBlock) ); + } + + /** swap (internal and external representation). + */ + void swap (const D& rDescr) + { +#ifdef OSL_BIGENDIAN + m_aNameBlock.swap(); + m_aDataBlock.swap(); +#endif /* OSL_BIGENDIAN */ + } + + /** guard (external representation). + */ + void guard (const D& rDescr) + { + m_aNameBlock.guard(); + m_aDataBlock.guard(); + } + + /** verify (external representation). + */ + storeError verify (const D& rDescr) + { + storeError eErrCode = m_aNameBlock.verify(); + if (eErrCode == store_E_None) + eErrCode = m_aDataBlock.verify(); + return eErrCode; + } + + /** ChunkDescriptor. + */ + struct ChunkDescriptor + { + /** Representation. + */ + sal_uInt32 m_nPage; + sal_uInt16 m_nOffset; + sal_uInt16 m_nLength; + + /** Construction. + */ + ChunkDescriptor (sal_uInt32 nPosition, sal_uInt16 nCapacity) + { + m_nPage = nPosition / nCapacity; + m_nOffset = (sal_uInt16)((nPosition % nCapacity) & 0xffff); + m_nLength = nCapacity - m_nOffset; + } + }; + + /** ChunkScope. + */ + enum ChunkScope + { + SCOPE_INTERNAL, + SCOPE_EXTERNAL, + SCOPE_DIRECT, + SCOPE_SINGLE, + SCOPE_DOUBLE, + SCOPE_TRIPLE, + SCOPE_UNREACHABLE, + SCOPE_UNKNOWN + }; + + /** scope (internal). + */ + ChunkScope scope (sal_uInt32 nPosition) const + { + sal_uInt32 nCapacity = capacity(); + if (nPosition < nCapacity) + return SCOPE_INTERNAL; + else + return SCOPE_EXTERNAL; + } +}; + +/*======================================================================== + * + * OStoreDirectoryPageObject. + * + *======================================================================*/ +class OStoreDirectoryPageObject : + public NAMESPACE_STORE(OStorePageObject) +{ + typedef OStorePageObject base; + typedef OStoreDirectoryPageData page; + typedef OStoreIndirectionPageData indirect; + + typedef OStorePageDescriptor D; + +public: + /** Construction. + */ + inline OStoreDirectoryPageObject (page& rPage); + + /** External representation. + */ + virtual void swap (const D& rDescr); + virtual void guard (const D& rDescr); + virtual storeError verify (const D& rDescr); + + /** attrib. + */ + sal_uInt32 attrib (void) const + { + return m_rPage.m_aNameBlock.m_nAttrib; + } + void attrib (sal_uInt32 nAttrib) + { + m_rPage.m_aNameBlock.m_nAttrib = nAttrib; + touch(); + } + + /** dataLength. + */ + sal_uInt32 dataLength (void) const + { + return m_rPage.m_aDataBlock.m_nDataLen; + } + void dataLength (sal_uInt32 nLength) + { + m_rPage.m_aDataBlock.m_nDataLen = nLength; + touch(); + } + + /** direct. + */ + sal_uInt32 directLink (sal_uInt16 nIndex) const + { + return m_rPage.m_aDataBlock.directLink (nIndex); + } + void directLink (sal_uInt16 nIndex, sal_uInt32 nAddr) + { + m_rPage.m_aDataBlock.directLink (nIndex, nAddr); + touch(); + } + + /** single indirect. + */ + sal_uInt32 singleLink (sal_uInt16 nIndex) const + { + return m_rPage.m_aDataBlock.singleLink (nIndex); + } + void singleLink (sal_uInt16 nIndex, sal_uInt32 nAddr) + { + m_rPage.m_aDataBlock.singleLink (nIndex, nAddr); + touch(); + } + + /** double indirect. + */ + sal_uInt32 doubleLink (sal_uInt16 nIndex) const + { + return m_rPage.m_aDataBlock.doubleLink (nIndex); + } + void doubleLink (sal_uInt16 nIndex, sal_uInt32 nAddr) + { + m_rPage.m_aDataBlock.doubleLink (nIndex, nAddr); + touch(); + } + + /** triple indirect. + */ + sal_uInt32 tripleLink (sal_uInt16 nIndex) const + { + return m_rPage.m_aDataBlock.tripleLink (nIndex); + } + void tripleLink (sal_uInt16 nIndex, sal_uInt32 nAddr) + { + m_rPage.m_aDataBlock.tripleLink (nIndex, nAddr); + touch(); + } + + /** scope (external data page). + */ + page::ChunkScope scope ( + sal_uInt32 nPage, + page::DataBlock::LinkDescriptor &rDescr) const; + + /** get (external data page). + */ + storeError get ( + sal_uInt32 nPage, + indirect *&rpSingle, + indirect *&rpDouble, + indirect *&rpTriple, + OStoreDataPageObject &rData, + OStorePageBIOS &rBIOS, + NAMESPACE_VOS(IMutex) *pMutex = NULL); + + /** put (external data page). + */ + storeError put ( + sal_uInt32 nPage, + indirect *&rpSingle, + indirect *&rpDouble, + indirect *&rpTriple, + OStoreDataPageObject &rData, + OStorePageBIOS &rBIOS, + NAMESPACE_VOS(IMutex) *pMutex = NULL); + + /** truncate (external data page). + */ + storeError truncate ( + sal_uInt32 nPage, + indirect *&rpSingle, + indirect *&rpDouble, + indirect *&rpTriple, + OStoreDataPageObject &rData, + OStorePageBIOS &rBIOS, + NAMESPACE_VOS(IMutex) *pMutex = NULL); + +private: + /** Representation. + */ + page& m_rPage; + + /** truncate (external data page scope; private). + */ + storeError truncate ( + page::ChunkScope eScope, + sal_uInt16 nRemain, + indirect *&rpSingle, + indirect *&rpDouble, + indirect *&rpTriple, + OStoreDataPageObject &rData, + OStorePageBIOS &rBIOS, + NAMESPACE_VOS(IMutex) *pMutex = NULL); +}; + +inline OStoreDirectoryPageObject::OStoreDirectoryPageObject (page& rPage) + : OStorePageObject (rPage), m_rPage (rPage) +{ +} + +/*======================================================================== + * + * The End. + * + *======================================================================*/ +#ifdef _USE_NAMESPACE +} +#endif + +#endif /* !_STORE_STORDATA_HXX_ */ + diff --git a/store/source/store.cxx b/store/source/store.cxx new file mode 100644 index 000000000000..a755373093fa --- /dev/null +++ b/store/source/store.cxx @@ -0,0 +1,817 @@ +/************************************************************************* + * + * $RCSfile: store.cxx,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:18:32 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +#define _STORE_STORE_CXX_ "$Revision: 1.1.1.1 $" + +#ifndef _SAL_TYPES_H_ +#include +#endif + +#ifndef _RTL_MEMORY_H_ +#include +#endif +#ifndef _RTL_STRING_HXX_ +#include +#endif + +#ifndef _VOS_OBJECT_HXX_ +#include +#endif +#ifndef _VOS_REF_HXX_ +#include +#endif + +#ifndef _STORE_STORE_H_ +#include +#endif +#ifndef _STORE_MACROS_HXX_ +#include +#endif +#ifndef _STORE_OBJECT_HXX_ +#include +#endif +#ifndef _STORE_FILELCKB_HXX_ +#include +#endif +#ifndef _STORE_MEMLCKB_HXX_ +#include +#endif + +#ifndef _STORE_STORBASE_HXX_ +#include +#endif +#ifndef _STORE_STORPAGE_HXX_ +#include +#endif +#ifndef _STORE_STORLCKB_HXX_ +#include +#endif + +#ifdef _USE_NAMESPACE +using namespace rtl; +using namespace store; +#endif + +typedef NAMESPACE_VOS(ORef) OStorePageManagerRef; + +/*======================================================================== + * + * storeHandle implementation. + * + *======================================================================*/ +/* + * store_acquireHandle. + */ +storeError SAL_CALL store_acquireHandle (storeHandle Handle) +{ + OStoreObject *pObj = (OStoreObject*)Handle; + if (!pObj) + return store_E_InvalidHandle; + + if (!pObj->isKindOf (VOS_CLASSINFO (OStoreObject))) + return store_E_InvalidHandle; + + pObj->acquire(); + return store_E_None; +} + +/* + * store_releaseHandle. + */ +storeError SAL_CALL store_releaseHandle (storeHandle Handle) +{ + OStoreObject *pObj = (OStoreObject*)Handle; + if (!pObj) + return store_E_InvalidHandle; + + if (!pObj->isKindOf (VOS_CLASSINFO (OStoreObject))) + return store_E_InvalidHandle; + + pObj->release(); + return store_E_None; +} + +/*======================================================================== + * + * storeFileHandle implementation. + * + *======================================================================*/ +/* + * store_createMemoryFile. + */ +storeError SAL_CALL store_createMemoryFile ( + sal_uInt16 nPageSize, + storeFileHandle *phFile) +{ + if (!phFile) + return store_E_InvalidParameter; + *phFile = NULL; + + NAMESPACE_VOS(ORef) xLockBytes (new OMemoryLockBytes()); + if (!xLockBytes.isValid()) + return store_E_OutOfMemory; + + NAMESPACE_VOS(ORef) xManager (new OStorePageManager()); + if (!xManager.isValid()) + return store_E_OutOfMemory; + + storeError eErrCode = xManager->initialize ( + &*xLockBytes, store_AccessCreate, nPageSize); + if (eErrCode != store_E_None) + return eErrCode; + + xManager->acquire(); + + *phFile = (storeFileHandle)&(*xManager); + return store_E_None; +} + +/* + * store_openFile. + */ +storeError SAL_CALL store_openFile ( + rtl_uString *pFilename, + storeAccessMode eAccessMode, + sal_uInt16 nPageSize, + storeFileHandle *phFile) +{ + if (phFile) + *phFile = NULL; + + if (!(pFilename && phFile)) + return store_E_InvalidParameter; + + NAMESPACE_VOS(ORef) xLockBytes (new OFileLockBytes()); + if (!xLockBytes.isValid()) + return store_E_OutOfMemory; + + storeError eErrCode = xLockBytes->create (pFilename, eAccessMode); + if (eErrCode != store_E_None) + return eErrCode; + + NAMESPACE_VOS(ORef) xManager (new OStorePageManager()); + if (!xManager.isValid()) + return store_E_OutOfMemory; + + eErrCode = xManager->initialize (&*xLockBytes, eAccessMode, nPageSize); + if (eErrCode != store_E_None) + return eErrCode; + + xManager->acquire(); + + *phFile = (storeFileHandle)&(*xManager); + return store_E_None; +} + +/* + * store_closeFile. + */ +storeError SAL_CALL store_closeFile (storeFileHandle Handle) +{ + OStorePageManager *pObj = (OStorePageManager*)Handle; + if (!pObj) + return store_E_InvalidHandle; + + if (!pObj->isKindOf (VOS_CLASSINFO (OStorePageManager))) + return store_E_InvalidHandle; + + pObj->close(); + pObj->release(); + return store_E_None; +} + +/* + * store_flushFile. + */ +storeError SAL_CALL store_flushFile (storeFileHandle Handle) +{ + OStorePageManagerRef xManager ((OStorePageManager*)Handle); + if (!xManager.isValid()) + return store_E_InvalidHandle; + + if (!xManager->isKindOf (VOS_CLASSINFO (OStorePageManager))) + return store_E_InvalidHandle; + + return xManager->flush(); +} + +/* + * store_getFileRefererCount. + */ +storeError SAL_CALL store_getFileRefererCount ( + storeFileHandle Handle, sal_uInt32 *pnRefCount) +{ + OStorePageManagerRef xManager ((OStorePageManager*)Handle); + if (!xManager.isValid()) + return store_E_InvalidHandle; + + if (!xManager->isKindOf (VOS_CLASSINFO (OStorePageManager))) + return store_E_InvalidHandle; + + if (!pnRefCount) + return store_E_InvalidParameter; + + *pnRefCount = xManager->getRefererCount(); + return store_E_None; +} + +/* + * store_getFileSize. + */ +storeError SAL_CALL store_getFileSize ( + storeFileHandle Handle, sal_uInt32 *pnSize) +{ + OStorePageManagerRef xManager ((OStorePageManager*)Handle); + if (!xManager.isValid()) + return store_E_InvalidHandle; + + if (!xManager->isKindOf (VOS_CLASSINFO (OStorePageManager))) + return store_E_InvalidHandle; + + if (!pnSize) + return store_E_InvalidParameter; + + return xManager->size (*pnSize); +} + +/* + * store_rebuildFile. + */ +storeError SAL_CALL store_rebuildFile ( + rtl_uString *pSrcFilename, + rtl_uString *pDstFilename) +{ + storeError eErrCode = store_E_None; + + if (!(pSrcFilename && pDstFilename)) + return store_E_InvalidParameter; + + OStorePageManagerRef xManager (new OStorePageManager()); + if (!xManager.isValid()) + return store_E_OutOfMemory; + + NAMESPACE_VOS(ORef) xSrcLB (new OFileLockBytes()); + if (!xSrcLB.isValid()) + return store_E_OutOfMemory; + + eErrCode = xSrcLB->create (pSrcFilename, store_AccessReadOnly); + if (eErrCode != store_E_None) + return eErrCode; + + NAMESPACE_VOS(ORef) xDstLB (new OFileLockBytes()); + if (!xDstLB.isValid()) + return store_E_OutOfMemory; + + eErrCode = xDstLB->create (pDstFilename, store_AccessCreate); + if (eErrCode != store_E_None) + return eErrCode; + + return xManager->rebuild (&*xSrcLB, &*xDstLB); +} + +/*======================================================================== + * + * storeDirectoryHandle implementation. + * + *======================================================================*/ +typedef NAMESPACE_VOS(ORef) OStoreDirectoryRef; + +/* + * store_openDirectory. + */ +storeError SAL_CALL store_openDirectory ( + storeFileHandle hFile, + rtl_uString *pPath, + rtl_uString *pName, + storeAccessMode eAccessMode, + storeDirectoryHandle *phDirectory) +{ + storeError eErrCode = store_E_None; + if (phDirectory) + *phDirectory = NULL; + + OStorePageManagerRef xManager ((OStorePageManager*)hFile); + if (!xManager.isValid()) + return store_E_InvalidHandle; + + if (!xManager->isKindOf (VOS_CLASSINFO (OStorePageManager))) + return store_E_InvalidHandle; + + if (!(pPath && pName && phDirectory)) + return store_E_InvalidParameter; + + OStoreDirectoryRef xDirectory (new OStoreDirectory()); + if (!xDirectory.isValid()) + return store_E_OutOfMemory; + + eErrCode = xDirectory->create (&*xManager, pPath, pName, eAccessMode); + if (eErrCode != store_E_None) + return eErrCode; + + xDirectory->acquire(); + + *phDirectory = (storeDirectoryHandle)&(*xDirectory); + return store_E_None; +} + +/* + * store_closeDirectory. + */ +storeError SAL_CALL store_closeDirectory (storeDirectoryHandle Handle) +{ + OStoreDirectory *pObj = (OStoreDirectory*)Handle; + if (!pObj) + return store_E_InvalidHandle; + + if (!pObj->isKindOf (VOS_CLASSINFO (OStoreDirectory))) + return store_E_InvalidHandle; + + pObj->release(); + return store_E_None; +} + +/* + * store_findFirst. + */ +storeError SAL_CALL store_findFirst ( + storeDirectoryHandle Handle, + storeFindData *pFindData) +{ + OStoreDirectoryRef xDirectory ((OStoreDirectory*)Handle); + if (!xDirectory.isValid()) + return store_E_InvalidHandle; + + if (!xDirectory->isKindOf (VOS_CLASSINFO (OStoreDirectory))) + return store_E_InvalidHandle; + + if (!pFindData) + return store_E_InvalidParameter; + + // Initialize FindData. + rtl_zeroMemory (pFindData, sizeof (storeFindData)); + + // Find first. + pFindData->m_nReserved = (sal_uInt32)(~0); + return xDirectory->iterate (*pFindData); +} + +/* + * store_findNext. + */ +storeError SAL_CALL store_findNext ( + storeDirectoryHandle Handle, + storeFindData *pFindData) +{ + OStoreDirectoryRef xDirectory ((OStoreDirectory*)Handle); + if (!xDirectory.isValid()) + return store_E_InvalidHandle; + + if (!xDirectory->isKindOf (VOS_CLASSINFO (OStoreDirectory))) + return store_E_InvalidHandle; + + if (!pFindData) + return store_E_InvalidParameter; + + // Check FindData. + if (!pFindData->m_nReserved) + return store_E_NoMoreFiles; + + // Find next. + pFindData->m_nReserved -= 1; + return xDirectory->iterate (*pFindData); +} + +/*======================================================================== + * + * storeStreamHandle implementation. + * + *======================================================================*/ +typedef NAMESPACE_VOS(ORef) OStoreLockBytesRef; + +/* + * store_openStream + */ +storeError SAL_CALL store_openStream ( + storeFileHandle hFile, + rtl_uString *pPath, + rtl_uString *pName, + storeAccessMode eAccessMode, + storeStreamHandle *phStream) +{ + storeError eErrCode = store_E_None; + if (phStream) + *phStream = NULL; + + OStorePageManagerRef xManager ((OStorePageManager*)hFile); + if (!xManager.isValid()) + return store_E_InvalidHandle; + + if (!xManager->isKindOf (VOS_CLASSINFO (OStorePageManager))) + return store_E_InvalidHandle; + + if (!(pPath && pName && phStream)) + return store_E_InvalidParameter; + + OStoreLockBytesRef xLockBytes (new OStoreLockBytes()); + if (!xLockBytes.isValid()) + return store_E_OutOfMemory; + + eErrCode = xLockBytes->create (&*xManager, pPath, pName, eAccessMode); + if (eErrCode != store_E_None) + return eErrCode; + + xLockBytes->acquire(); + + *phStream = (storeStreamHandle)&(*xLockBytes); + return store_E_None; +} + +/* + * store_closeStream. + */ +storeError SAL_CALL store_closeStream (storeStreamHandle Handle) +{ + OStoreLockBytes *pObj = (OStoreLockBytes*)Handle; + if (!pObj) + return store_E_InvalidHandle; + + if (!pObj->isKindOf (VOS_CLASSINFO (OStoreLockBytes))) + return store_E_InvalidHandle; + + pObj->release(); + return store_E_None; +} + +/* + * store_readStream. + */ +storeError SAL_CALL store_readStream ( + storeStreamHandle Handle, + sal_uInt32 nOffset, + void *pBuffer, + sal_uInt32 nBytes, + sal_uInt32 *pnDone) +{ + OStoreLockBytesRef xLockBytes ((OStoreLockBytes*)Handle); + if (!xLockBytes.isValid()) + return store_E_InvalidHandle; + + if (!xLockBytes->isKindOf (VOS_CLASSINFO (OStoreLockBytes))) + return store_E_InvalidHandle; + + if (!(pBuffer && pnDone)) + return store_E_InvalidParameter; + + return xLockBytes->readAt (nOffset, pBuffer, nBytes, *pnDone); +} + +/* + * store_writeStream. + */ +storeError SAL_CALL store_writeStream ( + storeStreamHandle Handle, + sal_uInt32 nOffset, + const void *pBuffer, + sal_uInt32 nBytes, + sal_uInt32 *pnDone) +{ + OStoreLockBytesRef xLockBytes ((OStoreLockBytes*)Handle); + if (!xLockBytes.isValid()) + return store_E_InvalidHandle; + + if (!xLockBytes->isKindOf (VOS_CLASSINFO (OStoreLockBytes))) + return store_E_InvalidHandle; + + if (!(pBuffer && pnDone)) + return store_E_InvalidParameter; + + return xLockBytes->writeAt (nOffset, pBuffer, nBytes, *pnDone); +} + +/* + * store_flushStream. + */ +storeError SAL_CALL store_flushStream (storeStreamHandle Handle) +{ + OStoreLockBytesRef xLockBytes ((OStoreLockBytes*)Handle); + if (!xLockBytes.isValid()) + return store_E_InvalidHandle; + + if (!xLockBytes->isKindOf (VOS_CLASSINFO (OStoreLockBytes))) + return store_E_InvalidHandle; + + return xLockBytes->flush(); +} + +/* + * store_getStreamSize. + */ +storeError SAL_CALL store_getStreamSize ( + storeStreamHandle Handle, sal_uInt32 *pnSize) +{ + OStoreLockBytesRef xLockBytes ((OStoreLockBytes*)Handle); + if (!xLockBytes.isValid()) + return store_E_InvalidHandle; + + if (!xLockBytes->isKindOf (VOS_CLASSINFO (OStoreLockBytes))) + return store_E_InvalidHandle; + + if (!pnSize) + return store_E_InvalidParameter; + + return xLockBytes->stat (*pnSize); +} + +/* + * store_setStreamSize. + */ +storeError SAL_CALL store_setStreamSize ( + storeStreamHandle Handle, sal_uInt32 nSize) +{ + OStoreLockBytesRef xLockBytes ((OStoreLockBytes*)Handle); + if (!xLockBytes.isValid()) + return store_E_InvalidHandle; + + if (!xLockBytes->isKindOf (VOS_CLASSINFO (OStoreLockBytes))) + return store_E_InvalidHandle; + + return xLockBytes->setSize (nSize); +} + +/*======================================================================== + * + * Common storeDirectoryHandle and storeStreamHandle operations. + * + *======================================================================*/ +/* + * store_attrib. + */ +storeError SAL_CALL store_attrib ( + storeFileHandle Handle, + rtl_uString *pPath, + rtl_uString *pName, + sal_uInt32 nMask1, + sal_uInt32 nMask2, + sal_uInt32 *pnAttrib) +{ + storeError eErrCode = store_E_None; + if (pnAttrib) + *pnAttrib = 0; + + OStorePageManagerRef xManager ((OStorePageManager*)Handle); + if (!xManager.isValid()) + return store_E_InvalidHandle; + + if (!xManager->isKindOf (VOS_CLASSINFO (OStorePageManager))) + return store_E_InvalidHandle; + + if (!(pPath && pName)) + return store_E_InvalidParameter; + + // Setup page key. + OString aPath (pPath->buffer, pPath->length, RTL_TEXTENCODING_UTF8); + OString aName (pName->buffer, pName->length, RTL_TEXTENCODING_UTF8); + OStorePageKey aKey; + + eErrCode = OStorePageNameBlock::namei (aPath.pData, aName.pData, aKey); + if (eErrCode != store_E_None) + return eErrCode; + + // Obtain or modify page attributes. + sal_uInt32 nAttrib = 0; + eErrCode = xManager->attrib (aKey, nMask1, nMask2, nAttrib); + if (pnAttrib) + *pnAttrib = nAttrib; + return eErrCode; +} + +/* + * store_link. + */ +storeError SAL_CALL store_link ( + storeFileHandle Handle, + rtl_uString *pSrcPath, rtl_uString *pSrcName, + rtl_uString *pDstPath, rtl_uString *pDstName) +{ + storeError eErrCode = store_E_None; + + OStorePageManagerRef xManager ((OStorePageManager*)Handle); + if (!xManager.isValid()) + return store_E_InvalidHandle; + + if (!xManager->isKindOf (VOS_CLASSINFO (OStorePageManager))) + return store_E_InvalidHandle; + + if (!(pSrcPath && pSrcName)) + return store_E_InvalidParameter; + + if (!(pDstPath && pDstName)) + return store_E_InvalidParameter; + + // Setup 'Source' page key. + OString aSrcPath ( + pSrcPath->buffer, pSrcPath->length, RTL_TEXTENCODING_UTF8); + OString aSrcName ( + pSrcName->buffer, pSrcName->length, RTL_TEXTENCODING_UTF8); + OStorePageKey aSrcKey; + + eErrCode = OStorePageNameBlock::namei ( + aSrcPath.pData, aSrcName.pData, aSrcKey); + if (eErrCode != store_E_None) + return eErrCode; + + // Setup 'Destination' page key. + OString aDstPath ( + pDstPath->buffer, pDstPath->length, RTL_TEXTENCODING_UTF8); + OString aDstName ( + pDstName->buffer, pDstName->length, RTL_TEXTENCODING_UTF8); + OStorePageKey aDstKey; + + eErrCode = OStorePageNameBlock::namei ( + aDstPath.pData, aDstName.pData, aDstKey); + if (eErrCode != store_E_None) + return eErrCode; + + // Link 'Source' hard to 'Destination'. + return xManager->link (aSrcKey, aDstKey); +} + +/* + * store_symlink. + */ +storeError SAL_CALL store_symlink ( + storeFileHandle Handle, + rtl_uString *pSrcPath, rtl_uString *pSrcName, + rtl_uString *pDstPath, rtl_uString *pDstName) +{ + storeError eErrCode = store_E_None; + + OStorePageManagerRef xManager ((OStorePageManager*)Handle); + if (!xManager.isValid()) + return store_E_InvalidHandle; + + if (!xManager->isKindOf (VOS_CLASSINFO (OStorePageManager))) + return store_E_InvalidHandle; + + if (!(pSrcPath && pSrcName)) + return store_E_InvalidParameter; + + if (!(pDstPath && pDstName)) + return store_E_InvalidParameter; + + // Setup 'Destination' page key. + OString aDstPath ( + pDstPath->buffer, pDstPath->length, RTL_TEXTENCODING_UTF8); + OString aDstName ( + pDstName->buffer, pDstName->length, RTL_TEXTENCODING_UTF8); + OStorePageKey aDstKey; + + eErrCode = OStorePageNameBlock::namei ( + aDstPath.pData, aDstName.pData, aDstKey); + if (eErrCode != store_E_None) + return eErrCode; + + // Insert 'Source' as symlink to 'Destination'. + OString aSrcPath ( + pSrcPath->buffer, pSrcPath->length, RTL_TEXTENCODING_UTF8); + OString aSrcName ( + pSrcName->buffer, pSrcName->length, RTL_TEXTENCODING_UTF8); + + return xManager->symlink (aSrcPath.pData, aSrcName.pData, aDstKey); +} + +/* + * store_rename. + */ +storeError SAL_CALL store_rename ( + storeFileHandle Handle, + rtl_uString *pSrcPath, rtl_uString *pSrcName, + rtl_uString *pDstPath, rtl_uString *pDstName) +{ + storeError eErrCode = store_E_None; + + OStorePageManagerRef xManager ((OStorePageManager*)Handle); + if (!xManager.isValid()) + return store_E_InvalidHandle; + + if (!xManager->isKindOf (VOS_CLASSINFO (OStorePageManager))) + return store_E_InvalidHandle; + + if (!(pSrcPath && pSrcName)) + return store_E_InvalidParameter; + + if (!(pDstPath && pDstName)) + return store_E_InvalidParameter; + + // Setup 'Source' page key. + OString aSrcPath ( + pSrcPath->buffer, pSrcPath->length, RTL_TEXTENCODING_UTF8); + OString aSrcName ( + pSrcName->buffer, pSrcName->length, RTL_TEXTENCODING_UTF8); + OStorePageKey aSrcKey; + + eErrCode = OStorePageNameBlock::namei ( + aSrcPath.pData, aSrcName.pData, aSrcKey); + if (eErrCode != store_E_None) + return eErrCode; + + // Rename 'Source' into 'Destination'. + OString aDstPath ( + pDstPath->buffer, pDstPath->length, RTL_TEXTENCODING_UTF8); + OString aDstName ( + pDstName->buffer, pDstName->length, RTL_TEXTENCODING_UTF8); + + return xManager->rename (aSrcKey, aDstPath.pData, aDstName.pData); +} + +/* + * store_remove. + */ +storeError SAL_CALL store_remove ( + storeFileHandle Handle, + rtl_uString *pPath, + rtl_uString *pName) +{ + storeError eErrCode = store_E_None; + + OStorePageManagerRef xManager ((OStorePageManager*)Handle); + if (!xManager.isValid()) + return store_E_InvalidHandle; + + if (!xManager->isKindOf (VOS_CLASSINFO (OStorePageManager))) + return store_E_InvalidHandle; + + if (!(pPath && pName)) + return store_E_InvalidParameter; + + // Setup page key. + OString aPath (pPath->buffer, pPath->length, RTL_TEXTENCODING_UTF8); + OString aName (pName->buffer, pName->length, RTL_TEXTENCODING_UTF8); + OStorePageKey aKey; + + eErrCode = OStorePageNameBlock::namei (aPath.pData, aName.pData, aKey); + if (eErrCode != store_E_None) + return eErrCode; + + // Remove. + return xManager->remove (aKey); +} + diff --git a/store/source/storlckb.cxx b/store/source/storlckb.cxx new file mode 100644 index 000000000000..2a9ad329f07b --- /dev/null +++ b/store/source/storlckb.cxx @@ -0,0 +1,872 @@ +/************************************************************************* + * + * $RCSfile: storlckb.cxx,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:18:32 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +#define _STORE_STORLCKB_CXX_ "$Revision: 1.1.1.1 $" + +#ifndef _SAL_TYPES_H_ +#include +#endif + +#ifndef _RTL_MEMORY_H_ +#include +#endif +#ifndef _RTL_TEXTCVT_H_ +#include +#endif +#ifndef _RTL_STRING_HXX_ +#include +#endif + +#ifndef _VOS_MUTEX_HXX_ +#include +#endif +#ifndef _VOS_REF_HXX_ +#include +#endif + +#ifndef _STORE_TYPES_H_ +#include +#endif +#ifndef _STORE_MACROS_HXX_ +#include +#endif +#ifndef _STORE_OBJECT_HXX_ +#include +#endif +#ifndef _STORE_LOCKBYTE_HXX_ +#include +#endif + +#ifndef _STORE_STORBASE_HXX_ +#include +#endif +#ifndef _STORE_STORDATA_HXX_ +#include +#endif +#ifndef _STORE_STORPAGE_HXX_ +#include +#endif + +#ifndef _STORE_STORLCKB_HXX_ +#include +#endif + +#ifdef _USE_NAMESPACE +using namespace rtl; +using namespace store; +#endif + +/*======================================================================== + * + * OStore... internals. + * + *======================================================================*/ +/* + * __store_convertTextToUnicode. + */ +inline sal_Int32 __store_convertTextToUnicode ( + rtl_TextToUnicodeConverter hConverter, + const sal_Char *pSrcBuffer, sal_Int32 nSrcLength, + sal_Unicode *pDstBuffer, sal_Int32 nDstLength) +{ + sal_uInt32 nCvtInfo, nCvtBytes = 0; + return rtl_convertTextToUnicode ( + hConverter, 0, + pSrcBuffer, nSrcLength, + pDstBuffer, nDstLength, + OSTRING_TO_OUSTRING_CVTFLAGS, + &nCvtInfo, &nCvtBytes); +} + +/* + * __store_iget. + * Precond: exclusive access. + */ +static storeError __store_iget ( + OStorePageManager &rManager, + OStoreDirectoryPageData &rNode, + sal_uInt32 nAttrib, + const rtl_String *pPath, + const rtl_String *pName, + storeAccessMode eMode) +{ + // Setup inode page key. + OStorePageKey aKey; + storeError eErrCode = OStorePageNameBlock::namei (pPath, pName, aKey); + if (eErrCode != store_E_None) + return eErrCode; + + // Check for directory. + if (nAttrib & STORE_ATTRIB_ISDIR) + { + // Ugly, but necessary (backward compatibility). + aKey.m_nLow = OStorePageGuard::crc32 (aKey.m_nLow, "/", 1); + } + + // Load inode page. + OStoreDirectoryPageObject aPage (rNode); + eErrCode = rManager.load (aKey, aPage); + if (eErrCode != store_E_None) + { + // Check mode and reason. + if (eErrCode != store_E_NotExists) + return eErrCode; + + if (eMode == store_AccessReadWrite) + return store_E_NotExists; + if (eMode == store_AccessReadOnly) + return store_E_NotExists; + + if (!rManager.isWriteable()) + return store_E_AccessViolation; + + // Setup inode nameblock. + rNode.m_aNameBlock.m_aKey = aKey; + rNode.m_aNameBlock.m_nAttrib = nAttrib; + + rtl_copyMemory ( + &rNode.m_aNameBlock.m_pData[0], + pName->buffer, pName->length); + + // Save inode page. + eErrCode = rManager.save (aKey, aPage); + if (eErrCode != store_E_None) + return eErrCode; + } + + // Check for symbolic link. + if (aPage.attrib() & STORE_ATTRIB_ISLINK) + { + // Obtain 'Destination' page key. + OStorePageKey aDstKey; + rtl_copyMemory (&aDstKey, &rNode.m_pData[0], sizeof(aDstKey)); + +#ifdef OSL_BIGENDIAN + // Swap to internal representation. + aDstKey.swap(); +#endif /* OSL_BIGENDIAN */ + + // Load 'Destination' inode. + eErrCode = rManager.load (aDstKey, aPage); + if (eErrCode != store_E_None) + return eErrCode; + } + + // Done. + return store_E_None; +} + +/*======================================================================== + * + * OStoreDirectory implementation. + * + *======================================================================*/ +VOS_IMPLEMENT_CLASSINFO( + VOS_CLASSNAME (OStoreDirectory, store), + VOS_NAMESPACE (OStoreDirectory, store), + VOS_NAMESPACE (OStoreObject, store), + 0); + +/* + * OStoreDirectory. + */ +OStoreDirectory::OStoreDirectory (void) + : m_xManager (NULL), + m_pNode (NULL), + m_aDescr (0, 0, 0), + m_nPath (0), + m_hTextCvt (NULL) +{ +} + +/* + * ~OStoreDirectory. + */ +OStoreDirectory::~OStoreDirectory (void) +{ + if (m_xManager.isValid()) + { + NAMESPACE_VOS(OGuard) aGuard (*m_xManager); + if (m_pNode) + { + m_xManager->releasePage (m_aDescr, store_AccessReadOnly); + } + } + delete m_pNode; + rtl_destroyTextToUnicodeConverter (m_hTextCvt); +} + +/* + * create. + */ +storeError OStoreDirectory::create ( + OStorePageManager *pManager, + rtl_uString *pPath, + rtl_uString *pName, + storeAccessMode eMode) +{ + NAMESPACE_VOS(ORef) xManager (pManager); + if (!xManager.isValid()) + return store_E_InvalidAccess; + + if (!(pPath && pName)) + return store_E_InvalidParameter; + + NAMESPACE_VOS(OGuard) aGuard (*xManager); + storeError eErrCode = xManager->getPageSize (m_aDescr.m_nSize); + if (eErrCode != store_E_None) + return eErrCode; + + delete m_pNode; + m_pNode = new(m_aDescr.m_nSize) inode(m_aDescr.m_nSize); + if (!m_pNode) + return store_E_OutOfMemory; + + OString aPath (pPath->buffer, pPath->length, RTL_TEXTENCODING_UTF8); + OString aName (pName->buffer, pName->length, RTL_TEXTENCODING_UTF8); + + eErrCode = __store_iget ( + *xManager, *m_pNode, STORE_ATTRIB_ISDIR, + aPath.pData, aName.pData, eMode); + if (eErrCode != store_E_None) + return eErrCode; + + sal_uInt32 nAttrib = m_pNode->m_aNameBlock.m_nAttrib; + if (!(nAttrib & STORE_ATTRIB_ISDIR)) + return store_E_NotDirectory; + + m_aDescr = m_pNode->m_aDescr; + eErrCode = xManager->acquirePage (m_aDescr, store_AccessReadOnly); + if (eErrCode == store_E_None) + { + // Evaluate iteration path from NameBlock. + typedef OStorePageGuard G; + sal_Char *pszName = m_pNode->m_aNameBlock.m_pData; + + m_nPath = m_pNode->m_aNameBlock.m_aKey.m_nHigh; + m_nPath = G::crc32 (m_nPath, pszName, rtl_str_getLength(pszName)); + m_nPath = G::crc32 (m_nPath, "/", 1); + + // Accept page manager. + m_xManager = xManager; + } + return eErrCode; +} + +/* + * iterate. + */ +storeError OStoreDirectory::iterate (storeFindData &rFindData) +{ + if (!m_xManager.isValid()) + return store_E_InvalidAccess; + + storeError eErrCode = store_E_NoMoreFiles; + if (!rFindData.m_nReserved) + return eErrCode; + + // Acquire exclusive access. + NAMESPACE_VOS(OGuard) aGuard (*m_xManager); + + // Check TextConverter. + if (m_hTextCvt == NULL) + m_hTextCvt = rtl_createTextToUnicodeConverter(RTL_TEXTENCODING_UTF8); + + // Setup iteration key and page buffer. + OStorePageKey aKey (rFindData.m_nReserved, m_nPath); + OStoreDirectoryPageObject aPage (*m_pNode); + + // Iterate. + for (;;) + { + eErrCode = m_xManager->iterate (aKey, aPage, rFindData.m_nAttrib); + if (!((eErrCode == store_E_None) && (aKey.m_nHigh == m_nPath))) + break; + + if (!(rFindData.m_nAttrib & STORE_ATTRIB_ISLINK)) + { + // Load page. + eErrCode = m_xManager->load (aPage); + if (eErrCode == store_E_None) + { + // Setup FindData. + sal_Char *p = m_pNode->m_aNameBlock.m_pData; + sal_Int32 n = rtl_str_getLength (p); + sal_Int32 k = rFindData.m_nLength; + + n = __store_convertTextToUnicode ( + m_hTextCvt, p, n, + rFindData.m_pszName, STORE_MAXIMUM_NAMESIZE - 1); + if (k > n) + { + k = (k - n) * sizeof(sal_Unicode); + rtl_zeroMemory (&rFindData.m_pszName[n], k); + } + + rFindData.m_nLength = n; + rFindData.m_nAttrib |= aPage.attrib(); + rFindData.m_nSize = aPage.dataLength(); + + // Leave. + rFindData.m_nReserved = aKey.m_nLow; + return store_E_None; + } + } + + if (aKey.m_nLow > 0) + aKey.m_nLow -= 1; + else + break; + } + + // Finished. + rtl_zeroMemory (&rFindData, sizeof (storeFindData)); + return store_E_NoMoreFiles; +} + +/*======================================================================== + * + * OStoreLockBytes implementation. + * + *======================================================================*/ +VOS_IMPLEMENT_CLASSINFO( + VOS_CLASSNAME (OStoreLockBytes, store), + VOS_NAMESPACE (OStoreLockBytes, store), + VOS_NAMESPACE (OStoreObject, store), + 0); + +/* + * OStoreLockBytes. + */ +OStoreLockBytes::OStoreLockBytes (void) + : m_xManager (NULL), + m_nPageSize (0), + m_pNode (NULL), + m_pData (NULL), + m_pSingle (NULL), + m_pDouble (NULL), + m_pTriple (NULL), + m_bWriteable (sal_False) +{ +} + +/* + * ~OStoreLockBytes. + */ +OStoreLockBytes::~OStoreLockBytes (void) +{ + if (m_xManager.isValid()) + { + NAMESPACE_VOS(OGuard) aGuard (*m_xManager); + if (m_pNode) + { + OStorePageDescriptor aDescr (m_pNode->m_aDescr); + if (m_bWriteable) + m_xManager->releasePage (aDescr, store_AccessReadWrite); + else + m_xManager->releasePage (aDescr, store_AccessReadOnly); + } + } + + delete m_pNode; + delete m_pData; + + delete m_pSingle; + delete m_pDouble; + delete m_pTriple; +} + +/* + * acquire. + */ +NAMESPACE_VOS(IReference)::RefCount +SAL_CALL OStoreLockBytes::acquire (void) +{ + return OStoreObject::acquire(); +} + +/* + * release. + */ +NAMESPACE_VOS(IReference)::RefCount +SAL_CALL OStoreLockBytes::release (void) +{ + return OStoreObject::release(); +} + +/* + * referenced. + */ +NAMESPACE_VOS(IReference)::RefCount +SAL_CALL OStoreLockBytes::referenced (void) const +{ + return OStoreObject::referenced(); +} + +/* + * create. + */ +storeError OStoreLockBytes::create ( + OStorePageManager *pManager, + rtl_uString *pPath, + rtl_uString *pName, + storeAccessMode eMode) +{ + NAMESPACE_VOS(ORef) xManager (pManager); + if (!xManager.isValid()) + return store_E_InvalidAccess; + + if (!(pPath && pName)) + return store_E_InvalidParameter; + + NAMESPACE_VOS(OGuard) aGuard (*xManager); + storeError eErrCode = xManager->getPageSize (m_nPageSize); + if (eErrCode != store_E_None) + return eErrCode; + + delete m_pNode; + m_pNode = new(m_nPageSize) inode(m_nPageSize); + if (!m_pNode) + return store_E_OutOfMemory; + + OString aPath (pPath->buffer, pPath->length, RTL_TEXTENCODING_UTF8); + OString aName (pName->buffer, pName->length, RTL_TEXTENCODING_UTF8); + + eErrCode = __store_iget ( + *xManager, *m_pNode, STORE_ATTRIB_ISFILE, + aPath.pData, aName.pData, eMode); + if (eErrCode != store_E_None) + return eErrCode; + + sal_uInt32 nAttrib = m_pNode->m_aNameBlock.m_nAttrib; + if (!(nAttrib & STORE_ATTRIB_ISFILE)) + { + // No ISFILE in older versions (backward compatibility). + if (nAttrib & STORE_ATTRIB_ISLINK) + return store_E_NotFile; + } + + // ... + OStorePageDescriptor aDescr (m_pNode->m_aDescr); + if (eMode != store_AccessReadOnly) + eErrCode = xManager->acquirePage (aDescr, store_AccessReadWrite); + else + eErrCode = xManager->acquirePage (aDescr, store_AccessReadOnly); + if (eErrCode != store_E_None) + return eErrCode; + + // ... + m_xManager = xManager; + m_bWriteable = (eMode != store_AccessReadOnly); + + // Check for truncation. + if (eMode == store_AccessCreate) + { + // Truncate to zero length. + eErrCode = setSize(0); + } + return eErrCode; +} + +/* + * readAt. + */ +storeError OStoreLockBytes::readAt ( + sal_uInt32 nOffset, + void *pBuffer, + sal_uInt32 nBytes, + sal_uInt32 &rnDone) +{ + rnDone = 0; + + if (!m_xManager.isValid()) + return store_E_InvalidAccess; + + if (!pBuffer) + return store_E_InvalidParameter; + if (!nBytes) + return store_E_None; + + // Acquire exclusive access. + NAMESPACE_VOS(OGuard) aGuard (*m_xManager); + + // Determine data length. + OStoreDirectoryPageObject aPage (*m_pNode); + + sal_uInt32 nDataLen = aPage.dataLength(); + if ((nOffset + nBytes) > nDataLen) + nBytes = nDataLen - nOffset; + + // Read data. + sal_uInt8 *pData = (sal_uInt8*)pBuffer; + while ((0 < nBytes) && (nOffset < nDataLen)) + { + // Determine 'Offset' scope. + inode::ChunkScope eScope = m_pNode->scope (nOffset); + if (eScope == inode::SCOPE_INTERNAL) + { + // Read from inode page (internal scope). + inode::ChunkDescriptor aDescr ( + nOffset, m_pNode->capacity()); + sal_uInt32 nLength = VOS_MIN (aDescr.m_nLength, nBytes); + + rtl_copyMemory ( + &pData[rnDone], + &m_pNode->m_pData[aDescr.m_nOffset], + nLength); + + // Adjust counters. + rnDone += nLength; + nOffset += nLength; + nBytes -= nLength; + } + else + { + // Read from data page (external scope). + if (!m_pData) + m_pData = new(m_nPageSize) data(m_nPageSize); + if (!m_pData) + return store_E_OutOfMemory; + OStoreDataPageObject aData (*m_pData); + + inode::ChunkDescriptor aDescr ( + nOffset - m_pNode->capacity(), m_pData->capacity()); + sal_uInt32 nLength = VOS_MIN (aDescr.m_nLength, nBytes); + + storeError eErrCode = aPage.get ( + aDescr.m_nPage, m_pSingle, m_pDouble, m_pTriple, + aData, *m_xManager, NULL); + if (eErrCode != store_E_None) + { + if (eErrCode != store_E_NotExists) + return eErrCode; + + rtl_zeroMemory ( + &pData[rnDone], + nLength); + } + else + { + rtl_copyMemory ( + &pData[rnDone], + &m_pData->m_pData[aDescr.m_nOffset], + nLength); + } + + // Adjust counters. + rnDone += nLength; + nOffset += nLength; + nBytes -= nLength; + } + } + + // Done. + return store_E_None; +} + +/* + * writeAt. + */ +storeError OStoreLockBytes::writeAt ( + sal_uInt32 nOffset, + const void *pBuffer, + sal_uInt32 nBytes, + sal_uInt32 &rnDone) +{ + rnDone = 0; + + if (!m_xManager.isValid()) + return store_E_InvalidAccess; + if (!m_bWriteable) + return store_E_AccessViolation; + + if (!pBuffer) + return store_E_InvalidParameter; + if (!nBytes) + return store_E_None; + + // Acquire exclusive access. + NAMESPACE_VOS(OGuard) aGuard (*m_xManager); + + // Write data. + OStoreDirectoryPageObject aPage (*m_pNode); + const sal_uInt8 *pData = (const sal_uInt8*)pBuffer; + + storeError eErrCode = store_E_None; + while (nBytes > 0) + { + // Determine 'Offset' scope. + inode::ChunkScope eScope = m_pNode->scope (nOffset); + if (eScope == inode::SCOPE_INTERNAL) + { + // Write to inode page (internal scope). + inode::ChunkDescriptor aDescr ( + nOffset, m_pNode->capacity()); + sal_uInt32 nLength = VOS_MIN (aDescr.m_nLength, nBytes); + + rtl_copyMemory ( + &m_pNode->m_pData[aDescr.m_nOffset], + &pData[rnDone], nLength); + + // Mark inode dirty. + aPage.touch(); + + // Adjust counters. + rnDone += nLength; + nOffset += nLength; + nBytes -= nLength; + + // Adjust data length. + if (aPage.dataLength() < nOffset) + aPage.dataLength (nOffset); + } + else + { + // Write to data page (external scope). + if (!m_pData) + m_pData = new(m_nPageSize) data(m_nPageSize); + if (!m_pData) + return store_E_OutOfMemory; + OStoreDataPageObject aData (*m_pData); + + inode::ChunkDescriptor aDescr ( + nOffset - m_pNode->capacity(), m_pData->capacity()); + sal_uInt32 nLength = aDescr.m_nLength; + + if ((aDescr.m_nOffset > 0) || (nBytes < nLength)) + { + // Unaligned. Need to load/create data page. + eErrCode = aPage.get ( + aDescr.m_nPage, m_pSingle, m_pDouble, m_pTriple, + aData, *m_xManager, NULL); + if (eErrCode != store_E_None) + { + if (eErrCode != store_E_NotExists) + return eErrCode; + + rtl_zeroMemory ( + &m_pData->m_pData[0], + m_pData->capacity()); + } + } + + // Modify data page. + nLength = VOS_MIN (nLength, nBytes); + + rtl_copyMemory ( + &m_pData->m_pData[aDescr.m_nOffset], + &pData[rnDone], nLength); + + // Save data page. + eErrCode = aPage.put ( + aDescr.m_nPage, m_pSingle, m_pDouble, m_pTriple, + aData, *m_xManager, NULL); + if (eErrCode != store_E_None) + return eErrCode; + + // Adjust counters. + rnDone += nLength; + nOffset += nLength; + nBytes -= nLength; + + // Adjust data length. + if (aPage.dataLength() < nOffset) + aPage.dataLength (nOffset); + } + } + + // Check for modified inode. + if (aPage.dirty()) + return m_xManager->save (aPage); + else + return store_E_None; +} + +/* + * flush. + */ +storeError OStoreLockBytes::flush (void) +{ + if (!m_xManager.isValid()) + return store_E_InvalidAccess; + + return m_xManager->flush(); +} + +/* + * setSize. + */ +storeError OStoreLockBytes::setSize (sal_uInt32 nSize) +{ + if (!m_xManager.isValid()) + return store_E_InvalidAccess; + if (!m_bWriteable) + return store_E_AccessViolation; + + // Acquire exclusive access. + NAMESPACE_VOS(OGuard) aGuard (*m_xManager); + + // Determine current length. + OStoreDirectoryPageObject aPage (*m_pNode); + sal_uInt32 nDataLen = aPage.dataLength(); + + if (nSize == nDataLen) + return store_E_None; + + if (nSize < nDataLen) + { + // Truncate. + storeError eErrCode = store_E_None; + + // Determine 'Size' scope. + inode::ChunkScope eSizeScope = m_pNode->scope (nSize); + if (eSizeScope == inode::SCOPE_INTERNAL) + { + // Internal 'Size' scope. Determine 'Data' scope. + inode::ChunkScope eDataScope = m_pNode->scope (nDataLen); + if (eDataScope == inode::SCOPE_EXTERNAL) + { + // External 'Data' scope. + if (!m_pData) + m_pData = new(m_nPageSize) data(m_nPageSize); + if (!m_pData) + return store_E_OutOfMemory; + OStoreDataPageObject aData (*m_pData); + + // Truncate all external data pages. + eErrCode = aPage.truncate ( + 0, m_pSingle, m_pDouble, m_pTriple, + aData, *m_xManager, NULL); + if (eErrCode != store_E_None) + return eErrCode; + } + + // Truncate internal data page. + inode::ChunkDescriptor aDescr (nSize, m_pNode->capacity()); + rtl_zeroMemory ( + &m_pNode->m_pData[aDescr.m_nOffset], + aDescr.m_nLength); + } + else + { + // External 'Size' scope. + if (!m_pData) + m_pData = new(m_nPageSize) data(m_nPageSize); + if (!m_pData) + return store_E_OutOfMemory; + OStoreDataPageObject aData (*m_pData); + + // Truncate external data pages. + inode::ChunkDescriptor aDescr ( + nSize - m_pNode->capacity(), m_pData->capacity()); + + sal_uInt32 nPage = aDescr.m_nPage; + if (aDescr.m_nOffset) nPage += 1; + + eErrCode = aPage.truncate ( + nPage, m_pSingle, m_pDouble, m_pTriple, + aData, *m_xManager, NULL); + if (eErrCode != store_E_None) + return eErrCode; + } + } + + // Set (extended or truncated) size. + aPage.dataLength (nSize); + + // Save modified inode. + return m_xManager->save (aPage); +} + +/* + * stat. + */ +storeError OStoreLockBytes::stat (sal_uInt32 &rnSize) +{ + rnSize = 0; + + if (!m_xManager.isValid()) + return store_E_InvalidAccess; + + rnSize = m_pNode->m_aDataBlock.m_nDataLen; + return store_E_None; +} + +/* + * lockRange. + */ +storeError OStoreLockBytes::lockRange ( + sal_uInt32 nOffset, sal_uInt32 nBytes) +{ + // (NYI). + return store_E_None; +} + +/* + * unlockRange. + */ +storeError OStoreLockBytes::unlockRange ( + sal_uInt32 nOffset, sal_uInt32 nBytes) +{ + // (NYI). + return store_E_None; +} + diff --git a/store/source/storlckb.hxx b/store/source/storlckb.hxx new file mode 100644 index 000000000000..a152dc5cf995 --- /dev/null +++ b/store/source/storlckb.hxx @@ -0,0 +1,296 @@ +/************************************************************************* + * + * $RCSfile: storlckb.hxx,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:18:32 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +#ifndef _STORE_STORLCKB_HXX_ +#define _STORE_STORLCKB_HXX_ "$Revision: 1.1.1.1 $" + +#ifndef _SAL_TYPES_H_ +#include +#endif + +#ifndef _RTL_TEXTCVT_H_ +#include +#endif +#ifndef _RTL_USTRING_H_ +#include +#endif + +#ifndef _STORE_MACROS_HXX_ +#include +#endif +#ifndef _STORE_OBJECT_HXX_ +#include +#endif +#ifndef _STORE_LOCKBYTE_HXX_ +#include +#endif + +#ifndef _STORE_STORBASE_HXX_ +#include +#endif +#ifndef _STORE_STORPAGE_HXX_ +#include +#endif + +#ifdef _USE_NAMESPACE +namespace store { +#endif + +struct OStoreDataPageData; +struct OStoreDirectoryPageData; +struct OStoreIndirectionPageData; + +/*======================================================================== + * + * OStoreDirectory interface. + * + *======================================================================*/ +class OStoreDirectory : public NAMESPACE_STORE(OStoreObject) +{ + VOS_DECLARE_CLASSINFO (VOS_NAMESPACE (OStoreDirectory, store)); + +public: + /** Construction. + */ + OStoreDirectory (void); + + /** create (two-phase construction). + * @param pManager [in] + * @param pszPath [in] + * @param pszName [in] + * @param eAccessMode [in] + * @return store_E_None upon success. + */ + storeError create ( + OStorePageManager *pManager, + rtl_uString *pPath, + rtl_uString *pName, + storeAccessMode eAccessMode); + + /** iterate. + * @param rFindData [out] + * @return store_E_None upon success, + * store_E_NoMoreFiles upon end of iteration. + */ + storeError iterate ( + storeFindData &rFindData); + +protected: + /** Destruction (OReference). + */ + virtual ~OStoreDirectory (void); + +private: + /** Representation. + */ + NAMESPACE_VOS(ORef) m_xManager; + + typedef OStoreDirectoryPageData inode; + inode *m_pNode; + + OStorePageDescriptor m_aDescr; + sal_uInt32 m_nPath; + rtl_TextToUnicodeConverter m_hTextCvt; + + /** Not implemented. + */ + OStoreDirectory (const OStoreDirectory&); + OStoreDirectory& operator= (const OStoreDirectory&); +}; + +/*======================================================================== + * + * OStoreLockBytes interface. + * + *======================================================================*/ +class OStoreLockBytes : + public NAMESPACE_STORE(OStoreObject), + public NAMESPACE_STORE(ILockBytes) +{ + VOS_DECLARE_CLASSINFO (VOS_NAMESPACE (OStoreLockBytes, store)); + +public: + /** Construction. + */ + OStoreLockBytes (void); + + /** create (two-phase construction). + * @param pManager [in] + * @param rNode [in] + * @param eMode [in] + * @return store_E_None upon success + */ + storeError create ( + OStorePageManager *pManager, + rtl_uString *pPath, + rtl_uString *pName, + storeAccessMode eAccessMode); + + /** Read at Offset into Buffer. + * @param nOffset [in] + * @param pBuffer [out] + * @param nBytes [in] + * @param rnDone [out] + * @return store_E_None upon success + */ + virtual storeError readAt ( + sal_uInt32 nOffset, + void *pBuffer, + sal_uInt32 nBytes, + sal_uInt32 &rnDone); + + /** Write at Offset from Buffer. + * @param nOffset [in] + * @param pBuffer [in] + * @param nBytes [in] + * @param rnDone [out] + * @return store_E_None upon success + */ + virtual storeError writeAt ( + sal_uInt32 nOffset, + const void *pBuffer, + sal_uInt32 nBytes, + sal_uInt32 &rnDone); + + /** flush. + * @return store_E_None upon success + */ + virtual storeError flush (void); + + /** setSize. + * @param nSize [in] + * @return store_E_None upon success + */ + virtual storeError setSize (sal_uInt32 nSize); + + /** stat. + * @paran rnSize [out] + * @return store_E_None upon success + */ + virtual storeError stat (sal_uInt32 &rnSize); + + /** Lock range at Offset. + * @param nOffset [in] + * @param nBytes [in] + * @return store_E_None upon success + * store_E_LockingViolation + */ + virtual storeError lockRange ( + sal_uInt32 nOffset, + sal_uInt32 nBytes); + + /** Unlock range at Offset. + * @param nOffset [in] + * @param nBytes [in] + * @return store_E_None upon success + * store_E_LockingViolation + */ + virtual storeError unlockRange ( + sal_uInt32 nOffset, + sal_uInt32 nBytes); + + /** Delegate multiple inherited IReference. + */ + virtual RefCount SAL_CALL acquire (void); + virtual RefCount SAL_CALL release (void); + virtual RefCount SAL_CALL referenced (void) const; + +protected: + /** Destruction (OReference). + */ + virtual ~OStoreLockBytes (void); + +private: + /** Representation. + */ + NAMESPACE_VOS(ORef) m_xManager; + + typedef OStoreDataPageData data; + typedef OStoreDirectoryPageData inode; + typedef OStoreIndirectionPageData indirect; + + inode *m_pNode; + data *m_pData; + + indirect *m_pSingle; + indirect *m_pDouble; + indirect *m_pTriple; + + sal_Bool m_bWriteable; + sal_uInt16 m_nPageSize; + + /** Not implemented. + */ + OStoreLockBytes (const OStoreLockBytes&); + OStoreLockBytes& operator= (const OStoreLockBytes&); +}; + +/*======================================================================== + * + * The End. + * + *======================================================================*/ +#ifdef _USE_NAMESPACE +} +#endif + +#endif /* !_STORE_STORLCKB_HXX_ */ + diff --git a/store/source/storpage.cxx b/store/source/storpage.cxx new file mode 100644 index 000000000000..6df188519d4a --- /dev/null +++ b/store/source/storpage.cxx @@ -0,0 +1,1562 @@ +/************************************************************************* + * + * $RCSfile: storpage.cxx,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:18:32 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +#define _STORE_STORPAGE_CXX_ "$Revision: 1.1.1.1 $" + +#ifndef _SAL_TYPES_H_ +#include +#endif + +#ifndef _RTL_MEMORY_H_ +#include +#endif +#ifndef _RTL_STRING_H_ +#include +#endif + +#ifndef _VOS_DIAGNOSE_HXX_ +#include +#endif +#ifndef _VOS_MUTEX_HXX_ +#include +#endif + +#ifndef _STORE_TYPES_H_ +#include +#endif +#ifndef _STORE_MACROS_HXX_ +#include +#endif +#ifndef _STORE_OBJECT_HXX_ +#include +#endif +#ifndef _STORE_LOCKBYTE_HXX_ +#include +#endif + +#ifndef _STORE_STORBASE_HXX_ +#include +#endif +#ifndef _STORE_STORCACH_HXX_ +#include +#endif +#ifndef _STORE_STORDMON_HXX_ +#include +#endif +#ifndef _STORE_STORDATA_HXX_ +#include +#endif +#ifndef _STORE_STORTREE_HXX_ +#include +#endif + +#ifndef _STORE_STORPAGE_HXX_ +#include +#endif + +#ifdef _USE_NAMESPACE +using namespace store; +#endif + +/*======================================================================== + * + * OStorePageManager implementation. + * + *======================================================================*/ +VOS_IMPLEMENT_CLASSINFO( + VOS_CLASSNAME (OStorePageManager, store), + VOS_NAMESPACE (OStorePageManager, store), + VOS_NAMESPACE (OStorePageBIOS, store), + 0); + +/* + * OStorePageManager. + */ +OStorePageManager::OStorePageManager (void) + : m_xDaemon (NULL), + m_pCache (NULL), + m_pDirect (NULL), + m_pData (NULL), + m_nPageSize (0) +{ + // Node pages. + m_pNode[0] = NULL; + m_pNode[1] = NULL; + m_pNode[2] = NULL; + + // Indirect pages. + m_pLink[0] = NULL; + m_pLink[1] = NULL; + m_pLink[2] = NULL; + + // Daemon (kflushd :-). + if (OStorePageDaemon::getOrCreate (m_xDaemon)) + m_xDaemon->insert (this); +} + +/* + * ~OStorePageManager. + */ +OStorePageManager::~OStorePageManager (void) +{ + NAMESPACE_VOS(OGuard) aGuard (*this); + if (m_xDaemon.isValid()) + m_xDaemon->remove (this); + + delete m_pCache; + delete m_pDirect; + delete m_pData; + + delete m_pNode[0]; + delete m_pNode[1]; + delete m_pNode[2]; + + delete m_pLink[0]; + delete m_pLink[1]; + delete m_pLink[2]; +} + +/* + * initialize (two-phase construction). + * Precond: none. + */ +storeError OStorePageManager::initialize ( + ILockBytes *pLockBytes, + storeAccessMode eAccessMode, + sal_uInt16 nPageSize) +{ + // Acquire exclusive access. + NAMESPACE_VOS(OGuard) aGuard(*this); + + // Check arguments. + if (!pLockBytes) + return store_E_InvalidParameter; + + // Initialize base. + storeError eErrCode = base::initialize (pLockBytes, eAccessMode); + if (eErrCode != store_E_None) + { + // Check mode and reason. + if (eErrCode != store_E_NotExists) + return eErrCode; + + if (eAccessMode == store_AccessReadWrite) + return store_E_NotExists; + if (eAccessMode == store_AccessReadOnly) + return store_E_NotExists; + + // Create. + eErrCode = base::create (nPageSize); + if (eErrCode != store_E_None) + return eErrCode; + } + + // Obtain page size. + eErrCode = base::getPageSize (m_nPageSize); + VOS_POSTCOND( + eErrCode == store_E_None, + "OStorePageManager::initialize(): getPageSize() failed"); + if (eErrCode != store_E_None) + return eErrCode; + + // Cleanup. + __STORE_DELETEZ (m_pCache); + __STORE_DELETEZ (m_pDirect); + __STORE_DELETEZ (m_pData); + + __STORE_DELETEZ (m_pNode[0]); + __STORE_DELETEZ (m_pNode[1]); + __STORE_DELETEZ (m_pNode[2]); + + __STORE_DELETEZ (m_pLink[0]); + __STORE_DELETEZ (m_pLink[1]); + __STORE_DELETEZ (m_pLink[2]); + + // Initialize page buffers. + m_pNode[0] = new(m_nPageSize) page(m_nPageSize); + if (eAccessMode != store_AccessReadOnly) + { + m_pNode[1] = new(m_nPageSize) page(m_nPageSize); + m_pNode[2] = new(m_nPageSize) page(m_nPageSize); + } + + // Initialize page cache. + m_pCache = new OStorePageCache(); + + // Done. + return eErrCode; +} + +/* + * free (unmanaged). + * Precond: initialized, writeable. + */ +storeError OStorePageManager::free (OStorePageObject &rPage) +{ + // Acquire exclusive access. + NAMESPACE_VOS(OGuard) aGuard(*this); + + // Check precond. + if (!self::isValid()) + return store_E_InvalidAccess; + + if (!base::isWriteable()) + return store_E_AccessViolation; + + // Check for cacheable page. + OStorePageData &rData = rPage.getData(); + if (rData.m_aGuard.m_nMagic == STORE_MAGIC_BTREENODE) + { + // Invalidate cache entry. + storeError eErrCode = m_pCache->invalidate (rData.m_aDescr); + if (eErrCode != store_E_None) + return eErrCode; + } + + // Free page. + return base::free (rPage); +} + +/* + * load (unmanaged). + * Precond: initialized. + */ +storeError OStorePageManager::load (OStorePageObject &rPage) +{ + // Acquire exclusive access. + NAMESPACE_VOS(OGuard) aGuard(*this); + + // Check precond. + if (!self::isValid()) + return store_E_InvalidAccess; + + // Check for cacheable page. + OStorePageData &rData = rPage.getData(); + if (rData.m_aGuard.m_nMagic == STORE_MAGIC_BTREENODE) + { + // Save PageDescriptor. + OStorePageDescriptor aDescr (rData.m_aDescr); + + // Load (cached) page. + storeError eErrCode = m_pCache->load (aDescr, rData, *this); + if (eErrCode != store_E_None) + { + // Check for pending verification. + if (eErrCode != store_E_Pending) + return eErrCode; + + // Verify page. + eErrCode = rPage.verify (aDescr); + if (eErrCode != store_E_None) + return eErrCode; + } + +#ifdef OSL_BIGENDIAN + // Swap to internal representation. + rPage.swap (aDescr); +#endif /* OSL_BIGENDIAN */ + + // Done. + return store_E_None; + } + + // Load (uncached) page. + return base::load (rPage); +} + +/* + * save (unmanaged). + * Precond: initialized, writeable. + */ +storeError OStorePageManager::save (OStorePageObject &rPage) +{ + // Acquire exclusive access. + NAMESPACE_VOS(OGuard) aGuard(*this); + + // Check precond. + if (!self::isValid()) + return store_E_InvalidAccess; + + if (!base::isWriteable()) + return store_E_AccessViolation; + + // Check for cacheable page. + OStorePageData &rData = rPage.getData(); + if (rData.m_aGuard.m_nMagic == STORE_MAGIC_BTREENODE) + { + // Save PageDescriptor. + OStorePageDescriptor aDescr (rData.m_aDescr); + +#ifdef OSL_BIGENDIAN + // Swap to external representation. + rPage.swap (aDescr); +#endif /* OSL_BIGENDIAN */ + + // Guard page. + rPage.guard (aDescr); + + // Save (cached) page. +#if 0 /* EXPERIMENTAL */ + storeError eErrCode = m_pCache->update ( + aDescr, rData, *this, NULL, + OStorePageCache::UPDATE_WRITE_DELAYED); +#else + storeError eErrCode = m_pCache->update ( + aDescr, rData, *this, NULL, + OStorePageCache::UPDATE_WRITE_THROUGH); +#endif /* EXPERIMENTAL */ + +#ifdef OSL_BIGENDIAN + // Swap back to internal representation. + rPage.swap (aDescr); +#endif /* OSL_BIGENDIAN */ + + // Mark page clean. + if (eErrCode == store_E_None) + rPage.clean(); + + // Done. + return eErrCode; + } + + // Save (uncached) page. + return base::save (rPage); +} + +/* + * flush. + * Precond: initialized. + */ +storeError OStorePageManager::flush (void) +{ + // Acquire exclusive access. + NAMESPACE_VOS(OGuard) aGuard(*this); + + // Check precond. + if (!self::isValid()) + return store_E_InvalidAccess; + + // Check access mode. + if (!base::isWriteable()) + return store_E_None; + + // Flush cache. + storeError eErrCode = m_pCache->flush (*this, NULL); + VOS_POSTCOND( + eErrCode == store_E_None, + "OStorePageManager::flush(): cache::flush() failed"); + + // Flush base. + return base::flush(); +} + +/* + * find (w/o split()). + * Internal: Precond: initialized, readable, exclusive access. + */ +storeError OStorePageManager::find (const entry &rEntry, page &rPage) +{ + // Load RootNode. + OStoreBTreeRootObject aRoot (rPage); + aRoot.location (m_nPageSize); + + storeError eErrCode = load (aRoot); + if (eErrCode != store_E_None) + return eErrCode; + + // Check current Page. + while (rPage.depth()) + { + // Find next page. + sal_uInt16 i = rPage.find(rEntry), n = rPage.usageCount(); + if (!(i < n)) + { + // Path to entry not exists (Must not happen(?)). + return store_E_NotExists; + } + + // Check address. + sal_uInt32 nAddr = rPage.m_pData[i].m_aLink.m_nAddr; + if (nAddr == STORE_PAGE_NULL) + { + // Path to entry not exists (Must not happen(?)). + return store_E_NotExists; + } + + // Load next page. + node aNode (rPage); + aNode.location (nAddr); + + eErrCode = load (aNode); + if (eErrCode != store_E_None) + return eErrCode; + } + + // Done. + return store_E_None; +} + +/* + * find (possibly with split()). + * Internal: Precond: initialized, writeable, exclusive access. + */ +storeError OStorePageManager::find ( + const entry &rEntry, page &rPage, page &rPageL, page &rPageR) +{ + // Load RootNode. + OStoreBTreeRootObject aRoot (rPage); + aRoot.location (m_nPageSize); + + storeError eErrCode = load (aRoot); + if (eErrCode != store_E_None) + { + // Check existence. + if (eErrCode != store_E_NotExists) + return eErrCode; + + // Pre-allocate left most entry (ugly, but we can't insert to left). + rPage.insert (0, entry()); + rPage.m_pData[0].m_aKey.m_nLow = OStorePageGuard::crc32 (0, "/", 1); + + // Allocate RootNode. + eErrCode = base::allocate (aRoot, ALLOCATE_EOF); + if (eErrCode != store_E_None) + return eErrCode; + } + else + { + // Check for RootNode split. + if (aRoot.querySplit()) + { + // Split root. + eErrCode = aRoot.split (0, rPageL, rPageR, *this); + if (eErrCode != store_E_None) + return eErrCode; + } + } + + // Check current Page. + while (rPage.depth()) + { + // Find next page. + sal_uInt16 i = rPage.find (rEntry), n = rPage.usageCount(); + if (!(i < n)) + { + // Path to entry not exists (Must not happen(?)). + return store_E_NotExists; + } + + // Check address. + sal_uInt32 nAddr = rPage.m_pData[i].m_aLink.m_nAddr; + if (nAddr == STORE_PAGE_NULL) + { + // Path to entry not exists (Must not happen(?)). + return store_E_NotExists; + } + + // Load next page. + node aNode (rPageL); + aNode.location (nAddr); + + eErrCode = load (aNode); + if (eErrCode != store_E_None) + return eErrCode; + + // Check for node split. + if (rPageL.querySplit()) + { + // Split node. + node aParent (rPage); + eErrCode = aParent.split (i, rPageL, rPageR, *this); + if (eErrCode != store_E_None) + return eErrCode; + + // Restart. + continue; + } + else + { + // Let next page be current. + rPage = rPageL; + continue; + } + } + + // Done. + return store_E_None; +} + +/* + * remove (possibly down from root). + * Internal: Precond: initialized, writeable, exclusive access. + */ +storeError OStorePageManager::remove ( + entry &rEntry, page &rPage, page &rPageL) +{ + // Load RootNode. + OStoreBTreeRootObject aRoot (rPage); + aRoot.location (m_nPageSize); + + storeError eErrCode = load (aRoot); + if (eErrCode != store_E_None) + return eErrCode; + + // Check index. + sal_uInt16 i = rPage.find (rEntry), n = rPage.usageCount(); + if (!(i < n)) + { + // Path to entry not exists (Must not happen(?)). + return store_E_NotExists; + } + + // Compare entry. + entry::CompareResult result = rEntry.compare (rPage.m_pData[i]); + + // Iterate down until equal match. + while ((result == entry::COMPARE_GREATER) && (rPage.depth() > 0)) + { + // Check link address. + sal_uInt32 nAddr = rPage.m_pData[i].m_aLink.m_nAddr; + if (nAddr == STORE_PAGE_NULL) + { + // Path to entry not exists (Must not happen(?)). + return store_E_NotExists; + } + + // Load link page. + node aNode (rPage); + aNode.location (nAddr); + + eErrCode = load (aNode); + if (eErrCode != store_E_None) + return eErrCode; + + // Check index. + i = rPage.find (rEntry), n = rPage.usageCount(); + if (!(i < n)) + { + // Path to entry not exists (Must not happen(?)). + return store_E_NotExists; + } + + // Compare entry. + result = rEntry.compare (rPage.m_pData[i]); + } + + VOS_POSTCOND( + result != entry::COMPARE_LESS, + "OStorePageManager::remove(): find failed"); + + // Check entry comparison. + if (result == entry::COMPARE_LESS) + { + // Must not happen. + return store_E_Unknown; + } + + // Remove down from current page (recursive). + node aNode (rPage); + return aNode.remove (i, rEntry, rPageL, *this, NULL); +} + +/* + * load. + * Precond: initialized. + */ +storeError OStorePageManager::load ( + const OStorePageKey &rKey, + OStoreDirectoryPageObject &rPage) +{ + // Acquire exclusive access. + NAMESPACE_VOS(OGuard) aGuard(*this); + + // Check precond. + if (!self::isValid()) + return store_E_InvalidAccess; + + // Setup BTree entry. + entry e; + e.m_aKey = rKey; + + // Find NodePage. + storeError eErrCode = find (e, *m_pNode[0]); + if (eErrCode != store_E_None) + return eErrCode; + + // Find Index. + sal_uInt16 i = m_pNode[0]->find(e), n = m_pNode[0]->usageCount(); + if (!(i < n)) + { + // Page not present. + return store_E_NotExists; + } + + // Check for exact match. + if (!(e.compare (m_pNode[0]->m_pData[i]) == entry::COMPARE_EQUAL)) + { + // Page not present. + return store_E_NotExists; + } + + // Existing entry. Check address. + sal_uInt32 nAddr = m_pNode[0]->m_pData[i].m_aLink.m_nAddr; + if (nAddr == STORE_PAGE_NULL) + { + // Page not present. + return store_E_NotExists; + } + + // Load page. + rPage.location (nAddr); + return load (rPage); +} + +/* + * save. + * Precond: initialized, writeable. + */ +storeError OStorePageManager::save ( + const OStorePageKey &rKey, + OStoreDirectoryPageObject &rPage) +{ + // Acquire exclusive access. + NAMESPACE_VOS(OGuard) aGuard(*this); + + // Check precond. + if (!self::isValid()) + return store_E_InvalidAccess; + + if (!base::isWriteable()) + return store_E_AccessViolation; + + // Setup BTree entry. + entry e; + e.m_aKey = rKey; + + // Find NodePage. + storeError eErrCode = find (e, *m_pNode[0], *m_pNode[1], *m_pNode[2]); + if (eErrCode != store_E_None) + return eErrCode; + + // Find Index. + sal_uInt16 i = m_pNode[0]->find(e), n = m_pNode[0]->usageCount(); + if (i < n) + { + // Compare entry. + entry::CompareResult result = e.compare (m_pNode[0]->m_pData[i]); + VOS_POSTCOND( + result != entry::COMPARE_LESS, + "OStorePageManager::save(): find failed"); + + // Check result. + if (result == entry::COMPARE_LESS) + { + // Must not happen. + return store_E_Unknown; + } + + if (result == entry::COMPARE_EQUAL) + { + // Existing entry. Check address. + sal_uInt32 nAddr = m_pNode[0]->m_pData[i].m_aLink.m_nAddr; + if (nAddr == STORE_PAGE_NULL) + { + // Allocate page. + eErrCode = base::allocate (rPage); + if (eErrCode != store_E_None) + return eErrCode; + + // Modify page address. + m_pNode[0]->m_pData[i].m_aLink.m_nAddr = rPage.location(); + + // Save modified NodePage. + node aNode (*m_pNode[0]); + return save (aNode); + } + else + { + // Save page. + rPage.location (nAddr); + return save (rPage); + } + } + } + + // Allocate. + eErrCode = base::allocate (rPage); + if (eErrCode != store_E_None) + return eErrCode; + + // Insert. + e.m_aLink.m_nAddr = rPage.location(); + m_pNode[0]->insert (i + 1, e); + + // Save modified NodePage. + node aNode (*m_pNode[0]); + return save (aNode); +} + +/* + * attrib [nAttrib = ((nAttrib & ~nMask1) | nMask2)]. + * Precond: initialized. + */ +storeError OStorePageManager::attrib ( + const OStorePageKey &rKey, + sal_uInt32 nMask1, + sal_uInt32 nMask2, + sal_uInt32 &rAttrib) +{ + // Acquire exclusive access. + NAMESPACE_VOS(OGuard) aGuard(*this); + + // Check precond. + if (!self::isValid()) + return store_E_InvalidAccess; + + // Setup BTree entry. + entry e; + e.m_aKey = rKey; + + // Find NodePage. + storeError eErrCode = find (e, *m_pNode[0]); + if (eErrCode != store_E_None) + return eErrCode; + + // Find Index. + sal_uInt16 i = m_pNode[0]->find(e), n = m_pNode[0]->usageCount(); + if (!(i < n)) + { + // Page not present. + return store_E_NotExists; + } + + // Check for exact match. + if (!(e.compare (m_pNode[0]->m_pData[i]) == entry::COMPARE_EQUAL)) + { + // Page not present. + return store_E_NotExists; + } + + // Existing entry. + e = m_pNode[0]->m_pData[i]; + if (nMask1 != nMask2) + { + // Evaluate new attributes. + sal_uInt32 nAttrib = e.m_nAttrib; + + nAttrib &= ~nMask1; + nAttrib |= nMask2; + + if (nAttrib != e.m_nAttrib) + { + // Check access mode. + if (base::isWriteable()) + { + // Set new attributes. + e.m_nAttrib = nAttrib; + m_pNode[0]->m_pData[i] = e; + + // Save modified NodePage. + node aNode (*m_pNode[0]); + eErrCode = save (aNode); + } + else + { + // Access denied. + eErrCode = store_E_AccessViolation; + } + } + } + + // Obtain current attributes. + rAttrib = e.m_nAttrib; + return eErrCode; +} + +/* + * link (insert 'Source' as hardlink to 'Destination'). + * Precond: initialized, writeable. + */ +storeError OStorePageManager::link ( + const OStorePageKey &rSrcKey, + const OStorePageKey &rDstKey) +{ + // Acquire exclusive access. + NAMESPACE_VOS(OGuard) aGuard(*this); + + // Check precond. + if (!self::isValid()) + return store_E_InvalidAccess; + + if (!base::isWriteable()) + return store_E_AccessViolation; + + // Setup 'Destination' BTree entry. + entry e; + e.m_aKey = rDstKey; + + // Find 'Destination' NodePage. + storeError eErrCode = find (e, *m_pNode[0]); + if (eErrCode != store_E_None) + return eErrCode; + + // Find 'Destination' Index. + sal_uInt16 i = m_pNode[0]->find(e), n = m_pNode[0]->usageCount(); + if (!(i < n)) + { + // Page not present. + return store_E_NotExists; + } + + // Check for exact match. + if (!(e.compare (m_pNode[0]->m_pData[i]) == entry::COMPARE_EQUAL)) + { + // Page not present. + return store_E_NotExists; + } + + // Existing entry. Check address. + e = m_pNode[0]->m_pData[i]; + if (e.m_aLink.m_nAddr == STORE_PAGE_NULL) + { + // Page not present. + return store_E_NotExists; + } + + // Setup 'Source' BTree entry. + e.m_aKey = rSrcKey; + e.m_nAttrib = STORE_ATTRIB_ISLINK; + + // Find 'Source' NodePage. + eErrCode = find (e, *m_pNode[0], *m_pNode[1], *m_pNode[2]); + if (eErrCode != store_E_None) + return eErrCode; + + // Find 'Source' Index. + i = m_pNode[0]->find(e), n = m_pNode[0]->usageCount(); + if (i < n) + { + // Compare entry. + entry::CompareResult result = e.compare (m_pNode[0]->m_pData[i]); + VOS_POSTCOND( + result != entry::COMPARE_LESS, + "OStorePageManager::link(): find failed"); + + // Check result. + if (result == entry::COMPARE_LESS) + { + // Must not happen. + return store_E_Unknown; + } + + if (result == entry::COMPARE_EQUAL) + { + // Existing 'Source' entry. + return store_E_AlreadyExists; + } + } + + // Insert 'Source' entry. + m_pNode[0]->insert (i + 1, e); + + node aNode (*m_pNode[0]); + return save (aNode); +} + +/* + * symlink (insert 'Source' DirectoryPage as symlink to 'Destination'). + * Precond: initialized, writeable. + */ +storeError OStorePageManager::symlink ( + const rtl_String *pSrcPath, + const rtl_String *pSrcName, + const OStorePageKey &rDstKey) +{ + // Acquire exclusive access. + NAMESPACE_VOS(OGuard) aGuard(*this); + + // Check precond. + if (!self::isValid()) + return store_E_InvalidAccess; + + if (!base::isWriteable()) + return store_E_AccessViolation; + + // Check 'Source' parameter. + storeError eErrCode = store_E_InvalidParameter; + if (!(pSrcPath && pSrcName)) + return eErrCode; + + // Setup 'Source' page key. + OStorePageKey aSrcKey; + eErrCode = OStorePageNameBlock::namei (pSrcPath, pSrcName, aSrcKey); + if (eErrCode != store_E_None) + return eErrCode; + + // Setup 'Source' BTree entry. + entry e; + e.m_aKey = aSrcKey; + + // Find 'Source' NodePage. + eErrCode = find (e, *m_pNode[0], *m_pNode[1], *m_pNode[2]); + if (eErrCode != store_E_None) + return eErrCode; + + // Find 'Source' Index. + sal_uInt16 i = m_pNode[0]->find(e), n = m_pNode[0]->usageCount(); + if (i < n) + { + // Compare entry. + entry::CompareResult result = e.compare (m_pNode[0]->m_pData[i]); + VOS_POSTCOND( + result != entry::COMPARE_LESS, + "OStorePageManager::symlink(): find failed"); + + // Check result. + if (result == entry::COMPARE_LESS) + { + // Must not happen. + return store_E_Unknown; + } + + if (result == entry::COMPARE_EQUAL) + { + // Existing 'Source' entry. + return store_E_AlreadyExists; + } + } + + // Initialize directory page buffer. + if (m_pDirect) + m_pDirect->initialize(); + if (!m_pDirect) + m_pDirect = new(m_nPageSize) inode(m_nPageSize); + if (!m_pDirect) + return store_E_OutOfMemory; + + // Setup as 'Source' directory page. + m_pDirect->m_aNameBlock.m_aKey = aSrcKey; + rtl_copyMemory ( + &m_pDirect->m_aNameBlock.m_pData[0], + pSrcName->buffer, pSrcName->length); + + // Store 'Destination' page key. + OStorePageKey aDstKey (rDstKey); +#ifdef OSL_BIGENDIAN + aDstKey.swap(); // Swap to external representation. +#endif /* OSL_BIGENDIAN */ + rtl_copyMemory (&m_pDirect->m_pData[0], &aDstKey, sizeof(aDstKey)); + + // Mark 'Source' as symbolic link to 'Destination'. + OStoreDirectoryPageObject aPage (*m_pDirect); + aPage.attrib (STORE_ATTRIB_ISLINK); + aPage.dataLength (sizeof (aDstKey)); + + // Allocate and save 'Source' directory page. + eErrCode = base::allocate (aPage); + if (eErrCode != store_E_None) + return eErrCode; + + // Insert 'Source' entry. + e.m_aLink.m_nAddr = aPage.location(); + m_pNode[0]->insert (i + 1, e); + + // Save modified NodePage. + node aNode (*m_pNode[0]); + return save (aNode); +} + +/* + * rename. + * Precond: initialized, writeable. + */ +storeError OStorePageManager::rename ( + const OStorePageKey &rSrcKey, + const rtl_String *pDstPath, + const rtl_String *pDstName) +{ + // Acquire exclusive access. + NAMESPACE_VOS(OGuard) aGuard(*this); + + // Check precond. + if (!self::isValid()) + return store_E_InvalidAccess; + + if (!base::isWriteable()) + return store_E_AccessViolation; + + // Check 'Destination' parameter. + storeError eErrCode = store_E_InvalidParameter; + if (!(pDstPath && pDstName)) + return eErrCode; + + // Setup 'Destination' page key. + OStorePageKey aDstKey; + eErrCode = OStorePageNameBlock::namei (pDstPath, pDstName, aDstKey); + if (eErrCode != store_E_None) + return eErrCode; + + // Setup 'Source' BTree entry. + entry e; + e.m_aKey = rSrcKey; + + // Find 'Source' NodePage. + eErrCode = find (e, *m_pNode[0]); + if (eErrCode != store_E_None) + return eErrCode; + + // Find 'Source' Index. + sal_uInt16 i = m_pNode[0]->find(e), n = m_pNode[0]->usageCount(); + if (!(i < n)) + { + // Page not present. + return store_E_NotExists; + } + + // Check for exact match. + if (!(e.compare (m_pNode[0]->m_pData[i]) == entry::COMPARE_EQUAL)) + { + // Page not present. + return store_E_NotExists; + } + + // Existing 'Source' entry. Check address. + e = m_pNode[0]->m_pData[i]; + if (e.m_aLink.m_nAddr == STORE_PAGE_NULL) + { + // Page not present. + return store_E_NotExists; + } + + // Check for hardlink. + if (!(e.m_nAttrib & STORE_ATTRIB_ISLINK)) + { + // Check directory page buffer. + if (!m_pDirect) + m_pDirect = new(m_nPageSize) inode(m_nPageSize); + if (!m_pDirect) + return store_E_OutOfMemory; + + // Load directory page. + OStoreDirectoryPageObject aPage (*m_pDirect); + aPage.location (e.m_aLink.m_nAddr); + + eErrCode = base::load (aPage); + if (eErrCode != store_E_None) + return eErrCode; + + // Check for directory. + if (aPage.attrib() & STORE_ATTRIB_ISDIR) + { + // Ugly, but necessary (backward compatibility). + aDstKey.m_nLow = OStorePageGuard::crc32 (aDstKey.m_nLow, "/", 1); + } + } + + // Let 'Source' entry be 'Destination' entry. + e.m_aKey = aDstKey; + + // Find 'Destination' NodePage. + eErrCode = find (e, *m_pNode[0], *m_pNode[1], *m_pNode[2]); + if (eErrCode != store_E_None) + return eErrCode; + + // Find 'Destination' Index. + i = m_pNode[0]->find(e), n = m_pNode[0]->usageCount(); + if (i < n) + { + // Compare entry. + entry::CompareResult result = e.compare (m_pNode[0]->m_pData[i]); + VOS_POSTCOND( + result != entry::COMPARE_LESS, + "OStorePageManager::rename(): find failed"); + + // Check result. + if (result == entry::COMPARE_LESS) + { + // Must not happen. + return store_E_Unknown; + } + + if (result == entry::COMPARE_EQUAL) + { + // Existing 'Destination' entry. + return store_E_AlreadyExists; + } + } + + // Insert 'Destination' entry. + node aNode (*m_pNode[0]); + m_pNode[0]->insert (i + 1, e); + + eErrCode = save (aNode); + if (eErrCode != store_E_None) + return eErrCode; + + // Check for hardlink. + if (!(e.m_nAttrib & STORE_ATTRIB_ISLINK)) + { + // Setup 'Destination' NameBlock. + sal_Int32 nDstLen = pDstName->length; + rtl_copyMemory ( + &m_pDirect->m_aNameBlock.m_pData[0], + pDstName->buffer, nDstLen); + rtl_zeroMemory ( + &m_pDirect->m_aNameBlock.m_pData[nDstLen], + STORE_MAXIMUM_NAMESIZE - nDstLen); + m_pDirect->m_aNameBlock.m_aKey = e.m_aKey; + + // Save directory page. + OStoreDirectoryPageObject aPage (*m_pDirect); + aPage.location (e.m_aLink.m_nAddr); + + eErrCode = base::save (aPage); + if (eErrCode != store_E_None) + return eErrCode; + } + + // Remove 'Source' entry. + e.m_aKey = rSrcKey; + return remove (e, *m_pNode[0], *m_pNode[1]); +} + +/* + * remove. + * Precond: initialized, writeable. + */ +storeError OStorePageManager::remove (const OStorePageKey &rKey) +{ + // Acquire exclusive access. + NAMESPACE_VOS(OGuard) aGuard(*this); + + // Check precond. + if (!self::isValid()) + return store_E_InvalidAccess; + + if (!base::isWriteable()) + return store_E_AccessViolation; + + // Setup BTree entry. + entry e; + e.m_aKey = rKey; + + // Find NodePage. + storeError eErrCode = find (e, *m_pNode[0]); + if (eErrCode != store_E_None) + return eErrCode; + + // Find Index. + sal_uInt16 i = m_pNode[0]->find(e), n = m_pNode[0]->usageCount(); + if (!(i < n)) + { + // Page not present. + return store_E_NotExists; + } + + // Check for exact match. + if (!(e.compare (m_pNode[0]->m_pData[i]) == entry::COMPARE_EQUAL)) + { + // Page not present. + return store_E_NotExists; + } + + // Existing entry. Check address. + e = m_pNode[0]->m_pData[i]; + if (e.m_aLink.m_nAddr == STORE_PAGE_NULL) + { + // Page not present. + return store_E_NotExists; + } + + // Check for hardlink. + if (!(e.m_nAttrib & STORE_ATTRIB_ISLINK)) + { + // Check directory page buffer. + if (!m_pDirect) + m_pDirect = new(m_nPageSize) inode(m_nPageSize); + if (!m_pDirect) + return store_E_OutOfMemory; + + // Load directory page. + OStoreDirectoryPageObject aPage (*m_pDirect); + aPage.location (e.m_aLink.m_nAddr); + + eErrCode = base::load (aPage); + if (eErrCode != store_E_None) + return eErrCode; + + // Acquire page write access. + OStorePageDescriptor aDescr (m_pDirect->m_aDescr); + eErrCode = base::acquirePage (aDescr, store_AccessReadWrite); + if (eErrCode != store_E_None) + return eErrCode; + + // Check for symbolic link. + if (!(aPage.attrib() & STORE_ATTRIB_ISLINK)) + { + // Ordinary inode. Determine 'Data' scope. + inode::ChunkScope eScope = m_pDirect->scope (aPage.dataLength()); + if (eScope == inode::SCOPE_EXTERNAL) + { + // External 'Data' scope. Check data page buffer. + if (!m_pData) + m_pData = new(m_nPageSize) data(m_nPageSize); + if (!m_pData) + return store_E_OutOfMemory; + + // Truncate all external data pages. + OStoreDataPageObject aData (*m_pData); + eErrCode = aPage.truncate ( + 0, m_pLink[0], m_pLink[1], m_pLink[2], aData, *this); + if (eErrCode != store_E_None) + return eErrCode; + } + + // Truncate internal data page. + rtl_zeroMemory (&m_pDirect->m_pData[0], m_pDirect->capacity()); + aPage.dataLength (0); + } + + // Release page write access. + eErrCode = base::releasePage (aDescr, store_AccessReadWrite); + + // Release and free directory page. + eErrCode = base::free (aPage); + } + + // Remove entry. + return remove (e, *m_pNode[0], *m_pNode[1]); +} + +/* + * iterate. + * Precond: initialized. + * ToDo: skip hardlink entries. + */ +storeError OStorePageManager::iterate ( + OStorePageKey &rKey, + OStorePageObject &rPage, + sal_uInt32 &rAttrib) +{ + // Acquire exclusive access. + NAMESPACE_VOS(OGuard) aGuard(*this); + + // Check precond. + if (!self::isValid()) + return store_E_InvalidAccess; + + // Setup BTree entry. + entry e; + e.m_aKey = rKey; + + // Find NodePage. + storeError eErrCode = find (e, *m_pNode[0]); + if (eErrCode != store_E_None) + return eErrCode; + + // Find Index. + sal_uInt16 i = m_pNode[0]->find(e), n = m_pNode[0]->usageCount(); + if (!(i < n)) + { + // Not found. + return store_E_NotExists; + } + + // Compare entry. + entry::CompareResult result = e.compare (m_pNode[0]->m_pData[i]); + VOS_POSTCOND( + result != entry::COMPARE_LESS, + "OStorePageManager::iterate(): find failed"); + + // Check result. + if (result == entry::COMPARE_LESS) + { + // Must not happen. + return store_E_Unknown; + } + + // GreaterEqual. Found next entry. + e = m_pNode[0]->m_pData[i]; + + // Setup result. + rKey = e.m_aKey; + rAttrib = e.m_nAttrib; + + rPage.location (e.m_aLink.m_nAddr); + + // Done. + return store_E_None; +} + +/* + * RebuildContext. + */ +struct RebuildContext +{ + /** Representation. + */ + NAMESPACE_VOS(ORef) m_xBIOS; + OStorePageBIOS::ScanContext m_aCtx; + + /** Construction. + */ + RebuildContext (void) + : m_xBIOS (new OStorePageBIOS()) + {} + + /** initialize (PageBIOS and ScanContext). + */ + storeError initialize (ILockBytes *pLockBytes, sal_uInt32 nMagic = 0) + { + storeError eErrCode = store_E_InvalidParameter; + if (pLockBytes) + { + m_xBIOS->initialize (pLockBytes, store_AccessReadOnly); + eErrCode = m_xBIOS->scanBegin (m_aCtx, nMagic); + } + return eErrCode; + } + + /** initialize (ScanContext). + */ + storeError initialize (sal_uInt32 nMagic = 0) + { + return m_xBIOS->scanBegin (m_aCtx, nMagic); + } + + /** load (next ScanContext matching page). + */ + storeError load (OStorePageObject &rPage) + { + if (m_aCtx.isValid()) + return m_xBIOS->scanNext (m_aCtx, rPage); + else + return store_E_CantSeek; + } + + /** getPageSize. + */ + storeError getPageSize (sal_uInt16 &rnPageSize) + { + return m_xBIOS->getPageSize (rnPageSize); + } +}; + +/* + * rebuild. + * Precond: none. + */ +storeError OStorePageManager::rebuild ( + ILockBytes *pSrcLB, ILockBytes *pDstLB) +{ + // Acquire exclusive access. + NAMESPACE_VOS(OGuard) aGuard(*this); + + // Check arguments. + storeError eErrCode = store_E_InvalidParameter; + if (!(pSrcLB && pDstLB)) + return eErrCode; + + // Initialize 'Source' rebuild context. + RebuildContext aCtx; + eErrCode = aCtx.initialize (pSrcLB, STORE_MAGIC_DIRECTORYPAGE); + if (eErrCode != store_E_None) + return eErrCode; + + // Obtain 'Source' page size. + sal_uInt16 nPageSize = 0; + eErrCode = aCtx.getPageSize (nPageSize); + if (eErrCode != store_E_None) + return eErrCode; + + // Initialize as 'Destination' with 'Source' page size. + eErrCode = self::initialize (pDstLB, store_AccessCreate, nPageSize); + if (eErrCode != store_E_None) + return eErrCode; + + // Initialize directory and data page buffers. + if (!m_pDirect) + m_pDirect = new(m_nPageSize) inode(m_nPageSize); + if (!m_pData) + m_pData = new(m_nPageSize) data(m_nPageSize); + if (!(m_pDirect && m_pData)) + return store_E_OutOfMemory; + + // Initialize 'Source' directory page. + inode *pDirect = new(m_nPageSize) inode(m_nPageSize); + if (!pDirect) + return store_E_OutOfMemory; + + // Scan 'Source' directory pages. + OStoreDirectoryPageObject aSrcPage (*pDirect); + while ((eErrCode = aCtx.load(aSrcPage)) == store_E_None) + { + // Obtain page key and data length. + OStorePageKey aKey (pDirect->m_aNameBlock.m_aKey); + sal_uInt32 nDataLen = pDirect->m_aDataBlock.m_nDataLen; + + // Determine data page scope. + inode::ChunkScope eScope = pDirect->scope (nDataLen); + if (eScope == inode::SCOPE_INTERNAL) + { + // Internal scope. Just insert directory node. + eErrCode = save (aKey, aSrcPage); + if (eErrCode != store_E_None) + break; + } + else + { + // External scope. + OStoreDirectoryPageObject aDstPage (*m_pDirect); + rtl_copyMemory (m_pDirect, pDirect, m_nPageSize); + + m_pDirect->m_aDataBlock.initialize(); + m_pDirect->m_aDataBlock.m_nDataLen = m_pDirect->capacity(); + + // Insert 'Destination' directory page. + eErrCode = save (aKey, aDstPage); + if (eErrCode != store_E_None) + break; + + // Determine data page count. + inode::ChunkDescriptor aDescr ( + nDataLen - m_pDirect->capacity(), m_pData->capacity()); + + sal_uInt32 i, n = aDescr.m_nPage; + if (aDescr.m_nOffset) n += 1; + + // Copy data pages. + OStoreDataPageObject aData (*m_pData); + for (i = 0; i < n; i++) + { + // Re-initialize data page size. + m_pData->m_aDescr.m_nSize = m_nPageSize; + + // Read 'Source' data page. + OStorePageBIOS &rBIOS = *(aCtx.m_xBIOS); + NAMESPACE_VOS(IMutex) &rMutex = rBIOS; + + eErrCode = aSrcPage.get ( + i, m_pLink[0], m_pLink[1], m_pLink[2], + aData, rBIOS, &rMutex); + if (eErrCode != store_E_None) + continue; + + // Write 'Destination' data page. + eErrCode = aDstPage.put ( + i, m_pLink[0], m_pLink[1], m_pLink[2], + aData, *this, NULL); + } + + // Update 'Destination' directory page. + m_pDirect->m_aDataBlock.m_nDataLen = nDataLen; + eErrCode = base::save (aDstPage); + } + } + + // Scan 'Source' BTree nodes. + page *pNode = new(m_nPageSize) page(m_nPageSize); + node aNode (*pNode); + entry e; + + aCtx.initialize (STORE_MAGIC_BTREENODE); + while ((eErrCode = aCtx.load(aNode)) == store_E_None) + { + // Check for leaf node. + if (pNode->depth() == 0) + { + sal_uInt16 i, n = pNode->usageCount(); + for (i = 0; i < n; i++) + { + e = pNode->m_pData[i]; + if (e.m_nAttrib & STORE_ATTRIB_ISLINK) + { + // Hard link. + aSrcPage.location (e.m_aLink.m_nAddr); + pDirect->m_aDescr.m_nSize = m_nPageSize; + + eErrCode = aCtx.m_xBIOS->load (aSrcPage); + if (eErrCode == store_E_None) + { + OStorePageKey aDstKey (pDirect->m_aNameBlock.m_aKey); + eErrCode = link (e.m_aKey, aDstKey); + } + e.m_nAttrib &= ~STORE_ATTRIB_ISLINK; + } + + if (e.m_nAttrib) + { + // Ordinary attributes. + sal_uInt32 nAttrib = 0; + eErrCode = attrib (e.m_aKey, 0, e.m_nAttrib, nAttrib); + } + } + } + } + + // Cleanup. + delete pDirect; + delete pNode; + + // Done. + return store_E_None; +} + diff --git a/store/source/storpage.hxx b/store/source/storpage.hxx new file mode 100644 index 000000000000..ef9dd172baaf --- /dev/null +++ b/store/source/storpage.hxx @@ -0,0 +1,276 @@ +/************************************************************************* + * + * $RCSfile: storpage.hxx,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:18:32 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +#ifndef _STORE_STORPAGE_HXX_ +#define _STORE_STORPAGE_HXX_ "$Revision: 1.1.1.1 $" + +#ifndef _SAL_TYPES_H_ +#include +#endif + +#ifndef _VOS_MACROS_HXX_ +#include +#endif +#ifndef _VOS_OBJECT_HXX_ +#include +#endif +#ifndef _VOS_REF_HXX_ +#include +#endif + +#ifndef _STORE_TYPES_H_ +#include +#endif +#ifndef _STORE_MACROS_HXX_ +#include +#endif +#ifndef _STORE_LOCKBYTE_HXX_ +#include +#endif + +#ifndef _STORE_STORBASE_HXX_ +#include +#endif +#ifndef _STORE_STORDMON_HXX_ +#include +#endif + +#ifdef _USE_NAMESPACE +namespace store { +#endif + +struct OStoreBTreeEntry; +struct OStoreBTreeNodeData; +class OStoreBTreeNodeObject; + +struct OStoreDataPageData; +struct OStoreIndirectionPageData; +struct OStoreDirectoryPageData; +class OStoreDirectoryPageObject; +class OStorePageCache; + +/*======================================================================== + * + * OStorePageManager interface. + * + *======================================================================*/ +class OStorePageManager : public NAMESPACE_STORE(OStorePageBIOS) +{ + VOS_DECLARE_CLASSINFO (VOS_NAMESPACE (OStorePageManager, store)); + +public: + /** Construction. + */ + OStorePageManager (void); + + /** Initialization (two-phase construction). + */ + virtual storeError initialize ( + ILockBytes *pLockBytes, + storeAccessMode eAccessMode, + sal_uInt16 nPageSize = STORE_DEFAULT_PAGESIZE); + + /** isValid. + * @return sal_True upon successful initialization, + * sal_False otherwise. + */ + inline sal_Bool isValid (void) const; + + /** Page I/O (unmanaged). + */ + virtual storeError free ( + OStorePageObject &rPage); + + virtual storeError load ( + OStorePageObject &rPage); + + virtual storeError save ( + OStorePageObject &rPage); + + virtual storeError flush (void); + + /** DirectoryPage I/O (managed). + */ + storeError load ( + const OStorePageKey &rKey, + OStoreDirectoryPageObject &rPage); + + storeError save ( + const OStorePageKey &rKey, + OStoreDirectoryPageObject &rPage); + + /** attrib [nAttrib = ((nAttrib & ~nMask1) | nMask2)]. + */ + storeError attrib ( + const OStorePageKey &rKey, + sal_uInt32 nMask1, + sal_uInt32 nMask2, + sal_uInt32 &rAttrib); + + /** link (insert Source Key as hardlink to Destination). + */ + storeError link ( + const OStorePageKey &rSrcKey, + const OStorePageKey &rDstKey); + + /** symlink (insert Source DirectoryPage as symlink to Destination). + */ + storeError symlink ( + const rtl_String *pSrcPath, + const rtl_String *pSrcName, + const OStorePageKey &rDstKey); + + /** rename. + */ + storeError rename ( + const OStorePageKey &rSrcKey, + const rtl_String *pDstPath, + const rtl_String *pDstName); + + /** remove. + */ + storeError remove ( + const OStorePageKey &rKey); + + /** iterate. + */ + storeError iterate ( + OStorePageKey &rKey, + OStorePageObject &rPage, + sal_uInt32 &rAttrib); + + /** rebuild (combines recover and compact from 'Src' to 'Dst'). + * @param pSrcLB [in] accessed readonly. + * @param pDstLB [in] truncated and accessed readwrite (as initialize()). + * @return store_E_None upon success. + */ + storeError rebuild ( + ILockBytes *pSrcLB, + ILockBytes *pDstLB); + +protected: + /** Destruction (OReference). + */ + virtual ~OStorePageManager (void); + +private: + /** Implementation. + */ + typedef OStorePageBIOS base; + typedef OStorePageManager self; + + typedef OStoreBTreeEntry entry; + typedef OStoreBTreeNodeData page; + typedef OStoreBTreeNodeObject node; + + typedef OStoreDirectoryPageData inode; + typedef OStoreIndirectionPageData indirect; + typedef OStoreDataPageData data; + + /** Representation. + */ + typedef NAMESPACE_VOS(ORef) OStorePageDaemonRef; + OStorePageDaemonRef m_xDaemon; + OStorePageCache *m_pCache; + + page *m_pNode[3]; + inode *m_pDirect; + indirect *m_pLink[3]; + data *m_pData; + sal_uInt16 m_nPageSize; + + /** find (node page, w/o split). + */ + storeError find ( + const entry& rEntry, page& rPage); + + /** find (node page, possibly with split). + */ + storeError find ( + const entry &rEntry, page &rPage, page &rPageL, page &rPageR); + + /** remove (possibly down from root). + */ + storeError remove ( + entry &rEntry, page &rPage, page &rPageL); + + /** Not implemented. + */ + OStorePageManager (const OStorePageManager&); + OStorePageManager& operator= (const OStorePageManager&); +}; + +inline sal_Bool OStorePageManager::isValid (void) const +{ + return (base::isValid() && (m_nPageSize > 0)); +} + +/*======================================================================== + * + * The End. + * + *======================================================================*/ +#ifdef _USE_NAMESPACE +} +#endif + +#endif /* !_STORE_STORPAGE_HXX_ */ + diff --git a/store/source/stortree.cxx b/store/source/stortree.cxx new file mode 100644 index 000000000000..69d343f805ef --- /dev/null +++ b/store/source/stortree.cxx @@ -0,0 +1,608 @@ +/************************************************************************* + * + * $RCSfile: stortree.cxx,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:18:32 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +#define _STORE_STORTREE_CXX "$Revision: 1.1.1.1 $" + +#ifndef _SAL_TYPES_H_ +#include +#endif + +#ifndef _RTL_MEMORY_H_ +#include +#endif + +#ifndef _VOS_DIAGNOSE_HXX_ +#include +#endif +#ifndef _VOS_MACROS_HXX_ +#include +#endif +#ifndef _VOS_MUTEX_HXX_ +#include +#endif + +#ifndef _STORE_TYPES_H_ +#include +#endif +#ifndef _STORE_MACROS_HXX_ +#include +#endif + +#ifndef _STORE_STORBASE_HXX +#include +#endif +#ifndef _STORE_STORTREE_HXX +#include +#endif + +#ifdef _USE_NAMESPACE +using namespace store; +#endif + +/*======================================================================== + * + * OStoreBTreeNodeData implementation. + * + *======================================================================*/ +/* + * OStoreBTreeNodeData. + */ +OStoreBTreeNodeData::OStoreBTreeNodeData (sal_uInt16 nPageSize) + : OStorePageData (nPageSize) +{ + initialize(); +} + +/* + * initialize. + */ +void OStoreBTreeNodeData::initialize (void) +{ + base::m_aGuard.m_nMagic = STORE_MAGIC_BTREENODE; + base::m_aDescr.m_nUsed = base::size() + self::size(); + self::m_aGuard.m_nMagic = 0; + + sal_uInt16 i, n = capacityCount(); + T t; + + for (i = 1; i < n; i++) + m_pData[i] = t; +} + +/* + * swap. + */ +void OStoreBTreeNodeData::swap (const D& rDescr) +{ +#ifdef OSL_BIGENDIAN + m_aGuard.swap(); + + sal_uInt16 i, n = capacity(rDescr) / sizeof(T); + for (i = 0; i < n; i++) + m_pData[i].swap(); +#endif /* OSL_BIGENDIAN */ +} + +/* + * find. + */ +sal_uInt16 OStoreBTreeNodeData::find (const T& t) const +{ + register sal_Int32 l = 0; + register sal_Int32 r = usageCount() - 1; + + while (l < r) + { + register sal_Int32 m = ((l + r) >> 1); + + if (t.m_aKey == m_pData[m].m_aKey) + return ((sal_uInt16)(m)); + if (t.m_aKey < m_pData[m].m_aKey) + r = m - 1; + else + l = m + 1; + } + + sal_uInt16 k = ((sal_uInt16)(r)); + if ((k < capacityCount()) && (t.m_aKey < m_pData[k].m_aKey)) + return(k - 1); + else + return(k); +} + +/* + * insert. + */ +void OStoreBTreeNodeData::insert (sal_uInt16 i, const T& t) +{ + sal_uInt16 n = usageCount(); + sal_uInt16 m = capacityCount(); + if ((n < m) && (i < m)) + { + // shift right. + rtl_moveMemory (&m_pData[i + 1], &m_pData[i], (n - i) * sizeof(T)); + + // insert. + m_pData[i] = t; + base::m_aDescr.m_nUsed += sizeof(T); + } +} + +/* + * remove. + */ +void OStoreBTreeNodeData::remove (sal_uInt16 i) +{ + sal_uInt16 n = usageCount(); + sal_uInt16 m = capacityCount(); + if (i < n) + { + // shift left. + rtl_moveMemory ( + &m_pData[i], &m_pData[i + 1], (n - i - 1) * sizeof(T)); + + // truncate. + m_pData[n - 1] = T(); + base::m_aDescr.m_nUsed -= sizeof(T); + } +} + +/* + * merge. + */ +void OStoreBTreeNodeData::merge (const self& rPageR) +{ + if (queryMerge (rPageR)) + { + sal_uInt16 n = usageCount(); + sal_uInt16 m = rPageR.usageCount(); + rtl_copyMemory (&m_pData[n], &rPageR.m_pData[0], m * sizeof(T)); + usageCount (n + m); + } +} + +/* + * split. + */ +void OStoreBTreeNodeData::split (const self& rPageL) +{ + sal_uInt16 h = capacityCount() / 2; + rtl_copyMemory (&m_pData[0], &rPageL.m_pData[h], h * sizeof(T)); + truncate (h); +} + +/* + * truncate. + */ +void OStoreBTreeNodeData::truncate (sal_uInt16 n) +{ + sal_uInt16 m = capacityCount(); + T t; + + for (sal_uInt16 i = n; i < m; i++) + m_pData[i] = t; + usageCount (n); +} + +/*======================================================================== + * + * OStoreBTreeNodeObject implementation. + * + *======================================================================*/ +/* + * swap. + */ +void OStoreBTreeNodeObject::swap (const D& rDescr) +{ +#ifdef OSL_BIGENDIAN + base::swap (rDescr); + m_rPage.swap (rDescr); +#endif /* OSL_BIGENDIAN */ +} + +/* + * guard. + */ +void OStoreBTreeNodeObject::guard (const D& rDescr) +{ + base::guard (rDescr); + m_rPage.guard (rDescr); +} + +/* + * verify. + */ +storeError OStoreBTreeNodeObject::verify (const D& rDescr) +{ + storeError eErrCode = base::verify (rDescr); + if (eErrCode != store_E_None) + return eErrCode; + else + return m_rPage.verify (rDescr); +} + +/* + * split. + */ +storeError OStoreBTreeNodeObject::split ( + sal_uInt16 nIndexL, + OStoreBTreeNodeData &rPageL, + OStoreBTreeNodeData &rPageR, + OStorePageBIOS &rBIOS, + NAMESPACE_VOS(IMutex) *pMutex) +{ + // Check usage. + if (!rPageL.querySplit()) + return store_E_None; + + // Enter. + STORE_METHOD_ENTER(pMutex); + + // Save PageDescriptor. + D aDescr (m_rPage.m_aDescr); + + // Acquire Lock. + storeError eErrCode = rBIOS.acquireLock (aDescr.m_nAddr, aDescr.m_nSize); + if (eErrCode != store_E_None) + STORE_METHOD_LEAVE(pMutex, eErrCode); + + // Begin PageL Lock (NYI). + + // Split right page off left page. + rPageR.split (rPageL); + rPageR.depth (rPageL.depth()); + + // Allocate right page. + self aNodeR (rPageR); + eErrCode = rBIOS.allocate (aNodeR); + if (eErrCode != store_E_None) + { + rBIOS.releaseLock (aDescr.m_nAddr, aDescr.m_nSize); + STORE_METHOD_LEAVE(pMutex, eErrCode); + } + + // Truncate left page. + rPageL.truncate (rPageL.capacityCount() / 2); + + // Save left page. + self aNodeL (rPageL); + eErrCode = rBIOS.save (aNodeL); + if (eErrCode != store_E_None) + { + // Must not happen. + VOS_TRACE("OStoreBTreeNodeObject::split(): save() failed"); + + // Release Lock and Leave. + rBIOS.releaseLock (aDescr.m_nAddr, aDescr.m_nSize); + STORE_METHOD_LEAVE(pMutex, eErrCode); + } + + // End PageL Lock (NYI). + + // Insert right page. + T entry; + entry.m_aKey = rPageR.m_pData[0].m_aKey; + entry.m_aLink.m_nAddr = rPageR.location(); + + m_rPage.insert (nIndexL + 1, entry); + + // Save this page. + eErrCode = rBIOS.save (*this); + if (eErrCode != store_E_None) + { + // Must not happen. + VOS_TRACE("OStoreBTreeNodeObject::split(): save() failed"); + + // Release Lock and Leave. + rBIOS.releaseLock (aDescr.m_nAddr, aDescr.m_nSize); + STORE_METHOD_LEAVE(pMutex, eErrCode); + } + +#if 0 /* PERFORMANCE */ + eErrCode = rBIOS.flush(); +#endif /* PERFORMANCE */ + + // Release Lock and Leave. + eErrCode = rBIOS.releaseLock (aDescr.m_nAddr, aDescr.m_nSize); + STORE_METHOD_LEAVE(pMutex, eErrCode); +} + +/* + * remove (down to leaf node, recursive). + */ +storeError OStoreBTreeNodeObject::remove ( + sal_uInt16 nIndexL, + OStoreBTreeEntry &rEntryL, + OStoreBTreeNodeData &rPageL, +#if 0 /* NYI */ + OStoreBTreeNodeData &rPageR, +#endif /* NYI */ + OStorePageBIOS &rBIOS, + NAMESPACE_VOS(IMutex) *pMutex) +{ + // Enter. + STORE_METHOD_ENTER(pMutex); + + // Save PageDescriptor. + D aDescr (m_rPage.m_aDescr); + + // Acquire Lock. + storeError eErrCode = rBIOS.acquireLock (aDescr.m_nAddr, aDescr.m_nSize); + if (eErrCode != store_E_None) + STORE_METHOD_LEAVE(pMutex, eErrCode); + + // Check depth. + if (m_rPage.depth()) + { + // Check link entry. + if (!(rEntryL.compare (m_rPage.m_pData[nIndexL]) == T::COMPARE_EQUAL)) + { + rBIOS.releaseLock (aDescr.m_nAddr, aDescr.m_nSize); + STORE_METHOD_LEAVE(pMutex, store_E_InvalidAccess); + } + + // Load link node. + self aNodeL (rPageL); + aNodeL.location (m_rPage.m_pData[nIndexL].m_aLink.m_nAddr); + + eErrCode = rBIOS.load (aNodeL); + if (eErrCode != store_E_None) + { + rBIOS.releaseLock (aDescr.m_nAddr, aDescr.m_nSize); + STORE_METHOD_LEAVE(pMutex, eErrCode); + } + + // Remove from link node (using current page as link buffer). + eErrCode = aNodeL.remove (0, rEntryL, m_rPage, rBIOS, NULL); + if (eErrCode != store_E_None) + { + rBIOS.releaseLock (aDescr.m_nAddr, aDescr.m_nSize); + STORE_METHOD_LEAVE(pMutex, eErrCode); + } + + // Reload current page. + m_rPage.location (aDescr.m_nAddr); + eErrCode = rBIOS.load (*this); + if (eErrCode != store_E_None) + { + // Must not happen. + VOS_TRACE("OStoreBTreeNodeObject::remove(): load() failed"); + + // Release Lock and Leave. + rBIOS.releaseLock (aDescr.m_nAddr, aDescr.m_nSize); + STORE_METHOD_LEAVE(pMutex, eErrCode); + } + + // Check link node usage. + if (rPageL.usageCount() == 0) + { + // Free empty link node. + eErrCode = rBIOS.free (aNodeL); + if (eErrCode != store_E_None) + { + rBIOS.releaseLock (aDescr.m_nAddr, aDescr.m_nSize); + STORE_METHOD_LEAVE(pMutex, eErrCode); + } + + // Remove index. + m_rPage.remove (nIndexL); + touch(); + } + else + { +#if 0 /* NYI */ + // Check for right sibling. + sal_uInt16 nIndexR = nIndexL + 1; + if (nIndexR < m_rPage.usageCount()) + { + // Load right link node. + self aNodeR (rPageR); + aNodeR.location (m_rPage.m_pData[nIndexR].m_aLink.m_nAddr); + + eErrCode = rBIOS.load (aNodeR); + if (eErrCode == store_E_None) + { + if (rPageL.queryMerge (rPageR)) + { + rPageL.merge (rPageR); + + eErrCode = rBIOS.free (rPageR); + } + } + } +#endif /* NYI */ + + // Relink. + m_rPage.m_pData[nIndexL].m_aKey = rPageL.m_pData[0].m_aKey; + touch(); + } + } + else + { + // Check leaf entry. + if (!(rEntryL.compare (m_rPage.m_pData[nIndexL]) == T::COMPARE_EQUAL)) + { + rBIOS.releaseLock (aDescr.m_nAddr, aDescr.m_nSize); + STORE_METHOD_LEAVE(pMutex, store_E_NotExists); + } + + // Save leaf entry. + rEntryL = m_rPage.m_pData[nIndexL]; + + // Remove leaf index. + m_rPage.remove (nIndexL); + touch(); + } + + // Check for modified node. + if (dirty()) + { + // Save this page. + eErrCode = rBIOS.save (*this); + if (eErrCode != store_E_None) + { + // Must not happen. + VOS_TRACE("OStoreBTreeNodeObject::remove(): save() failed"); + + // Release Lock and Leave. + rBIOS.releaseLock (aDescr.m_nAddr, aDescr.m_nSize); + STORE_METHOD_LEAVE(pMutex, eErrCode); + } + } + + // Release Lock and Leave. + eErrCode = rBIOS.releaseLock (aDescr.m_nAddr, aDescr.m_nSize); + STORE_METHOD_LEAVE(pMutex, eErrCode); +} + +/*======================================================================== + * + * OStoreBTreeRootObject implementation. + * + *======================================================================*/ +/* + * change. + */ +storeError OStoreBTreeRootObject::change ( + OStoreBTreeNodeData &rPageL, + OStorePageBIOS &rBIOS, + NAMESPACE_VOS(IMutex) *pMutex) +{ + // Enter. + STORE_METHOD_ENTER(pMutex); + + // Save PageDescriptor. + typedef OStorePageDescriptor D; + D aDescr (m_rPage.m_aDescr); + + // Acquire Lock. + storeError eErrCode = rBIOS.acquireLock (aDescr.m_nAddr, aDescr.m_nSize); + if (eErrCode != store_E_None) + STORE_METHOD_LEAVE(pMutex, eErrCode); + + // Change root. + rPageL = m_rPage; + + base aNodeL (rPageL); + eErrCode = rBIOS.allocate (aNodeL); + if (eErrCode != store_E_None) + { + // Release Lock and Leave. + rBIOS.releaseLock (aDescr.m_nAddr, aDescr.m_nSize); + STORE_METHOD_LEAVE(pMutex, eErrCode); + } + + m_rPage.m_pData[0].m_aKey = rPageL.m_pData[0].m_aKey; + m_rPage.m_pData[0].m_aLink.m_nAddr = rPageL.location(); + + m_rPage.truncate (1); + m_rPage.depth (m_rPage.depth() + 1); + + // Save root. + eErrCode = rBIOS.save (*this); + if (eErrCode != store_E_None) + { + // Must not happen. + VOS_TRACE("OStoreBTreeRootObject::change(): save() failed"); + + // Release Lock and Leave. + rBIOS.releaseLock (aDescr.m_nAddr, aDescr.m_nSize); + STORE_METHOD_LEAVE(pMutex, eErrCode); + } + +#if 1 /* ROBUSTNESS */ + eErrCode = rBIOS.flush(); +#endif /* ROBUSTNESS */ + + // Done. Release Lock and Leave. + eErrCode = rBIOS.releaseLock (aDescr.m_nAddr, aDescr.m_nSize); + STORE_METHOD_LEAVE(pMutex, eErrCode); +} + +/* + * split. + */ +storeError OStoreBTreeRootObject::split ( + sal_uInt16 nIndexL, + OStoreBTreeNodeData &rPageL, + OStoreBTreeNodeData &rPageR, + OStorePageBIOS &rBIOS, + NAMESPACE_VOS(IMutex) *pMutex) +{ + // Check usage. + if (!querySplit()) + return store_E_None; + + // Enter. + STORE_METHOD_ENTER(pMutex); + + // Change root. + storeError eErrCode = change (rPageL, rBIOS, NULL); + if (eErrCode != store_E_None) + STORE_METHOD_LEAVE(pMutex, eErrCode); + + // Split Left Page. + eErrCode = base::split (0, rPageL, rPageR, rBIOS, NULL); + + // Leave. + STORE_METHOD_LEAVE(pMutex, eErrCode); +} + diff --git a/store/source/stortree.hxx b/store/source/stortree.hxx new file mode 100644 index 000000000000..d07f3837c1cb --- /dev/null +++ b/store/source/stortree.hxx @@ -0,0 +1,451 @@ +/************************************************************************* + * + * $RCSfile: stortree.hxx,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:18:32 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +#ifndef _STORE_STORTREE_HXX +#define _STORE_STORTREE_HXX "$Revision: 1.1.1.1 $" + +#ifndef _SAL_TYPES_H_ +#include +#endif + +#ifndef _RTL_MEMORY_H_ +#include +#endif + +#ifndef _VOS_MACROS_HXX_ +#include +#endif +#ifndef _VOS_MUTEX_HXX_ +#include +#endif + +#ifndef _STORE_TYPES_H_ +#include +#endif +#ifndef _STORE_MACROS_HXX_ +#include +#endif + +#ifndef _STORE_STORBASE_HXX +#include +#endif + +#ifdef _USE_NAMESPACE +namespace store { +#endif + +/*======================================================================== + * + * OStoreBTreeEntry. + * + *======================================================================*/ +struct OStoreBTreeEntry +{ + typedef OStorePageKey K; + typedef OStorePageLink L; + + /** Representation. + */ + K m_aKey; + L m_aLink; + sal_uInt32 m_nAttrib; + + /** Construction. + */ + OStoreBTreeEntry (void) + : m_nAttrib (0) + {} + + OStoreBTreeEntry (const OStoreBTreeEntry& rOther) + : m_aKey (rOther.m_aKey), + m_aLink (rOther.m_aLink), + m_nAttrib (rOther.m_nAttrib) + {} + + OStoreBTreeEntry& operator= (const OStoreBTreeEntry& rOther) + { + m_aKey = rOther.m_aKey; + m_aLink = rOther.m_aLink; + m_nAttrib = rOther.m_nAttrib; + return *this; + } + + /** Comparison. + */ + enum CompareResult + { + COMPARE_LESS = -1, + COMPARE_EQUAL = 0, + COMPARE_GREATER = 1 + }; + + CompareResult compare (const OStoreBTreeEntry& rOther) const + { + if (m_aKey < rOther.m_aKey) + return COMPARE_LESS; + else if (m_aKey == rOther.m_aKey) + return COMPARE_EQUAL; + else + return COMPARE_GREATER; + } + + /** swap (internal and external representation). + */ + void swap (void) + { +#ifdef OSL_BIGENDIAN + m_aKey.swap(); + m_aLink.swap(); + m_nAttrib = VOS_SWAPDWORD(m_nAttrib); +#endif /* OSL_BIGENDIAN */ + } +}; + +/*======================================================================== + * + * OStoreBTreeNodeData. + * + *======================================================================*/ +#define STORE_MAGIC_BTREENODE 0x58190322UL + +struct OStoreBTreeNodeData : public NAMESPACE_STORE(OStorePageData) +{ + typedef OStorePageData base; + typedef OStoreBTreeNodeData self; + + typedef OStorePageGuard G; + typedef OStoreBTreeEntry T; + + /** Representation. + */ + G m_aGuard; + T m_pData[1]; + + /** size. + */ + static sal_uInt16 size (void) + { + return (sizeof(G)); + } + + /** capacity. + */ + static sal_uInt16 capacity (const D& rDescr) + { + return (rDescr.m_nSize - (base::size() + self::size())); + } + sal_uInt16 capacity (void) const + { + return self::capacity (base::m_aDescr); + } + + /** capacityCount (must be even). + */ + sal_uInt16 capacityCount (void) const + { + return (capacity() / sizeof(T)); + } + + /** usage. + */ + static sal_uInt16 usage (const D& rDescr) + { + return (rDescr.m_nUsed - (base::size() + self::size())); + } + sal_uInt16 usage (void) const + { + return self::usage (base::m_aDescr); + } + + /** usageCount. + */ + sal_uInt16 usageCount (void) const + { + return (usage() / sizeof(T)); + } + void usageCount (sal_uInt16 nCount) + { + base::m_aDescr.m_nUsed = base::size() + self::size(); + base::m_aDescr.m_nUsed += nCount * sizeof(T); + } + + /** Construction. + */ + OStoreBTreeNodeData (sal_uInt16 nPageSize); + void initialize (void); + + self& operator= (const self& rOther) + { + if (this != &rOther) + { + base::operator= (rOther); + + m_aGuard = rOther.m_aGuard; + rtl_copyMemory (m_pData, rOther.m_pData, capacity()); + } + return *this; + } + + /** Comparison. + */ + sal_Bool operator== (const self& rOther) const + { + return (base::operator==(rOther) && (m_aGuard == rOther.m_aGuard)); + } + + /** swap (external and internal representation). + */ + void swap (const D& rDescr); + + /** guard (external representation). + */ + void guard (const D& rDescr) + { + sal_uInt32 nCRC32 = 0; + nCRC32 = G::crc32 (nCRC32, &m_aGuard.m_nMagic, sizeof(sal_uInt32)); + nCRC32 = G::crc32 (nCRC32, m_pData, capacity(rDescr)); +#ifdef OSL_BIGENDIAN + nCRC32 = VOS_SWAPDWORD(nCRC32); +#endif /* OSL_BIGENDIAN */ + m_aGuard.m_nCRC32 = nCRC32; + } + + /** verify (external representation). + */ + storeError verify (const D& rDescr) + { + sal_uInt32 nCRC32 = 0; + nCRC32 = G::crc32 (nCRC32, &m_aGuard.m_nMagic, sizeof(sal_uInt32)); + nCRC32 = G::crc32 (nCRC32, m_pData, capacity(rDescr)); +#ifdef OSL_BIGENDIAN + nCRC32 = VOS_SWAPDWORD(nCRC32); +#endif /* OSL_BIGENDIAN */ + if (m_aGuard.m_nCRC32 != nCRC32) + return store_E_InvalidChecksum; + else + return store_E_None; + } + + /** depth. + */ + sal_uInt32 depth (void) const + { + return self::m_aGuard.m_nMagic; + } + void depth (sal_uInt32 nDepth) + { + self::m_aGuard.m_nMagic = nDepth; + } + + /** queryMerge. + */ + sal_Bool queryMerge (const self &rPageR) const + { + return ((usageCount() + rPageR.usageCount()) <= capacityCount()); + } + + /** querySplit. + */ + sal_Bool querySplit (void) const + { + return (!(usageCount() < capacityCount())); + } + + /** Operation. + */ + sal_uInt16 find (const T& t) const; + void insert (sal_uInt16 i, const T& t); + void remove (sal_uInt16 i); + + /** merge (with right page). + */ + void merge (const self& rPageR); + + /** split (left half copied from right half of left page). + */ + void split (const self& rPageL); + + /** truncate (to n elements). + */ + void truncate (sal_uInt16 n); +}; + +/*======================================================================== + * + * OStoreBTreeNodeObject. + * + *======================================================================*/ +class OStoreBTreeNodeObject : + public NAMESPACE_STORE(OStorePageObject) +{ + typedef OStorePageObject base; + typedef OStoreBTreeNodeObject self; + typedef OStoreBTreeNodeData page; + + typedef OStorePageDescriptor D; + typedef OStoreBTreeEntry T; + +public: + /** Construction. + */ + inline OStoreBTreeNodeObject (page& rPage); + + /** External representation. + */ + virtual void swap (const D& rDescr); + virtual void guard (const D& rDescr); + virtual storeError verify (const D& rDescr); + + /** Query split. + */ + inline sal_Bool querySplit (void) const; + + /** split. + */ + virtual storeError split ( + sal_uInt16 nIndexL, + OStoreBTreeNodeData &rPageL, + OStoreBTreeNodeData &rPageR, + OStorePageBIOS &rBIOS, + NAMESPACE_VOS(IMutex) *pMutex = NULL); + + /** remove (down to leaf node, recursive). + */ + storeError remove ( + sal_uInt16 nIndexL, + OStoreBTreeEntry &rEntryL, + OStoreBTreeNodeData &rPageL, +#if 0 /* NYI */ + OStoreBTreeNodeData &rPageR, +#endif /* NYI */ + OStorePageBIOS &rBIOS, + NAMESPACE_VOS(IMutex) *pMutex = NULL); + +private: + /** Representation. + */ + page& m_rPage; +}; + +inline OStoreBTreeNodeObject::OStoreBTreeNodeObject (page& rPage) + : OStorePageObject (rPage), m_rPage (rPage) +{ +} + +inline sal_Bool OStoreBTreeNodeObject::querySplit (void) const +{ + return m_rPage.querySplit(); +} + +/*======================================================================== + * + * OStoreBTreeRootObject. + * + *======================================================================*/ +class OStoreBTreeRootObject : + public NAMESPACE_STORE(OStoreBTreeNodeObject) +{ + typedef OStoreBTreeNodeObject base; + typedef OStoreBTreeNodeData page; + +public: + /** Construction. + */ + inline OStoreBTreeRootObject (page& rPage); + + /** split. + */ + virtual storeError split ( + sal_uInt16 nIndexL, + OStoreBTreeNodeData &rPageL, + OStoreBTreeNodeData &rPageR, + OStorePageBIOS &rBIOS, + NAMESPACE_VOS(IMutex) *pMutex = NULL); + +private: + /** Representation. + */ + page& m_rPage; + + /** change (Root). + */ + storeError change ( + OStoreBTreeNodeData &rPageL, + OStorePageBIOS &rBIOS, + NAMESPACE_VOS(IMutex) *pMutex = NULL); +}; + +inline OStoreBTreeRootObject::OStoreBTreeRootObject (page& rPage) + : OStoreBTreeNodeObject (rPage), m_rPage (rPage) +{ +} + +/*======================================================================== + * + * The End. + * + *======================================================================*/ +#ifdef _USE_NAMESPACE +} +#endif + +#endif /* !_STORE_STORTREE_HXX */ + diff --git a/store/util/makefile.mk b/store/util/makefile.mk new file mode 100644 index 000000000000..9e27d95a6958 --- /dev/null +++ b/store/util/makefile.mk @@ -0,0 +1,113 @@ +#************************************************************************* +# +# $RCSfile: makefile.mk,v $ +# +# $Revision: 1.1.1.1 $ +# +# last change: $Author: hr $ $Date: 2000-09-18 15:18:32 $ +# +# The Contents of this file are made available subject to the terms of +# either of the following licenses +# +# - GNU Lesser General Public License Version 2.1 +# - Sun Industry Standards Source License Version 1.1 +# +# Sun Microsystems Inc., October, 2000 +# +# GNU Lesser General Public License Version 2.1 +# ============================================= +# Copyright 2000 by Sun Microsystems, Inc. +# 901 San Antonio Road, Palo Alto, CA 94303, USA +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License version 2.1, as published by the Free Software Foundation. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, +# MA 02111-1307 USA +# +# +# Sun Industry Standards Source License Version 1.1 +# ================================================= +# The contents of this file are subject to the Sun Industry Standards +# Source License Version 1.1 (the "License"); You may not use this file +# except in compliance with the License. You may obtain a copy of the +# License at http://www.openoffice.org/license.html. +# +# Software provided under this License is provided on an "AS IS" basis, +# WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, +# WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, +# MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. +# See the License for the specific provisions governing your rights and +# obligations concerning the Software. +# +# The Initial Developer of the Original Code is: Sun Microsystems, Inc. +# +# Copyright: 2000 by Sun Microsystems, Inc. +# +# All Rights Reserved. +# +# Contributor(s): _______________________________________ +# +# +# +#************************************************************************* + +PRJ=.. + +PRJNAME=store +TARGET=sto +TARGETTYPE=CUI + +USE_LDUMP2=TRUE +USE_DEFFILE=TRUE + +# --- Settings --- + +.INCLUDE : svpre.mk +.INCLUDE : settings.mk +.INCLUDE : sv.mk + +.INCLUDE : ..$/version.mk + +# --- Debug-Library --- + +.IF "$(debug)" != "" + +LIB1TARGET= $(LB)$/$(TARGET)dbg.lib +LIB1ARCHIV= $(LB)$/lib$(TARGET)dbg.a +LIB1FILES= $(LB)$/store.lib + +.ENDIF # debug + +# --- Shared-Library --- + +SHL1TARGET= $(STORE_TARGET)$(STORE_MAJOR) +SHL1IMPLIB= istore +SHL1VERSIONMAP= $(TARGET).map + +SHL1STDLIBS= $(VOSLIB) $(SALLIB) + +SHL1DEF= $(MISC)$/$(SHL1TARGET).def +SHL1DEPN= $(L)$/ivos.lib $(L)$/isal.lib +SHL1LIBS= $(SLB)$/store.lib + +# --- Def-File --- + +DEF1NAME= $(SHL1TARGET) +DEF1EXPORTFILE= $(TARGET).dxp +DEF1DES=Store + +# --- Targets --- + +.INCLUDE : target.mk + + + diff --git a/store/util/sto.dxp b/store/util/sto.dxp new file mode 100644 index 000000000000..b973c5e342fe --- /dev/null +++ b/store/util/sto.dxp @@ -0,0 +1,25 @@ +store_acquireHandle +store_attrib +store_closeDirectory +store_closeFile +store_closeStream +store_createMemoryFile +store_findFirst +store_findNext +store_flushFile +store_flushStream +store_getFileRefererCount +store_getFileSize +store_getStreamSize +store_link +store_openDirectory +store_openFile +store_openStream +store_readStream +store_rebuildFile +store_releaseHandle +store_remove +store_rename +store_setStreamSize +store_symlink +store_writeStream diff --git a/store/util/sto.map b/store/util/sto.map new file mode 100644 index 000000000000..1f3bca011818 --- /dev/null +++ b/store/util/sto.map @@ -0,0 +1,30 @@ +STO_1_0 { + global: + store_acquireHandle; + store_attrib; + store_closeDirectory; + store_closeFile; + store_closeStream; + store_createMemoryFile; + store_findFirst; + store_findNext; + store_flushFile; + store_flushStream; + store_getFileRefererCount; + store_getFileSize; + store_getStreamSize; + store_link; + store_openDirectory; + store_openFile; + store_openStream; + store_readStream; + store_rebuildFile; + store_releaseHandle; + store_remove; + store_rename; + store_setStreamSize; + store_symlink; + store_writeStream; + local: + *; +}; diff --git a/store/version.mk b/store/version.mk new file mode 100644 index 000000000000..c31b3dfaf2e9 --- /dev/null +++ b/store/version.mk @@ -0,0 +1,75 @@ +#************************************************************************* +# +# $RCSfile: version.mk,v $ +# +# $Revision: 1.1.1.1 $ +# +# last change: $Author: hr $ $Date: 2000-09-18 15:18:31 $ +# +# The Contents of this file are made available subject to the terms of +# either of the following licenses +# +# - GNU Lesser General Public License Version 2.1 +# - Sun Industry Standards Source License Version 1.1 +# +# Sun Microsystems Inc., October, 2000 +# +# GNU Lesser General Public License Version 2.1 +# ============================================= +# Copyright 2000 by Sun Microsystems, Inc. +# 901 San Antonio Road, Palo Alto, CA 94303, USA +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License version 2.1, as published by the Free Software Foundation. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, +# MA 02111-1307 USA +# +# +# Sun Industry Standards Source License Version 1.1 +# ================================================= +# The contents of this file are subject to the Sun Industry Standards +# Source License Version 1.1 (the "License"); You may not use this file +# except in compliance with the License. You may obtain a copy of the +# License at http://www.openoffice.org/license.html. +# +# Software provided under this License is provided on an "AS IS" basis, +# WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, +# WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, +# MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. +# See the License for the specific provisions governing your rights and +# obligations concerning the Software. +# +# The Initial Developer of the Original Code is: Sun Microsystems, Inc. +# +# Copyright: 2000 by Sun Microsystems, Inc. +# +# All Rights Reserved. +# +# Contributor(s): _______________________________________ +# +# +# +#************************************************************************* + +# target +STORE_TARGET=store + +# the major +STORE_MAJOR=2 +# the minor +STORE_MINOR=0 +# the micro +STORE_MICRO=0 + +# this is a c++ compatible library +STORE_CPP=0 + diff --git a/store/workben/makefile.mk b/store/workben/makefile.mk new file mode 100644 index 000000000000..1d2965f9b4d2 --- /dev/null +++ b/store/workben/makefile.mk @@ -0,0 +1,135 @@ +#************************************************************************* +# +# $RCSfile: makefile.mk,v $ +# +# $Revision: 1.1.1.1 $ +# +# last change: $Author: hr $ $Date: 2000-09-18 15:18:32 $ +# +# The Contents of this file are made available subject to the terms of +# either of the following licenses +# +# - GNU Lesser General Public License Version 2.1 +# - Sun Industry Standards Source License Version 1.1 +# +# Sun Microsystems Inc., October, 2000 +# +# GNU Lesser General Public License Version 2.1 +# ============================================= +# Copyright 2000 by Sun Microsystems, Inc. +# 901 San Antonio Road, Palo Alto, CA 94303, USA +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License version 2.1, as published by the Free Software Foundation. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, +# MA 02111-1307 USA +# +# +# Sun Industry Standards Source License Version 1.1 +# ================================================= +# The contents of this file are subject to the Sun Industry Standards +# Source License Version 1.1 (the "License"); You may not use this file +# except in compliance with the License. You may obtain a copy of the +# License at http://www.openoffice.org/license.html. +# +# Software provided under this License is provided on an "AS IS" basis, +# WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, +# WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, +# MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. +# See the License for the specific provisions governing your rights and +# obligations concerning the Software. +# +# The Initial Developer of the Original Code is: Sun Microsystems, Inc. +# +# Copyright: 2000 by Sun Microsystems, Inc. +# +# All Rights Reserved. +# +# Contributor(s): _______________________________________ +# +# +# +#************************************************************************* + +PRJ=.. + +PRJNAME=store +TARGET=workben + +LIBTARGET=NO +TARGETTYPE=CUI + +# --- Settings --- + +.INCLUDE : svpre.mk +.INCLUDE : settings.mk +.INCLUDE : sv.mk + +.IF "$(STORELIB)" == "" +.IF "$(GUI)" == "UNX" +STOLIB= -lsto$(UPD)$(DLLPOSTFIX) +.ELSE # unx +STOLIB= $(LB)$/istore.lib +.ENDIF # unx +.ENDIF # storelib + +.IF "$(GUI)" == "UNX" +STODBGLIB= $(LB)$/libstodbg.a +.ELSE # unx +STODBGLIB= $(LB)$/stodbg.lib +.ENDIF # unx + +CFLAGS+= -I..$/source + +# --- Files --- + +CXXFILES= \ + t_file.cxx \ + t_base.cxx \ + t_store.cxx + +OBJFILES= \ + $(OBJ)$/t_file.obj \ + $(OBJ)$/t_base.obj \ + $(OBJ)$/t_store.obj + +APP1TARGET= t_file +APP1OBJS= $(OBJ)$/t_file.obj +APP1STDLIBS= $(STODBGLIB) +APP1STDLIBS+= $(VOSLIB) $(SALLIB) +APP1DEPN= \ + $(STODBGLIB) \ + $(L)$/ivos.lib \ + $(L)$/isal.lib + +APP2TARGET= t_base +APP2OBJS= $(OBJ)$/t_base.obj +APP2STDLIBS= $(STODBGLIB) +APP2STDLIBS+= $(VOSLIB) $(SALLIB) +APP2DEPN= \ + $(STODBGLIB) \ + $(L)$/ivos.lib \ + $(L)$/isal.lib + +APP3TARGET= t_store +APP3OBJS= $(OBJ)$/t_store.obj +APP3STDLIBS= $(STORELIB) +APP3STDLIBS+= $(VOSLIB) $(SALLIB) +APP3DEPN= \ + $(SLB)$/store.lib \ + $(L)$/ivos.lib \ + $(L)$/isal.lib + +# --- Targets --- + +.INCLUDE : target.mk + diff --git a/store/workben/t_base.cxx b/store/workben/t_base.cxx new file mode 100644 index 000000000000..bf733cefcc87 --- /dev/null +++ b/store/workben/t_base.cxx @@ -0,0 +1,376 @@ +/************************************************************************* + * + * $RCSfile: t_base.cxx,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:18:32 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +#define _T_BASE_CXX "$Revision: 1.1.1.1 $" + +#ifndef _SAL_TYPES_H_ +#include +#endif + +#ifndef _RTL_MEMORY_H_ +#include +#endif +#ifndef _RTL_USTRING_HXX_ +#include +#endif + +#ifndef _VOS_MACROS_HXX_ +#include +#endif +#ifndef _VOS_REF_HXX_ +#include +#endif + +#ifndef _STORE_FILELCKB_HXX_ +#include +#endif + +#ifndef _STORE_STORBASE_HXX_ +#include "storbase.hxx" +#endif + +#ifdef _USE_NAMESPACE +using namespace store; +#endif + +#define TEST_PAGESIZE 1024 + +/*======================================================================== + * + * OTestBIOS. + * + *======================================================================*/ +class OTestBIOS : public NAMESPACE_STORE(OStorePageBIOS) +{ + typedef NAMESPACE_STORE(OStorePageBIOS) base; + +public: + OTestBIOS (void); + + virtual storeError initialize ( + ILockBytes *pLockBytes, + storeAccessMode eAccessMode); + +protected: + virtual ~OTestBIOS (void); +}; + +OTestBIOS::OTestBIOS (void) +{ +} + +OTestBIOS::~OTestBIOS (void) +{ +} + +storeError OTestBIOS::initialize ( + ILockBytes *pLockBytes, storeAccessMode eAccessMode) +{ + storeError eErrCode = base::initialize (pLockBytes, eAccessMode); + if (eErrCode != store_E_None) + { + if (eAccessMode == store_AccessReadWrite) + return eErrCode; + if (eAccessMode == store_AccessReadOnly) + return eErrCode; + if (eErrCode != store_E_NotExists) + return eErrCode; + + eErrCode = base::create (TEST_PAGESIZE); + } + return eErrCode; +} + +/*======================================================================== + * + * unicode. + * + *======================================================================*/ +static void __store_string_newFromUnicode_WithLength ( + rtl_String **newString, const sal_Unicode *value, sal_Int32 length) +{ + rtl_uString2String ( + newString, + value, length, + RTL_TEXTENCODING_UTF8, + OUSTRING_TO_OSTRING_CVTFLAGS); +} + +static void __store_string_newFromUnicode ( + rtl_String **newString, const rtl_uString *value) +{ + __store_string_newFromUnicode_WithLength ( + newString, value->buffer, value->length); +} + +static void __store_string_newFromUnicode ( + rtl_String **newString, const sal_Unicode *value) +{ + __store_string_newFromUnicode_WithLength ( + newString, value, rtl_ustr_getLength (value)); +} + +static storeError __store_namei ( + const NAMESPACE_RTL(OString) &rPath, + const NAMESPACE_RTL(OString) &rName, + OStorePageKey &rKey) +{ +} + +static storeError __store_namei ( + const sal_Unicode *pszPath, + const sal_Unicode *pszName, + OStorePageKey &rKey) +{ + NAMESPACE_RTL(OString) aName ( + pszName, rtl_ustr_getLength (pszName), RTL_TEXTENCODING_UTF8); + + + rtl_String *pszNameA = 0; + __store_string_newFromUnicode (&pszNameA, pszName); + + storeError eErrCode = store_E_NameTooLong; + if (pszNameA->length < sizeof(sal_Char[STORE_MAXIMUM_NAMESIZE])) + { + rtl_String *pszPathA = 0; + __store_string_newFromUnicode (&pszPathA, pszPath); + + typedef OStorePageGuard G; + rKey.m_nLow = G::crc32 (0, pszNameA->buffer, pszNameA->length); + rKey.m_nHigh = G::crc32 (0, pszPathA->buffer, pszPathA->length); + + rtl_string_release (pszPathA); + eErrCode = store_E_None; + } + + rtl_string_release (pszNameA); + return eErrCode; +} + +static sal_Int32 __store_convertTextToUnicode ( + rtl_TextToUnicodeConverter hConvert, + const sal_Char *pszText, sal_Int32 nTextLen, + sal_Unicode *pBuffer, sal_Int32 nBuffer) +{ + sal_uInt32 nInfo, nSrcLen = 0; + + sal_Int32 nDstLen = rtl_convertTextToUnicode ( + hConvert, 0, + pszText, nTextLen, + pBuffer, nBuffer, + OSTRING_TO_OUSTRING_CVTFLAGS, + &nInfo, &nSrcLen); + + pBuffer[nDstLen] = 0; + return nDstLen; +} + +struct MyFindData +{ + sal_Unicode m_pszName[STORE_MAXIMUM_NAMESIZE]; + sal_Int32 m_nLength; + sal_uInt32 m_nAttrib; + sal_uInt32 m_nSize; + sal_uInt32 m_nReserved; +}; + +static void __store_testUnicode (const sal_Char *pszFilename) +{ + // ... + rtl_TextToUnicodeConverter hConvert; + hConvert = rtl_createTextToUnicodeConverter (RTL_TEXTENCODING_UTF8); + + MyFindData it; + rtl_zeroMemory (&it, sizeof(it)); + + sal_Int32 n = rtl_str_getLength (pszFilename); + n = __store_convertTextToUnicode ( + hConvert, pszFilename, n, + it.m_pszName, STORE_MAXIMUM_NAMESIZE - 1); + if (it.m_nLength > n) + rtl_zeroMemory ( + &it.m_pszName[n], ((it.m_nLength - n) * sizeof(sal_Unicode))); + it.m_nLength = n; + + rtl_destroyTextToUnicodeConverter (hConvert); + + // ... + rtl_String *pszFileA = NULL; + rtl_uString *pszFileW = NULL; + + // rtl_uString_newFromAscii (&pszFileW, pszFilename); + + // ... + rtl_string_newFromStr (&pszFileA, pszFilename); + + rtl_string2UString ( + &pszFileW, + pszFileA->buffer, pszFileA->length, + RTL_TEXTENCODING_MS_1252, + OSTRING_TO_OUSTRING_CVTFLAGS); + + rtl_string_release (pszFileA); + + // ... + OStorePageKey aKey; + __store_namei (pszFileW->buffer, pszFileW->buffer, aKey); + + // ... + rtl_uString2String ( + &pszFileA, + pszFileW->buffer, pszFileW->length, + RTL_TEXTENCODING_UTF8, + OUSTRING_TO_OSTRING_CVTFLAGS); + + rtl_uString_release (pszFileW); + + // ... + rtl_string_release (pszFileA); +} + +/*======================================================================== + * + * __store_getProcessTextEncoding. + * + *======================================================================*/ +inline rtl_TextEncoding __store_getProcessTextEncoding (void) +{ + rtl_TextEncoding eEncoding; +#if defined(SAL_OS2) + eEncoding = RTL_TEXTENCODING_IBM850; +#elif defined(SAL_UNX) + eEncoding = RTL_TEXTENCODING_ISO8859_1; +#elif defined(SAL_W32) + eEncoding = RTL_TEXTENCODING_MS_1252; +#else + eEncoding = RTL_TEXTENCODING_ASCII_US; +#endif + return eEncoding; +} + +/*======================================================================== + * + * main. + * + *======================================================================*/ +int SAL_CALL main (int argc, char **argv) +{ + if (argc < 2) + return 0; + +#if 0 /* EXP */ + __store_testUnicode (argv[1]); +#endif /* EXP */ + + NAMESPACE_VOS(ORef) xLockBytes (new OFileLockBytes()); + if (!xLockBytes.isValid()) + return 0; + + NAMESPACE_RTL(OUString) aFilename ( + argv[1], rtl_str_getLength(argv[1]), + __store_getProcessTextEncoding()); + + storeError eErrCode = xLockBytes->create ( + aFilename.pData, store_AccessReadCreate); + if (eErrCode != store_E_None) + return eErrCode; + + NAMESPACE_VOS(ORef) xBIOS (new OTestBIOS()); + if (!xBIOS.isValid()) + return 0; + + eErrCode = xBIOS->initialize (&*xLockBytes, store_AccessReadWrite); + if (eErrCode != store_E_None) + { + // Check reason. + if (eErrCode != store_E_NotExists) + return eErrCode; + + // Create. + eErrCode = xBIOS->initialize (&*xLockBytes, store_AccessReadCreate); + if (eErrCode != store_E_None) + return eErrCode; + } + xLockBytes.unbind(); + + sal_Char pBuffer[TEST_PAGESIZE]; + rtl_zeroMemory (pBuffer, sizeof (pBuffer)); + rtl_copyMemory (pBuffer, argv[0], rtl_str_getLength(argv[0]) + 1); + + eErrCode = xBIOS->acquireLock (TEST_PAGESIZE, sizeof(pBuffer)); + if (eErrCode != store_E_None) + return eErrCode; + + eErrCode = xBIOS->write (TEST_PAGESIZE, pBuffer, sizeof (pBuffer)); + if (eErrCode != store_E_None) + { + xBIOS->releaseLock (TEST_PAGESIZE, sizeof(pBuffer)); + return eErrCode; + } + + eErrCode = xBIOS->releaseLock (TEST_PAGESIZE, sizeof(pBuffer)); + if (eErrCode != store_E_None) + return eErrCode; + + xBIOS.unbind(); + return 0; +} + diff --git a/store/workben/t_file.cxx b/store/workben/t_file.cxx new file mode 100644 index 000000000000..eddebc8dbe1f --- /dev/null +++ b/store/workben/t_file.cxx @@ -0,0 +1,166 @@ +/************************************************************************* + * + * $RCSfile: t_file.cxx,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:18:32 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +#define _T_FILE_CXX "$Revision: 1.1.1.1 $" + +#ifndef _SAL_TYPES_H_ +#include +#endif + +#ifndef _RTL_USTRING_HXX_ +#include +#endif + +#ifndef _VOS_MACROS_HXX_ +#include +#endif +#ifndef _VOS_REF_HXX_ +#include +#endif + +#ifndef _STORE_FILELCKB_HXX_ +#include +#endif + +#ifdef _USE_NAMESPACE +using namespace store; +#endif + +/*======================================================================== + * + * __store_getProcessTextEncoding. + * + *======================================================================*/ +inline rtl_TextEncoding __store_getProcessTextEncoding (void) +{ + rtl_TextEncoding eEncoding; +#if defined(SAL_OS2) + eEncoding = RTL_TEXTENCODING_IBM850; +#elif defined(SAL_UNX) + eEncoding = RTL_TEXTENCODING_ISO8859_1; +#elif defined(SAL_W32) + eEncoding = RTL_TEXTENCODING_MS_1252; +#else + eEncoding = RTL_TEXTENCODING_ASCII_US; +#endif + return eEncoding; +} + +/*======================================================================== + * + * main. + * + *======================================================================*/ +int SAL_CALL main (int argc, char **argv) +{ + if (argc < 2) + return 0; + + NAMESPACE_VOS(ORef) xLockBytes (new OFileLockBytes()); + if (!xLockBytes.isValid()) + return 0; + + NAMESPACE_RTL(OUString) aFilename ( + argv[1], rtl_str_getLength(argv[1]), + __store_getProcessTextEncoding()); + + storeError eErrCode = xLockBytes->create ( + aFilename.pData, store_AccessReadWrite); + if (eErrCode != store_E_None) + { + // Check reason. + if (eErrCode != store_E_NotExists) + return eErrCode; + + // Create. + eErrCode = xLockBytes->create ( + aFilename.pData, store_AccessReadCreate); + if (eErrCode != store_E_None) + return eErrCode; + } + + sal_uInt32 k = 0; + eErrCode = xLockBytes->writeAt ( + 0, argv[0], rtl_str_getLength(argv[0]), k); + if (eErrCode != store_E_None) + return eErrCode; + + eErrCode = xLockBytes->setSize (1024); + if (eErrCode != store_E_None) + return eErrCode; + + eErrCode = xLockBytes->writeAt ( + 1024, argv[1], rtl_str_getLength(argv[1]), k); + if (eErrCode != store_E_None) + return eErrCode; + + eErrCode = xLockBytes->setSize (2048); + if (eErrCode != store_E_None) + return eErrCode; + + eErrCode = xLockBytes->flush(); + if (eErrCode != store_E_None) + return eErrCode; + + xLockBytes.unbind(); + return 0; +} + diff --git a/store/workben/t_store.cxx b/store/workben/t_store.cxx new file mode 100644 index 000000000000..d017e92ddd11 --- /dev/null +++ b/store/workben/t_store.cxx @@ -0,0 +1,634 @@ +/************************************************************************* + * + * $RCSfile: t_store.cxx,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 15:18:32 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +#define _T_STORE_CXX "$Revision: 1.1.1.1 $" + +#ifndef _SAL_TYPES_H_ +#include +#endif +#ifndef _OSL_TIME_H_ +#include +#endif + +#ifndef _RTL_CHAR_H_ +#include +#endif +#ifndef _RTL_USTRING_HXX_ +#include +#endif + +#ifndef _VOS_DIAGNOSE_HXX_ +#include +#endif +#ifndef _VOS_THREAD_HXX_ +#include +#endif + +#ifndef _STORE_MACROS_HXX_ +#include +#endif +#ifndef _STORE_STORE_HXX_ +#include +#endif + +#include + +#if (defined(WNT) && defined(PROFILE)) +extern "C" +{ + void StartCAP (void); + void StopCAP (void); + void DumpCAP (void); +} +#endif /* PROFILE */ + +using namespace rtl; + +/*======================================================================== + * + * Internals. + * + *======================================================================*/ +#define _DEMOSTOR_BUFSIZ 512 /* 4096, 1024, 512 */ +#define _DEMOSTOR_LOOPS 1000 /* 1000, 2000 */ + +#define _DEMOSTOR_REMOVE 0 +#define _DEMOSTOR_REBUILD 0 + +enum Options +{ + OPTION_HELP = 0x0001, + OPTION_FILE = 0x0002, + OPTION_PAUSE = 0x0004, + OPTION_REBUILD = 0x0008, + + OPTION_DUMP = 0x0010, + OPTION_ITER = 0x0020, + OPTION_LINK = 0x0040, + + OPTION_READ = 0x0100, + OPTION_WRITE = 0x0200, + OPTION_CREAT = 0x0400, + OPTION_TRUNC = 0x0800 +}; + +/*======================================================================== + * + * Timing. + * + *======================================================================*/ +struct OTime : public TimeValue +{ + OTime (void) + { + Seconds = 0; + Nanosec = 0; + } + + static OTime getSystemTime (void) + { + OTime tv; + osl_getSystemTime (&tv); + return tv; + } + + OTime& operator-= (const OTime& rPast) + { + Seconds -= rPast.Seconds; + if (Nanosec < rPast.Nanosec) + { + Seconds -= 1; + Nanosec += 1000000000; + } + Nanosec -= rPast.Nanosec; + return *this; + } + + friend OTime operator- (const OTime& rTimeA, const OTime& rTimeB) + { + OTime aTimeC (rTimeA); + aTimeC -= rTimeB; + return aTimeC; + } +}; + +/*======================================================================== + * + * DirectoryTraveller. + * + *======================================================================*/ +typedef NAMESPACE_STORE(OStoreDirectory) Directory; + +class DirectoryTraveller : public Directory::traveller +{ + typedef NAMESPACE_STORE(OStoreFile) file; + typedef Directory::iterator iter; + + NAMESPACE_STORE(OStoreFile) m_aFile; + OUString m_aPath; + + sal_uInt32 m_nOptions; + sal_uInt32 m_nLevel; + sal_uInt32 m_nCount; + +public: + DirectoryTraveller ( + const file& rFile, + const OUString &rPath, + const OUString &rName, + sal_uInt32 nOptions, + sal_uInt32 nLevel = 0); + + virtual ~DirectoryTraveller (void); + + virtual sal_Bool visit (const iter& it); +}; + +/* + * DirectoryTraveller. + */ +DirectoryTraveller::DirectoryTraveller ( + const file& rFile, + const OUString &rPath, + const OUString &rName, + sal_uInt32 nOptions, + sal_uInt32 nLevel) + : m_aFile (rFile), + m_aPath (rPath), + m_nOptions (nOptions), + m_nLevel (nLevel), + m_nCount (0) +{ + m_aPath += rName; + m_aPath += OUString::createFromAscii("/"); +} + +/* + * ~DirectoryTraveller. + */ +DirectoryTraveller::~DirectoryTraveller (void) +{ +} + +/* + * visit. + */ +sal_Bool DirectoryTraveller::visit (const iter& it) +{ + m_nCount++; + if (m_nOptions & OPTION_DUMP) + { + OString aName (it.m_pszName, it.m_nLength, RTL_TEXTENCODING_UTF8); + printf ("Visit(%d,%d): %s [0x%08x] %d [Bytes]\n", + m_nLevel, m_nCount, + aName.pData->buffer, it.m_nAttrib, it.m_nSize); + } + if (it.m_nAttrib & STORE_ATTRIB_ISDIR) + { + OUString aName (it.m_pszName, it.m_nLength); + Directory aSubDir; + + storeError eErrCode = aSubDir.create ( + m_aFile, m_aPath, aName, store_AccessReadOnly); + if (eErrCode == store_E_None) + { + sal_uInt32 nRefCount = 0; + m_aFile.getRefererCount (nRefCount); + + DirectoryTraveller aSubTraveller ( + m_aFile, m_aPath, aName, m_nOptions, m_nLevel + 1); + aSubDir.travel (aSubTraveller); + } + } + return sal_True; +} + +/*======================================================================== + * + * __store_getProcessTextEncoding. + * + *======================================================================*/ +inline rtl_TextEncoding __store_getProcessTextEncoding (void) +{ + rtl_TextEncoding eEncoding; +#if defined(SAL_OS2) + eEncoding = RTL_TEXTENCODING_IBM850; +#elif defined(SAL_UNX) + eEncoding = RTL_TEXTENCODING_ISO8859_1; +#elif defined(SAL_W32) + eEncoding = RTL_TEXTENCODING_MS_1252; +#else + eEncoding = RTL_TEXTENCODING_ASCII_US; +#endif + return eEncoding; +} + +/*======================================================================== + * + * main. + * + *======================================================================*/ +int SAL_CALL main (int argc, char **argv) +{ +#if (defined(WNT) && defined(PROFILE)) + StartCAP(); +#else + OTime aStartTime (OTime::getSystemTime()); +#endif /* PROFILE */ + + NAMESPACE_STORE(OStoreFile) aFile; + storeError eErrCode = store_E_None; + + sal_uInt32 nOptions = 0; + for (int i = 1; i < argc; i++) + { + const char *opt = argv[i]; + if (opt[0] == '-') + { + switch (rtl_char_toLowerCase(opt[1])) + { + case 'f': + nOptions |= OPTION_FILE; + break; + + case 'd': + nOptions |= OPTION_DUMP; + break; + case 'i': + nOptions |= OPTION_ITER; + break; + case 'l': + nOptions |= OPTION_LINK; + break; + + case 'r': + nOptions |= OPTION_READ; + break; + case 'w': + nOptions |= OPTION_WRITE; + break; + case 'c': + nOptions |= OPTION_CREAT; + break; + case 't': + nOptions |= OPTION_TRUNC; + break; + + case 'p': + nOptions |= OPTION_PAUSE; + break; + + case 'h': + default: + nOptions |= OPTION_HELP; + break; + } + } + else + { + if (nOptions & OPTION_FILE) + { + OUString aName ( + argv[i], rtl_str_getLength(argv[i]), + __store_getProcessTextEncoding()); + if ((nOptions & OPTION_CREAT) && (nOptions & OPTION_TRUNC)) + eErrCode = aFile.create (aName, store_AccessCreate); + else if (nOptions & OPTION_CREAT) + eErrCode = aFile.create (aName, store_AccessReadCreate); + else if (nOptions & OPTION_WRITE) + eErrCode = aFile.create (aName, store_AccessReadWrite); + else + eErrCode = aFile.create (aName, store_AccessReadOnly); + if (eErrCode != store_E_None) + { + printf ("Error: can't open file: %s\n", argv[i]); + exit (0); + } + } + } + } + + if ((nOptions == 0) || (nOptions & OPTION_HELP)) + { + printf ("Options:\n"); + printf ("-f\tfilename\n"); + printf ("-h\thelp\n"); + exit (0); + } + + if (!aFile.isValid()) + { + eErrCode = aFile.createInMemory(); + if (eErrCode != store_E_None) + { + printf ("Error: can't create memory file\n"); + exit (0); + } + } + + // Stream Read/Write. + OUString aPath (RTL_CONSTASCII_USTRINGPARAM("/")); + if ((nOptions & OPTION_READ) || (nOptions & OPTION_WRITE)) + { + // Mode. + storeAccessMode eMode = store_AccessReadOnly; + if (nOptions & OPTION_WRITE) + eMode = store_AccessReadWrite; + if (nOptions & OPTION_CREAT) + eMode = store_AccessCreate; + + // Buffer. + char pBuffer[_DEMOSTOR_BUFSIZ] = "Hello World"; + pBuffer[_DEMOSTOR_BUFSIZ - 2] = 'B'; + pBuffer[_DEMOSTOR_BUFSIZ - 1] = '\0'; + + // Load/Save. +#ifndef PROFILE + OTime aStartTime (OTime::getSystemTime()); +#endif /* PROFILE */ + + for (sal_Int32 i = 0; i < _DEMOSTOR_LOOPS; i++) + { + OUString aName (RTL_CONSTASCII_USTRINGPARAM("demostor-")); + aName += OUString::valueOf ((sal_Int32)(i + 1), 10); + aName += OUString::createFromAscii (".dat"); + +#if (_DEMOSTOR_REMOVE == 1) + eErrCode = aFile.remove (aPath, aName); + if ((eErrCode != store_E_None ) && + (eErrCode != store_E_NotExists) ) + break; +#endif /* _REMOVE */ + + NAMESPACE_STORE(OStoreStream) aStream; + eErrCode = aStream.create (aFile, aPath, aName, eMode); + if (eErrCode != store_E_None) + break; + + if (nOptions & OPTION_TRUNC) + { + eErrCode = aStream.setSize(0); + if (eErrCode != store_E_None) + break; + } + + sal_uInt32 nDone = 0; + if (nOptions & OPTION_WRITE) + { + eErrCode = aStream.writeAt ( + 0, pBuffer, sizeof(pBuffer), nDone); + if (eErrCode != store_E_None) + break; + } + + if (nOptions & OPTION_READ) + { + sal_uInt32 nOffset = 0; + for (;;) + { + eErrCode = aStream.readAt ( + nOffset, pBuffer, sizeof(pBuffer), nDone); + if (eErrCode != store_E_None) + break; + if (nDone == 0) + break; + nOffset += nDone; + } + } + + aStream.close(); + +#ifndef PROFILE + if (((i + 1) % (_DEMOSTOR_LOOPS/10)) == 0) + { + OTime aDelta (OTime::getSystemTime() - aStartTime); + + sal_uInt32 nDelta = aDelta.Seconds * 1000000; + nDelta += (aDelta.Nanosec / 1000); + + printf ("%d: %12.4g[usec]\n", (i+1), + (double)(nDelta)/(double)(i+1)); + } +#endif /* PROFILE */ + } + +#ifndef PROFILE + OTime aDelta (OTime::getSystemTime() - aStartTime); + + sal_uInt32 nDelta = aDelta.Seconds * 1000000; + nDelta += (aDelta.Nanosec / 1000); + + printf ("Total(rd,wr): %d[usec]\n", nDelta); +#endif /* PROFILE */ + } + + // Link/Rename. + if (nOptions & OPTION_LINK) + { + // Create symlink to (root) directory. + eErrCode = aFile.symlink ( + aPath, OUString::createFromAscii("000000/"), + OUString(), aPath); + VOS_POSTCOND( + ((eErrCode == store_E_None ) || + (eErrCode == store_E_AlreadyExists) ), + "t_store::main(): store_symlink() failed"); + + // Create symlink to file. + OUString aLinkName (RTL_CONSTASCII_USTRINGPARAM("demostor-1.lnk")); + + eErrCode = aFile.symlink ( + aPath, aLinkName, + aPath, OUString::createFromAscii("demostor-1.dat")); + VOS_POSTCOND( + ((eErrCode == store_E_None ) || + (eErrCode == store_E_AlreadyExists) ), + "t_store::main(): store_symlink() failed"); + if ((eErrCode == store_E_None ) || + (eErrCode == store_E_AlreadyExists) ) + { + OUString aShortcut ( + RTL_CONSTASCII_USTRINGPARAM("Shortcut to demostor-1.dat")); + eErrCode = aFile.rename ( + aPath, aLinkName, + aPath, aShortcut); + VOS_POSTCOND( + ((eErrCode == store_E_None ) || + (eErrCode == store_E_AlreadyExists) ), + "t_store::main(): store_rename() failed"); + } + + // Create directory. + OUString aDirName (RTL_CONSTASCII_USTRINGPARAM("demostor-1.dir")); + NAMESPACE_STORE(OStoreDirectory) aDir; + + eErrCode = aDir.create ( + aFile, aPath, aDirName, store_AccessReadCreate); + VOS_POSTCOND( + (eErrCode == store_E_None), + "t_store::main(): store_createDirectory() failed"); + if (eErrCode == store_E_None) + { +#if 0 /* NYI */ + // Rename directory. + eErrCode = aFile.rename ( + aPath, "demostor-1.dir/", + aPath, "Renamed demostor-1.dir"); + VOS_POSTCOND( + ((eErrCode == store_E_None ) || + (eErrCode == store_E_AlreadyExists) ), + "t_store::main(): store_rename() failed"); + + eErrCode = aFile.rename ( + aPath, "Renamed demostor-1.dir/", + aPath, "demostor-1.dir"); + VOS_POSTCOND( + (eErrCode == store_E_None), + "t_store::main(): store_rename() failed"); +#endif /* NYI */ + } + } + + // Directory iteration. + if (nOptions & OPTION_ITER) + { +#ifndef PROFILE + OTime aStartTime (OTime::getSystemTime()); +#endif /* PROFILE */ + OUString aEmpty; + + // Root directory. + NAMESPACE_STORE(OStoreDirectory) aRootDir; + if (nOptions & OPTION_LINK) + { + // Open symlink entry. + eErrCode = aRootDir.create ( + aFile, aPath, OUString::createFromAscii("000000"), + store_AccessReadOnly); + } + else + { + // Open direct entry. + if (nOptions & OPTION_CREAT) + eErrCode = aRootDir.create ( + aFile, aEmpty, aEmpty, store_AccessReadCreate); + else if (nOptions & OPTION_WRITE) + eErrCode = aRootDir.create ( + aFile, aEmpty, aEmpty, store_AccessReadWrite); + else + eErrCode = aRootDir.create ( + aFile, aEmpty, aEmpty, store_AccessReadOnly); + } + + if (eErrCode == store_E_None) + { + // Traverse directory tree. + DirectoryTraveller aTraveller ( + aFile, aEmpty, aEmpty, nOptions, 0); + aRootDir.travel (aTraveller); + } + else + { + // Failure. + printf ("Error: can't open directory: \"/\"\n"); + } + +#ifndef PROFILE + OTime aDelta (OTime::getSystemTime() - aStartTime); + + sal_uInt32 nDelta = aDelta.Seconds * 1000000; + nDelta += (aDelta.Nanosec / 1000); + + printf ("Total(iter): %d[usec]\n", nDelta); +#endif /* PROFILE */ + } + + if (nOptions & OPTION_PAUSE) + { + TimeValue tv; + tv.Seconds = 300; + tv.Nanosec = 0; + NAMESPACE_VOS(OThread)::wait (tv); + } + + // Size. + sal_uInt32 nSize = 0; + aFile.getSize (nSize); + + // Done. + aFile.close(); + +#if (defined(WNT) && defined(PROFILE)) + StopCAP(); + DumpCAP(); +#endif /* PROFILE */ +#ifndef PROFILE + OTime aDelta (OTime::getSystemTime() - aStartTime); + + sal_uInt32 nDelta = aDelta.Seconds * 1000000; + nDelta += (aDelta.Nanosec / 1000); + + printf ("Total: %d[usec]\n", nDelta); +#endif /* PROFILE */ + + return 0; +} + -- cgit v1.2.3