From 73c04bcfe1096173b00431f0cdc742894b15eef0 Mon Sep 17 00:00:00 2001
From: Apple
Date: Mon, 24 Sep 2007 19:41:56 +0000
Subject: [PATCH] ICU-8.11.tar.gz
---
ICU.plist | 10 +-
icuSources/Doxyfile.in | 32 +-
icuSources/Makefile.in | 6 +-
icuSources/aclocal.m4 | 70 +-
icuSources/allinone/all/all.dsp | 93 -
icuSources/allinone/allinone.dsw | 743 -
icuSources/allinone/allinone.sln | 71 +-
icuSources/common/Makefile.in | 75 +-
icuSources/common/Makefile.local | 17 +
icuSources/common/aaplbfct.cpp | 367 +
icuSources/common/aaplbfct.h | 51 +
icuSources/common/brkdict.cpp | 242 -
icuSources/common/brkdict.h | 174 -
icuSources/common/brkeng.cpp | 287 +
icuSources/common/brkeng.h | 292 +
icuSources/common/brkiter.cpp | 95 +-
icuSources/common/caniter.cpp | 354 +-
icuSources/common/charstr.h | 7 +-
icuSources/common/cmemory.c | 3 +-
icuSources/common/cmemory.h | 1 -
icuSources/common/common.dsp | 3787 -
icuSources/common/common.rc | 12 +-
icuSources/common/common.vcproj | 213 +-
icuSources/common/cpputils.h | 20 +-
icuSources/common/cstring.h | 4 +-
icuSources/common/dbbi.cpp | 629 -
icuSources/common/dbbi_tbl.cpp | 59 -
icuSources/common/dbbi_tbl.h | 90 -
icuSources/common/dictbe.cpp | 418 +
icuSources/common/dictbe.h | 193 +
icuSources/common/hash.h | 50 +-
icuSources/common/iculserv.cpp | 962 -
icuSources/common/icunotif.cpp | 116 -
icuSources/common/localsvc.cpp | 29 +
icuSources/common/localsvc.h | 25 +
icuSources/common/locid.cpp | 59 +-
icuSources/common/locmap.c | 196 +-
icuSources/common/locutil.cpp | 267 +
icuSources/common/locutil.h | 37 +
icuSources/common/msvcres.h | 11 +-
icuSources/common/normlzr.cpp | 26 +-
icuSources/common/propname.cpp | 23 +-
icuSources/common/putil.c | 1213 +-
icuSources/common/putilimp.h | 45 +-
icuSources/common/rbbi.cpp | 1372 +-
icuSources/common/rbbicst.pl | 865 +-
icuSources/common/rbbidata.cpp | 58 +-
icuSources/common/rbbidata.h | 32 +-
icuSources/common/rbbinode.cpp | 11 +-
icuSources/common/rbbinode.h | 11 +-
icuSources/common/rbbirb.cpp | 15 +-
icuSources/common/rbbirb.h | 6 +-
icuSources/common/rbbirpt.h | 96 +-
icuSources/common/rbbiscan.cpp | 30 +-
icuSources/common/rbbiscan.h | 12 +-
icuSources/common/rbbisetb.cpp | 98 +-
icuSources/common/rbbisetb.h | 18 +-
icuSources/common/rbbistbl.cpp | 6 +-
icuSources/common/rbbitblb.cpp | 279 +-
icuSources/common/rbbitblb.h | 3 +-
icuSources/common/rbtok.cpp | 254 +
icuSources/common/rbtok.h | 110 +
icuSources/common/resbund_cnv.cpp | 33 +-
icuSources/common/ruleiter.cpp | 6 +-
icuSources/common/ruleiter.h | 10 +-
icuSources/common/{icuserv.cpp => serv.cpp} | 2 +-
icuSources/common/{icuserv.h => serv.h} | 25 +-
icuSources/common/servlk.cpp | 187 +
icuSources/common/servlkf.cpp | 151 +
icuSources/common/{iculserv.h => servloc.h} | 33 +-
icuSources/common/servls.cpp | 297 +
icuSources/common/servnotf.cpp | 118 +
icuSources/common/{icunotif.h => servnotf.h} | 0
icuSources/common/servrbf.cpp | 94 +
icuSources/common/servslkf.cpp | 122 +
icuSources/common/sprpimpl.h | 6 +-
icuSources/common/triedict.cpp | 1407 +
icuSources/common/triedict.h | 346 +
icuSources/common/ubidi.c | 1877 +-
icuSources/common/ubidi_props.c | 519 +
icuSources/common/ubidi_props.h | 160 +
icuSources/common/ubidi_props_data.c | 698 +
icuSources/common/ubidiimp.h | 157 +-
icuSources/common/ubidiln.c | 568 +-
icuSources/common/ubidiwrt.c | 121 +-
icuSources/common/ubrk.cpp | 95 +-
icuSources/common/ubrkimpl.h | 13 +
icuSources/common/ucase.c | 647 +-
icuSources/common/ucase.h | 73 +-
icuSources/common/ucase_props_data.c | 648 +
icuSources/common/ucasemap.c | 333 +
icuSources/common/uchar.c | 572 +-
icuSources/common/uchar_props_data.c | 3772 +
icuSources/common/ucln_cmn.c | 34 +-
icuSources/common/ucln_cmn.h | 9 +-
icuSources/common/ucmndata.c | 21 +-
icuSources/common/ucmp8.c | 572 -
icuSources/common/ucmp8.h | 244 -
icuSources/common/ucnv.c | 316 +-
icuSources/common/ucnv2022.c | 250 +-
icuSources/common/ucnv_bld.c | 310 +-
icuSources/common/ucnv_bld.h | 35 +-
icuSources/common/ucnv_cb.c | 130 +-
icuSources/common/ucnv_cnv.c | 4 +-
icuSources/common/ucnv_cnv.h | 6 +-
icuSources/common/ucnv_ext.c | 4 +-
icuSources/common/ucnv_ext.h | 2 +-
icuSources/common/ucnv_imp.h | 10 +-
icuSources/common/ucnv_io.c | 716 +-
icuSources/common/ucnv_io.h | 142 +-
icuSources/common/ucnv_lmb.c | 13 +-
icuSources/common/ucnv_set.c | 5 +-
icuSources/common/ucnv_u16.c | 132 +-
icuSources/common/ucnv_u32.c | 131 +-
icuSources/common/ucnv_u7.c | 16 +-
icuSources/common/ucnv_u8.c | 15 +-
icuSources/common/ucnvbocu.c | 24 +-
icuSources/common/ucnvdisp.c | 9 +-
icuSources/common/ucnvhz.c | 61 +-
icuSources/common/ucnvisci.c | 93 +-
icuSources/common/ucnvlat1.c | 16 +-
icuSources/common/ucnvmbcs.c | 42 +-
icuSources/common/ucnvmbcs.h | 4 +-
icuSources/common/ucnvscsu.c | 52 +-
icuSources/common/ucol_swp.c | 87 +-
icuSources/common/udata.c | 460 +-
icuSources/common/udataswp.h | 56 +-
icuSources/common/uenumimp.h | 16 +-
icuSources/common/uhash.c | 1364 +-
icuSources/common/uhash.h | 81 +-
icuSources/common/uhash_us.cpp | 29 +-
icuSources/common/uidna.cpp | 104 +-
icuSources/common/uinit.c | 54 +-
icuSources/common/uinvchar.c | 45 +-
icuSources/common/uiter.cpp | 7 +-
icuSources/common/uloc.c | 491 +-
icuSources/common/umapfile.c | 90 +-
icuSources/common/umath.c | 24 +
icuSources/common/umutex.c | 71 +-
icuSources/common/umutex.h | 10 +-
icuSources/common/unames.c | 152 +-
icuSources/common/unicode/brkiter.h | 223 +-
icuSources/common/unicode/caniter.h | 11 +-
icuSources/common/unicode/chariter.h | 8 +-
icuSources/common/unicode/dbbi.h | 257 +-
icuSources/common/unicode/docmain.h | 36 +-
icuSources/common/unicode/locid.h | 42 +-
icuSources/common/unicode/normlzr.h | 12 +-
icuSources/common/unicode/parseerr.h | 6 +-
icuSources/common/unicode/parsepos.h | 9 +-
icuSources/common/unicode/platform.h.in | 29 +-
icuSources/common/unicode/ppalmos.h | 273 +
icuSources/common/unicode/putil.h | 10 +-
icuSources/common/unicode/pwin32.h | 80 +-
icuSources/common/unicode/rbbi.h | 225 +-
icuSources/common/unicode/rep.h | 7 +-
icuSources/common/unicode/resbund.h | 57 +-
icuSources/common/unicode/schriter.h | 7 +-
icuSources/common/unicode/strenum.h | 40 +-
icuSources/common/unicode/symtable.h | 20 +-
icuSources/common/unicode/ubidi.h | 955 +-
icuSources/common/unicode/ubrk.h | 189 +-
icuSources/common/unicode/ucasemap.h | 180 +
icuSources/common/unicode/uchar.h | 518 +-
icuSources/common/unicode/uchriter.h | 7 +-
icuSources/common/unicode/uclean.h | 49 +-
icuSources/common/unicode/ucnv.h | 209 +-
icuSources/common/unicode/ucnv_err.h | 16 +-
icuSources/common/unicode/uconfig.h | 37 +-
icuSources/common/unicode/udata.h | 42 +-
icuSources/common/unicode/udeprctd.h | 37 +-
icuSources/common/unicode/udraft.h | 456 +-
icuSources/common/unicode/uenum.h | 7 +-
icuSources/common/unicode/uidna.h | 10 +-
icuSources/common/unicode/uintrnal.h | 68 +
icuSources/common/unicode/uiter.h | 2 +-
icuSources/common/unicode/uloc.h | 100 +-
icuSources/common/unicode/umachine.h | 22 +-
icuSources/common/unicode/umisc.h | 16 +-
icuSources/common/unicode/unifilt.h | 11 +-
icuSources/common/unicode/unifunct.h | 7 +-
icuSources/common/unicode/unimatch.h | 8 +-
icuSources/common/unicode/uniset.h | 82 +-
icuSources/common/unicode/unistr.h | 103 +-
icuSources/common/unicode/unorm.h | 6 +-
icuSources/common/unicode/uobject.h | 36 +-
icuSources/common/unicode/uobslete.h | 9 +-
icuSources/common/unicode/urbtok.h | 106 +
icuSources/common/unicode/urename.h | 2989 +-
icuSources/common/unicode/urep.h | 7 +-
icuSources/common/unicode/ures.h | 276 +-
icuSources/common/unicode/uscript.h | 110 +-
icuSources/common/unicode/uset.h | 125 +-
icuSources/common/unicode/usetiter.h | 95 +-
icuSources/common/unicode/usprep.h | 31 +-
icuSources/common/unicode/ustring.h | 184 +-
icuSources/common/unicode/usystem.h | 46 +
icuSources/common/unicode/utext.h | 1569 +
icuSources/common/unicode/utf.h | 22 +-
icuSources/common/unicode/utf16.h | 22 +-
icuSources/common/unicode/utf8.h | 79 +-
icuSources/common/unicode/utf_old.h | 16 +-
icuSources/common/unicode/utrace.h | 61 +-
icuSources/common/unicode/utypes.h | 57 +-
icuSources/common/unicode/uversion.h | 71 +-
icuSources/common/uniset.cpp | 25 +-
icuSources/common/uniset_props.cpp | 822 +-
icuSources/common/unistr.cpp | 31 +-
icuSources/common/unistr_case.cpp | 35 +-
icuSources/common/unistr_cnv.cpp | 481 +-
icuSources/common/unorm.cpp | 361 +-
icuSources/common/unorm_props_data.c | 3262 +
icuSources/common/unormcmp.cpp | 4 +-
icuSources/common/unormimp.h | 2 +-
icuSources/common/uobject.cpp | 13 +-
icuSources/common/uprops.c | 234 +-
icuSources/common/uprops.h | 188 +-
icuSources/common/urbtok.cpp | 169 +
icuSources/common/ures_cnv.c | 68 +-
icuSources/common/uresbund.c | 618 +-
icuSources/common/uresdata.c | 157 +-
icuSources/common/uresdata.h | 23 +-
icuSources/common/uresimp.h | 80 +-
icuSources/common/uscript.c | 27 +-
icuSources/common/uset.cpp | 139 +-
icuSources/common/uset_imp.h | 9 +-
icuSources/common/uset_props.cpp | 14 +-
icuSources/common/usetiter.cpp | 24 +-
icuSources/common/ushape.c | 79 +-
icuSources/common/usprep.cpp | 88 +-
icuSources/common/ustack.cpp | 49 +-
icuSources/common/ustr_cnv.c | 2 +-
icuSources/common/ustr_imp.h | 14 +-
icuSources/common/ustr_wcs.c | 22 +-
icuSources/common/ustrcase.c | 114 +-
icuSources/common/ustrenum.cpp | 12 +-
icuSources/common/ustrfmt.c | 31 +-
icuSources/common/ustrfmt.h | 4 +-
icuSources/common/ustring.c | 2 +-
icuSources/common/ustrtrns.c | 926 +-
icuSources/common/utext.cpp | 2820 +
icuSources/common/utf_impl.c | 30 +-
icuSources/common/util.cpp | 208 +-
icuSources/common/util.h | 5 +-
icuSources/common/util_props.cpp | 214 +
icuSources/common/utrace.c | 6 +-
icuSources/common/utrie.c | 260 +-
icuSources/common/utrie.h | 109 +-
icuSources/common/utypes.c | 25 +-
icuSources/common/uvector.cpp | 47 -
icuSources/common/uvector.h | 14 +-
icuSources/common/uvectr32.h | 10 +-
icuSources/common/wintz.c | 581 +
icuSources/common/wintz.h | 37 +
icuSources/config.guess | 983 +-
icuSources/config.sub | 462 +-
icuSources/config/Makefile.inc.in | 22 +-
icuSources/config/icu-config-bottom | 4 +-
icuSources/config/make2sh.sed | 3 +-
icuSources/config/mh-aix | 3 +-
icuSources/config/mh-aix-gcc | 11 +-
icuSources/config/mh-aix-va | 15 +-
icuSources/config/mh-alpha-linux-cc | 7 +-
icuSources/config/mh-alpha-linux-gcc | 7 +-
icuSources/config/mh-alpha-osf | 7 +-
icuSources/config/mh-beos | 5 +-
icuSources/config/mh-bsd-gcc | 8 +-
icuSources/config/mh-cygwin | 36 +-
icuSources/config/mh-cygwin-msvc | 51 +-
icuSources/config/mh-darwin | 6 +-
icuSources/config/mh-hpux-acc | 4 +-
icuSources/config/mh-irix | 4 +-
icuSources/config/mh-linux | 10 +-
icuSources/config/mh-linux-va | 10 +-
icuSources/config/mh-mingw | 21 +-
icuSources/config/mh-os390 | 73 +-
icuSources/config/mh-os400 | 3 +-
icuSources/config/mh-ptx | 65 -
icuSources/config/mh-qnx | 5 +-
icuSources/config/mh-solaris | 13 +-
icuSources/config/mh-solaris-gcc | 11 +-
icuSources/configure | 9848 ++-
icuSources/configure.in | 242 +-
icuSources/data/Makefile.in | 209 +-
icuSources/data/brkitr/brkfiles.mk | 30 +-
icuSources/data/brkitr/brklocal.mk | 8 +
icuSources/data/brkitr/char.txt | 31 +-
icuSources/data/brkitr/en.txt | 11 +
icuSources/data/brkitr/en_US.txt | 11 +
icuSources/data/brkitr/en_US_POSIX.txt | 14 +
icuSources/data/brkitr/ja.txt | 14 +
icuSources/data/brkitr/line.txt | 1019 +-
icuSources/data/brkitr/line_th.txt | 393 -
icuSources/data/brkitr/root.txt | 21 +
icuSources/data/brkitr/sent.txt | 194 +-
icuSources/data/brkitr/thaidict.brk | Bin 93616 -> 0 bytes
icuSources/data/brkitr/thaidict.txt | 26359 +++++++
icuSources/data/brkitr/word.txt | 220 +-
icuSources/data/brkitr/word_POSIX.txt | 223 +-
icuSources/data/brkitr/word_ja.txt | 236 +-
icuSources/data/brkitr/word_th.txt | 178 -
icuSources/data/build.xml | 283 +
icuSources/data/cldr-icu-readme.txt | 58 +
icuSources/data/coll/ar.txt | 10 +-
icuSources/data/coll/ar_AE.txt | 4 +-
icuSources/data/coll/ar_BH.txt | 4 +-
icuSources/data/coll/ar_DZ.txt | 4 +-
icuSources/data/coll/ar_EG.txt | 4 +-
icuSources/data/coll/ar_IQ.txt | 4 +-
icuSources/data/coll/ar_JO.txt | 4 +-
icuSources/data/coll/ar_KW.txt | 4 +-
icuSources/data/coll/ar_LB.txt | 4 +-
icuSources/data/coll/ar_LY.txt | 4 +-
icuSources/data/coll/ar_MA.txt | 4 +-
icuSources/data/coll/ar_OM.txt | 4 +-
icuSources/data/coll/ar_QA.txt | 4 +-
icuSources/data/coll/ar_SA.txt | 4 +-
icuSources/data/coll/ar_SD.txt | 4 +-
icuSources/data/coll/ar_SY.txt | 4 +-
icuSources/data/coll/ar_TN.txt | 4 +-
icuSources/data/coll/ar_YE.txt | 4 +-
icuSources/data/coll/as.txt | 17 +
icuSources/data/coll/{ar_IN.txt => as_IN.txt} | 8 +-
icuSources/data/coll/be.txt | 8 +-
icuSources/data/coll/be_BY.txt | 4 +-
icuSources/data/coll/bg.txt | 8 +-
icuSources/data/coll/bg_BG.txt | 4 +-
icuSources/data/coll/bn.txt | 11 +
icuSources/data/coll/ca.txt | 10 +-
icuSources/data/coll/ca_ES.txt | 4 +-
icuSources/data/coll/colfiles.mk | 45 +-
icuSources/data/coll/collocal.mk | 8 +-
icuSources/data/coll/cs.txt | 10 +-
icuSources/data/coll/cs_CZ.txt | 4 +-
icuSources/data/coll/da.txt | 10 +-
icuSources/data/coll/da_DK.txt | 4 +-
icuSources/data/coll/de.txt | 12 +-
icuSources/data/coll/de_.txt | 17 +
icuSources/data/coll/de_AT.txt | 4 +-
icuSources/data/coll/de_BE.txt | 4 +-
icuSources/data/coll/de_CH.txt | 4 +-
icuSources/data/coll/de_DE.txt | 4 +-
icuSources/data/coll/de_LU.txt | 4 +-
icuSources/data/coll/de__PHONEBOOK.txt | 4 +-
icuSources/data/coll/el.txt | 10 +-
icuSources/data/coll/el_GR.txt | 4 +-
icuSources/data/coll/en.txt | 10 +-
icuSources/data/coll/en_AU.txt | 4 +-
icuSources/data/coll/en_BE.txt | 11 +-
icuSources/data/coll/en_BW.txt | 4 +-
icuSources/data/coll/en_CA.txt | 4 +-
icuSources/data/coll/en_GB.txt | 4 +-
icuSources/data/coll/en_HK.txt | 4 +-
icuSources/data/coll/en_IE.txt | 4 +-
icuSources/data/coll/en_IN.txt | 4 +-
icuSources/data/coll/en_MT.txt | 4 +-
icuSources/data/coll/en_NZ.txt | 4 +-
icuSources/data/coll/en_PH.txt | 4 +-
icuSources/data/coll/en_SG.txt | 4 +-
icuSources/data/coll/en_US.txt | 4 +-
icuSources/data/coll/en_US_POSIX.txt | 4 +-
icuSources/data/coll/en_VI.txt | 4 +-
icuSources/data/coll/en_ZA.txt | 4 +-
icuSources/data/coll/en_ZW.txt | 4 +-
icuSources/data/coll/eo.txt | 10 +-
icuSources/data/coll/es.txt | 12 +-
icuSources/data/coll/es_.txt | 17 +
icuSources/data/coll/es_AR.txt | 4 +-
icuSources/data/coll/es_BO.txt | 4 +-
icuSources/data/coll/es_CL.txt | 4 +-
icuSources/data/coll/es_CO.txt | 4 +-
icuSources/data/coll/es_CR.txt | 4 +-
icuSources/data/coll/es_DO.txt | 4 +-
icuSources/data/coll/es_EC.txt | 4 +-
icuSources/data/coll/es_ES.txt | 4 +-
icuSources/data/coll/es_GT.txt | 4 +-
icuSources/data/coll/es_HN.txt | 4 +-
icuSources/data/coll/es_MX.txt | 4 +-
icuSources/data/coll/es_NI.txt | 4 +-
icuSources/data/coll/es_PA.txt | 4 +-
icuSources/data/coll/es_PE.txt | 4 +-
icuSources/data/coll/es_PR.txt | 4 +-
icuSources/data/coll/es_PY.txt | 4 +-
icuSources/data/coll/es_SV.txt | 4 +-
icuSources/data/coll/es_US.txt | 4 +-
icuSources/data/coll/es_UY.txt | 4 +-
icuSources/data/coll/es_VE.txt | 4 +-
icuSources/data/coll/es__TRADITIONAL.txt | 4 +-
icuSources/data/coll/et.txt | 10 +-
icuSources/data/coll/et_EE.txt | 4 +-
icuSources/data/coll/fa.txt | 10 +-
icuSources/data/coll/fa_AF.txt | 9 +-
icuSources/data/coll/fa_IR.txt | 4 +-
icuSources/data/coll/fi.txt | 10 +-
icuSources/data/coll/fi_FI.txt | 4 +-
icuSources/data/coll/fo.txt | 10 +-
icuSources/data/coll/fo_FO.txt | 4 +-
icuSources/data/coll/fr.txt | 10 +-
icuSources/data/coll/fr_BE.txt | 4 +-
icuSources/data/coll/fr_CA.txt | 4 +-
icuSources/data/coll/fr_CH.txt | 4 +-
icuSources/data/coll/fr_FR.txt | 4 +-
icuSources/data/coll/fr_LU.txt | 4 +-
icuSources/data/coll/ga.txt | 4 +-
icuSources/data/coll/ga_IE.txt | 4 +-
icuSources/data/coll/gu.txt | 10 +-
icuSources/data/coll/gu_IN.txt | 4 +-
icuSources/data/coll/haw.txt | 54 +-
icuSources/data/coll/he.txt | 10 +-
icuSources/data/coll/he_IL.txt | 4 +-
icuSources/data/coll/hi.txt | 58 +-
icuSources/data/coll/hi_.txt | 17 +
icuSources/data/coll/hi_IN.txt | 4 +-
icuSources/data/coll/hi__DIRECT.txt | 4 +-
icuSources/data/coll/hr.txt | 10 +-
icuSources/data/coll/hr_HR.txt | 4 +-
icuSources/data/coll/hu.txt | 10 +-
icuSources/data/coll/hu_HU.txt | 4 +-
icuSources/data/coll/id.txt | 4 +-
icuSources/data/coll/id_ID.txt | 4 +-
icuSources/data/coll/in.txt | 11 +
icuSources/data/coll/in_ID.txt | 11 +
icuSources/data/coll/is.txt | 10 +-
icuSources/data/coll/is_IS.txt | 4 +-
icuSources/data/coll/it.txt | 10 +-
icuSources/data/coll/it_CH.txt | 4 +-
icuSources/data/coll/it_IT.txt | 4 +-
icuSources/data/coll/iw.txt | 11 +
icuSources/data/coll/iw_IL.txt | 11 +
icuSources/data/coll/ja.txt | 1026 +-
icuSources/data/coll/ja_JP.txt | 4 +-
icuSources/data/coll/kk.txt | 10 +-
icuSources/data/coll/kk_KZ.txt | 4 +-
icuSources/data/coll/kl.txt | 10 +-
icuSources/data/coll/kl_GL.txt | 4 +-
icuSources/data/coll/kn.txt | 10 +-
icuSources/data/coll/kn_IN.txt | 4 +-
icuSources/data/coll/ko.txt | 1374 +-
icuSources/data/coll/ko_KR.txt | 4 +-
icuSources/data/coll/kok.txt | 11 +
icuSources/data/coll/lt.txt | 10 +-
icuSources/data/coll/lt_LT.txt | 4 +-
icuSources/data/coll/lv.txt | 10 +-
icuSources/data/coll/lv_LV.txt | 4 +-
icuSources/data/coll/mk.txt | 8 +-
icuSources/data/coll/mk_MK.txt | 4 +-
icuSources/data/coll/ml.txt | 14 +-
icuSources/data/coll/mr.txt | 10 +-
icuSources/data/coll/mr_IN.txt | 4 +-
icuSources/data/coll/ms.txt | 4 +-
icuSources/data/coll/ms_BN.txt | 4 +-
icuSources/data/coll/ms_MY.txt | 4 +-
icuSources/data/coll/mt.txt | 10 +-
icuSources/data/coll/mt_MT.txt | 4 +-
icuSources/data/coll/nb.txt | 10 +-
icuSources/data/coll/nb_NO.txt | 4 +-
icuSources/data/coll/nl.txt | 4 +-
icuSources/data/coll/nl_BE.txt | 4 +-
icuSources/data/coll/nl_NL.txt | 4 +-
icuSources/data/coll/nn.txt | 10 +-
icuSources/data/coll/nn_NO.txt | 4 +-
icuSources/data/coll/om.txt | 10 +-
icuSources/data/coll/om_ET.txt | 4 +-
icuSources/data/coll/om_KE.txt | 4 +-
icuSources/data/coll/or.txt | 14 +-
icuSources/data/coll/pa.txt | 10 +-
icuSources/data/coll/pa_IN.txt | 4 +-
icuSources/data/coll/pl.txt | 10 +-
icuSources/data/coll/pl_PL.txt | 4 +-
icuSources/data/coll/ps.txt | 76 +-
icuSources/data/coll/ps_AF.txt | 4 +-
icuSources/data/coll/pt.txt | 4 +-
icuSources/data/coll/pt_BR.txt | 4 +-
icuSources/data/coll/pt_PT.txt | 4 +-
icuSources/data/coll/ro.txt | 10 +-
icuSources/data/coll/ro_RO.txt | 4 +-
icuSources/data/coll/root.txt | 2762 +-
icuSources/data/coll/ru.txt | 10 +-
icuSources/data/coll/ru_RU.txt | 4 +-
icuSources/data/coll/ru_UA.txt | 4 +-
icuSources/data/coll/sh.txt | 8 +-
icuSources/data/coll/sh_BA.txt | 17 +
icuSources/data/coll/sh_YU.txt | 4 +-
icuSources/data/coll/sk.txt | 10 +-
icuSources/data/coll/sk_SK.txt | 4 +-
icuSources/data/coll/sl.txt | 10 +-
icuSources/data/coll/sl_SI.txt | 4 +-
icuSources/data/coll/sq.txt | 10 +-
icuSources/data/coll/sq_AL.txt | 4 +-
icuSources/data/coll/sr.txt | 8 +-
icuSources/data/coll/sr_BA.txt | 17 +
icuSources/data/coll/sr_Cyrl.txt | 17 +
icuSources/data/coll/sr_Cyrl_BA.txt | 17 +
icuSources/data/coll/sr_Cyrl_YU.txt | 17 +
icuSources/data/coll/sr_YU.txt | 4 +-
icuSources/data/coll/sv.txt | 10 +-
icuSources/data/coll/sv_FI.txt | 4 +-
icuSources/data/coll/sv_SE.txt | 4 +-
icuSources/data/coll/ta.txt | 10 +-
icuSources/data/coll/ta_IN.txt | 4 +-
icuSources/data/coll/te.txt | 10 +-
icuSources/data/coll/te_IN.txt | 4 +-
icuSources/data/coll/th.txt | 10 +-
icuSources/data/coll/th_TH.txt | 4 +-
icuSources/data/coll/tr.txt | 10 +-
icuSources/data/coll/tr_TR.txt | 4 +-
icuSources/data/coll/uk.txt | 10 +-
icuSources/data/coll/uk_UA.txt | 4 +-
icuSources/data/coll/vi.txt | 10 +-
icuSources/data/coll/vi_VN.txt | 4 +-
icuSources/data/coll/zh.txt | 3348 +-
icuSources/data/coll/zh_.txt | 17 +
icuSources/data/coll/zh_CN.txt | 4 +-
icuSources/data/coll/zh_HK.txt | 9 +-
icuSources/data/coll/zh_Hant.txt | 8 +-
icuSources/data/coll/zh_MO.txt | 9 +-
icuSources/data/coll/zh_SG.txt | 4 +-
icuSources/data/coll/zh_TW.txt | 9 +-
icuSources/data/coll/zh_TW_STROKE.txt | 4 +-
icuSources/data/coll/zh__PINYIN.txt | 4 +-
icuSources/data/icu-config.xml | 310 +
icuSources/data/icupkg.inc.in | 11 +-
icuSources/data/locales/af.txt | 84 +-
icuSources/data/locales/af_ZA.txt | 14 +-
icuSources/data/locales/am.txt | 852 +-
icuSources/data/locales/am_ET.txt | 30 +-
icuSources/data/locales/ar.txt | 2720 +-
icuSources/data/locales/ar_AE.txt | 20 +-
icuSources/data/locales/ar_BH.txt | 20 +-
icuSources/data/locales/ar_DZ.txt | 22 +-
icuSources/data/locales/ar_EG.txt | 25 +-
icuSources/data/locales/ar_IQ.txt | 24 +-
icuSources/data/locales/ar_JO.txt | 136 +-
icuSources/data/locales/ar_KW.txt | 24 +-
icuSources/data/locales/ar_LB.txt | 130 +-
icuSources/data/locales/ar_LY.txt | 24 +-
icuSources/data/locales/ar_MA.txt | 22 +-
icuSources/data/locales/ar_OM.txt | 20 +-
icuSources/data/locales/ar_QA.txt | 20 +-
icuSources/data/locales/ar_SA.txt | 20 +-
icuSources/data/locales/ar_SD.txt | 20 +-
icuSources/data/locales/ar_SY.txt | 152 +-
icuSources/data/locales/ar_TN.txt | 22 +-
icuSources/data/locales/ar_YE.txt | 20 +-
icuSources/data/locales/as.txt | 105 +
icuSources/data/locales/as_IN.txt | 44 +
icuSources/data/locales/az.txt | 144 +
icuSources/data/locales/az_AZ.txt | 22 +
icuSources/data/locales/az_Cyrl.txt | 84 +
icuSources/data/locales/az_Cyrl_AZ.txt | 19 +
icuSources/data/locales/az_Latn.txt | 27 +
icuSources/data/locales/az_Latn_AZ.txt | 19 +
icuSources/data/locales/be.txt | 348 +-
icuSources/data/locales/be_BY.txt | 10 +-
icuSources/data/locales/bg.txt | 4040 +-
icuSources/data/locales/bg_BG.txt | 16 +-
icuSources/data/locales/bn.txt | 408 +-
icuSources/data/locales/bn_IN.txt | 16 +-
icuSources/data/locales/ca.txt | 97 +-
icuSources/data/locales/ca_ES.txt | 16 +-
icuSources/data/locales/cs.txt | 927 +-
icuSources/data/locales/cs_CZ.txt | 13 +-
icuSources/data/locales/cy.txt | 109 +-
icuSources/data/locales/cy_GB.txt | 16 +-
icuSources/data/locales/da.txt | 1013 +-
icuSources/data/locales/da_DK.txt | 18 +-
icuSources/data/locales/de.txt | 941 +-
icuSources/data/locales/de_AT.txt | 22 +-
icuSources/data/locales/de_BE.txt | 26 +-
icuSources/data/locales/de_CH.txt | 29 +-
icuSources/data/locales/de_DE.txt | 18 +-
icuSources/data/locales/de_LU.txt | 34 +-
icuSources/data/locales/el.txt | 3669 +-
icuSources/data/locales/el_GR.txt | 16 +-
icuSources/data/locales/en.txt | 1222 +-
icuSources/data/locales/en_AU.txt | 12 +-
icuSources/data/locales/en_BE.txt | 12 +-
icuSources/data/locales/en_BW.txt | 10 +-
icuSources/data/locales/en_CA.txt | 10 +-
icuSources/data/locales/en_GB.txt | 24 +-
icuSources/data/locales/en_HK.txt | 14 +-
icuSources/data/locales/en_IE.txt | 24 +-
icuSources/data/locales/en_IN.txt | 18 +-
icuSources/data/locales/en_MT.txt | 6 +-
icuSources/data/locales/en_NZ.txt | 12 +-
icuSources/data/locales/en_PH.txt | 16 +-
icuSources/data/locales/en_PK.txt | 26 +-
icuSources/data/locales/en_RH.txt | 11 +
icuSources/data/locales/en_SG.txt | 30 +-
icuSources/data/locales/en_US.txt | 16 +-
icuSources/data/locales/en_US_POSIX.txt | 17 +-
icuSources/data/locales/en_VI.txt | 16 +-
icuSources/data/locales/en_ZA.txt | 10 +-
icuSources/data/locales/en_ZW.txt | 10 +-
icuSources/data/locales/eo.txt | 36 +-
icuSources/data/locales/es.txt | 1410 +-
icuSources/data/locales/es_AR.txt | 20 +-
icuSources/data/locales/es_BO.txt | 20 +-
icuSources/data/locales/es_CL.txt | 38 +-
icuSources/data/locales/es_CO.txt | 20 +-
icuSources/data/locales/es_CR.txt | 20 +-
icuSources/data/locales/es_DO.txt | 20 +-
icuSources/data/locales/es_EC.txt | 26 +-
icuSources/data/locales/es_ES.txt | 27 +-
icuSources/data/locales/es_GT.txt | 20 +-
icuSources/data/locales/es_HN.txt | 20 +-
icuSources/data/locales/es_MX.txt | 20 +-
icuSources/data/locales/es_NI.txt | 20 +-
icuSources/data/locales/es_PA.txt | 20 +-
icuSources/data/locales/es_PE.txt | 27 +-
icuSources/data/locales/es_PR.txt | 20 +-
icuSources/data/locales/es_PY.txt | 24 +-
icuSources/data/locales/es_SV.txt | 20 +-
icuSources/data/locales/es_US.txt | 26 +-
icuSources/data/locales/es_UY.txt | 26 +-
icuSources/data/locales/es_VE.txt | 22 +-
icuSources/data/locales/et.txt | 48 +-
icuSources/data/locales/et_EE.txt | 10 +-
icuSources/data/locales/eu.txt | 40 +-
icuSources/data/locales/eu_ES.txt | 14 +-
icuSources/data/locales/fa.txt | 2212 +-
icuSources/data/locales/fa_AF.txt | 511 +-
icuSources/data/locales/fa_IR.txt | 32 +-
icuSources/data/locales/fi.txt | 1884 +-
icuSources/data/locales/fi_FI.txt | 21 +-
icuSources/data/locales/fo.txt | 31 +-
icuSources/data/locales/fo_FO.txt | 16 +-
icuSources/data/locales/fr.txt | 1571 +-
icuSources/data/locales/fr_BE.txt | 12 +-
icuSources/data/locales/fr_CA.txt | 16 +-
icuSources/data/locales/fr_CH.txt | 16 +-
icuSources/data/locales/fr_FR.txt | 14 +-
icuSources/data/locales/fr_LU.txt | 16 +-
icuSources/data/locales/ga.txt | 641 +-
icuSources/data/locales/ga_IE.txt | 14 +-
icuSources/data/locales/gl.txt | 28 +-
icuSources/data/locales/gl_ES.txt | 14 +-
icuSources/data/locales/gu.txt | 241 +-
icuSources/data/locales/gu_IN.txt | 22 +-
icuSources/data/locales/gv.txt | 10 +-
icuSources/data/locales/gv_GB.txt | 14 +-
icuSources/data/locales/haw.txt | 14 +-
icuSources/data/locales/haw_US.txt | 15 +-
icuSources/data/locales/he.txt | 1774 +-
icuSources/data/locales/he_IL.txt | 28 +-
icuSources/data/locales/hi.txt | 929 +-
icuSources/data/locales/hi_IN.txt | 22 +-
icuSources/data/locales/hr.txt | 376 +-
icuSources/data/locales/hr_HR.txt | 12 +-
icuSources/data/locales/hu.txt | 937 +-
icuSources/data/locales/hu_HU.txt | 14 +-
icuSources/data/locales/hy.txt | 631 +-
icuSources/data/locales/hy_AM.txt | 6 +-
icuSources/data/locales/hy_AM_REVISED.txt | 114 +-
icuSources/data/locales/id.txt | 38 +-
icuSources/data/locales/id_ID.txt | 6 +-
icuSources/data/locales/in.txt | 4 +-
icuSources/data/locales/in_ID.txt | 4 +-
icuSources/data/locales/is.txt | 371 +-
icuSources/data/locales/is_IS.txt | 18 +-
icuSources/data/locales/it.txt | 1016 +-
icuSources/data/locales/it_CH.txt | 14 +-
icuSources/data/locales/it_IT.txt | 10 +-
icuSources/data/locales/iw.txt | 4 +-
icuSources/data/locales/iw_IL.txt | 4 +-
icuSources/data/locales/ja.txt | 5486 +-
icuSources/data/locales/ja_JP.txt | 18 +-
icuSources/data/locales/ja_JP_TRADITIONAL.txt | 4 +-
icuSources/data/locales/kk.txt | 231 +-
icuSources/data/locales/kk_KZ.txt | 8 +-
icuSources/data/locales/kl.txt | 12 +-
icuSources/data/locales/kl_GL.txt | 12 +-
icuSources/data/locales/kn.txt | 202 +-
icuSources/data/locales/kn_IN.txt | 16 +-
icuSources/data/locales/ko.txt | 4703 +-
icuSources/data/locales/ko_KR.txt | 99 +-
icuSources/data/locales/kok.txt | 496 +-
icuSources/data/locales/kok_IN.txt | 16 +-
icuSources/data/locales/kw.txt | 8 +-
icuSources/data/locales/kw_GB.txt | 14 +-
icuSources/data/locales/lt.txt | 344 +-
icuSources/data/locales/lt_LT.txt | 134 +-
icuSources/data/locales/lv.txt | 39 +-
icuSources/data/locales/lv_LV.txt | 10 +-
icuSources/data/locales/mk.txt | 2497 +-
icuSources/data/locales/mk_MK.txt | 8 +-
icuSources/data/locales/ml.txt | 552 +-
icuSources/data/locales/ml_IN.txt | 26 +-
icuSources/data/locales/mr.txt | 491 +-
icuSources/data/locales/mr_IN.txt | 22 +-
icuSources/data/locales/ms.txt | 35 +-
icuSources/data/locales/ms_BN.txt | 8 +-
icuSources/data/locales/ms_MY.txt | 8 +-
icuSources/data/locales/mt.txt | 213 +-
icuSources/data/locales/mt_MT.txt | 18 +-
icuSources/data/locales/nb.txt | 1683 +-
icuSources/data/locales/nb_NO.txt | 29 +-
icuSources/data/locales/nl.txt | 1410 +-
icuSources/data/locales/nl_BE.txt | 27 +-
icuSources/data/locales/nl_NL.txt | 16 +-
icuSources/data/locales/nn.txt | 835 +-
icuSources/data/locales/nn_NO.txt | 20 +-
icuSources/data/locales/no.txt | 4 +-
icuSources/data/locales/no_NO.txt | 4 +-
icuSources/data/locales/no_NO_NY.txt | 4 +-
icuSources/data/locales/om.txt | 39 +-
icuSources/data/locales/om_ET.txt | 16 +-
icuSources/data/locales/om_KE.txt | 14 +-
icuSources/data/locales/or.txt | 168 +-
icuSources/data/locales/or_IN.txt | 25 +-
icuSources/data/locales/pa.txt | 264 +-
icuSources/data/locales/pa_IN.txt | 16 +-
icuSources/data/locales/pl.txt | 816 +-
icuSources/data/locales/pl_PL.txt | 497 +-
icuSources/data/locales/ps.txt | 456 +-
icuSources/data/locales/ps_AF.txt | 18 +-
icuSources/data/locales/pt.txt | 926 +-
icuSources/data/locales/pt_BR.txt | 141 +-
icuSources/data/locales/pt_PT.txt | 86 +-
icuSources/data/locales/resfiles.mk | 103 +-
icuSources/data/locales/reslocal.mk | 17 +-
icuSources/data/locales/ro.txt | 174 +-
icuSources/data/locales/ro_RO.txt | 10 +-
icuSources/data/locales/root.txt | 363 +-
icuSources/data/locales/ru.txt | 3880 +-
icuSources/data/locales/ru_RU.txt | 49 +-
icuSources/data/locales/ru_UA.txt | 24 +-
icuSources/data/locales/sh.txt | 7 +-
icuSources/data/locales/sh_CS.txt | 11 +
icuSources/data/locales/sh_YU.txt | 6 +-
icuSources/data/locales/sk.txt | 705 +-
icuSources/data/locales/sk_SK.txt | 24 +-
icuSources/data/locales/sl.txt | 197 +-
icuSources/data/locales/sl_SI.txt | 18 +-
icuSources/data/locales/so.txt | 40 +-
icuSources/data/locales/so_DJ.txt | 20 +-
icuSources/data/locales/so_ET.txt | 20 +-
icuSources/data/locales/so_KE.txt | 18 +-
icuSources/data/locales/so_SO.txt | 20 +-
icuSources/data/locales/sq.txt | 99 +-
icuSources/data/locales/sq_AL.txt | 10 +-
icuSources/data/locales/sr.txt | 1311 +-
icuSources/data/locales/sr_CS.txt | 11 +
icuSources/data/locales/sr_Cyrl.txt | 34 +-
icuSources/data/locales/sr_Cyrl_CS.txt | 17 +
icuSources/data/locales/sr_Cyrl_YU.txt | 6 +-
icuSources/data/locales/sr_Latn.txt | 340 +-
icuSources/data/locales/sr_Latn_CS.txt | 17 +
icuSources/data/locales/sr_Latn_YU.txt | 6 +-
icuSources/data/locales/sr_YU.txt | 6 +-
icuSources/data/locales/sv.txt | 1328 +-
icuSources/data/locales/sv_FI.txt | 108 +-
icuSources/data/locales/sv_SE.txt | 79 +-
icuSources/data/locales/sw.txt | 67 +-
icuSources/data/locales/sw_KE.txt | 18 +-
icuSources/data/locales/sw_TZ.txt | 10 +-
icuSources/data/locales/ta.txt | 843 +-
icuSources/data/locales/ta_IN.txt | 16 +-
icuSources/data/locales/te.txt | 311 +-
icuSources/data/locales/te_IN.txt | 16 +-
icuSources/data/locales/th.txt | 2112 +-
icuSources/data/locales/th_TH.txt | 57 +-
icuSources/data/locales/th_TH_TRADITIONAL.txt | 4 +-
icuSources/data/locales/ti.txt | 212 +-
icuSources/data/locales/ti_ER.txt | 196 +-
icuSources/data/locales/ti_ET.txt | 18 +-
icuSources/data/locales/tr.txt | 1115 +-
icuSources/data/locales/tr_TR.txt | 16 +-
icuSources/data/locales/uk.txt | 4345 +-
icuSources/data/locales/uk_UA.txt | 10 +-
icuSources/data/locales/ur.txt | 25 +
icuSources/data/locales/ur_IN.txt | 24 +
icuSources/data/locales/ur_PK.txt | 19 +
icuSources/data/locales/uz.txt | 198 +
icuSources/data/locales/uz_Cyrl.txt | 17 +
icuSources/data/locales/uz_Cyrl_UZ.txt | 19 +
icuSources/data/locales/uz_Latn.txt | 173 +
icuSources/data/locales/uz_Latn_UZ.txt | 19 +
icuSources/data/locales/uz_UZ.txt | 22 +
icuSources/data/locales/vi.txt | 27 +-
icuSources/data/locales/vi_VN.txt | 6 +-
icuSources/data/locales/zh.txt | 5032 +-
icuSources/data/locales/zh_CN.txt | 12 +-
icuSources/data/locales/zh_HK.txt | 12 +-
icuSources/data/locales/zh_Hans.txt | 889 +-
icuSources/data/locales/zh_Hans_CN.txt | 64 +-
icuSources/data/locales/zh_Hans_SG.txt | 93 +-
icuSources/data/locales/zh_Hant.txt | 4480 +-
icuSources/data/locales/zh_Hant_HK.txt | 76 +-
icuSources/data/locales/zh_Hant_MO.txt | 76 +-
icuSources/data/locales/zh_Hant_TW.txt | 82 +-
icuSources/data/locales/zh_MO.txt | 12 +-
icuSources/data/locales/zh_SG.txt | 12 +-
icuSources/data/locales/zh_TW.txt | 12 +-
icuSources/data/makedata.dsp | 178 -
icuSources/data/makedata.mak | 289 +-
icuSources/data/makedata.vcproj | 6 +
icuSources/data/mappings/convrtrs.txt | 443 +-
icuSources/data/mappings/gb18030.ucm | 4 +-
.../data/mappings/ibm-1375_P100-2003.ucm | 105 +-
.../data/mappings/ibm-1381_P110-1999.ucm | 9649 ---
.../data/mappings/ibm-4517_P100-2005.ucm | 470 +
.../data/mappings/ibm-737_P100-1997.ucm | 2 +-
.../data/mappings/ibm-775_P100-1996.ucm | 2 +-
...7_P100-1995.ucm => ibm-9005_X100-2005.ucm} | 204 +-
.../data/mappings/ibm-9067_X100-2005.ucm | 370 +
.../data/mappings/ibm-9448_X100-2005.ucm | 567 +
.../data/mappings/icu-internal-25546.ucm | 15 +-
icuSources/data/mappings/iso-8859_10-1998.ucm | 2 +
icuSources/data/mappings/iso-8859_11-2001.ucm | 301 +
icuSources/data/mappings/iso-8859_14-1998.ucm | 304 +
icuSources/data/mappings/macos-6_2-10.4.ucm | 338 +
icuSources/data/mappings/ucmebcdic.mk | 8 +-
icuSources/data/mappings/ucmfiles.mk | 15 +-
icuSources/data/mappings/ucmlocal.mk | 10 +-
icuSources/data/misc/CurrencyData.txt | 34 +-
icuSources/data/misc/icudata.rc | 14 +-
icuSources/data/misc/supplementalData.txt | 8028 ++
icuSources/data/misc/zoneinfo.txt | 1834 +-
icuSources/data/rbnf/ga.txt | 2 +-
icuSources/data/rbnf/he.txt | 393 +-
icuSources/data/rbnf/ja.txt | 64 +-
icuSources/data/rbnf/nl.txt | 8 +-
icuSources/data/rbnf/rbnffiles.mk | 2 +-
icuSources/data/rbnf/rbnflocal.mk | 8 +
icuSources/data/rbnf/uk.txt | 5 +-
icuSources/data/translit/Any_Accents.txt | 317 +-
icuSources/data/translit/Any_Publishing.txt | 29 +-
icuSources/data/translit/Arabic_Latin.txt | 231 +-
.../data/translit/Bengali_Devanagari.txt | 14 +
icuSources/data/translit/Bengali_Gujarati.txt | 14 +
icuSources/data/translit/Bengali_Gurmukhi.txt | 14 +
.../data/translit/Bengali_InterIndic.txt | 186 +-
icuSources/data/translit/Bengali_Kannada.txt | 14 +
icuSources/data/translit/Bengali_Latin.txt | 14 +
.../data/translit/Bengali_Malayalam.txt | 14 +
icuSources/data/translit/Bengali_Oriya.txt | 14 +
icuSources/data/translit/Bengali_Tamil.txt | 14 +
icuSources/data/translit/Bengali_Telugu.txt | 14 +
.../translit/CanadianAboriginal_Latin.txt | 191 +
icuSources/data/translit/Cyrillic_Latin.txt | 221 +-
.../data/translit/Devanagari_Bengali.txt | 14 +
.../data/translit/Devanagari_Gujarati.txt | 14 +
.../data/translit/Devanagari_Gurmukhi.txt | 14 +
.../data/translit/Devanagari_InterIndic.txt | 232 +-
.../data/translit/Devanagari_Kannada.txt | 14 +
icuSources/data/translit/Devanagari_Latin.txt | 14 +
.../data/translit/Devanagari_Malayalam.txt | 14 +
icuSources/data/translit/Devanagari_Oriya.txt | 14 +
icuSources/data/translit/Devanagari_Tamil.txt | 14 +
.../data/translit/Devanagari_Telugu.txt | 14 +
.../data/translit/Fullwidth_Halfwidth.txt | 532 +-
icuSources/data/translit/Georgian_Latin.txt | 44 +
icuSources/data/translit/Greek_Latin.txt | 370 +-
.../data/translit/Greek_Latin_UNGEGN.txt | 413 +-
icuSources/data/translit/Gujarati_Bengali.txt | 14 +
.../data/translit/Gujarati_Devanagari.txt | 14 +
.../data/translit/Gujarati_Gurmukhi.txt | 14 +
.../data/translit/Gujarati_InterIndic.txt | 182 +-
icuSources/data/translit/Gujarati_Kannada.txt | 14 +
icuSources/data/translit/Gujarati_Latin.txt | 14 +
.../data/translit/Gujarati_Malayalam.txt | 14 +
icuSources/data/translit/Gujarati_Oriya.txt | 14 +
icuSources/data/translit/Gujarati_Tamil.txt | 14 +
icuSources/data/translit/Gujarati_Telugu.txt | 14 +
icuSources/data/translit/Gurmukhi_Bengali.txt | 14 +
.../data/translit/Gurmukhi_Devanagari.txt | 14 +
.../data/translit/Gurmukhi_Gujarati.txt | 14 +
.../data/translit/Gurmukhi_InterIndic.txt | 158 +-
icuSources/data/translit/Gurmukhi_Kannada.txt | 14 +
icuSources/data/translit/Gurmukhi_Latin.txt | 14 +
.../data/translit/Gurmukhi_Malayalam.txt | 14 +
icuSources/data/translit/Gurmukhi_Oriya.txt | 14 +
icuSources/data/translit/Gurmukhi_Tamil.txt | 14 +
icuSources/data/translit/Gurmukhi_Telugu.txt | 14 +
icuSources/data/translit/Han_Latin.txt | 2849 +-
icuSources/data/translit/Han_Spacedhan.txt | 29 +-
icuSources/data/translit/Hangul_Latin.txt | 13 +
icuSources/data/translit/Hebrew_Latin.txt | 116 +-
.../data/translit/Hiragana_Katakana.txt | 342 +-
icuSources/data/translit/Hiragana_Latin.txt | 20 +-
.../data/translit/InterIndic_Bengali.txt | 255 +-
.../data/translit/InterIndic_Devanagari.txt | 308 +-
.../data/translit/InterIndic_Gujarati.txt | 266 +-
.../data/translit/InterIndic_Gurmukhi.txt | 289 +-
.../data/translit/InterIndic_Kannada.txt | 271 +-
icuSources/data/translit/InterIndic_Latin.txt | 991 +-
.../data/translit/InterIndic_Malayalam.txt | 271 +-
icuSources/data/translit/InterIndic_Oriya.txt | 265 +-
icuSources/data/translit/InterIndic_Tamil.txt | 286 +-
.../data/translit/InterIndic_Telugu.txt | 270 +-
icuSources/data/translit/Jamo_Latin.txt | 13 +
icuSources/data/translit/Kannada_Bengali.txt | 14 +
.../data/translit/Kannada_Devanagari.txt | 14 +
icuSources/data/translit/Kannada_Gujarati.txt | 14 +
icuSources/data/translit/Kannada_Gurmukhi.txt | 14 +
.../data/translit/Kannada_InterIndic.txt | 176 +-
icuSources/data/translit/Kannada_Latin.txt | 14 +
.../data/translit/Kannada_Malayalam.txt | 14 +
icuSources/data/translit/Kannada_Oriya.txt | 14 +
icuSources/data/translit/Kannada_Tamil.txt | 14 +
icuSources/data/translit/Kannada_Telugu.txt | 14 +
icuSources/data/translit/Latin_Armenian.txt | 91 +
icuSources/data/translit/Latin_Bengali.txt | 15 +
.../data/translit/Latin_ConjoiningJamo.txt | 251 +
icuSources/data/translit/Latin_Devanagari.txt | 15 +
icuSources/data/translit/Latin_Ethiopic.txt | 353 +
icuSources/data/translit/Latin_Gujarati.txt | 15 +
icuSources/data/translit/Latin_Gurmukhi.txt | 15 +
icuSources/data/translit/Latin_Hangul.txt | 14 +
icuSources/data/translit/Latin_InterIndic.txt | 725 +-
icuSources/data/translit/Latin_Jamo.txt | 536 +-
icuSources/data/translit/Latin_Kannada.txt | 15 +
icuSources/data/translit/Latin_Katakana.txt | 379 +-
icuSources/data/translit/Latin_Malayalam.txt | 15 +
.../data/translit/Latin_NumericPinyin.txt | 39 +-
icuSources/data/translit/Latin_Oriya.txt | 15 +
icuSources/data/translit/Latin_Tamil.txt | 15 +
icuSources/data/translit/Latin_Telugu.txt | 15 +
icuSources/data/translit/Latin_Thai.txt | 14 +
.../data/translit/Malayalam_Bengali.txt | 14 +
.../data/translit/Malayalam_Devanagari.txt | 14 +
.../data/translit/Malayalam_Gujarati.txt | 14 +
.../data/translit/Malayalam_Gurmukhi.txt | 14 +
.../data/translit/Malayalam_InterIndic.txt | 161 +-
.../data/translit/Malayalam_Kannada.txt | 14 +
icuSources/data/translit/Malayalam_Latin.txt | 14 +
icuSources/data/translit/Malayalam_Oriya.txt | 14 +
icuSources/data/translit/Malayalam_Tamil.txt | 14 +
icuSources/data/translit/Malayalam_Telugu.txt | 14 +
icuSources/data/translit/Oriya_Bengali.txt | 14 +
icuSources/data/translit/Oriya_Devanagari.txt | 14 +
icuSources/data/translit/Oriya_Gujarati.txt | 14 +
icuSources/data/translit/Oriya_Gurmukhi.txt | 14 +
icuSources/data/translit/Oriya_InterIndic.txt | 169 +-
icuSources/data/translit/Oriya_Kannada.txt | 14 +
icuSources/data/translit/Oriya_Latin.txt | 14 +
icuSources/data/translit/Oriya_Malayalam.txt | 14 +
icuSources/data/translit/Oriya_Tamil.txt | 14 +
icuSources/data/translit/Oriya_Telugu.txt | 14 +
.../data/translit/Pinyin_NumericPinyin.txt | 14 +
.../data/translit/Simplified_Traditional.txt | Bin 0 -> 45230 bytes
icuSources/data/translit/Spacedhan_Han.txt | 10 +
icuSources/data/translit/Syriac_Latin.txt | 56 +
icuSources/data/translit/Tamil_Bengali.txt | 14 +
icuSources/data/translit/Tamil_Devanagari.txt | 14 +
icuSources/data/translit/Tamil_Gujarati.txt | 14 +
icuSources/data/translit/Tamil_Gurmukhi.txt | 14 +
icuSources/data/translit/Tamil_InterIndic.txt | 143 +-
icuSources/data/translit/Tamil_Kannada.txt | 14 +
icuSources/data/translit/Tamil_Latin.txt | 14 +
icuSources/data/translit/Tamil_Malayalam.txt | 14 +
icuSources/data/translit/Tamil_Oriya.txt | 14 +
icuSources/data/translit/Tamil_Telugu.txt | 14 +
icuSources/data/translit/Telugu_Bengali.txt | 14 +
.../data/translit/Telugu_Devanagari.txt | 14 +
icuSources/data/translit/Telugu_Gujarati.txt | 14 +
icuSources/data/translit/Telugu_Gurmukhi.txt | 14 +
.../data/translit/Telugu_InterIndic.txt | 156 +-
icuSources/data/translit/Telugu_Kannada.txt | 14 +
icuSources/data/translit/Telugu_Latin.txt | 14 +
icuSources/data/translit/Telugu_Malayalam.txt | 14 +
icuSources/data/translit/Telugu_Oriya.txt | 14 +
icuSources/data/translit/Telugu_Tamil.txt | 14 +
icuSources/data/translit/Thaana_Latin.txt | 440 +
.../data/translit/ThaiLogical_Latin.txt | 193 +-
icuSources/data/translit/Thai_Latin.txt | 16 +
icuSources/data/translit/Thai_ThaiLogical.txt | 32 +-
icuSources/data/translit/Thai_ThaiSemi.txt | 22 +-
icuSources/data/translit/Tone_Digit.txt | 11 -
icuSources/data/translit/el.txt | 2 +-
icuSources/data/translit/en.txt | 2 +-
icuSources/data/translit/root.txt | 1430 +-
icuSources/data/translit/trnsfiles.mk | 4 +-
icuSources/data/unidata/ApplePUApatch.txt | 365 +
icuSources/data/unidata/BidiMirroring.txt | 71 +-
icuSources/data/unidata/Blocks.txt | 54 +-
icuSources/data/unidata/CaseFolding.txt | 177 +-
icuSources/data/unidata/DerivedAge.txt | 145 +-
icuSources/data/unidata/DerivedBidiClass.txt | 380 +-
.../data/unidata/DerivedCoreProperties.txt | 1255 +-
.../data/unidata/DerivedJoiningGroup.txt | 53 +-
.../data/unidata/DerivedJoiningType.txt | 69 +-
.../unidata/DerivedNormalizationProps.txt | 130 +-
.../data/unidata/DerivedNumericValues.txt | 322 +-
icuSources/data/unidata/EastAsianWidth.txt | 200 +-
icuSources/data/unidata/FractionalUCA.txt | 32673 ++++----
.../data/unidata/GraphemeBreakProperty.txt | 1042 +
icuSources/data/unidata/LineBreak.txt | 1186 +-
.../data/unidata/NormalizationCorrections.txt | 15 +-
icuSources/data/unidata/NormalizationTest.txt | 524 +-
icuSources/data/unidata/PropList.txt | 1628 +-
icuSources/data/unidata/PropertyAliases.txt | 18 +-
.../data/unidata/PropertyValueAliases.txt | 103 +-
icuSources/data/unidata/Scripts.txt | 2441 +-
.../data/unidata/SentenceBreakProperty.txt | 1664 +
icuSources/data/unidata/SpecialCasing.txt | 34 +-
icuSources/data/unidata/UCARules.txt | 32207 ++++----
icuSources/data/unidata/UnicodeData.txt | 2904 +-
icuSources/data/unidata/WordBreakProperty.txt | 521 +
.../unidata/base_unidata/DerivedBidiClass.txt | 1452 +
.../base_unidata/DerivedCoreProperties.txt | 5138 ++
.../base_unidata/DerivedNumericValues.txt | 1423 +
.../unidata/base_unidata/EastAsianWidth.txt | 782 +
.../base_unidata/GraphemeBreakProperty.txt | 1039 +
.../data/unidata/base_unidata/LineBreak.txt | 1968 +
.../data/unidata/base_unidata/Scripts.txt | 1538 +
.../data/unidata/base_unidata/UnicodeData.txt | 17720 +++++
icuSources/data/unidata/changes.txt | 202 +
icuSources/data/xml/brkitr/en.xml | 18 +
icuSources/data/xml/brkitr/en_US.xml | 19 +
icuSources/data/xml/brkitr/en_US_POSIX.xml | 27 +
icuSources/data/xml/brkitr/ja.xml | 25 +
icuSources/data/xml/brkitr/root.xml | 32 +
icuSources/data/xml/collation/ar.xml | 19 +
icuSources/data/xml/collation/be.xml | 19 +
icuSources/data/xml/collation/bg.xml | 19 +
icuSources/data/xml/collation/ca.xml | 19 +
icuSources/data/xml/collation/cs.xml | 19 +
icuSources/data/xml/collation/da.xml | 19 +
icuSources/data/xml/collation/de.xml | 19 +
icuSources/data/xml/collation/dz.xml | 19 +
icuSources/data/xml/collation/el.xml | 19 +
icuSources/data/xml/collation/en.xml | 19 +
icuSources/data/xml/collation/en_BE.xml | 20 +
icuSources/data/xml/collation/eo.xml | 19 +
icuSources/data/xml/collation/es.xml | 19 +
icuSources/data/xml/collation/et.xml | 19 +
icuSources/data/xml/collation/fa.xml | 19 +
icuSources/data/xml/collation/fa_AF.xml | 20 +
icuSources/data/xml/collation/fi.xml | 19 +
icuSources/data/xml/collation/fo.xml | 19 +
icuSources/data/xml/collation/fr.xml | 19 +
icuSources/data/xml/collation/gu.xml | 19 +
icuSources/data/xml/collation/he.xml | 19 +
icuSources/data/xml/collation/hi.xml | 19 +
icuSources/data/xml/collation/hr.xml | 19 +
icuSources/data/xml/collation/hu.xml | 19 +
icuSources/data/xml/collation/is.xml | 19 +
icuSources/data/xml/collation/it.xml | 19 +
icuSources/data/xml/collation/ja.xml | 19 +
icuSources/data/xml/collation/kk.xml | 19 +
icuSources/data/xml/collation/kl.xml | 19 +
icuSources/data/xml/collation/kn.xml | 19 +
icuSources/data/xml/collation/ko.xml | 19 +
icuSources/data/xml/collation/lt.xml | 19 +
icuSources/data/xml/collation/lv.xml | 19 +
icuSources/data/xml/collation/mk.xml | 19 +
icuSources/data/xml/collation/ml.xml | 18 +
icuSources/data/xml/collation/mr.xml | 19 +
icuSources/data/xml/collation/mt.xml | 19 +
icuSources/data/xml/collation/nb.xml | 19 +
icuSources/data/xml/collation/nn.xml | 19 +
icuSources/data/xml/collation/om.xml | 19 +
icuSources/data/xml/collation/or.xml | 17 +
icuSources/data/xml/collation/pa.xml | 19 +
icuSources/data/xml/collation/pl.xml | 19 +
icuSources/data/xml/collation/ps.xml | 19 +
icuSources/data/xml/collation/ro.xml | 19 +
icuSources/data/xml/collation/root.xml | 25 +
icuSources/data/xml/collation/ru.xml | 19 +
icuSources/data/xml/collation/sh.xml | 19 +
icuSources/data/xml/collation/sk.xml | 19 +
icuSources/data/xml/collation/sl.xml | 19 +
icuSources/data/xml/collation/sq.xml | 19 +
icuSources/data/xml/collation/sr.xml | 19 +
icuSources/data/xml/collation/sv.xml | 19 +
icuSources/data/xml/collation/ta.xml | 19 +
icuSources/data/xml/collation/te.xml | 19 +
icuSources/data/xml/collation/th.xml | 19 +
icuSources/data/xml/collation/tr.xml | 19 +
icuSources/data/xml/collation/uk.xml | 19 +
icuSources/data/xml/collation/vi.xml | 19 +
icuSources/data/xml/collation/zh.xml | 18 +
icuSources/data/xml/collation/zh_HK.xml | 19 +
icuSources/data/xml/collation/zh_Hant.xml | 19 +
icuSources/data/xml/collation/zh_MO.xml | 19 +
icuSources/data/xml/collation/zh_TW.xml | 19 +
.../data/xml/collation/zh_TW_STROKE.xml | 20 +
icuSources/data/xml/experimental/aa.txt | 202 +
icuSources/data/xml/experimental/aa_DJ.txt | 20 +
icuSources/data/xml/experimental/aa_ER.txt | 42 +
.../data/xml/experimental/aa_ER_SAAHO.txt | 40 +
icuSources/data/xml/experimental/aa_ET.txt | 48 +
icuSources/data/xml/experimental/bs.txt | 111 +
icuSources/data/xml/experimental/bs_BA.txt | 14 +
icuSources/data/xml/experimental/byn.txt | 441 +
icuSources/data/xml/experimental/byn_ER.txt | 35 +
icuSources/data/xml/experimental/de_LI.txt | 28 +
icuSources/data/xml/experimental/dv.txt | 50 +
icuSources/data/xml/experimental/dv_MV.txt | 33 +
icuSources/data/xml/experimental/dz.txt | 278 +
icuSources/data/xml/experimental/dz_BT.txt | 37 +
icuSources/data/xml/experimental/el_CY.txt | 17 +
icuSources/data/xml/experimental/en_AS.txt | 20 +
icuSources/data/xml/experimental/en_BZ.txt | 33 +
icuSources/data/xml/experimental/en_GU.txt | 20 +
icuSources/data/xml/experimental/en_JM.txt | 17 +
icuSources/data/xml/experimental/en_MH.txt | 20 +
icuSources/data/xml/experimental/en_MP.txt | 20 +
icuSources/data/xml/experimental/en_TT.txt | 17 +
icuSources/data/xml/experimental/en_UM.txt | 20 +
icuSources/data/xml/experimental/fr_MC.txt | 17 +
icuSources/data/xml/experimental/gez.txt | 436 +
icuSources/data/xml/experimental/gez_ER.txt | 59 +
icuSources/data/xml/experimental/gez_ET.txt | 55 +
icuSources/data/xml/experimental/haw.txt | 101 +
icuSources/data/xml/experimental/haw_US.txt | 40 +
icuSources/data/xml/experimental/iu.txt | 82 +
icuSources/data/xml/experimental/ka.txt | 234 +
icuSources/data/xml/experimental/ka_GE.txt | 17 +
icuSources/data/xml/experimental/km.txt | 427 +
icuSources/data/xml/experimental/km_KH.txt | 26 +
icuSources/data/xml/experimental/ky.txt | 44 +
icuSources/data/xml/experimental/ky_KG.txt | 17 +
icuSources/data/xml/experimental/lo.txt | 466 +
icuSources/data/xml/experimental/lo_LA.txt | 23 +
icuSources/data/xml/experimental/mn.txt | 118 +
icuSources/data/xml/experimental/mn_MN.txt | 17 +
icuSources/data/xml/experimental/sa.txt | 50 +
.../ar_IN.txt => xml/experimental/sa_IN.txt} | 27 +-
icuSources/data/xml/experimental/sh_BA.txt | 11 +
icuSources/data/xml/experimental/sid.txt | 196 +
icuSources/data/xml/experimental/sid_ET.txt | 20 +
icuSources/data/xml/experimental/sr_BA.txt | 11 +
.../data/xml/experimental/sr_Cyrl_BA.txt | 95 +
.../data/xml/experimental/sr_Latn_BA.txt | 81 +
icuSources/data/xml/experimental/syr.txt | 52 +
icuSources/data/xml/experimental/syr_SY.txt | 39 +
icuSources/data/xml/experimental/tig.txt | 441 +
icuSources/data/xml/experimental/tig_ER.txt | 35 +
icuSources/data/xml/experimental/tt.txt | 44 +
icuSources/data/xml/experimental/tt_RU.txt | 39 +
icuSources/data/xml/experimental/uz_AF.txt | 11 +
icuSources/data/xml/experimental/uz_Arab.txt | 141 +
.../data/xml/experimental/uz_Arab_AF.txt | 19 +
icuSources/data/xml/experimental/wal.txt | 307 +
icuSources/data/xml/experimental/wal_ET.txt | 49 +
icuSources/data/xml/main/aa.xml | 25 +
icuSources/data/xml/main/af.xml | 25 +
icuSources/data/xml/main/am.xml | 25 +
icuSources/data/xml/main/ar.xml | 25 +
icuSources/data/xml/main/as.xml | 25 +
icuSources/data/xml/main/az.xml | 25 +
icuSources/data/xml/main/az_AZ.xml | 19 +
icuSources/data/xml/main/az_Cyrl.xml | 26 +
icuSources/data/xml/main/az_Latn.xml | 26 +
icuSources/data/xml/main/be.xml | 25 +
icuSources/data/xml/main/bg.xml | 25 +
icuSources/data/xml/main/bn.xml | 25 +
icuSources/data/xml/main/bs.xml | 25 +
icuSources/data/xml/main/byn.xml | 25 +
icuSources/data/xml/main/ca.xml | 25 +
icuSources/data/xml/main/cs.xml | 25 +
icuSources/data/xml/main/cy.xml | 25 +
icuSources/data/xml/main/da.xml | 25 +
icuSources/data/xml/main/de.xml | 25 +
icuSources/data/xml/main/dv.xml | 25 +
icuSources/data/xml/main/dz.xml | 25 +
icuSources/data/xml/main/el.xml | 25 +
icuSources/data/xml/main/en.xml | 25 +
icuSources/data/xml/main/en_US_POSIX.xml | 20 +
icuSources/data/xml/main/eo.xml | 25 +
icuSources/data/xml/main/es.xml | 25 +
icuSources/data/xml/main/et.xml | 25 +
icuSources/data/xml/main/eu.xml | 25 +
icuSources/data/xml/main/fa.xml | 25 +
icuSources/data/xml/main/fi.xml | 25 +
icuSources/data/xml/main/fo.xml | 25 +
icuSources/data/xml/main/fr.xml | 25 +
icuSources/data/xml/main/ga.xml | 25 +
icuSources/data/xml/main/gez.xml | 25 +
icuSources/data/xml/main/gl.xml | 25 +
icuSources/data/xml/main/gu.xml | 25 +
icuSources/data/xml/main/gv.xml | 25 +
icuSources/data/xml/main/haw.xml | 25 +
icuSources/data/xml/main/he.xml | 25 +
icuSources/data/xml/main/hi.xml | 25 +
icuSources/data/xml/main/hr.xml | 25 +
icuSources/data/xml/main/hu.xml | 25 +
icuSources/data/xml/main/hy.xml | 25 +
icuSources/data/xml/main/id.xml | 25 +
icuSources/data/xml/main/is.xml | 25 +
icuSources/data/xml/main/it.xml | 25 +
icuSources/data/xml/main/iu.xml | 25 +
icuSources/data/xml/main/iw.xml | 25 +
icuSources/data/xml/main/ja.xml | 27 +
icuSources/data/xml/main/ka.xml | 25 +
icuSources/data/xml/main/kk.xml | 25 +
icuSources/data/xml/main/kl.xml | 25 +
icuSources/data/xml/main/km.xml | 25 +
icuSources/data/xml/main/kn.xml | 25 +
icuSources/data/xml/main/ko.xml | 26 +
icuSources/data/xml/main/kok.xml | 25 +
icuSources/data/xml/main/kw.xml | 25 +
icuSources/data/xml/main/ky.xml | 25 +
icuSources/data/xml/main/lo.xml | 25 +
icuSources/data/xml/main/lt.xml | 25 +
icuSources/data/xml/main/lv.xml | 25 +
icuSources/data/xml/main/mk.xml | 25 +
icuSources/data/xml/main/ml.xml | 25 +
icuSources/data/xml/main/mn.xml | 25 +
icuSources/data/xml/main/mr.xml | 25 +
icuSources/data/xml/main/ms.xml | 25 +
icuSources/data/xml/main/mt.xml | 25 +
icuSources/data/xml/main/nb.xml | 25 +
icuSources/data/xml/main/nl.xml | 25 +
icuSources/data/xml/main/nn.xml | 25 +
icuSources/data/xml/main/no.xml | 25 +
icuSources/data/xml/main/om.xml | 25 +
icuSources/data/xml/main/or.xml | 25 +
icuSources/data/xml/main/pa.xml | 25 +
icuSources/data/xml/main/pl.xml | 25 +
icuSources/data/xml/main/ps.xml | 25 +
icuSources/data/xml/main/pt.xml | 25 +
icuSources/data/xml/main/ro.xml | 25 +
icuSources/data/xml/main/root.xml | 56 +
icuSources/data/xml/main/ru.xml | 25 +
icuSources/data/xml/main/sa.xml | 25 +
icuSources/data/xml/main/sh.xml | 17 +
icuSources/data/xml/main/sid.xml | 25 +
icuSources/data/xml/main/sk.xml | 25 +
icuSources/data/xml/main/sl.xml | 25 +
icuSources/data/xml/main/so.xml | 25 +
icuSources/data/xml/main/sq.xml | 25 +
icuSources/data/xml/main/sr.xml | 25 +
icuSources/data/xml/main/sr_Cyrl.xml | 25 +
icuSources/data/xml/main/sr_Latn.xml | 26 +
icuSources/data/xml/main/sv.xml | 25 +
icuSources/data/xml/main/sw.xml | 25 +
icuSources/data/xml/main/syr.xml | 25 +
icuSources/data/xml/main/ta.xml | 25 +
icuSources/data/xml/main/te.xml | 25 +
icuSources/data/xml/main/th.xml | 25 +
icuSources/data/xml/main/ti.xml | 25 +
icuSources/data/xml/main/tig.xml | 25 +
icuSources/data/xml/main/tr.xml | 25 +
icuSources/data/xml/main/tt.xml | 25 +
icuSources/data/xml/main/uk.xml | 25 +
icuSources/data/xml/main/ur.xml | 25 +
icuSources/data/xml/main/ur_IN.xml | 18 +
icuSources/data/xml/main/uz.xml | 25 +
icuSources/data/xml/main/uz_Arab.xml | 27 +
icuSources/data/xml/main/uz_Cyrl.xml | 26 +
icuSources/data/xml/main/uz_Latn.xml | 26 +
icuSources/data/xml/main/uz_UZ.xml | 19 +
icuSources/data/xml/main/vi.xml | 25 +
icuSources/data/xml/main/wal.xml | 25 +
icuSources/data/xml/main/zh.xml | 25 +
icuSources/data/xml/main/zh_Hans.xml | 27 +
icuSources/data/xml/main/zh_Hant.xml | 27 +
icuSources/extra/uconv/Makefile.in | 28 +-
icuSources/extra/uconv/samples/eucJP.txt | 74 +-
.../extra/uconv/samples/hangul-eucKR.txt | 4 +-
.../extra/uconv/samples/hania-eucKR.txt | 2 +-
icuSources/extra/uconv/samples/iso8859-1.txt | 18 -
icuSources/extra/uconv/samples/koi8r.txt | 12 +-
.../extra/uconv/samples/utf8/armenian.txt | 8 +-
.../extra/uconv/samples/utf8/banviet.txt | 22 +-
.../uconv/samples/utf8/chinese-ulysses.txt | 444 +-
icuSources/extra/uconv/samples/utf8/greek.txt | 88 +-
.../extra/uconv/samples/utf8/hangul.txt | 4 +-
icuSources/extra/uconv/samples/utf8/hania.txt | 2 +-
icuSources/extra/uconv/samples/utf8/jap.txt | 74 +-
.../extra/uconv/samples/utf8/korean.txt | 40 +-
icuSources/extra/uconv/samples/utf8/linji.txt | 1834 +-
icuSources/extra/uconv/samples/utf8/many.txt | 36 +-
.../extra/uconv/samples/utf8/maopoem.txt | 46 +-
.../extra/uconv/samples/utf8/russian.txt | 12 +-
.../uconv/samples/utf8/simplechinese.txt | 28 +-
.../extra/uconv/samples/utf8/utf-8-demo.txt | 117 +-
icuSources/extra/uconv/uconv.1.in | 20 +-
icuSources/extra/uconv/uconv.cpp | 22 +-
icuSources/extra/uconv/uconv.dsp | 281 -
icuSources/extra/uconv/uconv.vcproj | 16 +-
icuSources/i18n/Makefile.in | 49 +-
icuSources/i18n/anytrans.cpp | 24 +-
icuSources/i18n/anytrans.h | 18 +-
icuSources/i18n/astro.cpp | 48 +-
icuSources/i18n/astro.h | 22 +-
icuSources/i18n/calendar.cpp | 190 +-
icuSources/i18n/casetrn.cpp | 16 +-
icuSources/i18n/casetrn.h | 9 +-
icuSources/i18n/choicfmt.cpp | 33 +-
icuSources/i18n/coleitr.cpp | 543 +-
icuSources/i18n/coll.cpp | 12 +-
icuSources/i18n/cpdtrans.cpp | 87 +-
icuSources/i18n/cpdtrans.h | 36 +-
icuSources/i18n/csdetect.cpp | 387 +
icuSources/i18n/csdetect.h | 56 +
icuSources/i18n/csmatch.cpp | 61 +
icuSources/i18n/csmatch.h | 44 +
icuSources/i18n/csr2022.cpp | 172 +
icuSources/i18n/csr2022.h | 86 +
icuSources/i18n/csrecog.cpp | 28 +
icuSources/i18n/csrecog.h | 42 +
icuSources/i18n/csrmbcs.cpp | 517 +
icuSources/i18n/csrmbcs.h | 205 +
icuSources/i18n/csrsbcs.cpp | 1099 +
icuSources/i18n/csrsbcs.h | 364 +
icuSources/i18n/csrucode.cpp | 146 +
icuSources/i18n/csrucode.h | 106 +
icuSources/i18n/csrutf8.cpp | 111 +
icuSources/i18n/csrutf8.h | 42 +
icuSources/i18n/datefmt.cpp | 26 +-
icuSources/i18n/dcfmtsym.cpp | 44 +-
icuSources/i18n/decimfmt.cpp | 47 +-
icuSources/i18n/decimfmt.cpp.fixed | 3741 +
icuSources/i18n/digitlst.cpp | 4 +-
icuSources/i18n/digitlst.h | 8 +-
icuSources/i18n/dtfmtsym.cpp | 1442 +-
icuSources/i18n/esctrn.cpp | 28 +-
icuSources/i18n/esctrn.h | 19 +-
icuSources/i18n/fmtable.cpp | 33 +-
icuSources/i18n/fmtable_cnv.cpp | 44 +
icuSources/i18n/funcrepl.h | 4 +
icuSources/i18n/gregocal.cpp | 4 +-
icuSources/i18n/gregoimp.cpp | 31 +-
icuSources/i18n/gregoimp.h | 43 +-
icuSources/i18n/hebrwcal.cpp | 21 +-
icuSources/i18n/hebrwcal.h | 10 +-
icuSources/i18n/i18n.dsp | 2676 -
icuSources/i18n/i18n.rc | 12 +-
icuSources/i18n/i18n.vcproj | 161 +-
icuSources/i18n/inputext.cpp | 162 +
icuSources/i18n/inputext.h | 59 +
icuSources/i18n/japancal.cpp | 8 +-
icuSources/i18n/msgfmt.cpp | 28 +-
icuSources/i18n/name2uni.cpp | 46 +-
icuSources/i18n/name2uni.h | 6 +-
icuSources/i18n/nfrlist.h | 4 +-
icuSources/i18n/nfrs.cpp | 14 +-
icuSources/i18n/nfrs.h | 2 +-
icuSources/i18n/nfrule.cpp | 25 +-
icuSources/i18n/nfrule.h | 5 +-
icuSources/i18n/nfsubs.cpp | 131 +-
icuSources/i18n/nfsubs.h | 27 +-
icuSources/i18n/nortrans.cpp | 6 +-
icuSources/i18n/nortrans.h | 8 +-
icuSources/i18n/nultrans.cpp | 10 +-
icuSources/i18n/nultrans.h | 18 +-
icuSources/i18n/numfmt.cpp | 109 +-
icuSources/i18n/olsontz.cpp | 87 +-
icuSources/i18n/olsontz.h | 4 +-
icuSources/i18n/quant.h | 6 +-
icuSources/i18n/rbnf.cpp | 46 +-
icuSources/i18n/rbt.cpp | 11 +-
icuSources/i18n/rbt_data.cpp | 39 +-
icuSources/i18n/rbt_data.h | 18 +-
icuSources/i18n/rbt_pars.cpp | 574 +-
icuSources/i18n/rbt_pars.h | 102 +-
icuSources/i18n/rbt_set.cpp | 6 +-
icuSources/i18n/regexcmp.cpp | 111 +-
icuSources/i18n/regexcmp.h | 11 +-
icuSources/i18n/regeximp.h | 8 +-
icuSources/i18n/rematch.cpp | 30 +-
icuSources/i18n/remtrans.cpp | 33 +-
icuSources/i18n/remtrans.h | 12 +-
icuSources/i18n/repattrn.cpp | 17 +-
icuSources/i18n/search.cpp | 3 +-
icuSources/i18n/simpletz.cpp | 7 +-
icuSources/i18n/smpdtfmt.cpp | 614 +-
icuSources/i18n/sortkey.cpp | 10 +-
icuSources/i18n/stsearch.cpp | 199 +-
icuSources/i18n/tblcoll.cpp | 116 +-
icuSources/i18n/timezone.cpp | 135 +-
icuSources/i18n/titletrn.cpp | 13 +-
icuSources/i18n/titletrn.h | 9 +-
icuSources/i18n/tolowtrn.cpp | 4 +-
icuSources/i18n/tolowtrn.h | 9 +-
icuSources/i18n/toupptrn.cpp | 4 +-
icuSources/i18n/toupptrn.h | 9 +-
icuSources/i18n/translit.cpp | 292 +-
icuSources/i18n/transreg.cpp | 281 +-
icuSources/i18n/transreg.h | 16 +-
icuSources/i18n/tridpars.cpp | 32 +-
icuSources/i18n/tridpars.h | 14 +-
icuSources/i18n/ucal.cpp | 29 +-
icuSources/i18n/ucln_in.c | 6 +-
icuSources/i18n/ucln_in.h | 3 +-
icuSources/i18n/ucol.cpp | 2264 +-
icuSources/i18n/ucol_bld.cpp | 156 +-
icuSources/i18n/ucol_bld.h | 4 +-
icuSources/i18n/ucol_cnt.cpp | 337 +-
icuSources/i18n/ucol_cnt.h | 6 +-
icuSources/i18n/ucol_elm.cpp | 186 +-
icuSources/i18n/ucol_elm.h | 14 +-
icuSources/i18n/ucol_imp.h | 32 +-
icuSources/i18n/ucol_res.cpp | 719 +
icuSources/i18n/ucol_sit.cpp | 225 +-
icuSources/i18n/ucol_tok.cpp | 12 +-
icuSources/i18n/ucol_tok.h | 4 +-
icuSources/i18n/ucol_wgt.c | 9 +-
icuSources/i18n/ucoleitr.cpp | 29 +-
icuSources/i18n/ucsdet.cpp | 234 +
icuSources/i18n/ucurr.cpp | 378 +-
icuSources/i18n/udat.cpp | 336 +-
icuSources/i18n/ulocdata.c | 155 +-
icuSources/i18n/umsg.cpp | 108 +-
icuSources/i18n/unesctrn.cpp | 36 +-
icuSources/i18n/unesctrn.h | 23 +-
icuSources/i18n/uni2name.cpp | 2 +-
icuSources/i18n/uni2name.h | 6 +-
icuSources/i18n/unicode/calendar.h | 29 +-
icuSources/i18n/unicode/choicfmt.h | 13 +-
icuSources/i18n/unicode/coleitr.h | 32 +-
icuSources/i18n/unicode/coll.h | 29 +-
icuSources/i18n/unicode/curramt.h | 30 +-
icuSources/i18n/unicode/currunit.h | 27 +-
icuSources/i18n/unicode/datefmt.h | 7 +-
icuSources/i18n/unicode/dcfmtsym.h | 28 +-
icuSources/i18n/unicode/decimfmt.h | 42 +-
icuSources/i18n/unicode/dtfmtsym.h | 322 +-
icuSources/i18n/unicode/fieldpos.h | 9 +-
icuSources/i18n/unicode/fmtable.h | 61 +-
icuSources/i18n/unicode/format.h | 12 +-
icuSources/i18n/unicode/gregocal.h | 12 +-
icuSources/i18n/unicode/measfmt.h | 16 +-
icuSources/i18n/unicode/measunit.h | 17 +-
icuSources/i18n/unicode/measure.h | 27 +-
icuSources/i18n/unicode/msgfmt.h | 45 +-
icuSources/i18n/unicode/numfmt.h | 33 +-
icuSources/i18n/unicode/rbnf.h | 39 +-
icuSources/i18n/unicode/regex.h | 14 +-
icuSources/i18n/unicode/search.h | 8 +-
icuSources/i18n/unicode/simpletz.h | 11 +-
icuSources/i18n/unicode/smpdtfmt.h | 51 +-
icuSources/i18n/unicode/sortkey.h | 14 +-
icuSources/i18n/unicode/stsearch.h | 25 +-
icuSources/i18n/unicode/tblcoll.h | 67 +-
icuSources/i18n/unicode/timezone.h | 28 +-
icuSources/i18n/unicode/translit.h | 56 +-
icuSources/i18n/unicode/ucal.h | 290 +-
icuSources/i18n/unicode/ucol.h | 184 +-
icuSources/i18n/unicode/ucsdet.h | 350 +
icuSources/i18n/unicode/ucurr.h | 80 +-
icuSources/i18n/unicode/udat.h | 129 +-
icuSources/i18n/unicode/ulocdata.h | 127 +-
icuSources/i18n/unicode/umsg.h | 56 +-
icuSources/i18n/unicode/unirepl.h | 7 +-
icuSources/i18n/unicode/unum.h | 127 +-
icuSources/i18n/unicode/uregex.h | 147 +-
icuSources/i18n/unicode/usearch.h | 12 +-
icuSources/i18n/unicode/utmscale.h | 166 +-
icuSources/i18n/unicode/utrans.h | 18 +-
icuSources/i18n/uregex.cpp | 162 +-
icuSources/i18n/uregexc.cpp | 39 +
icuSources/i18n/usearch.cpp | 64 +-
icuSources/i18n/utmscale.c | 120 +-
icuSources/i18n/utrans.cpp | 14 +-
icuSources/i18n/windtfmt.cpp | 315 +
icuSources/i18n/windtfmt.h | 148 +
icuSources/i18n/winnmfmt.cpp | 345 +
icuSources/i18n/winnmfmt.h | 168 +
icuSources/icudefs.mk.in | 9 +-
icuSources/io/Makefile.in | 44 +-
icuSources/io/io.dsp | 336 -
icuSources/io/io.rc | 12 +-
icuSources/io/io.vcproj | 28 +-
icuSources/io/locbund.c | 76 +-
icuSources/io/locbund.h | 3 +-
icuSources/io/ucln_io.c | 51 +
icuSources/io/ucln_io.h | 37 +
icuSources/io/ufile.c | 33 +-
icuSources/io/ufile.h | 11 +-
icuSources/io/ufmt_cmn.c | 81 +-
icuSources/io/unicode/ustdio.h | 173 +-
icuSources/io/unicode/ustream.h | 34 +-
icuSources/io/uprintf.h | 3 +-
icuSources/io/uprntf_p.c | 86 +-
icuSources/io/uscanf_p.c | 193 +-
icuSources/io/ustdio.c | 70 +-
icuSources/io/ustream.cpp | 34 +-
icuSources/layout/AnchorTables.cpp | 9 +-
icuSources/layout/ArabicLayoutEngine.cpp | 49 +-
icuSources/layout/ArabicLayoutEngine.h | 17 +-
icuSources/layout/ArabicShaping.cpp | 163 +-
icuSources/layout/ArabicShaping.h | 19 +-
icuSources/layout/AttachmentPosnSubtables.h | 5 +-
icuSources/layout/CanonData.cpp | 97 +-
icuSources/layout/CanonShaping.cpp | 81 +
icuSources/layout/CanonShaping.h | 12 +-
.../layout/ContextualSubstSubtables.cpp | 15 +-
.../layout/CursiveAttachmentSubtables.cpp | 66 +-
.../layout/CursiveAttachmentSubtables.h | 8 +-
icuSources/layout/DefaultCharMapper.h | 5 +-
icuSources/layout/DeviceTables.cpp | 4 +-
icuSources/layout/DeviceTables.h | 4 +-
icuSources/layout/GXLayoutEngine.cpp | 6 +-
icuSources/layout/GlyphIterator.cpp | 194 +-
icuSources/layout/GlyphIterator.h | 46 +-
.../layout/GlyphPositionAdjustments.cpp | 166 +
icuSources/layout/GlyphPositionAdjustments.h | 305 +-
icuSources/layout/GlyphPositioningTables.cpp | 14 +-
icuSources/layout/GlyphPositioningTables.h | 16 +-
icuSources/layout/GlyphPosnLookupProc.cpp | 7 +-
icuSources/layout/GlyphPosnLookupProc.h | 5 +-
icuSources/layout/GlyphSubstLookupProc.cpp | 6 +-
icuSources/layout/GlyphSubstLookupProc.h | 6 +-
icuSources/layout/GlyphSubstitutionTables.cpp | 7 +-
icuSources/layout/GlyphSubstitutionTables.h | 13 +-
icuSources/layout/HanLayoutEngine.cpp | 39 +-
icuSources/layout/HanLayoutEngine.h | 4 +-
icuSources/layout/HangulLayoutEngine.cpp | 338 +
icuSources/layout/HangulLayoutEngine.h | 125 +
icuSources/layout/IndicClassTables.cpp | 245 +-
icuSources/layout/IndicLayoutEngine.cpp | 18 +-
icuSources/layout/IndicLayoutEngine.h | 7 +-
icuSources/layout/IndicReordering.cpp | 408 +-
icuSources/layout/IndicReordering.h | 183 +-
icuSources/layout/KernTable.cpp | 205 +
icuSources/layout/KernTable.h | 51 +
icuSources/layout/KhmerLayoutEngine.cpp | 81 +
icuSources/layout/KhmerLayoutEngine.h | 129 +
icuSources/layout/KhmerReordering.cpp | 491 +
icuSources/layout/KhmerReordering.h | 132 +
icuSources/layout/LEFontInstance.cpp | 74 +-
icuSources/layout/LEFontInstance.h | 133 +-
icuSources/layout/LEGlyphFilter.h | 2 +-
icuSources/layout/LEGlyphStorage.cpp | 33 +-
icuSources/layout/LEGlyphStorage.h | 97 +-
icuSources/layout/LEInsertionList.h | 9 +-
icuSources/layout/LELanguages.h | 11 +-
icuSources/layout/LEScripts.h | 64 +-
icuSources/layout/LESwaps.h | 7 +-
icuSources/layout/LETypes.h | 420 +-
icuSources/layout/LayoutEngine.cpp | 165 +-
icuSources/layout/LayoutEngine.h | 37 +-
icuSources/layout/LookupProcessor.cpp | 140 +-
icuSources/layout/LookupProcessor.h | 35 +-
icuSources/layout/Lookups.h | 5 +-
icuSources/layout/Makefile.in | 59 +-
icuSources/layout/MarkToMarkPosnSubtables.cpp | 7 +-
icuSources/layout/MirroredCharData.cpp | 108 +
icuSources/layout/OpenTypeLayoutEngine.cpp | 124 +-
icuSources/layout/OpenTypeLayoutEngine.h | 58 +-
icuSources/layout/OpenTypeTables.h | 13 +-
.../layout/PairPositioningSubtables.cpp | 25 +-
icuSources/layout/ScriptAndLanguageTags.cpp | 61 +-
icuSources/layout/ScriptAndLanguageTags.h | 63 +-
icuSources/layout/ShapingTypeData.cpp | 85 +
.../layout/SinglePositioningSubtables.cpp | 19 +-
icuSources/layout/ThaiLayoutEngine.cpp | 8 +-
icuSources/layout/ThaiLayoutEngine.h | 4 +-
icuSources/layout/ThaiShaping.h | 5 +-
icuSources/layout/TibetanLayoutEngine.cpp | 87 +
icuSources/layout/TibetanLayoutEngine.h | 129 +
icuSources/layout/TibetanReordering.cpp | 381 +
icuSources/layout/TibetanReordering.h | 151 +
icuSources/layout/ValueRecords.cpp | 71 +-
icuSources/layout/ValueRecords.h | 7 +-
icuSources/layout/layout.dsp | 1175 -
icuSources/layout/layout.rc | 12 +-
icuSources/layout/layout.vcproj | 93 +-
icuSources/layout/loengine.cpp | 18 -
icuSources/layout/unicode/loengine.h | 358 -
icuSources/layoutex/Makefile.in | 41 +-
icuSources/layoutex/ParagraphLayout.cpp | 65 +-
icuSources/layoutex/layout/ParagraphLayout.h | 145 +-
icuSources/layoutex/layout/RunArrays.h | 170 +-
icuSources/layoutex/layoutex.dsp | 277 -
icuSources/layoutex/layoutex.rc | 12 +-
icuSources/layoutex/layoutex.vcproj | 24 +-
icuSources/runConfigureICU | 233 +-
icuSources/samples/Makefile.in | 4 +-
icuSources/samples/all/all.dsp | 85 -
icuSources/samples/all/all.dsw | 347 -
icuSources/samples/all/all.sln | 17 +
icuSources/samples/break/break.dsp | 113 -
icuSources/samples/break/break.dsw | 29 -
icuSources/samples/break/break.vcproj | 4 +-
icuSources/samples/break/readme.txt | 8 +-
icuSources/samples/cal/cal.dsp | 110 -
icuSources/samples/cal/cal.dsw | 29 -
icuSources/samples/cal/cal.vcproj | 4 +-
icuSources/samples/cal/readme.txt | 8 +-
icuSources/samples/case/case.dsp | 106 -
icuSources/samples/case/case.dsw | 29 -
icuSources/samples/case/case.vcproj | 4 +-
icuSources/samples/case/readme.txt | 9 +-
icuSources/samples/citer/Makefile | 22 +
icuSources/samples/citer/citer.cpp | 294 +-
icuSources/samples/citer/citer.vcproj | 140 +
icuSources/samples/citer/readme.txt | 8 +-
icuSources/samples/coll/coll.cpp | 5 +-
icuSources/samples/coll/coll.dsp | 101 -
icuSources/samples/coll/coll.dsw | 29 -
icuSources/samples/coll/coll.vcproj | 23 +-
icuSources/samples/coll/readme.txt | 8 +-
icuSources/samples/csdet/Makefile.in | 93 +
icuSources/samples/csdet/csdet.c | 73 +
icuSources/samples/csdet/csdet.sln | 21 +
icuSources/samples/csdet/csdet.vcproj | 140 +
icuSources/samples/date/date.dsp | 110 -
icuSources/samples/date/date.dsw | 29 -
icuSources/samples/date/date.vcproj | 4 +-
icuSources/samples/date/readme.txt | 12 +-
icuSources/samples/datecal/Makefile | 4 +-
icuSources/samples/datefmt/README.TXT | 8 +-
icuSources/samples/datefmt/datefmt.dsp | 106 -
icuSources/samples/datefmt/datefmt.dsw | 29 -
icuSources/samples/datefmt/datefmt.vcproj | 4 +-
icuSources/samples/defs.mk | 6 +-
icuSources/samples/layout/FontMap.GDI | 4 +-
icuSources/samples/layout/FontMap.Gnome | 4 +-
icuSources/samples/layout/FontMap.cpp | 21 +-
icuSources/samples/layout/GDIFontInstance.cpp | 29 +-
icuSources/samples/layout/GDIGUISupport.h | 4 +-
icuSources/samples/layout/GUISupport.h | 4 +-
.../samples/layout/GnomeFontInstance.cpp | 6 +-
icuSources/samples/layout/GnomeGUISupport.h | 4 +-
icuSources/samples/layout/Sample.txt | 2 +-
.../layout/ScriptCompositeFontInstance.h | 4 +-
icuSources/samples/layout/UnicodeReader.cpp | 4 +-
icuSources/samples/layout/gnomelayout.cpp | 30 +-
icuSources/samples/layout/layout.cpp | 8 +-
icuSources/samples/layout/layout.dsp | 196 -
icuSources/samples/layout/layout.dsw | 29 -
icuSources/samples/layout/layout.vcproj | 4 +-
icuSources/samples/layout/paragraph.cpp | 192 +-
icuSources/samples/layout/paragraph.h | 18 +-
icuSources/samples/layout/readme.html | 331 +-
icuSources/samples/legacy/legacy.cpp | 6 +-
icuSources/samples/legacy/legacy.dsp | 112 -
icuSources/samples/legacy/legacy.dsw | 29 -
icuSources/samples/legacy/legacy.sln | 10 +-
icuSources/samples/legacy/legacy.vcproj | 4 +-
icuSources/samples/legacy/newcol.cpp | 4 +-
icuSources/samples/legacy/oldcol.cpp | 4 +-
icuSources/samples/msgfmt/README.TXT | 8 +-
icuSources/samples/msgfmt/msgfmt.dsp | 104 -
icuSources/samples/msgfmt/msgfmt.dsw | 29 -
icuSources/samples/msgfmt/msgfmt.vcproj | 4 +-
icuSources/samples/numfmt/numfmt.dsp | 114 -
icuSources/samples/numfmt/numfmt.dsw | 29 -
icuSources/samples/numfmt/numfmt.vcproj | 4 +-
icuSources/samples/numfmt/readme.txt | 8 +-
icuSources/samples/props/props.dsp | 102 -
icuSources/samples/props/props.dsw | 29 -
icuSources/samples/props/props.vcproj | 4 +-
icuSources/samples/props/readme.txt | 8 +-
icuSources/samples/readme.txt | 4 +-
icuSources/samples/rules.mk | 12 +-
icuSources/samples/strsrch/readme.txt | 10 +-
icuSources/samples/strsrch/strsrch.cpp | 5 +-
icuSources/samples/strsrch/strsrch.dsp | 101 -
icuSources/samples/strsrch/strsrch.dsw | 29 -
icuSources/samples/strsrch/strsrch.vcproj | 4 +-
icuSources/samples/translit/README.TXT | 8 +-
icuSources/samples/translit/translit.dsp | 114 -
icuSources/samples/translit/translit.dsw | 29 -
icuSources/samples/translit/translit.vcproj | 4 +-
icuSources/samples/uciter8/readme.txt | 8 +-
icuSources/samples/uciter8/uciter8.dsp | 110 -
icuSources/samples/uciter8/uciter8.dsw | 29 -
icuSources/samples/uciter8/uciter8.sln | 10 +-
icuSources/samples/uciter8/uciter8.vcproj | 4 +-
icuSources/samples/uciter8/uit_len8.c | 151 +-
icuSources/samples/ucnv/data01.txt | 30 +-
icuSources/samples/ucnv/data06.txt | 178 +-
icuSources/samples/ucnv/readme.txt | 8 +-
icuSources/samples/ucnv/ucnv.dsp | 108 -
icuSources/samples/ucnv/ucnv.dsw | 29 -
icuSources/samples/ucnv/ucnv.vcproj | 4 +-
icuSources/samples/udata/reader.dsp | 111 -
icuSources/samples/udata/reader.vcproj | 4 +-
icuSources/samples/udata/readme.txt | 8 +-
icuSources/samples/udata/udata.dsw | 41 -
icuSources/samples/udata/writer.dsp | 102 -
icuSources/samples/udata/writer.vcproj | 4 +-
icuSources/samples/ufortune/readme.txt | 8 +-
.../samples/ufortune/resources/Makefile | 16 +-
icuSources/samples/ufortune/resources/es.txt | 224 +-
.../ufortune/resources/fortune_resources.mak | 5 +-
.../ufortune/resources/res-file-list.txt | 4 +-
icuSources/samples/ufortune/ufortune.c | 12 +-
icuSources/samples/ufortune/ufortune.dsp | 161 -
icuSources/samples/ufortune/ufortune.dsw | 29 -
icuSources/samples/ufortune/ufortune.vcproj | 4 +-
icuSources/samples/ugrep/readme.txt | 8 +-
icuSources/samples/ugrep/ugrep.dsp | 103 -
icuSources/samples/ugrep/ugrep.dsw | 29 -
icuSources/samples/ugrep/ugrep.vcproj | 2 +
icuSources/samples/uresb/Makefile | 23 +-
icuSources/samples/uresb/readme.txt | 8 +-
icuSources/samples/uresb/resources.dsp | 97 -
icuSources/samples/uresb/resources.mak | 14 +-
icuSources/samples/uresb/sr.txt | 94 +-
icuSources/samples/uresb/uresb.c | 18 +-
icuSources/samples/uresb/uresb.dsp | 111 -
icuSources/samples/uresb/uresb.dsw | 44 -
icuSources/samples/uresb/uresb.vcproj | 9 +-
icuSources/samples/ustring/readme.txt | 8 +-
icuSources/samples/ustring/ustring.dsp | 102 -
icuSources/samples/ustring/ustring.dsw | 29 -
icuSources/samples/ustring/ustring.vcproj | 4 +-
icuSources/samples/xml2txt/readme.txt | 3 -
icuSources/stubdata/Makefile.in | 34 +-
icuSources/stubdata/stubdata.dsp | 185 -
icuSources/stubdata/stubdata.vcproj | 23 +-
icuSources/test/cintltst/Makefile.in | 43 +-
icuSources/test/cintltst/bocu1tst.c | 6 +-
icuSources/test/cintltst/callcoll.c | 87 +-
icuSources/test/cintltst/callcoll.h | 6 +-
icuSources/test/cintltst/calltest.c | 9 +-
icuSources/test/cintltst/capitst.c | 248 +-
icuSources/test/cintltst/capitst.h | 13 +-
icuSources/test/cintltst/cbiapts.c | 118 +-
icuSources/test/cintltst/cbiditst.c | 2081 +-
icuSources/test/cintltst/cbkittst.c | 2 -
icuSources/test/cintltst/ccaltst.c | 63 +-
icuSources/test/cintltst/ccapitst.c | 576 +-
icuSources/test/cintltst/ccolltst.c | 5 +-
icuSources/test/cintltst/ccolltst.h | 4 +-
icuSources/test/cintltst/ccurrtst.c | 4 +-
icuSources/test/cintltst/cdantst.c | 245 -
icuSources/test/cintltst/cdantst.h | 42 -
icuSources/test/cintltst/cdattst.c | 51 +-
icuSources/test/cintltst/cdtdptst.c | 21 +-
icuSources/test/cintltst/cdtrgtst.c | 90 +-
icuSources/test/cintltst/cformtst.c | 5 +-
icuSources/test/cintltst/chashtst.c | 95 +-
icuSources/test/cintltst/cintltst.c | 95 +-
icuSources/test/cintltst/cintltst.dsp | 653 -
icuSources/test/cintltst/cintltst.h | 19 +-
icuSources/test/cintltst/cintltst.vcproj | 42 +-
icuSources/test/cintltst/cldrtest.c | 232 +-
icuSources/test/cintltst/cloctst.c | 508 +-
icuSources/test/cintltst/cloctst.h | 20 +-
icuSources/test/cintltst/cmsccoll.c | 160 +-
icuSources/test/cintltst/cmsgtst.c | 47 +-
icuSources/test/cintltst/cnmdptst.c | 242 +-
icuSources/test/cintltst/cnumtst.c | 108 +-
icuSources/test/cintltst/cnumtst.h | 8 +-
icuSources/test/cintltst/cregrtst.c | 1804 -
icuSources/test/cintltst/cregrtst.h | 222 -
icuSources/test/cintltst/crestst.c | 82 +-
icuSources/test/cintltst/creststn.c | 597 +-
icuSources/test/cintltst/creststn.h | 19 +-
icuSources/test/cintltst/cstrcase.c | 185 +-
icuSources/test/cintltst/cstrtest.c | 11 +
icuSources/test/cintltst/cucdapi.c | 63 +-
icuSources/test/cintltst/cucdtst.c | 629 +-
icuSources/test/cintltst/cucdtst.h | 27 -
icuSources/test/cintltst/currtest.c | 204 +
icuSources/test/cintltst/custrtrn.c | 449 +-
icuSources/test/cintltst/custrtst.c | 56 +-
icuSources/test/cintltst/cutiltst.c | 4 +-
icuSources/test/cintltst/eurocreg.c | 13 +-
icuSources/test/cintltst/hpmufn.c | 68 +-
icuSources/test/cintltst/idnatest.c | 113 +-
icuSources/test/cintltst/nccbtst.c | 164 +-
icuSources/test/cintltst/ncnvfbts.c | 40 +-
icuSources/test/cintltst/ncnvtst.c | 282 +-
icuSources/test/cintltst/nfsprep.c | 42 +-
icuSources/test/cintltst/nucnvtst.c | 540 +-
icuSources/test/cintltst/putiltst.c | 9 +-
icuSources/test/cintltst/reapits.c | 329 +-
icuSources/test/cintltst/sorttest.c | 10 +-
icuSources/test/cintltst/spreptst.c | 58 +-
icuSources/test/cintltst/stdnmtst.c | 34 +-
icuSources/test/cintltst/tracetst.c | 9 +-
icuSources/test/cintltst/trietest.c | 95 +-
icuSources/test/cintltst/ucmptst.c | 201 -
icuSources/test/cintltst/ucsdetst.c | 356 +
icuSources/test/cintltst/udatatst.c | 420 +-
icuSources/test/cintltst/usettest.c | 41 +-
icuSources/test/cintltst/utexttst.c | 250 +
icuSources/test/cintltst/utf16tst.c | 8 +-
icuSources/test/cintltst/utf8tst.c | 133 +-
icuSources/test/cintltst/utmstest.c | 146 +-
icuSources/test/cintltst/utransts.c | 9 +-
icuSources/test/collperf/collperf.cpp | 1749 -
icuSources/test/collperf/collperf.dsp | 160 -
icuSources/test/collperf/readme.html | 84 -
icuSources/test/hdrtst/Makefile.in | 75 +-
icuSources/test/intltest/Makefile.in | 38 +-
icuSources/test/intltest/aliastst.cpp | 287 +
icuSources/test/intltest/aliastst.h | 30 +
icuSources/test/intltest/apicoll.cpp | 110 +-
icuSources/test/intltest/apicoll.h | 5 +-
icuSources/test/intltest/astrotst.cpp | 6 +-
icuSources/test/intltest/calcasts.cpp | 9 +-
icuSources/test/intltest/callimts.cpp | 6 +-
icuSources/test/intltest/calregts.cpp | 21 +-
icuSources/test/intltest/caltest.cpp | 22 +-
icuSources/test/intltest/caltest.h | 2 +-
icuSources/test/intltest/canittst.cpp | 65 +-
icuSources/test/intltest/canittst.h | 4 +-
icuSources/test/intltest/citrtest.cpp | 49 +-
icuSources/test/intltest/cntabcol.cpp | 324 +-
icuSources/test/intltest/cntabcol.h | 4 +-
icuSources/test/intltest/convtest.cpp | 51 +-
icuSources/test/intltest/convtest.h | 4 +-
icuSources/test/intltest/cpdtrtst.cpp | 9 +-
icuSources/test/intltest/csdetest.cpp | 518 +
icuSources/test/intltest/csdetest.h | 39 +
icuSources/test/intltest/dacoll.cpp | 241 -
icuSources/test/intltest/dacoll.h | 51 -
icuSources/test/intltest/dadrcoll.cpp | 31 +-
icuSources/test/intltest/dadrcoll.h | 3 +-
icuSources/test/intltest/dcfmapts.cpp | 2 +
icuSources/test/intltest/dtfmapts.cpp | 33 +-
icuSources/test/intltest/dtfmrgts.cpp | 81 +-
icuSources/test/intltest/dtfmtrtts.cpp | 30 +-
icuSources/test/intltest/dtfmtrtts.h | 3 +-
icuSources/test/intltest/dtfmttst.cpp | 652 +-
icuSources/test/intltest/dtfmttst.h | 31 +-
icuSources/test/intltest/escoll.cpp | 4 +-
icuSources/test/intltest/ficoll.cpp | 4 +-
icuSources/test/intltest/frcoll.cpp | 4 +-
icuSources/test/intltest/icusvtst.cpp | 168 +-
icuSources/test/intltest/idnaconf.cpp | 352 +
icuSources/test/intltest/idnaconf.h | 49 +
icuSources/test/intltest/idnaref.cpp | 235 +-
icuSources/test/intltest/incaltst.cpp | 108 +-
icuSources/test/intltest/incaltst.h | 3 +-
icuSources/test/intltest/intltest.cpp | 254 +-
icuSources/test/intltest/intltest.dsp | 1011 -
icuSources/test/intltest/intltest.h | 32 +-
icuSources/test/intltest/intltest.vcproj | 132 +-
icuSources/test/intltest/itformat.cpp | 2 +-
icuSources/test/intltest/itmajor.cpp | 12 +-
icuSources/test/intltest/itrbnf.cpp | 144 +-
icuSources/test/intltest/itrbnf.h | 12 +-
icuSources/test/intltest/itutil.cpp | 34 +-
icuSources/test/intltest/loctest.cpp | 211 +-
icuSources/test/intltest/miscdtfm.cpp | 58 +-
icuSources/test/intltest/msfmrgts.cpp | 10 +-
icuSources/test/intltest/nmfmapts.cpp | 135 +-
icuSources/test/intltest/nmfmtrt.cpp | 21 +-
icuSources/test/intltest/nptrans.cpp | 3 +-
icuSources/test/intltest/numfmtst.cpp | 219 +-
icuSources/test/intltest/numfmtst.h | 44 +-
icuSources/test/intltest/numrgts.cpp | 166 +-
icuSources/test/intltest/numrgts.h | 72 +-
icuSources/test/intltest/pptest.cpp | 7 +-
icuSources/test/intltest/punyref.c | 4 +-
icuSources/test/intltest/rbbiapts.cpp | 154 +-
icuSources/test/intltest/rbbitst.cpp | 8032 +-
icuSources/test/intltest/rbbitst.h | 38 +-
icuSources/test/intltest/regcoll.cpp | 2 +-
icuSources/test/intltest/regextst.cpp | 30 +-
icuSources/test/intltest/reptest.cpp | 30 +-
icuSources/test/intltest/restest.cpp | 2 +-
icuSources/test/intltest/restsnew.cpp | 30 +-
icuSources/test/intltest/restsnew.h | 2 +
icuSources/test/intltest/rndmcoll.cpp | 185 +
icuSources/test/intltest/rndmcoll.h | 29 +
icuSources/test/intltest/sdtfmtts.cpp | 10 +-
icuSources/test/intltest/srchtest.cpp | 47 +-
icuSources/test/intltest/srchtest.h | 3 +-
icuSources/test/intltest/strcase.cpp | 280 +-
icuSources/test/intltest/strtest.cpp | 6 +-
icuSources/test/intltest/tchcfmt.cpp | 10 +-
icuSources/test/intltest/testidn.cpp | 9 +-
icuSources/test/intltest/testidna.cpp | 89 +-
icuSources/test/intltest/tfsmalls.cpp | 75 +-
icuSources/test/intltest/thcoll.cpp | 11 +-
icuSources/test/intltest/tmsgfmt.cpp | 86 +-
icuSources/test/intltest/tmsgfmt.h | 4 +-
icuSources/test/intltest/transapi.cpp | 24 +-
icuSources/test/intltest/transapi.h | 4 +-
icuSources/test/intltest/transrt.cpp | 228 +-
icuSources/test/intltest/transtst.cpp | 456 +-
icuSources/test/intltest/transtst.h | 25 +-
icuSources/test/intltest/trcoll.cpp | 4 +-
icuSources/test/intltest/trnserr.cpp | 24 +-
icuSources/test/intltest/trnserr.h | 6 +-
icuSources/test/intltest/tscoll.cpp | 11 +-
icuSources/test/intltest/tsdate.cpp | 8 +-
icuSources/test/intltest/tsdtfmsy.cpp | 220 +-
icuSources/test/intltest/tsdtfmsy.h | 8 +-
icuSources/test/intltest/tsmthred.cpp | 247 +-
icuSources/test/intltest/tsputil.cpp | 29 +-
icuSources/test/intltest/tsputil.h | 3 +-
icuSources/test/intltest/tstnorm.cpp | 714 +-
icuSources/test/intltest/tstnrapi.cpp | 22 +-
icuSources/test/intltest/tzbdtest.cpp | 109 +-
icuSources/test/intltest/tzbdtest.h | 5 +-
icuSources/test/intltest/tzregts.cpp | 184 +-
icuSources/test/intltest/tzregts.h | 5 +-
icuSources/test/intltest/tztest.cpp | 214 +-
icuSources/test/intltest/tztest.h | 6 +-
icuSources/test/intltest/ucaconf.cpp | 10 +-
icuSources/test/intltest/ucdtest.cpp | 4 +-
icuSources/test/intltest/uobjtest.cpp | 87 +-
icuSources/test/intltest/uobjtest.h | 3 +-
icuSources/test/intltest/usettest.cpp | 289 +-
icuSources/test/intltest/usettest.h | 6 +-
icuSources/test/intltest/ustrtest.cpp | 25 +
icuSources/test/intltest/ustrtest.h | 16 +-
icuSources/test/intltest/utxttest.cpp | 1302 +
icuSources/test/intltest/utxttest.h | 59 +
icuSources/test/intltest/uvectest.cpp | 175 +
icuSources/test/intltest/uvectest.h | 34 +
icuSources/test/intltest/v32test.cpp | 16 +-
icuSources/test/intltest/wbnf.cpp | 1771 +
icuSources/test/intltest/wbnf.h | 157 +
icuSources/test/intltest/windttst.cpp | 197 +
icuSources/test/intltest/windttst.h | 41 +
icuSources/test/intltest/winnmtst.cpp | 323 +
icuSources/test/intltest/winnmtst.h | 41 +
icuSources/test/intltest/winutil.cpp | 81 +
icuSources/test/intltest/winutil.h | 46 +
icuSources/test/iotest/Makefile.in | 30 +-
icuSources/test/iotest/filetst.c | 331 +-
icuSources/test/iotest/iotest.cpp | 140 +-
icuSources/test/iotest/iotest.dsp | 166 -
icuSources/test/iotest/iotest.h | 8 +-
icuSources/test/iotest/iotest.vcproj | 35 +-
icuSources/test/iotest/stream.cpp | 135 +
icuSources/test/iotest/strtst.c | 50 +-
icuSources/test/iotest/trnstst.c | 316 +
icuSources/test/letest/FontTableCache.cpp | 11 +-
icuSources/test/letest/Makefile.in | 23 +-
.../test/letest/PortableFontInstance.cpp | 143 +-
icuSources/test/letest/PortableFontInstance.h | 84 +-
icuSources/test/letest/SimpleFontInstance.cpp | 132 +
icuSources/test/letest/SimpleFontInstance.h | 72 +
icuSources/test/letest/cmaps.h | 7 +-
icuSources/test/letest/gendata.cpp | 552 +-
icuSources/test/letest/gendata.dsp | 134 -
icuSources/test/letest/gendata.dsw | 29 -
icuSources/test/letest/gendata.sln | 10 +-
icuSources/test/letest/gendata.vcproj | 52 +-
icuSources/test/letest/gendata.xml | 77 +
icuSources/test/letest/letest.cpp | 833 +-
icuSources/test/letest/letest.dsp | 138 -
icuSources/test/letest/letest.dsw | 29 -
icuSources/test/letest/letest.h | 30 +-
icuSources/test/letest/letest.sln | 19 +-
icuSources/test/letest/letest.vcproj | 54 +-
icuSources/test/letest/letsutil.cpp | 98 +
icuSources/test/letest/letsutil.h | 36 +
icuSources/test/letest/readme.html | 51 +-
icuSources/test/letest/sfnt.h | 64 +-
icuSources/test/letest/testdata.cpp | 412 +-
icuSources/test/perf/all/all.dsp | 63 -
icuSources/test/perf/charperf/Makefile.in | 21 +-
icuSources/test/perf/charperf/charperf.cpp | 184 +-
icuSources/test/perf/charperf/charperf.dsp | 109 -
icuSources/test/perf/charperf/charperf.h | 215 +-
icuSources/test/perf/charperf/charperf.vcproj | 181 +
icuSources/test/perf/collperf/CollPerf.pl | 82 +
.../test/{ => perf}/collperf/Makefile.in | 23 +-
icuSources/test/perf/collperf/collperf.cpp | 879 +
icuSources/test/perf/collperf/collperf.vcproj | 179 +
icuSources/test/perf/convperf/convperf.cpp | 3 +-
icuSources/test/perf/convperf/convperf.dsp | 112 -
icuSources/test/perf/convperf/convperf.h | 18 +-
icuSources/test/perf/convperf/convperf.vcproj | 185 +
icuSources/test/perf/normperf/Makefile.in | 23 +-
icuSources/test/perf/normperf/normperf.cpp | 4 +-
icuSources/test/perf/normperf/normperf.dsp | 108 -
icuSources/test/perf/normperf/normperf.h | 29 +-
icuSources/test/perf/normperf/normperf.vcproj | 182 +
icuSources/test/perf/perf.dsw | 98 -
icuSources/test/perf/perf.sln | 77 +
icuSources/test/perf/ubrkperf/Makefile.in | 23 +-
icuSources/test/perf/ubrkperf/ubrkperf.cpp | 5 +-
icuSources/test/perf/ubrkperf/ubrkperf.h | 4 +-
icuSources/test/perf/ubrkperf/ubrkperf.vcproj | 182 +
icuSources/test/perf/ubrkperf/ubrkperfold.cpp | 4 +-
.../usetperf}/Makefile.in | 27 +-
icuSources/test/perf/usetperf/UsetPerf.pl | 45 +
.../test/{ => perf}/usetperf/bitset.cpp | 2 +-
icuSources/test/{ => perf}/usetperf/bitset.h | 2 +-
icuSources/test/perf/usetperf/usetperf.cpp | 143 +
icuSources/test/perf/usetperf/usetperf.vcproj | 203 +
icuSources/test/perf/ustrperf/Makefile.in | 78 +
icuSources/test/perf/ustrperf/stringperf.cpp | 390 +-
icuSources/test/perf/ustrperf/stringperf.h | 674 +-
.../test/perf/ustrperf/stringperf.vcproj | 8 +-
icuSources/test/perf/utfperf/Makefile.in | 78 +
icuSources/test/perf/utfperf/UtfPerf.pl | 46 +
icuSources/test/perf/utfperf/utfperf.cpp | 156 +
icuSources/test/perf/utfperf/utfperf.vcproj | 160 +
.../CollationTest_NON_IGNORABLE_STUB.txt | 6607 +-
.../testdata/CollationTest_SHIFTED_STUB.txt | 6607 +-
.../test/testdata/DataDrivenCollationTest.txt | 1017 +-
.../testdata/GraphemeClusterBreakTest.txt | 116 +
icuSources/test/testdata/Makefile.in | 98 +-
.../test/testdata/SentenceBreakTest.txt | 165 +
icuSources/test/testdata/WordBreakTest.txt | 893 +
icuSources/test/testdata/casing.txt | 34 +-
icuSources/test/testdata/conversion.txt | 230 +-
icuSources/test/testdata/csdetest.xml | 550 +
...cu26_testtypes.res => icu26_testtypes.res} | Bin
...26e_testtypes.res => icu26e_testtypes.res} | Bin
icuSources/test/testdata/icuio.txt | 51 +-
icuSources/test/testdata/idna_conf.txt | 1266 +
icuSources/test/testdata/idna_rules.txt | 4 +-
icuSources/test/testdata/iscii.bin | 38 +-
icuSources/test/testdata/letest.xml | 1048 +
icuSources/test/testdata/ra.xlf | 247 +
icuSources/test/testdata/rbbitst.txt | 65 +-
icuSources/test/testdata/regextst.txt | 28 +-
icuSources/test/testdata/riwords.txt | 65886 ++++++++--------
icuSources/test/testdata/root.txt | 15 +-
icuSources/test/testdata/sh.txt | 14 +
icuSources/test/testdata/sh_YU.txt | 12 +
icuSources/test/testdata/structLocale.txt | 6376 +-
icuSources/test/testdata/te.txt | 64 +-
icuSources/test/testdata/te_IN.txt | 5 +-
icuSources/test/testdata/te_IN_REVISED.txt | 13 +
icuSources/test/testdata/testaliases.txt | 25 +-
icuSources/test/testdata/testdata.mak | 129 +-
icuSources/test/testmap/Makefile.in | 9 +-
icuSources/test/thaitest/space.txt | 644 +-
icuSources/test/thaitest/thaitest.cpp | 79 +-
icuSources/test/threadtest/threadtest.cpp | 4 +-
icuSources/test/unalignedtest/readme | 27 -
icuSources/test/unalignedtest/unaligned.c | 304 -
icuSources/test/usetperf/timer.h | 62 -
icuSources/test/usetperf/usetperf.cpp | 122 -
icuSources/test/usetperf/usetperf.dsp | 164 -
icuSources/test/utfperf/utfperf.c | 450 -
icuSources/test/utfperf/utfperf.dsp | 158 -
icuSources/tools/Makefile.in | 12 +-
icuSources/tools/cpysearch/cpyscan.pl | 5 +-
icuSources/tools/cpysearch/cpysearch.pl | 6 +-
icuSources/tools/cpysearch/cpyskip.txt | 270 +-
icuSources/tools/cpysearch/readme.txt | 10 +-
icuSources/tools/ctestfw/Makefile.in | 47 +-
icuSources/tools/ctestfw/ctest.c | 16 +-
icuSources/tools/ctestfw/ctestfw.dsp | 199 -
icuSources/tools/ctestfw/ctestfw.vcproj | 38 +-
icuSources/tools/ctestfw/datamap.cpp | 10 +-
icuSources/tools/ctestfw/testdata.cpp | 12 +-
icuSources/tools/ctestfw/tstdtmod.cpp | 8 +-
icuSources/tools/ctestfw/unicode/datamap.h | 5 +-
icuSources/tools/ctestfw/unicode/testdata.h | 4 +-
icuSources/tools/ctestfw/unicode/testlog.h | 6 +-
icuSources/tools/ctestfw/unicode/testtype.h | 9 +-
icuSources/tools/ctestfw/unicode/tstdtmod.h | 4 +-
.../{toolutil => ctestfw/unicode}/uperf.h | 20 +-
.../{toolutil => ctestfw/unicode}/utimer.h | 108 +-
.../tools/{toolutil => ctestfw}/uperf.cpp | 22 +-
icuSources/tools/dumpce/dumpce.cpp | 6 +-
icuSources/tools/genbidi/Makefile.in | 94 +
icuSources/tools/genbidi/genbidi.c | 634 +
icuSources/tools/genbidi/genbidi.h | 47 +
icuSources/tools/genbidi/genbidi.vcproj | 168 +
icuSources/tools/genbidi/store.c | 469 +
icuSources/tools/genbrk/Makefile.in | 40 +-
icuSources/tools/genbrk/genbrk.1.in | 112 +
icuSources/tools/genbrk/genbrk.cpp | 43 +-
icuSources/tools/genbrk/genbrk.dsp | 200 -
icuSources/tools/genbrk/genbrk.vcproj | 13 +-
icuSources/tools/gencase/Makefile.in | 48 +-
icuSources/tools/gencase/gencase.8.in | 136 -
icuSources/tools/gencase/gencase.c | 32 +-
icuSources/tools/gencase/gencase.dsp | 194 -
icuSources/tools/gencase/gencase.h | 42 +-
icuSources/tools/gencase/gencase.vcproj | 13 +-
icuSources/tools/gencase/store.c | 633 +-
icuSources/tools/genccode/Makefile.in | 40 +-
icuSources/tools/genccode/genccode.c | 13 +-
icuSources/tools/genccode/genccode.dsp | 197 -
icuSources/tools/genccode/genccode.vcproj | 14 +-
icuSources/tools/gencmn/Makefile.in | 51 +-
icuSources/tools/gencmn/decmn.8.in | 68 -
icuSources/tools/gencmn/decmn.c | 265 -
icuSources/tools/gencmn/decmn.dsp | 197 -
icuSources/tools/gencmn/gencmn.c | 90 +-
icuSources/tools/gencmn/gencmn.dsp | 198 -
icuSources/tools/gencmn/gencmn.vcproj | 13 +-
icuSources/tools/gencnval/Makefile.in | 42 +-
icuSources/tools/gencnval/gencnval.c | 93 +-
icuSources/tools/gencnval/gencnval.dsp | 198 -
icuSources/tools/gencnval/gencnval.vcproj | 13 +-
icuSources/tools/genctd/Makefile.in | 95 +
icuSources/tools/genctd/genctd.1.in | 111 +
icuSources/tools/genctd/genctd.cpp | 393 +
.../decmn.vcproj => genctd/genctd.vcproj} | 58 +-
icuSources/tools/gendraft/DeprecatedApi.txt | 225 -
icuSources/tools/gendraft/DraftApi.txt | 372 -
icuSources/tools/gendraft/ObsoleteApi.txt | 19 -
icuSources/tools/gendraft/exclude.txt | 7 +
icuSources/tools/gendraft/gendraft.pl | 172 -
icuSources/tools/gendraft/genheaders.pl | 253 +
icuSources/tools/gennames/Makefile.in | 54 +-
icuSources/tools/gennames/gennames.8.in | 85 -
icuSources/tools/gennames/gennames.c | 97 +-
icuSources/tools/gennames/gennames.dsp | 198 -
icuSources/tools/gennames/gennames.vcproj | 13 +-
icuSources/tools/gennorm/Makefile.in | 49 +-
icuSources/tools/gennorm/gennorm.8.in | 114 -
icuSources/tools/gennorm/gennorm.c | 91 +-
icuSources/tools/gennorm/gennorm.dsp | 206 -
icuSources/tools/gennorm/gennorm.h | 30 +-
icuSources/tools/gennorm/gennorm.vcproj | 13 +-
icuSources/tools/gennorm/store.c | 335 +-
icuSources/tools/genpname/Makefile.in | 37 +-
.../genpname/SyntheticPropertyAliases.txt | 10 +-
.../SyntheticPropertyValueAliases.txt | 62 +
icuSources/tools/genpname/data.h | 3719 +-
icuSources/tools/genpname/genpname.cpp | 5 +-
icuSources/tools/genpname/genpname.dsp | 198 -
icuSources/tools/genpname/genpname.vcproj | 13 +-
icuSources/tools/genpname/gensvpa.pl | 161 +
icuSources/tools/genpname/preparse.pl | 142 +-
icuSources/tools/genprops/Makefile.in | 47 +-
icuSources/tools/genprops/genprops.8.in | 126 -
icuSources/tools/genprops/genprops.c | 493 +-
icuSources/tools/genprops/genprops.dsp | 198 -
icuSources/tools/genprops/genprops.h | 43 +-
icuSources/tools/genprops/genprops.vcproj | 13 +-
icuSources/tools/genprops/props2.c | 271 +-
icuSources/tools/genprops/store.c | 857 +-
icuSources/tools/genrb/Makefile.in | 36 +-
icuSources/tools/genrb/derb.c | 65 +-
icuSources/tools/genrb/derb.dsp | 206 -
icuSources/tools/genrb/derb.vcproj | 13 +-
icuSources/tools/genrb/gendtjar.pl | 287 +-
icuSources/tools/genrb/genrb.c | 52 +-
icuSources/tools/genrb/genrb.dsp | 274 -
icuSources/tools/genrb/genrb.h | 4 +-
icuSources/tools/genrb/genrb.vcproj | 26 +-
icuSources/tools/genrb/genrbjar.pl | 358 -
icuSources/tools/genrb/parse.c | 698 +-
icuSources/tools/genrb/parse.h | 4 +-
icuSources/tools/genrb/{util.c => rbutil.c} | 4 +-
icuSources/tools/genrb/{util.h => rbutil.h} | 4 +-
icuSources/tools/genrb/reslist.c | 24 +-
icuSources/tools/genrb/reslist.h | 5 +-
icuSources/tools/genrb/ustr.c | 3 +-
icuSources/tools/genrb/wrtjava.c | 12 +-
icuSources/tools/genrb/wrtxml.c | 253 +-
icuSources/tools/genren/genren.pl | 4 +-
icuSources/tools/gensprep/Makefile.in | 39 +-
icuSources/tools/gensprep/gensprep.c | 19 +-
icuSources/tools/gensprep/gensprep.dsp | 206 -
icuSources/tools/gensprep/gensprep.h | 4 +-
icuSources/tools/gensprep/gensprep.vcproj | 17 +-
icuSources/tools/gensprep/store.c | 21 +-
icuSources/tools/gentest/Makefile.in | 18 +-
icuSources/tools/gentest/gentest.c | 7 +-
icuSources/tools/gentest/gentest.dsp | 202 -
icuSources/tools/gentest/gentest.vcproj | 13 +-
icuSources/tools/genuca/Makefile.in | 40 +-
icuSources/tools/genuca/genuca.cpp | 36 +-
icuSources/tools/genuca/genuca.dsp | 204 -
icuSources/tools/genuca/genuca.vcproj | 13 +-
icuSources/tools/icupkg/Makefile.in | 96 +
icuSources/tools/icupkg/icupkg.1.in | 204 +
icuSources/tools/icupkg/icupkg.8.in | 204 +
icuSources/tools/icupkg/icupkg.cpp | 579 +
icuSources/tools/icupkg/icupkg.vcproj | 145 +
icuSources/tools/icuswap/Makefile.in | 38 +-
icuSources/tools/icuswap/icuswap.cpp | 221 +-
icuSources/tools/icuswap/icuswap.dsp | 185 -
icuSources/tools/icuswap/icuswap.vcproj | 30 +-
icuSources/tools/makeconv/Makefile.in | 47 +-
icuSources/tools/makeconv/gencnvex.c | 4 +-
icuSources/tools/makeconv/genmbcs.c | 4 +-
icuSources/tools/makeconv/genmbcs.h | 4 +-
icuSources/tools/makeconv/makeconv.c | 92 +-
icuSources/tools/makeconv/makeconv.dsp | 218 -
icuSources/tools/makeconv/makeconv.h | 4 +-
icuSources/tools/makeconv/makeconv.vcproj | 14 +-
icuSources/tools/makeconv/misc/canonucm.c | 29 -
icuSources/tools/makeconv/misc/rptp2ucm.c | 31 -
icuSources/tools/makeconv/misc/ucmmerge.c | 26 -
icuSources/tools/makeconv/misc/ucmstrip.c | 28 -
icuSources/tools/makeconv/ucnvstat.c | 3 +-
icuSources/tools/memcheck/ICUMemCheck.pl | 68 +
icuSources/tools/pkgdata/Makefile.in | 38 +-
icuSources/tools/pkgdata/cmnmode.c | 7 +-
icuSources/tools/pkgdata/dllmode.c | 26 +-
icuSources/tools/pkgdata/filemode.c | 224 +-
icuSources/tools/pkgdata/make.c | 99 +-
icuSources/tools/pkgdata/makefile.h | 4 +-
icuSources/tools/pkgdata/pkgdata.c | 280 +-
icuSources/tools/pkgdata/pkgdata.dsp | 226 -
icuSources/tools/pkgdata/pkgdata.vcproj | 13 +-
icuSources/tools/pkgdata/pkgtypes.c | 24 +-
icuSources/tools/pkgdata/pkgtypes.h | 9 +-
icuSources/tools/pkgdata/sttcmode.c | 9 +-
icuSources/tools/pkgdata/winmode.c | 16 +-
icuSources/tools/toolutil/Makefile.in | 32 +-
.../{common => tools/toolutil}/filestrm.c | 9 +-
.../{common => tools/toolutil}/filestrm.h | 9 +-
icuSources/tools/toolutil/package.cpp | 1202 +
icuSources/tools/toolutil/package.h | 159 +
icuSources/tools/toolutil/pkg_imp.h | 35 +
icuSources/tools/toolutil/pkgitems.cpp | 638 +
icuSources/tools/toolutil/propsvec.c | 32 +-
icuSources/tools/toolutil/propsvec.h | 29 +-
icuSources/tools/toolutil/swapimpl.cpp | 643 +
icuSources/tools/toolutil/swapimpl.h | 43 +
icuSources/tools/toolutil/toolutil.c | 37 +-
icuSources/tools/toolutil/toolutil.dsp | 246 -
icuSources/tools/toolutil/toolutil.h | 10 +-
icuSources/tools/toolutil/toolutil.vcproj | 78 +-
icuSources/tools/toolutil/ucbuf.c | 102 +-
icuSources/tools/toolutil/ucbuf.h | 9 +-
icuSources/tools/toolutil/ucm.c | 6 +-
icuSources/tools/toolutil/ucm.h | 7 +-
icuSources/tools/toolutil/ucmpwrit.c | 164 -
icuSources/tools/toolutil/ucmpwrit.h | 30 -
icuSources/tools/toolutil/ucmstate.c | 6 +-
icuSources/tools/toolutil/uoptions.h | 7 +-
icuSources/tools/toolutil/uparse.c | 48 +-
icuSources/tools/toolutil/writesrc.c | 190 +
icuSources/tools/toolutil/writesrc.h | 70 +
icuSources/tools/toolutil/xmlparser.cpp | 820 +
icuSources/tools/toolutil/xmlparser.h | 245 +
icuSources/tools/tzcode/Makefile.in | 88 +
icuSources/tools/tzcode/asctime.c | 138 +
icuSources/tools/tzcode/ialloc.c | 86 +
icuSources/tools/tzcode/localtime.c | 2053 +
icuSources/tools/tzcode/patch-icu-tzcode | 475 -
icuSources/tools/tzcode/private.h | 368 +
icuSources/tools/tzcode/readme.txt | 92 +-
icuSources/tools/tzcode/scheck.c | 63 +
icuSources/tools/tzcode/tz2icu.cpp | 7 +-
icuSources/tools/tzcode/tzfile.h | 180 +
icuSources/tools/tzcode/tzselect.ksh | 308 +
icuSources/tools/tzcode/zic.c | 2948 +
license.html | 2 +-
makefile | 375 +-
minimalpatchconfig.txt | 11 +
patchconfig.txt | 11 +
windowspatchconfig.txt | 20 +
2226 files changed, 372153 insertions(+), 205919 deletions(-)
delete mode 100644 icuSources/allinone/all/all.dsp
delete mode 100644 icuSources/allinone/allinone.dsw
create mode 100644 icuSources/common/Makefile.local
create mode 100644 icuSources/common/aaplbfct.cpp
create mode 100644 icuSources/common/aaplbfct.h
delete mode 100644 icuSources/common/brkdict.cpp
delete mode 100644 icuSources/common/brkdict.h
create mode 100644 icuSources/common/brkeng.cpp
create mode 100644 icuSources/common/brkeng.h
delete mode 100644 icuSources/common/common.dsp
delete mode 100644 icuSources/common/dbbi.cpp
delete mode 100644 icuSources/common/dbbi_tbl.cpp
delete mode 100644 icuSources/common/dbbi_tbl.h
create mode 100644 icuSources/common/dictbe.cpp
create mode 100644 icuSources/common/dictbe.h
delete mode 100644 icuSources/common/iculserv.cpp
delete mode 100644 icuSources/common/icunotif.cpp
create mode 100644 icuSources/common/localsvc.cpp
create mode 100644 icuSources/common/localsvc.h
create mode 100644 icuSources/common/locutil.cpp
create mode 100644 icuSources/common/locutil.h
create mode 100644 icuSources/common/rbtok.cpp
create mode 100644 icuSources/common/rbtok.h
rename icuSources/common/{icuserv.cpp => serv.cpp} (99%)
rename icuSources/common/{icuserv.h => serv.h} (98%)
create mode 100644 icuSources/common/servlk.cpp
create mode 100644 icuSources/common/servlkf.cpp
rename icuSources/common/{iculserv.h => servloc.h} (92%)
create mode 100644 icuSources/common/servls.cpp
create mode 100644 icuSources/common/servnotf.cpp
rename icuSources/common/{icunotif.h => servnotf.h} (100%)
create mode 100644 icuSources/common/servrbf.cpp
create mode 100644 icuSources/common/servslkf.cpp
create mode 100644 icuSources/common/triedict.cpp
create mode 100644 icuSources/common/triedict.h
create mode 100644 icuSources/common/ubidi_props.c
create mode 100644 icuSources/common/ubidi_props.h
create mode 100644 icuSources/common/ubidi_props_data.c
create mode 100644 icuSources/common/ubrkimpl.h
create mode 100644 icuSources/common/ucase_props_data.c
create mode 100644 icuSources/common/ucasemap.c
create mode 100644 icuSources/common/uchar_props_data.c
delete mode 100644 icuSources/common/ucmp8.c
delete mode 100644 icuSources/common/ucmp8.h
create mode 100644 icuSources/common/umath.c
create mode 100644 icuSources/common/unicode/ppalmos.h
create mode 100644 icuSources/common/unicode/ucasemap.h
create mode 100644 icuSources/common/unicode/uintrnal.h
create mode 100644 icuSources/common/unicode/urbtok.h
create mode 100644 icuSources/common/unicode/usystem.h
create mode 100644 icuSources/common/unicode/utext.h
create mode 100644 icuSources/common/unorm_props_data.c
create mode 100644 icuSources/common/urbtok.cpp
create mode 100644 icuSources/common/utext.cpp
create mode 100644 icuSources/common/util_props.cpp
create mode 100644 icuSources/common/wintz.c
create mode 100644 icuSources/common/wintz.h
delete mode 100644 icuSources/config/mh-ptx
create mode 100644 icuSources/data/brkitr/brklocal.mk
create mode 100644 icuSources/data/brkitr/en.txt
create mode 100644 icuSources/data/brkitr/en_US.txt
create mode 100644 icuSources/data/brkitr/en_US_POSIX.txt
create mode 100644 icuSources/data/brkitr/ja.txt
delete mode 100644 icuSources/data/brkitr/line_th.txt
create mode 100644 icuSources/data/brkitr/root.txt
delete mode 100644 icuSources/data/brkitr/thaidict.brk
create mode 100644 icuSources/data/brkitr/thaidict.txt
delete mode 100644 icuSources/data/brkitr/word_th.txt
create mode 100644 icuSources/data/build.xml
create mode 100644 icuSources/data/cldr-icu-readme.txt
create mode 100644 icuSources/data/coll/as.txt
rename icuSources/data/coll/{ar_IN.txt => as_IN.txt} (71%)
create mode 100644 icuSources/data/coll/bn.txt
create mode 100644 icuSources/data/coll/de_.txt
create mode 100644 icuSources/data/coll/es_.txt
create mode 100644 icuSources/data/coll/hi_.txt
create mode 100644 icuSources/data/coll/in.txt
create mode 100644 icuSources/data/coll/in_ID.txt
create mode 100644 icuSources/data/coll/iw.txt
create mode 100644 icuSources/data/coll/iw_IL.txt
create mode 100644 icuSources/data/coll/kok.txt
create mode 100644 icuSources/data/coll/sh_BA.txt
create mode 100644 icuSources/data/coll/sr_BA.txt
create mode 100644 icuSources/data/coll/sr_Cyrl.txt
create mode 100644 icuSources/data/coll/sr_Cyrl_BA.txt
create mode 100644 icuSources/data/coll/sr_Cyrl_YU.txt
create mode 100644 icuSources/data/coll/zh_.txt
create mode 100644 icuSources/data/icu-config.xml
create mode 100644 icuSources/data/locales/as.txt
create mode 100644 icuSources/data/locales/as_IN.txt
create mode 100644 icuSources/data/locales/az.txt
create mode 100644 icuSources/data/locales/az_AZ.txt
create mode 100644 icuSources/data/locales/az_Cyrl.txt
create mode 100644 icuSources/data/locales/az_Cyrl_AZ.txt
create mode 100644 icuSources/data/locales/az_Latn.txt
create mode 100644 icuSources/data/locales/az_Latn_AZ.txt
create mode 100644 icuSources/data/locales/en_RH.txt
create mode 100644 icuSources/data/locales/sh_CS.txt
create mode 100644 icuSources/data/locales/sr_CS.txt
create mode 100644 icuSources/data/locales/sr_Cyrl_CS.txt
create mode 100644 icuSources/data/locales/sr_Latn_CS.txt
create mode 100644 icuSources/data/locales/ur.txt
create mode 100644 icuSources/data/locales/ur_IN.txt
create mode 100644 icuSources/data/locales/ur_PK.txt
create mode 100644 icuSources/data/locales/uz.txt
create mode 100644 icuSources/data/locales/uz_Cyrl.txt
create mode 100644 icuSources/data/locales/uz_Cyrl_UZ.txt
create mode 100644 icuSources/data/locales/uz_Latn.txt
create mode 100644 icuSources/data/locales/uz_Latn_UZ.txt
create mode 100644 icuSources/data/locales/uz_UZ.txt
delete mode 100644 icuSources/data/makedata.dsp
delete mode 100644 icuSources/data/mappings/ibm-1381_P110-1999.ucm
create mode 100644 icuSources/data/mappings/ibm-4517_P100-2005.ucm
rename icuSources/data/mappings/{ibm-1277_P100-1995.ucm => ibm-9005_X100-2005.ucm} (71%)
create mode 100644 icuSources/data/mappings/ibm-9067_X100-2005.ucm
create mode 100644 icuSources/data/mappings/ibm-9448_X100-2005.ucm
create mode 100644 icuSources/data/mappings/iso-8859_11-2001.ucm
create mode 100644 icuSources/data/mappings/iso-8859_14-1998.ucm
create mode 100644 icuSources/data/mappings/macos-6_2-10.4.ucm
create mode 100644 icuSources/data/misc/supplementalData.txt
create mode 100644 icuSources/data/rbnf/rbnflocal.mk
create mode 100644 icuSources/data/translit/Bengali_Devanagari.txt
create mode 100644 icuSources/data/translit/Bengali_Gujarati.txt
create mode 100644 icuSources/data/translit/Bengali_Gurmukhi.txt
create mode 100644 icuSources/data/translit/Bengali_Kannada.txt
create mode 100644 icuSources/data/translit/Bengali_Latin.txt
create mode 100644 icuSources/data/translit/Bengali_Malayalam.txt
create mode 100644 icuSources/data/translit/Bengali_Oriya.txt
create mode 100644 icuSources/data/translit/Bengali_Tamil.txt
create mode 100644 icuSources/data/translit/Bengali_Telugu.txt
create mode 100644 icuSources/data/translit/CanadianAboriginal_Latin.txt
create mode 100644 icuSources/data/translit/Devanagari_Bengali.txt
create mode 100644 icuSources/data/translit/Devanagari_Gujarati.txt
create mode 100644 icuSources/data/translit/Devanagari_Gurmukhi.txt
create mode 100644 icuSources/data/translit/Devanagari_Kannada.txt
create mode 100644 icuSources/data/translit/Devanagari_Latin.txt
create mode 100644 icuSources/data/translit/Devanagari_Malayalam.txt
create mode 100644 icuSources/data/translit/Devanagari_Oriya.txt
create mode 100644 icuSources/data/translit/Devanagari_Tamil.txt
create mode 100644 icuSources/data/translit/Devanagari_Telugu.txt
create mode 100644 icuSources/data/translit/Georgian_Latin.txt
create mode 100644 icuSources/data/translit/Gujarati_Bengali.txt
create mode 100644 icuSources/data/translit/Gujarati_Devanagari.txt
create mode 100644 icuSources/data/translit/Gujarati_Gurmukhi.txt
create mode 100644 icuSources/data/translit/Gujarati_Kannada.txt
create mode 100644 icuSources/data/translit/Gujarati_Latin.txt
create mode 100644 icuSources/data/translit/Gujarati_Malayalam.txt
create mode 100644 icuSources/data/translit/Gujarati_Oriya.txt
create mode 100644 icuSources/data/translit/Gujarati_Tamil.txt
create mode 100644 icuSources/data/translit/Gujarati_Telugu.txt
create mode 100644 icuSources/data/translit/Gurmukhi_Bengali.txt
create mode 100644 icuSources/data/translit/Gurmukhi_Devanagari.txt
create mode 100644 icuSources/data/translit/Gurmukhi_Gujarati.txt
create mode 100644 icuSources/data/translit/Gurmukhi_Kannada.txt
create mode 100644 icuSources/data/translit/Gurmukhi_Latin.txt
create mode 100644 icuSources/data/translit/Gurmukhi_Malayalam.txt
create mode 100644 icuSources/data/translit/Gurmukhi_Oriya.txt
create mode 100644 icuSources/data/translit/Gurmukhi_Tamil.txt
create mode 100644 icuSources/data/translit/Gurmukhi_Telugu.txt
create mode 100644 icuSources/data/translit/Hangul_Latin.txt
create mode 100644 icuSources/data/translit/Jamo_Latin.txt
create mode 100644 icuSources/data/translit/Kannada_Bengali.txt
create mode 100644 icuSources/data/translit/Kannada_Devanagari.txt
create mode 100644 icuSources/data/translit/Kannada_Gujarati.txt
create mode 100644 icuSources/data/translit/Kannada_Gurmukhi.txt
create mode 100644 icuSources/data/translit/Kannada_Latin.txt
create mode 100644 icuSources/data/translit/Kannada_Malayalam.txt
create mode 100644 icuSources/data/translit/Kannada_Oriya.txt
create mode 100644 icuSources/data/translit/Kannada_Tamil.txt
create mode 100644 icuSources/data/translit/Kannada_Telugu.txt
create mode 100644 icuSources/data/translit/Latin_Armenian.txt
create mode 100644 icuSources/data/translit/Latin_Bengali.txt
create mode 100644 icuSources/data/translit/Latin_ConjoiningJamo.txt
create mode 100644 icuSources/data/translit/Latin_Devanagari.txt
create mode 100644 icuSources/data/translit/Latin_Ethiopic.txt
create mode 100644 icuSources/data/translit/Latin_Gujarati.txt
create mode 100644 icuSources/data/translit/Latin_Gurmukhi.txt
create mode 100644 icuSources/data/translit/Latin_Hangul.txt
create mode 100644 icuSources/data/translit/Latin_Kannada.txt
create mode 100644 icuSources/data/translit/Latin_Malayalam.txt
create mode 100644 icuSources/data/translit/Latin_Oriya.txt
create mode 100644 icuSources/data/translit/Latin_Tamil.txt
create mode 100644 icuSources/data/translit/Latin_Telugu.txt
create mode 100644 icuSources/data/translit/Latin_Thai.txt
create mode 100644 icuSources/data/translit/Malayalam_Bengali.txt
create mode 100644 icuSources/data/translit/Malayalam_Devanagari.txt
create mode 100644 icuSources/data/translit/Malayalam_Gujarati.txt
create mode 100644 icuSources/data/translit/Malayalam_Gurmukhi.txt
create mode 100644 icuSources/data/translit/Malayalam_Kannada.txt
create mode 100644 icuSources/data/translit/Malayalam_Latin.txt
create mode 100644 icuSources/data/translit/Malayalam_Oriya.txt
create mode 100644 icuSources/data/translit/Malayalam_Tamil.txt
create mode 100644 icuSources/data/translit/Malayalam_Telugu.txt
create mode 100644 icuSources/data/translit/Oriya_Bengali.txt
create mode 100644 icuSources/data/translit/Oriya_Devanagari.txt
create mode 100644 icuSources/data/translit/Oriya_Gujarati.txt
create mode 100644 icuSources/data/translit/Oriya_Gurmukhi.txt
create mode 100644 icuSources/data/translit/Oriya_Kannada.txt
create mode 100644 icuSources/data/translit/Oriya_Latin.txt
create mode 100644 icuSources/data/translit/Oriya_Malayalam.txt
create mode 100644 icuSources/data/translit/Oriya_Tamil.txt
create mode 100644 icuSources/data/translit/Oriya_Telugu.txt
create mode 100644 icuSources/data/translit/Pinyin_NumericPinyin.txt
create mode 100644 icuSources/data/translit/Simplified_Traditional.txt
create mode 100644 icuSources/data/translit/Spacedhan_Han.txt
create mode 100644 icuSources/data/translit/Syriac_Latin.txt
create mode 100644 icuSources/data/translit/Tamil_Bengali.txt
create mode 100644 icuSources/data/translit/Tamil_Devanagari.txt
create mode 100644 icuSources/data/translit/Tamil_Gujarati.txt
create mode 100644 icuSources/data/translit/Tamil_Gurmukhi.txt
create mode 100644 icuSources/data/translit/Tamil_Kannada.txt
create mode 100644 icuSources/data/translit/Tamil_Latin.txt
create mode 100644 icuSources/data/translit/Tamil_Malayalam.txt
create mode 100644 icuSources/data/translit/Tamil_Oriya.txt
create mode 100644 icuSources/data/translit/Tamil_Telugu.txt
create mode 100644 icuSources/data/translit/Telugu_Bengali.txt
create mode 100644 icuSources/data/translit/Telugu_Devanagari.txt
create mode 100644 icuSources/data/translit/Telugu_Gujarati.txt
create mode 100644 icuSources/data/translit/Telugu_Gurmukhi.txt
create mode 100644 icuSources/data/translit/Telugu_Kannada.txt
create mode 100644 icuSources/data/translit/Telugu_Latin.txt
create mode 100644 icuSources/data/translit/Telugu_Malayalam.txt
create mode 100644 icuSources/data/translit/Telugu_Oriya.txt
create mode 100644 icuSources/data/translit/Telugu_Tamil.txt
create mode 100644 icuSources/data/translit/Thaana_Latin.txt
create mode 100644 icuSources/data/translit/Thai_Latin.txt
delete mode 100644 icuSources/data/translit/Tone_Digit.txt
create mode 100644 icuSources/data/unidata/ApplePUApatch.txt
create mode 100644 icuSources/data/unidata/GraphemeBreakProperty.txt
create mode 100644 icuSources/data/unidata/SentenceBreakProperty.txt
create mode 100644 icuSources/data/unidata/WordBreakProperty.txt
create mode 100644 icuSources/data/unidata/base_unidata/DerivedBidiClass.txt
create mode 100644 icuSources/data/unidata/base_unidata/DerivedCoreProperties.txt
create mode 100644 icuSources/data/unidata/base_unidata/DerivedNumericValues.txt
create mode 100644 icuSources/data/unidata/base_unidata/EastAsianWidth.txt
create mode 100644 icuSources/data/unidata/base_unidata/GraphemeBreakProperty.txt
create mode 100644 icuSources/data/unidata/base_unidata/LineBreak.txt
create mode 100644 icuSources/data/unidata/base_unidata/Scripts.txt
create mode 100644 icuSources/data/unidata/base_unidata/UnicodeData.txt
create mode 100644 icuSources/data/xml/brkitr/en.xml
create mode 100644 icuSources/data/xml/brkitr/en_US.xml
create mode 100644 icuSources/data/xml/brkitr/en_US_POSIX.xml
create mode 100644 icuSources/data/xml/brkitr/ja.xml
create mode 100644 icuSources/data/xml/brkitr/root.xml
create mode 100644 icuSources/data/xml/collation/ar.xml
create mode 100644 icuSources/data/xml/collation/be.xml
create mode 100644 icuSources/data/xml/collation/bg.xml
create mode 100644 icuSources/data/xml/collation/ca.xml
create mode 100644 icuSources/data/xml/collation/cs.xml
create mode 100644 icuSources/data/xml/collation/da.xml
create mode 100644 icuSources/data/xml/collation/de.xml
create mode 100644 icuSources/data/xml/collation/dz.xml
create mode 100644 icuSources/data/xml/collation/el.xml
create mode 100644 icuSources/data/xml/collation/en.xml
create mode 100644 icuSources/data/xml/collation/en_BE.xml
create mode 100644 icuSources/data/xml/collation/eo.xml
create mode 100644 icuSources/data/xml/collation/es.xml
create mode 100644 icuSources/data/xml/collation/et.xml
create mode 100644 icuSources/data/xml/collation/fa.xml
create mode 100644 icuSources/data/xml/collation/fa_AF.xml
create mode 100644 icuSources/data/xml/collation/fi.xml
create mode 100644 icuSources/data/xml/collation/fo.xml
create mode 100644 icuSources/data/xml/collation/fr.xml
create mode 100644 icuSources/data/xml/collation/gu.xml
create mode 100644 icuSources/data/xml/collation/he.xml
create mode 100644 icuSources/data/xml/collation/hi.xml
create mode 100644 icuSources/data/xml/collation/hr.xml
create mode 100644 icuSources/data/xml/collation/hu.xml
create mode 100644 icuSources/data/xml/collation/is.xml
create mode 100644 icuSources/data/xml/collation/it.xml
create mode 100644 icuSources/data/xml/collation/ja.xml
create mode 100644 icuSources/data/xml/collation/kk.xml
create mode 100644 icuSources/data/xml/collation/kl.xml
create mode 100644 icuSources/data/xml/collation/kn.xml
create mode 100644 icuSources/data/xml/collation/ko.xml
create mode 100644 icuSources/data/xml/collation/lt.xml
create mode 100644 icuSources/data/xml/collation/lv.xml
create mode 100644 icuSources/data/xml/collation/mk.xml
create mode 100644 icuSources/data/xml/collation/ml.xml
create mode 100644 icuSources/data/xml/collation/mr.xml
create mode 100644 icuSources/data/xml/collation/mt.xml
create mode 100644 icuSources/data/xml/collation/nb.xml
create mode 100644 icuSources/data/xml/collation/nn.xml
create mode 100644 icuSources/data/xml/collation/om.xml
create mode 100644 icuSources/data/xml/collation/or.xml
create mode 100644 icuSources/data/xml/collation/pa.xml
create mode 100644 icuSources/data/xml/collation/pl.xml
create mode 100644 icuSources/data/xml/collation/ps.xml
create mode 100644 icuSources/data/xml/collation/ro.xml
create mode 100644 icuSources/data/xml/collation/root.xml
create mode 100644 icuSources/data/xml/collation/ru.xml
create mode 100644 icuSources/data/xml/collation/sh.xml
create mode 100644 icuSources/data/xml/collation/sk.xml
create mode 100644 icuSources/data/xml/collation/sl.xml
create mode 100644 icuSources/data/xml/collation/sq.xml
create mode 100644 icuSources/data/xml/collation/sr.xml
create mode 100644 icuSources/data/xml/collation/sv.xml
create mode 100644 icuSources/data/xml/collation/ta.xml
create mode 100644 icuSources/data/xml/collation/te.xml
create mode 100644 icuSources/data/xml/collation/th.xml
create mode 100644 icuSources/data/xml/collation/tr.xml
create mode 100644 icuSources/data/xml/collation/uk.xml
create mode 100644 icuSources/data/xml/collation/vi.xml
create mode 100644 icuSources/data/xml/collation/zh.xml
create mode 100644 icuSources/data/xml/collation/zh_HK.xml
create mode 100644 icuSources/data/xml/collation/zh_Hant.xml
create mode 100644 icuSources/data/xml/collation/zh_MO.xml
create mode 100644 icuSources/data/xml/collation/zh_TW.xml
create mode 100644 icuSources/data/xml/collation/zh_TW_STROKE.xml
create mode 100644 icuSources/data/xml/experimental/aa.txt
create mode 100644 icuSources/data/xml/experimental/aa_DJ.txt
create mode 100644 icuSources/data/xml/experimental/aa_ER.txt
create mode 100644 icuSources/data/xml/experimental/aa_ER_SAAHO.txt
create mode 100644 icuSources/data/xml/experimental/aa_ET.txt
create mode 100644 icuSources/data/xml/experimental/bs.txt
create mode 100644 icuSources/data/xml/experimental/bs_BA.txt
create mode 100644 icuSources/data/xml/experimental/byn.txt
create mode 100644 icuSources/data/xml/experimental/byn_ER.txt
create mode 100644 icuSources/data/xml/experimental/de_LI.txt
create mode 100644 icuSources/data/xml/experimental/dv.txt
create mode 100644 icuSources/data/xml/experimental/dv_MV.txt
create mode 100644 icuSources/data/xml/experimental/dz.txt
create mode 100644 icuSources/data/xml/experimental/dz_BT.txt
create mode 100644 icuSources/data/xml/experimental/el_CY.txt
create mode 100644 icuSources/data/xml/experimental/en_AS.txt
create mode 100644 icuSources/data/xml/experimental/en_BZ.txt
create mode 100644 icuSources/data/xml/experimental/en_GU.txt
create mode 100644 icuSources/data/xml/experimental/en_JM.txt
create mode 100644 icuSources/data/xml/experimental/en_MH.txt
create mode 100644 icuSources/data/xml/experimental/en_MP.txt
create mode 100644 icuSources/data/xml/experimental/en_TT.txt
create mode 100644 icuSources/data/xml/experimental/en_UM.txt
create mode 100644 icuSources/data/xml/experimental/fr_MC.txt
create mode 100644 icuSources/data/xml/experimental/gez.txt
create mode 100644 icuSources/data/xml/experimental/gez_ER.txt
create mode 100644 icuSources/data/xml/experimental/gez_ET.txt
create mode 100644 icuSources/data/xml/experimental/haw.txt
create mode 100644 icuSources/data/xml/experimental/haw_US.txt
create mode 100644 icuSources/data/xml/experimental/iu.txt
create mode 100644 icuSources/data/xml/experimental/ka.txt
create mode 100644 icuSources/data/xml/experimental/ka_GE.txt
create mode 100644 icuSources/data/xml/experimental/km.txt
create mode 100644 icuSources/data/xml/experimental/km_KH.txt
create mode 100644 icuSources/data/xml/experimental/ky.txt
create mode 100644 icuSources/data/xml/experimental/ky_KG.txt
create mode 100644 icuSources/data/xml/experimental/lo.txt
create mode 100644 icuSources/data/xml/experimental/lo_LA.txt
create mode 100644 icuSources/data/xml/experimental/mn.txt
create mode 100644 icuSources/data/xml/experimental/mn_MN.txt
create mode 100644 icuSources/data/xml/experimental/sa.txt
rename icuSources/data/{locales/ar_IN.txt => xml/experimental/sa_IN.txt} (64%)
create mode 100644 icuSources/data/xml/experimental/sh_BA.txt
create mode 100644 icuSources/data/xml/experimental/sid.txt
create mode 100644 icuSources/data/xml/experimental/sid_ET.txt
create mode 100644 icuSources/data/xml/experimental/sr_BA.txt
create mode 100644 icuSources/data/xml/experimental/sr_Cyrl_BA.txt
create mode 100644 icuSources/data/xml/experimental/sr_Latn_BA.txt
create mode 100644 icuSources/data/xml/experimental/syr.txt
create mode 100644 icuSources/data/xml/experimental/syr_SY.txt
create mode 100644 icuSources/data/xml/experimental/tig.txt
create mode 100644 icuSources/data/xml/experimental/tig_ER.txt
create mode 100644 icuSources/data/xml/experimental/tt.txt
create mode 100644 icuSources/data/xml/experimental/tt_RU.txt
create mode 100644 icuSources/data/xml/experimental/uz_AF.txt
create mode 100644 icuSources/data/xml/experimental/uz_Arab.txt
create mode 100644 icuSources/data/xml/experimental/uz_Arab_AF.txt
create mode 100644 icuSources/data/xml/experimental/wal.txt
create mode 100644 icuSources/data/xml/experimental/wal_ET.txt
create mode 100644 icuSources/data/xml/main/aa.xml
create mode 100644 icuSources/data/xml/main/af.xml
create mode 100644 icuSources/data/xml/main/am.xml
create mode 100644 icuSources/data/xml/main/ar.xml
create mode 100644 icuSources/data/xml/main/as.xml
create mode 100644 icuSources/data/xml/main/az.xml
create mode 100644 icuSources/data/xml/main/az_AZ.xml
create mode 100644 icuSources/data/xml/main/az_Cyrl.xml
create mode 100644 icuSources/data/xml/main/az_Latn.xml
create mode 100644 icuSources/data/xml/main/be.xml
create mode 100644 icuSources/data/xml/main/bg.xml
create mode 100644 icuSources/data/xml/main/bn.xml
create mode 100644 icuSources/data/xml/main/bs.xml
create mode 100644 icuSources/data/xml/main/byn.xml
create mode 100644 icuSources/data/xml/main/ca.xml
create mode 100644 icuSources/data/xml/main/cs.xml
create mode 100644 icuSources/data/xml/main/cy.xml
create mode 100644 icuSources/data/xml/main/da.xml
create mode 100644 icuSources/data/xml/main/de.xml
create mode 100644 icuSources/data/xml/main/dv.xml
create mode 100644 icuSources/data/xml/main/dz.xml
create mode 100644 icuSources/data/xml/main/el.xml
create mode 100644 icuSources/data/xml/main/en.xml
create mode 100644 icuSources/data/xml/main/en_US_POSIX.xml
create mode 100644 icuSources/data/xml/main/eo.xml
create mode 100644 icuSources/data/xml/main/es.xml
create mode 100644 icuSources/data/xml/main/et.xml
create mode 100644 icuSources/data/xml/main/eu.xml
create mode 100644 icuSources/data/xml/main/fa.xml
create mode 100644 icuSources/data/xml/main/fi.xml
create mode 100644 icuSources/data/xml/main/fo.xml
create mode 100644 icuSources/data/xml/main/fr.xml
create mode 100644 icuSources/data/xml/main/ga.xml
create mode 100644 icuSources/data/xml/main/gez.xml
create mode 100644 icuSources/data/xml/main/gl.xml
create mode 100644 icuSources/data/xml/main/gu.xml
create mode 100644 icuSources/data/xml/main/gv.xml
create mode 100644 icuSources/data/xml/main/haw.xml
create mode 100644 icuSources/data/xml/main/he.xml
create mode 100644 icuSources/data/xml/main/hi.xml
create mode 100644 icuSources/data/xml/main/hr.xml
create mode 100644 icuSources/data/xml/main/hu.xml
create mode 100644 icuSources/data/xml/main/hy.xml
create mode 100644 icuSources/data/xml/main/id.xml
create mode 100644 icuSources/data/xml/main/is.xml
create mode 100644 icuSources/data/xml/main/it.xml
create mode 100644 icuSources/data/xml/main/iu.xml
create mode 100644 icuSources/data/xml/main/iw.xml
create mode 100644 icuSources/data/xml/main/ja.xml
create mode 100644 icuSources/data/xml/main/ka.xml
create mode 100644 icuSources/data/xml/main/kk.xml
create mode 100644 icuSources/data/xml/main/kl.xml
create mode 100644 icuSources/data/xml/main/km.xml
create mode 100644 icuSources/data/xml/main/kn.xml
create mode 100644 icuSources/data/xml/main/ko.xml
create mode 100644 icuSources/data/xml/main/kok.xml
create mode 100644 icuSources/data/xml/main/kw.xml
create mode 100644 icuSources/data/xml/main/ky.xml
create mode 100644 icuSources/data/xml/main/lo.xml
create mode 100644 icuSources/data/xml/main/lt.xml
create mode 100644 icuSources/data/xml/main/lv.xml
create mode 100644 icuSources/data/xml/main/mk.xml
create mode 100644 icuSources/data/xml/main/ml.xml
create mode 100644 icuSources/data/xml/main/mn.xml
create mode 100644 icuSources/data/xml/main/mr.xml
create mode 100644 icuSources/data/xml/main/ms.xml
create mode 100644 icuSources/data/xml/main/mt.xml
create mode 100644 icuSources/data/xml/main/nb.xml
create mode 100644 icuSources/data/xml/main/nl.xml
create mode 100644 icuSources/data/xml/main/nn.xml
create mode 100644 icuSources/data/xml/main/no.xml
create mode 100644 icuSources/data/xml/main/om.xml
create mode 100644 icuSources/data/xml/main/or.xml
create mode 100644 icuSources/data/xml/main/pa.xml
create mode 100644 icuSources/data/xml/main/pl.xml
create mode 100644 icuSources/data/xml/main/ps.xml
create mode 100644 icuSources/data/xml/main/pt.xml
create mode 100644 icuSources/data/xml/main/ro.xml
create mode 100644 icuSources/data/xml/main/root.xml
create mode 100644 icuSources/data/xml/main/ru.xml
create mode 100644 icuSources/data/xml/main/sa.xml
create mode 100644 icuSources/data/xml/main/sh.xml
create mode 100644 icuSources/data/xml/main/sid.xml
create mode 100644 icuSources/data/xml/main/sk.xml
create mode 100644 icuSources/data/xml/main/sl.xml
create mode 100644 icuSources/data/xml/main/so.xml
create mode 100644 icuSources/data/xml/main/sq.xml
create mode 100644 icuSources/data/xml/main/sr.xml
create mode 100644 icuSources/data/xml/main/sr_Cyrl.xml
create mode 100644 icuSources/data/xml/main/sr_Latn.xml
create mode 100644 icuSources/data/xml/main/sv.xml
create mode 100644 icuSources/data/xml/main/sw.xml
create mode 100644 icuSources/data/xml/main/syr.xml
create mode 100644 icuSources/data/xml/main/ta.xml
create mode 100644 icuSources/data/xml/main/te.xml
create mode 100644 icuSources/data/xml/main/th.xml
create mode 100644 icuSources/data/xml/main/ti.xml
create mode 100644 icuSources/data/xml/main/tig.xml
create mode 100644 icuSources/data/xml/main/tr.xml
create mode 100644 icuSources/data/xml/main/tt.xml
create mode 100644 icuSources/data/xml/main/uk.xml
create mode 100644 icuSources/data/xml/main/ur.xml
create mode 100644 icuSources/data/xml/main/ur_IN.xml
create mode 100644 icuSources/data/xml/main/uz.xml
create mode 100644 icuSources/data/xml/main/uz_Arab.xml
create mode 100644 icuSources/data/xml/main/uz_Cyrl.xml
create mode 100644 icuSources/data/xml/main/uz_Latn.xml
create mode 100644 icuSources/data/xml/main/uz_UZ.xml
create mode 100644 icuSources/data/xml/main/vi.xml
create mode 100644 icuSources/data/xml/main/wal.xml
create mode 100644 icuSources/data/xml/main/zh.xml
create mode 100644 icuSources/data/xml/main/zh_Hans.xml
create mode 100644 icuSources/data/xml/main/zh_Hant.xml
delete mode 100644 icuSources/extra/uconv/uconv.dsp
create mode 100644 icuSources/i18n/csdetect.cpp
create mode 100644 icuSources/i18n/csdetect.h
create mode 100644 icuSources/i18n/csmatch.cpp
create mode 100644 icuSources/i18n/csmatch.h
create mode 100644 icuSources/i18n/csr2022.cpp
create mode 100644 icuSources/i18n/csr2022.h
create mode 100644 icuSources/i18n/csrecog.cpp
create mode 100644 icuSources/i18n/csrecog.h
create mode 100644 icuSources/i18n/csrmbcs.cpp
create mode 100644 icuSources/i18n/csrmbcs.h
create mode 100644 icuSources/i18n/csrsbcs.cpp
create mode 100644 icuSources/i18n/csrsbcs.h
create mode 100644 icuSources/i18n/csrucode.cpp
create mode 100644 icuSources/i18n/csrucode.h
create mode 100644 icuSources/i18n/csrutf8.cpp
create mode 100644 icuSources/i18n/csrutf8.h
create mode 100644 icuSources/i18n/decimfmt.cpp.fixed
create mode 100644 icuSources/i18n/fmtable_cnv.cpp
delete mode 100644 icuSources/i18n/i18n.dsp
create mode 100644 icuSources/i18n/inputext.cpp
create mode 100644 icuSources/i18n/inputext.h
create mode 100644 icuSources/i18n/ucol_res.cpp
create mode 100644 icuSources/i18n/ucsdet.cpp
create mode 100644 icuSources/i18n/unicode/ucsdet.h
create mode 100644 icuSources/i18n/uregexc.cpp
create mode 100644 icuSources/i18n/windtfmt.cpp
create mode 100644 icuSources/i18n/windtfmt.h
create mode 100644 icuSources/i18n/winnmfmt.cpp
create mode 100644 icuSources/i18n/winnmfmt.h
delete mode 100644 icuSources/io/io.dsp
create mode 100644 icuSources/io/ucln_io.c
create mode 100644 icuSources/io/ucln_io.h
create mode 100644 icuSources/layout/CanonShaping.cpp
create mode 100644 icuSources/layout/GlyphPositionAdjustments.cpp
create mode 100644 icuSources/layout/HangulLayoutEngine.cpp
create mode 100644 icuSources/layout/HangulLayoutEngine.h
create mode 100644 icuSources/layout/KernTable.cpp
create mode 100644 icuSources/layout/KernTable.h
create mode 100644 icuSources/layout/KhmerLayoutEngine.cpp
create mode 100644 icuSources/layout/KhmerLayoutEngine.h
create mode 100644 icuSources/layout/KhmerReordering.cpp
create mode 100644 icuSources/layout/KhmerReordering.h
create mode 100644 icuSources/layout/MirroredCharData.cpp
create mode 100644 icuSources/layout/ShapingTypeData.cpp
create mode 100644 icuSources/layout/TibetanLayoutEngine.cpp
create mode 100644 icuSources/layout/TibetanLayoutEngine.h
create mode 100644 icuSources/layout/TibetanReordering.cpp
create mode 100644 icuSources/layout/TibetanReordering.h
delete mode 100644 icuSources/layout/layout.dsp
delete mode 100644 icuSources/layout/loengine.cpp
delete mode 100644 icuSources/layout/unicode/loengine.h
delete mode 100644 icuSources/layoutex/layoutex.dsp
delete mode 100644 icuSources/samples/all/all.dsp
delete mode 100644 icuSources/samples/all/all.dsw
delete mode 100644 icuSources/samples/break/break.dsp
delete mode 100644 icuSources/samples/break/break.dsw
delete mode 100644 icuSources/samples/cal/cal.dsp
delete mode 100644 icuSources/samples/cal/cal.dsw
delete mode 100644 icuSources/samples/case/case.dsp
delete mode 100644 icuSources/samples/case/case.dsw
create mode 100644 icuSources/samples/citer/Makefile
create mode 100644 icuSources/samples/citer/citer.vcproj
delete mode 100644 icuSources/samples/coll/coll.dsp
delete mode 100644 icuSources/samples/coll/coll.dsw
create mode 100644 icuSources/samples/csdet/Makefile.in
create mode 100644 icuSources/samples/csdet/csdet.c
create mode 100644 icuSources/samples/csdet/csdet.sln
create mode 100644 icuSources/samples/csdet/csdet.vcproj
delete mode 100644 icuSources/samples/date/date.dsp
delete mode 100644 icuSources/samples/date/date.dsw
delete mode 100644 icuSources/samples/datefmt/datefmt.dsp
delete mode 100644 icuSources/samples/datefmt/datefmt.dsw
delete mode 100644 icuSources/samples/layout/layout.dsp
delete mode 100644 icuSources/samples/layout/layout.dsw
delete mode 100644 icuSources/samples/legacy/legacy.dsp
delete mode 100644 icuSources/samples/legacy/legacy.dsw
delete mode 100644 icuSources/samples/msgfmt/msgfmt.dsp
delete mode 100644 icuSources/samples/msgfmt/msgfmt.dsw
delete mode 100644 icuSources/samples/numfmt/numfmt.dsp
delete mode 100644 icuSources/samples/numfmt/numfmt.dsw
delete mode 100644 icuSources/samples/props/props.dsp
delete mode 100644 icuSources/samples/props/props.dsw
delete mode 100644 icuSources/samples/strsrch/strsrch.dsp
delete mode 100644 icuSources/samples/strsrch/strsrch.dsw
delete mode 100644 icuSources/samples/translit/translit.dsp
delete mode 100644 icuSources/samples/translit/translit.dsw
delete mode 100644 icuSources/samples/uciter8/uciter8.dsp
delete mode 100644 icuSources/samples/uciter8/uciter8.dsw
delete mode 100644 icuSources/samples/ucnv/ucnv.dsp
delete mode 100644 icuSources/samples/ucnv/ucnv.dsw
delete mode 100644 icuSources/samples/udata/reader.dsp
delete mode 100644 icuSources/samples/udata/udata.dsw
delete mode 100644 icuSources/samples/udata/writer.dsp
delete mode 100644 icuSources/samples/ufortune/ufortune.dsp
delete mode 100644 icuSources/samples/ufortune/ufortune.dsw
delete mode 100644 icuSources/samples/ugrep/ugrep.dsp
delete mode 100644 icuSources/samples/ugrep/ugrep.dsw
delete mode 100644 icuSources/samples/uresb/resources.dsp
delete mode 100644 icuSources/samples/uresb/uresb.dsp
delete mode 100644 icuSources/samples/uresb/uresb.dsw
delete mode 100644 icuSources/samples/ustring/ustring.dsp
delete mode 100644 icuSources/samples/ustring/ustring.dsw
delete mode 100644 icuSources/samples/xml2txt/readme.txt
delete mode 100644 icuSources/stubdata/stubdata.dsp
delete mode 100644 icuSources/test/cintltst/cdantst.c
delete mode 100644 icuSources/test/cintltst/cdantst.h
delete mode 100644 icuSources/test/cintltst/cintltst.dsp
delete mode 100644 icuSources/test/cintltst/cregrtst.c
delete mode 100644 icuSources/test/cintltst/cregrtst.h
delete mode 100644 icuSources/test/cintltst/cucdtst.h
create mode 100644 icuSources/test/cintltst/currtest.c
delete mode 100644 icuSources/test/cintltst/ucmptst.c
create mode 100644 icuSources/test/cintltst/ucsdetst.c
create mode 100644 icuSources/test/cintltst/utexttst.c
delete mode 100644 icuSources/test/collperf/collperf.cpp
delete mode 100644 icuSources/test/collperf/collperf.dsp
delete mode 100644 icuSources/test/collperf/readme.html
create mode 100644 icuSources/test/intltest/aliastst.cpp
create mode 100644 icuSources/test/intltest/aliastst.h
create mode 100644 icuSources/test/intltest/csdetest.cpp
create mode 100644 icuSources/test/intltest/csdetest.h
delete mode 100644 icuSources/test/intltest/dacoll.cpp
delete mode 100644 icuSources/test/intltest/dacoll.h
create mode 100644 icuSources/test/intltest/idnaconf.cpp
create mode 100644 icuSources/test/intltest/idnaconf.h
delete mode 100644 icuSources/test/intltest/intltest.dsp
create mode 100644 icuSources/test/intltest/rndmcoll.cpp
create mode 100644 icuSources/test/intltest/rndmcoll.h
create mode 100644 icuSources/test/intltest/utxttest.cpp
create mode 100644 icuSources/test/intltest/utxttest.h
create mode 100644 icuSources/test/intltest/uvectest.cpp
create mode 100644 icuSources/test/intltest/uvectest.h
create mode 100644 icuSources/test/intltest/wbnf.cpp
create mode 100644 icuSources/test/intltest/wbnf.h
create mode 100644 icuSources/test/intltest/windttst.cpp
create mode 100644 icuSources/test/intltest/windttst.h
create mode 100644 icuSources/test/intltest/winnmtst.cpp
create mode 100644 icuSources/test/intltest/winnmtst.h
create mode 100644 icuSources/test/intltest/winutil.cpp
create mode 100644 icuSources/test/intltest/winutil.h
delete mode 100644 icuSources/test/iotest/iotest.dsp
create mode 100644 icuSources/test/iotest/stream.cpp
create mode 100644 icuSources/test/iotest/trnstst.c
create mode 100644 icuSources/test/letest/SimpleFontInstance.cpp
create mode 100644 icuSources/test/letest/SimpleFontInstance.h
delete mode 100644 icuSources/test/letest/gendata.dsp
delete mode 100644 icuSources/test/letest/gendata.dsw
create mode 100644 icuSources/test/letest/gendata.xml
delete mode 100644 icuSources/test/letest/letest.dsp
delete mode 100644 icuSources/test/letest/letest.dsw
create mode 100644 icuSources/test/letest/letsutil.cpp
create mode 100644 icuSources/test/letest/letsutil.h
delete mode 100644 icuSources/test/perf/all/all.dsp
delete mode 100644 icuSources/test/perf/charperf/charperf.dsp
create mode 100644 icuSources/test/perf/charperf/charperf.vcproj
create mode 100644 icuSources/test/perf/collperf/CollPerf.pl
rename icuSources/test/{ => perf}/collperf/Makefile.in (70%)
create mode 100644 icuSources/test/perf/collperf/collperf.cpp
create mode 100644 icuSources/test/perf/collperf/collperf.vcproj
delete mode 100644 icuSources/test/perf/convperf/convperf.dsp
create mode 100644 icuSources/test/perf/convperf/convperf.vcproj
delete mode 100644 icuSources/test/perf/normperf/normperf.dsp
create mode 100644 icuSources/test/perf/normperf/normperf.vcproj
delete mode 100644 icuSources/test/perf/perf.dsw
create mode 100644 icuSources/test/perf/perf.sln
create mode 100644 icuSources/test/perf/ubrkperf/ubrkperf.vcproj
rename icuSources/test/{unalignedtest => perf/usetperf}/Makefile.in (69%)
create mode 100644 icuSources/test/perf/usetperf/UsetPerf.pl
rename icuSources/test/{ => perf}/usetperf/bitset.cpp (96%)
rename icuSources/test/{ => perf}/usetperf/bitset.h (91%)
create mode 100644 icuSources/test/perf/usetperf/usetperf.cpp
create mode 100644 icuSources/test/perf/usetperf/usetperf.vcproj
create mode 100644 icuSources/test/perf/ustrperf/Makefile.in
create mode 100644 icuSources/test/perf/utfperf/Makefile.in
create mode 100644 icuSources/test/perf/utfperf/UtfPerf.pl
create mode 100644 icuSources/test/perf/utfperf/utfperf.cpp
create mode 100644 icuSources/test/perf/utfperf/utfperf.vcproj
create mode 100644 icuSources/test/testdata/GraphemeClusterBreakTest.txt
create mode 100644 icuSources/test/testdata/SentenceBreakTest.txt
create mode 100644 icuSources/test/testdata/WordBreakTest.txt
create mode 100644 icuSources/test/testdata/csdetest.xml
rename icuSources/test/testdata/{testdata_icu26_testtypes.res => icu26_testtypes.res} (100%)
rename icuSources/test/testdata/{testdata_icu26e_testtypes.res => icu26e_testtypes.res} (100%)
create mode 100644 icuSources/test/testdata/idna_conf.txt
create mode 100644 icuSources/test/testdata/letest.xml
create mode 100644 icuSources/test/testdata/ra.xlf
create mode 100644 icuSources/test/testdata/sh.txt
create mode 100644 icuSources/test/testdata/sh_YU.txt
create mode 100644 icuSources/test/testdata/te_IN_REVISED.txt
delete mode 100644 icuSources/test/unalignedtest/readme
delete mode 100644 icuSources/test/unalignedtest/unaligned.c
delete mode 100644 icuSources/test/usetperf/timer.h
delete mode 100644 icuSources/test/usetperf/usetperf.cpp
delete mode 100644 icuSources/test/usetperf/usetperf.dsp
delete mode 100644 icuSources/test/utfperf/utfperf.c
delete mode 100644 icuSources/test/utfperf/utfperf.dsp
delete mode 100644 icuSources/tools/ctestfw/ctestfw.dsp
rename icuSources/tools/{toolutil => ctestfw/unicode}/uperf.h (92%)
rename icuSources/tools/{toolutil => ctestfw/unicode}/utimer.h (72%)
rename icuSources/tools/{toolutil => ctestfw}/uperf.cpp (96%)
create mode 100644 icuSources/tools/genbidi/Makefile.in
create mode 100644 icuSources/tools/genbidi/genbidi.c
create mode 100644 icuSources/tools/genbidi/genbidi.h
create mode 100644 icuSources/tools/genbidi/genbidi.vcproj
create mode 100644 icuSources/tools/genbidi/store.c
create mode 100644 icuSources/tools/genbrk/genbrk.1.in
delete mode 100644 icuSources/tools/genbrk/genbrk.dsp
delete mode 100644 icuSources/tools/gencase/gencase.8.in
delete mode 100644 icuSources/tools/gencase/gencase.dsp
delete mode 100644 icuSources/tools/genccode/genccode.dsp
delete mode 100644 icuSources/tools/gencmn/decmn.8.in
delete mode 100644 icuSources/tools/gencmn/decmn.c
delete mode 100644 icuSources/tools/gencmn/decmn.dsp
delete mode 100644 icuSources/tools/gencmn/gencmn.dsp
delete mode 100644 icuSources/tools/gencnval/gencnval.dsp
create mode 100644 icuSources/tools/genctd/Makefile.in
create mode 100644 icuSources/tools/genctd/genctd.1.in
create mode 100644 icuSources/tools/genctd/genctd.cpp
rename icuSources/tools/{gencmn/decmn.vcproj => genctd/genctd.vcproj} (70%)
delete mode 100644 icuSources/tools/gendraft/DeprecatedApi.txt
delete mode 100644 icuSources/tools/gendraft/DraftApi.txt
delete mode 100644 icuSources/tools/gendraft/ObsoleteApi.txt
create mode 100644 icuSources/tools/gendraft/exclude.txt
delete mode 100644 icuSources/tools/gendraft/gendraft.pl
create mode 100644 icuSources/tools/gendraft/genheaders.pl
delete mode 100644 icuSources/tools/gennames/gennames.8.in
delete mode 100644 icuSources/tools/gennames/gennames.dsp
delete mode 100644 icuSources/tools/gennorm/gennorm.8.in
delete mode 100644 icuSources/tools/gennorm/gennorm.dsp
create mode 100644 icuSources/tools/genpname/SyntheticPropertyValueAliases.txt
delete mode 100644 icuSources/tools/genpname/genpname.dsp
create mode 100644 icuSources/tools/genpname/gensvpa.pl
delete mode 100644 icuSources/tools/genprops/genprops.8.in
delete mode 100644 icuSources/tools/genprops/genprops.dsp
delete mode 100644 icuSources/tools/genrb/derb.dsp
delete mode 100644 icuSources/tools/genrb/genrb.dsp
delete mode 100644 icuSources/tools/genrb/genrbjar.pl
rename icuSources/tools/genrb/{util.c => rbutil.c} (96%)
rename icuSources/tools/genrb/{util.h => rbutil.h} (89%)
delete mode 100644 icuSources/tools/gensprep/gensprep.dsp
delete mode 100644 icuSources/tools/gentest/gentest.dsp
delete mode 100644 icuSources/tools/genuca/genuca.dsp
create mode 100644 icuSources/tools/icupkg/Makefile.in
create mode 100644 icuSources/tools/icupkg/icupkg.1.in
create mode 100644 icuSources/tools/icupkg/icupkg.8.in
create mode 100644 icuSources/tools/icupkg/icupkg.cpp
create mode 100644 icuSources/tools/icupkg/icupkg.vcproj
delete mode 100644 icuSources/tools/icuswap/icuswap.dsp
delete mode 100644 icuSources/tools/makeconv/makeconv.dsp
delete mode 100644 icuSources/tools/makeconv/misc/canonucm.c
delete mode 100644 icuSources/tools/makeconv/misc/rptp2ucm.c
delete mode 100644 icuSources/tools/makeconv/misc/ucmmerge.c
delete mode 100644 icuSources/tools/makeconv/misc/ucmstrip.c
create mode 100644 icuSources/tools/memcheck/ICUMemCheck.pl
delete mode 100644 icuSources/tools/pkgdata/pkgdata.dsp
rename icuSources/{common => tools/toolutil}/filestrm.c (97%)
rename icuSources/{common => tools/toolutil}/filestrm.h (96%)
create mode 100644 icuSources/tools/toolutil/package.cpp
create mode 100644 icuSources/tools/toolutil/package.h
create mode 100644 icuSources/tools/toolutil/pkg_imp.h
create mode 100644 icuSources/tools/toolutil/pkgitems.cpp
create mode 100644 icuSources/tools/toolutil/swapimpl.cpp
create mode 100644 icuSources/tools/toolutil/swapimpl.h
delete mode 100644 icuSources/tools/toolutil/toolutil.dsp
delete mode 100644 icuSources/tools/toolutil/ucmpwrit.c
delete mode 100644 icuSources/tools/toolutil/ucmpwrit.h
create mode 100644 icuSources/tools/toolutil/writesrc.c
create mode 100644 icuSources/tools/toolutil/writesrc.h
create mode 100644 icuSources/tools/toolutil/xmlparser.cpp
create mode 100644 icuSources/tools/toolutil/xmlparser.h
create mode 100644 icuSources/tools/tzcode/Makefile.in
create mode 100644 icuSources/tools/tzcode/asctime.c
create mode 100644 icuSources/tools/tzcode/ialloc.c
create mode 100644 icuSources/tools/tzcode/localtime.c
delete mode 100644 icuSources/tools/tzcode/patch-icu-tzcode
create mode 100644 icuSources/tools/tzcode/private.h
create mode 100644 icuSources/tools/tzcode/scheck.c
create mode 100644 icuSources/tools/tzcode/tzfile.h
create mode 100644 icuSources/tools/tzcode/tzselect.ksh
create mode 100644 icuSources/tools/tzcode/zic.c
create mode 100644 minimalpatchconfig.txt
create mode 100644 patchconfig.txt
create mode 100644 windowspatchconfig.txt
diff --git a/ICU.plist b/ICU.plist
index 63f315e9..ec4ededb 100644
--- a/ICU.plist
+++ b/ICU.plist
@@ -4,7 +4,7 @@
OpenSourceImportDate
- 2004/11/24
+ 2005/08/11
OpenSourceLicense
other
OpenSourceLicenseFile
@@ -12,13 +12,13 @@
OpenSourceProject
International Components for Unicode
OpenSourceSHA1
- 23fa1feb893a562408e6f13fcf968a6177d8aa6e
+ 7485e594002bef61c28822c3c2bfe722f35fdf4b
OpenSourceURL
- ftp://www-126.ibm.com/pub/icu/3.2/icu-3.2.tgz
+ ftp://ftp.software.ibm.com/software/globalization/icu/3.4/icu-3.4.tgz
OpenSourceVersion
- 3.2
+ 3.4
OpenSourceWebsiteURL
- http://www.ibm.com/software/globalization/icu
+ http://icu.sourceforge.net/
diff --git a/icuSources/Doxyfile.in b/icuSources/Doxyfile.in
index 73cb4526..17002092 100644
--- a/icuSources/Doxyfile.in
+++ b/icuSources/Doxyfile.in
@@ -1,7 +1,7 @@
# Doxyfile 1.3.7
# ********************************************************************
# * COPYRIGHT:
-# * Copyright (c) 2004, International Business Machines Corporation
+# * Copyright (c) 2004-2006, International Business Machines Corporation
# * and others. All Rights Reserved.
# ********************************************************************
@@ -29,11 +29,14 @@ DETAILS_AT_TOP = NO
INHERIT_DOCS = YES
DISTRIBUTE_GROUP_DOC = NO
TAB_SIZE = 8
-ALIASES = "draft=\par ICU_Draft:\n" \
- "stable=\par ICU_Stable:\n" \
- "deprecated=\par ICU_Deprecated:\n" \
- "obsolete=\par ICU_Obsolete:\n" \
- "internal=\par ICU_Internal:\n"
+ALIASES = "memo=\par Note:\n" \
+ "draft=\xrefitem draft \"Draft\" \"Draft List\" This API may be changed in the future versions and was introduced in \n" \
+ "stable=\xrefitem stable \"Stable\" \"Stable List\" \n" \
+ "deprecated=\xrefitem deprecated \"Deprecated\" \"Deprecated List\" \n" \
+ "obsolete=\xrefitem obsolete \"Obsolete\" \"Obsolete List\" \n" \
+ "system=\xrefitem system \"System\" \"System List\" \n Do not use unless you know what you are doing. \n" \
+ "internal=\xrefitem internal \"Internal\" \"Internal List\" Do not use. This API is for interal use only. \n"
+
OPTIMIZE_OUTPUT_FOR_C = YES
OPTIMIZE_OUTPUT_JAVA = NO
SUBGROUPING = YES
@@ -76,10 +79,10 @@ WARN_LOGFILE =
#---------------------------------------------------------------------------
# configuration options related to the input files
#---------------------------------------------------------------------------
-INPUT = ./common/unicode/platform.h @srcdir@/common/unicode @srcdir@/i18n/unicode @srcdir@/io/unicode @srcdir@/layout/unicode
+INPUT = ./common/unicode/platform.h @srcdir@/common/unicode @srcdir@/i18n/unicode @srcdir@/io/unicode @srcdir@/layout/LEFontInstance.h @srcdir@/layout/LEGlyphStorage.h @srcdir@/layout/LELanguages.h @srcdir@/layout/LEScripts.h @srcdir@/layout/LESwaps.h @srcdir@/layout/LETypes.h @srcdir@/layout/LayoutEngine.h @srcdir@/layoutex/layout
FILE_PATTERNS = *.h
RECURSIVE = NO
-EXCLUDE = @srcdir@/common/unicode/urename.h
+EXCLUDE = @srcdir@/common/unicode/urename.h @srcdir@/common/unicode/udraft.h @srcdir@/common/unicode/udeprctd.h @srcdir@/common/unicode/uobslete.h @srcdir@/common/unicode/ppalmos.h
EXCLUDE_SYMLINKS = NO
EXCLUDE_PATTERNS = config*.h
EXAMPLE_PATH =
@@ -169,7 +172,7 @@ GENERATE_AUTOGEN_DEF = NO
#---------------------------------------------------------------------------
# configuration options related to the Perl module output
#---------------------------------------------------------------------------
-GENERATE_PERLMOD = NO
+GENERATE_PERLMOD = NO
PERLMOD_LATEX = YES
PERLMOD_PRETTY = YES
PERLMOD_MAKEVAR_PREFIX =
@@ -177,19 +180,19 @@ PERLMOD_MAKEVAR_PREFIX =
# Configuration options related to the preprocessor
#---------------------------------------------------------------------------
ENABLE_PREPROCESSING = YES
-MACRO_EXPANSION = NO
-EXPAND_ONLY_PREDEF = NO
+MACRO_EXPANSION = YES
+EXPAND_ONLY_PREDEF = YES
SEARCH_INCLUDES = YES
INCLUDE_PATH =
INCLUDE_FILE_PATTERNS =
-PREDEFINED =
+PREDEFINED = U_EXPORT2 U_STABLE U_DRAFT U_INTERNAL U_SYSTEM U_DEPRECATED U_OBSOLETE
EXPAND_AS_DEFINED =
SKIP_FUNCTION_MACROS = YES
#---------------------------------------------------------------------------
# Configuration::additions related to external references
#---------------------------------------------------------------------------
TAGFILES =
-GENERATE_TAGFILE =
+GENERATE_TAGFILE = "@srcdir@/doc/html/icudocs.tag"
ALLEXTERNALS = NO
EXTERNAL_GROUPS = YES
PERL_PATH = /usr/bin/perl
@@ -218,5 +221,4 @@ DOT_CLEANUP = YES
#---------------------------------------------------------------------------
# Configuration::additions related to the search engine
#---------------------------------------------------------------------------
-SEARCHENGINE = NO
-CGI_NAME = search.cgi
+SEARCHENGINE = YES
diff --git a/icuSources/Makefile.in b/icuSources/Makefile.in
index 95c52d77..1d957db2 100644
--- a/icuSources/Makefile.in
+++ b/icuSources/Makefile.in
@@ -1,6 +1,6 @@
#******************************************************************************
#
-# Copyright (C) 1998-2004, International Business Machines
+# Copyright (C) 1998-2006, International Business Machines
# Corporation and others. All Rights Reserved.
#
#******************************************************************************
@@ -130,7 +130,7 @@ install-icu: $(INSTALLED_BUILT_FILES)
$(INSTALL_DATA) $(top_builddir)/config/Makefile.inc $(DESTDIR)$(pkglibdir)/Makefile.inc
cd $(DESTDIR)$(pkglibdir)/..; \
$(RM) current && ln -s $(VERSION) current; \
- $(RM) Makefile.inc && ln -s current/Makefile.inc .
+ $(RM) Makefile.inc && ln -s current/Makefile.inc Makefile.inc
ifeq ($(DOXYGEN),)
install-doc:
@@ -175,11 +175,13 @@ $(top_builddir)/config/Makefile.inc: $(srcdir)/config/Makefile.inc.in $(top_bui
$(top_builddir)/config/icu-config: $(top_builddir)/Makefile $(top_srcdir)/config/icu-config-top $(top_srcdir)/config/icu-config-bottom $(top_builddir)/config/Makefile.inc @platform_make_fragment@ $(top_srcdir)/config/make2sh.sed
-$(RMV) $@
$(INSTALL_SCRIPT) $(top_srcdir)/config/icu-config-top $@
+ chmod u+w $@
@echo "# Following from @platform_make_fragment@" >> $@
sed -f $(top_srcdir)/config/make2sh.sed < $(top_builddir)/config/Makefile.inc | grep -v '#M#' | uniq >> $@
sed -f $(top_srcdir)/config/make2sh.sed < @platform_make_fragment@ | grep -v '#M#' | uniq >> $@
cat $(top_srcdir)/config/icu-config-bottom >> $@
echo "# Rebuilt on "`date` >> $@
+ chmod u-w $@
config.status: $(srcdir)/configure $(srcdir)/common/unicode/uversion.h
@echo
diff --git a/icuSources/aclocal.m4 b/icuSources/aclocal.m4
index ef3c7d8e..fa0ab643 100644
--- a/icuSources/aclocal.m4
+++ b/icuSources/aclocal.m4
@@ -1,5 +1,5 @@
dnl aclocal.m4 for ICU
-dnl Copyright (c) 1999-2004, International Business Machines Corporation and
+dnl Copyright (c) 1999-2006, International Business Machines Corporation and
dnl others. All Rights Reserved.
dnl Stephen F. Booth
@@ -43,7 +43,7 @@ powerpc*-*-linux*)
else
icu_cv_host_frag=mh-cygwin-msvc
fi ;;
-*-*-*bsd*) icu_cv_host_frag=mh-bsd-gcc ;;
+*-*-*bsd*|*-*-dragonfly*) icu_cv_host_frag=mh-bsd-gcc ;;
*-*-aix*)
if test "$GCC" = yes; then
icu_cv_host_frag=mh-aix-gcc
@@ -72,7 +72,6 @@ powerpc*-*-linux*)
*-dec-osf*) icu_cv_host_frag=mh-alpha-osf ;;
*-*-nto*) icu_cv_host_frag=mh-qnx ;;
*-ncr-*) icu_cv_host_frag=mh-mpras ;;
-*-sequent-*) icu_cv_host_frag=mh-ptx ;;
*) icu_cv_host_frag=mh-unknown ;;
esac
]
@@ -88,6 +87,18 @@ else
$1_TRUE='#'
fi])
+dnl ICU_PROG_LINK - Make sure that the linker is usable
+AC_DEFUN(ICU_PROG_LINK,
+[
+case "${host}" in
+ *-*-cygwin*|*-*-mingw*)
+ if test "$GCC" != yes && test -n "`link --version 2>&1 | grep 'GNU coreutils'`"; then
+ AC_MSG_ERROR([link.exe is not a valid linker. Your PATH is incorrect.
+ Please follow the directions in ICU's readme.])
+ fi;;
+ *);;
+esac])
+
dnl AC_SEARCH_LIBS_FIRST(FUNCTION, SEARCH-LIBS [, ACTION-IF-FOUND
dnl [, ACTION-IF-NOT-FOUND [, OTHER-LIBRARIES]]])
dnl Search for a library defining FUNC, then see if it's not already available.
@@ -177,6 +188,27 @@ AC_DEFUN(AC_CHECK_64BIT_LIBS,
ENABLE_64BIT_LIBS=no
fi
;;
+ x86_64-*-cygwin)
+ if test "$GCC" = yes; then
+ if test -n "`$CXX -dumpspecs 2>&1 && $CC -dumpspecs 2>&1 | grep -v __LP64__`"; then
+ ENABLE_64BIT_LIBS=yes
+ else
+ ENABLE_64BIT_LIBS=no
+ fi
+ else
+ ENABLE_64BIT_LIBS=no
+ OLD_CPPFLAGS="${CPPFLAGS}"
+ OLD_LDFLAGS="${LDFLAGS}"
+ CPPFLAGS="${CPPFLAGS} /DWIN64"
+ LDFLAGS="${LDFLAGS} /MACHINE:AMD64"
+ AC_TRY_RUN(int main(void) {return 0;},
+ ENABLE_64BIT_LIBS=yes, ENABLE_64BIT_LIBS=no, ENABLE_64BIT_LIBS=no)
+ if test "$ENABLE_64BIT_LIBS" = no; then
+ CPPFLAGS="${OLD_CPPFLAGS}"
+ LDFLAGS="${OLD_LDFLAGS}"
+ fi
+ fi
+ ;;
*-*-aix*|powerpc64-*-linux*)
if test "$ac_cv_prog_gcc" = no; then
# Note: Have not tested 64-bitness with gcc.
@@ -224,10 +256,38 @@ AC_DEFUN(AC_CHECK_64BIT_LIBS,
fi
fi
;;
+ *-*ibm-openedition*|*-*-os390*)
+ OLD_CFLAGS="${CFLAGS}"
+ OLD_CXXFLAGS="${CXXFLAGS}"
+ OLD_LDFLAGS="${LDFLAGS}"
+ CFLAGS="${CFLAGS} -Wc,lp64"
+ CXXFLAGS="${CXXFLAGS} -Wc,lp64"
+ LDFLAGS="${LDFLAGS} -Wl,lp64"
+ AC_TRY_RUN(int main(void) {return 0;},
+ ENABLE_64BIT_LIBS=yes, ENABLE_64BIT_LIBS=no, ENABLE_64BIT_LIBS=no)
+ if test "$ENABLE_64BIT_LIBS" = no; then
+ CFLAGS="${OLD_CFLAGS}"
+ CXXFLAGS="${OLD_CXXFLAGS}"
+ LDFLAGS="${OLD_LDFLAGS}"
+ fi
+ ;;
*)
ENABLE_64BIT_LIBS=no
;;
esac
+ else
+ if test "$GCC" = yes; then
+ OLD_CFLAGS="${CFLAGS}"
+ OLD_CXXFLAGS="${CXXFLAGS}"
+ CFLAGS="${CFLAGS} -m32"
+ CXXFLAGS="${CXXFLAGS} -m32"
+ AC_TRY_RUN(int main(void) {return 0;},
+ ENABLE_64BIT_LIBS=no, ENABLE_64BIT_LIBS=yes, ENABLE_64BIT_LIBS=yes)
+ if test "$ENABLE_64BIT_LIBS" = yes; then
+ CFLAGS="${OLD_CFLAGS}"
+ CXXFLAGS="${OLD_CXXFLAGS}"
+ fi
+ fi
fi
dnl Individual tests that fail should reset their own flags.
AC_MSG_RESULT($ENABLE_64BIT_LIBS)
@@ -251,7 +311,7 @@ AC_DEFUN(AC_CHECK_STRICT_COMPILE,
then
if test "$GCC" = yes
then
- CFLAGS="$CFLAGS -Wall -ansi -pedantic -Wshadow -Wpointer-arith -Wmissing-prototypes -Wwrite-strings -Winline -Wno-long-long"
+ CFLAGS="$CFLAGS -Wall -ansi -pedantic -Wshadow -Wpointer-arith -Wmissing-prototypes -Wwrite-strings -Wno-long-long"
case "${host}" in
*-*-solaris*)
CFLAGS="$CFLAGS -D__STDC__=0";;
@@ -267,7 +327,7 @@ AC_DEFUN(AC_CHECK_STRICT_COMPILE,
fi
if test "$GXX" = yes
then
- CXXFLAGS="$CXXFLAGS -W -Wall -ansi -pedantic -Wpointer-arith -Wmissing-prototypes -Wwrite-strings -Winline -Wno-long-long"
+ CXXFLAGS="$CXXFLAGS -W -Wall -ansi -pedantic -Wpointer-arith -Wwrite-strings -Wno-long-long"
case "${host}" in
*-*-solaris*)
CXXFLAGS="$CXXFLAGS -D__STDC__=0";;
diff --git a/icuSources/allinone/all/all.dsp b/icuSources/allinone/all/all.dsp
deleted file mode 100644
index 5336d612..00000000
--- a/icuSources/allinone/all/all.dsp
+++ /dev/null
@@ -1,93 +0,0 @@
-# Microsoft Developer Studio Project File - Name="all" - Package Owner=<4>
-# Microsoft Developer Studio Generated Build File, Format Version 6.00
-# ** DO NOT EDIT **
-
-# TARGTYPE "Win32 (x86) Generic Project" 0x010a
-
-CFG=ALL - WIN32 DEBUG
-!MESSAGE This is not a valid makefile. To build this project using NMAKE,
-!MESSAGE use the Export Makefile command and run
-!MESSAGE
-!MESSAGE NMAKE /f "all.mak".
-!MESSAGE
-!MESSAGE You can specify a configuration when running NMAKE
-!MESSAGE by defining the macro CFG on the command line. For example:
-!MESSAGE
-!MESSAGE NMAKE /f "all.mak" CFG="ALL - WIN32 DEBUG"
-!MESSAGE
-!MESSAGE Possible choices for configuration are:
-!MESSAGE
-!MESSAGE "all - Win32 Release" (based on "Win32 (x86) Generic Project")
-!MESSAGE "all - Win32 Debug" (based on "Win32 (x86) Generic Project")
-!MESSAGE "all - Win64 Release" (based on "Win32 (x86) Generic Project")
-!MESSAGE "all - Win64 Debug" (based on "Win32 (x86) Generic Project")
-!MESSAGE
-
-# Begin Project
-# PROP AllowPerConfigDependencies 0
-# PROP Scc_ProjName ""
-# PROP Scc_LocalPath ""
-MTL=midl.exe
-
-!IF "$(CFG)" == "all - Win32 Release"
-
-# PROP BASE Use_MFC 0
-# PROP BASE Use_Debug_Libraries 0
-# PROP BASE Output_Dir "Release"
-# PROP BASE Intermediate_Dir "Release"
-# PROP BASE Target_Dir ""
-# PROP Use_MFC 0
-# PROP Use_Debug_Libraries 0
-# PROP Output_Dir "Release"
-# PROP Intermediate_Dir "Release"
-# PROP Target_Dir ""
-
-!ELSEIF "$(CFG)" == "all - Win32 Debug"
-
-# PROP BASE Use_MFC 0
-# PROP BASE Use_Debug_Libraries 1
-# PROP BASE Output_Dir "Debug"
-# PROP BASE Intermediate_Dir "Debug"
-# PROP BASE Target_Dir ""
-# PROP Use_MFC 0
-# PROP Use_Debug_Libraries 1
-# PROP Output_Dir "Debug"
-# PROP Intermediate_Dir "Debug"
-# PROP Target_Dir ""
-
-!ELSEIF "$(CFG)" == "all - Win64 Release"
-
-# PROP BASE Use_MFC 0
-# PROP BASE Use_Debug_Libraries 0
-# PROP BASE Output_Dir "Release"
-# PROP BASE Intermediate_Dir "Release"
-# PROP BASE Target_Dir ""
-# PROP Use_MFC 0
-# PROP Use_Debug_Libraries 0
-# PROP Output_Dir "Release"
-# PROP Intermediate_Dir "Release"
-# PROP Target_Dir ""
-
-!ELSEIF "$(CFG)" == "all - Win64 Debug"
-
-# PROP BASE Use_MFC 0
-# PROP BASE Use_Debug_Libraries 1
-# PROP BASE Output_Dir "Debug"
-# PROP BASE Intermediate_Dir "Debug"
-# PROP BASE Target_Dir ""
-# PROP Use_MFC 0
-# PROP Use_Debug_Libraries 1
-# PROP Output_Dir "Debug"
-# PROP Intermediate_Dir "Debug"
-# PROP Target_Dir ""
-
-!ENDIF
-
-# Begin Target
-
-# Name "all - Win32 Release"
-# Name "all - Win32 Debug"
-# Name "all - Win64 Release"
-# Name "all - Win64 Debug"
-# End Target
-# End Project
diff --git a/icuSources/allinone/allinone.dsw b/icuSources/allinone/allinone.dsw
deleted file mode 100644
index c18acc55..00000000
--- a/icuSources/allinone/allinone.dsw
+++ /dev/null
@@ -1,743 +0,0 @@
-Microsoft Developer Studio Workspace File, Format Version 6.00
-# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
-
-###############################################################################
-
-Project: "all"=.\all\all.dsp - Package Owner=<4>
-
-Package=<5>
-{{{
-}}}
-
-Package=<4>
-{{{
- Begin Project Dependency
- Project_Dep_Name cintltst
- End Project Dependency
- Begin Project Dependency
- Project_Dep_Name common
- End Project Dependency
- Begin Project Dependency
- Project_Dep_Name ctestfw
- End Project Dependency
- Begin Project Dependency
- Project_Dep_Name decmn
- End Project Dependency
- Begin Project Dependency
- Project_Dep_Name derb
- End Project Dependency
- Begin Project Dependency
- Project_Dep_Name genccode
- End Project Dependency
- Begin Project Dependency
- Project_Dep_Name gencmn
- End Project Dependency
- Begin Project Dependency
- Project_Dep_Name gencnval
- End Project Dependency
- Begin Project Dependency
- Project_Dep_Name gennames
- End Project Dependency
- Begin Project Dependency
- Project_Dep_Name gennorm
- End Project Dependency
- Begin Project Dependency
- Project_Dep_Name genpname
- End Project Dependency
- Begin Project Dependency
- Project_Dep_Name genprops
- End Project Dependency
- Begin Project Dependency
- Project_Dep_Name genrb
- End Project Dependency
- Begin Project Dependency
- Project_Dep_Name gentest
- End Project Dependency
- Begin Project Dependency
- Project_Dep_Name genuca
- End Project Dependency
- Begin Project Dependency
- Project_Dep_Name i18n
- End Project Dependency
- Begin Project Dependency
- Project_Dep_Name intltest
- End Project Dependency
- Begin Project Dependency
- Project_Dep_Name layout
- End Project Dependency
- Begin Project Dependency
- Project_Dep_Name makeconv
- End Project Dependency
- Begin Project Dependency
- Project_Dep_Name makedata
- End Project Dependency
- Begin Project Dependency
- Project_Dep_Name pkgdata
- End Project Dependency
- Begin Project Dependency
- Project_Dep_Name stubdata
- End Project Dependency
- Begin Project Dependency
- Project_Dep_Name toolutil
- End Project Dependency
- Begin Project Dependency
- Project_Dep_Name uconv
- End Project Dependency
- Begin Project Dependency
- Project_Dep_Name io
- End Project Dependency
- Begin Project Dependency
- Project_Dep_Name genbrk
- End Project Dependency
- Begin Project Dependency
- Project_Dep_Name layoutex
- End Project Dependency
- Begin Project Dependency
- Project_Dep_Name gensprep
- End Project Dependency
- Begin Project Dependency
- Project_Dep_Name icuswap
- End Project Dependency
- Begin Project Dependency
- Project_Dep_Name iotest
- End Project Dependency
- Begin Project Dependency
- Project_Dep_Name gencase
- End Project Dependency
-}}}
-
-###############################################################################
-
-Project: "cintltst"=..\test\cintltst\cintltst.dsp - Package Owner=<4>
-
-Package=<5>
-{{{
-}}}
-
-Package=<4>
-{{{
- Begin Project Dependency
- Project_Dep_Name common
- End Project Dependency
- Begin Project Dependency
- Project_Dep_Name ctestfw
- End Project Dependency
- Begin Project Dependency
- Project_Dep_Name i18n
- End Project Dependency
- Begin Project Dependency
- Project_Dep_Name toolutil
- End Project Dependency
-}}}
-
-###############################################################################
-
-Project: "common"=..\common\common.dsp - Package Owner=<4>
-
-Package=<5>
-{{{
-}}}
-
-Package=<4>
-{{{
- Begin Project Dependency
- Project_Dep_Name stubdata
- End Project Dependency
-}}}
-
-###############################################################################
-
-Project: "ctestfw"=..\tools\ctestfw\ctestfw.dsp - Package Owner=<4>
-
-Package=<5>
-{{{
-}}}
-
-Package=<4>
-{{{
- Begin Project Dependency
- Project_Dep_Name common
- End Project Dependency
-}}}
-
-###############################################################################
-
-Project: "decmn"=..\tools\gencmn\decmn.dsp - Package Owner=<4>
-
-Package=<5>
-{{{
-}}}
-
-Package=<4>
-{{{
- Begin Project Dependency
- Project_Dep_Name common
- End Project Dependency
- Begin Project Dependency
- Project_Dep_Name toolutil
- End Project Dependency
-}}}
-
-###############################################################################
-
-Project: "derb"=..\TOOLS\GENRB\derb.dsp - Package Owner=<4>
-
-Package=<5>
-{{{
-}}}
-
-Package=<4>
-{{{
- Begin Project Dependency
- Project_Dep_Name common
- End Project Dependency
- Begin Project Dependency
- Project_Dep_Name stubdata
- End Project Dependency
-}}}
-
-###############################################################################
-
-Project: "genbrk"=..\tools\genbrk\genbrk.dsp - Package Owner=<4>
-
-Package=<5>
-{{{
-}}}
-
-Package=<4>
-{{{
- Begin Project Dependency
- Project_Dep_Name common
- End Project Dependency
- Begin Project Dependency
- Project_Dep_Name toolutil
- End Project Dependency
-}}}
-
-###############################################################################
-
-Project: "gencase"=..\tools\gencase\gencase.dsp - Package Owner=<4>
-
-Package=<5>
-{{{
-}}}
-
-Package=<4>
-{{{
- Begin Project Dependency
- Project_Dep_Name common
- End Project Dependency
- Begin Project Dependency
- Project_Dep_Name toolutil
- End Project Dependency
-}}}
-
-###############################################################################
-
-Project: "genccode"=..\tools\genccode\genccode.dsp - Package Owner=<4>
-
-Package=<5>
-{{{
-}}}
-
-Package=<4>
-{{{
- Begin Project Dependency
- Project_Dep_Name common
- End Project Dependency
- Begin Project Dependency
- Project_Dep_Name toolutil
- End Project Dependency
-}}}
-
-###############################################################################
-
-Project: "gencmn"=..\tools\gencmn\gencmn.dsp - Package Owner=<4>
-
-Package=<5>
-{{{
-}}}
-
-Package=<4>
-{{{
- Begin Project Dependency
- Project_Dep_Name common
- End Project Dependency
- Begin Project Dependency
- Project_Dep_Name toolutil
- End Project Dependency
-}}}
-
-###############################################################################
-
-Project: "gencnval"=..\tools\gencnval\gencnval.dsp - Package Owner=<4>
-
-Package=<5>
-{{{
-}}}
-
-Package=<4>
-{{{
- Begin Project Dependency
- Project_Dep_Name common
- End Project Dependency
- Begin Project Dependency
- Project_Dep_Name toolutil
- End Project Dependency
-}}}
-
-###############################################################################
-
-Project: "gennames"=..\tools\gennames\gennames.dsp - Package Owner=<4>
-
-Package=<5>
-{{{
-}}}
-
-Package=<4>
-{{{
- Begin Project Dependency
- Project_Dep_Name common
- End Project Dependency
- Begin Project Dependency
- Project_Dep_Name toolutil
- End Project Dependency
-}}}
-
-###############################################################################
-
-Project: "gennorm"=..\tools\gennorm\gennorm.dsp - Package Owner=<4>
-
-Package=<5>
-{{{
-}}}
-
-Package=<4>
-{{{
- Begin Project Dependency
- Project_Dep_Name common
- End Project Dependency
- Begin Project Dependency
- Project_Dep_Name toolutil
- End Project Dependency
-}}}
-
-###############################################################################
-
-Project: "genpname"=..\tools\genpname\genpname.dsp - Package Owner=<4>
-
-Package=<5>
-{{{
-}}}
-
-Package=<4>
-{{{
- Begin Project Dependency
- Project_Dep_Name common
- End Project Dependency
- Begin Project Dependency
- Project_Dep_Name toolutil
- End Project Dependency
-}}}
-
-###############################################################################
-
-Project: "genprops"=..\tools\genprops\genprops.dsp - Package Owner=<4>
-
-Package=<5>
-{{{
-}}}
-
-Package=<4>
-{{{
- Begin Project Dependency
- Project_Dep_Name common
- End Project Dependency
- Begin Project Dependency
- Project_Dep_Name toolutil
- End Project Dependency
-}}}
-
-###############################################################################
-
-Project: "genrb"=..\tools\genrb\genrb.dsp - Package Owner=<4>
-
-Package=<5>
-{{{
-}}}
-
-Package=<4>
-{{{
- Begin Project Dependency
- Project_Dep_Name common
- End Project Dependency
- Begin Project Dependency
- Project_Dep_Name makeconv
- End Project Dependency
- Begin Project Dependency
- Project_Dep_Name i18n
- End Project Dependency
- Begin Project Dependency
- Project_Dep_Name toolutil
- End Project Dependency
-}}}
-
-###############################################################################
-
-Project: "gensprep"=..\tools\gensprep\gensprep.dsp - Package Owner=<4>
-
-Package=<5>
-{{{
-}}}
-
-Package=<4>
-{{{
-}}}
-
-###############################################################################
-
-Project: "gentest"=..\tools\gentest\gentest.dsp - Package Owner=<4>
-
-Package=<5>
-{{{
-}}}
-
-Package=<4>
-{{{
- Begin Project Dependency
- Project_Dep_Name common
- End Project Dependency
- Begin Project Dependency
- Project_Dep_Name toolutil
- End Project Dependency
-}}}
-
-###############################################################################
-
-Project: "genuca"=..\TOOLS\genuca\genuca.dsp - Package Owner=<4>
-
-Package=<5>
-{{{
-}}}
-
-Package=<4>
-{{{
- Begin Project Dependency
- Project_Dep_Name common
- End Project Dependency
- Begin Project Dependency
- Project_Dep_Name i18n
- End Project Dependency
- Begin Project Dependency
- Project_Dep_Name toolutil
- End Project Dependency
-}}}
-
-###############################################################################
-
-Project: "i18n"=..\i18n\i18n.dsp - Package Owner=<4>
-
-Package=<5>
-{{{
-}}}
-
-Package=<4>
-{{{
- Begin Project Dependency
- Project_Dep_Name common
- End Project Dependency
-}}}
-
-###############################################################################
-
-Project: "icuswap"=..\tools\icuswap\icuswap.dsp - Package Owner=<4>
-
-Package=<5>
-{{{
-}}}
-
-Package=<4>
-{{{
- Begin Project Dependency
- Project_Dep_Name common
- End Project Dependency
- Begin Project Dependency
- Project_Dep_Name i18n
- End Project Dependency
- Begin Project Dependency
- Project_Dep_Name toolutil
- End Project Dependency
-}}}
-
-###############################################################################
-
-Project: "intltest"=..\test\intltest\intltest.dsp - Package Owner=<4>
-
-Package=<5>
-{{{
-}}}
-
-Package=<4>
-{{{
- Begin Project Dependency
- Project_Dep_Name common
- End Project Dependency
- Begin Project Dependency
- Project_Dep_Name i18n
- End Project Dependency
- Begin Project Dependency
- Project_Dep_Name toolutil
- End Project Dependency
- Begin Project Dependency
- Project_Dep_Name ctestfw
- End Project Dependency
-}}}
-
-###############################################################################
-
-Project: "io"=..\io\io.dsp - Package Owner=<4>
-
-Package=<5>
-{{{
-}}}
-
-Package=<4>
-{{{
- Begin Project Dependency
- Project_Dep_Name common
- End Project Dependency
- Begin Project Dependency
- Project_Dep_Name i18n
- End Project Dependency
-}}}
-
-###############################################################################
-
-Project: "iotest"=..\test\iotest\iotest.dsp - Package Owner=<4>
-
-Package=<5>
-{{{
-}}}
-
-Package=<4>
-{{{
- Begin Project Dependency
- Project_Dep_Name common
- End Project Dependency
- Begin Project Dependency
- Project_Dep_Name ctestfw
- End Project Dependency
- Begin Project Dependency
- Project_Dep_Name i18n
- End Project Dependency
- Begin Project Dependency
- Project_Dep_Name io
- End Project Dependency
-}}}
-
-###############################################################################
-
-Project: "layout"=..\layout\layout.dsp - Package Owner=<4>
-
-Package=<5>
-{{{
-}}}
-
-Package=<4>
-{{{
- Begin Project Dependency
- Project_Dep_Name common
- End Project Dependency
-}}}
-
-###############################################################################
-
-Project: "layoutex"=..\layoutex\layoutex.dsp - Package Owner=<4>
-
-Package=<5>
-{{{
-}}}
-
-Package=<4>
-{{{
- Begin Project Dependency
- Project_Dep_Name common
- End Project Dependency
- Begin Project Dependency
- Project_Dep_Name i18n
- End Project Dependency
- Begin Project Dependency
- Project_Dep_Name layout
- End Project Dependency
-}}}
-
-###############################################################################
-
-Project: "makeconv"=..\tools\makeconv\makeconv.dsp - Package Owner=<4>
-
-Package=<5>
-{{{
-}}}
-
-Package=<4>
-{{{
- Begin Project Dependency
- Project_Dep_Name common
- End Project Dependency
- Begin Project Dependency
- Project_Dep_Name toolutil
- End Project Dependency
-}}}
-
-###############################################################################
-
-Project: "makedata"=..\data\makedata.dsp - Package Owner=<4>
-
-Package=<5>
-{{{
-}}}
-
-Package=<4>
-{{{
- Begin Project Dependency
- Project_Dep_Name common
- End Project Dependency
- Begin Project Dependency
- Project_Dep_Name genccode
- End Project Dependency
- Begin Project Dependency
- Project_Dep_Name gencmn
- End Project Dependency
- Begin Project Dependency
- Project_Dep_Name gencnval
- End Project Dependency
- Begin Project Dependency
- Project_Dep_Name gennames
- End Project Dependency
- Begin Project Dependency
- Project_Dep_Name gennorm
- End Project Dependency
- Begin Project Dependency
- Project_Dep_Name genpname
- End Project Dependency
- Begin Project Dependency
- Project_Dep_Name genprops
- End Project Dependency
- Begin Project Dependency
- Project_Dep_Name genrb
- End Project Dependency
- Begin Project Dependency
- Project_Dep_Name gentest
- End Project Dependency
- Begin Project Dependency
- Project_Dep_Name genuca
- End Project Dependency
- Begin Project Dependency
- Project_Dep_Name i18n
- End Project Dependency
- Begin Project Dependency
- Project_Dep_Name makeconv
- End Project Dependency
- Begin Project Dependency
- Project_Dep_Name pkgdata
- End Project Dependency
- Begin Project Dependency
- Project_Dep_Name stubdata
- End Project Dependency
- Begin Project Dependency
- Project_Dep_Name toolutil
- End Project Dependency
- Begin Project Dependency
- Project_Dep_Name genbrk
- End Project Dependency
- Begin Project Dependency
- Project_Dep_Name gensprep
- End Project Dependency
- Begin Project Dependency
- Project_Dep_Name gencase
- End Project Dependency
-}}}
-
-###############################################################################
-
-Project: "pkgdata"=..\tools\pkgdata\pkgdata.dsp - Package Owner=<4>
-
-Package=<5>
-{{{
-}}}
-
-Package=<4>
-{{{
- Begin Project Dependency
- Project_Dep_Name common
- End Project Dependency
- Begin Project Dependency
- Project_Dep_Name toolutil
- End Project Dependency
-}}}
-
-###############################################################################
-
-Project: "stubdata"=..\STUBDATA\stubdata.dsp - Package Owner=<4>
-
-Package=<5>
-{{{
-}}}
-
-Package=<4>
-{{{
-}}}
-
-###############################################################################
-
-Project: "toolutil"=..\tools\toolutil\toolutil.dsp - Package Owner=<4>
-
-Package=<5>
-{{{
-}}}
-
-Package=<4>
-{{{
- Begin Project Dependency
- Project_Dep_Name common
- End Project Dependency
-}}}
-
-###############################################################################
-
-Project: "uconv"=..\extra\uconv\uconv.dsp - Package Owner=<4>
-
-Package=<5>
-{{{
-}}}
-
-Package=<4>
-{{{
- Begin Project Dependency
- Project_Dep_Name common
- End Project Dependency
- Begin Project Dependency
- Project_Dep_Name genrb
- End Project Dependency
- Begin Project Dependency
- Project_Dep_Name i18n
- End Project Dependency
- Begin Project Dependency
- Project_Dep_Name pkgdata
- End Project Dependency
-}}}
-
-###############################################################################
-
-Global:
-
-Package=<5>
-{{{
-}}}
-
-Package=<3>
-{{{
-}}}
-
-###############################################################################
-
diff --git a/icuSources/allinone/allinone.sln b/icuSources/allinone/allinone.sln
index 26eea2d7..835178e2 100644
--- a/icuSources/allinone/allinone.sln
+++ b/icuSources/allinone/allinone.sln
@@ -13,11 +13,6 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "common", "..\common\common.
EndProjectSection
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ctestfw", "..\tools\ctestfw\ctestfw.vcproj", "{ECA6B435-B4FA-4F9F-BF95-F451D078FC47}"
- ProjectSection(ProjectDependencies) = postProject
- {73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D} = {73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D}
- EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "decmn", "..\tools\gencmn\decmn.vcproj", "{20869594-A3DD-4A75-8068-99B03A5CF4E4}"
ProjectSection(ProjectDependencies) = postProject
{6B231032-3CB5-4EED-9210-810D666A23A0} = {6B231032-3CB5-4EED-9210-810D666A23A0}
{73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D} = {73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D}
@@ -140,13 +135,16 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "makedata", "..\data\makedat
{F5AD9738-1A3D-4906-B9C4-A7D9CE33DC2C} = {F5AD9738-1A3D-4906-B9C4-A7D9CE33DC2C}
{6F744648-D15F-478A-90C6-58E353B5DDB3} = {6F744648-D15F-478A-90C6-58E353B5DDB3}
{DB312A49-12A9-4E07-9E96-451DC2D8FF61} = {DB312A49-12A9-4E07-9E96-451DC2D8FF61}
+ {DB312A49-12A9-4E07-9E96-451DC2D8FF62} = {DB312A49-12A9-4E07-9E96-451DC2D8FF62}
{73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D} = {73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D}
+ {62D4B15D-7A90-4ECB-BA19-5E021D6A21BC} = {62D4B15D-7A90-4ECB-BA19-5E021D6A21BC}
{77C78066-746F-4EA6-B3FE-B8C8A4A97891} = {77C78066-746F-4EA6-B3FE-B8C8A4A97891}
{203EC78A-0531-43F0-A636-285439BDE025} = {203EC78A-0531-43F0-A636-285439BDE025}
{A8D36F8D-09E6-4174-91C3-7BEAA9C3F04F} = {A8D36F8D-09E6-4174-91C3-7BEAA9C3F04F}
{86829694-A375-4C58-B4EA-96EF514E3225} = {86829694-A375-4C58-B4EA-96EF514E3225}
{631C23CE-6C1D-4875-88F0-85E0A42B36EA} = {631C23CE-6C1D-4875-88F0-85E0A42B36EA}
{FDD3C4F2-9805-44EB-9A77-BC1C1C95B547} = {FDD3C4F2-9805-44EB-9A77-BC1C1C95B547}
+ {9D4211F7-2C77-439C-82F0-30A4E43BA569} = {9D4211F7-2C77-439C-82F0-30A4E43BA569}
{4C8454FE-81D3-4CA3-9927-29BA96F03DAC} = {4C8454FE-81D3-4CA3-9927-29BA96F03DAC}
EndProjectSection
EndProject
@@ -164,6 +162,7 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "stubdata", "..\stubdata\stu
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "toolutil", "..\tools\toolutil\toolutil.vcproj", "{6B231032-3CB5-4EED-9210-810D666A23A0}"
ProjectSection(ProjectDependencies) = postProject
+ {0178B127-6269-407D-B112-93877BB62776} = {0178B127-6269-407D-B112-93877BB62776}
{73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D} = {73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D}
EndProjectSection
EndProject
@@ -187,22 +186,48 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "gensprep", "..\tools\genspr
{73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D} = {73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D}
EndProjectSection
EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "icuswap", "..\tools\icuswap\icuswap.vcproj", "{6FC24387-370C-4561-9582-7A819749E2C5}"
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "iotest", "..\test\iotest\iotest.vcproj", "{E4993E82-D68A-46CA-BAE0-9D35E172E46F}"
ProjectSection(ProjectDependencies) = postProject
+ {C2B04507-2521-4801-BF0D-5FD79D6D518C} = {C2B04507-2521-4801-BF0D-5FD79D6D518C}
{0178B127-6269-407D-B112-93877BB62776} = {0178B127-6269-407D-B112-93877BB62776}
+ {ECA6B435-B4FA-4F9F-BF95-F451D078FC47} = {ECA6B435-B4FA-4F9F-BF95-F451D078FC47}
+ {73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D} = {73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D}
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "genbidi", "..\tools\genbidi\genbidi.vcproj", "{DB312A49-12A9-4E07-9E96-451DC2D8FF62}"
+ ProjectSection(ProjectDependencies) = postProject
{6B231032-3CB5-4EED-9210-810D666A23A0} = {6B231032-3CB5-4EED-9210-810D666A23A0}
{73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D} = {73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D}
EndProjectSection
EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "iotest", "..\test\iotest\iotest.vcproj", "{E4993E82-D68A-46CA-BAE0-9D35E172E46F}"
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "gencase", "..\tools\gencase\gencase.vcproj", "{DB312A49-12A9-4E07-9E96-451DC2D8FF61}"
+ ProjectSection(ProjectDependencies) = postProject
+ {6B231032-3CB5-4EED-9210-810D666A23A0} = {6B231032-3CB5-4EED-9210-810D666A23A0}
+ {73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D} = {73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D}
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "icupkg", "..\tools\icupkg\icupkg.vcproj", "{62D4B15D-7A90-4ECB-BA19-5E021D6A21BC}"
+ ProjectSection(ProjectDependencies) = postProject
+ {6B231032-3CB5-4EED-9210-810D666A23A0} = {6B231032-3CB5-4EED-9210-810D666A23A0}
+ {73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D} = {73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D}
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "genctd", "..\tools\genctd\genctd.vcproj", "{9D4211F7-2C77-439C-82F0-30A4E43BA569}"
+ ProjectSection(ProjectDependencies) = postProject
+ {6B231032-3CB5-4EED-9210-810D666A23A0} = {6B231032-3CB5-4EED-9210-810D666A23A0}
+ {73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D} = {73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D}
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "letest", "..\test\letest\letest.vcproj", "{67351485-4D18-4245-BE39-A7EF0675ACD2}"
ProjectSection(ProjectDependencies) = postProject
- {C2B04507-2521-4801-BF0D-5FD79D6D518C} = {C2B04507-2521-4801-BF0D-5FD79D6D518C}
{0178B127-6269-407D-B112-93877BB62776} = {0178B127-6269-407D-B112-93877BB62776}
+ {C920062A-0647-4553-A3B2-37C58065664B} = {C920062A-0647-4553-A3B2-37C58065664B}
+ {6B231032-3CB5-4EED-9210-810D666A23A0} = {6B231032-3CB5-4EED-9210-810D666A23A0}
{ECA6B435-B4FA-4F9F-BF95-F451D078FC47} = {ECA6B435-B4FA-4F9F-BF95-F451D078FC47}
{73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D} = {73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D}
EndProjectSection
EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "gencase", "..\tools\gencase\gencase.vcproj", "{DB312A49-12A9-4E07-9E96-451DC2D8FF61}"
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "icuswap", "..\tools\icuswap\icuswap.vcproj", "{39690C2A-AD89-45E4-893A-899496B85785}"
ProjectSection(ProjectDependencies) = postProject
{6B231032-3CB5-4EED-9210-810D666A23A0} = {6B231032-3CB5-4EED-9210-810D666A23A0}
{73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D} = {73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D}
@@ -226,10 +251,6 @@ Global
{ECA6B435-B4FA-4F9F-BF95-F451D078FC47}.Debug.Build.0 = Debug|Win32
{ECA6B435-B4FA-4F9F-BF95-F451D078FC47}.Release.ActiveCfg = Release|Win32
{ECA6B435-B4FA-4F9F-BF95-F451D078FC47}.Release.Build.0 = Release|Win32
- {20869594-A3DD-4A75-8068-99B03A5CF4E4}.Debug.ActiveCfg = Debug|Win32
- {20869594-A3DD-4A75-8068-99B03A5CF4E4}.Debug.Build.0 = Debug|Win32
- {20869594-A3DD-4A75-8068-99B03A5CF4E4}.Release.ActiveCfg = Release|Win32
- {20869594-A3DD-4A75-8068-99B03A5CF4E4}.Release.Build.0 = Release|Win32
{D3065ADB-8820-4CC7-9B6C-9510833961A3}.Debug.ActiveCfg = Debug|Win32
{D3065ADB-8820-4CC7-9B6C-9510833961A3}.Debug.Build.0 = Debug|Win32
{D3065ADB-8820-4CC7-9B6C-9510833961A3}.Release.ActiveCfg = Release|Win32
@@ -326,18 +347,34 @@ Global
{631C23CE-6C1D-4875-88F0-85E0A42B36EA}.Debug.Build.0 = Debug|Win32
{631C23CE-6C1D-4875-88F0-85E0A42B36EA}.Release.ActiveCfg = Release|Win32
{631C23CE-6C1D-4875-88F0-85E0A42B36EA}.Release.Build.0 = Release|Win32
- {6FC24387-370C-4561-9582-7A819749E2C5}.Debug.ActiveCfg = Debug|Win32
- {6FC24387-370C-4561-9582-7A819749E2C5}.Debug.Build.0 = Debug|Win32
- {6FC24387-370C-4561-9582-7A819749E2C5}.Release.ActiveCfg = Release|Win32
- {6FC24387-370C-4561-9582-7A819749E2C5}.Release.Build.0 = Release|Win32
{E4993E82-D68A-46CA-BAE0-9D35E172E46F}.Debug.ActiveCfg = Debug|Win32
{E4993E82-D68A-46CA-BAE0-9D35E172E46F}.Debug.Build.0 = Debug|Win32
{E4993E82-D68A-46CA-BAE0-9D35E172E46F}.Release.ActiveCfg = Release|Win32
{E4993E82-D68A-46CA-BAE0-9D35E172E46F}.Release.Build.0 = Release|Win32
+ {DB312A49-12A9-4E07-9E96-451DC2D8FF62}.Debug.ActiveCfg = Debug|Win32
+ {DB312A49-12A9-4E07-9E96-451DC2D8FF62}.Debug.Build.0 = Debug|Win32
+ {DB312A49-12A9-4E07-9E96-451DC2D8FF62}.Release.ActiveCfg = Release|Win32
+ {DB312A49-12A9-4E07-9E96-451DC2D8FF62}.Release.Build.0 = Release|Win32
{DB312A49-12A9-4E07-9E96-451DC2D8FF61}.Debug.ActiveCfg = Debug|Win32
{DB312A49-12A9-4E07-9E96-451DC2D8FF61}.Debug.Build.0 = Debug|Win32
{DB312A49-12A9-4E07-9E96-451DC2D8FF61}.Release.ActiveCfg = Release|Win32
{DB312A49-12A9-4E07-9E96-451DC2D8FF61}.Release.Build.0 = Release|Win32
+ {62D4B15D-7A90-4ECB-BA19-5E021D6A21BC}.Debug.ActiveCfg = Debug|Win32
+ {62D4B15D-7A90-4ECB-BA19-5E021D6A21BC}.Debug.Build.0 = Debug|Win32
+ {62D4B15D-7A90-4ECB-BA19-5E021D6A21BC}.Release.ActiveCfg = Release|Win32
+ {62D4B15D-7A90-4ECB-BA19-5E021D6A21BC}.Release.Build.0 = Release|Win32
+ {9D4211F7-2C77-439C-82F0-30A4E43BA569}.Debug.ActiveCfg = Debug|Win32
+ {9D4211F7-2C77-439C-82F0-30A4E43BA569}.Debug.Build.0 = Debug|Win32
+ {9D4211F7-2C77-439C-82F0-30A4E43BA569}.Release.ActiveCfg = Release|Win32
+ {9D4211F7-2C77-439C-82F0-30A4E43BA569}.Release.Build.0 = Release|Win32
+ {67351485-4D18-4245-BE39-A7EF0675ACD2}.Debug.ActiveCfg = Debug|Win32
+ {67351485-4D18-4245-BE39-A7EF0675ACD2}.Debug.Build.0 = Debug|Win32
+ {67351485-4D18-4245-BE39-A7EF0675ACD2}.Release.ActiveCfg = Release|Win32
+ {67351485-4D18-4245-BE39-A7EF0675ACD2}.Release.Build.0 = Release|Win32
+ {39690C2A-AD89-45E4-893A-899496B85785}.Debug.ActiveCfg = Debug|Win32
+ {39690C2A-AD89-45E4-893A-899496B85785}.Debug.Build.0 = Debug|Win32
+ {39690C2A-AD89-45E4-893A-899496B85785}.Release.ActiveCfg = Release|Win32
+ {39690C2A-AD89-45E4-893A-899496B85785}.Release.Build.0 = Release|Win32
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
EndGlobalSection
diff --git a/icuSources/common/Makefile.in b/icuSources/common/Makefile.in
index 5679e0db..666373cf 100644
--- a/icuSources/common/Makefile.in
+++ b/icuSources/common/Makefile.in
@@ -1,6 +1,6 @@
#******************************************************************************
#
-# Copyright (C) 1999-2004, International Business Machines
+# Copyright (C) 1999-2006, International Business Machines
# Corporation and others. All Rights Reserved.
#
#******************************************************************************
@@ -19,8 +19,12 @@ include $(top_builddir)/icudefs.mk
## Build directory information
subdir = common
+# for service hook
+LOCALSVC_CPP=localsvc.cpp
+SVC_HOOK_INC=$(top_builddir)/common/svchook.mk
+
## Extra files to remove for 'make clean'
-CLEANFILES = *~ $(DEPS) $(IMPORT_LIB) $(MIDDLE_IMPORT_LIB) $(FINAL_IMPORT_LIB)
+CLEANFILES = *~ $(DEPS) $(IMPORT_LIB) $(MIDDLE_IMPORT_LIB) $(FINAL_IMPORT_LIB) $(SVC_HOOK_INC)
## Target information
@@ -32,7 +36,7 @@ endif
ifneq ($(ENABLE_SHARED),)
SO_TARGET = $(LIBDIR)/$(LIBICU)$(TARGET_STUBNAME)$(ICULIBSUFFIX).$(SO)
-ALL_SO_TARGETS = $(SO_TARGET) $(MIDDLE_SO_TARGET) $(FINAL_SO_TARGET)
+ALL_SO_TARGETS = $(SO_TARGET) $(MIDDLE_SO_TARGET) $(FINAL_SO_TARGET) $(SHARED_OBJECT)
ifeq ($(ENABLE_SO_VERSION_DATA),1)
SO_VERSION_DATA = common.res
@@ -51,39 +55,47 @@ DYNAMICCPPFLAGS = $(SHAREDLIBCPPFLAGS)
DYNAMICCFLAGS = $(SHAREDLIBCFLAGS)
DYNAMICCXXFLAGS = $(SHAREDLIBCXXFLAGS)
-LDFLAGS += $(LDFLAGSICUUC)
-CPPFLAGS += -I. -I$(srcdir) -I$(top_srcdir)/i18n $(LIBCPPFLAGS)
+ifneq ($(top_builddir),$(top_srcdir))
+CPPFLAGS += -I$(top_builddir)/common
+endif
+CPPFLAGS += -I$(srcdir) -I$(top_srcdir)/i18n $(LIBCPPFLAGS)
DEFS += -DU_COMMON_IMPLEMENTATION
+LDFLAGS += $(LDFLAGSICUUC)
# $(LIBICUDT) is either stub data or the real DLL common data.
LIBS = $(LIBICUDT) $(DEFAULT_LIBS)
-OBJECTS = putil.o utypes.o uobject.o cmemory.o umutex.o ucln_cmn.o uinit.o \
-udata.o ucmndata.o udatamem.o udataswp.o umapfile.o ucol_swp.o \
-uresbund.o ures_cnv.o uresdata.o resbund.o resbund_cnv.o \
-ucat.o locmap.o uloc.o locid.o \
-uhash.o uhash_us.o \
-ucnv.o ucnv_set.o ucnv_bld.o ucnv_cb.o ucnv_cnv.o ucnv_err.o ucnv_ext.o ucnv_io.o ucnvlat1.o \
+OBJECTS = putil.o umath.o utypes.o uinvchar.o umutex.o ucln_cmn.o uinit.o uobject.o cmemory.o \
+udata.o ucmndata.o udatamem.o umapfile.o udataswp.o ucol_swp.o utrace.o \
+uhash.o uhash_us.o uenum.o ustrenum.o uvector.o ustack.o uvectr32.o \
+ucnv.o ucnv_bld.o ucnv_cnv.o ucnv_io.o ucnv_cb.o ucnv_err.o ucnvlat1.o \
ucnv_u7.o ucnv_u8.o ucnv_u16.o ucnv_u32.o ucnvscsu.o ucnvbocu.o \
-ucnvmbcs.o ucnv2022.o ucnvhz.o ucnv_lmb.o ucnvisci.o ucnvdisp.o \
-unistr.o unistr_case.o unistr_cnv.o unistr_props.o \
-utf_impl.o ustring.o ustr_cnv.o ustrcase.o cstring.o ustrfmt.o ustrtrns.o ustr_wcs.o uinvchar.o \
+ucnv_ext.o ucnvmbcs.o ucnv2022.o ucnvhz.o ucnv_lmb.o ucnvisci.o ucnvdisp.o ucnv_set.o \
+uresbund.o ures_cnv.o uresdata.o resbund.o resbund_cnv.o \
+ucat.o locmap.o uloc.o locid.o locutil.o \
+ustr_cnv.o unistr_cnv.o unistr.o unistr_case.o unistr_props.o \
+utf_impl.o ustring.o ustrcase.o ucasemap.o cstring.o ustrfmt.o ustrtrns.o ustr_wcs.o utext.o \
normlzr.o unorm.o unormcmp.o unorm_it.o chariter.o schriter.o uchriter.o uiter.o \
-uchar.o uprops.o ucase.o propname.o ubidi.o ubidiwrt.o ubidiln.o ushape.o unames.o \
-uscript.o usc_impl.o uvector.o ustack.o uvectr32.o ucmp8.o \
-uarrsort.o utrie.o uset.o uset_props.o uniset.o uniset_props.o ruleiter.o caniter.o unifilt.o unifunct.o usetiter.o \
-brkiter.o brkdict.o ubrk.o dbbi.o dbbi_tbl.o \
+uchar.o uprops.o ucase.o propname.o ubidi_props.o ubidi.o ubidiwrt.o ubidiln.o ushape.o \
+uscript.o usc_impl.o unames.o \
+utrie.o uset_props.o uniset_props.o uset.o uniset.o usetiter.o ruleiter.o caniter.o unifilt.o unifunct.o \
+uarrsort.o brkiter.o ubrk.o brkeng.o dictbe.o triedict.o \
rbbi.o rbbidata.o rbbinode.o rbbirb.o rbbiscan.o rbbisetb.o rbbistbl.o rbbitblb.o \
-icuserv.o iculserv.o icunotif.o uenum.o ustrenum.o \
+serv.o servnotf.o servls.o servlk.o servlkf.o servrbf.o servslkf.o \
uidna.o usprep.o punycode.o \
-cwchar.o filestrm.o util.o parsepos.o utrace.o locbased.o
+util.o util_props.o parsepos.o locbased.o cwchar.o wintz.o
+
+## Header files to install
+HEADERS = $(srcdir)/unicode/*.h unicode/*.h
STATIC_OBJECTS = $(OBJECTS:.o=.$(STATIC_O))
DEPS = $(OBJECTS:.o=.d)
-## Header files to install
-HEADERS = unicode/*.h $(srcdir)/unicode/*.h
+-include Makefile.local
+
+-include $(SVC_HOOK_INC)
+
## List of phony targets
.PHONY : all all-local install install-local clean clean-local \
@@ -101,8 +113,6 @@ distclean : distclean-local
dist: dist-local
check: all check-local
--include Makefile.local
-
all-local: $(ALL_TARGETS) unicode/platform.h
install-local: install-headers install-library
@@ -131,6 +141,14 @@ ifneq ($(MIDDLE_IMPORT_LIB),$(FINAL_IMPORT_LIB))
endif
endif
+$(SVC_HOOK_INC):
+ @echo generating $@
+ @-test -f $(top_srcdir)/common/$(LOCALSVC_CPP) && ( echo "have $(LOCALSVC_CPP) - U_LOCAL_SERVICE_HOOK=1" ; \
+ echo 'CPPFLAGS +=-DU_LOCAL_SERVICE_HOOK=1' > $@ ; \
+ echo 'OBJECTS += $(LOCALSVC_CPP:%.cpp=%.o)' >> $@ \
+ ) ; true
+ @echo "# Autogenerated by Makefile" >> $@
+
install-headers:
$(MKINSTALLDIRS) $(DESTDIR)$(includedir)/unicode
@for file in $(HEADERS); do \
@@ -145,11 +163,11 @@ clean-local:
$(RMV) $(OBJECTS) $(STATIC_OBJECTS) $(ALL_TARGETS) $(SO_VERSION_DATA)
distclean-local: clean-local
- $(RMV) Makefile icucfg.h unicode/platform.h
+ $(RMV) Makefile icucfg.h unicode/platform.h $(SVC_HOOK_INC)
check-local:
-Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status $(SVC_HOOK_INC)
cd $(top_builddir) \
&& CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
@@ -163,14 +181,13 @@ $(TARGET): $(TARGET)($(STATIC_OBJECTS))
endif
ifneq ($(ENABLE_SHARED),)
-$(FINAL_SO_TARGET): $(OBJECTS) $(SO_VERSION_DATA)
+$(SHARED_OBJECT): $(OBJECTS) $(SO_VERSION_DATA)
$(SHLIB.cc) $(LD_SONAME) $(OUTOPT)$@ $^ $(LIBS)
ifeq ($(OS390BATCH),1)
-$(BATCH_TARGET): $(OBJECTS)
+$(BATCH_TARGET):$(OBJECTS)
$(SHLIB.cc) $(LD_SONAME) $(OUTOPT)$@ $^ $(BATCH_LIBS)
endif # OS390BATCH
-
endif # ENABLE_SHARED
ifeq (,$(MAKECMDGOALS))
diff --git a/icuSources/common/Makefile.local b/icuSources/common/Makefile.local
new file mode 100644
index 00000000..283a622d
--- /dev/null
+++ b/icuSources/common/Makefile.local
@@ -0,0 +1,17 @@
+#******************************************************************************
+#
+# Copyright (c) 2006-2007, Apple Inc.
+# All Rights Reserved.
+#
+#******************************************************************************
+## Makefile.local for Apple Inc.
+
+ifeq "$(WINDOWS)" "YES"
+else ifeq "$(MINIMAL)" "YES"
+else
+ OBJECTS += rbtok.o urbtok.o aaplbfct.o
+
+ STATIC_OBJECT += rbtok.$(STATIC_O) urbtok.$(STATIC_O) aaplbfct.$(STATIC_O)
+
+ DEPS += rbtok.d urbtok.d aaplbfct.d
+endif
diff --git a/icuSources/common/aaplbfct.cpp b/icuSources/common/aaplbfct.cpp
new file mode 100644
index 00000000..e77a3105
--- /dev/null
+++ b/icuSources/common/aaplbfct.cpp
@@ -0,0 +1,367 @@
+/**
+ *******************************************************************************
+ * Copyright (C) 2007, International Business Machines Corporation, Apple Inc.,*
+ * and others. All Rights Reserved. *
+ *******************************************************************************
+ */
+
+#define __STDC_LIMIT_MACROS 1
+#include "unicode/utypes.h"
+
+#if !UCONFIG_NO_BREAK_ITERATION && defined(U_DARWIN)
+
+#include "brkeng.h"
+#include "dictbe.h"
+#include "triedict.h"
+#include "aaplbfct.h"
+#include "unicode/uscript.h"
+#include "unicode/uniset.h"
+#include "unicode/ucnv.h"
+#include "unicode/uchar.h"
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+
+U_NAMESPACE_BEGIN
+
+/*
+ ******************************************************************
+ */
+
+AppleLanguageBreakFactory::AppleLanguageBreakFactory(UErrorCode &status)
+: ICULanguageBreakFactory(status)
+{
+}
+
+AppleLanguageBreakFactory::~AppleLanguageBreakFactory() {
+}
+
+// Helper function that makes a length-delimited buffer look NUL-terminated
+static __attribute__((always_inline)) inline UChar nextUChar(const UChar *&p, ptrdiff_t &l) {
+ if (l > 0) {
+ l -= 1;
+ return *p++;
+ }
+ else {
+ return 0;
+ }
+}
+
+// Add a file's worth of words to the supplied mutable dictionary
+static void addDictFile(MutableTrieDictionary *to, const char *path) {
+ UErrorCode status = U_ZERO_ERROR;
+ off_t fileLength;
+ const char *dictRawData = (const char *) -1;
+ const UChar *dictData = NULL;
+ ptrdiff_t dictDataLength = 0;
+ UChar *dictBuffer = NULL;
+ const char *encoding = NULL;
+ int32_t signatureLength = 0;
+
+ // Open the dictionary file
+ int dictFile = open(path, O_RDONLY, 0);
+ if (dictFile == -1) {
+ status = U_FILE_ACCESS_ERROR;
+ }
+
+ // Determine its length
+ if (U_SUCCESS(status)) {
+ fileLength = lseek(dictFile, 0, SEEK_END);
+ (void) lseek(dictFile, 0, SEEK_SET);
+ if (fileLength < 0 || fileLength > PTRDIFF_MAX) {
+ status = U_FILE_ACCESS_ERROR;
+ }
+ }
+
+ // Map it
+ if (U_SUCCESS(status)) {
+ dictRawData = (const char *) mmap(0, (size_t) fileLength, PROT_READ, MAP_SHARED, dictFile, 0);
+ if ((intptr_t)dictRawData == -1) {
+ status = U_FILE_ACCESS_ERROR;
+ }
+ }
+
+ // No longer need the file descriptor open
+ if (dictFile != -1) {
+ (void) close(dictFile);
+ }
+
+ // Look for a Unicode signature
+ if (U_SUCCESS(status)) {
+ encoding = ucnv_detectUnicodeSignature(dictRawData, fileLength, &signatureLength, &status);
+ }
+
+ // If necessary, convert the data to UChars
+ if (U_SUCCESS(status) && encoding != NULL) {
+ UConverter *conv = ucnv_open(encoding, &status);
+ // Preflight to get buffer size
+ uint32_t destCap = ucnv_toUChars(conv, NULL, 0, dictRawData, fileLength, &status);
+ if (status == U_BUFFER_OVERFLOW_ERROR) {
+ status = U_ZERO_ERROR;
+ }
+ if (U_SUCCESS(status)) {
+ dictBuffer = new UChar[destCap+1];
+ }
+ (void) ucnv_toUChars(conv, dictBuffer, destCap+1, dictRawData, fileLength, &status);
+ dictData = dictBuffer;
+ dictDataLength = destCap;
+ if (U_SUCCESS(status) && dictData[0] == 0xFEFF) { // BOM? Skip it
+ dictData += 1;
+ dictDataLength -= 1;
+ }
+
+ ucnv_close(conv);
+ }
+
+ // If it didn't need converting, just assume it's native-endian UTF-16, no BOM
+ if (U_SUCCESS(status) && dictData == NULL) {
+ dictData = (const UChar *) dictRawData;
+ dictDataLength = fileLength/sizeof(UChar);
+ }
+
+ // OK, we now have a pointer to native-endian UTF-16. Process it as one word per line,
+ // stopping at the first space.
+ if (U_SUCCESS(status)) {
+ UnicodeSet breaks(UNICODE_STRING_SIMPLE("[[:lb=BK:][:lb=CR:][:lb=LF:][:lb=NL:]]"), status);
+ const UChar *candidate = dictData;
+ int32_t length = 0;
+ UChar uc = nextUChar(dictData, dictDataLength);
+ while (U_SUCCESS(status) && uc) {
+ while (uc && !u_isspace(uc)) {
+ length += 1;
+ uc = nextUChar(dictData, dictDataLength);
+ }
+
+ if (length > 0) {
+ to->addWord(candidate, length, status);
+ }
+
+ // Find beginning of next line
+ // 1. Skip non-line-break characters
+ while (uc && !breaks.contains(uc)) {
+ uc = nextUChar(dictData, dictDataLength);
+ }
+ // 2. Skip line break characters
+ while (uc && breaks.contains(uc)) {
+ uc = nextUChar(dictData, dictDataLength);
+ }
+
+ // Prepare for next line
+ candidate = dictData-1;
+ length = 0;
+ }
+ }
+
+ // Unmap the file if we mapped it
+ if ((intptr_t) dictRawData != -1) {
+ (void) munmap((void *)dictRawData, (size_t) fileLength);
+ }
+
+ // Delete any temporary buffer
+ delete [] dictBuffer;
+}
+
+#if U_IS_BIG_ENDIAN
+ static const char sArchType[] = "";
+#else
+ static const char sArchType[] = ".le"; // little endian
+#endif
+
+const CompactTrieDictionary *
+AppleLanguageBreakFactory::loadDictionaryFor(UScriptCode script, int32_t breakType) {
+ const CompactTrieDictionary *icuDict = ICULanguageBreakFactory::loadDictionaryFor(script, breakType);
+ // We only look for a user dictionary if there is actually an ICU dictionary
+ if (icuDict != NULL) {
+ UErrorCode status = U_ZERO_ERROR;
+ const char *scriptName = uscript_getName(script);
+ char path[256]; // PATH_MAX is overkill in this case
+ char cachePath[128];
+ char cacheTargetPath[256];
+ glob_t dirGlob;
+ glob_t fileGlob;
+ struct stat cacheStat;
+ struct stat dictStat;
+ bool cacheGood = true;
+ int globFlags = (GLOB_NOESCAPE|GLOB_NOSORT|GLOB_TILDE);
+ const CompactTrieDictionary *cacheDict = NULL;
+
+ // Iterate the dictionary directories and accumulate in dirGlob
+ NSSearchPathEnumerationState state = NSStartSearchPathEnumeration(NSLibraryDirectory, (NSSearchPathDomainMask) (NSUserDomainMask|NSLocalDomainMask|NSNetworkDomainMask));
+ while (state = NSGetNextSearchPathEnumeration(state, path)) {
+ // First get the directory itself. We should never overflow, but use strlcat anyway
+ // to avoid a crash if we do.
+ strlcat(path, "/Dictionaries", sizeof(path));
+ if (!glob(path, globFlags, NULL, &dirGlob)) {
+ globFlags |= GLOB_APPEND;
+ }
+ }
+
+ // If there are no Dictionaries directories, ignore any cache file and return the ICU
+ // standard dictionary
+ // TODO: Delete the cache?
+ if (dirGlob.gl_pathc == 0) {
+ globfree(&dirGlob);
+ return icuDict;
+ }
+
+ // See if there is a cache file already; get its mod time
+ // TODO: should we be using geteuid() here instead of getuid()?
+ state = NSStartSearchPathEnumeration(NSCachesDirectory, NSLocalDomainMask);
+ state = NSGetNextSearchPathEnumeration(state, cachePath); // Just use first one
+ // Create the cache file name. We should never overflow, but use snprintf to avoid a crash
+ // if we do.
+ snprintf(cacheTargetPath, sizeof(cacheTargetPath), "%s/com.apple.ICUUserDictionaryCache%s.%s.%d", cachePath, sArchType, scriptName, getuid());
+ if (stat(cacheTargetPath, &cacheStat) || cacheStat.st_mode != (S_IFREG|S_IRUSR|S_IWUSR)) {
+ cacheGood = false; // No file or bad permissions or type
+ }
+
+ // Stat the dictionary folders, and glob the dictionary files
+ globFlags &= ~GLOB_APPEND;
+ char **pathsp = dirGlob.gl_pathv;
+ const char *dictpath;
+ while (dictpath = *pathsp++) {
+ // Stat the directory -- ignore if stat failure
+ if (!stat(dictpath, &dictStat)) {
+ // Glob the dictionaries in the directory
+ snprintf(path, sizeof(path), "%s/*-%s.txt", dictpath, scriptName);
+ if (!glob(path, globFlags, NULL, &fileGlob)) {
+ globFlags |= GLOB_APPEND;
+ }
+ // If the directory has been modified after the cache file, we need to rebuild;
+ // a dictionary might have been deleted.
+ if (cacheGood && (dictStat.st_mtimespec.tv_sec > cacheStat.st_mtimespec.tv_sec || (dictStat.st_mtimespec.tv_sec == cacheStat.st_mtimespec.tv_sec && dictStat.st_mtimespec.tv_nsec > cacheStat.st_mtimespec.tv_nsec))) {
+ cacheGood = false;
+ }
+ }
+ }
+
+ // No longer need the directory glob
+ globfree(&dirGlob);
+
+ // If there are no dictionaries, ignore the cache file and return the ICU dictionary
+ // TODO: Delete the cache?
+ if (fileGlob.gl_pathc == 0) {
+ globfree(&fileGlob);
+ return icuDict;
+ }
+
+ // Now compare the last modified stamp for the cache against all the dictionaries
+ pathsp = fileGlob.gl_pathv;
+ while (cacheGood && (dictpath = *pathsp++)) {
+ // Stat the dictionary -- ignore if stat failure
+ if (!stat(dictpath, &dictStat) && (dictStat.st_mtimespec.tv_sec > cacheStat.st_mtimespec.tv_sec || (dictStat.st_mtimespec.tv_sec == cacheStat.st_mtimespec.tv_sec && dictStat.st_mtimespec.tv_nsec > cacheStat.st_mtimespec.tv_nsec))) {
+ cacheGood = false;
+ }
+ }
+
+ // Do we need to build the dictionary cache?
+ if (!cacheGood) {
+ // Create a mutable dictionary from the ICU dictionary
+ MutableTrieDictionary *sum = icuDict->cloneMutable(status);
+ pathsp = fileGlob.gl_pathv;
+ while (U_SUCCESS(status) && (dictpath = *pathsp++)) {
+ // Add the contents of a file to the sum
+ addDictFile(sum, dictpath);
+ }
+
+ // Create a compact (read-only) dictionary
+ CompactTrieDictionary compact(*sum, status);
+ delete sum;
+
+ if (U_SUCCESS(status)) {
+ // Open a temp file to write out the cache
+ strlcat(cachePath, "/temp.XXXXXXXXXX", sizeof(cachePath));
+ int temp = mkstemp(cachePath);
+ if (temp == -1) {
+ status = U_FILE_ACCESS_ERROR;
+ }
+ size_t dictSize = compact.dataSize();
+ if (U_SUCCESS(status) && write(temp, compact.data(), dictSize) != dictSize) {
+ status = U_FILE_ACCESS_ERROR;
+ }
+ // Rename the temp file to the cache. Note that race conditions here are
+ // fine, as the file system operations are atomic. If an outdated version wins
+ // over a newer version, it will get rebuilt at the next app launch due to the
+ // modification time checks above. We don't care that any given app launch gets
+ // the most up-to-date cache (impossible since we can't lock all the Dictionaries
+ // directories), only that the cache (eventually) reflects the current state of
+ // any user dictionaries. That will happen on the next app launch after changes
+ // to the user dictionaries quiesce.
+ if (U_SUCCESS(status)) {
+ if (rename(cachePath, cacheTargetPath)) {
+ status = U_FILE_ACCESS_ERROR;
+ (void) unlink(cachePath); // Clean up the temp file
+ }
+ }
+ if (temp != -1) {
+ close(temp);
+ }
+ }
+ }
+
+ // Done with dictionary paths; release memory allocated by glob()
+ globfree(&fileGlob);
+
+ // Map the cache and build the dictionary
+ if (U_SUCCESS(status)) {
+ int cache = open(cacheTargetPath, O_RDONLY, 0);
+ off_t length;
+ const void *cacheData = (const void *) -1;
+ if (cache == -1) {
+ status = U_FILE_ACCESS_ERROR;
+ }
+ if (U_SUCCESS(status)) {
+ length = lseek(cache, 0, SEEK_END);
+ (void) lseek(cache, 0, SEEK_SET);
+ if (length < 0 || length > PTRDIFF_MAX) {
+ status = U_FILE_ACCESS_ERROR;
+ }
+ }
+
+ // Map the cache. Note: it is left mapped until process exit. This is the normal
+ // behavior anyway, so it shouldn't be an issue.
+ if (U_SUCCESS(status)) {
+ cacheData = mmap(0, (size_t) length, PROT_READ, MAP_SHARED, cache, 0);
+ if ((intptr_t)cacheData == -1) {
+ status = U_FILE_ACCESS_ERROR;
+ }
+ }
+ // We can close the cache file now that it's mapped (or not)
+ if (cache != -1) {
+ (void) close(cache);
+ }
+ // If all was successful, try to create the dictionary. The constructor will
+ // check the magic number for us.
+ if (U_SUCCESS(status)) {
+ cacheDict = new CompactTrieDictionary(cacheData, status);
+ }
+ if (U_FAILURE(status) && (intptr_t)cacheData != -1) {
+ // Clean up the mmap
+ (void) munmap((void *)cacheData, (size_t) length);
+ }
+ }
+
+ // If we were successful, free the ICU dictionary and return ours
+ if (U_SUCCESS(status)) {
+ delete icuDict;
+ return cacheDict;
+ }
+ else {
+ delete cacheDict;
+ }
+ }
+ return icuDict;
+}
+
+U_NAMESPACE_END
+
+#endif /* #if !UCONFIG_NO_BREAK_ITERATION && defined(U_DARWIN) */
diff --git a/icuSources/common/aaplbfct.h b/icuSources/common/aaplbfct.h
new file mode 100644
index 00000000..67dfcdcd
--- /dev/null
+++ b/icuSources/common/aaplbfct.h
@@ -0,0 +1,51 @@
+/**
+ ************************************************************************************
+ * Copyright (C) 2006-2007, International Business Machines Corporation and others. *
+ * All Rights Reserved. *
+ ************************************************************************************
+ */
+
+#ifndef AAPLBFCT_H
+#define AAPLBFCT_H
+
+#include "unicode/utypes.h"
+#include "unicode/uobject.h"
+#include "unicode/utext.h"
+#include "unicode/uscript.h"
+#include "brkeng.h"
+
+U_NAMESPACE_BEGIN
+
+class AppleLanguageBreakFactory : public ICULanguageBreakFactory {
+ public:
+
+ /**
+ * Standard constructor.
+ *
+ */
+ AppleLanguageBreakFactory(UErrorCode &status);
+
+ /**
+ * Virtual destructor.
+ */
+ virtual ~AppleLanguageBreakFactory();
+
+ protected:
+
+ /**
+ * Create a CompactTrieDictionary for the specified script and break type.
+ *
+ * @param script A script code that identifies the dictionary to be
+ * created.
+ * @param breakType The kind of text break for which a dictionary is
+ * sought.
+ * @return A CompactTrieDictionary with the desired characteristics, or 0.
+ */
+ virtual const CompactTrieDictionary *loadDictionaryFor(UScriptCode script, int32_t breakType);
+
+};
+
+U_NAMESPACE_END
+
+ /* AAPLBFCT_H */
+#endif
diff --git a/icuSources/common/brkdict.cpp b/icuSources/common/brkdict.cpp
deleted file mode 100644
index 68875b97..00000000
--- a/icuSources/common/brkdict.cpp
+++ /dev/null
@@ -1,242 +0,0 @@
-/*
-**********************************************************************
-* Copyright (C) 1999-2004 IBM and others. All rights reserved.
-**********************************************************************
-* Date Name Description
-* 12/1/99 rtg Ported from Java
-* 01/13/2000 helena Added UErrorCode to ctors.
-**********************************************************************
-*/
-
-#include "unicode/utypes.h"
-
-#if !UCONFIG_NO_BREAK_ITERATION
-
-#include "unicode/ures.h"
-#include "brkdict.h"
-#include "cmemory.h"
-
-U_NAMESPACE_BEGIN
-
-//=================================================================================
-// deserialization
-//=================================================================================
-
-BreakDictionary::BreakDictionary(const char* /*dictionaryFilename*/, UErrorCode& status)
- : columnMap(NULL),
- table(NULL),
- rowIndex(NULL),
- rowIndexFlags(NULL),
- rowIndexFlagsIndex(NULL),
- rowIndexShifts(NULL)
-{
- if (U_FAILURE(status)) return;
-
- UResourceBundle *th_dict = ures_open(NULL, "th", &status);
- th_dict = ures_getByKey(th_dict, "BreakDictionaryData", th_dict, &status);
- if (U_FAILURE(status)) return;
-
- int32_t len;
- const uint8_t * data = ures_getBinary(th_dict, &len, &status);
- ures_close(th_dict);
- if (U_FAILURE(status)) return;
-
- readDictionaryFile(data);
-}
-
-BreakDictionary::~BreakDictionary()
-{
- ucmp8_close(columnMap);
- uprv_free(table);
- uprv_free(rowIndex);
- uprv_free(rowIndexFlags);
- uprv_free(rowIndexFlagsIndex);
- uprv_free(rowIndexShifts);
-}
-
-// macros to support readDictionaryFile. The data files originated from a Java
-// program, and Java always writes data out in big-endian format. These macros will
-// byte-swap the data for appropriate use on Windows.
-
-#if U_IS_BIG_ENDIAN
-#define SWAP32(x)
-#define SWAP16(x)
-#else
-#define SWAP32(x) x = (uint32_t)((x >> 24 & 0xff) | (x >> 8 & 0xff00) | (x << 8 & 0xff0000) | (x << 24 & 0xff000000))
-#define SWAP16(x) x = (uint16_t)((x << 8 & 0xff00) | (x >> 8 & 0xff))
-#endif
-
-#define DICTIONARY_READ(source, destAddr, len) \
- uprv_memcpy(destAddr, source, len);\
- source+=(len)
-
-
-void
-BreakDictionary::readDictionaryFile(const uint8_t * in)
-{
- int32_t l;
- int32_t version;
-
- int i;
-
- // read in the version number (right now we just ignore it)
- DICTIONARY_READ(in, &version, 4);
-
- // read in the column map (this is serialized in its internal form:
- // an index array followed by a data array)
- DICTIONARY_READ(in, &l, 4);
- SWAP32(l);
- uint16_t* temp = (uint16_t*) uprv_malloc(sizeof(uint16_t)*l);
- DICTIONARY_READ(in, temp, l * sizeof (int16_t) );
- for (i = 0; i < l; i++) {
- SWAP16(temp[i]);
- }
- DICTIONARY_READ(in, &l, 4);
- SWAP32(l);
- int8_t* temp2 = (int8_t*) uprv_malloc(sizeof(int8_t)*l);
- DICTIONARY_READ(in, temp2, l);
- columnMap = ucmp8_openAdopt(temp, temp2, l);
-
- // read in numCols and numColGroups
- DICTIONARY_READ(in, &numCols, 4);
- SWAP32(numCols);
- DICTIONARY_READ(in, &numColGroups, 4);
- SWAP32(numColGroups);
-
- // read in the row-number index
- DICTIONARY_READ(in, &l, 4);
- SWAP32(l);
- rowIndex = (int16_t *)uprv_malloc(l*2);
- DICTIONARY_READ(in, rowIndex, l * sizeof (int16_t) );
- for (i = 0; i < l; i++) {
- SWAP16(rowIndex[i]);
- }
-
- // load in the populated-cells bitmap: index first, then bitmap list
- DICTIONARY_READ(in, &l, 4);
- SWAP32(l);
- rowIndexFlagsIndex = (int16_t *)uprv_malloc(l*2);
- DICTIONARY_READ(in, rowIndexFlagsIndex, l * sizeof(int16_t) );
- for (i = 0; i < l; i++) {
- SWAP16(rowIndexFlagsIndex[i]);
- }
- DICTIONARY_READ(in, &l, 4);
- SWAP32(l);
- rowIndexFlags = (int32_t *)uprv_malloc(l*4);
- DICTIONARY_READ(in, rowIndexFlags, l * sizeof(int32_t));
- for (i = 0; i < l; i++) {
- SWAP32(rowIndexFlags[i]);
- }
-
- // load in the row-shift index
- DICTIONARY_READ(in, &l, 4);
- SWAP32(l);
- rowIndexShifts = (int8_t *)uprv_malloc(l);
- DICTIONARY_READ(in, rowIndexShifts, l);
-
- // finally, load in the actual state table
- DICTIONARY_READ(in, &l, 4);
- SWAP32(l);
- table = (int16_t *)uprv_malloc(l*2);
- DICTIONARY_READ(in, table, l * sizeof(int16_t) );
- for (i = 0; i < l; i++) {
- SWAP16(table[i]);
- }
-
- // the reverse column map occurs next in the file. In the C/C++ code, for the
- // time being, we're not going to worry about that.
-}
-
-//=================================================================================
-// access to the words
-//=================================================================================
-
-/**
- * Uses the column map to map the character to a column number, then
- * passes the row and column number to the other version of at()
- * @param row The current state
- * @param ch The character whose column we're interested in
- * @return The new state to transition to
- */
-int16_t
-BreakDictionary::at(int32_t row, UChar ch) const
-{
- int16_t col = ucmp8_get(columnMap, ch);
- return at(row, (int32_t)col);
-}
-
-/**
- * Returns the value in the cell with the specified (logical) row and
- * column numbers. In DictionaryBasedBreakIterator, the row number is
- * a state number, the column number is an input, and the return value
- * is the row number of the new state to transition to. (0 is the
- * "error" state, and -1 is the "end of word" state in a dictionary)
- * @param row The row number of the current state
- * @param col The column number of the input character (0 means "not a
- * dictionary character")
- * @return The row number of the new state to transition to
- */
-int16_t
-BreakDictionary::at(int32_t row, int32_t col) const
-{
- if (cellIsPopulated(row, col)) {
- // we map from logical to physical row number by looking up the
- // mapping in rowIndex; we map from logical column number to
- // physical column number by looking up a shift value for this
- // logical row and offsetting the logical column number by
- // the shift amount. Then we can use internalAt() to actually
- // get the value out of the table.
- return internalAt(rowIndex[row], col + rowIndexShifts[row]);
- }
- else {
- return 0;
- }
-}
-
-//=================================================================================
-// implementation
-//=================================================================================
-/**
- * Given (logical) row and column numbers, returns true if the
- * cell in that position is populated
- */
-UBool
-BreakDictionary::cellIsPopulated(int32_t row, int32_t col) const
-{
- // look up the entry in the bitmap index for the specified row.
- // If it's a negative number, it's the column number of the only
- // populated cell in the row
- if (rowIndexFlagsIndex[row] < 0) {
- return col == -rowIndexFlagsIndex[row];
- }
-
- // if it's a positive number, it's the offset of an entry in the bitmap
- // list. If the table is more than 32 columns wide, the bitmap is stored
- // successive entries in the bitmap list, so we have to divide the column
- // number by 32 and offset the number we got out of the index by the result.
- // Once we have the appropriate piece of the bitmap, test the appropriate
- // bit and return the result.
- else {
- int32_t flags = rowIndexFlags[rowIndexFlagsIndex[row] + (col >> 5)];
- return (flags & (1 << (col & 0x1f))) != 0;
- }
-}
-
-/**
- * Implementation of at() when we know the specified cell is populated.
- * @param row The PHYSICAL row number of the cell
- * @param col The PHYSICAL column number of the cell
- * @return The value stored in the cell
- */
-int16_t
-BreakDictionary::internalAt(int32_t row, int32_t col) const
-{
- // the table is a one-dimensional array, so this just does the math necessary
- // to treat it as a two-dimensional array (we don't just use a two-dimensional
- // array because two-dimensional arrays are inefficient in Java)
- return table[row * numCols + col];
-}
-
-U_NAMESPACE_END
-
-#endif /* #if !UCONFIG_NO_BREAK_ITERATION */
diff --git a/icuSources/common/brkdict.h b/icuSources/common/brkdict.h
deleted file mode 100644
index 87a6fd74..00000000
--- a/icuSources/common/brkdict.h
+++ /dev/null
@@ -1,174 +0,0 @@
-/*
-**********************************************************************
-* Copyright (C) 1999-2004 IBM and others. All rights reserved.
-**********************************************************************
-* Date Name Description
-* 12/1/99 rtg Ported from Java
-* 01/13/2000 helena Added UErrorCode to ctors.
-**********************************************************************
-*/
-
-#ifndef BRKDICT_H
-#define BRKDICT_H
-
-#include "unicode/utypes.h"
-#include "unicode/uobject.h"
-#include "ucmp8.h"
-
-U_NAMESPACE_BEGIN
-
-/**
- * This is the class that represents the list of known words used by
- * DictionaryBasedBreakIterator. The conceptual data structure used
- * here is a trie: there is a node hanging off the root node for every
- * letter that can start a word. Each of these nodes has a node hanging
- * off of it for every letter that can be the second letter of a word
- * if this node is the first letter, and so on. The trie is represented
- * as a two-dimensional array that can be treated as a table of state
- * transitions. Indexes are used to compress this array, taking
- * advantage of the fact that this array will always be very sparse.
- */
-class BreakDictionary : public UMemory {
- //=================================================================================
- // data members
- //=================================================================================
-private:
-
- /**
- * Maps from characters to column numbers. The main use of this is to
- * avoid making room in the array for empty columns.
- */
- CompactByteArray* columnMap;
-
- /**
- * The number of actual columns in the table
- */
- int32_t numCols;
-
- /**
- * Columns are organized into groups of 32. This says how many
- * column groups. (We could calculate this, but we store the
- * value to avoid having to repeatedly calculate it.)
- */
- int32_t numColGroups;
-
- /**
- * The actual compressed state table. Each conceptual row represents
- * a state, and the cells in it contain the row numbers of the states
- * to transition to for each possible letter. 0 is used to indicate
- * an illegal combination of letters (i.e., the error state). The
- * table is compressed by eliminating all the unpopulated (i.e., zero)
- * cells. Multiple conceptual rows can then be doubled up in a single
- * physical row by sliding them up and possibly shifting them to one
- * side or the other so the populated cells don't collide. Indexes
- * are used to identify unpopulated cells and to locate populated cells.
- */
- int16_t* table;
-
- /**
- * This index maps logical row numbers to physical row numbers
- */
- int16_t* rowIndex;
-
- /**
- * A bitmap is used to tell which cells in the comceptual table are
- * populated. This array contains all the unique bit combinations
- * in that bitmap. If the table is more than 32 columns wide,
- * successive entries in this array are used for a single row.
- */
- int32_t* rowIndexFlags;
-
- /**
- * This index maps from a logical row number into the bitmap table above.
- * (This keeps us from storing duplicate bitmap combinations.) Since there
- * are a lot of rows with only one populated cell, instead of wasting space
- * in the bitmap table, we just store a negative number in this index for
- * rows with one populated cell. The absolute value of that number is
- * the column number of the populated cell.
- */
- int16_t* rowIndexFlagsIndex;
-
- /**
- * For each logical row, this index contains a constant that is added to
- * the logical column number to get the physical column number
- */
- int8_t* rowIndexShifts;
-
- //=================================================================================
- // deserialization
- //=================================================================================
-
-public:
- /**
- * Constructor. Creates the BreakDictionary by using readDictionaryFile() to
- * load the dictionary tables from the disk.
- * @param dictionaryFilename The name of the dictionary file
- * @param status for errors if it occurs
- */
- BreakDictionary(const char* dictionaryFilename, UErrorCode& status);
-
- /**
- * Destructor.
- */
- ~BreakDictionary();
-
- /**
- * Reads the dictionary file on the disk and constructs the appropriate in-memory
- * representation.
- * @param in The given memory stream
- */
- void readDictionaryFile(const uint8_t * in);
-
- //=================================================================================
- // access to the words
- //=================================================================================
-
- /**
- * Uses the column map to map the character to a column number, then
- * passes the row and column number to the other version of at()
- * @param row The current state
- * @param ch The character whose column we're interested in
- * @return The new state to transition to
- */
- int16_t at(int32_t row, UChar ch) const;
-
- /**
- * Returns the value in the cell with the specified (logical) row and
- * column numbers. In DictionaryBasedBreakIterator, the row number is
- * a state number, the column number is an input, and the return value
- * is the row number of the new state to transition to. (0 is the
- * "error" state, and -1 is the "end of word" state in a dictionary)
- * @param row The row number of the current state
- * @param col The column number of the input character (0 means "not a
- * dictionary character")
- * @return The row number of the new state to transition to
- */
- int16_t at(int32_t row, int32_t col) const;
-
-private:
- /**
- * Given (logical) row and column numbers, returns true if the
- * cell in that position is populated
- * @param row The LOGICAL row number of the cell
- * @param col The PHYSICAL row number of the cell
- * @return true if the cell in that position is populated
- */
- UBool cellIsPopulated(int32_t row, int32_t col) const;
-
- /**
- * Implementation of at() when we know the specified cell is populated.
- * @param row The PHYSICAL row number of the cell
- * @param col The PHYSICAL column number of the cell
- * @return The value stored in the cell
- */
- int16_t internalAt(int32_t row, int32_t col) const;
-
- // the following methods are never meant to be called and so are not defined
- // (if you don't declare them, you get default implementations)
- BreakDictionary(const BreakDictionary& that);
- BreakDictionary& operator=(const BreakDictionary& that);
-};
-
-U_NAMESPACE_END
-
-#endif
diff --git a/icuSources/common/brkeng.cpp b/icuSources/common/brkeng.cpp
new file mode 100644
index 00000000..c0ec1dd7
--- /dev/null
+++ b/icuSources/common/brkeng.cpp
@@ -0,0 +1,287 @@
+/**
+ *******************************************************************************
+ * Copyright (C) 2006, International Business Machines Corporation and others. *
+ * All Rights Reserved. *
+ *******************************************************************************
+ */
+
+#include "unicode/utypes.h"
+
+#if !UCONFIG_NO_BREAK_ITERATION
+
+#include "brkeng.h"
+#include "dictbe.h"
+#include "triedict.h"
+#include "unicode/uchar.h"
+#include "unicode/uniset.h"
+#include "unicode/chariter.h"
+#include "unicode/ures.h"
+#include "unicode/udata.h"
+#include "unicode/putil.h"
+#include "unicode/ustring.h"
+#include "unicode/uscript.h"
+#include "uvector.h"
+#include "mutex.h"
+#include "uresimp.h"
+#include "ubrkimpl.h"
+
+U_NAMESPACE_BEGIN
+
+/*
+ ******************************************************************
+ */
+
+LanguageBreakEngine::LanguageBreakEngine() {
+}
+
+LanguageBreakEngine::~LanguageBreakEngine() {
+}
+
+/*
+ ******************************************************************
+ */
+
+LanguageBreakFactory::LanguageBreakFactory() {
+}
+
+LanguageBreakFactory::~LanguageBreakFactory() {
+}
+
+/*
+ ******************************************************************
+ */
+
+UnhandledEngine::UnhandledEngine(UErrorCode &/*status*/) {
+ for (int32_t i = 0; i < (int32_t)(sizeof(fHandled)/sizeof(fHandled[0])); ++i) {
+ fHandled[i] = 0;
+ }
+}
+
+UnhandledEngine::~UnhandledEngine() {
+ for (int32_t i = 0; i < (int32_t)(sizeof(fHandled)/sizeof(fHandled[0])); ++i) {
+ if (fHandled[i] != 0) {
+ delete fHandled[i];
+ }
+ }
+}
+
+UBool
+UnhandledEngine::handles(UChar32 c, int32_t breakType) const {
+ return (breakType >= 0 && breakType < (int32_t)(sizeof(fHandled)/sizeof(fHandled[0]))
+ && fHandled[breakType] != 0 && fHandled[breakType]->contains(c));
+}
+
+int32_t
+UnhandledEngine::findBreaks( UText *text,
+ int32_t startPos,
+ int32_t endPos,
+ UBool reverse,
+ int32_t breakType,
+ UStack &/*foundBreaks*/ ) const {
+ if (breakType >= 0 && breakType < (int32_t)(sizeof(fHandled)/sizeof(fHandled[0]))) {
+ UChar32 c = utext_current32(text);
+ if (reverse) {
+ while((int32_t)utext_getNativeIndex(text) > startPos && fHandled[breakType]->contains(c)) {
+ c = utext_previous32(text);
+ }
+ }
+ else {
+ while((int32_t)utext_getNativeIndex(text) < endPos && fHandled[breakType]->contains(c)) {
+ utext_next32(text); // TODO: recast loop to work with post-increment operations.
+ c = utext_current32(text);
+ }
+ }
+ }
+ return 0;
+}
+
+void
+UnhandledEngine::handleCharacter(UChar32 c, int32_t breakType) {
+ if (breakType >= 0 && breakType < (int32_t)(sizeof(fHandled)/sizeof(fHandled[0]))) {
+ if (fHandled[breakType] == 0) {
+ fHandled[breakType] = new UnicodeSet();
+ if (fHandled[breakType] == 0) {
+ return;
+ }
+ }
+ if (!fHandled[breakType]->contains(c)) {
+ UErrorCode status = U_ZERO_ERROR;
+ // Apply the entire script of the character.
+ int32_t script = u_getIntPropertyValue(c, UCHAR_SCRIPT);
+ fHandled[breakType]->applyIntPropertyValue(UCHAR_SCRIPT, script, status);
+ }
+ }
+}
+
+/*
+ ******************************************************************
+ */
+
+ICULanguageBreakFactory::ICULanguageBreakFactory(UErrorCode &/*status*/) {
+ fEngines = 0;
+}
+
+ICULanguageBreakFactory::~ICULanguageBreakFactory() {
+ if (fEngines != 0) {
+ delete fEngines;
+ }
+}
+
+U_NAMESPACE_END
+U_CDECL_BEGIN
+static void U_CALLCONV _deleteEngine(void *obj) {
+ delete (const LanguageBreakEngine *) obj;
+}
+U_CDECL_END
+U_NAMESPACE_BEGIN
+
+const LanguageBreakEngine *
+ICULanguageBreakFactory::getEngineFor(UChar32 c, int32_t breakType) {
+ UBool needsInit;
+ int32_t i;
+ const LanguageBreakEngine *lbe = NULL;
+ UErrorCode status = U_ZERO_ERROR;
+
+ umtx_lock(NULL);
+ needsInit = (UBool)(fEngines == NULL);
+ if (!needsInit) {
+ i = fEngines->size();
+ while (--i >= 0) {
+ lbe = (const LanguageBreakEngine *)(fEngines->elementAt(i));
+ if (lbe != NULL && lbe->handles(c, breakType)) {
+ break;
+ }
+ lbe = NULL;
+ }
+ }
+ umtx_unlock(NULL);
+
+ if (lbe != NULL) {
+ return lbe;
+ }
+
+ if (needsInit) {
+ UStack *engines = new UStack(_deleteEngine, NULL, status);
+ if (U_SUCCESS(status) && engines == NULL) {
+ status = U_MEMORY_ALLOCATION_ERROR;
+ }
+ else if (U_FAILURE(status)) {
+ delete engines;
+ engines = NULL;
+ }
+ else {
+ umtx_lock(NULL);
+ if (fEngines == NULL) {
+ fEngines = engines;
+ engines = NULL;
+ }
+ umtx_unlock(NULL);
+ delete engines;
+ }
+ }
+
+ if (fEngines == NULL) {
+ return NULL;
+ }
+
+ // We didn't find an engine the first time through, or there was no
+ // stack. Create an engine.
+ const LanguageBreakEngine *newlbe = loadEngineFor(c, breakType);
+
+ // Now get the lock, and see if someone else has created it in the
+ // meantime
+ umtx_lock(NULL);
+ i = fEngines->size();
+ while (--i >= 0) {
+ lbe = (const LanguageBreakEngine *)(fEngines->elementAt(i));
+ if (lbe != NULL && lbe->handles(c, breakType)) {
+ break;
+ }
+ lbe = NULL;
+ }
+ if (lbe == NULL && newlbe != NULL) {
+ fEngines->push((void *)newlbe, status);
+ lbe = newlbe;
+ newlbe = NULL;
+ }
+ umtx_unlock(NULL);
+
+ delete newlbe;
+
+ return lbe;
+}
+
+const LanguageBreakEngine *
+ICULanguageBreakFactory::loadEngineFor(UChar32 c, int32_t breakType) {
+ UErrorCode status = U_ZERO_ERROR;
+ UScriptCode code = uscript_getScript(c, &status);
+ if (U_SUCCESS(status)) {
+ const CompactTrieDictionary *dict = loadDictionaryFor(code, breakType);
+ if (dict != NULL) {
+ const LanguageBreakEngine *engine = NULL;
+ switch(code) {
+ case USCRIPT_THAI:
+ engine = new ThaiBreakEngine(dict, status);
+ break;
+ default:
+ break;
+ }
+ if (engine == NULL) {
+ delete dict;
+ }
+ else if (U_FAILURE(status)) {
+ delete engine;
+ engine = NULL;
+ }
+ return engine;
+ }
+ }
+ return NULL;
+}
+
+const CompactTrieDictionary *
+ICULanguageBreakFactory::loadDictionaryFor(UScriptCode script, int32_t breakType) {
+ UErrorCode status = U_ZERO_ERROR;
+ // Open root from brkitr tree.
+ char dictnbuff[256];
+ char ext[4]={'\0'};
+
+ UResourceBundle *b = ures_open(U_ICUDATA_BRKITR, "", &status);
+ b = ures_getByKeyWithFallback(b, "dictionaries", b, &status);
+ b = ures_getByKeyWithFallback(b, uscript_getShortName(script), b, &status);
+ int32_t dictnlength = 0;
+ const UChar *dictfname = ures_getString(b, &dictnlength, &status);
+ if (U_SUCCESS(status) && (size_t)dictnlength >= sizeof(dictnbuff)) {
+ dictnlength = 0;
+ status = U_BUFFER_OVERFLOW_ERROR;
+ }
+ if (U_SUCCESS(status) && dictfname) {
+ UChar* extStart=u_strchr(dictfname, 0x002e);
+ int len = 0;
+ if(extStart!=NULL){
+ len = extStart-dictfname;
+ u_UCharsToChars(extStart+1, ext, sizeof(ext)); // nul terminates the buff
+ u_UCharsToChars(dictfname, dictnbuff, len);
+ }
+ dictnbuff[len]=0; // nul terminate
+ }
+ ures_close(b);
+ UDataMemory *file = udata_open(U_ICUDATA_BRKITR, ext, dictnbuff, &status);
+ if (U_SUCCESS(status)) {
+ const CompactTrieDictionary *dict = new CompactTrieDictionary(
+ file, status);
+ if (U_SUCCESS(status) && dict == NULL) {
+ status = U_MEMORY_ALLOCATION_ERROR;
+ }
+ if (U_FAILURE(status)) {
+ delete dict;
+ dict = NULL;
+ }
+ return dict;
+ }
+ return NULL;
+}
+
+U_NAMESPACE_END
+
+#endif /* #if !UCONFIG_NO_BREAK_ITERATION */
diff --git a/icuSources/common/brkeng.h b/icuSources/common/brkeng.h
new file mode 100644
index 00000000..8b27c214
--- /dev/null
+++ b/icuSources/common/brkeng.h
@@ -0,0 +1,292 @@
+/**
+ *******************************************************************************
+ * Copyright (C) 2006, International Business Machines Corporation and others. *
+ * All Rights Reserved. *
+ *******************************************************************************
+ */
+
+#ifndef BRKENG_H
+#define BRKENG_H
+
+#include "unicode/utypes.h"
+#include "unicode/uobject.h"
+#include "unicode/utext.h"
+#include "unicode/uscript.h"
+
+U_NAMESPACE_BEGIN
+
+class UnicodeSet;
+class UStack;
+class CompactTrieDictionary;
+
+/*******************************************************************
+ * LanguageBreakEngine
+ */
+
+/**
+ * LanguageBreakEngines implement language-specific knowledge for
+ * finding text boundaries within a run of characters belonging to a
+ * specific set. The boundaries will be of a specific kind, e.g. word,
+ * line, etc.
+ *
+ * LanguageBreakEngines should normally be implemented so as to
+ * be shared between threads without locking.
+ */
+class LanguageBreakEngine : public UMemory {
+ public:
+
+ /**
+ * Default constructor.
+ *
+ */
+ LanguageBreakEngine();
+
+ /**
+ * Virtual destructor.
+ */
+ virtual ~LanguageBreakEngine();
+
+ /**
+ * Indicate whether this engine handles a particular character for
+ * a particular kind of break.
+ *
+ * @param c A character which begins a run that the engine might handle
+ * @param breakType The type of text break which the caller wants to determine
+ * @return TRUE if this engine handles the particular character and break
+ * type.
+ */
+ virtual UBool handles(UChar32 c, int32_t breakType) const = 0;
+
+ /**
+ * Find any breaks within a run in the supplied text.
+ *
+ * @param text A UText representing the text. The
+ * iterator is left at the end of the run of characters which the engine
+ * is capable of handling.
+ * @param startPos The start of the run within the supplied text.
+ * @param endPos The end of the run within the supplied text.
+ * @param reverse Whether the caller is looking for breaks in a reverse
+ * direction.
+ * @param breakType The type of break desired, or -1.
+ * @param foundBreaks An allocated C array of the breaks found, if any
+ * @return The number of breaks found.
+ */
+ virtual int32_t findBreaks( UText *text,
+ int32_t startPos,
+ int32_t endPos,
+ UBool reverse,
+ int32_t breakType,
+ UStack &foundBreaks ) const = 0;
+
+};
+
+/*******************************************************************
+ * LanguageBreakFactory
+ */
+
+/**
+ * LanguageBreakFactorys find and return a LanguageBreakEngine
+ * that can determine breaks for characters in a specific set, if
+ * such an object can be found.
+ *
+ * If a LanguageBreakFactory is to be shared between threads,
+ * appropriate synchronization must be used; there is none internal
+ * to the factory.
+ *
+ * A LanguageBreakEngine returned by a LanguageBreakFactory can
+ * normally be shared between threads without synchronization, unless
+ * the specific subclass of LanguageBreakFactory indicates otherwise.
+ *
+ * A LanguageBreakFactory is responsible for deleting any LanguageBreakEngine
+ * it returns when it itself is deleted, unless the specific subclass of
+ * LanguageBreakFactory indicates otherwise. Naturally, the factory should
+ * not be deleted until the LanguageBreakEngines it has returned are no
+ * longer needed.
+ */
+class LanguageBreakFactory : public UMemory {
+ public:
+
+ /**
+ * Default constructor.
+ *
+ */
+ LanguageBreakFactory();
+
+ /**
+ * Virtual destructor.
+ */
+ virtual ~LanguageBreakFactory();
+
+ /**
+ * Find and return a LanguageBreakEngine that can find the desired
+ * kind of break for the set of characters to which the supplied
+ * character belongs. It is up to the set of available engines to
+ * determine what the sets of characters are.
+ *
+ * @param c A character that begins a run for which a LanguageBreakEngine is
+ * sought.
+ * @param breakType The kind of text break for which a LanguageBreakEngine is
+ * sought.
+ * @return A LanguageBreakEngine with the desired characteristics, or 0.
+ */
+ virtual const LanguageBreakEngine *getEngineFor(UChar32 c, int32_t breakType) = 0;
+
+};
+
+/*******************************************************************
+ * UnhandledEngine
+ */
+
+/**
+ * UnhandledEngine is a special subclass of LanguageBreakEngine that
+ * handles characters that no other LanguageBreakEngine is available to
+ * handle. It is told the character and the type of break; at its
+ * discretion it may handle more than the specified character (e.g.,
+ * the entire script to which that character belongs.
+ *
+ * UnhandledEngines may not be shared between threads without
+ * external synchronization.
+ */
+
+class UnhandledEngine : public LanguageBreakEngine {
+ private:
+
+ /**
+ * The sets of characters handled, for each break type
+ * @internal
+ */
+
+ UnicodeSet *fHandled[4];
+
+ public:
+
+ /**
+ * Default constructor.
+ *
+ */
+ UnhandledEngine(UErrorCode &status);
+
+ /**
+ * Virtual destructor.
+ */
+ virtual ~UnhandledEngine();
+
+ /**
+ * Indicate whether this engine handles a particular character for
+ * a particular kind of break.
+ *
+ * @param c A character which begins a run that the engine might handle
+ * @param breakType The type of text break which the caller wants to determine
+ * @return TRUE if this engine handles the particular character and break
+ * type.
+ */
+ virtual UBool handles(UChar32 c, int32_t breakType) const;
+
+ /**
+ * Find any breaks within a run in the supplied text.
+ *
+ * @param text A UText representing the text (TODO: UText). The
+ * iterator is left at the end of the run of characters which the engine
+ * is capable of handling.
+ * @param startPos The start of the run within the supplied text.
+ * @param endPos The end of the run within the supplied text.
+ * @param reverse Whether the caller is looking for breaks in a reverse
+ * direction.
+ * @param breakType The type of break desired, or -1.
+ * @param foundBreaks An allocated C array of the breaks found, if any
+ * @return The number of breaks found.
+ */
+ virtual int32_t findBreaks( UText *text,
+ int32_t startPos,
+ int32_t endPos,
+ UBool reverse,
+ int32_t breakType,
+ UStack &foundBreaks ) const;
+
+ /**
+ * Tell the engine to handle a particular character and break type.
+ *
+ * @param c A character which the engine should handle
+ * @param breakType The type of text break for which the engine should handle c
+ */
+ virtual void handleCharacter(UChar32 c, int32_t breakType);
+
+};
+
+/*******************************************************************
+ * ICULanguageBreakFactory
+ */
+
+/**
+ * ICULanguageBreakFactory is the default LanguageBreakFactory for
+ * ICU. It creates dictionary-based LanguageBreakEngines from dictionary
+ * data in the ICU data file.
+ */
+class ICULanguageBreakFactory : public LanguageBreakFactory {
+ private:
+
+ /**
+ * The stack of break engines created by this factory
+ * @internal
+ */
+
+ UStack *fEngines;
+
+ public:
+
+ /**
+ * Standard constructor.
+ *
+ */
+ ICULanguageBreakFactory(UErrorCode &status);
+
+ /**
+ * Virtual destructor.
+ */
+ virtual ~ICULanguageBreakFactory();
+
+ /**
+ * Find and return a LanguageBreakEngine that can find the desired
+ * kind of break for the set of characters to which the supplied
+ * character belongs. It is up to the set of available engines to
+ * determine what the sets of characters are.
+ *
+ * @param c A character that begins a run for which a LanguageBreakEngine is
+ * sought.
+ * @param breakType The kind of text break for which a LanguageBreakEngine is
+ * sought.
+ * @return A LanguageBreakEngine with the desired characteristics, or 0.
+ */
+ virtual const LanguageBreakEngine *getEngineFor(UChar32 c, int32_t breakType);
+
+ protected:
+
+ /**
+ * Create a LanguageBreakEngine for the set of characters to which
+ * the supplied character belongs, for the specified break type.
+ *
+ * @param c A character that begins a run for which a LanguageBreakEngine is
+ * sought.
+ * @param breakType The kind of text break for which a LanguageBreakEngine is
+ * sought.
+ * @return A LanguageBreakEngine with the desired characteristics, or 0.
+ */
+ virtual const LanguageBreakEngine *loadEngineFor(UChar32 c, int32_t breakType);
+
+ /**
+ * Create a CompactTrieDictionary for the specified script and break type.
+ *
+ * @param script An ISO 15924 script code that identifies the dictionary to be
+ * created.
+ * @param breakType The kind of text break for which a dictionary is
+ * sought.
+ * @return A CompactTrieDictionary with the desired characteristics, or 0.
+ */
+ virtual const CompactTrieDictionary *loadDictionaryFor(UScriptCode script, int32_t breakType);
+
+};
+
+U_NAMESPACE_END
+
+ /* BRKENG_H */
+#endif
diff --git a/icuSources/common/brkiter.cpp b/icuSources/common/brkiter.cpp
index 835711d4..256095bf 100644
--- a/icuSources/common/brkiter.cpp
+++ b/icuSources/common/brkiter.cpp
@@ -1,6 +1,6 @@
/*
*******************************************************************************
-* Copyright (C) 1997-2004, International Business Machines Corporation and *
+* Copyright (C) 1997-2006, International Business Machines Corporation and *
* others. All Rights Reserved. *
*******************************************************************************
*
@@ -22,16 +22,19 @@
#if !UCONFIG_NO_BREAK_ITERATION
-#include "unicode/dbbi.h"
+#include "unicode/rbbi.h"
#include "unicode/brkiter.h"
#include "unicode/udata.h"
#include "unicode/ures.h"
+#include "unicode/ustring.h"
#include "ucln_cmn.h"
#include "cstring.h"
#include "mutex.h"
-#include "iculserv.h"
+#include "servloc.h"
#include "locbased.h"
#include "uresimp.h"
+#include "uassert.h"
+#include "ubrkimpl.h"
// *****************************************************************************
// class BreakIterator
@@ -42,20 +45,21 @@
U_NAMESPACE_BEGIN
-const int32_t BreakIterator::DONE = (int32_t)-1;
-
// -------------------------------------
BreakIterator*
-BreakIterator::buildInstance(const Locale& loc, const char *type, UBool dict, UErrorCode &status)
+BreakIterator::buildInstance(const Locale& loc, const char *type, int32_t kind, UErrorCode &status)
{
char fnbuff[256];
+ char ext[4]={'\0'};
char actualLocale[ULOC_FULLNAME_CAPACITY];
int32_t size;
const UChar* brkfname = NULL;
- UResourceBundle brkRulesStack, brkNameStack;
- UResourceBundle *brkRules = &brkRulesStack, *brkName = &brkNameStack;
- BreakIterator *result = NULL;
+ UResourceBundle brkRulesStack;
+ UResourceBundle brkNameStack;
+ UResourceBundle *brkRules = &brkRulesStack;
+ UResourceBundle *brkName = &brkNameStack;
+ RuleBasedBreakIterator *result = NULL;
if (U_FAILURE(status))
return NULL;
@@ -64,7 +68,13 @@ BreakIterator::buildInstance(const Locale& loc, const char *type, UBool dict, UE
ures_initStackObject(brkName);
// Get the locale
- UResourceBundle *b = ures_open(NULL, loc.getName(), &status);
+ UResourceBundle *b = ures_open(U_ICUDATA_BRKITR, loc.getName(), &status);
+ /* this is a hack for now. Should be fixed when the data is fetched from
+ brk_index.txt */
+ if(status==U_USING_DEFAULT_WARNING){
+ status=U_ZERO_ERROR;
+ ures_openFillIn(b, U_ICUDATA_BRKITR, "", &status);
+ }
// Get the "boundaries" array.
if (U_SUCCESS(status)) {
@@ -73,57 +83,48 @@ BreakIterator::buildInstance(const Locale& loc, const char *type, UBool dict, UE
brkName = ures_getByKeyWithFallback(brkRules, type, brkName, &status);
// Get the actual string
brkfname = ures_getString(brkName, &size, &status);
+ U_ASSERT((size_t)size=sizeof(fnbuff)) {
+ size=0;
+ if (U_SUCCESS(status)) {
+ status = U_BUFFER_OVERFLOW_ERROR;
+ }
+ }
// Use the string if we found it
if (U_SUCCESS(status) && brkfname) {
uprv_strncpy(actualLocale,
ures_getLocale(brkName, &status),
sizeof(actualLocale)/sizeof(actualLocale[0]));
- u_UCharsToChars(brkfname, fnbuff, size+1);
+
+ UChar* extStart=u_strchr(brkfname, 0x002e);
+ int len = 0;
+ if(extStart!=NULL){
+ len = extStart-brkfname;
+ u_UCharsToChars(extStart+1, ext, sizeof(ext)); // nul terminates the buff
+ u_UCharsToChars(brkfname, fnbuff, len);
+ }
+ fnbuff[len]=0; // nul terminate
}
}
ures_close(brkRules);
ures_close(brkName);
- UDataMemory* file = udata_open(NULL, "brk", fnbuff, &status);
+ UDataMemory* file = udata_open(U_ICUDATA_BRKITR, ext, fnbuff, &status);
if (U_FAILURE(status)) {
ures_close(b);
return NULL;
}
- // We found the break rules; now see if a dictionary is needed
- if (dict)
- {
- UErrorCode localStatus = U_ZERO_ERROR;
- brkName = &brkNameStack;
- ures_initStackObject(brkName);
- brkName = ures_getByKeyWithFallback(b, "BreakDictionaryData", brkName, &localStatus);
-#if 0
- if (U_SUCCESS(localStatus)) {
- brkfname = ures_getString(&brkname, &size, &localStatus);
- }
-#endif
- if (U_SUCCESS(localStatus)) {
-#if 0
- u_UCharsToChars(brkfname, fnbuff, size);
- fnbuff[size] = '\0';
-#endif
- result = new DictionaryBasedBreakIterator(file, "thaidict.brk", status);
- }
- ures_close(brkName);
- }
-
- // If there is still no result but we haven't had an error, no dictionary,
- // so make a non-dictionary break iterator
- if (U_SUCCESS(status) && result == NULL) {
- result = new RuleBasedBreakIterator(file, status);
- }
+ // Create a RuleBasedBreakIterator
+ result = new RuleBasedBreakIterator(file, status);
- // If there is a result, set the valid locale and actual locale
+ // If there is a result, set the valid locale and actual locale, and the kind
if (U_SUCCESS(status) && result != NULL) {
U_LOCALE_BASED(locBased, *result);
locBased.setLocaleIDs(ures_getLocaleByType(b, ULOC_VALID_LOCALE, &status), actualLocale);
+ result->setBreakType(kind);
}
ures_close(b);
@@ -363,7 +364,7 @@ BreakIterator::getAvailableLocales(void)
// -------------------------------------
BreakIterator*
-BreakIterator::createInstance(const Locale& loc, UBreakIteratorType kind, UErrorCode& status)
+BreakIterator::createInstance(const Locale& loc, int32_t kind, UErrorCode& status)
{
if (U_FAILURE(status)) {
return NULL;
@@ -372,7 +373,7 @@ BreakIterator::createInstance(const Locale& loc, UBreakIteratorType kind, UError
u_init(&status);
#if !UCONFIG_NO_SERVICE
if (hasService()) {
- Locale actualLoc;
+ Locale actualLoc("");
BreakIterator *result = (BreakIterator*)gService->get(loc, kind, &actualLoc, status);
// TODO: The way the service code works in ICU 2.8 is that if
// there is a real registered break iterator, the actualLoc
@@ -410,19 +411,19 @@ BreakIterator::makeInstance(const Locale& loc, int32_t kind, UErrorCode& status)
BreakIterator *result = NULL;
switch (kind) {
case UBRK_CHARACTER:
- result = BreakIterator::buildInstance(loc, "grapheme", FALSE, status);
+ result = BreakIterator::buildInstance(loc, "grapheme", kind, status);
break;
case UBRK_WORD:
- result = BreakIterator::buildInstance(loc, "word", TRUE, status);
+ result = BreakIterator::buildInstance(loc, "word", kind, status);
break;
case UBRK_LINE:
- result = BreakIterator::buildInstance(loc, "line", TRUE, status);
+ result = BreakIterator::buildInstance(loc, "line", kind, status);
break;
case UBRK_SENTENCE:
- result = BreakIterator::buildInstance(loc, "sentence", FALSE, status);
+ result = BreakIterator::buildInstance(loc, "sentence", kind, status);
break;
case UBRK_TITLE:
- result = BreakIterator::buildInstance(loc, "title", FALSE, status);
+ result = BreakIterator::buildInstance(loc, "title", kind, status);
break;
default:
status = U_ILLEGAL_ARGUMENT_ERROR;
diff --git a/icuSources/common/caniter.cpp b/icuSources/common/caniter.cpp
index db9328c9..04d48ba8 100644
--- a/icuSources/common/caniter.cpp
+++ b/icuSources/common/caniter.cpp
@@ -1,6 +1,6 @@
/*
*****************************************************************************
- * Copyright (C) 1996-2004, International Business Machines Corporation and *
+ * Copyright (C) 1996-2006, International Business Machines Corporation and *
* others. All Rights Reserved. *
*****************************************************************************
*/
@@ -51,29 +51,7 @@ Results for: {LATIN CAPITAL LETTER A WITH RING ABOVE}{LATIN SMALL LETTER D}{COMB
*@author M. Davis
*@draft
*/
-#if 0
-static UBool PROGRESS = FALSE;
-#include
-#include "unicode/translit.h"
-
-UErrorCode status = U_ZERO_ERROR;
-
-// Just for testing - remove, not thread safe.
-static const char* UToS(const UnicodeString &source) {
- static char buffer[256];
- buffer[source.extract(0, source.length(), buffer)] = 0;
- return buffer;
-}
-
-static const UnicodeString &Tr(const UnicodeString &source) {
- static Transliterator *NAME = Transliterator::createInstance("name", UTRANS_FORWARD, status);
- static UnicodeString result;
- result = source;
- NAME->transliterate(result);
- return result;
-}
-#endif
// public
U_NAMESPACE_BEGIN
@@ -102,24 +80,26 @@ CanonicalIterator::~CanonicalIterator() {
}
void CanonicalIterator::cleanPieces() {
- int32_t i = 0;
- if(pieces != NULL) {
- for(i = 0; i < pieces_length; i++) {
- if(pieces[i] != NULL) {
- delete[] pieces[i];
- }
- }
- uprv_free(pieces);
- pieces = NULL;
+ int32_t i = 0;
+ if(pieces != NULL) {
+ for(i = 0; i < pieces_length; i++) {
+ if(pieces[i] != NULL) {
+ delete[] pieces[i];
+ }
+ }
+ uprv_free(pieces);
+ pieces = NULL;
+ pieces_length = 0;
+ }
if(pieces_lengths != NULL) {
- uprv_free(pieces_lengths);
+ uprv_free(pieces_lengths);
+ pieces_lengths = NULL;
}
- pieces_lengths = NULL;
if(current != NULL) {
- uprv_free(current);
+ uprv_free(current);
+ current = NULL;
+ current_length = 0;
}
- current = NULL;
- }
}
/**
@@ -180,6 +160,12 @@ UnicodeString CanonicalIterator::next() {
* while changing the source string, saving object creation.
*/
void CanonicalIterator::setSource(const UnicodeString &newSource, UErrorCode &status) {
+ int32_t list_length = 0;
+ UChar32 cp = 0;
+ int32_t start = 0;
+ int32_t i = 0;
+ UnicodeString *list = NULL;
+
Normalizer::normalize(newSource, UNORM_NFD, 0, source, status);
if(U_FAILURE(status)) {
return;
@@ -190,60 +176,35 @@ void CanonicalIterator::setSource(const UnicodeString &newSource, UErrorCode &st
// catch degenerate case
if (newSource.length() == 0) {
- pieces_length = 1;
pieces = (UnicodeString **)uprv_malloc(sizeof(UnicodeString *));
- /* test for NULL */
- if (pieces == NULL) {
- status = U_MEMORY_ALLOCATION_ERROR;
- return;
- }
- current_length = 1;
+ pieces_lengths = (int32_t*)uprv_malloc(1 * sizeof(int32_t));
+ pieces_length = 1;
current = (int32_t*)uprv_malloc(1 * sizeof(int32_t));
- /* test for NULL */
- if (current == NULL) {
+ current_length = 1;
+ if (pieces == NULL || pieces_lengths == NULL || current == NULL) {
status = U_MEMORY_ALLOCATION_ERROR;
- uprv_free(pieces);
- pieces = NULL;
- return;
+ goto CleanPartialInitialization;
}
current[0] = 0;
pieces[0] = new UnicodeString[1];
- /* test for NULL */
+ pieces_lengths[0] = 1;
if (pieces[0] == 0) {
status = U_MEMORY_ALLOCATION_ERROR;
- uprv_free(pieces);
- pieces = NULL;
- uprv_free(current);
- return;
+ goto CleanPartialInitialization;
}
- pieces[0][0] = UnicodeString();
- pieces_lengths = (int32_t*)uprv_malloc(1 * sizeof(int32_t));
- /* test for NULL */
- if (pieces_lengths == 0) {
- status = U_MEMORY_ALLOCATION_ERROR;
- uprv_free(pieces);
- pieces = NULL;
- uprv_free(current);
- return;
- }
- pieces_lengths[0] = 1;
return;
}
- UnicodeString *list = new UnicodeString[source.length()];
- /* test for NULL */
+ list = new UnicodeString[source.length()];
if (list == 0) {
status = U_MEMORY_ALLOCATION_ERROR;
- return;
+ goto CleanPartialInitialization;
}
- int32_t list_length = 0;
- UChar32 cp = 0;
- int32_t start = 0;
// i should initialy be the number of code units at the
// start of the string
- int32_t i = UTF16_CHAR_LENGTH(source.char32At(0));
+ i = UTF16_CHAR_LENGTH(source.char32At(0));
//int32_t i = 1;
// find the segments
// This code iterates through the source string and
@@ -262,36 +223,17 @@ void CanonicalIterator::setSource(const UnicodeString &newSource, UErrorCode &st
// allocate the arrays, and find the strings that are CE to each segment
pieces = (UnicodeString **)uprv_malloc(list_length * sizeof(UnicodeString *));
- /* test for NULL */
- if (pieces == NULL) {
- status = U_MEMORY_ALLOCATION_ERROR;
- delete[] list;
- return;
- }
pieces_length = list_length;
pieces_lengths = (int32_t*)uprv_malloc(list_length * sizeof(int32_t));
- /* test for NULL */
- if (pieces_lengths == 0) {
- status = U_MEMORY_ALLOCATION_ERROR;
- delete[] list;
- uprv_free(pieces);
- pieces = NULL;
- return;
- }
-
- current_length = list_length;
current = (int32_t*)uprv_malloc(list_length * sizeof(int32_t));
- /* test for NULL */
- if (current == 0) {
+ current_length = list_length;
+ if (pieces == NULL || pieces_lengths == NULL || current == NULL) {
status = U_MEMORY_ALLOCATION_ERROR;
- delete[] list;
- uprv_free(pieces);
- pieces = NULL;
- uprv_free(pieces_lengths);
- return;
+ goto CleanPartialInitialization;
}
+
for (i = 0; i < current_length; i++) {
- current[i] = 0;
+ current[i] = 0;
}
// for each segment, get all the combinations that can produce
// it after NFD normalization
@@ -301,6 +243,13 @@ void CanonicalIterator::setSource(const UnicodeString &newSource, UErrorCode &st
}
delete[] list;
+ return;
+// Common section to cleanup all local variables and reset object variables.
+CleanPartialInitialization:
+ if (list != NULL) {
+ delete[] list;
+ }
+ cleanPieces();
}
/**
@@ -311,7 +260,7 @@ void CanonicalIterator::setSource(const UnicodeString &newSource, UErrorCode &st
*/
void U_EXPORT2 CanonicalIterator::permute(UnicodeString &source, UBool skipZeros, Hashtable *result, UErrorCode &status) {
if(U_FAILURE(status)) {
- return;
+ return;
}
//if (PROGRESS) printf("Permute: %s\n", UToS(Tr(source)));
int32_t i = 0;
@@ -320,27 +269,23 @@ void U_EXPORT2 CanonicalIterator::permute(UnicodeString &source, UBool skipZeros
// if zero or one character, just return a set with it
// we check for length < 2 to keep from counting code points all the time
if (source.length() <= 2 && source.countChar32() <= 1) {
- UnicodeString *toPut = new UnicodeString(source);
- /* test for NULL */
- if (toPut == 0) {
- status = U_MEMORY_ALLOCATION_ERROR;
- return;
- }
- result->put(source, toPut, status);
- return;
+ UnicodeString *toPut = new UnicodeString(source);
+ /* test for NULL */
+ if (toPut == 0) {
+ status = U_MEMORY_ALLOCATION_ERROR;
+ return;
+ }
+ result->put(source, toPut, status);
+ return;
}
// otherwise iterate through the string, and recursively permute all the other characters
UChar32 cp;
- Hashtable *subpermute = new Hashtable(status);
- /* test for NULL */
- if (subpermute == 0) {
- status = U_MEMORY_ALLOCATION_ERROR;
+ Hashtable subpermute(status);
+ if(U_FAILURE(status)) {
return;
}
- if (U_SUCCESS(status)) {
- subpermute->setValueDeleter(uhash_deleteUnicodeString);
- }
+ subpermute.setValueDeleter(uhash_deleteUnicodeString);
for (i = 0; i < source.length(); i += UTF16_CHAR_LENGTH(cp)) {
cp = source.char32At(i);
@@ -356,37 +301,34 @@ void U_EXPORT2 CanonicalIterator::permute(UnicodeString &source, UBool skipZeros
continue;
}
- subpermute->removeAll();
+ subpermute.removeAll();
// see what the permutations of the characters before and after this one are
//Hashtable *subpermute = permute(source.substring(0,i) + source.substring(i + UTF16.getCharCount(cp)));
- permute(subPermuteString.replace(i, UTF16_CHAR_LENGTH(cp), NULL, 0), skipZeros, subpermute, status);
+ permute(subPermuteString.replace(i, UTF16_CHAR_LENGTH(cp), NULL, 0), skipZeros, &subpermute, status);
/* Test for buffer overflows */
if(U_FAILURE(status)) {
- delete subpermute;
return;
}
// The upper replace is destructive. The question is do we have to make a copy, or we don't care about the contents
// of source at this point.
// prefix this character to all of them
- ne = subpermute->nextElement(el);
+ ne = subpermute.nextElement(el);
while (ne != NULL) {
- UnicodeString *permRes = (UnicodeString *)(ne->value.pointer);
- UnicodeString *chStr = new UnicodeString(cp);
- //test for NULL
- if (chStr == NULL) {
- status = U_MEMORY_ALLOCATION_ERROR;
- delete subpermute;
- return;
- }
+ UnicodeString *permRes = (UnicodeString *)(ne->value.pointer);
+ UnicodeString *chStr = new UnicodeString(cp);
+ //test for NULL
+ if (chStr == NULL) {
+ status = U_MEMORY_ALLOCATION_ERROR;
+ return;
+ }
chStr->append(*permRes); //*((UnicodeString *)(ne->value.pointer));
//if (PROGRESS) printf(" Piece: %s\n", UToS(*chStr));
result->put(*chStr, chStr, status);
- ne = subpermute->nextElement(el);
+ ne = subpermute.nextElement(el);
}
}
- delete subpermute;
//return result;
}
@@ -394,53 +336,39 @@ void U_EXPORT2 CanonicalIterator::permute(UnicodeString &source, UBool skipZeros
// we have a segment, in NFD. Find all the strings that are canonically equivalent to it.
UnicodeString* CanonicalIterator::getEquivalents(const UnicodeString &segment, int32_t &result_len, UErrorCode &status) {
- //private String[] getEquivalents(String segment)
-
- Hashtable *result = new Hashtable(status);
- /* test for NULL */
- if (result == 0) {
- status = U_MEMORY_ALLOCATION_ERROR;
+ Hashtable result(status);
+ Hashtable permutations(status);
+ Hashtable basic(status);
+ if (U_FAILURE(status)) {
return 0;
}
- if (U_SUCCESS(status)) {
- result->setValueDeleter(uhash_deleteUnicodeString);
- }
+ result.setValueDeleter(uhash_deleteUnicodeString);
+ permutations.setValueDeleter(uhash_deleteUnicodeString);
+ basic.setValueDeleter(uhash_deleteUnicodeString);
+
UChar USeg[256];
int32_t segLen = segment.extract(USeg, 256, status);
- Hashtable *basic = getEquivalents2(USeg, segLen, status);
- //Hashtable *basic = getEquivalents2(segment, segLen, status);
+ getEquivalents2(&basic, USeg, segLen, status);
// now get all the permutations
// add only the ones that are canonically equivalent
// TODO: optimize by not permuting any class zero.
- Hashtable *permutations = new Hashtable(status);
- /* test for NULL */
- if (permutations == 0) {
- status = U_MEMORY_ALLOCATION_ERROR;
- delete result;
- delete basic;
- return 0;
- }
- if (U_SUCCESS(status)) {
- permutations->setValueDeleter(uhash_deleteUnicodeString);
- }
-
const UHashElement *ne = NULL;
int32_t el = -1;
//Iterator it = basic.iterator();
- ne = basic->nextElement(el);
+ ne = basic.nextElement(el);
//while (it.hasNext())
while (ne != NULL) {
//String item = (String) it.next();
UnicodeString item = *((UnicodeString *)(ne->value.pointer));
- permutations->removeAll();
- permute(item, CANITER_SKIP_ZEROES, permutations, status);
+ permutations.removeAll();
+ permute(item, CANITER_SKIP_ZEROES, &permutations, status);
const UHashElement *ne2 = NULL;
int32_t el2 = -1;
//Iterator it2 = permutations.iterator();
- ne2 = permutations->nextElement(el2);
+ ne2 = permutations.nextElement(el2);
//while (it2.hasNext())
while (ne2 != NULL) {
//String possible = (String) it2.next();
@@ -453,77 +381,59 @@ UnicodeString* CanonicalIterator::getEquivalents(const UnicodeString &segment, i
if (attempt==segment) {
//if (PROGRESS) printf("Adding Permutation: %s\n", UToS(Tr(*possible)));
// TODO: use the hashtable just to catch duplicates - store strings directly (somehow).
- result->put(possible, new UnicodeString(possible), status); //add(possible);
+ result.put(possible, new UnicodeString(possible), status); //add(possible);
} else {
//if (PROGRESS) printf("-Skipping Permutation: %s\n", UToS(Tr(*possible)));
}
- ne2 = permutations->nextElement(el2);
+ ne2 = permutations.nextElement(el2);
}
- ne = basic->nextElement(el);
+ ne = basic.nextElement(el);
}
/* Test for buffer overflows */
if(U_FAILURE(status)) {
- delete result;
- delete permutations;
- delete basic;
return 0;
}
// convert into a String[] to clean up storage
//String[] finalResult = new String[result.size()];
UnicodeString *finalResult = NULL;
int32_t resultCount;
- if((resultCount = result->count())) {
- finalResult = new UnicodeString[resultCount];
- } else {
- status = U_ILLEGAL_ARGUMENT_ERROR;
- }
- /* test for NULL */
- if (finalResult == 0) {
- if(U_SUCCESS(status)) {
- status = U_MEMORY_ALLOCATION_ERROR;
- }
- delete result;
- delete permutations;
- delete basic;
- return 0;
+ if((resultCount = result.count())) {
+ finalResult = new UnicodeString[resultCount];
+ if (finalResult == 0) {
+ status = U_MEMORY_ALLOCATION_ERROR;
+ return NULL;
+ }
+ }
+ else {
+ status = U_ILLEGAL_ARGUMENT_ERROR;
+ return NULL;
}
//result.toArray(finalResult);
result_len = 0;
el = -1;
- ne = result->nextElement(el);
+ ne = result.nextElement(el);
while(ne != NULL) {
- UnicodeString finResult = *((UnicodeString *)(ne->value.pointer));
- finalResult[result_len++] = finResult;
- ne = result->nextElement(el);
+ finalResult[result_len++] = *((UnicodeString *)(ne->value.pointer));
+ ne = result.nextElement(el);
}
- delete permutations;
- delete basic;
- delete result;
return finalResult;
}
-Hashtable *CanonicalIterator::getEquivalents2(const UChar *segment, int32_t segLen, UErrorCode &status) {
-//Hashtable *CanonicalIterator::getEquivalents2(const UnicodeString &segment, int32_t segLen, UErrorCode &status) {
+Hashtable *CanonicalIterator::getEquivalents2(Hashtable *fillinResult, const UChar *segment, int32_t segLen, UErrorCode &status) {
- Hashtable *result = new Hashtable(status);
- /* test for NULL */
- if (result == 0) {
- status = U_MEMORY_ALLOCATION_ERROR;
- return 0;
- }
- if (U_SUCCESS(status)) {
- result->setValueDeleter(uhash_deleteUnicodeString);
+ if (U_FAILURE(status)) {
+ return NULL;
}
//if (PROGRESS) printf("Adding: %s\n", UToS(Tr(segment)));
UnicodeString toPut(segment, segLen);
- result->put(toPut, new UnicodeString(toPut), status);
+ fillinResult->put(toPut, new UnicodeString(toPut), status);
USerializedSet starts;
@@ -534,48 +444,45 @@ Hashtable *CanonicalIterator::getEquivalents2(const UChar *segment, int32_t segL
// see if any character is at the start of some decomposition
UTF_GET_CHAR(segment, 0, i, segLen, cp);
if (!unorm_getCanonStartSet(cp, &starts)) {
- continue;
+ continue;
}
// if so, see which decompositions match
for(j = 0, cp = end+1; cp <= end || uset_getSerializedRange(&starts, j++, &cp, &end); ++cp) {
- //Hashtable *remainder = extract(cp, segment, segLen, i, status);
- Hashtable *remainder = extract(cp, segment, segLen, i, status);
- if (remainder == NULL) continue;
+ Hashtable remainder(status);
+ remainder.setValueDeleter(uhash_deleteUnicodeString);
+ if (extract(&remainder, cp, segment, segLen, i, status) == NULL) {
+ continue;
+ }
// there were some matches, so add all the possibilities to the set.
UnicodeString prefix(segment, i);
prefix += cp;
- const UHashElement *ne = NULL;
int32_t el = -1;
- ne = remainder->nextElement(el);
+ const UHashElement *ne = remainder.nextElement(el);
while (ne != NULL) {
UnicodeString item = *((UnicodeString *)(ne->value.pointer));
UnicodeString *toAdd = new UnicodeString(prefix);
/* test for NULL */
if (toAdd == 0) {
status = U_MEMORY_ALLOCATION_ERROR;
- delete result;
- delete remainder;
- return 0;
+ return NULL;
}
*toAdd += item;
- result->put(*toAdd, toAdd, status);
+ fillinResult->put(*toAdd, toAdd, status);
//if (PROGRESS) printf("Adding: %s\n", UToS(Tr(*toAdd)));
- ne = remainder->nextElement(el);
+ ne = remainder.nextElement(el);
}
-
- delete remainder;
}
}
/* Test for buffer overflows */
if(U_FAILURE(status)) {
- return 0;
+ return NULL;
}
- return result;
+ return fillinResult;
}
/**
@@ -583,11 +490,15 @@ Hashtable *CanonicalIterator::getEquivalents2(const UChar *segment, int32_t segL
* (with canonical rearrangment!)
* If so, take the remainder, and return the equivalents
*/
-Hashtable *CanonicalIterator::extract(UChar32 comp, const UChar *segment, int32_t segLen, int32_t segmentPos, UErrorCode &status) {
+Hashtable *CanonicalIterator::extract(Hashtable *fillinResult, UChar32 comp, const UChar *segment, int32_t segLen, int32_t segmentPos, UErrorCode &status) {
//Hashtable *CanonicalIterator::extract(UChar32 comp, const UnicodeString &segment, int32_t segLen, int32_t segmentPos, UErrorCode &status) {
//if (PROGRESS) printf(" extract: %s, ", UToS(Tr(UnicodeString(comp))));
//if (PROGRESS) printf("%s, %i\n", UToS(Tr(segment)), segmentPos);
+ if (U_FAILURE(status)) {
+ return NULL;
+ }
+
const int32_t bufSize = 256;
int32_t bufLen = 0;
UChar temp[bufSize];
@@ -622,7 +533,7 @@ Hashtable *CanonicalIterator::extract(UChar32 comp, const UChar *segment, int32_
i = segmentPos;
while(i < segLen) {
- UTF_NEXT_CHAR(segment, i, segLen, cp);
+ UTF_NEXT_CHAR(segment, i, segLen, cp);
if (cp == decompCp) { // if equal, eat another cp from decomp
@@ -669,20 +580,14 @@ Hashtable *CanonicalIterator::extract(UChar32 comp, const UChar *segment, int32_
*/
}
}
- if (!ok) return NULL; // we failed, characters left over
+ if (!ok)
+ return NULL; // we failed, characters left over
//if (PROGRESS) printf("Matches\n");
if (bufLen == 0) {
- Hashtable *result = new Hashtable(status);
- /* test for NULL */
- if (result == 0) {
- status = U_MEMORY_ALLOCATION_ERROR;
- return 0;
- }
- result->setValueDeleter(uhash_deleteUnicodeString);
- result->put(UnicodeString(), new UnicodeString(), status);
- return result; // succeed, but no remainder
+ fillinResult->put(UnicodeString(), new UnicodeString(), status);
+ return fillinResult; // succeed, but no remainder
}
// brute force approach
@@ -692,16 +597,13 @@ Hashtable *CanonicalIterator::extract(UChar32 comp, const UChar *segment, int32_
UChar trial[bufSize];
unorm_decompose(trial, bufSize, temp, tempLen, FALSE, 0, &status);
- /* Test for buffer overflows */
- if(U_FAILURE(status)) {
- return 0;
- }
-
- if(uprv_memcmp(segment+segmentPos, trial, (segLen - segmentPos)*sizeof(UChar)) != 0) {
- return NULL;
+ if(U_FAILURE(status)
+ || uprv_memcmp(segment+segmentPos, trial, (segLen - segmentPos)*sizeof(UChar)) != 0)
+ {
+ return NULL;
}
- return getEquivalents2(buff, bufLen, status);
+ return getEquivalents2(fillinResult, buff, bufLen, status);
}
U_NAMESPACE_END
diff --git a/icuSources/common/charstr.h b/icuSources/common/charstr.h
index 3f4302a1..3bb11cba 100644
--- a/icuSources/common/charstr.h
+++ b/icuSources/common/charstr.h
@@ -34,7 +34,7 @@ public:
// @param str The unicode string to be converted to char *
// @param codepage The char * code page. "" for invariant conversion.
// NULL for default code page.
- inline CharString(const UnicodeString& str, const char *codepage);
+// inline CharString(const UnicodeString& str, const char *codepage);
#endif
inline CharString(const UnicodeString& str);
@@ -51,6 +51,9 @@ private:
#if !UCONFIG_NO_CONVERSION
+// PLEASE DON'T USE THIS FUNCTION.
+// We don't want the static dependency on conversion or the performance hit that comes from a codepage conversion.
+/*
inline CharString::CharString(const UnicodeString& str, const char *codepage) {
int32_t len;
ptr = buf;
@@ -59,7 +62,7 @@ inline CharString::CharString(const UnicodeString& str, const char *codepage) {
ptr = (char *)uprv_malloc(len+1);
str.extract(0, 0x7FFFFFFF, ptr, len+1, codepage);
}
-}
+}*/
#endif
diff --git a/icuSources/common/cmemory.c b/icuSources/common/cmemory.c
index 45902dc9..0f93f36a 100644
--- a/icuSources/common/cmemory.c
+++ b/icuSources/common/cmemory.c
@@ -18,8 +18,9 @@
*
******************************************************************************
*/
-#include "cmemory.h"
#include "unicode/uclean.h"
+#include "cmemory.h"
+#include
/* uprv_malloc(0) returns a pointer to this read-only data. */
static const int32_t zeroMem[] = {0, 0, 0, 0, 0, 0};
diff --git a/icuSources/common/cmemory.h b/icuSources/common/cmemory.h
index ffcfa2db..da65d7ce 100644
--- a/icuSources/common/cmemory.h
+++ b/icuSources/common/cmemory.h
@@ -25,7 +25,6 @@
#define CMEMORY_H
#include "unicode/utypes.h"
-#include
#include
diff --git a/icuSources/common/common.dsp b/icuSources/common/common.dsp
deleted file mode 100644
index eeabc7f2..00000000
--- a/icuSources/common/common.dsp
+++ /dev/null
@@ -1,3787 +0,0 @@
-# Microsoft Developer Studio Project File - Name="common" - Package Owner=<4>
-# Microsoft Developer Studio Generated Build File, Format Version 6.00
-# ** DO NOT EDIT **
-
-# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102
-
-CFG=common - Win32 Debug
-!MESSAGE This is not a valid makefile. To build this project using NMAKE,
-!MESSAGE use the Export Makefile command and run
-!MESSAGE
-!MESSAGE NMAKE /f "common.mak".
-!MESSAGE
-!MESSAGE You can specify a configuration when running NMAKE
-!MESSAGE by defining the macro CFG on the command line. For example:
-!MESSAGE
-!MESSAGE NMAKE /f "common.mak" CFG="common - Win32 Debug"
-!MESSAGE
-!MESSAGE Possible choices for configuration are:
-!MESSAGE
-!MESSAGE "common - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library")
-!MESSAGE "common - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library")
-!MESSAGE "common - Win64 Release" (based on "Win32 (x86) Dynamic-Link Library")
-!MESSAGE "common - Win64 Debug" (based on "Win32 (x86) Dynamic-Link Library")
-!MESSAGE
-
-# Begin Project
-# PROP AllowPerConfigDependencies 0
-# PROP Scc_ProjName ""
-# PROP Scc_LocalPath ""
-CPP=cl.exe
-MTL=midl.exe
-RSC=rc.exe
-
-!IF "$(CFG)" == "common - Win32 Release"
-
-# PROP BASE Use_MFC 0
-# PROP BASE Use_Debug_Libraries 0
-# PROP BASE Output_Dir "Release"
-# PROP BASE Intermediate_Dir "Release"
-# PROP BASE Target_Dir ""
-# PROP Use_MFC 0
-# PROP Use_Debug_Libraries 0
-# PROP Output_Dir "..\..\lib\"
-# PROP Intermediate_Dir "Release"
-# PROP Ignore_Export_Lib 0
-# PROP Target_Dir ""
-# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "COMMON_EXPORTS" /FD /c
-# ADD CPP /nologo /G6 /MD /Za /W3 /GX /Zi /O2 /Ob2 /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "COMMON_EXPORTS" /D "U_COMMON_IMPLEMENTATION" /D "UDATA_STATIC_LIB" /FR /FD /GF /c
-# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32
-# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32
-# ADD BASE RSC /l 0x409 /d "NDEBUG"
-# ADD RSC /l 0x409 /d "NDEBUG"
-BSC32=bscmake.exe
-# ADD BASE BSC32 /nologo
-# ADD BSC32 /nologo
-LINK32=link.exe
-# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386
-# ADD LINK32 icudt.lib kernel32.lib user32.lib advapi32.lib shell32.lib /nologo /base:"0x4a800000" /dll /machine:I386 /out:"..\..\bin\icuuc32.dll" /implib:"..\..\lib\icuuc.lib" /libpath:"..\..\lib"
-# SUBTRACT LINK32 /pdb:none /debug
-
-!ELSEIF "$(CFG)" == "common - Win32 Debug"
-
-# PROP BASE Use_MFC 0
-# PROP BASE Use_Debug_Libraries 1
-# PROP BASE Output_Dir "Debug"
-# PROP BASE Intermediate_Dir "Debug"
-# PROP BASE Target_Dir ""
-# PROP Use_MFC 0
-# PROP Use_Debug_Libraries 1
-# PROP Output_Dir "..\..\lib\"
-# PROP Intermediate_Dir "Debug"
-# PROP Ignore_Export_Lib 0
-# PROP Target_Dir ""
-# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "COMMON_EXPORTS" /FD /GZ /c
-# ADD CPP /nologo /G6 /MDd /Za /W3 /Gm /GX /ZI /Od /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "COMMON_EXPORTS" /D "U_COMMON_IMPLEMENTATION" /D "UDATA_STATIC_LIB" /D "RBBI_DEBUG" /FR /FD /GF /GZ /c
-# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32
-# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32
-# ADD BASE RSC /l 0x409 /d "_DEBUG"
-# ADD RSC /l 0x409 /d "_DEBUG"
-BSC32=bscmake.exe
-# ADD BASE BSC32 /nologo
-# ADD BSC32 /nologo
-LINK32=link.exe
-# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept
-# ADD LINK32 icudt.lib kernel32.lib user32.lib advapi32.lib shell32.lib /nologo /base:"0x4a800000" /dll /debug /machine:I386 /out:"..\..\bin\icuuc32d.dll" /implib:"..\..\lib\icuucd.lib" /pdbtype:sept /libpath:"..\..\lib"
-# SUBTRACT LINK32 /pdb:none
-
-!ELSEIF "$(CFG)" == "common - Win64 Release"
-
-# PROP BASE Use_MFC 0
-# PROP BASE Use_Debug_Libraries 0
-# PROP BASE Output_Dir "Release"
-# PROP BASE Intermediate_Dir "Release"
-# PROP BASE Target_Dir ""
-# PROP Use_MFC 0
-# PROP Use_Debug_Libraries 0
-# PROP Output_Dir "..\..\lib\"
-# PROP Intermediate_Dir "Release"
-# PROP Ignore_Export_Lib 0
-# PROP Target_Dir ""
-# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN64" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "COMMON_EXPORTS" /FD /c
-# ADD CPP /nologo /MD /Za /W3 /GX /Zi /O2 /Ob2 /D "NDEBUG" /D "WIN64" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "COMMON_EXPORTS" /D "U_COMMON_IMPLEMENTATION" /D "UDATA_STATIC_LIB" /D "_IA64_" /D "WIN32" /D "_AFX_NO_DAO_SUPPORT" /FD /GF /Zm600 /c
-# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win64
-# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win64
-# ADD BASE RSC /l 0x409 /d "NDEBUG"
-# ADD RSC /l 0x409 /d "NDEBUG"
-BSC32=bscmake.exe
-# ADD BASE BSC32 /nologo
-# ADD BSC32 /nologo
-LINK32=link.exe
-# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:IX86 /machine:IA64
-# ADD LINK32 icudt.lib kernel32.lib user32.lib advapi32.lib shell32.lib /nologo /base:"0x4a800000" /dll /machine:IX86 /out:"..\..\bin\icuuc32.dll" /implib:"..\..\lib\icuuc.lib" /libpath:"..\..\lib" /machine:IA64
-# SUBTRACT LINK32 /debug
-
-!ELSEIF "$(CFG)" == "common - Win64 Debug"
-
-# PROP BASE Use_MFC 0
-# PROP BASE Use_Debug_Libraries 1
-# PROP BASE Output_Dir "Debug"
-# PROP BASE Intermediate_Dir "Debug"
-# PROP BASE Target_Dir ""
-# PROP Use_MFC 0
-# PROP Use_Debug_Libraries 1
-# PROP Output_Dir "..\..\lib\"
-# PROP Intermediate_Dir "Debug"
-# PROP Ignore_Export_Lib 0
-# PROP Target_Dir ""
-# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN64" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "COMMON_EXPORTS" /FD /GZ /c
-# ADD CPP /nologo /MDd /Za /W3 /Gm /GX /Zi /Od /D "_DEBUG" /D "WIN64" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "COMMON_EXPORTS" /D "U_COMMON_IMPLEMENTATION" /D "UDATA_STATIC_LIB" /D "_IA64_" /D "WIN32" /D "_AFX_NO_DAO_SUPPORT" /FR /FD /GF /GZ /Zm600 /c
-# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win64
-# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win64
-# ADD BASE RSC /l 0x409 /d "_DEBUG"
-# ADD RSC /l 0x409 /d "_DEBUG"
-BSC32=bscmake.exe
-# ADD BASE BSC32 /nologo
-# ADD BSC32 /nologo
-LINK32=link.exe
-# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:IX86 /pdbtype:sept /machine:IA64
-# ADD LINK32 icudt.lib kernel32.lib user32.lib advapi32.lib shell32.lib /nologo /base:"0x4a800000" /dll /incremental:no /debug /machine:IX86 /out:"..\..\bin\icuuc32d.dll" /implib:"..\..\lib\icuucd.lib" /pdbtype:sept /libpath:"..\..\lib" /machine:IA64
-
-!ENDIF
-
-# Begin Target
-
-# Name "common - Win32 Release"
-# Name "common - Win32 Debug"
-# Name "common - Win64 Release"
-# Name "common - Win64 Debug"
-# Begin Group "bidi"
-
-# PROP Default_Filter ""
-# Begin Source File
-
-SOURCE=.\ubidi.c
-# End Source File
-# Begin Source File
-
-SOURCE=.\unicode\ubidi.h
-
-!IF "$(CFG)" == "common - Win32 Release"
-
-# Begin Custom Build
-InputPath=.\unicode\ubidi.h
-
-"..\..\include\unicode\ubidi.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ELSEIF "$(CFG)" == "common - Win32 Debug"
-
-# Begin Custom Build
-InputPath=.\unicode\ubidi.h
-
-"..\..\include\unicode\ubidi.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ELSEIF "$(CFG)" == "common - Win64 Release"
-
-# Begin Custom Build
-InputPath=.\unicode\ubidi.h
-
-"..\..\include\unicode\ubidi.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ELSEIF "$(CFG)" == "common - Win64 Debug"
-
-# Begin Custom Build
-InputPath=.\unicode\ubidi.h
-
-"..\..\include\unicode\ubidi.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ENDIF
-
-# End Source File
-# Begin Source File
-
-SOURCE=.\ubidiimp.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\ubidiln.c
-# End Source File
-# Begin Source File
-
-SOURCE=.\ubidiwrt.c
-# End Source File
-# Begin Source File
-
-SOURCE=.\ushape.c
-# End Source File
-# Begin Source File
-
-SOURCE=.\unicode\ushape.h
-
-!IF "$(CFG)" == "common - Win32 Release"
-
-# Begin Custom Build
-InputPath=.\unicode\ushape.h
-
-"..\..\include\unicode\ushape.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ELSEIF "$(CFG)" == "common - Win32 Debug"
-
-# Begin Custom Build
-InputPath=.\unicode\ushape.h
-
-"..\..\include\unicode\ushape.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ELSEIF "$(CFG)" == "common - Win64 Release"
-
-# Begin Custom Build
-InputPath=.\unicode\ushape.h
-
-"..\..\include\unicode\ushape.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ELSEIF "$(CFG)" == "common - Win64 Debug"
-
-# Begin Custom Build
-InputPath=.\unicode\ushape.h
-
-"..\..\include\unicode\ushape.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ENDIF
-
-# End Source File
-# End Group
-# Begin Group "break iteration"
-
-# PROP Default_Filter ""
-# Begin Source File
-
-SOURCE=.\brkdict.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=.\brkdict.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\brkiter.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=.\unicode\brkiter.h
-
-!IF "$(CFG)" == "common - Win32 Release"
-
-# Begin Custom Build
-InputPath=.\unicode\brkiter.h
-
-"..\..\include\unicode\brkiter.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ELSEIF "$(CFG)" == "common - Win32 Debug"
-
-# Begin Custom Build
-InputPath=.\unicode\brkiter.h
-
-"..\..\include\unicode\brkiter.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ELSEIF "$(CFG)" == "common - Win64 Release"
-
-# Begin Custom Build
-InputPath=.\unicode\brkiter.h
-
-"..\..\include\unicode\brkiter.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ELSEIF "$(CFG)" == "common - Win64 Debug"
-
-# Begin Custom Build
-InputPath=.\unicode\brkiter.h
-
-"..\..\include\unicode\brkiter.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ENDIF
-
-# End Source File
-# Begin Source File
-
-SOURCE=.\dbbi.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=.\unicode\dbbi.h
-
-!IF "$(CFG)" == "common - Win32 Release"
-
-# Begin Custom Build
-InputPath=.\unicode\dbbi.h
-
-"..\..\include\unicode\dbbi.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ELSEIF "$(CFG)" == "common - Win32 Debug"
-
-# Begin Custom Build
-InputPath=.\unicode\dbbi.h
-
-"..\..\include\unicode\dbbi.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ELSEIF "$(CFG)" == "common - Win64 Release"
-
-# Begin Custom Build
-InputPath=.\unicode\dbbi.h
-
-"..\..\include\unicode\dbbi.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ELSEIF "$(CFG)" == "common - Win64 Debug"
-
-# Begin Custom Build
-InputPath=.\unicode\dbbi.h
-
-"..\..\include\unicode\dbbi.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ENDIF
-
-# End Source File
-# Begin Source File
-
-SOURCE=.\dbbi_tbl.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=.\dbbi_tbl.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\rbbi.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=.\unicode\rbbi.h
-
-!IF "$(CFG)" == "common - Win32 Release"
-
-# Begin Custom Build
-InputPath=.\unicode\rbbi.h
-
-"..\..\include\unicode\rbbi.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ELSEIF "$(CFG)" == "common - Win32 Debug"
-
-# Begin Custom Build
-InputPath=.\unicode\rbbi.h
-
-"..\..\include\unicode\rbbi.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ELSEIF "$(CFG)" == "common - Win64 Release"
-
-# Begin Custom Build
-InputPath=.\unicode\rbbi.h
-
-"..\..\include\unicode\rbbi.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ELSEIF "$(CFG)" == "common - Win64 Debug"
-
-# Begin Custom Build
-InputPath=.\unicode\rbbi.h
-
-"..\..\include\unicode\rbbi.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ENDIF
-
-# End Source File
-# Begin Source File
-
-SOURCE=.\rbbidata.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=.\rbbidata.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\rbbinode.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=.\rbbinode.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\rbbirb.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=.\rbbirb.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\rbbirpt.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\rbbiscan.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=.\rbbiscan.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\rbbisetb.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=.\rbbisetb.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\rbbistbl.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=.\rbbitblb.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=.\rbbitblb.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\ubrk.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=.\unicode\ubrk.h
-
-!IF "$(CFG)" == "common - Win32 Release"
-
-# Begin Custom Build
-InputPath=.\unicode\ubrk.h
-
-"..\..\include\unicode\ubrk.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ELSEIF "$(CFG)" == "common - Win32 Debug"
-
-# Begin Custom Build
-InputPath=.\unicode\ubrk.h
-
-"..\..\include\unicode\ubrk.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ELSEIF "$(CFG)" == "common - Win64 Release"
-
-# Begin Custom Build
-InputPath=.\unicode\ubrk.h
-
-"..\..\include\unicode\ubrk.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ELSEIF "$(CFG)" == "common - Win64 Debug"
-
-# Begin Custom Build
-InputPath=.\unicode\ubrk.h
-
-"..\..\include\unicode\ubrk.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ENDIF
-
-# End Source File
-# End Group
-# Begin Group "collation"
-
-# PROP Default_Filter ""
-# Begin Source File
-
-SOURCE=.\ucol_swp.c
-# ADD CPP /I "..\i18n"
-# End Source File
-# Begin Source File
-
-SOURCE=.\ucol_swp.h
-# End Source File
-# End Group
-# Begin Group "collections"
-
-# PROP Default_Filter ""
-# Begin Source File
-
-SOURCE=.\hash.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\unicode\strenum.h
-
-!IF "$(CFG)" == "common - Win32 Release"
-
-# Begin Custom Build
-InputPath=.\unicode\strenum.h
-
-"..\..\include\unicode\strenum.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ELSEIF "$(CFG)" == "common - Win32 Debug"
-
-# Begin Custom Build
-InputPath=.\unicode\strenum.h
-
-"..\..\include\unicode\strenum.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ELSEIF "$(CFG)" == "common - Win64 Release"
-
-# Begin Custom Build
-InputPath=.\unicode\strenum.h
-
-"..\..\include\unicode\strenum.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ELSEIF "$(CFG)" == "common - Win64 Debug"
-
-# Begin Custom Build
-InputPath=.\unicode\strenum.h
-
-"..\..\include\unicode\strenum.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ENDIF
-
-# End Source File
-# Begin Source File
-
-SOURCE=.\uarrsort.c
-# End Source File
-# Begin Source File
-
-SOURCE=.\uarrsort.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\ucmp8.c
-# End Source File
-# Begin Source File
-
-SOURCE=.\ucmp8.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\uenum.c
-# End Source File
-# Begin Source File
-
-SOURCE=.\unicode\uenum.h
-
-!IF "$(CFG)" == "common - Win32 Release"
-
-# Begin Custom Build
-InputPath=.\unicode\uenum.h
-
-"..\..\include\unicode\uenum.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ELSEIF "$(CFG)" == "common - Win32 Debug"
-
-# Begin Custom Build
-InputPath=.\unicode\uenum.h
-
-"..\..\include\unicode\uenum.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ELSEIF "$(CFG)" == "common - Win64 Release"
-
-# Begin Custom Build
-InputPath=.\unicode\uenum.h
-
-"..\..\include\unicode\uenum.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ELSEIF "$(CFG)" == "common - Win64 Debug"
-
-# Begin Custom Build
-InputPath=.\unicode\uenum.h
-
-"..\..\include\unicode\uenum.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ENDIF
-
-# End Source File
-# Begin Source File
-
-SOURCE=.\uenumimp.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\uhash.c
-# End Source File
-# Begin Source File
-
-SOURCE=.\uhash.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\uhash_us.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=.\ustack.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=.\ustrenum.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=.\ustrenum.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\utrie.c
-# End Source File
-# Begin Source File
-
-SOURCE=.\utrie.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\uvector.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=.\uvector.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\uvectr32.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=.\uvectr32.h
-# End Source File
-# End Group
-# Begin Group "configuration"
-
-# PROP Default_Filter ""
-# Begin Source File
-
-SOURCE=.\common.rc
-# End Source File
-# Begin Source File
-
-SOURCE=.\cpputils.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\filestrm.c
-# End Source File
-# Begin Source File
-
-SOURCE=.\filestrm.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\locmap.c
-# End Source File
-# Begin Source File
-
-SOURCE=.\locmap.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\mutex.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\putil.c
-# ADD CPP /Ze
-# End Source File
-# Begin Source File
-
-SOURCE=.\unicode\putil.h
-
-!IF "$(CFG)" == "common - Win32 Release"
-
-# Begin Custom Build
-InputPath=.\unicode\putil.h
-
-"..\..\include\unicode\putil.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ELSEIF "$(CFG)" == "common - Win32 Debug"
-
-# Begin Custom Build
-InputPath=.\unicode\putil.h
-
-"..\..\include\unicode\putil.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ELSEIF "$(CFG)" == "common - Win64 Release"
-
-# Begin Custom Build
-InputPath=.\unicode\putil.h
-
-"..\..\include\unicode\putil.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ELSEIF "$(CFG)" == "common - Win64 Debug"
-
-# Begin Custom Build
-InputPath=.\unicode\putil.h
-
-"..\..\include\unicode\putil.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ENDIF
-
-# End Source File
-# Begin Source File
-
-SOURCE=.\unicode\pwin32.h
-
-!IF "$(CFG)" == "common - Win32 Release"
-
-# Begin Custom Build
-InputPath=.\unicode\pwin32.h
-
-"..\..\include\unicode\pwin32.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ELSEIF "$(CFG)" == "common - Win32 Debug"
-
-# Begin Custom Build
-InputPath=.\unicode\pwin32.h
-
-"..\..\include\unicode\pwin32.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ELSEIF "$(CFG)" == "common - Win64 Release"
-
-# Begin Custom Build
-InputPath=.\unicode\pwin32.h
-
-"..\..\include\unicode\pwin32.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ELSEIF "$(CFG)" == "common - Win64 Debug"
-
-# Begin Custom Build
-InputPath=.\unicode\pwin32.h
-
-"..\..\include\unicode\pwin32.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ENDIF
-
-# End Source File
-# Begin Source File
-
-SOURCE=.\uassert.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\unicode\uconfig.h
-
-!IF "$(CFG)" == "common - Win32 Release"
-
-# Begin Custom Build
-InputPath=.\unicode\uconfig.h
-
-"..\..\include\unicode\uconfig.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ELSEIF "$(CFG)" == "common - Win32 Debug"
-
-# Begin Custom Build
-InputPath=.\unicode\uconfig.h
-
-"..\..\include\unicode\uconfig.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ELSEIF "$(CFG)" == "common - Win64 Release"
-
-# Begin Custom Build
-InputPath=.\unicode\uconfig.h
-
-"..\..\include\unicode\uconfig.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ELSEIF "$(CFG)" == "common - Win64 Debug"
-
-# Begin Custom Build
-InputPath=.\unicode\uconfig.h
-
-"..\..\include\unicode\uconfig.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ENDIF
-
-# End Source File
-# Begin Source File
-
-SOURCE=.\unicode\udeprctd.h
-
-!IF "$(CFG)" == "common - Win32 Release"
-
-# Begin Custom Build
-InputPath=.\unicode\udeprctd.h
-
-"..\..\include\unicode\udeprctd.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ELSEIF "$(CFG)" == "common - Win32 Debug"
-
-# Begin Custom Build
-InputPath=.\unicode\udeprctd.h
-
-"..\..\include\unicode\udeprctd.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ELSEIF "$(CFG)" == "common - Win64 Release"
-
-# Begin Custom Build
-InputPath=.\unicode\udeprctd.h
-
-"..\..\include\unicode\udeprctd.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ELSEIF "$(CFG)" == "common - Win64 Debug"
-
-# Begin Custom Build
-InputPath=.\unicode\udeprctd.h
-
-"..\..\include\unicode\udeprctd.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ENDIF
-
-# End Source File
-# Begin Source File
-
-SOURCE=.\unicode\udraft.h
-
-!IF "$(CFG)" == "common - Win32 Release"
-
-# Begin Custom Build
-InputPath=.\unicode\udraft.h
-
-"..\..\include\unicode\udraft.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ELSEIF "$(CFG)" == "common - Win32 Debug"
-
-# Begin Custom Build
-InputPath=.\unicode\udraft.h
-
-"..\..\include\unicode\udraft.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ELSEIF "$(CFG)" == "common - Win64 Release"
-
-# Begin Custom Build
-InputPath=.\unicode\udraft.h
-
-"..\..\include\unicode\udraft.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ELSEIF "$(CFG)" == "common - Win64 Debug"
-
-# Begin Custom Build
-InputPath=.\unicode\udraft.h
-
-"..\..\include\unicode\udraft.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ENDIF
-
-# End Source File
-# Begin Source File
-
-SOURCE=.\unicode\umachine.h
-
-!IF "$(CFG)" == "common - Win32 Release"
-
-# Begin Custom Build
-InputPath=.\unicode\umachine.h
-
-"..\..\include\unicode\umachine.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ELSEIF "$(CFG)" == "common - Win32 Debug"
-
-# Begin Custom Build
-InputPath=.\unicode\umachine.h
-
-"..\..\include\unicode\umachine.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ELSEIF "$(CFG)" == "common - Win64 Release"
-
-# Begin Custom Build
-InputPath=.\unicode\umachine.h
-
-"..\..\include\unicode\umachine.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ELSEIF "$(CFG)" == "common - Win64 Debug"
-
-# Begin Custom Build
-InputPath=.\unicode\umachine.h
-
-"..\..\include\unicode\umachine.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ENDIF
-
-# End Source File
-# Begin Source File
-
-SOURCE=.\umutex.c
-# ADD CPP /Ze
-# End Source File
-# Begin Source File
-
-SOURCE=.\umutex.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\unicode\uobslete.h
-
-!IF "$(CFG)" == "common - Win32 Release"
-
-# Begin Custom Build
-InputPath=.\unicode\uobslete.h
-
-"..\..\include\unicode\uobslete.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ELSEIF "$(CFG)" == "common - Win32 Debug"
-
-# Begin Custom Build
-InputPath=.\unicode\uobslete.h
-
-"..\..\include\unicode\uobslete.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ELSEIF "$(CFG)" == "common - Win64 Release"
-
-# Begin Custom Build
-InputPath=.\unicode\uobslete.h
-
-"..\..\include\unicode\uobslete.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ELSEIF "$(CFG)" == "common - Win64 Debug"
-
-# Begin Custom Build
-InputPath=.\unicode\uobslete.h
-
-"..\..\include\unicode\uobslete.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ENDIF
-
-# End Source File
-# Begin Source File
-
-SOURCE=.\unicode\urename.h
-
-!IF "$(CFG)" == "common - Win32 Release"
-
-# Begin Custom Build
-InputPath=.\unicode\urename.h
-
-"..\..\include\unicode\urename.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ELSEIF "$(CFG)" == "common - Win32 Debug"
-
-# Begin Custom Build
-InputPath=.\unicode\urename.h
-
-"..\..\include\unicode\urename.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ELSEIF "$(CFG)" == "common - Win64 Release"
-
-# Begin Custom Build
-InputPath=.\unicode\urename.h
-
-"..\..\include\unicode\urename.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ELSEIF "$(CFG)" == "common - Win64 Debug"
-
-# Begin Custom Build
-InputPath=.\unicode\urename.h
-
-"..\..\include\unicode\urename.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ENDIF
-
-# End Source File
-# Begin Source File
-
-SOURCE=.\utrace.c
-# End Source File
-# Begin Source File
-
-SOURCE=.\unicode\utrace.h
-
-!IF "$(CFG)" == "common - Win32 Release"
-
-# Begin Custom Build
-InputPath=.\unicode\utrace.h
-
-"..\..\include\unicode\utrace.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ELSEIF "$(CFG)" == "common - Win32 Debug"
-
-# Begin Custom Build
-InputPath=.\unicode\utrace.h
-
-"..\..\include\unicode\utrace.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ELSEIF "$(CFG)" == "common - Win64 Release"
-
-# Begin Custom Build
-InputPath=.\unicode\utrace.h
-
-"..\..\include\unicode\utrace.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ELSEIF "$(CFG)" == "common - Win64 Debug"
-
-# Begin Custom Build
-InputPath=.\unicode\utrace.h
-
-"..\..\include\unicode\utrace.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ENDIF
-
-# End Source File
-# Begin Source File
-
-SOURCE=.\utracimp.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\utypes.c
-# End Source File
-# Begin Source File
-
-SOURCE=.\unicode\utypes.h
-
-!IF "$(CFG)" == "common - Win32 Release"
-
-# Begin Custom Build
-InputPath=.\unicode\utypes.h
-
-"..\..\include\unicode\utypes.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ELSEIF "$(CFG)" == "common - Win32 Debug"
-
-# Begin Custom Build
-InputPath=.\unicode\utypes.h
-
-"..\..\include\unicode\utypes.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ELSEIF "$(CFG)" == "common - Win64 Release"
-
-# Begin Custom Build
-InputPath=.\unicode\utypes.h
-
-"..\..\include\unicode\utypes.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ELSEIF "$(CFG)" == "common - Win64 Debug"
-
-# Begin Custom Build
-InputPath=.\unicode\utypes.h
-
-"..\..\include\unicode\utypes.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ENDIF
-
-# End Source File
-# Begin Source File
-
-SOURCE=.\unicode\uversion.h
-
-!IF "$(CFG)" == "common - Win32 Release"
-
-# Begin Custom Build
-InputPath=.\unicode\uversion.h
-
-"..\..\include\unicode\uversion.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ELSEIF "$(CFG)" == "common - Win32 Debug"
-
-# Begin Custom Build
-InputPath=.\unicode\uversion.h
-
-"..\..\include\unicode\uversion.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ELSEIF "$(CFG)" == "common - Win64 Release"
-
-# Begin Custom Build
-InputPath=.\unicode\uversion.h
-
-"..\..\include\unicode\uversion.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ELSEIF "$(CFG)" == "common - Win64 Debug"
-
-# Begin Custom Build
-InputPath=.\unicode\uversion.h
-
-"..\..\include\unicode\uversion.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ENDIF
-
-# End Source File
-# End Group
-# Begin Group "conversion"
-
-# PROP Default_Filter ""
-# Begin Source File
-
-SOURCE=.\ucnv.c
-# End Source File
-# Begin Source File
-
-SOURCE=.\unicode\ucnv.h
-
-!IF "$(CFG)" == "common - Win32 Release"
-
-# Begin Custom Build
-InputPath=.\unicode\ucnv.h
-
-"..\..\include\unicode\ucnv.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ELSEIF "$(CFG)" == "common - Win32 Debug"
-
-# Begin Custom Build
-InputPath=.\unicode\ucnv.h
-
-"..\..\include\unicode\ucnv.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ELSEIF "$(CFG)" == "common - Win64 Release"
-
-# Begin Custom Build
-InputPath=.\unicode\ucnv.h
-
-"..\..\include\unicode\ucnv.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ELSEIF "$(CFG)" == "common - Win64 Debug"
-
-# Begin Custom Build
-InputPath=.\unicode\ucnv.h
-
-"..\..\include\unicode\ucnv.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ENDIF
-
-# End Source File
-# Begin Source File
-
-SOURCE=.\ucnv2022.c
-# End Source File
-# Begin Source File
-
-SOURCE=.\ucnv_bld.c
-# End Source File
-# Begin Source File
-
-SOURCE=.\ucnv_bld.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\ucnv_cb.c
-# End Source File
-# Begin Source File
-
-SOURCE=.\unicode\ucnv_cb.h
-
-!IF "$(CFG)" == "common - Win32 Release"
-
-# Begin Custom Build
-InputPath=.\unicode\ucnv_cb.h
-
-"..\..\include\unicode\ucnv_cb.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ELSEIF "$(CFG)" == "common - Win32 Debug"
-
-# Begin Custom Build
-InputPath=.\unicode\ucnv_cb.h
-
-"..\..\include\unicode\ucnv_cb.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ELSEIF "$(CFG)" == "common - Win64 Release"
-
-# Begin Custom Build
-InputPath=.\unicode\ucnv_cb.h
-
-"..\..\include\unicode\ucnv_cb.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ELSEIF "$(CFG)" == "common - Win64 Debug"
-
-# Begin Custom Build
-InputPath=.\unicode\ucnv_cb.h
-
-"..\..\include\unicode\ucnv_cb.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ENDIF
-
-# End Source File
-# Begin Source File
-
-SOURCE=.\ucnv_cnv.c
-# End Source File
-# Begin Source File
-
-SOURCE=.\ucnv_cnv.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\ucnv_err.c
-# End Source File
-# Begin Source File
-
-SOURCE=.\unicode\ucnv_err.h
-
-!IF "$(CFG)" == "common - Win32 Release"
-
-# Begin Custom Build
-InputPath=.\unicode\ucnv_err.h
-
-"..\..\include\unicode\ucnv_err.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ELSEIF "$(CFG)" == "common - Win32 Debug"
-
-# Begin Custom Build
-InputPath=.\unicode\ucnv_err.h
-
-"..\..\include\unicode\ucnv_err.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ELSEIF "$(CFG)" == "common - Win64 Release"
-
-# Begin Custom Build
-InputPath=.\unicode\ucnv_err.h
-
-"..\..\include\unicode\ucnv_err.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ELSEIF "$(CFG)" == "common - Win64 Debug"
-
-# Begin Custom Build
-InputPath=.\unicode\ucnv_err.h
-
-"..\..\include\unicode\ucnv_err.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ENDIF
-
-# End Source File
-# Begin Source File
-
-SOURCE=.\ucnv_ext.c
-# End Source File
-# Begin Source File
-
-SOURCE=.\ucnv_ext.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\ucnv_imp.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\ucnv_io.c
-# End Source File
-# Begin Source File
-
-SOURCE=.\ucnv_io.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\ucnv_lmb.c
-# End Source File
-# Begin Source File
-
-SOURCE=.\ucnv_set.c
-# End Source File
-# Begin Source File
-
-SOURCE=.\ucnv_u16.c
-# End Source File
-# Begin Source File
-
-SOURCE=.\ucnv_u32.c
-# End Source File
-# Begin Source File
-
-SOURCE=.\ucnv_u7.c
-# End Source File
-# Begin Source File
-
-SOURCE=.\ucnv_u8.c
-# End Source File
-# Begin Source File
-
-SOURCE=.\ucnvbocu.c
-# End Source File
-# Begin Source File
-
-SOURCE=.\ucnvdisp.c
-# End Source File
-# Begin Source File
-
-SOURCE=.\ucnvhz.c
-# End Source File
-# Begin Source File
-
-SOURCE=.\ucnvisci.c
-# End Source File
-# Begin Source File
-
-SOURCE=.\ucnvlat1.c
-# End Source File
-# Begin Source File
-
-SOURCE=.\ucnvmbcs.c
-# End Source File
-# Begin Source File
-
-SOURCE=.\ucnvmbcs.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\ucnvscsu.c
-# End Source File
-# End Group
-# Begin Group "data & memory"
-
-# PROP Default_Filter ""
-# Begin Source File
-
-SOURCE=.\cmemory.c
-# End Source File
-# Begin Source File
-
-SOURCE=.\cmemory.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\unicode\uclean.h
-
-!IF "$(CFG)" == "common - Win32 Release"
-
-# Begin Custom Build
-InputPath=.\unicode\uclean.h
-
-"..\..\include\unicode\uclean.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ELSEIF "$(CFG)" == "common - Win32 Debug"
-
-# Begin Custom Build
-InputPath=.\unicode\uclean.h
-
-"..\..\include\unicode\uclean.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ELSEIF "$(CFG)" == "common - Win64 Release"
-
-# Begin Custom Build
-InputPath=.\unicode\uclean.h
-
-"..\..\include\unicode\uclean.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ELSEIF "$(CFG)" == "common - Win64 Debug"
-
-# Begin Custom Build
-InputPath=.\unicode\uclean.h
-
-"..\..\include\unicode\uclean.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ENDIF
-
-# End Source File
-# Begin Source File
-
-SOURCE=.\ucln.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\ucln_cmn.c
-# End Source File
-# Begin Source File
-
-SOURCE=.\ucln_cmn.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\ucmndata.c
-# End Source File
-# Begin Source File
-
-SOURCE=.\ucmndata.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\udata.c
-# ADD CPP /Za
-# End Source File
-# Begin Source File
-
-SOURCE=.\unicode\udata.h
-
-!IF "$(CFG)" == "common - Win32 Release"
-
-# Begin Custom Build
-InputPath=.\unicode\udata.h
-
-"..\..\include\unicode\udata.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ELSEIF "$(CFG)" == "common - Win32 Debug"
-
-# Begin Custom Build
-InputPath=.\unicode\udata.h
-
-"..\..\include\unicode\udata.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ELSEIF "$(CFG)" == "common - Win64 Release"
-
-# Begin Custom Build
-InputPath=.\unicode\udata.h
-
-"..\..\include\unicode\udata.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ELSEIF "$(CFG)" == "common - Win64 Debug"
-
-# Begin Custom Build
-InputPath=.\unicode\udata.h
-
-"..\..\include\unicode\udata.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ENDIF
-
-# End Source File
-# Begin Source File
-
-SOURCE=.\udatamem.c
-# End Source File
-# Begin Source File
-
-SOURCE=.\udatamem.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\udataswp.c
-# End Source File
-# Begin Source File
-
-SOURCE=.\udataswp.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\uinit.c
-# End Source File
-# Begin Source File
-
-SOURCE=.\umapfile.c
-# ADD CPP /Ze
-# End Source File
-# Begin Source File
-
-SOURCE=.\umapfile.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\uobject.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=.\unicode\uobject.h
-
-!IF "$(CFG)" == "common - Win32 Release"
-
-# Begin Custom Build
-InputPath=.\unicode\uobject.h
-
-"..\..\include\unicode\uobject.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ELSEIF "$(CFG)" == "common - Win32 Debug"
-
-# Begin Custom Build
-InputPath=.\unicode\uobject.h
-
-"..\..\include\unicode\uobject.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ELSEIF "$(CFG)" == "common - Win64 Release"
-
-# Begin Custom Build
-InputPath=.\unicode\uobject.h
-
-"..\..\include\unicode\uobject.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ELSEIF "$(CFG)" == "common - Win64 Debug"
-
-# Begin Custom Build
-InputPath=.\unicode\uobject.h
-
-"..\..\include\unicode\uobject.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ENDIF
-
-# End Source File
-# End Group
-# Begin Group "formatting"
-
-# PROP Default_Filter ""
-# Begin Source File
-
-SOURCE=.\unicode\parseerr.h
-
-!IF "$(CFG)" == "common - Win32 Release"
-
-# Begin Custom Build
-InputPath=.\unicode\parseerr.h
-
-"..\..\include\unicode\parseerr.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ELSEIF "$(CFG)" == "common - Win32 Debug"
-
-# Begin Custom Build
-InputPath=.\unicode\parseerr.h
-
-"..\..\include\unicode\parseerr.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ELSEIF "$(CFG)" == "common - Win64 Release"
-
-# Begin Custom Build
-InputPath=.\unicode\parseerr.h
-
-"..\..\include\unicode\parseerr.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ELSEIF "$(CFG)" == "common - Win64 Debug"
-
-# Begin Custom Build
-InputPath=.\unicode\parseerr.h
-
-"..\..\include\unicode\parseerr.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ENDIF
-
-# End Source File
-# Begin Source File
-
-SOURCE=.\parsepos.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=.\unicode\parsepos.h
-
-!IF "$(CFG)" == "common - Win32 Release"
-
-# Begin Custom Build
-InputPath=.\unicode\parsepos.h
-
-"..\..\include\unicode\parsepos.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ELSEIF "$(CFG)" == "common - Win32 Debug"
-
-# Begin Custom Build
-InputPath=.\unicode\parsepos.h
-
-"..\..\include\unicode\parsepos.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ELSEIF "$(CFG)" == "common - Win64 Release"
-
-# Begin Custom Build
-InputPath=.\unicode\parsepos.h
-
-"..\..\include\unicode\parsepos.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ELSEIF "$(CFG)" == "common - Win64 Debug"
-
-# Begin Custom Build
-InputPath=.\unicode\parsepos.h
-
-"..\..\include\unicode\parsepos.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ENDIF
-
-# End Source File
-# Begin Source File
-
-SOURCE=.\unicode\umisc.h
-
-!IF "$(CFG)" == "common - Win32 Release"
-
-# Begin Custom Build
-InputPath=.\unicode\umisc.h
-InputName=umisc
-
-"..\..\include\unicode\$(InputName).h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ELSEIF "$(CFG)" == "common - Win32 Debug"
-
-# Begin Custom Build
-InputPath=.\unicode\umisc.h
-InputName=umisc
-
-"..\..\include\unicode\$(InputName).h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ELSEIF "$(CFG)" == "common - Win64 Release"
-
-# Begin Custom Build
-InputPath=.\unicode\umisc.h
-InputName=umisc
-
-"..\..\include\unicode\$(InputName).h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ELSEIF "$(CFG)" == "common - Win64 Debug"
-
-# Begin Custom Build
-InputPath=.\unicode\umisc.h
-InputName=umisc
-
-"..\..\include\unicode\$(InputName).h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ENDIF
-
-# End Source File
-# Begin Source File
-
-SOURCE=.\ustrfmt.c
-# End Source File
-# Begin Source File
-
-SOURCE=.\ustrfmt.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\util.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=.\util.h
-# End Source File
-# End Group
-# Begin Group "idna"
-
-# PROP Default_Filter "*.c,*.h"
-# Begin Source File
-
-SOURCE=.\punycode.c
-# End Source File
-# Begin Source File
-
-SOURCE=.\punycode.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\uidna.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=.\unicode\uidna.h
-
-!IF "$(CFG)" == "common - Win32 Release"
-
-# Begin Custom Build
-InputPath=.\unicode\uidna.h
-
-"..\..\include\unicode\uidna.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ELSEIF "$(CFG)" == "common - Win32 Debug"
-
-# Begin Custom Build
-InputPath=.\unicode\uidna.h
-
-"..\..\include\unicode\uidna.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ELSEIF "$(CFG)" == "common - Win64 Release"
-
-# Begin Custom Build
-InputPath=.\unicode\uidna.h
-
-"..\..\include\unicode\uidna.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ELSEIF "$(CFG)" == "common - Win64 Debug"
-
-# Begin Custom Build
-InputPath=.\unicode\uidna.h
-
-"..\..\include\unicode\uidna.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ENDIF
-
-# End Source File
-# End Group
-# Begin Group "locales & resources"
-
-# PROP Default_Filter ""
-# Begin Source File
-
-SOURCE=.\locbased.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=.\locbased.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\locid.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=.\unicode\locid.h
-
-!IF "$(CFG)" == "common - Win32 Release"
-
-# Begin Custom Build
-InputPath=.\unicode\locid.h
-
-"..\..\include\unicode\locid.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ELSEIF "$(CFG)" == "common - Win32 Debug"
-
-# Begin Custom Build
-InputPath=.\unicode\locid.h
-
-"..\..\include\unicode\locid.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ELSEIF "$(CFG)" == "common - Win64 Release"
-
-# Begin Custom Build
-InputPath=.\unicode\locid.h
-
-"..\..\include\unicode\locid.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ELSEIF "$(CFG)" == "common - Win64 Debug"
-
-# Begin Custom Build
-InputPath=.\unicode\locid.h
-
-"..\..\include\unicode\locid.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ENDIF
-
-# End Source File
-# Begin Source File
-
-SOURCE=.\resbund.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=.\unicode\resbund.h
-
-!IF "$(CFG)" == "common - Win32 Release"
-
-# Begin Custom Build
-InputPath=.\unicode\resbund.h
-
-"..\..\include\unicode\resbund.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ELSEIF "$(CFG)" == "common - Win32 Debug"
-
-# Begin Custom Build
-InputPath=.\unicode\resbund.h
-
-"..\..\include\unicode\resbund.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ELSEIF "$(CFG)" == "common - Win64 Release"
-
-# Begin Custom Build
-InputPath=.\unicode\resbund.h
-
-"..\..\include\unicode\resbund.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ELSEIF "$(CFG)" == "common - Win64 Debug"
-
-# Begin Custom Build
-InputPath=.\unicode\resbund.h
-
-"..\..\include\unicode\resbund.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ENDIF
-
-# End Source File
-# Begin Source File
-
-SOURCE=.\resbund_cnv.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=.\ucat.c
-# End Source File
-# Begin Source File
-
-SOURCE=.\unicode\ucat.h
-
-!IF "$(CFG)" == "common - Win32 Release"
-
-# Begin Custom Build
-InputPath=.\unicode\ucat.h
-
-"..\..\include\unicode\ucat.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ELSEIF "$(CFG)" == "common - Win32 Debug"
-
-# Begin Custom Build
-InputPath=.\unicode\ucat.h
-
-"..\..\include\unicode\ucat.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ELSEIF "$(CFG)" == "common - Win64 Release"
-
-# Begin Custom Build
-InputPath=.\unicode\ucat.h
-
-"..\..\include\unicode\ucat.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ELSEIF "$(CFG)" == "common - Win64 Debug"
-
-# Begin Custom Build
-InputPath=.\unicode\ucat.h
-
-"..\..\include\unicode\ucat.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ENDIF
-
-# End Source File
-# Begin Source File
-
-SOURCE=.\uloc.c
-# End Source File
-# Begin Source File
-
-SOURCE=.\unicode\uloc.h
-
-!IF "$(CFG)" == "common - Win32 Release"
-
-# Begin Custom Build
-InputPath=.\unicode\uloc.h
-
-"..\..\include\unicode\uloc.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ELSEIF "$(CFG)" == "common - Win32 Debug"
-
-# Begin Custom Build
-InputPath=.\unicode\uloc.h
-
-"..\..\include\unicode\uloc.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ELSEIF "$(CFG)" == "common - Win64 Release"
-
-# Begin Custom Build
-InputPath=.\unicode\uloc.h
-
-"..\..\include\unicode\uloc.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ELSEIF "$(CFG)" == "common - Win64 Debug"
-
-# Begin Custom Build
-InputPath=.\unicode\uloc.h
-
-"..\..\include\unicode\uloc.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ENDIF
-
-# End Source File
-# Begin Source File
-
-SOURCE=.\ulocimp.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\unicode\ures.h
-
-!IF "$(CFG)" == "common - Win32 Release"
-
-# Begin Custom Build
-InputPath=.\unicode\ures.h
-
-"..\..\include\unicode\ures.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ELSEIF "$(CFG)" == "common - Win32 Debug"
-
-# Begin Custom Build
-InputPath=.\unicode\ures.h
-
-"..\..\include\unicode\ures.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ELSEIF "$(CFG)" == "common - Win64 Release"
-
-# Begin Custom Build
-InputPath=.\unicode\ures.h
-
-"..\..\include\unicode\ures.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ELSEIF "$(CFG)" == "common - Win64 Debug"
-
-# Begin Custom Build
-InputPath=.\unicode\ures.h
-
-"..\..\include\unicode\ures.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ENDIF
-
-# End Source File
-# Begin Source File
-
-SOURCE=.\ures_cnv.c
-# End Source File
-# Begin Source File
-
-SOURCE=.\uresbund.c
-# End Source File
-# Begin Source File
-
-SOURCE=.\uresdata.c
-# End Source File
-# Begin Source File
-
-SOURCE=.\uresdata.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\uresimp.h
-# End Source File
-# End Group
-# Begin Group "normalization"
-
-# PROP Default_Filter ""
-# Begin Source File
-
-SOURCE=.\caniter.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=.\unicode\caniter.h
-
-!IF "$(CFG)" == "common - Win32 Release"
-
-# Begin Custom Build
-InputPath=.\unicode\caniter.h
-
-"..\..\include\unicode\caniter.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ELSEIF "$(CFG)" == "common - Win32 Debug"
-
-# Begin Custom Build
-InputPath=.\unicode\caniter.h
-
-"..\..\include\unicode\caniter.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ELSEIF "$(CFG)" == "common - Win64 Release"
-
-# Begin Custom Build
-InputPath=.\unicode\caniter.h
-
-"..\..\include\unicode\caniter.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ELSEIF "$(CFG)" == "common - Win64 Debug"
-
-# Begin Custom Build
-InputPath=.\unicode\caniter.h
-
-"..\..\include\unicode\caniter.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ENDIF
-
-# End Source File
-# Begin Source File
-
-SOURCE=.\normlzr.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=.\unicode\normlzr.h
-
-!IF "$(CFG)" == "common - Win32 Release"
-
-# Begin Custom Build
-InputPath=.\unicode\normlzr.h
-
-"..\..\include\unicode\normlzr.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ELSEIF "$(CFG)" == "common - Win32 Debug"
-
-# Begin Custom Build
-InputPath=.\unicode\normlzr.h
-
-"..\..\include\unicode\normlzr.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ELSEIF "$(CFG)" == "common - Win64 Release"
-
-# Begin Custom Build
-InputPath=.\unicode\normlzr.h
-
-"..\..\include\unicode\normlzr.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ELSEIF "$(CFG)" == "common - Win64 Debug"
-
-# Begin Custom Build
-InputPath=.\unicode\normlzr.h
-
-"..\..\include\unicode\normlzr.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ENDIF
-
-# End Source File
-# Begin Source File
-
-SOURCE=.\unorm.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=.\unicode\unorm.h
-
-!IF "$(CFG)" == "common - Win32 Release"
-
-# Begin Custom Build
-InputPath=.\unicode\unorm.h
-
-"..\..\include\unicode\unorm.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ELSEIF "$(CFG)" == "common - Win32 Debug"
-
-# Begin Custom Build
-InputPath=.\unicode\unorm.h
-
-"..\..\include\unicode\unorm.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ELSEIF "$(CFG)" == "common - Win64 Release"
-
-# Begin Custom Build
-InputPath=.\unicode\unorm.h
-
-"..\..\include\unicode\unorm.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ELSEIF "$(CFG)" == "common - Win64 Debug"
-
-# Begin Custom Build
-InputPath=.\unicode\unorm.h
-
-"..\..\include\unicode\unorm.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ENDIF
-
-# End Source File
-# Begin Source File
-
-SOURCE=.\unorm_it.c
-# End Source File
-# Begin Source File
-
-SOURCE=.\unorm_it.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\unormcmp.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=.\unormimp.h
-# End Source File
-# End Group
-# Begin Group "properties & sets"
-
-# PROP Default_Filter ""
-# Begin Source File
-
-SOURCE=.\propname.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=.\propname.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\ruleiter.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=.\ruleiter.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\unicode\symtable.h
-
-!IF "$(CFG)" == "common - Win32 Release"
-
-# Begin Custom Build
-InputPath=.\unicode\symtable.h
-
-"..\..\include\unicode\symtable.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ELSEIF "$(CFG)" == "common - Win32 Debug"
-
-# Begin Custom Build
-InputPath=.\unicode\symtable.h
-
-"..\..\include\unicode\symtable.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ELSEIF "$(CFG)" == "common - Win64 Release"
-
-# Begin Custom Build
-InputPath=.\unicode\symtable.h
-
-"..\..\include\unicode\symtable.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ELSEIF "$(CFG)" == "common - Win64 Debug"
-
-# Begin Custom Build
-InputPath=.\unicode\symtable.h
-
-"..\..\include\unicode\symtable.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ENDIF
-
-# End Source File
-# Begin Source File
-
-SOURCE=.\ucase.c
-# End Source File
-# Begin Source File
-
-SOURCE=.\ucase.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\uchar.c
-# End Source File
-# Begin Source File
-
-SOURCE=.\unicode\uchar.h
-
-!IF "$(CFG)" == "common - Win32 Release"
-
-# Begin Custom Build
-InputPath=.\unicode\uchar.h
-
-"..\..\include\unicode\uchar.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ELSEIF "$(CFG)" == "common - Win32 Debug"
-
-# Begin Custom Build
-InputPath=.\unicode\uchar.h
-
-"..\..\include\unicode\uchar.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ELSEIF "$(CFG)" == "common - Win64 Release"
-
-# Begin Custom Build
-InputPath=.\unicode\uchar.h
-
-"..\..\include\unicode\uchar.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ELSEIF "$(CFG)" == "common - Win64 Debug"
-
-# Begin Custom Build
-InputPath=.\unicode\uchar.h
-
-"..\..\include\unicode\uchar.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ENDIF
-
-# End Source File
-# Begin Source File
-
-SOURCE=.\unames.c
-# End Source File
-# Begin Source File
-
-SOURCE=.\unifilt.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=.\unicode\unifilt.h
-
-!IF "$(CFG)" == "common - Win32 Release"
-
-# Begin Custom Build
-InputPath=.\unicode\unifilt.h
-
-"..\..\include\unicode\unifilt.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ELSEIF "$(CFG)" == "common - Win32 Debug"
-
-# Begin Custom Build
-InputPath=.\unicode\unifilt.h
-
-"..\..\include\unicode\unifilt.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ELSEIF "$(CFG)" == "common - Win64 Release"
-
-# Begin Custom Build
-InputPath=.\unicode\unifilt.h
-
-"..\..\include\unicode\unifilt.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ELSEIF "$(CFG)" == "common - Win64 Debug"
-
-# Begin Custom Build
-InputPath=.\unicode\unifilt.h
-
-"..\..\include\unicode\unifilt.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ENDIF
-
-# End Source File
-# Begin Source File
-
-SOURCE=.\unifunct.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=.\unicode\unifunct.h
-
-!IF "$(CFG)" == "common - Win32 Release"
-
-# Begin Custom Build
-InputPath=.\unicode\unifunct.h
-
-"..\..\include\unicode\unifunct.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ELSEIF "$(CFG)" == "common - Win32 Debug"
-
-# Begin Custom Build
-InputPath=.\unicode\unifunct.h
-
-"..\..\include\unicode\unifunct.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ELSEIF "$(CFG)" == "common - Win64 Release"
-
-# Begin Custom Build
-InputPath=.\unicode\unifunct.h
-
-"..\..\include\unicode\unifunct.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ELSEIF "$(CFG)" == "common - Win64 Debug"
-
-# Begin Custom Build
-InputPath=.\unicode\unifunct.h
-
-"..\..\include\unicode\unifunct.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ENDIF
-
-# End Source File
-# Begin Source File
-
-SOURCE=.\unicode\unimatch.h
-
-!IF "$(CFG)" == "common - Win32 Release"
-
-# Begin Custom Build
-InputPath=.\unicode\unimatch.h
-
-"..\..\include\unicode\unimatch.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ELSEIF "$(CFG)" == "common - Win32 Debug"
-
-# Begin Custom Build
-InputPath=.\unicode\unimatch.h
-
-"..\..\include\unicode\unimatch.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ELSEIF "$(CFG)" == "common - Win64 Release"
-
-# Begin Custom Build
-InputPath=.\unicode\unimatch.h
-
-"..\..\include\unicode\unimatch.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ELSEIF "$(CFG)" == "common - Win64 Debug"
-
-# Begin Custom Build
-InputPath=.\unicode\unimatch.h
-
-"..\..\include\unicode\unimatch.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ENDIF
-
-# End Source File
-# Begin Source File
-
-SOURCE=.\uniset.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=.\unicode\uniset.h
-
-!IF "$(CFG)" == "common - Win32 Release"
-
-# Begin Custom Build
-InputPath=.\unicode\uniset.h
-
-"..\..\include\unicode\uniset.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ELSEIF "$(CFG)" == "common - Win32 Debug"
-
-# Begin Custom Build
-InputPath=.\unicode\uniset.h
-
-"..\..\include\unicode\uniset.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ELSEIF "$(CFG)" == "common - Win64 Release"
-
-# Begin Custom Build
-InputPath=.\unicode\uniset.h
-
-"..\..\include\unicode\uniset.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ELSEIF "$(CFG)" == "common - Win64 Debug"
-
-# Begin Custom Build
-InputPath=.\unicode\uniset.h
-
-"..\..\include\unicode\uniset.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ENDIF
-
-# End Source File
-# Begin Source File
-
-SOURCE=.\uniset_props.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=.\uprops.c
-# End Source File
-# Begin Source File
-
-SOURCE=.\uprops.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\usc_impl.c
-# End Source File
-# Begin Source File
-
-SOURCE=.\usc_impl.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\uscript.c
-# End Source File
-# Begin Source File
-
-SOURCE=.\unicode\uscript.h
-
-!IF "$(CFG)" == "common - Win32 Release"
-
-# Begin Custom Build
-InputPath=.\unicode\uscript.h
-
-"..\..\include\unicode\uscript.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ELSEIF "$(CFG)" == "common - Win32 Debug"
-
-# Begin Custom Build
-InputPath=.\unicode\uscript.h
-
-"..\..\include\unicode\uscript.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ELSEIF "$(CFG)" == "common - Win64 Release"
-
-# Begin Custom Build
-InputPath=.\unicode\uscript.h
-
-"..\..\include\unicode\uscript.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ELSEIF "$(CFG)" == "common - Win64 Debug"
-
-# Begin Custom Build
-InputPath=.\unicode\uscript.h
-
-"..\..\include\unicode\uscript.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ENDIF
-
-# End Source File
-# Begin Source File
-
-SOURCE=.\uset.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=.\unicode\uset.h
-
-!IF "$(CFG)" == "common - Win32 Release"
-
-# Begin Custom Build
-InputPath=.\unicode\uset.h
-
-"..\..\include\unicode\uset.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ELSEIF "$(CFG)" == "common - Win32 Debug"
-
-# Begin Custom Build
-InputPath=.\unicode\uset.h
-
-"..\..\include\unicode\uset.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ELSEIF "$(CFG)" == "common - Win64 Release"
-
-# Begin Custom Build
-InputPath=.\unicode\uset.h
-
-"..\..\include\unicode\uset.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ELSEIF "$(CFG)" == "common - Win64 Debug"
-
-# Begin Custom Build
-InputPath=.\unicode\uset.h
-
-"..\..\include\unicode\uset.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ENDIF
-
-# End Source File
-# Begin Source File
-
-SOURCE=.\uset_imp.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\uset_props.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=.\usetiter.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=.\unicode\usetiter.h
-
-!IF "$(CFG)" == "common - Win32 Release"
-
-# Begin Custom Build
-InputPath=.\unicode\usetiter.h
-
-"..\..\include\unicode\usetiter.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ELSEIF "$(CFG)" == "common - Win32 Debug"
-
-# Begin Custom Build
-InputPath=.\unicode\usetiter.h
-
-"..\..\include\unicode\usetiter.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ELSEIF "$(CFG)" == "common - Win64 Release"
-
-# Begin Custom Build
-InputPath=.\unicode\usetiter.h
-
-"..\..\include\unicode\usetiter.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ELSEIF "$(CFG)" == "common - Win64 Debug"
-
-# Begin Custom Build
-InputPath=.\unicode\usetiter.h
-
-"..\..\include\unicode\usetiter.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ENDIF
-
-# End Source File
-# End Group
-# Begin Group "registration"
-
-# PROP Default_Filter ""
-# Begin Source File
-
-SOURCE=.\iculdata.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\iculserv.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=.\iculserv.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\icunotif.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=.\icunotif.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\icurwlck.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\icuserv.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=.\icuserv.h
-# End Source File
-# End Group
-# Begin Group "sprep"
-
-# PROP Default_Filter ""
-# Begin Source File
-
-SOURCE=.\sprpimpl.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\usprep.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=.\unicode\usprep.h
-
-!IF "$(CFG)" == "common - Win32 Release"
-
-# Begin Custom Build
-InputPath=.\unicode\usprep.h
-
-"..\..\include\unicode\usprep.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ELSEIF "$(CFG)" == "common - Win32 Debug"
-
-# Begin Custom Build
-InputPath=.\unicode\usprep.h
-
-"..\..\include\unicode\usprep.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ELSEIF "$(CFG)" == "common - Win64 Release"
-
-# Begin Custom Build
-InputPath=.\unicode\usprep.h
-
-"..\..\include\unicode\usprep.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ELSEIF "$(CFG)" == "common - Win64 Debug"
-
-# Begin Custom Build
-InputPath=.\unicode\usprep.h
-
-"..\..\include\unicode\usprep.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ENDIF
-
-# End Source File
-# End Group
-# Begin Group "strings"
-
-# PROP Default_Filter ""
-# Begin Source File
-
-SOURCE=.\chariter.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=.\unicode\chariter.h
-
-!IF "$(CFG)" == "common - Win32 Release"
-
-# Begin Custom Build
-InputPath=.\unicode\chariter.h
-
-"..\..\include\unicode\chariter.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ELSEIF "$(CFG)" == "common - Win32 Debug"
-
-# Begin Custom Build
-InputPath=.\unicode\chariter.h
-
-"..\..\include\unicode\chariter.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ELSEIF "$(CFG)" == "common - Win64 Release"
-
-# Begin Custom Build
-InputPath=.\unicode\chariter.h
-
-"..\..\include\unicode\chariter.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ELSEIF "$(CFG)" == "common - Win64 Debug"
-
-# Begin Custom Build
-InputPath=.\unicode\chariter.h
-
-"..\..\include\unicode\chariter.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ENDIF
-
-# End Source File
-# Begin Source File
-
-SOURCE=.\charstr.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\cstring.c
-# End Source File
-# Begin Source File
-
-SOURCE=.\cstring.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\cwchar.c
-# End Source File
-# Begin Source File
-
-SOURCE=.\cwchar.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\unicode\rep.h
-
-!IF "$(CFG)" == "common - Win32 Release"
-
-# Begin Custom Build
-InputPath=.\unicode\rep.h
-
-"..\..\include\unicode\rep.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ELSEIF "$(CFG)" == "common - Win32 Debug"
-
-# Begin Custom Build
-InputPath=.\unicode\rep.h
-
-"..\..\include\unicode\rep.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ELSEIF "$(CFG)" == "common - Win64 Release"
-
-# Begin Custom Build
-InputPath=.\unicode\rep.h
-
-"..\..\include\unicode\rep.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ELSEIF "$(CFG)" == "common - Win64 Debug"
-
-# Begin Custom Build
-InputPath=.\unicode\rep.h
-
-"..\..\include\unicode\rep.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ENDIF
-
-# End Source File
-# Begin Source File
-
-SOURCE=.\schriter.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=.\unicode\schriter.h
-
-!IF "$(CFG)" == "common - Win32 Release"
-
-# Begin Custom Build
-InputPath=.\unicode\schriter.h
-
-"..\..\include\unicode\schriter.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ELSEIF "$(CFG)" == "common - Win32 Debug"
-
-# Begin Custom Build
-InputPath=.\unicode\schriter.h
-
-"..\..\include\unicode\schriter.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ELSEIF "$(CFG)" == "common - Win64 Release"
-
-# Begin Custom Build
-InputPath=.\unicode\schriter.h
-
-"..\..\include\unicode\schriter.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ELSEIF "$(CFG)" == "common - Win64 Debug"
-
-# Begin Custom Build
-InputPath=.\unicode\schriter.h
-
-"..\..\include\unicode\schriter.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ENDIF
-
-# End Source File
-# Begin Source File
-
-SOURCE=.\uchriter.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=.\unicode\uchriter.h
-
-!IF "$(CFG)" == "common - Win32 Release"
-
-# Begin Custom Build
-InputPath=.\unicode\uchriter.h
-
-"..\..\include\unicode\uchriter.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ELSEIF "$(CFG)" == "common - Win32 Debug"
-
-# Begin Custom Build
-InputPath=.\unicode\uchriter.h
-
-"..\..\include\unicode\uchriter.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ELSEIF "$(CFG)" == "common - Win64 Release"
-
-# Begin Custom Build
-InputPath=.\unicode\uchriter.h
-
-"..\..\include\unicode\uchriter.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ELSEIF "$(CFG)" == "common - Win64 Debug"
-
-# Begin Custom Build
-InputPath=.\unicode\uchriter.h
-
-"..\..\include\unicode\uchriter.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ENDIF
-
-# End Source File
-# Begin Source File
-
-SOURCE=.\uinvchar.c
-# End Source File
-# Begin Source File
-
-SOURCE=.\uinvchar.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\uiter.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=.\unicode\uiter.h
-
-!IF "$(CFG)" == "common - Win32 Release"
-
-# Begin Custom Build
-InputPath=.\unicode\uiter.h
-
-"..\..\include\unicode\uiter.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ELSEIF "$(CFG)" == "common - Win32 Debug"
-
-# Begin Custom Build
-InputPath=.\unicode\uiter.h
-
-"..\..\include\unicode\uiter.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ELSEIF "$(CFG)" == "common - Win64 Release"
-
-# Begin Custom Build
-InputPath=.\unicode\uiter.h
-
-"..\..\include\unicode\uiter.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ELSEIF "$(CFG)" == "common - Win64 Debug"
-
-# Begin Custom Build
-InputPath=.\unicode\uiter.h
-
-"..\..\include\unicode\uiter.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ENDIF
-
-# End Source File
-# Begin Source File
-
-SOURCE=.\unistr.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=.\unicode\unistr.h
-
-!IF "$(CFG)" == "common - Win32 Release"
-
-# Begin Custom Build
-InputPath=.\unicode\unistr.h
-
-"..\..\include\unicode\unistr.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ELSEIF "$(CFG)" == "common - Win32 Debug"
-
-# Begin Custom Build
-InputPath=.\unicode\unistr.h
-
-"..\..\include\unicode\unistr.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ELSEIF "$(CFG)" == "common - Win64 Release"
-
-# Begin Custom Build
-InputPath=.\unicode\unistr.h
-
-"..\..\include\unicode\unistr.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ELSEIF "$(CFG)" == "common - Win64 Debug"
-
-# Begin Custom Build
-InputPath=.\unicode\unistr.h
-
-"..\..\include\unicode\unistr.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ENDIF
-
-# End Source File
-# Begin Source File
-
-SOURCE=.\unistr_case.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=.\unistr_cnv.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=.\unistr_props.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=.\unicode\urep.h
-
-!IF "$(CFG)" == "common - Win32 Release"
-
-# Begin Custom Build
-InputPath=.\unicode\urep.h
-
-"..\..\include\unicode\urep.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ELSEIF "$(CFG)" == "common - Win32 Debug"
-
-# Begin Custom Build
-InputPath=.\unicode\urep.h
-
-"..\..\include\unicode\urep.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ELSEIF "$(CFG)" == "common - Win64 Release"
-
-# Begin Custom Build
-InputPath=.\unicode\urep.h
-
-"..\..\include\unicode\urep.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ELSEIF "$(CFG)" == "common - Win64 Debug"
-
-# Begin Custom Build
-InputPath=.\unicode\urep.h
-
-"..\..\include\unicode\urep.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ENDIF
-
-# End Source File
-# Begin Source File
-
-SOURCE=.\ustr_cnv.c
-# End Source File
-# Begin Source File
-
-SOURCE=.\ustr_cnv.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\ustr_imp.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\ustr_wcs.c
-# End Source File
-# Begin Source File
-
-SOURCE=.\ustrcase.c
-# End Source File
-# Begin Source File
-
-SOURCE=.\ustring.c
-# End Source File
-# Begin Source File
-
-SOURCE=.\unicode\ustring.h
-
-!IF "$(CFG)" == "common - Win32 Release"
-
-# Begin Custom Build
-InputPath=.\unicode\ustring.h
-
-"..\..\include\unicode\ustring.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ELSEIF "$(CFG)" == "common - Win32 Debug"
-
-# Begin Custom Build
-InputPath=.\unicode\ustring.h
-
-"..\..\include\unicode\ustring.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ELSEIF "$(CFG)" == "common - Win64 Release"
-
-# Begin Custom Build
-InputPath=.\unicode\ustring.h
-
-"..\..\include\unicode\ustring.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ELSEIF "$(CFG)" == "common - Win64 Debug"
-
-# Begin Custom Build
-InputPath=.\unicode\ustring.h
-
-"..\..\include\unicode\ustring.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ENDIF
-
-# End Source File
-# Begin Source File
-
-SOURCE=.\ustrtrns.c
-# End Source File
-# Begin Source File
-
-SOURCE=.\unicode\utf.h
-
-!IF "$(CFG)" == "common - Win32 Release"
-
-# Begin Custom Build
-InputPath=.\unicode\utf.h
-
-"..\..\include\unicode\utf.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ELSEIF "$(CFG)" == "common - Win32 Debug"
-
-# Begin Custom Build
-InputPath=.\unicode\utf.h
-
-"..\..\include\unicode\utf.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ELSEIF "$(CFG)" == "common - Win64 Release"
-
-# Begin Custom Build
-InputPath=.\unicode\utf.h
-
-"..\..\include\unicode\utf.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ELSEIF "$(CFG)" == "common - Win64 Debug"
-
-# Begin Custom Build
-InputPath=.\unicode\utf.h
-
-"..\..\include\unicode\utf.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ENDIF
-
-# End Source File
-# Begin Source File
-
-SOURCE=.\unicode\utf16.h
-
-!IF "$(CFG)" == "common - Win32 Release"
-
-# Begin Custom Build
-InputPath=.\unicode\utf16.h
-
-"..\..\include\unicode\utf16.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ELSEIF "$(CFG)" == "common - Win32 Debug"
-
-# Begin Custom Build
-InputPath=.\unicode\utf16.h
-
-"..\..\include\unicode\utf16.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ELSEIF "$(CFG)" == "common - Win64 Release"
-
-# Begin Custom Build
-InputPath=.\unicode\utf16.h
-
-"..\..\include\unicode\utf16.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ELSEIF "$(CFG)" == "common - Win64 Debug"
-
-# Begin Custom Build
-InputPath=.\unicode\utf16.h
-
-"..\..\include\unicode\utf16.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ENDIF
-
-# End Source File
-# Begin Source File
-
-SOURCE=.\unicode\utf32.h
-
-!IF "$(CFG)" == "common - Win32 Release"
-
-# Begin Custom Build
-InputPath=.\unicode\utf32.h
-
-"..\..\include\unicode\utf32.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ELSEIF "$(CFG)" == "common - Win32 Debug"
-
-# Begin Custom Build
-InputPath=.\unicode\utf32.h
-
-"..\..\include\unicode\utf32.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ELSEIF "$(CFG)" == "common - Win64 Release"
-
-# Begin Custom Build
-InputPath=.\unicode\utf32.h
-
-"..\..\include\unicode\utf32.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ELSEIF "$(CFG)" == "common - Win64 Debug"
-
-# Begin Custom Build
-InputPath=.\unicode\utf32.h
-
-"..\..\include\unicode\utf32.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ENDIF
-
-# End Source File
-# Begin Source File
-
-SOURCE=.\unicode\utf8.h
-
-!IF "$(CFG)" == "common - Win32 Release"
-
-# Begin Custom Build
-InputPath=.\unicode\utf8.h
-
-"..\..\include\unicode\utf8.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ELSEIF "$(CFG)" == "common - Win32 Debug"
-
-# Begin Custom Build
-InputPath=.\unicode\utf8.h
-
-"..\..\include\unicode\utf8.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ELSEIF "$(CFG)" == "common - Win64 Release"
-
-# Begin Custom Build
-InputPath=.\unicode\utf8.h
-
-"..\..\include\unicode\utf8.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ELSEIF "$(CFG)" == "common - Win64 Debug"
-
-# Begin Custom Build
-InputPath=.\unicode\utf8.h
-
-"..\..\include\unicode\utf8.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ENDIF
-
-# End Source File
-# Begin Source File
-
-SOURCE=.\utf_impl.c
-# End Source File
-# Begin Source File
-
-SOURCE=.\unicode\utf_old.h
-
-!IF "$(CFG)" == "common - Win32 Release"
-
-# Begin Custom Build
-InputPath=.\unicode\utf_old.h
-
-"..\..\include\unicode\utf_old.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ELSEIF "$(CFG)" == "common - Win32 Debug"
-
-# Begin Custom Build
-InputPath=.\unicode\utf_old.h
-
-"..\..\include\unicode\utf_old.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ELSEIF "$(CFG)" == "common - Win64 Release"
-
-# Begin Custom Build
-InputPath=.\unicode\utf_old.h
-
-"..\..\include\unicode\utf_old.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ELSEIF "$(CFG)" == "common - Win64 Debug"
-
-# Begin Custom Build
-InputPath=.\unicode\utf_old.h
-
-"..\..\include\unicode\utf_old.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- copy $(InputPath) ..\..\include\unicode
-
-# End Custom Build
-
-!ENDIF
-
-# End Source File
-# End Group
-# End Target
-# End Project
diff --git a/icuSources/common/common.rc b/icuSources/common/common.rc
index c3d9323b..f77a0803 100644
--- a/icuSources/common/common.rc
+++ b/icuSources/common/common.rc
@@ -1,7 +1,7 @@
// Do not edit with Microsoft Developer Studio Resource Editor.
// It will permanently substitute version numbers that are intended to be
// picked up by the pre-processor during each build.
-// Copyright (c) 2001-2003 International Business Machines
+// Copyright (c) 2001-2005 International Business Machines
// Corporation and others. All Rights Reserved.
//
#include "msvcres.h"
@@ -54,8 +54,8 @@ END
#define CommaVersionString(a, b, c, d) STR(a) ", " STR(b) ", " STR(c) ", " STR(d) "\0"
VS_VERSION_INFO VERSIONINFO
- FILEVERSION U_ICU_VERSION_MAJOR_NUM, U_ICU_VERSION_MINOR_NUM, U_ICU_VERSION_PATCHLEVEL_NUM, 0
- PRODUCTVERSION U_ICU_VERSION_MAJOR_NUM, U_ICU_VERSION_MINOR_NUM, U_ICU_VERSION_PATCHLEVEL_NUM, 0
+ FILEVERSION U_ICU_VERSION_MAJOR_NUM, U_ICU_VERSION_MINOR_NUM, U_ICU_VERSION_PATCHLEVEL_NUM, U_ICU_VERSION_BUILDLEVEL_NUM
+ PRODUCTVERSION U_ICU_VERSION_MAJOR_NUM, U_ICU_VERSION_MINOR_NUM, U_ICU_VERSION_PATCHLEVEL_NUM, U_ICU_VERSION_BUILDLEVEL_NUM
FILEFLAGSMASK 0x3fL
#ifdef _DEBUG
FILEFLAGS 0x1L
@@ -70,10 +70,10 @@ BEGIN
BEGIN
BLOCK "00000000"
BEGIN
- VALUE "Comments", "http://oss.software.ibm.com/icu/\0"
+ VALUE "Comments", ICU_WEBSITE "\0"
VALUE "CompanyName", "IBM Corporation and others\0"
VALUE "FileDescription", "IBM ICU Common DLL\0"
- VALUE "FileVersion", CommaVersionString(U_ICU_VERSION_MAJOR_NUM, U_ICU_VERSION_MINOR_NUM, U_ICU_VERSION_PATCHLEVEL_NUM, 0)
+ VALUE "FileVersion", CommaVersionString(U_ICU_VERSION_MAJOR_NUM, U_ICU_VERSION_MINOR_NUM, U_ICU_VERSION_PATCHLEVEL_NUM, U_ICU_VERSION_BUILDLEVEL_NUM)
VALUE "LegalCopyright", U_COPYRIGHT_STRING "\0"
#ifdef _DEBUG
VALUE "OriginalFilename", "icuuc" U_ICU_VERSION_SHORT "d.dll\0")
@@ -82,7 +82,7 @@ BEGIN
#endif
VALUE "PrivateBuild", "\0"
VALUE "ProductName", "International Components for Unicode\0"
- VALUE "ProductVersion", CommaVersionString(U_ICU_VERSION_MAJOR_NUM, U_ICU_VERSION_MINOR_NUM, U_ICU_VERSION_PATCHLEVEL_NUM, 0)
+ VALUE "ProductVersion", CommaVersionString(U_ICU_VERSION_MAJOR_NUM, U_ICU_VERSION_MINOR_NUM, U_ICU_VERSION_PATCHLEVEL_NUM, U_ICU_VERSION_BUILDLEVEL_NUM)
VALUE "SpecialBuild", "\0"
END
END
diff --git a/icuSources/common/common.vcproj b/icuSources/common/common.vcproj
index 46026cde..a30a33c7 100644
--- a/icuSources/common/common.vcproj
+++ b/icuSources/common/common.vcproj
@@ -21,30 +21,29 @@
CharacterSet="2">
+ SuppressStartupBanner="TRUE"/>
+
+
+
+
@@ -204,10 +210,10 @@
Name="break iteration"
Filter="">
+ RelativePath=".\brkeng.cpp">
+ RelativePath=".\brkeng.h">
@@ -231,9 +237,6 @@
Outputs="..\..\include\unicode\$(InputFileName)"/>
-
-
+ RelativePath=".\dictbe.cpp">
+ RelativePath=".\dictbe.h">
@@ -323,6 +326,12 @@
+
+
+
+
@@ -345,6 +354,9 @@
Outputs="..\..\include\unicode\$(InputFileName)"/>
+
+
-
-
-
-
@@ -477,10 +483,23 @@
RelativePath=".\cpputils.h">
-
-
+ RelativePath=".\unicode\docmain.h">
+
+
+
+
+
+
@@ -603,6 +622,25 @@
+
+
+
+
+
+
+
+
@@ -626,6 +664,9 @@
Outputs="..\..\include\unicode\$(InputFileName)"/>
+
+
+
+
+
+
+
+
+
+
@@ -748,6 +808,24 @@
Outputs="..\..\include\unicode\$(InputFileName)"/>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -1582,22 +1669,34 @@
Name="registration"
Filter="">
+ RelativePath=".\serv.cpp">
+
+
+
+
+ RelativePath=".\servlkf.cpp">
+ RelativePath=".\servloc.h">
+ RelativePath=".\servls.cpp">
+ RelativePath=".\servnotf.cpp">
+ RelativePath=".\servnotf.h">
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -1850,6 +1971,28 @@
+
+
+
+
+
+
+
+
+
+
-
+
\ No newline at end of file
diff --git a/icuSources/common/cpputils.h b/icuSources/common/cpputils.h
index de09aea1..c1b439c7 100644
--- a/icuSources/common/cpputils.h
+++ b/icuSources/common/cpputils.h
@@ -1,7 +1,7 @@
/*
******************************************************************************
*
-* Copyright (C) 1997-2001, International Business Machines
+* Copyright (C) 1997-2006, International Business Machines
* Corporation and others. All Rights Reserved.
*
******************************************************************************
@@ -15,6 +15,7 @@
#define CPPUTILS_H
#include "unicode/utypes.h"
+#include "unicode/unistr.h"
#include "cmemory.h"
/*==========================================================================*/
@@ -63,4 +64,21 @@ uprv_arrayCopy(const UChar *src, int32_t srcStart,
UChar *dst, int32_t dstStart, int32_t count)
{ uprv_memcpy(dst+dstStart, src+srcStart, (size_t)(count * sizeof(*src))); }
+/**
+ * Copy an array of UnicodeString OBJECTS (not pointers).
+ * @internal
+ */
+static inline void
+uprv_arrayCopy(const U_NAMESPACE_QUALIFIER UnicodeString *src, U_NAMESPACE_QUALIFIER UnicodeString *dst, int32_t count)
+{ while(count-- > 0) *dst++ = *src++; }
+
+/**
+ * Copy an array of UnicodeString OBJECTS (not pointers).
+ * @internal
+ */
+static inline void
+uprv_arrayCopy(const U_NAMESPACE_QUALIFIER UnicodeString *src, int32_t srcStart,
+ U_NAMESPACE_QUALIFIER UnicodeString *dst, int32_t dstStart, int32_t count)
+{ uprv_arrayCopy(src+srcStart, dst+dstStart, count); }
+
#endif /* _CPPUTILS */
diff --git a/icuSources/common/cstring.h b/icuSources/common/cstring.h
index 5e156f17..6d2fd0e8 100644
--- a/icuSources/common/cstring.h
+++ b/icuSources/common/cstring.h
@@ -1,7 +1,7 @@
/*
******************************************************************************
*
-* Copyright (C) 1997-2004, International Business Machines
+* Copyright (C) 1997-2005, International Business Machines
* Corporation and others. All Rights Reserved.
*
******************************************************************************
@@ -62,7 +62,7 @@ uprv_ebcdictolower(char c);
#define uprv_strtod(source, end) U_STANDARD_CPP_NAMESPACE strtod(source, end)
#define uprv_strtoul(str, end, base) U_STANDARD_CPP_NAMESPACE strtoul(str, end, base)
#define uprv_strtol(str, end, base) U_STANDARD_CPP_NAMESPACE strtol(str, end, base)
-#ifdef WIN32
+#ifdef U_WINDOWS
# if defined(__BORLANDC__)
# define uprv_stricmp(str1, str2) U_STANDARD_CPP_NAMESPACE stricmp(str1, str2)
# define uprv_strnicmp(str1, str2, n) U_STANDARD_CPP_NAMESPACE strnicmp(str1, str2, n)
diff --git a/icuSources/common/dbbi.cpp b/icuSources/common/dbbi.cpp
deleted file mode 100644
index 2f83f6c3..00000000
--- a/icuSources/common/dbbi.cpp
+++ /dev/null
@@ -1,629 +0,0 @@
-/*
-**********************************************************************
-* Copyright (C) 1999-2004 IBM Corp. All rights reserved.
-**********************************************************************
-* Date Name Description
-* 12/1/99 rgillam Complete port from Java.
-* 01/13/2000 helena Added UErrorCode to ctors.
-**********************************************************************
-*/
-
-#include "unicode/utypes.h"
-
-#if !UCONFIG_NO_BREAK_ITERATION
-
-#include "unicode/dbbi.h"
-#include "unicode/schriter.h"
-#include "dbbi_tbl.h"
-#include "uvector.h"
-#include "cmemory.h"
-#include "uassert.h"
-
-U_NAMESPACE_BEGIN
-
-UOBJECT_DEFINE_RTTI_IMPLEMENTATION(DictionaryBasedBreakIterator)
-
-
-//------------------------------------------------------------------------------
-//
-// constructors
-//
-//------------------------------------------------------------------------------
-
-DictionaryBasedBreakIterator::DictionaryBasedBreakIterator() :
-RuleBasedBreakIterator() {
- init();
-}
-
-
-DictionaryBasedBreakIterator::DictionaryBasedBreakIterator(UDataMemory* rbbiData,
- const char* dictionaryFilename,
- UErrorCode& status)
-: RuleBasedBreakIterator(rbbiData, status)
-{
- init();
- if (U_FAILURE(status)) {return;};
- fTables = new DictionaryBasedBreakIteratorTables(dictionaryFilename, status);
- if (U_FAILURE(status)) {
- if (fTables != NULL) {
- fTables->removeReference();
- fTables = NULL;
- }
- return;
- }
- /* test for NULL */
- if(fTables == 0) {
- status = U_MEMORY_ALLOCATION_ERROR;
- return;
- }
-}
-
-
-DictionaryBasedBreakIterator::DictionaryBasedBreakIterator(const DictionaryBasedBreakIterator &other) :
-RuleBasedBreakIterator(other)
-{
- init();
- if (other.fTables != NULL) {
- fTables = other.fTables;
- fTables->addReference();
- }
-}
-
-
-
-
-//------------------------------------------------------------------------------
-//
-// Destructor
-//
-//------------------------------------------------------------------------------
-DictionaryBasedBreakIterator::~DictionaryBasedBreakIterator()
-{
- uprv_free(cachedBreakPositions);
- cachedBreakPositions = NULL;
- if (fTables != NULL) {fTables->removeReference();};
-}
-
-//------------------------------------------------------------------------------
-//
-// Assignment operator. Sets this iterator to have the same behavior,
-// and iterate over the same text, as the one passed in.
-//
-//------------------------------------------------------------------------------
-DictionaryBasedBreakIterator&
-DictionaryBasedBreakIterator::operator=(const DictionaryBasedBreakIterator& that) {
- if (this == &that) {
- return *this;
- }
- reset(); // clears out cached break positions.
- RuleBasedBreakIterator::operator=(that);
- if (this->fTables != that.fTables) {
- if (this->fTables != NULL) {this->fTables->removeReference();};
- this->fTables = that.fTables;
- if (this->fTables != NULL) {this->fTables->addReference();};
- }
- return *this;
-}
-
-//------------------------------------------------------------------------------
-//
-// Clone() Returns a newly-constructed RuleBasedBreakIterator with the same
-// behavior, and iterating over the same text, as this one.
-//
-//------------------------------------------------------------------------------
-BreakIterator*
-DictionaryBasedBreakIterator::clone() const {
- return new DictionaryBasedBreakIterator(*this);
-}
-
-//=======================================================================
-// BreakIterator overrides
-//=======================================================================
-
-/**
- * Advances the iterator one step backwards.
- * @return The position of the last boundary position before the
- * current iteration position
- */
-int32_t
-DictionaryBasedBreakIterator::previous()
-{
- // if we have cached break positions and we're still in the range
- // covered by them, just move one step backward in the cache
- if (cachedBreakPositions != NULL && positionInCache > 0) {
- --positionInCache;
- fText->setIndex(cachedBreakPositions[positionInCache]);
- return cachedBreakPositions[positionInCache];
- }
-
- // otherwise, dump the cache and use the inherited previous() method to move
- // backward. This may fill up the cache with new break positions, in which
- // case we have to mark our position in the cache
- else {
- reset();
- int32_t result = RuleBasedBreakIterator::previous();
- if (cachedBreakPositions != NULL) {
- for (positionInCache=0;
- cachedBreakPositions[positionInCache] != result;
- positionInCache++);
- U_ASSERT(positionInCache < numCachedBreakPositions);
- if (positionInCache >= numCachedBreakPositions) {
- // Something has gone wrong. Dump the cache.
- reset();
- }
- }
- return result;
- }
-}
-
-/**
- * Sets the current iteration position to the last boundary position
- * before the specified position.
- * @param offset The position to begin searching from
- * @return The position of the last boundary before "offset"
- */
-int32_t
-DictionaryBasedBreakIterator::preceding(int32_t offset)
-{
- // if the offset passed in is already past the end of the text,
- // just return DONE; if it's before the beginning, return the
- // text's starting offset
- if (fText == NULL || offset > fText->endIndex()) {
- return BreakIterator::DONE;
- }
- else if (offset < fText->startIndex()) {
- return fText->startIndex();
- }
-
- // if we have no cached break positions, or "offset" is outside the
- // range covered by the cache, we can just call the inherited routine
- // (which will eventually call other routines in this class that may
- // refresh the cache)
- if (cachedBreakPositions == NULL || offset <= cachedBreakPositions[0] ||
- offset > cachedBreakPositions[numCachedBreakPositions - 1]) {
- reset();
- return RuleBasedBreakIterator::preceding(offset);
- }
-
- // on the other hand, if "offset" is within the range covered by the cache,
- // then all we have to do is search the cache for the last break position
- // before "offset"
- else {
- positionInCache = 0;
- while (positionInCache < numCachedBreakPositions
- && offset > cachedBreakPositions[positionInCache])
- ++positionInCache;
- --positionInCache;
- fText->setIndex(cachedBreakPositions[positionInCache]);
- return fText->getIndex();
- }
-}
-
-/**
- * Sets the current iteration position to the first boundary position after
- * the specified position.
- * @param offset The position to begin searching forward from
- * @return The position of the first boundary after "offset"
- */
-int32_t
-DictionaryBasedBreakIterator::following(int32_t offset)
-{
- // if the offset passed in is already past the end of the text,
- // just return DONE; if it's before the beginning, return the
- // text's starting offset
- if (fText == NULL || offset > fText->endIndex()) {
- return BreakIterator::DONE;
- }
- else if (offset < fText->startIndex()) {
- return fText->startIndex();
- }
-
- // if we have no cached break positions, or if "offset" is outside the
- // range covered by the cache, then dump the cache and call our
- // inherited following() method. This will call other methods in this
- // class that may refresh the cache.
- if (cachedBreakPositions == NULL || offset < cachedBreakPositions[0] ||
- offset >= cachedBreakPositions[numCachedBreakPositions - 1]) {
- reset();
- return RuleBasedBreakIterator::following(offset);
- }
-
- // on the other hand, if "offset" is within the range covered by the
- // cache, then just search the cache for the first break position
- // after "offset"
- else {
- positionInCache = 0;
- while (positionInCache < numCachedBreakPositions
- && offset >= cachedBreakPositions[positionInCache])
- ++positionInCache;
- fText->setIndex(cachedBreakPositions[positionInCache]);
- return fText->getIndex();
- }
-}
-
-/**
- * This is the implementation function for next().
- */
-int32_t
-DictionaryBasedBreakIterator::handleNext()
-{
- UErrorCode status = U_ZERO_ERROR;
- // if there are no cached break positions, or if we've just moved
- // off the end of the range covered by the cache, we have to dump
- // and possibly regenerate the cache
- if (cachedBreakPositions == NULL || positionInCache == numCachedBreakPositions - 1) {
-
- // start by using the inherited handleNext() to find a tentative return
- // value. dictionaryCharCount tells us how many dictionary characters
- // we passed over on our way to the tentative return value
- int32_t startPos = fText->getIndex();
- fDictionaryCharCount = 0;
- int32_t result = RuleBasedBreakIterator::handleNext();
-
- // if we passed over more than one dictionary character, then we use
- // divideUpDictionaryRange() to regenerate the cached break positions
- // for the new range
- if (fDictionaryCharCount > 1 && result - startPos > 1) {
- divideUpDictionaryRange(startPos, result, status);
- U_ASSERT(U_SUCCESS(status));
- if (U_FAILURE(status)) {
- // Something went badly wrong, an internal error.
- // We have no way from here to report it to caller.
- // Treat as if this is if the dictionary did not apply to range.
- reset();
- return result;
- }
- }
-
- // otherwise, the value we got back from the inherited fuction
- // is our return value, and we can dump the cache
- else {
- reset();
- return result;
- }
- }
-
- // if the cache of break positions has been regenerated (or existed all
- // along), then just advance to the next break position in the cache
- // and return it
- if (cachedBreakPositions != NULL) {
- ++positionInCache;
- fText->setIndex(cachedBreakPositions[positionInCache]);
- return cachedBreakPositions[positionInCache];
- }
- return -9999; // SHOULD NEVER GET HERE!
-}
-
-void
-DictionaryBasedBreakIterator::reset()
-{
- uprv_free(cachedBreakPositions);
- cachedBreakPositions = NULL;
- numCachedBreakPositions = 0;
- fDictionaryCharCount = 0;
- positionInCache = 0;
-}
-
-
-
-//------------------------------------------------------------------------------
-//
-// init() Common initialization routine, for use by constructors, etc.
-//
-//------------------------------------------------------------------------------
-void DictionaryBasedBreakIterator::init() {
- cachedBreakPositions = NULL;
- fTables = NULL;
- numCachedBreakPositions = 0;
- fDictionaryCharCount = 0;
- positionInCache = 0;
-}
-
-
-//------------------------------------------------------------------------------
-//
-// BufferClone
-//
-//------------------------------------------------------------------------------
-BreakIterator * DictionaryBasedBreakIterator::createBufferClone(void *stackBuffer,
- int32_t &bufferSize,
- UErrorCode &status)
-{
- if (U_FAILURE(status)){
- return NULL;
- }
-
- //
- // If user buffer size is zero this is a preflight operation to
- // obtain the needed buffer size, allowing for worst case misalignment.
- //
- if (bufferSize == 0) {
- bufferSize = sizeof(DictionaryBasedBreakIterator) + U_ALIGNMENT_OFFSET_UP(0);
- return NULL;
- }
-
- //
- // Check the alignment and size of the user supplied buffer.
- // Allocate heap memory if the user supplied memory is insufficient.
- //
- char *buf = (char *)stackBuffer;
- uint32_t s = bufferSize;
-
- if (stackBuffer == NULL) {
- s = 0; // Ignore size, force allocation if user didn't give us a buffer.
- }
- if (U_ALIGNMENT_OFFSET(stackBuffer) != 0) {
- int32_t offsetUp = (int32_t)U_ALIGNMENT_OFFSET_UP(buf);
- s -= offsetUp;
- buf += offsetUp;
- }
- if (s < sizeof(DictionaryBasedBreakIterator)) {
- buf = (char *) new DictionaryBasedBreakIterator();
- if (buf == 0) {
- status = U_MEMORY_ALLOCATION_ERROR;
- return NULL;
- }
- status = U_SAFECLONE_ALLOCATED_WARNING;
- }
-
- //
- // Initialize the clone object.
- // TODO: using an overloaded C++ "operator new" to directly initialize the
- // copy in the user's buffer would be better, but it doesn't seem
- // to get along with namespaces. Investigate why.
- //
- // The memcpy is only safe with an empty (default constructed)
- // break iterator. Use on others can screw up reference counts
- // to data. memcpy-ing objects is not really a good idea...
- //
- DictionaryBasedBreakIterator localIter; // Empty break iterator, source for memcpy
- DictionaryBasedBreakIterator *clone = (DictionaryBasedBreakIterator *)buf;
- uprv_memcpy(clone, &localIter, sizeof(DictionaryBasedBreakIterator)); // clone = empty, but initialized, iterator.
- *clone = *this; // clone = the real one we want.
- if (status != U_SAFECLONE_ALLOCATED_WARNING) {
- clone->fBufferClone = TRUE;
- }
- return clone;
-}
-
-
-
-
-/**
- * This is the function that actually implements the dictionary-based
- * algorithm. Given the endpoints of a range of text, it uses the
- * dictionary to determine the positions of any boundaries in this
- * range. It stores all the boundary positions it discovers in
- * cachedBreakPositions so that we only have to do this work once
- * for each time we enter the range.
- */
-void
-DictionaryBasedBreakIterator::divideUpDictionaryRange(int32_t startPos, int32_t endPos, UErrorCode &status)
-{
- // the range we're dividing may begin or end with non-dictionary characters
- // (i.e., for line breaking, we may have leading or trailing punctuation
- // that needs to be kept with the word). Seek from the beginning of the
- // range to the first dictionary character
- fText->setIndex(startPos);
- UChar c = fText->current();
- while (isDictionaryChar(c) == FALSE) {
- c = fText->next();
- }
-
- if (U_FAILURE(status)) {
- return; // UStack below overwrites the status error codes
- }
-
- // initialize. We maintain two stacks: currentBreakPositions contains
- // the list of break positions that will be returned if we successfully
- // finish traversing the whole range now. possibleBreakPositions lists
- // all other possible word ends we've passed along the way. (Whenever
- // we reach an error [a sequence of characters that can't begin any word
- // in the dictionary], we back up, possibly delete some breaks from
- // currentBreakPositions, move a break from possibleBreakPositions
- // to currentBreakPositions, and start over from there. This process
- // continues in this way until we either successfully make it all the way
- // across the range, or exhaust all of our combinations of break
- // positions.) wrongBreakPositions is used to keep track of paths we've
- // tried on previous iterations. As the iterator backs up further and
- // further, this saves us from having to follow each possible path
- // through the text all the way to the error (hopefully avoiding many
- // future recursive calls as well).
- // there can be only one kind of error in UStack and UVector, so we'll
- // just let the error fall through
- UStack currentBreakPositions(status);
- UStack possibleBreakPositions(status);
- UVector wrongBreakPositions(status);
-
- // the dictionary is implemented as a trie, which is treated as a state
- // machine. -1 represents the end of a legal word. Every word in the
- // dictionary is represented by a path from the root node to -1. A path
- // that ends in state 0 is an illegal combination of characters.
- int16_t state = 0;
-
- // these two variables are used for error handling. We keep track of the
- // farthest we've gotten through the range being divided, and the combination
- // of breaks that got us that far. If we use up all possible break
- // combinations, the text contains an error or a word that's not in the
- // dictionary. In this case, we "bless" the break positions that got us the
- // farthest as real break positions, and then start over from scratch with
- // the character where the error occurred.
- int32_t farthestEndPoint = fText->getIndex();
- UStack bestBreakPositions(status);
- UBool bestBreakPositionsInitialized = FALSE;
-
- if (U_FAILURE(status)) {
- return;
- }
- // initialize (we always exit the loop with a break statement)
- c = fText->current();
- for (;;) {
-
- // if we can transition to state "-1" from our current state, we're
- // on the last character of a legal word. Push that position onto
- // the possible-break-positions stack
- if (fTables->fDictionary->at(state, (int32_t)0) == -1) {
- possibleBreakPositions.push(fText->getIndex(), status);
- if (U_FAILURE(status)) {
- return;
- }
- }
-
- // look up the new state to transition to in the dictionary
- state = fTables->fDictionary->at(state, c);
-
- // if the character we're sitting on causes us to transition to
- // the "end of word" state, then it was a non-dictionary character
- // and we've successfully traversed the whole range. Drop out
- // of the loop.
- if (state == -1) {
- currentBreakPositions.push(fText->getIndex(), status);
- if (U_FAILURE(status)) {
- return;
- }
- break;
- }
-
- // if the character we're sitting on causes us to transition to
- // the error state, or if we've gone off the end of the range
- // without transitioning to the "end of word" state, we've hit
- // an error...
- else if (state == 0 || fText->getIndex() >= endPos) {
-
- // if this is the farthest we've gotten, take note of it in
- // case there's an error in the text
- if (fText->getIndex() > farthestEndPoint) {
- farthestEndPoint = fText->getIndex();
- bestBreakPositions.removeAllElements();
- bestBreakPositionsInitialized = TRUE;
- for (int32_t i = 0; i < currentBreakPositions.size(); i++) {
- bestBreakPositions.push(currentBreakPositions.elementAti(i), status);
- }
- }
-
- // wrongBreakPositions is a list of all break positions we've tried starting
- // that didn't allow us to traverse all the way through the text. Every time
- // we pop a break position off of currentBreakPositions, we put it into
- // wrongBreakPositions to avoid trying it again later. If we make it to this
- // spot, we're either going to back up to a break in possibleBreakPositions
- // and try starting over from there, or we've exhausted all possible break
- // positions and are going to do the fallback procedure. This loop prevents
- // us from messing with anything in possibleBreakPositions that didn't work as
- // a starting point the last time we tried it (this is to prevent a bunch of
- // repetitive checks from slowing down some extreme cases)
- while (!possibleBreakPositions.isEmpty() && wrongBreakPositions.contains(
- possibleBreakPositions.peeki())) {
- possibleBreakPositions.popi();
- }
-
- // if we've used up all possible break-position combinations, there's
- // an error or an unknown word in the text. In this case, we start
- // over, treating the farthest character we've reached as the beginning
- // of the range, and "blessing" the break positions that got us that
- // far as real break positions
- if (possibleBreakPositions.isEmpty()) {
- if (bestBreakPositionsInitialized) {
- currentBreakPositions.removeAllElements();
- for (int32_t i = 0; i < bestBreakPositions.size(); i++) {
- currentBreakPositions.push(bestBreakPositions.elementAti(i), status);
- if (U_FAILURE(status)) {
- return;
- }
- }
- bestBreakPositions.removeAllElements();
- if (farthestEndPoint < endPos) {
- fText->setIndex(farthestEndPoint + 1);
- }
- else {
- break;
- }
- }
- else {
- if ((currentBreakPositions.isEmpty()
- || currentBreakPositions.peeki() != fText->getIndex())
- && fText->getIndex() != startPos) {
- currentBreakPositions.push(fText->getIndex(), status);
- if (U_FAILURE(status)) {
- return;
- }
- }
- fText->next();
- currentBreakPositions.push(fText->getIndex(), status);
- if (U_FAILURE(status)) {
- return;
- }
- }
- }
-
- // if we still have more break positions we can try, then promote the
- // last break in possibleBreakPositions into currentBreakPositions,
- // and get rid of all entries in currentBreakPositions that come after
- // it. Then back up to that position and start over from there (i.e.,
- // treat that position as the beginning of a new word)
- else {
- int32_t temp = possibleBreakPositions.popi();
- int32_t temp2 = 0;
- while (!currentBreakPositions.isEmpty() && temp <
- currentBreakPositions.peeki()) {
- temp2 = currentBreakPositions.popi();
- wrongBreakPositions.addElement(temp2, status);
- }
- currentBreakPositions.push(temp, status);
- fText->setIndex(currentBreakPositions.peeki());
- }
-
- // re-sync "c" for the next go-round, and drop out of the loop if
- // we've made it off the end of the range
- c = fText->current();
- if (fText->getIndex() >= endPos) {
- break;
- }
- }
-
- // if we didn't hit any exceptional conditions on this last iteration,
- // just advance to the next character and loop
- else {
- c = fText->next();
- }
- }
-
- // dump the last break position in the list, and replace it with the actual
- // end of the range (which may be the same character, or may be further on
- // because the range actually ended with non-dictionary characters we want to
- // keep with the word)
- if (!currentBreakPositions.isEmpty()) {
- currentBreakPositions.popi();
- }
- currentBreakPositions.push(endPos, status);
- if (U_FAILURE(status)) {
- return;
- }
-
- // create a regular array to hold the break positions and copy
- // the break positions from the stack to the array (in addition,
- // our starting position goes into this array as a break position).
- // This array becomes the cache of break positions used by next()
- // and previous(), so this is where we actually refresh the cache.
- if (cachedBreakPositions != NULL) {
- uprv_free(cachedBreakPositions);
- }
- cachedBreakPositions = (int32_t *)uprv_malloc((currentBreakPositions.size() + 1) * sizeof(int32_t));
- /* Test for NULL */
- if(cachedBreakPositions == NULL) {
- status = U_MEMORY_ALLOCATION_ERROR;
- return;
- }
- numCachedBreakPositions = currentBreakPositions.size() + 1;
- cachedBreakPositions[0] = startPos;
-
- for (int32_t i = 0; i < currentBreakPositions.size(); i++) {
- cachedBreakPositions[i + 1] = currentBreakPositions.elementAti(i);
- }
- positionInCache = 0;
-}
-
-U_NAMESPACE_END
-
-#endif /* #if !UCONFIG_NO_BREAK_ITERATION */
-
-/* eof */
diff --git a/icuSources/common/dbbi_tbl.cpp b/icuSources/common/dbbi_tbl.cpp
deleted file mode 100644
index 29eb3eb8..00000000
--- a/icuSources/common/dbbi_tbl.cpp
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
-**********************************************************************
-* Copyright (C) 1999-2002 IBM Corp. All rights reserved.
-**********************************************************************
-* Date Name Description
-* 12/1/99 rgillam Complete port from Java.
-* 01/13/2000 helena Added UErrorCode to ctors.
-* 06/14/2002 andy Gutted for new RBBI impl.
-**********************************************************************
-*/
-
-#include "unicode/utypes.h"
-
-#if !UCONFIG_NO_BREAK_ITERATION
-
-#include "dbbi_tbl.h"
-#include "unicode/dbbi.h"
-#include "umutex.h"
-
-U_NAMESPACE_BEGIN
-
-//=======================================================================
-// constructor
-//=======================================================================
-
-DictionaryBasedBreakIteratorTables::DictionaryBasedBreakIteratorTables(
- const char* dictionaryFilename,
- UErrorCode &status) {
- fDictionary = new BreakDictionary(dictionaryFilename, status);
- fRefCount = 1;
-}
-
-
-void DictionaryBasedBreakIteratorTables::addReference() {
- umtx_atomic_inc(&fRefCount);
-}
-
-
-void DictionaryBasedBreakIteratorTables::removeReference() {
- if (umtx_atomic_dec(&fRefCount) == 0) {
- delete this;
- }
-}
-
-
-/**
- * Destructor
- */
-DictionaryBasedBreakIteratorTables::~DictionaryBasedBreakIteratorTables() {
- delete fDictionary;
- fDictionary = NULL;
-}
-
-
-U_NAMESPACE_END
-
-#endif /* #if !UCONFIG_NO_BREAK_ITERATION */
-
-/* eof */
diff --git a/icuSources/common/dbbi_tbl.h b/icuSources/common/dbbi_tbl.h
deleted file mode 100644
index 70728e3f..00000000
--- a/icuSources/common/dbbi_tbl.h
+++ /dev/null
@@ -1,90 +0,0 @@
-/*
-**********************************************************************
-* Copyright (C) 1999-2000 IBM Corp. All rights reserved.
-**********************************************************************
-* Date Name Description
-* 12/1/99 rgillam Complete port from Java.
-* 01/13/2000 helena Added UErrorCode to ctors.
-**********************************************************************
-*/
-
-#ifndef DBBI_TBL_H
-#define DBBI_TBL_H
-
-#include "unicode/utypes.h"
-#include "unicode/uobject.h"
-#include "unicode/udata.h"
-#include "brkdict.h"
-
-U_NAMESPACE_BEGIN
-
-/* forward declaration */
-class DictionaryBasedBreakIterator;
-
-//
-// DictionaryBasedBreakIteratorTables
-//
-// This class sits between instances of DictionaryBasedBreakIterator
-// and the dictionary data itself, which is of type BreakDictionary.
-// It provides reference counting, allowing multiple copies of a
-// DictionaryBasedBreakIterator to share a single instance of
-// BreakDictionary.
-//
-// TODO: it'd probably be cleaner to add the reference counting to
-// BreakDictionary and get rid of this class, but doing it this way
-// was a convenient transition from earlier code, and time is short...
-//
-class DictionaryBasedBreakIteratorTables : public UMemory {
-
-private:
- int32_t fRefCount;
-
-
-public:
- //=======================================================================
- // constructor
- //=======================================================================
- /* @param dictionaryFilename The name of the dictionary file
- * @param status The error code
- * @return the newly created DictionaryBasedBreakIteratorTables
- **/
- DictionaryBasedBreakIteratorTables(const char* dictionaryFilename,
- UErrorCode& status);
-
- BreakDictionary *fDictionary;
- void addReference();
- void removeReference();
- /**
- * Destructor. Should not be used directly. Use removeReference() istead.
- * (Not private to avoid compiler warnings.)
- */
- virtual ~DictionaryBasedBreakIteratorTables();
-
-private:
- /**
- * The copy constructor is declared private and not implemented.
- * THIS CLASS MAY NOT BE COPIED.
- * @param that The DictionaryBasedBreakIteratorTables to be copied.
- * @return the newly constructed DictionaryBasedBreakIteratorTables.
- */
- DictionaryBasedBreakIteratorTables(const DictionaryBasedBreakIteratorTables& that);
-
- //=======================================================================
- // boilerplate
- //=======================================================================
-
-
- /**
- * The assignment operator is declared private and not implemented.
- * THIS CLASS MAY NOT BE COPIED.
- * Call addReference() and share an existing copy instead.
- * @that The object to be copied
- * @return the newly created DictionaryBasedBreakIteratorTables.
- */
- DictionaryBasedBreakIteratorTables& operator=(
- const DictionaryBasedBreakIteratorTables& that);
-};
-
-U_NAMESPACE_END
-
-#endif
diff --git a/icuSources/common/dictbe.cpp b/icuSources/common/dictbe.cpp
new file mode 100644
index 00000000..ac774f7c
--- /dev/null
+++ b/icuSources/common/dictbe.cpp
@@ -0,0 +1,418 @@
+/**
+ *******************************************************************************
+ * Copyright (C) 2006, International Business Machines Corporation and others. *
+ * All Rights Reserved. *
+ *******************************************************************************
+ */
+
+#include "unicode/utypes.h"
+
+#if !UCONFIG_NO_BREAK_ITERATION
+
+#include "brkeng.h"
+#include "dictbe.h"
+#include "unicode/uniset.h"
+#include "unicode/chariter.h"
+#include "unicode/ubrk.h"
+#include "uvector.h"
+#include "triedict.h"
+
+U_NAMESPACE_BEGIN
+
+/*
+ ******************************************************************
+ */
+
+/*DictionaryBreakEngine::DictionaryBreakEngine() {
+ fTypes = 0;
+}*/
+
+DictionaryBreakEngine::DictionaryBreakEngine(uint32_t breakTypes) {
+ fTypes = breakTypes;
+}
+
+DictionaryBreakEngine::~DictionaryBreakEngine() {
+}
+
+UBool
+DictionaryBreakEngine::handles(UChar32 c, int32_t breakType) const {
+ return (breakType >= 0 && breakType < 32 && (((uint32_t)1 << breakType) & fTypes)
+ && fSet.contains(c));
+}
+
+int32_t
+DictionaryBreakEngine::findBreaks( UText *text,
+ int32_t startPos,
+ int32_t endPos,
+ UBool reverse,
+ int32_t breakType,
+ UStack &foundBreaks ) const {
+ int32_t result = 0;
+
+ // Find the span of characters included in the set.
+ int32_t start = (int32_t)utext_getNativeIndex(text);
+ int32_t current;
+ int32_t rangeStart;
+ int32_t rangeEnd;
+ UChar32 c = utext_current32(text);
+ if (reverse) {
+ UBool isDict = fSet.contains(c);
+ while((current = (int32_t)utext_getNativeIndex(text)) > startPos && isDict) {
+ c = utext_previous32(text);
+ isDict = fSet.contains(c);
+ }
+ rangeStart = (current < startPos) ? startPos : current+(isDict ? 0 : 1);
+ rangeEnd = start + 1;
+ }
+ else {
+ while((current = (int32_t)utext_getNativeIndex(text)) < endPos && fSet.contains(c)) {
+ utext_next32(text); // TODO: recast loop for postincrement
+ c = utext_current32(text);
+ }
+ rangeStart = start;
+ rangeEnd = current;
+ }
+ if (breakType >= 0 && breakType < 32 && (((uint32_t)1 << breakType) & fTypes)) {
+ result = divideUpDictionaryRange(text, rangeStart, rangeEnd, foundBreaks);
+ utext_setNativeIndex(text, current);
+ }
+
+ return result;
+}
+
+void
+DictionaryBreakEngine::setCharacters( UnicodeSet &set ) {
+ fSet = set;
+}
+
+/*void
+DictionaryBreakEngine::setBreakTypes( uint32_t breakTypes ) {
+ fTypes = breakTypes;
+}*/
+
+/*
+ ******************************************************************
+ */
+
+
+// Helper class for improving readability of the Thai word break
+// algorithm. The implementation is completely inline.
+
+// List size, limited by the maximum number of words in the dictionary
+// that form a nested sequence.
+#define POSSIBLE_WORD_LIST_MAX 20
+
+class PossibleWord {
+ private:
+ // list of word candidate lengths, in increasing length order
+ int32_t lengths[POSSIBLE_WORD_LIST_MAX];
+ int count; // Count of candidates
+ int32_t prefix; // The longest match with a dictionary word
+ int32_t offset; // Offset in the text of these candidates
+ int mark; // The preferred candidate's offset
+ int current; // The candidate we're currently looking at
+
+ public:
+ PossibleWord();
+ ~PossibleWord();
+
+ // Fill the list of candidates if needed, select the longest, and return the number found
+ int candidates( UText *text, const TrieWordDictionary *dict, int32_t rangeEnd );
+
+ // Select the currently marked candidate, point after it in the text, and invalidate self
+ int32_t acceptMarked( UText *text );
+
+ // Back up from the current candidate to the next shorter one; return TRUE if that exists
+ // and point the text after it
+ UBool backUp( UText *text );
+
+ // Return the longest prefix this candidate location shares with a dictionary word
+ int32_t longestPrefix();
+
+ // Mark the current candidate as the one we like
+ void markCurrent();
+};
+
+inline
+PossibleWord::PossibleWord() {
+ offset = -1;
+}
+
+inline
+PossibleWord::~PossibleWord() {
+}
+
+inline int
+PossibleWord::candidates( UText *text, const TrieWordDictionary *dict, int32_t rangeEnd ) {
+ // TODO: If getIndex is too slow, use offset < 0 and add discardAll()
+ int32_t start = (int32_t)utext_getNativeIndex(text);
+ if (start != offset) {
+ offset = start;
+ prefix = dict->matches(text, rangeEnd-start, lengths, count, sizeof(lengths)/sizeof(lengths[0]));
+ // Dictionary leaves text after longest prefix, not longest word. Back up.
+ if (count <= 0) {
+ utext_setNativeIndex(text, start);
+ }
+ }
+ if (count > 0) {
+ utext_setNativeIndex(text, start+lengths[count-1]);
+ }
+ current = count-1;
+ mark = current;
+ return count;
+}
+
+inline int32_t
+PossibleWord::acceptMarked( UText *text ) {
+ utext_setNativeIndex(text, offset + lengths[mark]);
+ return lengths[mark];
+}
+
+inline UBool
+PossibleWord::backUp( UText *text ) {
+ if (current > 0) {
+ utext_setNativeIndex(text, offset + lengths[--current]);
+ return TRUE;
+ }
+ return FALSE;
+}
+
+inline int32_t
+PossibleWord::longestPrefix() {
+ return prefix;
+}
+
+inline void
+PossibleWord::markCurrent() {
+ mark = current;
+}
+
+// How many words in a row are "good enough"?
+#define THAI_LOOKAHEAD 3
+
+// Will not combine a non-word with a preceding dictionary word longer than this
+#define THAI_ROOT_COMBINE_THRESHOLD 3
+
+// Will not combine a non-word that shares at least this much prefix with a
+// dictionary word, with a preceding word
+#define THAI_PREFIX_COMBINE_THRESHOLD 3
+
+// Ellision character
+#define THAI_PAIYANNOI 0x0E2F
+
+// Repeat character
+#define THAI_MAIYAMOK 0x0E46
+
+// Minimum word size
+#define THAI_MIN_WORD 2
+
+// Minimum number of characters for two words
+#define THAI_MIN_WORD_SPAN (THAI_MIN_WORD * 2)
+
+ThaiBreakEngine::ThaiBreakEngine(const TrieWordDictionary *adoptDictionary, UErrorCode &status)
+ : DictionaryBreakEngine((1< 1) {
+ // If we're already at the end of the range, we're done
+ if ((int32_t)utext_getNativeIndex(text) >= rangeEnd) {
+ goto foundBest;
+ }
+ do {
+ int wordsMatched = 1;
+ if (words[(wordsFound+1)%THAI_LOOKAHEAD].candidates(text, fDictionary, rangeEnd) > 0) {
+ if (wordsMatched < 2) {
+ // Followed by another dictionary word; mark first word as a good candidate
+ words[wordsFound%THAI_LOOKAHEAD].markCurrent();
+ wordsMatched = 2;
+ }
+
+ // If we're already at the end of the range, we're done
+ if ((int32_t)utext_getNativeIndex(text) >= rangeEnd) {
+ goto foundBest;
+ }
+
+ // See if any of the possible second words is followed by a third word
+ do {
+ // If we find a third word, stop right away
+ if (words[(wordsFound+2)%THAI_LOOKAHEAD].candidates(text, fDictionary, rangeEnd)) {
+ words[wordsFound%THAI_LOOKAHEAD].markCurrent();
+ goto foundBest;
+ }
+ }
+ while (words[(wordsFound+1)%THAI_LOOKAHEAD].backUp(text));
+ }
+ }
+ while (words[wordsFound%THAI_LOOKAHEAD].backUp(text));
+foundBest:
+ wordLength = words[wordsFound%THAI_LOOKAHEAD].acceptMarked(text);
+ wordsFound += 1;
+ }
+
+ // We come here after having either found a word or not. We look ahead to the
+ // next word. If it's not a dictionary word, we will combine it withe the word we
+ // just found (if there is one), but only if the preceding word does not exceed
+ // the threshold.
+ // The text iterator should now be positioned at the end of the word we found.
+ if ((int32_t)utext_getNativeIndex(text) < rangeEnd && wordLength < THAI_ROOT_COMBINE_THRESHOLD) {
+ // if it is a dictionary word, do nothing. If it isn't, then if there is
+ // no preceding word, or the non-word shares less than the minimum threshold
+ // of characters with a dictionary word, then scan to resynchronize
+ if (words[wordsFound%THAI_LOOKAHEAD].candidates(text, fDictionary, rangeEnd) <= 0
+ && (wordLength == 0
+ || words[wordsFound%THAI_LOOKAHEAD].longestPrefix() < THAI_PREFIX_COMBINE_THRESHOLD)) {
+ // Look for a plausible word boundary
+ //TODO: This section will need a rework for UText.
+ int32_t remaining = rangeEnd - (current+wordLength);
+ UChar32 pc = utext_current32(text);
+ int32_t chars = 0;
+ while (TRUE) {
+ utext_next32(text);
+ uc = utext_current32(text);
+ // TODO: Here we're counting on the fact that the SA languages are all
+ // in the BMP. This should get fixed with the UText rework.
+ chars += 1;
+ if (--remaining <= 0) {
+ break;
+ }
+ if (fEndWordSet.contains(pc) && fBeginWordSet.contains(uc)) {
+ // Maybe. See if it's in the dictionary.
+ // NOTE: In the original Apple code, checked that the next
+ // two characters after uc were not 0x0E4C THANTHAKHAT before
+ // checking the dictionary. That is just a performance filter,
+ // but it's not clear it's faster than checking the trie.
+ int candidates = words[(wordsFound+1)%THAI_LOOKAHEAD].candidates(text, fDictionary, rangeEnd);
+ utext_setNativeIndex(text, current+wordLength+chars);
+ if (candidates > 0) {
+ break;
+ }
+ }
+ pc = uc;
+ }
+
+ // Bump the word count if there wasn't already one
+ if (wordLength <= 0) {
+ wordsFound += 1;
+ }
+
+ // Update the length with the passed-over characters
+ wordLength += chars;
+ }
+ else {
+ // Back up to where we were for next iteration
+ utext_setNativeIndex(text, current+wordLength);
+ }
+ }
+
+ // Never stop before a combining mark.
+ int32_t currPos;
+ while ((currPos = (int32_t)utext_getNativeIndex(text)) < rangeEnd && fMarkSet.contains(utext_current32(text))) {
+ utext_next32(text);
+ wordLength += (int32_t)utext_getNativeIndex(text) - currPos;
+ }
+
+ // Look ahead for possible suffixes if a dictionary word does not follow.
+ // We do this in code rather than using a rule so that the heuristic
+ // resynch continues to function. For example, one of the suffix characters
+ // could be a typo in the middle of a word.
+ if ((int32_t)utext_getNativeIndex(text) < rangeEnd && wordLength > 0) {
+ if (words[wordsFound%THAI_LOOKAHEAD].candidates(text, fDictionary, rangeEnd) <= 0
+ && fSuffixSet.contains(uc = utext_current32(text))) {
+ if (uc == THAI_PAIYANNOI) {
+ if (!fSuffixSet.contains(utext_previous32(text))) {
+ // Skip over previous end and PAIYANNOI
+ utext_next32(text);
+ utext_next32(text);
+ wordLength += 1; // Add PAIYANNOI to word
+ uc = utext_current32(text); // Fetch next character
+ }
+ else {
+ // Restore prior position
+ utext_next32(text);
+ }
+ }
+ if (uc == THAI_MAIYAMOK) {
+ if (utext_previous32(text) != THAI_MAIYAMOK) {
+ // Skip over previous end and MAIYAMOK
+ utext_next32(text);
+ utext_next32(text);
+ wordLength += 1; // Add MAIYAMOK to word
+ }
+ else {
+ // Restore prior position
+ utext_next32(text);
+ }
+ }
+ }
+ else {
+ utext_setNativeIndex(text, current+wordLength);
+ }
+ }
+
+ // Did we find a word on this iteration? If so, push it on the break stack
+ if (wordLength > 0) {
+ foundBreaks.push((current+wordLength), status);
+ }
+ }
+
+ // Don't return a break for the end of the dictionary range if there is one there.
+ if (foundBreaks.peeki() >= rangeEnd) {
+ (void) foundBreaks.popi();
+ wordsFound -= 1;
+ }
+
+ return wordsFound;
+}
+
+U_NAMESPACE_END
+
+#endif /* #if !UCONFIG_NO_BREAK_ITERATION */
diff --git a/icuSources/common/dictbe.h b/icuSources/common/dictbe.h
new file mode 100644
index 00000000..80a52f57
--- /dev/null
+++ b/icuSources/common/dictbe.h
@@ -0,0 +1,193 @@
+/**
+ *******************************************************************************
+ * Copyright (C) 2006, International Business Machines Corporation and others. *
+ * All Rights Reserved. *
+ *******************************************************************************
+ */
+
+#ifndef DICTBE_H
+#define DICTBE_H
+
+#include "unicode/utypes.h"
+#include "unicode/uniset.h"
+#include "unicode/utext.h"
+
+#include "brkeng.h"
+
+U_NAMESPACE_BEGIN
+
+class TrieWordDictionary;
+
+/*******************************************************************
+ * DictionaryBreakEngine
+ */
+
+/**
+ * DictionaryBreakEngine is a kind of LanguageBreakEngine that uses a
+ * dictionary to determine language-specific breaks.
+ *
+ * After it is constructed a DictionaryBreakEngine may be shared between
+ * threads without synchronization.
+ */
+class DictionaryBreakEngine : public LanguageBreakEngine {
+ private:
+ /**
+ * The set of characters handled by this engine
+ * @internal
+ */
+
+ UnicodeSet fSet;
+
+ /**
+ * The set of break types handled by this engine
+ * @internal
+ */
+
+ uint32_t fTypes;
+
+ /**
+ * Default constructor.
+ *
+ */
+ DictionaryBreakEngine();
+
+ public:
+
+ /**
+ * Constructor setting the break types handled.
+ *
+ * @param breakTypes A bitmap of types handled by the engine.
+ */
+ DictionaryBreakEngine( uint32_t breakTypes );
+
+ /**
+ * Virtual destructor.
+ */
+ virtual ~DictionaryBreakEngine();
+
+ /**
+ * Indicate whether this engine handles a particular character for
+ * a particular kind of break.
+ *
+ * @param c A character which begins a run that the engine might handle
+ * @param breakType The type of text break which the caller wants to determine
+ * @return TRUE if this engine handles the particular character and break
+ * type.
+ */
+ virtual UBool handles( UChar32 c, int32_t breakType ) const;
+
+ /**
+ * Find any breaks within a run in the supplied text.
+ *
+ * @param text A UText representing the text. The
+ * iterator is left at the end of the run of characters which the engine
+ * is capable of handling.
+ * @param startPos The start of the run within the supplied text.
+ * @param endPos The end of the run within the supplied text.
+ * @param reverse Whether the caller is looking for breaks in a reverse
+ * direction.
+ * @param breakType The type of break desired, or -1.
+ * @param foundBreaks An allocated C array of the breaks found, if any
+ * @return The number of breaks found.
+ */
+ virtual int32_t findBreaks( UText *text,
+ int32_t startPos,
+ int32_t endPos,
+ UBool reverse,
+ int32_t breakType,
+ UStack &foundBreaks ) const;
+
+ protected:
+
+ /**
+ * Set the character set handled by this engine.
+ *
+ * @param set A UnicodeSet of the set of characters handled by the engine
+ */
+ virtual void setCharacters( UnicodeSet &set );
+
+ /**
+ * Set the break types handled by this engine.
+ *
+ * @param breakTypes A bitmap of types handled by the engine.
+ */
+// virtual void setBreakTypes( uint32_t breakTypes );
+
+ /**
+ * Divide up a range of known dictionary characters.
+ *
+ * @param text A UText representing the text
+ * @param rangeStart The start of the range of dictionary characters
+ * @param rangeEnd The end of the range of dictionary characters
+ * @param foundBreaks Output of C array of int32_t break positions, or 0
+ * @return The number of breaks found
+ */
+ virtual int32_t divideUpDictionaryRange( UText *text,
+ int32_t rangeStart,
+ int32_t rangeEnd,
+ UStack &foundBreaks ) const = 0;
+
+};
+
+/*******************************************************************
+ * ThaiBreakEngine
+ */
+
+/**
+ * ThaiBreakEngine is a kind of DictionaryBreakEngine that uses a
+ * TrieWordDictionary and heuristics to determine Thai-specific breaks.
+ *
+ * After it is constructed a ThaiBreakEngine may be shared between
+ * threads without synchronization.
+ */
+class ThaiBreakEngine : public DictionaryBreakEngine {
+ private:
+ /**
+ * The set of characters handled by this engine
+ * @internal
+ */
+
+ UnicodeSet fThaiWordSet;
+ UnicodeSet fEndWordSet;
+ UnicodeSet fBeginWordSet;
+ UnicodeSet fSuffixSet;
+ UnicodeSet fMarkSet;
+ const TrieWordDictionary *fDictionary;
+
+ public:
+
+ /**
+ * Default constructor.
+ *
+ * @param adoptDictionary A TrieWordDictionary to adopt. Deleted when the
+ * engine is deleted.
+ */
+ ThaiBreakEngine(const TrieWordDictionary *adoptDictionary, UErrorCode &status);
+
+ /**
+ * Virtual destructor.
+ */
+ virtual ~ThaiBreakEngine();
+
+ protected:
+ /**
+ * Divide up a range of known dictionary characters.
+ *
+ * @param text A UText representing the text
+ * @param rangeStart The start of the range of dictionary characters
+ * @param rangeEnd The end of the range of dictionary characters
+ * @param foundBreaks Output of C array of int32_t break positions, or 0
+ * @return The number of breaks found
+ */
+ virtual int32_t divideUpDictionaryRange( UText *text,
+ int32_t rangeStart,
+ int32_t rangeEnd,
+ UStack &foundBreaks ) const;
+
+};
+
+
+U_NAMESPACE_END
+
+ /* DICTBE_H */
+#endif
diff --git a/icuSources/common/hash.h b/icuSources/common/hash.h
index f1ea543c..375499bf 100644
--- a/icuSources/common/hash.h
+++ b/icuSources/common/hash.h
@@ -1,6 +1,6 @@
/*
******************************************************************************
-* Copyright (C) 1997-2004, International Business Machines
+* Copyright (C) 1997-2006, International Business Machines
* Corporation and others. All Rights Reserved.
******************************************************************************
* Date Name Description
@@ -26,8 +26,9 @@ U_NAMESPACE_BEGIN
*/
class U_COMMON_API Hashtable : public UMemory {
UHashtable* hash;
+ UHashtable hashObj;
- inline void init(UHashFunction *keyHash, UKeyComparator *keyComp, UErrorCode& status);
+ inline void init(UHashFunction *keyHash, UKeyComparator *keyComp, UValueComparator *valueComp, UErrorCode& status);
public:
/**
@@ -37,6 +38,14 @@ public:
*/
Hashtable(UBool ignoreKeyCase, UErrorCode& status);
+ /**
+ * Construct a hashtable
+ * @param keyComp Compartor for comparing the keys
+ * @param valueComp Compartor for comparing the values
+ * @param status Error code
+ */
+ Hashtable(UKeyComparator *keyComp, UValueComparator *valueComp, UErrorCode& status);
+
/**
* Construct a hashtable
* @param status Error code
@@ -76,7 +85,12 @@ public:
const UHashElement* find(const UnicodeString& key) const;
const UHashElement* nextElement(int32_t& pos) const;
+
+ UKeyComparator* setKeyCompartor(UKeyComparator*keyComp);
+
+ UValueComparator* setValueCompartor(UValueComparator* valueComp);
+ UBool equals(const Hashtable& that) const;
private:
Hashtable(const Hashtable &other); // forbid copying of this class
Hashtable &operator=(const Hashtable &other); // forbid copying of this class
@@ -86,16 +100,22 @@ private:
* Implementation
********************************************************************/
-inline void Hashtable::init(UHashFunction *keyHash, UKeyComparator *keyComp, UErrorCode& status) {
+inline void Hashtable::init(UHashFunction *keyHash, UKeyComparator *keyComp,
+ UValueComparator *valueComp, UErrorCode& status) {
if (U_FAILURE(status)) {
return;
}
- hash = uhash_open(keyHash, keyComp, &status);
+ uhash_init(&hashObj, keyHash, keyComp, valueComp, &status);
if (U_SUCCESS(status)) {
+ hash = &hashObj;
uhash_setKeyDeleter(hash, uhash_deleteUnicodeString);
}
}
+inline Hashtable::Hashtable(UKeyComparator *keyComp, UValueComparator *valueComp,
+ UErrorCode& status) : hash(0) {
+ init( uhash_hashUnicodeString, keyComp, valueComp, status);
+}
inline Hashtable::Hashtable(UBool ignoreKeyCase, UErrorCode& status)
: hash(0)
{
@@ -103,26 +123,26 @@ inline Hashtable::Hashtable(UBool ignoreKeyCase, UErrorCode& status)
: uhash_hashUnicodeString,
ignoreKeyCase ? uhash_compareCaselessUnicodeString
: uhash_compareUnicodeString,
+ NULL,
status);
}
inline Hashtable::Hashtable(UErrorCode& status)
: hash(0)
{
- init(uhash_hashUnicodeString, uhash_compareUnicodeString, status);
+ init(uhash_hashUnicodeString, uhash_compareUnicodeString, NULL, status);
}
inline Hashtable::Hashtable()
: hash(0)
{
UErrorCode status = U_ZERO_ERROR;
- init(uhash_hashUnicodeString, uhash_compareUnicodeString, status);
+ init(uhash_hashUnicodeString, uhash_compareUnicodeString, NULL, status);
}
inline Hashtable::~Hashtable() {
- if (hash != 0) {
+ if (hash != NULL) {
uhash_close(hash);
- hash = 0;
}
}
@@ -167,9 +187,21 @@ inline const UHashElement* Hashtable::nextElement(int32_t& pos) const {
}
inline void Hashtable::removeAll(void) {
- uhash_removeAll(hash);
+ uhash_removeAll(hash);
}
+inline UKeyComparator* Hashtable::setKeyCompartor(UKeyComparator*keyComp){
+ return uhash_setKeyComparator(hash, keyComp);
+}
+
+inline UValueComparator* Hashtable::setValueCompartor(UValueComparator* valueComp){
+ return uhash_setValueComparator(hash, valueComp);
+}
+
+inline UBool Hashtable::equals(const Hashtable& that)const{
+ return uhash_equals(hash, that.hash);
+}
U_NAMESPACE_END
#endif
+
diff --git a/icuSources/common/iculserv.cpp b/icuSources/common/iculserv.cpp
deleted file mode 100644
index f99462ba..00000000
--- a/icuSources/common/iculserv.cpp
+++ /dev/null
@@ -1,962 +0,0 @@
-/**
- *******************************************************************************
- * Copyright (C) 2001-2004, International Business Machines Corporation and *
- * others. All Rights Reserved. *
- *******************************************************************************
- *
- *******************************************************************************
- */
-#include "unicode/utypes.h"
-
-#if !UCONFIG_NO_SERVICE
-
-#include "unicode/resbund.h"
-#include "uresimp.h"
-#include "cmemory.h"
-#include "iculserv.h"
-#include "ustrfmt.h"
-#include "uhash.h"
-#include "charstr.h"
-#include "ucln_cmn.h"
-#include "uassert.h"
-
-// see LocaleUtility::getAvailableLocaleNames
-static Hashtable * LocaleUtility_cache = NULL;
-
-#define UNDERSCORE_CHAR ((UChar)0x005f)
-#define AT_SIGN_CHAR ((UChar)64)
-#define PERIOD_CHAR ((UChar)46)
-
-/*
- ******************************************************************
- */
-
-/**
- * Release all static memory held by Locale Utility.
- */
-U_CDECL_BEGIN
-static UBool U_CALLCONV service_cleanup(void) {
- if (LocaleUtility_cache) {
- delete LocaleUtility_cache;
- LocaleUtility_cache = NULL;
- }
- return TRUE;
-}
-U_CDECL_END
-
-U_NAMESPACE_BEGIN
-
-UnicodeString&
-LocaleUtility::canonicalLocaleString(const UnicodeString* id, UnicodeString& result)
-{
- if (id == NULL) {
- result.setToBogus();
- } else {
- // Fix case only (no other changes) up to the first '@' or '.' or
- // end of string, whichever comes first. In 3.0 I changed this to
- // stop at first '@' or '.'. It used to run out to the end of
- // string. My fix makes the tests pass but is probably
- // structurally incorrect. See below. [alan 3.0]
-
- // TODO: Doug, you might want to revise this...
- result = *id;
- int32_t i = 0;
- int32_t end = result.indexOf(AT_SIGN_CHAR);
- int32_t n = result.indexOf(PERIOD_CHAR);
- if (n >= 0 && n < end) {
- end = n;
- }
- if (end < 0) {
- end = result.length();
- }
- n = result.indexOf(UNDERSCORE_CHAR);
- if (n < 0) {
- n = end;
- }
- for (; i < n; ++i) {
- UChar c = result.charAt(i);
- if (c >= 0x0041 && c <= 0x005a) {
- c += 0x20;
- result.setCharAt(i, c);
- }
- }
- for (n = end; i < n; ++i) {
- UChar c = result.charAt(i);
- if (c >= 0x0061 && c <= 0x007a) {
- c -= 0x20;
- result.setCharAt(i, c);
- }
- }
- }
- return result;
-
-#if 0
- // This code does a proper full level 2 canonicalization of id.
- // It's nasty to go from UChar to char to char to UChar -- but
- // that's what you have to do to use the uloc_canonicalize
- // function on UnicodeStrings.
-
- // I ended up doing the alternate fix (see above) not for
- // performance reasons, although performance will certainly be
- // better, but because doing a full level 2 canonicalization
- // causes some tests to fail. [alan 3.0]
-
- // TODO: Doug, you might want to revisit this...
- result.setToBogus();
- if (id != 0) {
- int32_t buflen = id->length() + 8; // space for NUL
- char* buf = (char*) uprv_malloc(buflen);
- char* canon = (buf == 0) ? 0 : (char*) uprv_malloc(buflen);
- if (buf != 0 && canon != 0) {
- U_ASSERT(id->extract(0, INT32_MAX, buf, buflen) < buflen);
- UErrorCode ec = U_ZERO_ERROR;
- uloc_canonicalize(buf, canon, buflen, &ec);
- if (U_SUCCESS(ec)) {
- result = UnicodeString(canon);
- }
- }
- uprv_free(buf);
- uprv_free(canon);
- }
- return result;
-#endif
-}
-
-Locale&
-LocaleUtility::initLocaleFromName(const UnicodeString& id, Locale& result)
-{
- enum { BUFLEN = 128 }; // larger than ever needed
-
- if (id.isBogus() || id.length() >= BUFLEN) {
- result.setToBogus();
- } else {
- /*
- * We need to convert from a UnicodeString to char * in order to
- * create a Locale.
- *
- * Problem: Locale ID strings may contain '@' which is a variant
- * character and cannot be handled by invariant-character conversion.
- *
- * Hack: Since ICU code can handle locale IDs with multiple encodings
- * of '@' (at least for EBCDIC; it's not known to be a problem for
- * ASCII-based systems),
- * we use regular invariant-character conversion for everything else
- * and manually convert U+0040 into a compiler-char-constant '@'.
- * While this compilation-time constant may not match the runtime
- * encoding of '@', it should be one of the encodings which ICU
- * recognizes.
- *
- * There should be only at most one '@' in a locale ID.
- */
- char buffer[BUFLEN];
- int32_t prev, i;
- prev = 0;
- for(;;) {
- i = id.indexOf((UChar)0x40, prev);
- if(i < 0) {
- // no @ between prev and the rest of the string
- id.extract(prev, INT32_MAX, buffer + prev, BUFLEN - prev, US_INV);
- break; // done
- } else {
- // normal invariant-character conversion for text between @s
- id.extract(prev, i - prev, buffer + prev, BUFLEN - prev, US_INV);
- // manually "convert" U+0040 at id[i] into '@' at buffer[i]
- buffer[i] = '@';
- prev = i + 1;
- }
- }
- result = Locale::createFromName(buffer);
- }
- return result;
-}
-
-UnicodeString&
-LocaleUtility::initNameFromLocale(const Locale& locale, UnicodeString& result)
-{
- if (locale.isBogus()) {
- result.setToBogus();
- } else {
- result.append(UnicodeString(locale.getName(), -1, US_INV));
- }
- return result;
-}
-
-const Hashtable*
-LocaleUtility::getAvailableLocaleNames(const UnicodeString& bundleID)
-{
- // LocaleUtility_cache is a hash-of-hashes. The top-level keys
- // are path strings ('bundleID') passed to
- // ures_openAvailableLocales. The top-level values are
- // second-level hashes. The second-level keys are result strings
- // from ures_openAvailableLocales. The second-level values are
- // garbage ((void*)1 or other random pointer).
-
- UErrorCode status = U_ZERO_ERROR;
- Hashtable* cache;
- umtx_lock(NULL);
- cache = LocaleUtility_cache;
- umtx_unlock(NULL);
-
- if (cache == NULL) {
- cache = new Hashtable(status);
- if (cache == NULL || U_FAILURE(status)) {
- return NULL; // catastrophic failure; e.g. out of memory
- }
- cache->setValueDeleter(uhash_deleteHashtable);
- Hashtable* h; // set this to final LocaleUtility_cache value
- umtx_lock(NULL);
- h = LocaleUtility_cache;
- if (h == NULL) {
- LocaleUtility_cache = h = cache;
- cache = NULL;
- ucln_common_registerCleanup(UCLN_COMMON_SERVICE, service_cleanup);
- }
- umtx_unlock(NULL);
- delete cache;
- cache = h;
- }
-
- U_ASSERT(cache != NULL);
-
- Hashtable* htp;
- umtx_lock(NULL);
- htp = (Hashtable*) cache->get(bundleID);
- umtx_unlock(NULL);
-
- if (htp == NULL) {
- htp = new Hashtable(status);
- if (htp && U_SUCCESS(status)) {
- CharString cbundleID(bundleID);
- const char* path = (const char*) cbundleID;
- if (*path == 0) path = NULL; // empty string => NULL
- UEnumeration *uenum = ures_openAvailableLocales(path, &status);
- for (;;) {
- const UChar* id = uenum_unext(uenum, NULL, &status);
- if (id == NULL) {
- break;
- }
- htp->put(UnicodeString(id), (void*)htp, status);
- }
- uenum_close(uenum);
- if (U_FAILURE(status)) {
- delete htp;
- return NULL;
- }
- umtx_lock(NULL);
- cache->put(bundleID, (void*)htp, status);
- umtx_unlock(NULL);
- }
- }
- return htp;
-}
-
-UBool
-LocaleUtility::isFallbackOf(const UnicodeString& root, const UnicodeString& child)
-{
- return child.indexOf(root) == 0 &&
- (child.length() == root.length() ||
- child.charAt(root.length()) == UNDERSCORE_CHAR);
-}
-
-/*
- ******************************************************************
- */
-
-const int32_t LocaleKey::KIND_ANY = -1;
-
-LocaleKey*
-LocaleKey::createWithCanonicalFallback(const UnicodeString* primaryID,
- const UnicodeString* canonicalFallbackID,
- UErrorCode& status)
-{
- return LocaleKey::createWithCanonicalFallback(primaryID, canonicalFallbackID, KIND_ANY, status);
-}
-
-LocaleKey*
-LocaleKey::createWithCanonicalFallback(const UnicodeString* primaryID,
- const UnicodeString* canonicalFallbackID,
- int32_t kind,
- UErrorCode& status)
-{
- if (primaryID == NULL || U_FAILURE(status)) {
- return NULL;
- }
- UnicodeString canonicalPrimaryID;
- LocaleUtility::canonicalLocaleString(primaryID, canonicalPrimaryID);
- return new LocaleKey(*primaryID, canonicalPrimaryID, canonicalFallbackID, kind);
-}
-
-LocaleKey::LocaleKey(const UnicodeString& primaryID,
- const UnicodeString& canonicalPrimaryID,
- const UnicodeString* canonicalFallbackID,
- int32_t kind)
- : ICUServiceKey(primaryID)
- , _kind(kind)
- , _primaryID(canonicalPrimaryID)
- , _fallbackID()
- , _currentID()
-{
- _fallbackID.setToBogus();
- if (_primaryID.length() != 0) {
- if (canonicalFallbackID != NULL && _primaryID != *canonicalFallbackID) {
- _fallbackID = *canonicalFallbackID;
- }
- }
-
- _currentID = _primaryID;
-}
-
-LocaleKey::~LocaleKey() {}
-
-UnicodeString&
-LocaleKey::prefix(UnicodeString& result) const {
- if (_kind != KIND_ANY) {
- UChar buffer[64];
- uprv_itou(buffer, 64, _kind, 10, 0);
- UnicodeString temp(buffer);
- result.append(temp);
- }
- return result;
-}
-
-int32_t
-LocaleKey::kind() const {
- return _kind;
-}
-
-UnicodeString&
-LocaleKey::canonicalID(UnicodeString& result) const {
- return result.append(_primaryID);
-}
-
-UnicodeString&
-LocaleKey::currentID(UnicodeString& result) const {
- if (!_currentID.isBogus()) {
- result.append(_currentID);
- }
- return result;
-}
-
-UnicodeString&
-LocaleKey::currentDescriptor(UnicodeString& result) const {
- if (!_currentID.isBogus()) {
- prefix(result).append(PREFIX_DELIMITER).append(_currentID);
- } else {
- result.setToBogus();
- }
- return result;
-}
-
-Locale&
-LocaleKey::canonicalLocale(Locale& result) const {
- return LocaleUtility::initLocaleFromName(_primaryID, result);
-}
-
-Locale&
-LocaleKey::currentLocale(Locale& result) const {
- return LocaleUtility::initLocaleFromName(_currentID, result);
-}
-
-UBool
-LocaleKey::fallback() {
- if (!_currentID.isBogus()) {
- int x = _currentID.lastIndexOf(UNDERSCORE_CHAR);
- if (x != -1) {
- _currentID.remove(x); // truncate current or fallback, whichever we're pointing to
- return TRUE;
- }
-
- if (!_fallbackID.isBogus()) {
- _currentID = _fallbackID;
- _fallbackID.setToBogus();
- return TRUE;
- }
-
- if (_currentID.length() > 0) {
- _currentID.remove(0); // completely truncate
- return TRUE;
- }
-
- _currentID.setToBogus();
- }
-
- return FALSE;
-}
-
-UBool
-LocaleKey::isFallbackOf(const UnicodeString& id) const {
- UnicodeString temp(id);
- parseSuffix(temp);
- return temp.indexOf(_primaryID) == 0 &&
- (temp.length() == _primaryID.length() ||
- temp.charAt(_primaryID.length()) == UNDERSCORE_CHAR);
-}
-
-#ifdef SERVICE_DEBUG
-UnicodeString&
-LocaleKey::debug(UnicodeString& result) const
-{
- ICUServiceKey::debug(result);
- result.append(" kind: ");
- result.append(_kind);
- result.append(" primaryID: ");
- result.append(_primaryID);
- result.append(" fallbackID: ");
- result.append(_fallbackID);
- result.append(" currentID: ");
- result.append(_currentID);
- return result;
-}
-
-UnicodeString&
-LocaleKey::debugClass(UnicodeString& result) const
-{
- return result.append("LocaleKey ");
-}
-#endif
-
-UOBJECT_DEFINE_RTTI_IMPLEMENTATION(LocaleKey)
-
-/*
- ******************************************************************
- */
-
-LocaleKeyFactory::LocaleKeyFactory(int32_t coverage)
- : _name()
- , _coverage(coverage)
-{
-}
-
-LocaleKeyFactory::LocaleKeyFactory(int32_t coverage, const UnicodeString& name)
- : _name(name)
- , _coverage(coverage)
-{
-}
-
-LocaleKeyFactory::~LocaleKeyFactory() {
-}
-
-UObject*
-LocaleKeyFactory::create(const ICUServiceKey& key, const ICUService* service, UErrorCode& status) const {
- if (handlesKey(key, status)) {
- const LocaleKey& lkey = (const LocaleKey&)key;
- int32_t kind = lkey.kind();
- Locale loc;
- lkey.currentLocale(loc);
-
- return handleCreate(loc, kind, service, status);
- }
- return NULL;
-}
-
-UBool
-LocaleKeyFactory::handlesKey(const ICUServiceKey& key, UErrorCode& status) const {
- const Hashtable* supported = getSupportedIDs(status);
- if (supported) {
- UnicodeString id;
- key.currentID(id);
- return supported->get(id) != NULL;
- }
- return FALSE;
-}
-
-void
-LocaleKeyFactory::updateVisibleIDs(Hashtable& result, UErrorCode& status) const {
- const Hashtable* supported = getSupportedIDs(status);
- if (supported) {
- UBool visible = (_coverage & 0x1) == 0;
-
- const UHashElement* elem = NULL;
- int32_t pos = 0;
- while ((elem = supported->nextElement(pos)) != NULL) {
- const UnicodeString& id = *((const UnicodeString*)elem->key.pointer);
- if (!visible) {
- result.remove(id);
- } else {
- result.put(id, (void*)this, status); // this is dummy non-void marker used for set semantics
- if (U_FAILURE(status)) {
- break;
- }
- }
- }
- }
-}
-
-UnicodeString&
-LocaleKeyFactory::getDisplayName(const UnicodeString& id, const Locale& locale, UnicodeString& result) const {
- if ((_coverage & 0x1) == 0) {
- //UErrorCode status = U_ZERO_ERROR;
- // assume if this is called on us, we support some fallback of this id
- // if (isSupportedID(id, status)) {
- Locale loc;
- LocaleUtility::initLocaleFromName(id, loc);
- return loc.getDisplayName(locale, result);
- // }
- }
- result.setToBogus();
- return result;
-}
-
-UObject*
-LocaleKeyFactory::handleCreate(const Locale& /* loc */,
- int32_t /* kind */,
- const ICUService* /* service */,
- UErrorCode& /* status */) const {
- return NULL;
-}
-
-UBool
-LocaleKeyFactory::isSupportedID(const UnicodeString& id, UErrorCode& status) const {
- const Hashtable* ids = getSupportedIDs(status);
- return ids && ids->get(id);
-}
-
-const Hashtable*
-LocaleKeyFactory::getSupportedIDs(UErrorCode& /* status */) const {
- return NULL;
-}
-
-#ifdef SERVICE_DEBUG
-UnicodeString&
-LocaleKeyFactory::debug(UnicodeString& result) const
-{
- debugClass(result);
- result.append(", name: ");
- result.append(_name);
- result.append(", coverage: ");
- result.append(_coverage);
- return result;
-}
-
-UnicodeString&
-LocaleKeyFactory::debugClass(UnicodeString& result) const
-{
- return result.append("LocaleKeyFactory");
-}
-#endif
-
-UOBJECT_DEFINE_RTTI_IMPLEMENTATION(LocaleKeyFactory)
-
-/*
- ******************************************************************
- */
-
-SimpleLocaleKeyFactory::SimpleLocaleKeyFactory(UObject* objToAdopt,
- const UnicodeString& locale,
- int32_t kind,
- int32_t coverage)
- : LocaleKeyFactory(coverage)
- , _obj(objToAdopt)
- , _id(locale)
- , _kind(kind)
-{
-}
-
-SimpleLocaleKeyFactory::SimpleLocaleKeyFactory(UObject* objToAdopt,
- const Locale& locale,
- int32_t kind,
- int32_t coverage)
- : LocaleKeyFactory(coverage)
- , _obj(objToAdopt)
- , _id()
- , _kind(kind)
-{
- LocaleUtility::initNameFromLocale(locale, _id);
-}
-
-SimpleLocaleKeyFactory::~SimpleLocaleKeyFactory()
-{
- delete _obj;
- _obj = NULL;
-}
-
-UObject*
-SimpleLocaleKeyFactory::create(const ICUServiceKey& key, const ICUService* service, UErrorCode& status) const
-{
- if (U_SUCCESS(status)) {
- const LocaleKey& lkey = (const LocaleKey&)key;
- if (_kind == LocaleKey::KIND_ANY || _kind == lkey.kind()) {
- UnicodeString keyID;
- lkey.currentID(keyID);
- if (_id == keyID) {
- return service->cloneInstance(_obj);
- }
- }
- }
- return NULL;
-}
-
-UBool
-SimpleLocaleKeyFactory::isSupportedID(const UnicodeString& id, UErrorCode& /* status */) const
-{
- return id == _id;
-}
-
-void
-SimpleLocaleKeyFactory::updateVisibleIDs(Hashtable& result, UErrorCode& status) const
-{
- if (U_SUCCESS(status)) {
- if (_coverage & 0x1) {
- result.remove(_id);
- } else {
- result.put(_id, (void*)this, status);
- }
- }
-}
-
-#ifdef SERVICE_DEBUG
-UnicodeString&
-SimpleLocaleKeyFactory::debug(UnicodeString& result) const
-{
- LocaleKeyFactory::debug(result);
- result.append(", id: ");
- result.append(_id);
- result.append(", kind: ");
- result.append(_kind);
- return result;
-}
-
-UnicodeString&
-SimpleLocaleKeyFactory::debugClass(UnicodeString& result) const
-{
- return result.append("SimpleLocaleKeyFactory");
-}
-#endif
-
-UOBJECT_DEFINE_RTTI_IMPLEMENTATION(SimpleLocaleKeyFactory)
-
-/*
- ******************************************************************
- */
-
-ICUResourceBundleFactory::ICUResourceBundleFactory()
- : LocaleKeyFactory(VISIBLE)
- , _bundleName()
-{
-}
-
-ICUResourceBundleFactory::ICUResourceBundleFactory(const UnicodeString& bundleName)
- : LocaleKeyFactory(VISIBLE)
- , _bundleName(bundleName)
-{
-}
-
-ICUResourceBundleFactory::~ICUResourceBundleFactory() {}
-
-const Hashtable*
-ICUResourceBundleFactory::getSupportedIDs(UErrorCode& status) const
-{
- if (U_SUCCESS(status)) {
- return LocaleUtility::getAvailableLocaleNames(_bundleName);
- }
- return NULL;
-}
-
-UObject*
-ICUResourceBundleFactory::handleCreate(const Locale& loc, int32_t /* kind */, const ICUService* /* service */, UErrorCode& status) const
-{
- if (U_SUCCESS(status)) {
- // _bundleName is a package name
- // and should only contain invariant characters
- char pkg[20];
- int32_t length;
- length=_bundleName.extract(0, INT32_MAX, pkg, (int32_t)sizeof(pkg), US_INV);
- if(length>=(int32_t)sizeof(pkg)) {
- return NULL;
- }
- return new ResourceBundle(pkg, loc, status);
- }
- return NULL;
-}
-
-#ifdef SERVICE_DEBUG
-UnicodeString&
-ICUResourceBundleFactory::debug(UnicodeString& result) const
-{
- LocaleKeyFactory::debug(result);
- result.append(", bundle: ");
- return result.append(_bundleName);
-}
-
-UnicodeString&
-ICUResourceBundleFactory::debugClass(UnicodeString& result) const
-{
- return result.append("ICUResourceBundleFactory");
-}
-#endif
-
-UOBJECT_DEFINE_RTTI_IMPLEMENTATION(ICUResourceBundleFactory)
-
-/*
- ******************************************************************
- */
-
-ICULocaleService::ICULocaleService()
- : fallbackLocale(Locale::getDefault())
- , llock(0)
-{
- umtx_init(&llock);
-}
-
-ICULocaleService::ICULocaleService(const UnicodeString& dname)
- : ICUService(dname)
- , fallbackLocale(Locale::getDefault())
- , llock(0)
-{
- umtx_init(&llock);
-}
-
-ICULocaleService::~ICULocaleService()
-{
- umtx_destroy(&llock);
-}
-
-UObject*
-ICULocaleService::get(const Locale& locale, UErrorCode& status) const
-{
- return get(locale, LocaleKey::KIND_ANY, NULL, status);
-}
-
-UObject*
-ICULocaleService::get(const Locale& locale, int32_t kind, UErrorCode& status) const
-{
- return get(locale, kind, NULL, status);
-}
-
-UObject*
-ICULocaleService::get(const Locale& locale, Locale* actualReturn, UErrorCode& status) const
-{
- return get(locale, LocaleKey::KIND_ANY, actualReturn, status);
-}
-
-UObject*
-ICULocaleService::get(const Locale& locale, int32_t kind, Locale* actualReturn, UErrorCode& status) const
-{
- UObject* result = NULL;
- if (U_FAILURE(status)) {
- return result;
- }
-
- UnicodeString locName(locale.getName(), -1, US_INV);
- if (locName.isBogus()) {
- status = U_MEMORY_ALLOCATION_ERROR;
- } else {
- ICUServiceKey* key = createKey(&locName, kind, status);
- if (key) {
- if (actualReturn == NULL) {
- result = getKey(*key, status);
- } else {
- UnicodeString temp;
- result = getKey(*key, &temp, status);
-
- if (result != NULL) {
- key->parseSuffix(temp);
- LocaleUtility::initLocaleFromName(temp, *actualReturn);
- }
- }
- delete key;
- }
- }
- return result;
-}
-
-
-URegistryKey
-ICULocaleService::registerInstance(UObject* objToAdopt, const UnicodeString& locale,
- UBool visible, UErrorCode& status)
-{
- Locale loc;
- LocaleUtility::initLocaleFromName(locale, loc);
- return registerInstance(objToAdopt, loc, LocaleKey::KIND_ANY,
- visible ? LocaleKeyFactory::VISIBLE : LocaleKeyFactory::INVISIBLE, status);
-}
-
-URegistryKey
-ICULocaleService::registerInstance(UObject* objToAdopt, const Locale& locale, UErrorCode& status)
-{
- return registerInstance(objToAdopt, locale, LocaleKey::KIND_ANY, LocaleKeyFactory::VISIBLE, status);
-}
-
-URegistryKey
-ICULocaleService::registerInstance(UObject* objToAdopt, const Locale& locale, int32_t kind, UErrorCode& status)
-{
- return registerInstance(objToAdopt, locale, kind, LocaleKeyFactory::VISIBLE, status);
-}
-
-URegistryKey
-ICULocaleService::registerInstance(UObject* objToAdopt, const Locale& locale, int32_t kind, int32_t coverage, UErrorCode& status)
-{
- ICUServiceFactory * factory = new SimpleLocaleKeyFactory(objToAdopt, locale, kind, coverage);
- if (factory != NULL) {
- return registerFactory(factory, status);
- }
- delete objToAdopt;
- return NULL;
-}
-
-#if 0
-URegistryKey
-ICULocaleService::registerInstance(UObject* objToAdopt, const UnicodeString& locale, UErrorCode& status)
-{
- return registerInstance(objToAdopt, locale, LocaleKey::KIND_ANY, LocaleKeyFactory::VISIBLE, status);
-}
-
-URegistryKey
-ICULocaleService::registerInstance(UObject* objToAdopt, const UnicodeString& locale, UBool visible, UErrorCode& status)
-{
- return registerInstance(objToAdopt, locale, LocaleKey::KIND_ANY,
- visible ? LocaleKeyFactory::VISIBLE : LocaleKeyFactory::INVISIBLE,
- status);
-}
-
-URegistryKey
-ICULocaleService::registerInstance(UObject* objToAdopt, const UnicodeString& locale, int32_t kind, int32_t coverage, UErrorCode& status)
-{
- ICUServiceFactory * factory = new SimpleLocaleKeyFactory(objToAdopt, locale, kind, coverage);
- if (factory != NULL) {
- return registerFactory(factory, status);
- }
- delete objToAdopt;
- return NULL;
-}
-#endif
-
-class ServiceEnumeration : public StringEnumeration {
-private:
- const ICULocaleService* _service;
- int32_t _timestamp;
- UVector _ids;
- int32_t _pos;
-
-private:
- ServiceEnumeration(const ICULocaleService* service, UErrorCode &status)
- : _service(service)
- , _timestamp(service->getTimestamp())
- , _ids(uhash_deleteUnicodeString, NULL, status)
- , _pos(0)
- {
- _service->getVisibleIDs(_ids, status);
- }
-
- ServiceEnumeration(const ServiceEnumeration &other, UErrorCode &status)
- : _service(other._service)
- , _timestamp(other._timestamp)
- , _ids(uhash_deleteUnicodeString, NULL, status)
- , _pos(0)
- {
- if(U_SUCCESS(status)) {
- int32_t i, length;
-
- length = other._ids.size();
- for(i = 0; i < length; ++i) {
- _ids.addElement(((UnicodeString *)other._ids.elementAt(i))->clone(), status);
- }
-
- if(U_SUCCESS(status)) {
- _pos = other._pos;
- }
- }
- }
-
-public:
- static ServiceEnumeration* create(const ICULocaleService* service) {
- UErrorCode status = U_ZERO_ERROR;
- ServiceEnumeration* result = new ServiceEnumeration(service, status);
- if (U_SUCCESS(status)) {
- return result;
- }
- delete result;
- return NULL;
- }
-
- virtual ~ServiceEnumeration() {}
-
- virtual StringEnumeration *clone() const {
- UErrorCode status = U_ZERO_ERROR;
- ServiceEnumeration *cl = new ServiceEnumeration(*this, status);
- if(U_FAILURE(status)) {
- delete cl;
- cl = NULL;
- }
- return cl;
- }
-
- UBool upToDate(UErrorCode& status) const {
- if (U_SUCCESS(status)) {
- if (_timestamp == _service->getTimestamp()) {
- return TRUE;
- }
- status = U_ENUM_OUT_OF_SYNC_ERROR;
- }
- return FALSE;
- }
-
- virtual int32_t count(UErrorCode& status) const {
- return upToDate(status) ? _ids.size() : 0;
- }
-
- virtual const UnicodeString* snext(UErrorCode& status) {
- if (upToDate(status) && (_pos < _ids.size())) {
- return (const UnicodeString*)_ids[_pos++];
- }
- return NULL;
- }
-
- virtual void reset(UErrorCode& status) {
- if (status == U_ENUM_OUT_OF_SYNC_ERROR) {
- status = U_ZERO_ERROR;
- }
- if (U_SUCCESS(status)) {
- _timestamp = _service->getTimestamp();
- _pos = 0;
- _service->getVisibleIDs(_ids, status);
- }
- }
-
-public:
- static UClassID U_EXPORT2 getStaticClassID(void);
- virtual UClassID getDynamicClassID(void) const;
-};
-
-UOBJECT_DEFINE_RTTI_IMPLEMENTATION(ServiceEnumeration)
-
-StringEnumeration*
-ICULocaleService::getAvailableLocales(void) const
-{
- return ServiceEnumeration::create(this);
-}
-
-const UnicodeString&
-ICULocaleService::validateFallbackLocale() const
-{
- const Locale& loc = Locale::getDefault();
- ICULocaleService* ncThis = (ICULocaleService*)this;
- {
- Mutex mutex(&ncThis->llock);
- if (loc != fallbackLocale) {
- ncThis->fallbackLocale = loc;
- LocaleUtility::initNameFromLocale(loc, ncThis->fallbackLocaleName);
- ncThis->clearServiceCache();
- }
- }
- return fallbackLocaleName;
-}
-
-ICUServiceKey*
-ICULocaleService::createKey(const UnicodeString* id, UErrorCode& status) const
-{
- return LocaleKey::createWithCanonicalFallback(id, &validateFallbackLocale(), status);
-}
-
-ICUServiceKey*
-ICULocaleService::createKey(const UnicodeString* id, int32_t kind, UErrorCode& status) const
-{
- return LocaleKey::createWithCanonicalFallback(id, &validateFallbackLocale(), kind, status);
-}
-
-U_NAMESPACE_END
-
-/* !UCONFIG_NO_SERVICE */
-#endif
-
-
diff --git a/icuSources/common/icunotif.cpp b/icuSources/common/icunotif.cpp
deleted file mode 100644
index f8b64862..00000000
--- a/icuSources/common/icunotif.cpp
+++ /dev/null
@@ -1,116 +0,0 @@
-/**
- *******************************************************************************
- * Copyright (C) 2001-2003, International Business Machines Corporation and *
- * others. All Rights Reserved. *
- *******************************************************************************
- */
-
-#include "unicode/utypes.h"
-
-#if !UCONFIG_NO_SERVICE
-
-#include "icunotif.h"
-#if DEBUG
-#include
-#endif
-
-U_NAMESPACE_BEGIN
-
-EventListener::~EventListener() {}
-UOBJECT_DEFINE_RTTI_IMPLEMENTATION(EventListener)
-
-ICUNotifier::ICUNotifier(void)
- : notifyLock(0), listeners(NULL)
-{
- umtx_init(¬ifyLock);
-}
-
-ICUNotifier::~ICUNotifier(void) {
- {
- Mutex lmx(¬ifyLock);
- delete listeners;
- listeners = NULL;
- }
- umtx_destroy(¬ifyLock);
-}
-
-
-void
-ICUNotifier::addListener(const EventListener* l, UErrorCode& status)
-{
- if (U_SUCCESS(status)) {
- if (l == NULL) {
- status = U_ILLEGAL_ARGUMENT_ERROR;
- }
-
- if (acceptsListener(*l)) {
- Mutex lmx(¬ifyLock);
- if (listeners == NULL) {
- listeners = new UVector(5, status);
- } else {
- for (int i = 0, e = listeners->size(); i < e; ++i) {
- const EventListener* el = (const EventListener*)(listeners->elementAt(i));
- if (l == el) {
- return;
- }
- }
- }
-
- listeners->addElement((void*)l, status); // cast away const
- } else {
-#if DEBUG
- fprintf(stderr, "Listener invalid for this notifier.");
- exit(1);
-#endif
- }
- }
-}
-
-void
-ICUNotifier::removeListener(const EventListener *l, UErrorCode& status)
-{
- if (U_SUCCESS(status)) {
- if (l == NULL) {
- status = U_ILLEGAL_ARGUMENT_ERROR;
- return;
- }
-
- {
- Mutex lmx(¬ifyLock);
- if (listeners != NULL) {
- // identity equality check
- for (int i = 0, e = listeners->size(); i < e; ++i) {
- const EventListener* el = (const EventListener*)listeners->elementAt(i);
- if (l == el) {
- listeners->removeElementAt(i);
- if (listeners->size() == 0) {
- delete listeners;
- listeners = NULL;
- }
- return;
- }
- }
- }
- }
- }
-}
-
-void
-ICUNotifier::notifyChanged(void)
-{
- if (listeners != NULL) {
- Mutex lmx(¬ifyLock);
- if (listeners != NULL) {
- for (int i = 0, e = listeners->size(); i < e; ++i) {
- EventListener* el = (EventListener*)listeners->elementAt(i);
- notifyListener(*el);
- }
- }
- }
-}
-
-U_NAMESPACE_END
-
-/* UCONFIG_NO_SERVICE */
-#endif
-
diff --git a/icuSources/common/localsvc.cpp b/icuSources/common/localsvc.cpp
new file mode 100644
index 00000000..cb0cf6ca
--- /dev/null
+++ b/icuSources/common/localsvc.cpp
@@ -0,0 +1,29 @@
+//
+// localsvc.cpp -- Apple-specific service hook
+// Copyright (c) 2007 Apple Inc. All rights reserved.
+//
+
+#include "unicode/utypes.h"
+
+#if !UCONFIG_NO_BREAK_ITERATION
+
+#include "aaplbfct.h"
+#include "cstring.h"
+#if defined(U_DARWIN)
+#include
+#endif
+
+// Return an appropriate Apple-specific object, based on the service in question
+U_CAPI void* uprv_svc_hook(const char *what, UErrorCode *status)
+{
+ if (uprv_strcmp(what, "languageBreakFactory") == 0) {
+#if defined(U_DARWIN) && TARGET_OS_MAC
+ return new AppleLanguageBreakFactory(*status);
+ }
+#else
+ }
+#endif
+ return NULL;
+}
+
+#endif
diff --git a/icuSources/common/localsvc.h b/icuSources/common/localsvc.h
new file mode 100644
index 00000000..67e5a845
--- /dev/null
+++ b/icuSources/common/localsvc.h
@@ -0,0 +1,25 @@
+/*
+***************************************************************************
+* Copyright (C) 2006 International Business Machines Corporation *
+* and others. All rights reserved. *
+***************************************************************************
+*/
+
+#ifndef LOCALSVC_H
+#define LOCALSVC_H
+
+#include "unicode/utypes.h"
+
+#if U_LOCAL_SERVICE_HOOK
+/**
+ * Prototype for user-supplied service hook. This function is expected to return
+ * a type of factory object specific to the requested service.
+ *
+ * @param what service-specific string identifying the specific user hook
+ * @param status error status
+ * @return a service-specific hook, or NULL on failure.
+ */
+U_CAPI void* uprv_svc_hook(const char *what, UErrorCode *status);
+#endif
+
+#endif
diff --git a/icuSources/common/locid.cpp b/icuSources/common/locid.cpp
index 87ab0d5d..cb8d59eb 100644
--- a/icuSources/common/locid.cpp
+++ b/icuSources/common/locid.cpp
@@ -1,6 +1,6 @@
/*
**********************************************************************
- * Copyright (C) 1997-2004, International Business Machines
+ * Copyright (C) 1997-2006, International Business Machines
* Corporation and others. All Rights Reserved.
**********************************************************************
*
@@ -160,7 +160,7 @@ void locale_set_default_internal(const char *id)
umtx_unlock(NULL);
if (hashTableNeedsInit) {
status = U_ZERO_ERROR;
- UHashtable *tHashTable = uhash_open(uhash_hashChars, uhash_compareChars, &status);
+ UHashtable *tHashTable = uhash_open(uhash_hashChars, uhash_compareChars, NULL, &status);
if (U_FAILURE(status)) {
return;
}
@@ -357,7 +357,7 @@ Locale::Locale( const char * newLanguage,
/*if the whole string is longer than our internal limit, we need
to go to the heap for temporary buffers*/
- if (size > ULOC_FULLNAME_CAPACITY)
+ if (size >= ULOC_FULLNAME_CAPACITY)
{
togo_heap = (char *)uprv_malloc(sizeof(char)*(size+1));
togo = togo_heap;
@@ -553,7 +553,7 @@ Locale& Locale::init(const char* localeID, UBool canonicalize)
fieldIdx = 1;
while ((separator = uprv_strchr(field[fieldIdx-1], SEP_CHAR)) && fieldIdx < (int32_t)(sizeof(field)/sizeof(field[0]))-1) {
field[fieldIdx] = separator + 1;
- fieldLen[fieldIdx-1] = separator - field[fieldIdx-1];
+ fieldLen[fieldIdx-1] = (int32_t)(separator - field[fieldIdx-1]);
fieldIdx++;
}
// variant may contain @foo or .foo POSIX cruft; remove it
@@ -563,7 +563,7 @@ Locale& Locale::init(const char* localeID, UBool canonicalize)
if (separator==NULL || (sep2!=NULL && separator > sep2)) {
separator = sep2;
}
- fieldLen[fieldIdx-1] = separator - field[fieldIdx-1];
+ fieldLen[fieldIdx-1] = (int32_t)(separator - field[fieldIdx-1]);
} else {
fieldLen[fieldIdx-1] = length - (int32_t)(field[fieldIdx-1] - fullName);
}
@@ -604,7 +604,7 @@ Locale& Locale::init(const char* localeID, UBool canonicalize)
// successful end of init()
return *this;
- } while(0);
+ } while(0); /*loop doesn't iterate*/
// when an error occurs, then set this object to "bogus" (there is no UErrorCode here)
setToBogus();
@@ -745,7 +745,7 @@ Locale::getDisplayLanguage(const Locale &displayLocale,
length=uloc_getDisplayLanguage(fullName, displayLocale.fullName,
buffer, result.getCapacity(),
&errorCode);
- result.releaseBuffer(length);
+ result.releaseBuffer(U_SUCCESS(errorCode) ? length : 0);
if(errorCode==U_BUFFER_OVERFLOW_ERROR) {
buffer=result.getBuffer(length);
@@ -757,11 +757,7 @@ Locale::getDisplayLanguage(const Locale &displayLocale,
length=uloc_getDisplayLanguage(fullName, displayLocale.fullName,
buffer, result.getCapacity(),
&errorCode);
- result.releaseBuffer(length);
- }
-
- if(U_FAILURE(errorCode)) {
- result.truncate(0);
+ result.releaseBuffer(U_SUCCESS(errorCode) ? length : 0);
}
return result;
@@ -789,7 +785,7 @@ Locale::getDisplayScript(const Locale &displayLocale,
length=uloc_getDisplayScript(fullName, displayLocale.fullName,
buffer, result.getCapacity(),
&errorCode);
- result.releaseBuffer(length);
+ result.releaseBuffer(U_SUCCESS(errorCode) ? length : 0);
if(errorCode==U_BUFFER_OVERFLOW_ERROR) {
buffer=result.getBuffer(length);
@@ -801,11 +797,7 @@ Locale::getDisplayScript(const Locale &displayLocale,
length=uloc_getDisplayScript(fullName, displayLocale.fullName,
buffer, result.getCapacity(),
&errorCode);
- result.releaseBuffer(length);
- }
-
- if(U_FAILURE(errorCode)) {
- result.truncate(0);
+ result.releaseBuffer(U_SUCCESS(errorCode) ? length : 0);
}
return result;
@@ -833,7 +825,7 @@ Locale::getDisplayCountry(const Locale &displayLocale,
length=uloc_getDisplayCountry(fullName, displayLocale.fullName,
buffer, result.getCapacity(),
&errorCode);
- result.releaseBuffer(length);
+ result.releaseBuffer(U_SUCCESS(errorCode) ? length : 0);
if(errorCode==U_BUFFER_OVERFLOW_ERROR) {
buffer=result.getBuffer(length);
@@ -845,11 +837,7 @@ Locale::getDisplayCountry(const Locale &displayLocale,
length=uloc_getDisplayCountry(fullName, displayLocale.fullName,
buffer, result.getCapacity(),
&errorCode);
- result.releaseBuffer(length);
- }
-
- if(U_FAILURE(errorCode)) {
- result.truncate(0);
+ result.releaseBuffer(U_SUCCESS(errorCode) ? length : 0);
}
return result;
@@ -877,7 +865,7 @@ Locale::getDisplayVariant(const Locale &displayLocale,
length=uloc_getDisplayVariant(fullName, displayLocale.fullName,
buffer, result.getCapacity(),
&errorCode);
- result.releaseBuffer(length);
+ result.releaseBuffer(U_SUCCESS(errorCode) ? length : 0);
if(errorCode==U_BUFFER_OVERFLOW_ERROR) {
buffer=result.getBuffer(length);
@@ -889,11 +877,7 @@ Locale::getDisplayVariant(const Locale &displayLocale,
length=uloc_getDisplayVariant(fullName, displayLocale.fullName,
buffer, result.getCapacity(),
&errorCode);
- result.releaseBuffer(length);
- }
-
- if(U_FAILURE(errorCode)) {
- result.truncate(0);
+ result.releaseBuffer(U_SUCCESS(errorCode) ? length : 0);
}
return result;
@@ -921,7 +905,7 @@ Locale::getDisplayName(const Locale &displayLocale,
length=uloc_getDisplayName(fullName, displayLocale.fullName,
buffer, result.getCapacity(),
&errorCode);
- result.releaseBuffer(length);
+ result.releaseBuffer(U_SUCCESS(errorCode) ? length : 0);
if(errorCode==U_BUFFER_OVERFLOW_ERROR) {
buffer=result.getBuffer(length);
@@ -933,11 +917,7 @@ Locale::getDisplayName(const Locale &displayLocale,
length=uloc_getDisplayName(fullName, displayLocale.fullName,
buffer, result.getCapacity(),
&errorCode);
- result.releaseBuffer(length);
- }
-
- if(U_FAILURE(errorCode)) {
- result.truncate(0);
+ result.releaseBuffer(U_SUCCESS(errorCode) ? length : 0);
}
return result;
@@ -957,6 +937,7 @@ Locale::getAvailableLocales(int32_t& count)
newLocaleList = new Locale[locCount];
}
if (newLocaleList == NULL) {
+ count = 0;
return NULL;
}
@@ -1127,13 +1108,13 @@ const Locale &
Locale::getLocale(int locid)
{
Locale *localeCache = getLocaleCache();
- U_ASSERT(locid < eMAX_LOCALES);
+ U_ASSERT((locid < eMAX_LOCALES)&&(locid>=0));
if (localeCache == NULL) {
// Failure allocating the locale cache.
// The best we can do is return a NULL reference.
locid = 0;
}
- return localeCache[locid];
+ return localeCache[locid]; /*operating on NULL*/
}
/*
@@ -1242,7 +1223,7 @@ public:
int32_t len;
if(U_SUCCESS(status) && *current != 0) {
result = current;
- len = uprv_strlen(current);
+ len = (int32_t)uprv_strlen(current);
current += len+1;
if(resultLength != NULL) {
*resultLength = len;
diff --git a/icuSources/common/locmap.c b/icuSources/common/locmap.c
index a403ee48..135746d3 100644
--- a/icuSources/common/locmap.c
+++ b/icuSources/common/locmap.c
@@ -1,6 +1,6 @@
/*
**********************************************************************
- * Copyright (C) 1996-2004, International Business Machines
+ * Copyright (C) 1996-2006, International Business Machines
* Corporation and others. All Rights Reserved.
**********************************************************************
*
@@ -121,14 +121,28 @@ static const ILcidPosixElement ar[] = {
ILCID_POSIX_ELEMENT_ARRAY(0x044d, as, as_IN)
ILCID_POSIX_ELEMENT_ARRAY(0x045e, am, am_ET)
+ILCID_POSIX_ELEMENT_ARRAY(0x047a, arn,arn_CL)
static const ILcidPosixElement az[] = {
{0x2c, "az"},
- {0x082c, "az_AZ"}, /* Cyrillic based */
- {0x042c, "az_Latn_AZ"} /* Latin based */
+ {0x082c, "az_Cyrl_AZ"}, /* Cyrillic based */
+ {0x082c, "az_Cyrl"}, /* Cyrillic based */
+ {0x042c, "az_Latn_AZ"}, /* Latin based */
+ {0x042c, "az_Latn"}, /* Latin based */
+ {0x042c, "az_AZ"} /* Latin based */
};
+ILCID_POSIX_ELEMENT_ARRAY(0x046d, ba, ba_RU)
ILCID_POSIX_ELEMENT_ARRAY(0x0423, be, be_BY)
+
+static const ILcidPosixElement ber[] = {
+ {0x5f, "ber"},
+ {0x045f, "ber_Arab_DZ"},
+ {0x045f, "ber_Arab"},
+ {0x085f, "ber_Latn_DZ"},
+ {0x085f, "ber_Latn"}
+};
+
ILCID_POSIX_ELEMENT_ARRAY(0x0402, bg, bg_BG)
static const ILcidPosixElement bn[] = {
@@ -137,14 +151,15 @@ static const ILcidPosixElement bn[] = {
{0x0445, "bn_IN"}
};
-
static const ILcidPosixElement bo[] = {
{0x51, "bo"},
{0x0851, "bo_BT"},
{0x0451, "bo_CN"}
};
+ILCID_POSIX_ELEMENT_ARRAY(0x047e, br, br_FR)
ILCID_POSIX_ELEMENT_ARRAY(0x0403, ca, ca_ES)
+ILCID_POSIX_ELEMENT_ARRAY(0x0483, co, co_FR)
ILCID_POSIX_ELEMENT_ARRAY(0x045c, chr,chr_US)
/* Declared as cs_CZ to get around compiler errors on z/OS, which defines cs as a function */
@@ -163,7 +178,8 @@ static const ILcidPosixElement de[] = {
{0x0407, "de_DE"},
{0x1407, "de_LI"},
{0x1007, "de_LU"},
- {0x10407,"de__PHONEBOOK"} /*This is really de_DE_PHONEBOOK on Windows, maybe 10007*/
+ {0x10407,"de_DE@collation=phonebook"}, /*This is really de_DE_PHONEBOOK on Windows*/
+ {0x10407,"de@collation=phonebook"} /*This is really de_DE_PHONEBOOK on Windows*/
};
ILCID_POSIX_ELEMENT_ARRAY(0x0465, dv, dv_MV)
@@ -176,9 +192,12 @@ static const ILcidPosixElement en[] = {
{0x1009, "en_CA"},
{0x0809, "en_GB"},
{0x1809, "en_IE"},
+ {0x4009, "en_IN"},
{0x2009, "en_JM"},
+ {0x4409, "en_MY"},
{0x1409, "en_NZ"},
{0x3409, "en_PH"},
+ {0x4809, "en_SG"},
{0x2C09, "en_TT"},
{0x0409, "en_US"},
{0x007f, "en_US_POSIX"}, /* duplicate for roundtripping */
@@ -193,7 +212,7 @@ static const ILcidPosixElement en[] = {
};
static const ILcidPosixElement en_US_POSIX[] = {
- {0x007f, "en_US_POSIX"}, /* duplicate for roundtripping */
+ {0x007f, "en_US_POSIX"} /* duplicate for roundtripping */
};
static const ILcidPosixElement es[] = {
@@ -215,15 +234,31 @@ static const ILcidPosixElement es[] = {
{0x500a, "es_PR"},
{0x3c0a, "es_PY"},
{0x440a, "es_SV"},
+ {0x540a, "es_US"},
{0x380a, "es_UY"},
{0x200a, "es_VE"},
- {0x040a, "es__TRADITIONAL"} /*This is really es_ES_TRADITIONAL on Windows */
+ {0x040a, "es_ES@collation=traditional"},
+ {0x040a, "es@collation=traditional"}
};
ILCID_POSIX_ELEMENT_ARRAY(0x0425, et, et_EE)
ILCID_POSIX_ELEMENT_ARRAY(0x042d, eu, eu_ES)
-ILCID_POSIX_ELEMENT_ARRAY(0x0429, fa, fa_IR)
+
+/* ISO-639 doesn't distinguish between Persian and Dari.*/
+static const ILcidPosixElement fa[] = {
+ {0x29, "fa"},
+ {0x0429, "fa_IR"}, /* Persian/Farsi (Iran) */
+ {0x048c, "fa_AF"} /* Persian/Dari (Afghanistan) */
+};
+
+/* duplicate for roundtripping */
+static const ILcidPosixElement fa_AF[] = {
+ {0x8c, "fa_AF"}, /* Persian/Dari (Afghanistan) */
+ {0x048c, "fa_AF"} /* Persian/Dari (Afghanistan) */
+};
+
ILCID_POSIX_ELEMENT_ARRAY(0x040b, fi, fi_FI)
+ILCID_POSIX_ELEMENT_ARRAY(0x0464, fil,fil_PH)
ILCID_POSIX_ELEMENT_ARRAY(0x0438, fo, fo_FO)
static const ILcidPosixElement fr[] = {
@@ -257,7 +292,8 @@ static const ILcidPosixElement ga[] = {
ILCID_POSIX_ELEMENT_ARRAY(0x0456, gl, gl_ES)
ILCID_POSIX_ELEMENT_ARRAY(0x0447, gu, gu_IN)
ILCID_POSIX_ELEMENT_ARRAY(0x0474, gn, gn_PY)
-ILCID_POSIX_ELEMENT_ARRAY(0x0468, ha, ha_NG)
+ILCID_POSIX_ELEMENT_ARRAY(0x0484, gsw,gsw_FR)
+ILCID_POSIX_ELEMENT_ARRAY(0x0468, ha, ha_NG) /* ha_Latn_NG? */
ILCID_POSIX_ELEMENT_ARRAY(0x0475, haw,haw_US)
ILCID_POSIX_ELEMENT_ARRAY(0x040d, he, he_IL)
ILCID_POSIX_ELEMENT_ARRAY(0x0439, hi, hi_IN)
@@ -265,20 +301,28 @@ ILCID_POSIX_ELEMENT_ARRAY(0x0439, hi, hi_IN)
/* This LCID is really four different locales.*/
static const ILcidPosixElement hr[] = {
{0x1a, "hr"},
+ {0x141a, "bs_Latn_BA"}, /* Bosnian, Bosnia and Herzegovina */
+ {0x141a, "bs_Latn"}, /* Bosnian, Bosnia and Herzegovina */
{0x141a, "bs_BA"}, /* Bosnian, Bosnia and Herzegovina */
{0x141a, "bs"}, /* Bosnian */
+ {0x201a, "bs_Cyrl_BA"}, /* Bosnian, Bosnia and Herzegovina */
+ {0x201a, "bs_Cyrl"}, /* Bosnian, Bosnia and Herzegovina */
+ {0x101a, "hr_BA"}, /* Croatian in Bosnia */
{0x041a, "hr_HR"}, /* Croatian*/
- {0x081a, "sr_Latn_YU"}, /* Serbo-Croatian*/
+ {0x181a, "sr_Latn_BA"}, /* Serbo-Croatian in Bosnia */
+ {0x081a, "sr_Latn_CS"}, /* Serbo-Croatian*/
{0x081a, "sr_Latn"}, /* It's 0x1a or 0x081a, pick one to make the test program happy. */
- {0x0c1a, "sr_Cyrl_YU"}, /* Serbian*/
+ {0x1c1a, "sr_Cyrl_BA"}, /* Serbo-Croatian in Bosnia */
+ {0x0c1a, "sr_Cyrl_CS"}, /* Serbian*/
{0x0c1a, "sr_Cyrl"}, /* It's 0x1a or 0x0c1a, pick one to make the test program happy. */
- {0x0c1a, "sr"}, /* It's 0x1a or 0x0c1a, pick one to make the test program happy. */
+ {0x0c1a, "sr"} /* In CLDR sr is sr_Cyrl. */
};
ILCID_POSIX_ELEMENT_ARRAY(0x040e, hu, hu_HU)
ILCID_POSIX_ELEMENT_ARRAY(0x042b, hy, hy_AM)
ILCID_POSIX_ELEMENT_ARRAY(0x0421, id, id_ID)
ILCID_POSIX_ELEMENT_ARRAY(0x0470, ig, ig_NG)
+ILCID_POSIX_ELEMENT_ARRAY(0x0478, ii, ii_CN)
ILCID_POSIX_ELEMENT_ARRAY(0x040f, is, is_IS)
static const ILcidPosixElement it[] = {
@@ -287,11 +331,19 @@ static const ILcidPosixElement it[] = {
{0x0410, "it_IT"}
};
-ILCID_POSIX_ELEMENT_ARRAY(0x045d, iu, iu_CA) /* TODO: verify country */
+static const ILcidPosixElement iu[] = {
+ {0x5d, "iu"},
+ {0x045d, "iu_Cans_CA"},
+ {0x045d, "iu_Cans"},
+ {0x085d, "iu_Latn_CA"},
+ {0x085d, "iu_Latn"}
+};
+
ILCID_POSIX_ELEMENT_ARRAY(0x040d, iw, iw_IL) /*Left in for compatibility*/
ILCID_POSIX_ELEMENT_ARRAY(0x0411, ja, ja_JP)
ILCID_POSIX_ELEMENT_ARRAY(0x0437, ka, ka_GE)
ILCID_POSIX_ELEMENT_ARRAY(0x043f, kk, kk_KZ)
+ILCID_POSIX_ELEMENT_ARRAY(0x046f, kl, kl_GL)
ILCID_POSIX_ELEMENT_ARRAY(0x0453, km, km_KH)
ILCID_POSIX_ELEMENT_ARRAY(0x044b, kn, kn_IN)
@@ -312,14 +364,22 @@ static const ILcidPosixElement ks[] = { /* We could add PK and CN too */
ILCID_POSIX_ELEMENT_ARRAY(0x0440, ky, ky_KG) /* Kyrgyz is spoken in Kyrgyzstan */
ILCID_POSIX_ELEMENT_ARRAY(0x0476, la, la_IT) /* TODO: Verify the country */
+ILCID_POSIX_ELEMENT_ARRAY(0x046e, lb, lb_LU)
ILCID_POSIX_ELEMENT_ARRAY(0x0454, lo, lo_LA)
ILCID_POSIX_ELEMENT_ARRAY(0x0427, lt, lt_LT)
ILCID_POSIX_ELEMENT_ARRAY(0x0426, lv, lv_LV)
ILCID_POSIX_ELEMENT_ARRAY(0x0481, mi, mi_NZ)
ILCID_POSIX_ELEMENT_ARRAY(0x042f, mk, mk_MK)
ILCID_POSIX_ELEMENT_ARRAY(0x044c, ml, ml_IN)
-ILCID_POSIX_ELEMENT_ARRAY(0x0450, mn, mn_MN)
+
+static const ILcidPosixElement mn[] = {
+ {0x50, "mn"},
+ {0x0850, "mn_CN"},
+ {0x0450, "mn_MN"}
+};
+
ILCID_POSIX_ELEMENT_ARRAY(0x0458, mni,mni_IN)
+ILCID_POSIX_ELEMENT_ARRAY(0x047c, moh,moh_CA)
ILCID_POSIX_ELEMENT_ARRAY(0x044e, mr, mr_IN)
static const ILcidPosixElement ms[] = {
@@ -328,8 +388,8 @@ static const ILcidPosixElement ms[] = {
{0x043e, "ms_MY"} /* Malaysia*/
};
-/* The MSJDK documentation says this is maltese, but it's not supported.*/
ILCID_POSIX_ELEMENT_ARRAY(0x043a, mt, mt_MT)
+ILCID_POSIX_ELEMENT_ARRAY(0x0455, my, my_MM)
static const ILcidPosixElement ne[] = {
{0x61, "ne"},
@@ -354,7 +414,8 @@ static const ILcidPosixElement no[] = {
{0x0814, "no_NO_NY"}/* really nn_NO */
};
-ILCID_POSIX_ELEMENT_ARRAY(0x046c, nso,nso_ZA) /* TODO: Verify the country */
+ILCID_POSIX_ELEMENT_ARRAY(0x046c, nso,nso_ZA) /* TODO: Verify the ISO-639 code */
+ILCID_POSIX_ELEMENT_ARRAY(0x0482, oc, oc_FR)
ILCID_POSIX_ELEMENT_ARRAY(0x0472, om, om_ET) /* TODO: Verify the country */
/* Declared as or_IN to get around compiler errors*/
@@ -379,12 +440,14 @@ static const ILcidPosixElement pt[] = {
};
static const ILcidPosixElement qu[] = {
- {0x6B, "qu"},
- {0x046B, "qu_BO"},
- {0x086B, "qu_EC"},
- {0x0C6B, "qu_PE"}
+ {0x6b, "qu"},
+ {0x046b, "qu_BO"},
+ {0x086b, "qu_EC"},
+ {0x0C6b, "qu_PE"}
};
+ILCID_POSIX_ELEMENT_ARRAY(0x0486, qut, qut_GT) /* qut is an ISO-639-3 code */
+ILCID_POSIX_ELEMENT_ARRAY(0x0417, rm, rm_CH)
ILCID_POSIX_ELEMENT_ARRAY(0x0418, ro, ro_RO)
static const ILcidPosixElement root[] = {
@@ -392,7 +455,9 @@ static const ILcidPosixElement root[] = {
};
ILCID_POSIX_ELEMENT_ARRAY(0x0419, ru, ru_RU)
+ILCID_POSIX_ELEMENT_ARRAY(0x0487, rw, rw_RW)
ILCID_POSIX_ELEMENT_ARRAY(0x044f, sa, sa_IN)
+ILCID_POSIX_ELEMENT_ARRAY(0x0485, sah,sah_RU)
static const ILcidPosixElement sd[] = {
{0x59, "sd"},
@@ -400,6 +465,19 @@ static const ILcidPosixElement sd[] = {
{0x0859, "sd_PK"}
};
+static const ILcidPosixElement se[] = {
+ {0x3b, "se"},
+ {0x0c3b, "se_FI"},
+ {0x043b, "se_NO"},
+ {0x083b, "se_SE"},
+ {0x183b, "sma_NO"},
+ {0x1c3b, "sma_SE"},
+ {0x103b, "smj_NO"},
+ {0x143b, "smj_SE"},
+ {0x243b, "smn_FI"},
+ {0x203b, "sms_FI"},
+};
+
ILCID_POSIX_ELEMENT_ARRAY(0x045b, si, si_LK)
ILCID_POSIX_ELEMENT_ARRAY(0x041b, sk, sk_SK)
ILCID_POSIX_ELEMENT_ARRAY(0x0424, sl, sl_SI)
@@ -416,6 +494,7 @@ ILCID_POSIX_ELEMENT_ARRAY(0x0441, sw, sw_KE)
ILCID_POSIX_ELEMENT_ARRAY(0x045A, syr, syr_SY)
ILCID_POSIX_ELEMENT_ARRAY(0x0449, ta, ta_IN)
ILCID_POSIX_ELEMENT_ARRAY(0x044a, te, te_IN)
+ILCID_POSIX_ELEMENT_ARRAY(0x0428, tg, tg_TJ) /* Cyrillic based by default */
ILCID_POSIX_ELEMENT_ARRAY(0x041e, th, th_TH)
static const ILcidPosixElement ti[] = {
@@ -425,7 +504,6 @@ static const ILcidPosixElement ti[] = {
};
ILCID_POSIX_ELEMENT_ARRAY(0x0442, tk, tk_TM)
-ILCID_POSIX_ELEMENT_ARRAY(0x0464, tl, tl_PH)
ILCID_POSIX_ELEMENT_ARRAY(0x0432, tn, tn_BW)
ILCID_POSIX_ELEMENT_ARRAY(0x041f, tr, tr_TR)
ILCID_POSIX_ELEMENT_ARRAY(0x0444, tt, tt_RU)
@@ -440,19 +518,31 @@ static const ILcidPosixElement ur[] = {
static const ILcidPosixElement uz[] = {
{0x43, "uz"},
+ {0x0843, "uz_Cyrl_UZ"}, /* Cyrillic based */
+ {0x0843, "uz_Cyrl"}, /* Cyrillic based */
{0x0843, "uz_UZ"}, /* Cyrillic based */
- {0x0443, "uz_Latn_UZ"} /* Latin based */
+ {0x0443, "uz_Latn_UZ"}, /* Latin based */
+ {0x0443, "uz_Latn"} /* Latin based */
};
ILCID_POSIX_ELEMENT_ARRAY(0x0433, ve, ve_ZA) /* TODO: Verify the country */
ILCID_POSIX_ELEMENT_ARRAY(0x042a, vi, vi_VN)
-ILCID_POSIX_ELEMENT_ARRAY(0x0434, xh, xh_ZA) /* TODO: Verify the country */
-ILCID_POSIX_ELEMENT_ARRAY(0x046a, yo, yo_NG) /* TODO: Verify the country */
-/* TODO: Make the locales with the script the primary locale once the names are implemented in the resources. */
+static const ILcidPosixElement wen[] = {
+ {0x2E, "wen"},
+ {0x042E, "wen_DE"},
+ {0x042E, "hsb_DE"},
+ {0x082E, "dsb_DE"}
+};
+
+ILCID_POSIX_ELEMENT_ARRAY(0x0488, wo, wo_SN)
+ILCID_POSIX_ELEMENT_ARRAY(0x0434, xh, xh_ZA)
+ILCID_POSIX_ELEMENT_ARRAY(0x046a, yo, yo_NG)
+
static const ILcidPosixElement zh[] = {
{0x04, "zh"},
{0x0804, "zh_Hans_CN"},
+ {0x0804, "zh_Hans"},
{0x0804, "zh_CN"},
{0x0c04, "zh_Hant_HK"},
{0x0c04, "zh_HK"},
@@ -461,39 +551,47 @@ static const ILcidPosixElement zh[] = {
{0x1004, "zh_Hans_SG"},
{0x1004, "zh_SG"},
{0x0404, "zh_Hant_TW"},
+ {0x0404, "zh_Hant"},
{0x0404, "zh_TW"},
- {0x30404,"zh_Hant_TW"},
+ {0x30404,"zh_Hant_TW"}, /* Bopomofo order */
{0x30404,"zh_TW"}, /* Bopomofo order */
- {0x20404,"zh_TW@collation=STROKE"}
+ {0x20404,"zh_Hant_TW@collation=stroke"},
+ {0x20404,"zh_Hant@collation=stroke"},
+ {0x20404,"zh_TW@collation=stroke"},
+ {0x20004,"zh@collation=stroke"},
+ {0x20804,"zh_Hans_CN@collation=stroke"},
+ {0x20804,"zh_Hans@collation=stroke"},
+ {0x20804,"zh_CN@collation=stroke"}
};
-ILCID_POSIX_ELEMENT_ARRAY(0x0435, zu, zu_ZA) /* TODO: Verify the country */
+ILCID_POSIX_ELEMENT_ARRAY(0x0435, zu, zu_ZA)
/* This must be static and grouped by LCID. */
-/* non-existent ISO-639 codes */
+/* non-existent ISO-639-2 codes */
/*
0x466 Edo
0x467 Fulfulde - Nigeria
-0x43b Sami (Lappish)
-0x42e Sorbian (iso639 = dsb, hsb, wen)
+0x486 K'iche - Guatemala
0x430 Sutu
-0x45f Tamazight (Arabic script)
-0x85f Tamazight (Latin script)
-0x478 Yi
*/
static const ILcidPosixMap gPosixIDmap[] = {
ILCID_POSIX_MAP(af), /* af Afrikaans 0x36 */
ILCID_POSIX_MAP(am), /* am Amharic 0x5e */
ILCID_POSIX_MAP(ar), /* ar Arabic 0x01 */
+ ILCID_POSIX_MAP(arn), /* arn Araucanian/Mapudungun 0x7a */
ILCID_POSIX_MAP(as), /* as Assamese 0x4d */
ILCID_POSIX_MAP(az), /* az Azerbaijani 0x2c */
+ ILCID_POSIX_MAP(ba), /* ba Bashkir 0x6d */
ILCID_POSIX_MAP(be), /* be Belarusian 0x23 */
+ ILCID_POSIX_MAP(ber), /* ber Berber/Tamazight 0x5f */
ILCID_POSIX_MAP(bg), /* bg Bulgarian 0x02 */
ILCID_POSIX_MAP(bn), /* bn Bengali; Bangla 0x45 */
ILCID_POSIX_MAP(bo), /* bo Tibetan 0x51 */
+ ILCID_POSIX_MAP(br), /* br Breton 0x7e */
ILCID_POSIX_MAP(ca), /* ca Catalan 0x03 */
ILCID_POSIX_MAP(chr), /* chr Cherokee 0x5c */
+ ILCID_POSIX_MAP(co), /* co Corsican 0x83 */
ILCID_POSIX_MAP(cs_CZ), /* cs Czech 0x05 */
ILCID_POSIX_MAP(cy), /* cy Welsh 0x52 */
ILCID_POSIX_MAP(da), /* da Danish 0x06 */
@@ -505,14 +603,17 @@ static const ILcidPosixMap gPosixIDmap[] = {
ILCID_POSIX_MAP(es), /* es Spanish 0x0a */
ILCID_POSIX_MAP(et), /* et Estonian 0x25 */
ILCID_POSIX_MAP(eu), /* eu Basque 0x2d */
- ILCID_POSIX_MAP(fa), /* fa Farsi 0x29 */
+ ILCID_POSIX_MAP(fa), /* fa Persian/Farsi 0x29 */
+ ILCID_POSIX_MAP(fa_AF), /* fa Persian/Dari 0x8c */
ILCID_POSIX_MAP(fi), /* fi Finnish 0x0b */
+ ILCID_POSIX_MAP(fil), /* fil Filipino 0x64 */
ILCID_POSIX_MAP(fo), /* fo Faroese 0x38 */
ILCID_POSIX_MAP(fr), /* fr French 0x0c */
ILCID_POSIX_MAP(fy), /* fy Frisian 0x62 */
ILCID_POSIX_MAP(ga), /* * Gaelic (Ireland,Scotland) 0x3c */
ILCID_POSIX_MAP(gl), /* gl Galician 0x56 */
ILCID_POSIX_MAP(gn), /* gn Guarani 0x74 */
+ ILCID_POSIX_MAP(gsw), /* gsw Alemanic/Alsatian/Swiss German 0x84 */
ILCID_POSIX_MAP(gu), /* gu Gujarati 0x47 */
ILCID_POSIX_MAP(ha), /* ha Hausa 0x68 */
ILCID_POSIX_MAP(haw), /* haw Hawaiian 0x75 */
@@ -523,6 +624,7 @@ static const ILcidPosixMap gPosixIDmap[] = {
ILCID_POSIX_MAP(hy), /* hy Armenian 0x2b */
ILCID_POSIX_MAP(id), /* id Indonesian (formerly in) 0x21 */
ILCID_POSIX_MAP(ig), /* ig Igbo 0x70 */
+ ILCID_POSIX_MAP(ii), /* ii Sichuan Yi 0x78 */
ILCID_POSIX_MAP(is), /* is Icelandic 0x0f */
ILCID_POSIX_MAP(it), /* it Italian 0x10 */
ILCID_POSIX_MAP(iu), /* iu Inuktitut 0x5d */
@@ -530,6 +632,7 @@ static const ILcidPosixMap gPosixIDmap[] = {
ILCID_POSIX_MAP(ja), /* ja Japanese 0x11 */
ILCID_POSIX_MAP(ka), /* ka Georgian 0x37 */
ILCID_POSIX_MAP(kk), /* kk Kazakh 0x3f */
+ ILCID_POSIX_MAP(kl), /* kl Kalaallisut 0x6f */
ILCID_POSIX_MAP(km), /* km Khmer 0x53 */
ILCID_POSIX_MAP(kn), /* kn Kannada 0x4b */
ILCID_POSIX_MAP(ko), /* ko Korean 0x12 */
@@ -537,6 +640,7 @@ static const ILcidPosixMap gPosixIDmap[] = {
ILCID_POSIX_MAP(kr), /* kr Kanuri 0x71 */
ILCID_POSIX_MAP(ks), /* ks Kashmiri 0x60 */
ILCID_POSIX_MAP(ky), /* ky Kyrgyz 0x40 */
+ ILCID_POSIX_MAP(lb), /* lb Luxembourgish 0x6e */
ILCID_POSIX_MAP(la), /* la Latin 0x76 */
ILCID_POSIX_MAP(lo), /* lo Lao 0x54 */
ILCID_POSIX_MAP(lt), /* lt Lithuanian 0x27 */
@@ -546,27 +650,35 @@ static const ILcidPosixMap gPosixIDmap[] = {
ILCID_POSIX_MAP(ml), /* ml Malayalam 0x4c */
ILCID_POSIX_MAP(mn), /* mn Mongolian 0x50 */
ILCID_POSIX_MAP(mni), /* mni Manipuri 0x58 */
+ ILCID_POSIX_MAP(moh), /* moh Mohawk 0x7c */
ILCID_POSIX_MAP(mr), /* mr Marathi 0x4e */
ILCID_POSIX_MAP(ms), /* ms Malay 0x3e */
ILCID_POSIX_MAP(mt), /* mt Maltese 0x3a */
+ ILCID_POSIX_MAP(my), /* my Burmese 0x55 */
/* ILCID_POSIX_MAP(nb), // no Norwegian 0x14 */
ILCID_POSIX_MAP(ne), /* ne Nepali 0x61 */
ILCID_POSIX_MAP(nl), /* nl Dutch 0x13 */
/* ILCID_POSIX_MAP(nn), // no Norwegian 0x14 */
ILCID_POSIX_MAP(no), /* * Norwegian 0x14 */
ILCID_POSIX_MAP(nso), /* nso Sotho, Northern (Sepedi dialect) 0x6c */
+ ILCID_POSIX_MAP(oc), /* oc Occitan 0x82 */
ILCID_POSIX_MAP(om), /* om Oromo 0x72 */
ILCID_POSIX_MAP(or_IN), /* or Oriya 0x48 */
ILCID_POSIX_MAP(pa), /* pa Punjabi 0x46 */
ILCID_POSIX_MAP(pl), /* pl Polish 0x15 */
ILCID_POSIX_MAP(ps), /* ps Pashto 0x63 */
ILCID_POSIX_MAP(pt), /* pt Portuguese 0x16 */
- ILCID_POSIX_MAP(qu), /* qu Quechua (correct spelling)0x6B */
+ ILCID_POSIX_MAP(qu), /* qu Quechua 0x6B */
+ ILCID_POSIX_MAP(qut), /* qut K'iche 0x86 */
+ ILCID_POSIX_MAP(rm), /* rm Raeto-Romance/Romansh 0x17 */
ILCID_POSIX_MAP(ro), /* ro Romanian 0x18 */
ILCID_POSIX_MAP(root), /* root 0x00 */
ILCID_POSIX_MAP(ru), /* ru Russian 0x19 */
+ ILCID_POSIX_MAP(rw), /* rw Kinyarwanda 0x87 */
ILCID_POSIX_MAP(sa), /* sa Sanskrit 0x4f */
+ ILCID_POSIX_MAP(sah), /* sah Yakut 0x85 */
ILCID_POSIX_MAP(sd), /* sd Sindhi 0x59 */
+ ILCID_POSIX_MAP(se), /* se Sami 0x3b */
/* ILCID_POSIX_MAP(sh), // sh Serbo-Croatian 0x1a */
ILCID_POSIX_MAP(si), /* si Sinhalese 0x5b */
ILCID_POSIX_MAP(sk), /* sk Slovak 0x1b */
@@ -579,10 +691,10 @@ static const ILcidPosixMap gPosixIDmap[] = {
ILCID_POSIX_MAP(syr), /* syr Syriac 0x5A */
ILCID_POSIX_MAP(ta), /* ta Tamil 0x49 */
ILCID_POSIX_MAP(te), /* te Telugu 0x4a */
+ ILCID_POSIX_MAP(tg), /* tg Tajik 0x28 */
ILCID_POSIX_MAP(th), /* th Thai 0x1e */
ILCID_POSIX_MAP(ti), /* ti Tigrigna 0x73 */
ILCID_POSIX_MAP(tk), /* tk Turkmen 0x42 */
- ILCID_POSIX_MAP(tl), /* tl Tagalog (Filipino) 0x64 */
ILCID_POSIX_MAP(tn), /* tn Tswana 0x32 */
ILCID_POSIX_MAP(tr), /* tr Turkish 0x1f */
ILCID_POSIX_MAP(tt), /* tt Tatar 0x44 */
@@ -592,6 +704,8 @@ static const ILcidPosixMap gPosixIDmap[] = {
ILCID_POSIX_MAP(uz), /* uz Uzbek 0x43 */
ILCID_POSIX_MAP(ve), /* ve Venda 0x33 */
ILCID_POSIX_MAP(vi), /* vi Vietnamese 0x2a */
+ ILCID_POSIX_MAP(wen), /* wen Sorbian 0x2e */
+ ILCID_POSIX_MAP(wo), /* wo Wolof 0x88 */
ILCID_POSIX_MAP(xh), /* xh Xhosa 0x34 */
ILCID_POSIX_MAP(yo), /* yo Yoruba 0x6a */
ILCID_POSIX_MAP(zh), /* zh Chinese 0x04 */
@@ -630,7 +744,7 @@ getHostID(const ILcidPosixMap *this_0, const char* posixID, UErrorCode* status)
{
int32_t bestIdx = 0;
int32_t bestIdxDiff = 0;
- int32_t posixIDlen = (int32_t)uprv_strlen(posixID) + 1;
+ int32_t posixIDlen = (int32_t)uprv_strlen(posixID);
uint32_t idx;
for (idx = 0; idx < this_0->numRegions; idx++ ) {
@@ -644,7 +758,11 @@ getHostID(const ILcidPosixMap *this_0, const char* posixID, UErrorCode* status)
bestIdx = idx;
}
}
- if (this_0->regionMaps[bestIdx].posixID[bestIdxDiff] == 0) {
+ /* We asked for something unusual, like en_ZZ, and we try to return the number for the same language. */
+ /* We also have to make sure that sid and si and similar string subsets don't match. */
+ if ((posixID[bestIdxDiff] == '_' || posixID[bestIdxDiff] == '@')
+ && this_0->regionMaps[bestIdx].posixID[bestIdxDiff] == 0)
+ {
*status = U_USING_FALLBACK_WARNING;
return this_0->regionMaps[bestIdx].hostID;
}
diff --git a/icuSources/common/locutil.cpp b/icuSources/common/locutil.cpp
new file mode 100644
index 00000000..777403d7
--- /dev/null
+++ b/icuSources/common/locutil.cpp
@@ -0,0 +1,267 @@
+/**
+ *******************************************************************************
+ * Copyright (C) 2002-2005, International Business Machines Corporation and *
+ * others. All Rights Reserved. *
+ *******************************************************************************
+ *
+ *******************************************************************************
+ */
+#include "unicode/utypes.h"
+
+#if !UCONFIG_NO_SERVICE || !UCONFIG_NO_TRANSLITERATION
+
+#include "unicode/resbund.h"
+#include "cmemory.h"
+#include "ustrfmt.h"
+#include "locutil.h"
+#include "charstr.h"
+#include "ucln_cmn.h"
+#include "uassert.h"
+#include "umutex.h"
+
+// see LocaleUtility::getAvailableLocaleNames
+static Hashtable * LocaleUtility_cache = NULL;
+
+#define UNDERSCORE_CHAR ((UChar)0x005f)
+#define AT_SIGN_CHAR ((UChar)64)
+#define PERIOD_CHAR ((UChar)46)
+
+/*
+ ******************************************************************
+ */
+
+/**
+ * Release all static memory held by Locale Utility.
+ */
+U_CDECL_BEGIN
+static UBool U_CALLCONV service_cleanup(void) {
+ if (LocaleUtility_cache) {
+ delete LocaleUtility_cache;
+ LocaleUtility_cache = NULL;
+ }
+ return TRUE;
+}
+U_CDECL_END
+
+U_NAMESPACE_BEGIN
+
+UnicodeString&
+LocaleUtility::canonicalLocaleString(const UnicodeString* id, UnicodeString& result)
+{
+ if (id == NULL) {
+ result.setToBogus();
+ } else {
+ // Fix case only (no other changes) up to the first '@' or '.' or
+ // end of string, whichever comes first. In 3.0 I changed this to
+ // stop at first '@' or '.'. It used to run out to the end of
+ // string. My fix makes the tests pass but is probably
+ // structurally incorrect. See below. [alan 3.0]
+
+ // TODO: Doug, you might want to revise this...
+ result = *id;
+ int32_t i = 0;
+ int32_t end = result.indexOf(AT_SIGN_CHAR);
+ int32_t n = result.indexOf(PERIOD_CHAR);
+ if (n >= 0 && n < end) {
+ end = n;
+ }
+ if (end < 0) {
+ end = result.length();
+ }
+ n = result.indexOf(UNDERSCORE_CHAR);
+ if (n < 0) {
+ n = end;
+ }
+ for (; i < n; ++i) {
+ UChar c = result.charAt(i);
+ if (c >= 0x0041 && c <= 0x005a) {
+ c += 0x20;
+ result.setCharAt(i, c);
+ }
+ }
+ for (n = end; i < n; ++i) {
+ UChar c = result.charAt(i);
+ if (c >= 0x0061 && c <= 0x007a) {
+ c -= 0x20;
+ result.setCharAt(i, c);
+ }
+ }
+ }
+ return result;
+
+#if 0
+ // This code does a proper full level 2 canonicalization of id.
+ // It's nasty to go from UChar to char to char to UChar -- but
+ // that's what you have to do to use the uloc_canonicalize
+ // function on UnicodeStrings.
+
+ // I ended up doing the alternate fix (see above) not for
+ // performance reasons, although performance will certainly be
+ // better, but because doing a full level 2 canonicalization
+ // causes some tests to fail. [alan 3.0]
+
+ // TODO: Doug, you might want to revisit this...
+ result.setToBogus();
+ if (id != 0) {
+ int32_t buflen = id->length() + 8; // space for NUL
+ char* buf = (char*) uprv_malloc(buflen);
+ char* canon = (buf == 0) ? 0 : (char*) uprv_malloc(buflen);
+ if (buf != 0 && canon != 0) {
+ U_ASSERT(id->extract(0, INT32_MAX, buf, buflen) < buflen);
+ UErrorCode ec = U_ZERO_ERROR;
+ uloc_canonicalize(buf, canon, buflen, &ec);
+ if (U_SUCCESS(ec)) {
+ result = UnicodeString(canon);
+ }
+ }
+ uprv_free(buf);
+ uprv_free(canon);
+ }
+ return result;
+#endif
+}
+
+Locale&
+LocaleUtility::initLocaleFromName(const UnicodeString& id, Locale& result)
+{
+ enum { BUFLEN = 128 }; // larger than ever needed
+
+ if (id.isBogus() || id.length() >= BUFLEN) {
+ result.setToBogus();
+ } else {
+ /*
+ * We need to convert from a UnicodeString to char * in order to
+ * create a Locale.
+ *
+ * Problem: Locale ID strings may contain '@' which is a variant
+ * character and cannot be handled by invariant-character conversion.
+ *
+ * Hack: Since ICU code can handle locale IDs with multiple encodings
+ * of '@' (at least for EBCDIC; it's not known to be a problem for
+ * ASCII-based systems),
+ * we use regular invariant-character conversion for everything else
+ * and manually convert U+0040 into a compiler-char-constant '@'.
+ * While this compilation-time constant may not match the runtime
+ * encoding of '@', it should be one of the encodings which ICU
+ * recognizes.
+ *
+ * There should be only at most one '@' in a locale ID.
+ */
+ char buffer[BUFLEN];
+ int32_t prev, i;
+ prev = 0;
+ for(;;) {
+ i = id.indexOf((UChar)0x40, prev);
+ if(i < 0) {
+ // no @ between prev and the rest of the string
+ id.extract(prev, INT32_MAX, buffer + prev, BUFLEN - prev, US_INV);
+ break; // done
+ } else {
+ // normal invariant-character conversion for text between @s
+ id.extract(prev, i - prev, buffer + prev, BUFLEN - prev, US_INV);
+ // manually "convert" U+0040 at id[i] into '@' at buffer[i]
+ buffer[i] = '@';
+ prev = i + 1;
+ }
+ }
+ result = Locale::createFromName(buffer);
+ }
+ return result;
+}
+
+UnicodeString&
+LocaleUtility::initNameFromLocale(const Locale& locale, UnicodeString& result)
+{
+ if (locale.isBogus()) {
+ result.setToBogus();
+ } else {
+ result.append(UnicodeString(locale.getName(), -1, US_INV));
+ }
+ return result;
+}
+
+const Hashtable*
+LocaleUtility::getAvailableLocaleNames(const UnicodeString& bundleID)
+{
+ // LocaleUtility_cache is a hash-of-hashes. The top-level keys
+ // are path strings ('bundleID') passed to
+ // ures_openAvailableLocales. The top-level values are
+ // second-level hashes. The second-level keys are result strings
+ // from ures_openAvailableLocales. The second-level values are
+ // garbage ((void*)1 or other random pointer).
+
+ UErrorCode status = U_ZERO_ERROR;
+ Hashtable* cache;
+ umtx_lock(NULL);
+ cache = LocaleUtility_cache;
+ umtx_unlock(NULL);
+
+ if (cache == NULL) {
+ cache = new Hashtable(status);
+ if (cache == NULL || U_FAILURE(status)) {
+ return NULL; // catastrophic failure; e.g. out of memory
+ }
+ cache->setValueDeleter(uhash_deleteHashtable);
+ Hashtable* h; // set this to final LocaleUtility_cache value
+ umtx_lock(NULL);
+ h = LocaleUtility_cache;
+ if (h == NULL) {
+ LocaleUtility_cache = h = cache;
+ cache = NULL;
+ ucln_common_registerCleanup(UCLN_COMMON_SERVICE, service_cleanup);
+ }
+ umtx_unlock(NULL);
+ if(cache != NULL) {
+ delete cache;
+ }
+ cache = h;
+ }
+
+ U_ASSERT(cache != NULL);
+
+ Hashtable* htp;
+ umtx_lock(NULL);
+ htp = (Hashtable*) cache->get(bundleID);
+ umtx_unlock(NULL);
+
+ if (htp == NULL) {
+ htp = new Hashtable(status);
+ if (htp && U_SUCCESS(status)) {
+ CharString cbundleID(bundleID);
+ const char* path = (const char*) cbundleID;
+ if (*path == 0) path = NULL; // empty string => NULL
+ UEnumeration *uenum = ures_openAvailableLocales(path, &status);
+ for (;;) {
+ const UChar* id = uenum_unext(uenum, NULL, &status);
+ if (id == NULL) {
+ break;
+ }
+ htp->put(UnicodeString(id), (void*)htp, status);
+ }
+ uenum_close(uenum);
+ if (U_FAILURE(status)) {
+ delete htp;
+ return NULL;
+ }
+ umtx_lock(NULL);
+ cache->put(bundleID, (void*)htp, status);
+ umtx_unlock(NULL);
+ }
+ }
+ return htp;
+}
+
+UBool
+LocaleUtility::isFallbackOf(const UnicodeString& root, const UnicodeString& child)
+{
+ return child.indexOf(root) == 0 &&
+ (child.length() == root.length() ||
+ child.charAt(root.length()) == UNDERSCORE_CHAR);
+}
+
+U_NAMESPACE_END
+
+/* !UCONFIG_NO_SERVICE */
+#endif
+
+
diff --git a/icuSources/common/locutil.h b/icuSources/common/locutil.h
new file mode 100644
index 00000000..cf64e343
--- /dev/null
+++ b/icuSources/common/locutil.h
@@ -0,0 +1,37 @@
+/**
+ *******************************************************************************
+ * Copyright (C) 2002-2005, International Business Machines Corporation and *
+ * others. All Rights Reserved. *
+ *******************************************************************************
+ *
+ *******************************************************************************
+ */
+#ifndef LOCUTIL_H
+#define LOCUTIL_H
+
+#include "unicode/utypes.h"
+#include "hash.h"
+
+#if !UCONFIG_NO_SERVICE || !UCONFIG_NO_TRANSLITERATION
+
+
+U_NAMESPACE_BEGIN
+
+// temporary utility functions, till I know where to find them
+// in header so tests can also access them
+
+class U_COMMON_API LocaleUtility {
+public:
+ static UnicodeString& canonicalLocaleString(const UnicodeString* id, UnicodeString& result);
+ static Locale& initLocaleFromName(const UnicodeString& id, Locale& result);
+ static UnicodeString& initNameFromLocale(const Locale& locale, UnicodeString& result);
+ static const Hashtable* getAvailableLocaleNames(const UnicodeString& bundleID);
+ static UBool isFallbackOf(const UnicodeString& root, const UnicodeString& child);
+};
+
+U_NAMESPACE_END
+
+
+#endif
+
+#endif
diff --git a/icuSources/common/msvcres.h b/icuSources/common/msvcres.h
index 1bd84b07..cad2fe66 100644
--- a/icuSources/common/msvcres.h
+++ b/icuSources/common/msvcres.h
@@ -1,5 +1,5 @@
//{{NO_DEPENDENCIES}}
-// Copyright (c) 2003 International Business Machines
+// Copyright (c) 2003-2005 International Business Machines
// Corporation and others. All Rights Reserved.
//
// Used by common.rc and other .rc files.
@@ -7,5 +7,14 @@
//header the wrong way. This is here to prevent Visual Studio .NET from
//unnessarily building the resource files when it's not needed.
//
+
+/*
+These are defined before unicode/uversion.h in order to prevent
+STLPort's broken stddef.h from being used when rc.exe parses this file.
+*/
+#define _STLP_OUTERMOST_HEADER_ID 0
+#define _STLP_WINCE 1
+
#include "unicode/uversion.h"
+#define ICU_WEBSITE "http://ibm.com/software/globalization/icu/"
diff --git a/icuSources/common/normlzr.cpp b/icuSources/common/normlzr.cpp
index ba13ffb2..909bd30b 100644
--- a/icuSources/common/normlzr.cpp
+++ b/icuSources/common/normlzr.cpp
@@ -1,7 +1,7 @@
/*
*************************************************************************
* COPYRIGHT:
- * Copyright (c) 1996-2004, International Business Machines Corporation and
+ * Copyright (c) 1996-2005, International Business Machines Corporation and
* others. All Rights Reserved.
*************************************************************************
*/
@@ -146,7 +146,7 @@ Normalizer::normalize(const UnicodeString& source,
source.getBuffer(), source.length(),
mode, options,
&status);
- dest->releaseBuffer(length);
+ dest->releaseBuffer(U_SUCCESS(status) ? length : 0);
if(status==U_BUFFER_OVERFLOW_ERROR) {
status=U_ZERO_ERROR;
buffer=dest->getBuffer(length);
@@ -154,7 +154,7 @@ Normalizer::normalize(const UnicodeString& source,
source.getBuffer(), source.length(),
mode, options,
&status);
- dest->releaseBuffer(length);
+ dest->releaseBuffer(U_SUCCESS(status) ? length : 0);
}
if(dest==&localDest) {
@@ -192,7 +192,7 @@ Normalizer::compose(const UnicodeString& source,
source.getBuffer(), source.length(),
compat, options,
&status);
- dest->releaseBuffer(length);
+ dest->releaseBuffer(U_SUCCESS(status) ? length : 0);
if(status==U_BUFFER_OVERFLOW_ERROR) {
status=U_ZERO_ERROR;
buffer=dest->getBuffer(length);
@@ -200,7 +200,7 @@ Normalizer::compose(const UnicodeString& source,
source.getBuffer(), source.length(),
compat, options,
&status);
- dest->releaseBuffer(length);
+ dest->releaseBuffer(U_SUCCESS(status) ? length : 0);
}
if(dest==&localDest) {
@@ -238,7 +238,7 @@ Normalizer::decompose(const UnicodeString& source,
source.getBuffer(), source.length(),
compat, options,
&status);
- dest->releaseBuffer(length);
+ dest->releaseBuffer(U_SUCCESS(status) ? length : 0);
if(status==U_BUFFER_OVERFLOW_ERROR) {
status=U_ZERO_ERROR;
buffer=dest->getBuffer(length);
@@ -246,7 +246,7 @@ Normalizer::decompose(const UnicodeString& source,
source.getBuffer(), source.length(),
compat, options,
&status);
- dest->releaseBuffer(length);
+ dest->releaseBuffer(U_SUCCESS(status) ? length : 0);
}
if(dest==&localDest) {
@@ -285,7 +285,7 @@ Normalizer::concatenate(UnicodeString &left, UnicodeString &right,
buffer, dest->getCapacity(),
mode, options,
&errorCode);
- dest->releaseBuffer(length);
+ dest->releaseBuffer(U_SUCCESS(errorCode) ? length : 0);
if(errorCode==U_BUFFER_OVERFLOW_ERROR) {
errorCode=U_ZERO_ERROR;
buffer=dest->getBuffer(length);
@@ -294,7 +294,7 @@ Normalizer::concatenate(UnicodeString &left, UnicodeString &right,
buffer, dest->getCapacity(),
mode, options,
&errorCode);
- dest->releaseBuffer(length);
+ dest->releaseBuffer(U_SUCCESS(errorCode) ? length : 0);
}
if(dest==&localDest) {
@@ -554,7 +554,7 @@ Normalizer::nextNormalize() {
fUMode, fOptions,
TRUE, 0,
&errorCode);
- buffer.releaseBuffer(length);
+ buffer.releaseBuffer(U_SUCCESS(errorCode) ? length : 0);
if(errorCode==U_BUFFER_OVERFLOW_ERROR) {
errorCode=U_ZERO_ERROR;
text->move(text, nextIndex, UITER_ZERO);
@@ -563,7 +563,7 @@ Normalizer::nextNormalize() {
fUMode, fOptions,
TRUE, 0,
&errorCode);
- buffer.releaseBuffer(length);
+ buffer.releaseBuffer(U_SUCCESS(errorCode) ? length : 0);
}
nextIndex=text->getIndex(text, UITER_CURRENT);
@@ -589,7 +589,7 @@ Normalizer::previousNormalize() {
fUMode, fOptions,
TRUE, 0,
&errorCode);
- buffer.releaseBuffer(length);
+ buffer.releaseBuffer(U_SUCCESS(errorCode) ? length : 0);
if(errorCode==U_BUFFER_OVERFLOW_ERROR) {
errorCode=U_ZERO_ERROR;
text->move(text, currentIndex, UITER_ZERO);
@@ -598,7 +598,7 @@ Normalizer::previousNormalize() {
fUMode, fOptions,
TRUE, 0,
&errorCode);
- buffer.releaseBuffer(length);
+ buffer.releaseBuffer(U_SUCCESS(errorCode) ? length : 0);
}
bufferPos=buffer.length();
diff --git a/icuSources/common/propname.cpp b/icuSources/common/propname.cpp
index 789a610a..95d7e9b2 100644
--- a/icuSources/common/propname.cpp
+++ b/icuSources/common/propname.cpp
@@ -1,6 +1,6 @@
/*
**********************************************************************
-* Copyright (c) 2002-2004, International Business Machines
+* Copyright (c) 2002-2005, International Business Machines
* Corporation and others. All Rights Reserved.
**********************************************************************
* Author: Alan Liu
@@ -233,7 +233,7 @@ isPNameAcceptable(void* /*context*/,
info->formatVersion[0] == PNAME_FORMAT_VERSION;
}
-static UBool U_CALLCONV pname_cleanup() {
+static UBool U_CALLCONV pname_cleanup(void) {
if (UDATA) {
udata_close(UDATA);
UDATA = NULL;
@@ -276,9 +276,8 @@ static UBool _load() {
* to load it, and return TRUE if the load succeeds.
*/
static inline UBool load() {
- umtx_lock(NULL);
- UBool f = (PNAME!=NULL);
- umtx_unlock(NULL);
+ UBool f;
+ UMTX_CHECK(NULL, (PNAME!=NULL), f);
return f || _load();
}
@@ -520,16 +519,18 @@ NameToEnum::swap(const UDataSwapper *ds,
* which makes testing harder
*/
cmp.chars=(const char *)outBytes;
- cmp.propCompare=
- ds->outCharset==U_ASCII_FAMILY ?
- uprv_compareASCIIPropertyNames :
- uprv_compareEBCDICPropertyNames;
+ if (ds->outCharset==U_ASCII_FAMILY) {
+ cmp.propCompare=uprv_compareASCIIPropertyNames;
+ }
+ else {
+ cmp.propCompare=uprv_compareEBCDICPropertyNames;
+ }
uprv_sortArray(sortArray, tempMap->count, sizeof(NameAndIndex),
upname_compareRows, &cmp,
TRUE, pErrorCode);
if(U_FAILURE(*pErrorCode)) {
- udata_printError(ds, "upname_swap(NameToEnum).uprv_sortArray(%d items) failed - %s\n",
- tempMap->count, u_errorName(*pErrorCode));
+ udata_printError(ds, "upname_swap(NameToEnum).uprv_sortArray(%d items) failed\n",
+ tempMap->count);
return 0;
}
diff --git a/icuSources/common/putil.c b/icuSources/common/putil.c
index e86e3c66..c4cb049b 100644
--- a/icuSources/common/putil.c
+++ b/icuSources/common/putil.c
@@ -1,7 +1,7 @@
/*
******************************************************************************
*
-* Copyright (C) 1997-2004, International Business Machines
+* Copyright (C) 1997-2007, International Business Machines
* Corporation and others. All Rights Reserved.
*
******************************************************************************
@@ -36,23 +36,21 @@
******************************************************************************
*/
-#ifndef PTX
-
/* Define _XOPEN_SOURCE for Solaris and friends. */
/* NetBSD needs it to be >= 4 */
#ifndef _XOPEN_SOURCE
+#if __STDC_VERSION__ >= 199901L
+/* It is invalid to compile an XPG3, XPG4, XPG4v2 or XPG5 application using c99 */
+#define _XOPEN_SOURCE 600
+#else
#define _XOPEN_SOURCE 4
#endif
-
-/* Define __USE_POSIX and __USE_XOPEN for Linux and glibc. */
-#ifndef __USE_POSIX
-#define __USE_POSIX
-#endif
-#ifndef __USE_XOPEN
-#define __USE_XOPEN
#endif
-#endif /* PTX */
+/* Make sure things like readlink and such functions work. */
+#ifndef _XOPEN_SOURCE_EXTENDED
+#define _XOPEN_SOURCE_EXTENDED 1
+#endif
/* include ICU headers */
#include "unicode/utypes.h"
@@ -65,10 +63,18 @@
#include "cstring.h"
#include "locmap.h"
#include "ucln_cmn.h"
-#include "udataswp.h"
+
+/* Include standard headers. */
+#include
+#include
+#include
+#include
+#include
+#include
+#include
/* include system headers */
-#ifdef WIN32
+#ifdef U_WINDOWS
# define WIN32_LEAN_AND_MEAN
# define VC_EXTRALEAN
# define NOUSER
@@ -76,14 +82,10 @@
# define NOIME
# define NOMCX
# include
+# include "wintz.h"
#elif defined(U_CYGWIN) && defined(__STRICT_ANSI__)
/* tzset isn't defined in strict ANSI on Cygwin. */
# undef __STRICT_ANSI__
-#elif defined(OS2)
-# define INCL_DOSMISC
-# define INCL_DOSERRORS
-# define INCL_DOSMODULEMGR
-# include
#elif defined(OS400)
# include
# include /* error code structure */
@@ -96,26 +98,19 @@
# include
# include
# include
+# define ICU_NO_USER_DATA_OVERRIDE 1
#elif defined(OS390)
#include "unicode/ucnv.h" /* Needed for UCNV_SWAP_LFNL_OPTION_STRING */
-#elif defined(U_AIX)
-#elif defined(U_SOLARIS) || defined(U_LINUX)
-#elif defined(U_HPUX)
-#elif defined(U_DARWIN)
-#include
-#include
+#elif defined(U_DARWIN) || defined(U_LINUX) || defined(U_BSD)
+#include
+#include
#elif defined(U_QNX)
#include
#endif
-/* Include standard headers. */
-#include
-#include
-#include
-#include
-#include
-#include
-#include
+#ifndef U_WINDOWS
+#include
+#endif
/*
* Only include langinfo.h if we have a way to get the codeset. If we later
@@ -137,40 +132,14 @@ static const char copyright[] = U_COPYRIGHT_STRING;
/* We return QNAN rather than SNAN*/
#define SIGN 0x80000000U
-#if defined(__GNUC__)
-/*
- This is an optimization for when u_topNBytesOfDouble
- and u_bottomNBytesOfDouble can't be properly optimized by the compiler.
-*/
-#define USE_64BIT_DOUBLE_OPTIMIZATION 1
-#else
-#define USE_64BIT_DOUBLE_OPTIMIZATION 0
-#endif
-#if USE_64BIT_DOUBLE_OPTIMIZATION
-/* gcc 3.2 has an optimization bug */
-static const int64_t gNan64 = 0x7FF8000000000000LL;
-static const int64_t gInf64 = 0x7FF0000000000000LL;
-static const double * const fgNan = (const double *)(&gNan64);
-static const double * const fgInf = (const double *)(&gInf64);
-#else
-
-#if IEEE_754
-#define NAN_TOP ((int16_t)0x7FF8)
-#define INF_TOP ((int16_t)0x7FF0)
-#elif defined(OS390)
-#define NAN_TOP ((int16_t)0x7F08)
-#define INF_TOP ((int16_t)0x3F00)
-#endif
-
-/* statics */
-static UBool fgNaNInitialized = FALSE;
-static UBool fgInfInitialized = FALSE;
-static double gNan;
-static double gInf;
-static double * const fgNan = &gNan;
-static double * const fgInf = &gInf;
-#endif
+/* Make it easy to define certain types of constants */
+typedef union {
+ int64_t i64; /* This must be defined first in order to allow the initialization to work. This is a C89 feature. */
+ double d64;
+} BitPatternConversion;
+static const BitPatternConversion gNan = { (int64_t) INT64_C(0x7FF8000000000000) };
+static const BitPatternConversion gInf = { (int64_t) INT64_C(0x7FF0000000000000) };
/*---------------------------------------------------------------------------
Platform utilities
@@ -180,13 +149,17 @@ static double * const fgInf = &gInf;
functions).
---------------------------------------------------------------------------*/
-#if defined(_WIN32) || defined(XP_MAC) || defined(OS400) || defined(OS2)
+#if defined(U_WINDOWS) || defined(XP_MAC) || defined(OS400)
# undef U_POSIX_LOCALE
#else
# define U_POSIX_LOCALE 1
#endif
-/* Utilities to get the bits from a double */
+/*
+ WARNING! u_topNBytesOfDouble and u_bottomNBytesOfDouble
+ can't be properly optimized by the gcc compiler sometimes (i.e. gcc 3.2).
+*/
+#if !IEEE_754
static char*
u_topNBytesOfDouble(double* d, int n)
{
@@ -196,6 +169,7 @@ u_topNBytesOfDouble(double* d, int n)
return (char*)(d + 1) - n;
#endif
}
+#endif
static char*
u_bottomNBytesOfDouble(double* d, int n)
@@ -207,14 +181,26 @@ u_bottomNBytesOfDouble(double* d, int n)
#endif
}
+#if defined(U_WINDOWS)
+typedef union {
+ int64_t int64;
+ FILETIME fileTime;
+} FileTimeConversion; /* This is like a ULARGE_INTEGER */
+
+/* Number of 100 nanoseconds from 1/1/1601 to 1/1/1970 */
+#define EPOCH_BIAS INT64_C(116444736000000000)
+#define HECTONANOSECOND_PER_MILLISECOND 10000
+
+#endif
+
/*---------------------------------------------------------------------------
Universal Implementations
- These are designed to work on all platforms. Try these, and if they don't
- work on your platform, then special case your platform with new
+ These are designed to work on all platforms. Try these, and if they
+ don't work on your platform, then special case your platform with new
implementations.
- ---------------------------------------------------------------------------*/
+---------------------------------------------------------------------------*/
-/* Get UTC (GMT) time measured in seconds since 0:00 on 1/1/70.*/
+/* Return UTC (GMT) time measured in milliseconds since 0:00 on 1/1/70.*/
U_CAPI UDate U_EXPORT2
uprv_getUTCtime()
{
@@ -232,7 +218,17 @@ uprv_getUTCtime()
uprv_memcpy( &tmrec, gmtime(&t), sizeof(tmrec) );
t2 = mktime(&tmrec); /* seconds of current GMT*/
return (UDate)(t2 - t1) * U_MILLIS_PER_SECOND; /* GMT (or UTC) in seconds since 1970*/
+#elif defined(U_WINDOWS)
+
+ FileTimeConversion winTime;
+ GetSystemTimeAsFileTime(&winTime.fileTime);
+ return (UDate)((winTime.int64 - EPOCH_BIAS) / HECTONANOSECOND_PER_MILLISECOND);
#else
+/*
+ struct timeval posixTime;
+ gettimeofday(&posixTime, NULL);
+ return (UDate)(((int64_t)posixTime.tv_sec * U_MILLIS_PER_SECOND) + (posixTime.tv_usec/1000));
+*/
time_t epochtime;
time(&epochtime);
return (UDate)epochtime * U_MILLIS_PER_SECOND;
@@ -253,35 +249,10 @@ U_CAPI UBool U_EXPORT2
uprv_isNaN(double number)
{
#if IEEE_754
-#if USE_64BIT_DOUBLE_OPTIMIZATION
- /* gcc 3.2 has an optimization bug */
+ BitPatternConversion convertedNumber;
+ convertedNumber.d64 = number;
/* Infinity is 0x7FF0000000000000U. Anything greater than that is a NaN */
- return (UBool)(((*((int64_t *)&number)) & U_INT64_MAX) > gInf64);
-
-#else
- /* This should work in theory, but it doesn't, so we resort to the more*/
- /* complicated method below.*/
- /* return number != number;*/
-
- /* You can't return number == getNaN() because, by definition, NaN != x for*/
- /* all x, including NaN (that is, NaN != NaN). So instead, we compare*/
- /* against the known bit pattern. We must be careful of endianism here.*/
- /* The pattern we are looking for id:*/
-
- /* 7FFy yyyy yyyy yyyy (some y non-zero)*/
-
- /* There are two different kinds of NaN, but we ignore the distinction*/
- /* here. Note that the y value must be non-zero; if it is zero, then we*/
- /* have infinity.*/
-
- uint32_t highBits = *(uint32_t*)u_topNBytesOfDouble(&number,
- sizeof(uint32_t));
- uint32_t lowBits = *(uint32_t*)u_bottomNBytesOfDouble(&number,
- sizeof(uint32_t));
-
- return (UBool)(((highBits & 0x7FF00000L) == 0x7FF00000L) &&
- (((highBits & 0x000FFFFFL) != 0) || (lowBits != 0)));
-#endif
+ return (UBool)((convertedNumber.i64 & U_INT64_MAX) > gInf.i64);
#elif defined(OS390)
uint32_t highBits = *(uint32_t*)u_topNBytesOfDouble(&number,
@@ -304,32 +275,10 @@ U_CAPI UBool U_EXPORT2
uprv_isInfinite(double number)
{
#if IEEE_754
-#if USE_64BIT_DOUBLE_OPTIMIZATION
- /* gcc 3.2 has an optimization bug */
- return (UBool)(((*((int64_t *)&number)) & U_INT64_MAX) == gInf64);
-#else
-
- /* We know the top bit is the sign bit, so we mask that off in a copy of */
- /* the number and compare against infinity. [LIU]*/
- /* The following approach doesn't work for some reason, so we go ahead and */
- /* scrutinize the pattern itself. */
- /* double a = number; */
- /* *(int8_t*)u_topNBytesOfDouble(&a, 1) &= 0x7F;*/
- /* return a == uprv_getInfinity();*/
- /* Instead, We want to see either:*/
-
- /* 7FF0 0000 0000 0000*/
- /* FFF0 0000 0000 0000*/
-
- uint32_t highBits = *(uint32_t*)u_topNBytesOfDouble(&number,
- sizeof(uint32_t));
- uint32_t lowBits = *(uint32_t*)u_bottomNBytesOfDouble(&number,
- sizeof(uint32_t));
-
- return (UBool)(((highBits & ~SIGN) == 0x7FF00000U) &&
- (lowBits == 0x00000000U));
-#endif
-
+ BitPatternConversion convertedNumber;
+ convertedNumber.d64 = number;
+ /* Infinity is exactly 0x7FF0000000000000U. */
+ return (UBool)((convertedNumber.i64 & U_INT64_MAX) == gInf.i64);
#elif defined(OS390)
uint32_t highBits = *(uint32_t*)u_topNBytesOfDouble(&number,
sizeof(uint32_t));
@@ -374,19 +323,7 @@ U_CAPI double U_EXPORT2
uprv_getNaN()
{
#if IEEE_754 || defined(OS390)
-#if !USE_64BIT_DOUBLE_OPTIMIZATION
- if (!fgNaNInitialized) {
- /* This variable is always initialized with the same value,
- so a mutex isn't needed. */
- int i;
- int8_t* p = (int8_t*)fgNan;
- for(i = 0; i < sizeof(double); ++i)
- *p++ = 0;
- *(int16_t*)u_topNBytesOfDouble(fgNan, sizeof(NAN_TOP)) = NAN_TOP;
- fgNaNInitialized = TRUE;
- }
-#endif
- return *fgNan;
+ return gNan.d64;
#else
/* If your platform doesn't support IEEE 754 but *does* have an NaN value,*/
/* you'll need to replace this default implementation with what's correct*/
@@ -399,20 +336,7 @@ U_CAPI double U_EXPORT2
uprv_getInfinity()
{
#if IEEE_754 || defined(OS390)
-#if !USE_64BIT_DOUBLE_OPTIMIZATION
- if (!fgInfInitialized)
- {
- /* This variable is always initialized with the same value,
- so a mutex isn't needed. */
- int i;
- int8_t* p = (int8_t*)fgInf;
- for(i = 0; i < sizeof(double); ++i)
- *p++ = 0;
- *(int16_t*)u_topNBytesOfDouble(fgInf, sizeof(INF_TOP)) = INF_TOP;
- fgInfInitialized = TRUE;
- }
-#endif
- return *fgInf;
+ return gInf.d64;
#else
/* If your platform doesn't support IEEE 754 but *does* have an infinity*/
/* value, you'll need to replace this default implementation with what's*/
@@ -491,12 +415,6 @@ uprv_fmax(double x, double y)
return (x > y ? x : y);
}
-U_CAPI int32_t U_EXPORT2
-uprv_max(int32_t x, int32_t y)
-{
- return (x > y ? x : y);
-}
-
U_CAPI double U_EXPORT2
uprv_fmin(double x, double y)
{
@@ -518,12 +436,6 @@ uprv_fmin(double x, double y)
return (x > y ? y : x);
}
-U_CAPI int32_t U_EXPORT2
-uprv_min(int32_t x, int32_t y)
-{
- return (x > y ? y : x);
-}
-
/**
* Truncates the given double.
* trunc(3.3) = 3.0, trunc (-3.3) = -3.0
@@ -565,40 +477,6 @@ uprv_maxMantissa(void)
return pow(2.0, DBL_MANT_DIG + 1.0) - 1.0;
}
-/**
- * Return the floor of the log base 10 of a given double.
- * This method compensates for inaccuracies which arise naturally when
- * computing logs, and always give the correct value. The parameter
- * must be positive and finite.
- * (Thanks to Alan Liu for supplying this function.)
- */
-U_CAPI int16_t U_EXPORT2
-uprv_log10(double d)
-{
-#ifdef OS400
- /* We don't use the normal implementation because you can't underflow */
- /* a double otherwise an underflow exception occurs */
- return log10(d);
-#else
- /* The reason this routine is needed is that simply taking the*/
- /* log and dividing by log10 yields a result which may be off*/
- /* by 1 due to rounding errors. For example, the naive log10*/
- /* of 1.0e300 taken this way is 299, rather than 300.*/
- double alog10 = log(d) / log(10.0);
- int16_t ailog10 = (int16_t) floor(alog10);
-
- /* Positive logs could be too small, e.g. 0.99 instead of 1.0*/
- if (alog10 > 0 && d >= pow(10.0, (double)(ailog10 + 1)))
- ++ailog10;
-
- /* Negative logs could be too big, e.g. -0.99 instead of -1.0*/
- else if (alog10 < 0 && d < pow(10.0, (double)(ailog10)))
- --ailog10;
-
- return ailog10;
-#endif
-}
-
U_CAPI double U_EXPORT2
uprv_log(double d)
{
@@ -657,487 +535,6 @@ uprv_digitsAfterDecimal(double x)
platform with new implementations.
---------------------------------------------------------------------------*/
-/* Win32 time zone detection ------------------------------------------------ */
-
-#ifdef WIN32
-
-/*
- This code attempts to detect the Windows time zone, as set in the
- Windows Date and Time control panel. It attempts to work on
- multiple flavors of Windows (9x, Me, NT, 2000, XP) and on localized
- installs. It works by directly interrogating the registry and
- comparing the data there with the data returned by the
- GetTimeZoneInformation API, along with some other strategies. The
- registry contains time zone data under one of two keys (depending on
- the flavor of Windows):
-
- HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Time Zones\
- HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones\
-
- Under this key are several subkeys, one for each time zone. These
- subkeys are named "Pacific" on Win9x/Me and "Pacific Standard Time"
- on WinNT/2k/XP. There are some other wrinkles; see the code for
- details. The subkey name is NOT LOCALIZED, allowing us to support
- localized installs.
-
- Under the subkey are data values. We care about:
-
- Std Standard time display name, localized
- TZI Binary block of data
-
- The TZI data is of particular interest. It contains the offset, two
- more offsets for standard and daylight time, and the start and end
- rules. This is the same data returned by the GetTimeZoneInformation
- API. The API may modify the data on the way out, so we have to be
- careful, but essentially we do a binary comparison against the TZI
- blocks of various registry keys. When we find a match, we know what
- time zone Windows is set to. Since the registry key is not
- localized, we can then translate the key through a simple table
- lookup into the corresponding ICU time zone.
-
- This strategy doesn't always work because there are zones which
- share an offset and rules, so more than one TZI block will match.
- For example, both Tokyo and Seoul are at GMT+9 with no DST rules;
- their TZI blocks are identical. For these cases, we fall back to a
- name lookup. We attempt to match the display name as stored in the
- registry for the current zone to the display name stored in the
- registry for various Windows zones. By comparing the registry data
- directly we avoid conversion complications.
-
- Author: Alan Liu
- Since: ICU 2.6
- Based on original code by Carl Brown
-*/
-
-/**
- * Layout of the binary registry data under the "TZI" key.
- */
-typedef struct {
- LONG Bias;
- LONG StandardBias;
- LONG DaylightBias; /* Tweaked by GetTimeZoneInformation */
- SYSTEMTIME StandardDate;
- SYSTEMTIME DaylightDate;
-} TZI;
-
-typedef struct {
- const char* icuid;
- const char* winid;
-} WindowsICUMap;
-
-/**
- * Mapping between Windows zone IDs and ICU zone IDs. This list has
- * been mechanically checked; all zone offsets match (most important)
- * and city names match the display city names (where possible). The
- * presence or absence of DST differs in some cases, but this is
- * acceptable as long as the zone is semantically the same (which has
- * been manually checked).
- *
- * Windows 9x/Me zone IDs are listed as "Pacific" rather than "Pacific
- * Standard Time", which is seen in NT/2k/XP. This is fixed-up at
- * runtime as needed. The one exception is "Mexico Standard Time 2",
- * which is not present on Windows 9x/Me.
- *
- * Zones that are not unique under Offset+Rules should be grouped
- * together for efficiency (see code below). In addition, rules MUST
- * be grouped so that all zones of a single offset are together.
- *
- * Comments list S(tandard) or D(aylight), as declared by Windows,
- * followed by the display name (data from Windows XP).
- *
- * NOTE: Etc/GMT+12 is CORRECT for offset GMT-12:00. Consult
- * documentation elsewhere for an explanation.
- */
-static const WindowsICUMap ZONE_MAP[] = {
- "Etc/GMT+12", "Dateline", /* S (GMT-12:00) International Date Line West */
-
- "Pacific/Apia", "Samoa", /* S (GMT-11:00) Midway Island, Samoa */
-
- "Pacific/Honolulu", "Hawaiian", /* S (GMT-10:00) Hawaii */
-
- "America/Anchorage", "Alaskan", /* D (GMT-09:00) Alaska */
-
- "America/Los_Angeles", "Pacific", /* D (GMT-08:00) Pacific Time (US & Canada); Tijuana */
-
- "America/Phoenix", "US Mountain", /* S (GMT-07:00) Arizona */
- "America/Denver", "Mountain", /* D (GMT-07:00) Mountain Time (US & Canada) */
- "America/Chihuahua", "Mexico Standard Time 2", /* D (GMT-07:00) Chihuahua, La Paz, Mazatlan */
-
- "America/Managua", "Central America", /* S (GMT-06:00) Central America */
- "America/Regina", "Canada Central", /* S (GMT-06:00) Saskatchewan */
- "America/Mexico_City", "Mexico", /* D (GMT-06:00) Guadalajara, Mexico City, Monterrey */
- "America/Chicago", "Central", /* D (GMT-06:00) Central Time (US & Canada) */
-
- "America/Indianapolis", "US Eastern", /* S (GMT-05:00) Indiana (East) */
- "America/Bogota", "SA Pacific", /* S (GMT-05:00) Bogota, Lima, Quito */
- "America/New_York", "Eastern", /* D (GMT-05:00) Eastern Time (US & Canada) */
-
- "America/Caracas", "SA Western", /* S (GMT-04:00) Caracas, La Paz */
- "America/Santiago", "Pacific SA", /* D (GMT-04:00) Santiago */
- "America/Halifax", "Atlantic", /* D (GMT-04:00) Atlantic Time (Canada) */
-
- "America/St_Johns", "Newfoundland", /* D (GMT-03:30) Newfoundland */
-
- "America/Buenos_Aires", "SA Eastern", /* S (GMT-03:00) Buenos Aires, Georgetown */
- "America/Godthab", "Greenland", /* D (GMT-03:00) Greenland */
- "America/Sao_Paulo", "E. South America", /* D (GMT-03:00) Brasilia */
-
- "America/Noronha", "Mid-Atlantic", /* D (GMT-02:00) Mid-Atlantic */
-
- "Atlantic/Cape_Verde", "Cape Verde", /* S (GMT-01:00) Cape Verde Is. */
- "Atlantic/Azores", "Azores", /* D (GMT-01:00) Azores */
-
- "Africa/Casablanca", "Greenwich", /* S (GMT) Casablanca, Monrovia */
- "Europe/London", "GMT", /* D (GMT) Greenwich Mean Time : Dublin, Edinburgh, Lisbon, London */
-
- "Africa/Lagos", "W. Central Africa", /* S (GMT+01:00) West Central Africa */
- "Europe/Berlin", "W. Europe", /* D (GMT+01:00) Amsterdam, Berlin, Bern, Rome, Stockholm, Vienna */
- "Europe/Paris", "Romance", /* D (GMT+01:00) Brussels, Copenhagen, Madrid, Paris */
- "Europe/Sarajevo", "Central European", /* D (GMT+01:00) Sarajevo, Skopje, Warsaw, Zagreb */
- "Europe/Belgrade", "Central Europe", /* D (GMT+01:00) Belgrade, Bratislava, Budapest, Ljubljana, Prague */
-
- "Africa/Johannesburg", "South Africa", /* S (GMT+02:00) Harare, Pretoria */
- "Asia/Jerusalem", "Israel", /* S (GMT+02:00) Jerusalem */
- "Europe/Istanbul", "GTB", /* D (GMT+02:00) Athens, Istanbul, Minsk */
- "Europe/Helsinki", "FLE", /* D (GMT+02:00) Helsinki, Kyiv, Riga, Sofia, Tallinn, Vilnius */
- "Africa/Cairo", "Egypt", /* D (GMT+02:00) Cairo */
- "Europe/Bucharest", "E. Europe", /* D (GMT+02:00) Bucharest */
-
- "Africa/Nairobi", "E. Africa", /* S (GMT+03:00) Nairobi */
- "Asia/Riyadh", "Arab", /* S (GMT+03:00) Kuwait, Riyadh */
- "Europe/Moscow", "Russian", /* D (GMT+03:00) Moscow, St. Petersburg, Volgograd */
- "Asia/Baghdad", "Arabic", /* D (GMT+03:00) Baghdad */
-
- "Asia/Tehran", "Iran", /* D (GMT+03:30) Tehran */
-
- "Asia/Muscat", "Arabian", /* S (GMT+04:00) Abu Dhabi, Muscat */
- "Asia/Tbilisi", "Caucasus", /* D (GMT+04:00) Baku, Tbilisi, Yerevan */
-
- "Asia/Kabul", "Afghanistan", /* S (GMT+04:30) Kabul */
-
- "Asia/Karachi", "West Asia", /* S (GMT+05:00) Islamabad, Karachi, Tashkent */
- "Asia/Yekaterinburg", "Ekaterinburg", /* D (GMT+05:00) Ekaterinburg */
-
- "Asia/Calcutta", "India", /* S (GMT+05:30) Chennai, Kolkata, Mumbai, New Delhi */
-
- "Asia/Katmandu", "Nepal", /* S (GMT+05:45) Kathmandu */
-
- "Asia/Colombo", "Sri Lanka", /* S (GMT+06:00) Sri Jayawardenepura */
- "Asia/Dhaka", "Central Asia", /* S (GMT+06:00) Astana, Dhaka */
- "Asia/Novosibirsk", "N. Central Asia", /* D (GMT+06:00) Almaty, Novosibirsk */
-
- "Asia/Rangoon", "Myanmar", /* S (GMT+06:30) Rangoon */
-
- "Asia/Bangkok", "SE Asia", /* S (GMT+07:00) Bangkok, Hanoi, Jakarta */
- "Asia/Krasnoyarsk", "North Asia", /* D (GMT+07:00) Krasnoyarsk */
-
- "Australia/Perth", "W. Australia", /* S (GMT+08:00) Perth */
- "Asia/Taipei", "Taipei", /* S (GMT+08:00) Taipei */
- "Asia/Singapore", "Singapore", /* S (GMT+08:00) Kuala Lumpur, Singapore */
- "Asia/Hong_Kong", "China", /* S (GMT+08:00) Beijing, Chongqing, Hong Kong, Urumqi */
- "Asia/Irkutsk", "North Asia East", /* D (GMT+08:00) Irkutsk, Ulaan Bataar */
-
- "Asia/Tokyo", "Tokyo", /* S (GMT+09:00) Osaka, Sapporo, Tokyo */
- "Asia/Seoul", "Korea", /* S (GMT+09:00) Seoul */
- "Asia/Yakutsk", "Yakutsk", /* D (GMT+09:00) Yakutsk */
-
- "Australia/Darwin", "AUS Central", /* S (GMT+09:30) Darwin */
- "Australia/Adelaide", "Cen. Australia", /* D (GMT+09:30) Adelaide */
-
- "Pacific/Guam", "West Pacific", /* S (GMT+10:00) Guam, Port Moresby */
- "Australia/Brisbane", "E. Australia", /* S (GMT+10:00) Brisbane */
- "Asia/Vladivostok", "Vladivostok", /* D (GMT+10:00) Vladivostok */
- "Australia/Hobart", "Tasmania", /* D (GMT+10:00) Hobart */
- "Australia/Sydney", "AUS Eastern", /* D (GMT+10:00) Canberra, Melbourne, Sydney */
-
- "Asia/Magadan", "Central Pacific", /* S (GMT+11:00) Magadan, Solomon Is., New Caledonia */
-
- "Pacific/Fiji", "Fiji", /* S (GMT+12:00) Fiji, Kamchatka, Marshall Is. */
- "Pacific/Auckland", "New Zealand", /* D (GMT+12:00) Auckland, Wellington */
-
- "Pacific/Tongatapu", "Tonga", /* S (GMT+13:00) Nuku'alofa */
- NULL, NULL
-};
-
-typedef struct {
- const char* winid;
- const char* altwinid;
-} WindowsZoneRemap;
-
-/**
- * If a lookup fails, we attempt to remap certain Windows ids to
- * alternate Windows ids. If the alternate listed here begins with
- * '-', we use it as is (without the '-'). If it begins with '+', we
- * append a " Standard Time" if appropriate.
- */
-static const WindowsZoneRemap ZONE_REMAP[] = {
- "Central European", "-Warsaw",
- "Central Europe", "-Prague Bratislava",
- "China", "-Beijing",
-
- "Greenwich", "+GMT",
- "GTB", "+GFT",
- "Arab", "+Saudi Arabia",
- "SE Asia", "+Bangkok",
- "AUS Eastern", "+Sydney",
- NULL, NULL,
-};
-
-/**
- * Various registry keys and key fragments.
- */
-static const char CURRENT_ZONE_REGKEY[] = "SYSTEM\\CurrentControlSet\\Control\\TimeZoneInformation\\";
-static const char STANDARD_NAME_REGKEY[] = "StandardName";
-static const char STANDARD_TIME_REGKEY[] = " Standard Time";
-static const char TZI_REGKEY[] = "TZI";
-static const char STD_REGKEY[] = "Std";
-
-/**
- * HKLM subkeys used to probe for the flavor of Windows. Note that we
- * specifically check for the "GMT" zone subkey; this is present on
- * NT, but on XP has become "GMT Standard Time". We need to
- * discriminate between these cases.
- */
-static const char* const WIN_TYPE_PROBE_REGKEY[] = {
- /* WIN_9X_ME_TYPE */
- "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Time Zones",
-
- /* WIN_NT_TYPE */
- "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Time Zones\\GMT"
-
- /* otherwise: WIN_2K_XP_TYPE */
-};
-
-/**
- * The time zone root subkeys (under HKLM) for different flavors of
- * Windows.
- */
-static const char* const TZ_REGKEY[] = {
- /* WIN_9X_ME_TYPE */
- "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Time Zones\\",
-
- /* WIN_NT_TYPE | WIN_2K_XP_TYPE */
- "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Time Zones\\"
-};
-
-/**
- * Flavor of Windows, from our perspective. Not a real OS version,
- * but rather the flavor of the layout of the time zone information in
- * the registry.
- */
-enum {
- WIN_9X_ME_TYPE = 0,
- WIN_NT_TYPE = 1,
- WIN_2K_XP_TYPE = 2
-};
-
-/**
- * Auxiliary Windows time zone function. Attempts to open the given
- * Windows time zone ID as a registry key. Returns ERROR_SUCCESS if
- * successful. Caller must close the registry key. Handles
- * variations in the resource layout in different flavors of Windows.
- *
- * @param hkey output parameter to receive opened registry key
- * @param winid Windows zone ID, e.g., "Pacific", without the
- * " Standard Time" suffix (if any). Special case "Mexico Standard Time 2"
- * allowed.
- * @param winType Windows flavor (WIN_9X_ME_TYPE, etc.)
- * @return ERROR_SUCCESS upon success
- */
-static LONG openTZRegKey(HKEY *hkey, const char* winid, int winType) {
- LONG result;
- char subKeyName[96];
- char* name;
- int i;
-
- uprv_strcpy(subKeyName, TZ_REGKEY[(winType == WIN_9X_ME_TYPE) ? 0 : 1]);
- name = &subKeyName[strlen(subKeyName)];
- uprv_strcat(subKeyName, winid);
- if (winType != WIN_9X_ME_TYPE) {
- /* Don't modify "Mexico Standard Time 2", which does not occur
- on WIN_9X_ME_TYPE. Also, if the type is WIN_NT_TYPE, then
- in practice this means the GMT key is not followed by
- " Standard Time", so don't append in that case. */
- int isMexico2 = (winid[uprv_strlen(winid)- 1] == '2');
- if (!isMexico2 &&
- !(winType == WIN_NT_TYPE && uprv_strcmp(winid, "GMT") == 0)) {
- uprv_strcat(subKeyName, STANDARD_TIME_REGKEY);
- }
- }
- result = RegOpenKeyEx(HKEY_LOCAL_MACHINE,
- subKeyName,
- 0,
- KEY_QUERY_VALUE,
- hkey);
-
- if (result != ERROR_SUCCESS) {
- /* If the primary lookup fails, try to remap the Windows zone
- ID, according to the remapping table. */
- for (i=0; ZONE_REMAP[i].winid; ++i) {
- if (uprv_strcmp(winid, ZONE_REMAP[i].winid) == 0) {
- uprv_strcpy(name, ZONE_REMAP[i].altwinid + 1);
- if (*(ZONE_REMAP[i].altwinid) == '+' &&
- winType != WIN_9X_ME_TYPE) {
- uprv_strcat(subKeyName, STANDARD_TIME_REGKEY);
- }
- result = RegOpenKeyEx(HKEY_LOCAL_MACHINE,
- subKeyName,
- 0,
- KEY_QUERY_VALUE,
- hkey);
- break;
- }
- }
- }
-
- return result;
-}
-
-/**
- * Main Windows time zone detection function. Returns the Windows
- * time zone, translated to an ICU time zone, or NULL upon failure.
- */
-static const char* detectWindowsTimeZone() {
- int winType;
- LONG result;
- HKEY hkey;
- TZI tziKey;
- TZI tziReg;
- DWORD cbData = sizeof(TZI);
- TIME_ZONE_INFORMATION apiTZI;
- char stdName[32];
- DWORD stdNameSize;
- char stdRegName[64];
- DWORD stdRegNameSize;
- int firstMatch, lastMatch;
- int j;
-
- /* Detect the version of windows by trying to open a sequence of
- probe keys. We don't use the OS version API because what we
- really want to know is how the registry is laid out.
- Specifically, is it 9x/Me or not, and is it "GMT" or "GMT
- Standard Time". */
- for (winType=0; winType<2; ++winType) {
- result = RegOpenKeyEx(HKEY_LOCAL_MACHINE,
- WIN_TYPE_PROBE_REGKEY[winType],
- 0,
- KEY_QUERY_VALUE,
- &hkey);
- RegCloseKey(hkey);
- if (result == ERROR_SUCCESS) {
- break;
- }
- }
-
- /* Obtain TIME_ZONE_INFORMATION from the API, and then convert it
- to TZI. We could also interrogate the registry directly; we do
- this below if needed. */
- uprv_memset(&apiTZI, 0, sizeof(apiTZI));
- GetTimeZoneInformation(&apiTZI);
- tziKey.Bias = apiTZI.Bias;
- uprv_memcpy((char *)&tziKey.StandardDate, (char*)&apiTZI.StandardDate,
- sizeof(apiTZI.StandardDate));
- uprv_memcpy((char *)&tziKey.DaylightDate, (char*)&apiTZI.DaylightDate,
- sizeof(apiTZI.DaylightDate));
-
- /* For each zone that can be identified by Offset+Rules, see if we
- have a match. Continue scanning after finding a match,
- recording the index of the first and the last match. We have
- to do this because some zones are not unique under
- Offset+Rules. */
- firstMatch = lastMatch = -1;
- for (j=0; ZONE_MAP[j].icuid; j++) {
- result = openTZRegKey(&hkey, ZONE_MAP[j].winid, winType);
- if (result == ERROR_SUCCESS) {
- result = RegQueryValueEx(hkey,
- TZI_REGKEY,
- NULL,
- NULL,
- (LPBYTE)&tziReg,
- &cbData);
- }
- RegCloseKey(hkey);
- if (result == ERROR_SUCCESS) {
- /* Assume that offsets are grouped together, and bail out
- when we've scanned everything with a matching
- offset. */
- if (firstMatch >= 0 && tziKey.Bias != tziReg.Bias) {
- break;
- }
- /* Windows alters the DaylightBias in some situations.
- Using the bias and the rules suffices, so overwrite
- these unreliable fields. */
- tziKey.StandardBias = tziReg.StandardBias;
- tziKey.DaylightBias = tziReg.DaylightBias;
- if (uprv_memcmp((char *)&tziKey, (char*)&tziReg,
- sizeof(tziKey)) == 0) {
- if (firstMatch < 0) {
- firstMatch = j;
- }
- lastMatch = j;
- }
- }
- }
-
- /* This should never happen; if it does it means our table doesn't
- match Windows AT ALL, perhaps because this is post-XP? */
- if (firstMatch < 0) {
- return NULL;
- }
-
- if (firstMatch != lastMatch) {
- /* Offset+Rules lookup yielded >= 2 matches. Try to match the
- localized display name. Get the name from the registry
- (not the API). This avoids conversion issues. Use the
- standard name, since Windows modifies the daylight name to
- match the standard name if there is no DST. */
- result = RegOpenKeyEx(HKEY_LOCAL_MACHINE,
- CURRENT_ZONE_REGKEY,
- 0,
- KEY_QUERY_VALUE,
- &hkey);
- if (result == ERROR_SUCCESS) {
- stdNameSize = sizeof(stdName);
- result = RegQueryValueEx(hkey,
- (LPTSTR)STANDARD_NAME_REGKEY,
- NULL,
- NULL,
- (LPBYTE)stdName,
- &stdNameSize);
- RegCloseKey(hkey);
-
- /* Scan through the Windows time zone data in the registry
- again (just the range of zones with matching TZIs) and
- look for a standard display name match. */
- for (j=firstMatch; j<=lastMatch; j++) {
- result = openTZRegKey(&hkey, ZONE_MAP[j].winid, winType);
- if (result == ERROR_SUCCESS) {
- stdRegNameSize = sizeof(stdRegName);
- result = RegQueryValueEx(hkey,
- (LPTSTR)STD_REGKEY,
- NULL,
- NULL,
- (LPBYTE)stdRegName,
- &stdRegNameSize);
- }
- RegCloseKey(hkey);
- if (result == ERROR_SUCCESS &&
- stdRegNameSize == stdNameSize &&
- uprv_memcmp(stdName, stdRegName, stdNameSize) == 0) {
- firstMatch = j; /* record the match */
- break;
- }
- }
- } else {
- RegCloseKey(hkey); /* should never get here */
- }
- }
-
- return ZONE_MAP[firstMatch].icuid;
-}
-
-#endif /*WIN32*/
-
/* Generic time zone layer -------------------------------------------------- */
/* Time zone utilities */
@@ -1185,58 +582,103 @@ uprv_timezone()
extern U_IMPORT char *U_TZNAME[];
#endif
-#if defined(U_DARWIN) /* For Mac OS X */
-#define TZZONELINK "/etc/localtime"
-#define TZZONEINFO "/usr/share/zoneinfo/"
-static char *gTimeZoneBuffer = NULL; /* Heap allocated */
+#if !UCONFIG_NO_FILE_IO && (defined(U_DARWIN) || defined(U_LINUX) || defined(U_BSD))
+/* These platforms are likely to use Olson timezone IDs. */
+#define CHECK_LOCALTIME_LINK 1
+#include
+#define TZZONEINFO (TZDIR "/")
+static char gTimeZoneBuffer[PATH_MAX];
+static char *gTimeZoneBufferPtr = NULL;
+#endif
+
+#ifndef U_WINDOWS
+#define isNonDigit(ch) (ch < '0' || '9' < ch)
+static UBool isValidOlsonID(const char *id) {
+ int32_t idx = 0;
+
+ /* Determine if this is something like Iceland (Olson ID)
+ or AST4ADT (non-Olson ID) */
+ while (id[idx] && isNonDigit(id[idx]) && id[idx] != ',') {
+ idx++;
+ }
+
+ /* If we went through the whole string, then it might be okay.
+ The timezone is sometimes set to "CST-7CDT", "CST6CDT5,J129,J131/19:30",
+ "GRNLNDST3GRNLNDDT" or similar, so we cannot use it.
+ The rest of the time it could be an Olson ID. George */
+ return (UBool)(id[idx] == 0
+ || uprv_strcmp(id, "PST8PDT") == 0
+ || uprv_strcmp(id, "MST7MDT") == 0
+ || uprv_strcmp(id, "CST6CDT") == 0
+ || uprv_strcmp(id, "EST5EDT") == 0);
+}
#endif
U_CAPI const char* U_EXPORT2
uprv_tzname(int n)
{
-#ifdef WIN32
- char* id = (char*) detectWindowsTimeZone();
+#ifdef U_WINDOWS
+ const char *id = uprv_detectWindowsTimeZone();
+
if (id != NULL) {
return id;
}
-#endif
+#else
+ const char *tzenv = NULL;
-#if defined(U_DARWIN)
+/*#if defined(U_DARWIN)
int ret;
- char *tzenv;
-
tzenv = getenv("TZFILE");
if (tzenv != NULL) {
return tzenv;
}
+#endif*/
-#if 0
- /* TZ is often set to "PST8PDT" or similar, so we cannot use it. Alan */
tzenv = getenv("TZ");
- if (tzenv != NULL) {
+ if (tzenv != NULL && isValidOlsonID(tzenv))
+ {
+ /* This might be a good Olson ID. */
+ if (uprv_strncmp(tzenv, "posix/", 6) == 0
+ || uprv_strncmp(tzenv, "right/", 6) == 0)
+ {
+ /* Remove the posix/ or right/ prefix. */
+ tzenv += 6;
+ }
return tzenv;
}
-#endif
-
- /* Caller must handle threading issues */
- if (gTimeZoneBuffer == NULL) {
- gTimeZoneBuffer = (char *) uprv_malloc(MAXPATHLEN + 2);
+ /* else U_TZNAME will give a better result. */
- ret = readlink(TZZONELINK, gTimeZoneBuffer, MAXPATHLEN + 2);
+#if defined(CHECK_LOCALTIME_LINK)
+ /* Caller must handle threading issues */
+ if (gTimeZoneBufferPtr == NULL) {
+ /*
+ This is a trick to look at the name of the link to get the Olson ID
+ because the tzfile contents is underspecified.
+ This isn't guaranteed to work because it may not be a symlink.
+ */
+ int32_t ret = (int32_t)readlink(TZDEFAULT, gTimeZoneBuffer, sizeof(gTimeZoneBuffer));
if (0 < ret) {
- gTimeZoneBuffer[ret] = '\0';
- if (uprv_strncmp(gTimeZoneBuffer, TZZONEINFO, sizeof(TZZONEINFO) - 1) == 0) {
- return (gTimeZoneBuffer += sizeof(TZZONEINFO) - 1);
+ int32_t tzZoneInfoLen = uprv_strlen(TZZONEINFO);
+ gTimeZoneBuffer[ret] = 0;
+ if (uprv_strncmp(gTimeZoneBuffer, TZZONEINFO, tzZoneInfoLen) == 0
+ && isValidOlsonID(gTimeZoneBuffer + tzZoneInfoLen))
+ {
+ return (gTimeZoneBufferPtr = gTimeZoneBuffer + tzZoneInfoLen);
}
}
-
- uprv_free(gTimeZoneBuffer);
- gTimeZoneBuffer = NULL;
}
+ else {
+ return gTimeZoneBufferPtr;
+ }
+#endif
#endif
#ifdef U_TZNAME
+ /*
+ U_TZNAME is usually a non-unique abbreviation,
+ which isn't normally usable.
+ */
return U_TZNAME[n];
#else
return "";
@@ -1252,10 +694,10 @@ static char *gDataDirectory = NULL;
static UBool U_CALLCONV putil_cleanup(void)
{
- if (gDataDirectory) {
+ if (gDataDirectory && *gDataDirectory) {
uprv_free(gDataDirectory);
- gDataDirectory = NULL;
}
+ gDataDirectory = NULL;
#if U_POSIX_LOCALE
if (gCorrectedPOSIXLocale) {
uprv_free(gCorrectedPOSIXLocale);
@@ -1273,26 +715,32 @@ static UBool U_CALLCONV putil_cleanup(void)
U_CAPI void U_EXPORT2
u_setDataDirectory(const char *directory) {
char *newDataDir;
-#if (U_FILE_SEP_CHAR != U_FILE_ALT_SEP_CHAR)
- char *p;
-#endif
int32_t length;
- if(directory==NULL) {
- directory = "";
+ if(directory==NULL || *directory==0) {
+ /* A small optimization to prevent the malloc and copy when the
+ shared library is used, and this is a way to make sure that NULL
+ is never returned.
+ */
+ newDataDir = (char *)"";
}
- length=(int32_t)uprv_strlen(directory);
- newDataDir = (char *)uprv_malloc(length + 2);
- uprv_strcpy(newDataDir, directory);
+ else {
+ length=(int32_t)uprv_strlen(directory);
+ newDataDir = (char *)uprv_malloc(length + 2);
+ uprv_strcpy(newDataDir, directory);
#if (U_FILE_SEP_CHAR != U_FILE_ALT_SEP_CHAR)
- while(p = uprv_strchr(newDataDir, U_FILE_ALT_SEP_CHAR)) {
- *p = U_FILE_SEP_CHAR;
- }
+ {
+ char *p;
+ while(p = uprv_strchr(newDataDir, U_FILE_ALT_SEP_CHAR)) {
+ *p = U_FILE_SEP_CHAR;
+ }
+ }
#endif
+ }
umtx_lock(NULL);
- if (gDataDirectory) {
+ if (gDataDirectory && *gDataDirectory) {
uprv_free(gDataDirectory);
}
gDataDirectory = newDataDir;
@@ -1317,7 +765,7 @@ uprv_pathIsAbsolute(const char *path)
}
#endif
-#if defined(WIN32)
+#if defined(U_WINDOWS)
if( (((path[0] >= 'A') && (path[0] <= 'Z')) ||
((path[0] >= 'a') && (path[0] <= 'z'))) &&
path[1] == ':' ) {
@@ -1331,97 +779,33 @@ uprv_pathIsAbsolute(const char *path)
U_CAPI const char * U_EXPORT2
u_getDataDirectory(void) {
const char *path = NULL;
- char pathBuffer[1024];
- const char *dataDir;
/* if we have the directory, then return it immediately */
umtx_lock(NULL);
- dataDir = gDataDirectory;
+ path = gDataDirectory;
umtx_unlock(NULL);
- if(dataDir) {
- return dataDir;
+ if(path) {
+ return path;
}
- /* we need to look for it */
- pathBuffer[0] = 0; /* Shuts up compiler warnings about unreferenced */
- /* variables when the code using it is ifdefed out */
-# if !defined(XP_MAC)
- /* first try to get the environment variable */
+ /*
+ When ICU_NO_USER_DATA_OVERRIDE is defined, users aren't allowed to
+ override ICU's data with the ICU_DATA environment variable. This prevents
+ problems where multiple custom copies of ICU's specific version of data
+ are installed on a system. Either the application must define the data
+ directory with u_setDataDirectory, define ICU_DATA_DIR when compiling
+ ICU, set the data with udata_setCommonData or trust that all of the
+ required data is contained in ICU's data library that contains
+ the entry point defined by U_ICUDATA_ENTRY_POINT.
+
+ There may also be some platforms where environment variables
+ are not allowed.
+ */
+# if !defined(ICU_NO_USER_DATA_OVERRIDE) && !UCONFIG_NO_FILE_IO
+ /* First try to get the environment variable */
path=getenv("ICU_DATA");
-# else /* XP_MAC */
- {
- OSErr myErr;
- short vRef;
- long dir,newDir;
- int16_t volNum;
- Str255 xpath;
- FSSpec spec;
- short len;
- Handle full;
-
- xpath[0]=0;
-
- myErr = HGetVol(xpath, &volNum, &dir);
-
- if(myErr == noErr) {
- myErr = FindFolder(volNum, kApplicationSupportFolderType, TRUE, &vRef, &dir);
- newDir=-1;
- if (myErr == noErr) {
- myErr = DirCreate(volNum,
- dir,
- "\pICU",
- &newDir);
- if( (myErr == noErr) || (myErr == dupFNErr) ) {
- spec.vRefNum = volNum;
- spec.parID = dir;
- uprv_memcpy(spec.name, "\pICU", 4);
-
- myErr = FSpGetFullPath(&spec, &len, &full);
- if(full != NULL)
- {
- HLock(full);
- uprv_memcpy(pathBuffer, ((char*)(*full)), len);
- pathBuffer[len] = 0;
- path = pathBuffer;
- DisposeHandle(full);
- }
- }
- }
- }
- }
-# endif
-
-
-# if defined WIN32 && defined ICU_ENABLE_DEPRECATED_WIN_REGISTRY
- /* next, try to read the path from the registry */
- if(path==NULL || *path==0) {
- HKEY key;
-
- if(ERROR_SUCCESS==RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SOFTWARE\\ICU\\Unicode\\Data", 0, KEY_QUERY_VALUE, &key)) {
- DWORD type=REG_EXPAND_SZ, size=sizeof(pathBuffer);
-
- if(ERROR_SUCCESS==RegQueryValueEx(key, "Path", NULL, &type, (unsigned char *)pathBuffer, &size) && size>1) {
- if(type==REG_EXPAND_SZ) {
- /* replace environment variable references by their values */
- char temporaryPath[1024];
-
- /* copy the path with variables to the temporary one */
- uprv_memcpy(temporaryPath, pathBuffer, size);
-
- /* do the replacement and store it in the pathBuffer */
- size=ExpandEnvironmentStrings(temporaryPath, pathBuffer, sizeof(pathBuffer));
- if(size>0 && size no_NO_NY here?
* How about 'russian' -> 'ru'?
+ * Many of the other locales using ISO codes will be handled by the
+ * canonicalization functions in uloc_getDefault.
*/
}
@@ -1704,7 +1101,7 @@ The leftmost codepage (.xxx) wins.
return posixID;
-#elif defined(WIN32)
+#elif defined(U_WINDOWS)
UErrorCode status = U_ZERO_ERROR;
LCID id = GetThreadLocale();
const char* locID = uprv_convertToPosix(id, &status);
@@ -1749,20 +1146,6 @@ The leftmost codepage (.xxx) wins.
return posixID;
-#elif defined(OS2)
- char * locID;
-
- locID = getenv("LC_ALL");
- if (!locID || !*locID)
- locID = getenv("LANG");
- if (!locID || !*locID) {
- locID = "en_US";
- }
- if (!stricmp(locID, "c") || !stricmp(locID, "posix") ||
- !stricmp(locID, "univ"))
- locID = "en_US_POSIX";
- return locID;
-
#elif defined(OS400)
/* locales are process scoped and are by definition thread safe */
static char correctedLocale[64];
@@ -1799,10 +1182,13 @@ The leftmost codepage (.xxx) wins.
/* See if we are using the POSIX locale. Any of the
* following are equivalent and use the same QLGPGCMA
* (POSIX) locale.
+ * QLGPGCMA2 means UCS2
+ * QLGPGCMA_4 means UTF-32
+ * QLGPGCMA_8 means UTF-8
*/
if ((uprv_strcmp("C", correctedLocale) == 0) ||
(uprv_strcmp("POSIX", correctedLocale) == 0) ||
- (uprv_strcmp("QLGPGCMA", correctedLocale) == 0))
+ (uprv_strncmp("QLGPGCMA", correctedLocale, 8) == 0))
{
uprv_strcpy(correctedLocale, "en_US_POSIX");
}
@@ -1855,6 +1241,81 @@ The leftmost codepage (.xxx) wins.
}
+#if U_POSIX_LOCALE
+/*
+Due to various platform differences, one platform may specify a charset,
+when they really mean a different charset. Remap the names so that they are
+compatible with ICU.
+*/
+static const char*
+remapPlatformDependentCodepage(const char *locale, const char *name) {
+ if (locale != NULL && *locale == 0) {
+ /* Make sure that an empty locale is handled the same way. */
+ locale = NULL;
+ }
+ if (name == NULL) {
+ return NULL;
+ }
+#if defined(U_AIX)
+ if (uprv_strcmp(name, "IBM-943") == 0) {
+ /* Use the ASCII compatible ibm-943 */
+ name = "Shift-JIS";
+ }
+ else if (uprv_strcmp(name, "IBM-1252") == 0) {
+ /* Use the windows-1252 that contains the Euro */
+ name = "IBM-5348";
+ }
+#elif defined(U_SOLARIS)
+ if (locale != NULL && uprv_strcmp(name, "EUC") == 0) {
+ /* Solaris underspecifies the "EUC" name. */
+ if (uprv_strcmp(locale, "zh_CN") == 0) {
+ name = "EUC-CN";
+ }
+ else if (uprv_strcmp(locale, "zh_TW") == 0) {
+ name = "EUC-TW";
+ }
+ else if (uprv_strcmp(locale, "ko_KR") == 0) {
+ name = "EUC-KR";
+ }
+ }
+#elif defined(U_DARWIN)
+ if (locale == NULL && *name == 0) {
+ /*
+ No locale was specified, and an empty name was passed in.
+ This usually indicates that nl_langinfo didn't return valid information.
+ Mac OS X uses UTF-8 by default (especially the locale data and console).
+ */
+ name = "UTF-8";
+ }
+#endif
+ /* return NULL when "" is passed in */
+ if (*name == 0) {
+ name = NULL;
+ }
+ return name;
+}
+
+static const char*
+getCodepageFromPOSIXID(const char *localeName, char * buffer, int32_t buffCapacity)
+{
+ char localeBuf[100];
+ const char *name = NULL;
+ char *variant = NULL;
+
+ if (localeName != NULL && (name = (uprv_strchr(localeName, '.'))) != NULL) {
+ size_t localeCapacity = uprv_min(sizeof(localeBuf), (name-localeName)+1);
+ uprv_strncpy(localeBuf, localeName, localeCapacity);
+ localeBuf[localeCapacity-1] = 0; /* ensure NULL termination */
+ name = uprv_strncpy(buffer, name+1, buffCapacity);
+ buffer[buffCapacity-1] = 0; /* ensure NULL termination */
+ if ((variant = (uprv_strchr(name, '@'))) != NULL) {
+ *variant = 0;
+ }
+ name = remapPlatformDependentCodepage(localeBuf, name);
+ }
+ return name;
+}
+#endif
static const char*
int_getDefaultCodepage()
@@ -1886,46 +1347,41 @@ int_getDefaultCodepage()
return codepage;
#elif defined(XP_MAC)
- return "ibm-1275"; /* TODO: Macintosh Roman. There must be a better way. fixme! */
+ return "macintosh"; /* TODO: Macintosh Roman. There must be a better way. fixme! */
-#elif defined(WIN32)
+#elif defined(U_WINDOWS)
static char codepage[64];
sprintf(codepage, "windows-%d", GetACP());
return codepage;
#elif U_POSIX_LOCALE
static char codesetName[100];
- char *name = NULL;
- char *euro = NULL;
const char *localeName = NULL;
+ const char *name = NULL;
uprv_memset(codesetName, 0, sizeof(codesetName));
- /* Check setlocale before the environment variables
- because the application may have set it first */
- /* setlocale needs "" and not NULL for Linux and Solaris */
- localeName = setlocale(LC_CTYPE, "");
- if (localeName != NULL && (name = (uprv_strchr(localeName, '.'))) != NULL) {
- /* strip the locale name and look at the suffix only */
- name = uprv_strncpy(codesetName, name+1, sizeof(codesetName));
- codesetName[sizeof(codesetName)-1] = 0;
- if ((euro = (uprv_strchr(name, '@'))) != NULL) {
- *euro = 0;
- }
- /* if we can find the codset name from setlocale, return that. */
- if (*name) {
- return name;
- }
+ /* Use setlocale in a nice way, and then check some environment variables.
+ Maybe the application used setlocale already.
+ */
+ localeName = uprv_getPOSIXID();
+ name = getCodepageFromPOSIXID(localeName, codesetName, sizeof(codesetName));
+ if (name) {
+ /* if we can find the codeset name from setlocale, return that. */
+ return name;
}
+ /* else "C" was probably returned. That's underspecified. */
#if U_HAVE_NL_LANGINFO_CODESET
if (*codesetName) {
uprv_memset(codesetName, 0, sizeof(codesetName));
}
- /* When available, check nl_langinfo first because it usually gives more
- useful names. It depends on LC_CTYPE and not LANG or LC_ALL */
+ /* When available, check nl_langinfo because it usually gives more
+ useful names. It depends on LC_CTYPE and not LANG or LC_ALL.
+ nl_langinfo may use the same buffer as setlocale. */
{
const char *codeset = nl_langinfo(U_NL_LANGINFO_CODESET);
+ codeset = remapPlatformDependentCodepage(NULL, codeset);
if (codeset != NULL) {
uprv_strncpy(codesetName, codeset, sizeof(codesetName));
codesetName[sizeof(codesetName)-1] = 0;
@@ -1934,28 +1390,9 @@ int_getDefaultCodepage()
}
#endif
- /* Try a locale specified by the user.
- This is usually underspecified and usually checked by setlocale already. */
- if (*codesetName) {
- uprv_memset(codesetName, 0, sizeof(codesetName));
- }
- localeName = uprv_getPOSIXID();
- if (localeName != NULL && (name = (uprv_strchr(localeName, '.'))) != NULL) {
- /* strip the locale name and look at the suffix only */
- name = uprv_strncpy(codesetName, name+1, sizeof(codesetName));
- codesetName[sizeof(codesetName)-1] = 0;
- if ((euro = (uprv_strchr(name, '@'))) != NULL) {
- *euro = 0;
- }
- /* if we can find the codset name, return that. */
- if (*name) {
- return name;
- }
- }
-
if (*codesetName == 0)
{
- /* if the table lookup failed, return US ASCII (ISO 646). */
+ /* Everything failed. Return US ASCII (ISO 646). */
uprv_strcpy(codesetName, "US-ASCII");
}
return codesetName;
diff --git a/icuSources/common/putilimp.h b/icuSources/common/putilimp.h
index 945cae22..04c91b39 100644
--- a/icuSources/common/putilimp.h
+++ b/icuSources/common/putilimp.h
@@ -1,7 +1,7 @@
/*
******************************************************************************
*
-* Copyright (C) 1997-2004, International Business Machines
+* Copyright (C) 1997-2006, International Business Machines
* Corporation and others. All Rights Reserved.
*
******************************************************************************
@@ -134,19 +134,6 @@ U_INTERNAL int32_t U_EXPORT2 uprv_min(int32_t d, int32_t y);
*/
U_INTERNAL double U_EXPORT2 uprv_maxMantissa(void);
-/**
- * Return the floor of the log base 10 of a given double.
- * This method compensates for inaccuracies which arise naturally when
- * computing logs, and always gives the correct value. The parameter
- * must be positive and finite.
- * (Thanks to Alan Liu for supplying this function.)
- *
- * @param d the double value to apply the common log function for.
- * @return the log of value d.
- * @internal
- */
-U_INTERNAL int16_t U_EXPORT2 uprv_log10(double d);
-
/**
* Floating point utility to calculate the logarithm of a double.
* @internal
@@ -254,24 +241,40 @@ U_INTERNAL UBool U_EXPORT2 uprv_pathIsAbsolute(const char *path);
* @internal
*/
#ifndef U_MAX_PTR
-# ifdef OS390
+# if defined(OS390) && !defined(_LP64)
+ /* We have 31-bit pointers. */
# define U_MAX_PTR(base) ((void *)0x7fffffff)
# elif defined(OS400)
/*
* With the provided macro we should never be out of range of a given segment
- * (a traditional/typical segment that is). Our segments have 5 bytes for the id
- * and 3 bytes for the offset. The key is that the casting takes care of only
- * retrieving the offset portion minus x1000. Hence, the smallest offset seen in
- * a program is x001000 and when casted to an int would be 0. That's why we can
- * only add 0xffefff. Otherwise, we would exceed the segment.
+ * (a traditional/typical segment that is). Our segments have 5 bytes for the
+ * id and 3 bytes for the offset. The key is that the casting takes care of
+ * only retrieving the offset portion minus x1000. Hence, the smallest offset
+ * seen in a program is x001000 and when casted to an int would be 0.
+ * That's why we can only add 0xffefff. Otherwise, we would exceed the segment.
*
* Currently, 16MB is the current addressing limitation on as/400. This macro
* may eventually be changed to use 2GB addressability for the newer version of
* as/400 machines.
*/
# define U_MAX_PTR(base) ((void *)(((char *)base)-((int32_t)(base))+((int32_t)0xffefff)))
+# elif defined(__GNUC__) && __GNUC__ >= 4
+/*
+ * Due to a compiler optimization bug, gcc 4 causes test failures when doing
+ * this math arithmetic on pointers on some platforms. It seems like the
+ * pointers are considered signed instead of unsigned. The uintptr_t type
+ * isn't available on all platforms (i.e MSVC 6) and pointers aren't always
+ * a scalar value (i.e. i5/OS in the lines above).
+ */
+# define U_MAX_PTR(base) \
+ ((void *)(((uintptr_t)(base)+0x7fffffffu) > (uintptr_t)(base) \
+ ? ((uintptr_t)(base)+0x7fffffffu) \
+ : (uintptr_t)-1))
# else
-# define U_MAX_PTR(base) ((void *)(((char *)(base)+0x7fffffffu) > (char *)(base) ? ((char *)(base)+0x7fffffffu) : (char *)-1))
+# define U_MAX_PTR(base) \
+ ((char *)(((char *)(base)+0x7fffffffu) > (char *)(base) \
+ ? ((char *)(base)+0x7fffffffu) \
+ : (char *)-1))
# endif
#endif
diff --git a/icuSources/common/rbbi.cpp b/icuSources/common/rbbi.cpp
index 50a9f0d6..10216c22 100644
--- a/icuSources/common/rbbi.cpp
+++ b/icuSources/common/rbbi.cpp
@@ -1,6 +1,6 @@
/*
***************************************************************************
-* Copyright (C) 1999-2004 International Business Machines Corporation *
+* Copyright (C) 1999-2006 International Business Machines Corporation *
* and others. All rights reserved. *
***************************************************************************
*/
@@ -16,14 +16,28 @@
#include "unicode/rbbi.h"
#include "unicode/schriter.h"
+#include "unicode/uchriter.h"
#include "unicode/udata.h"
#include "unicode/uclean.h"
#include "rbbidata.h"
#include "rbbirb.h"
#include "cmemory.h"
#include "cstring.h"
+#include "mutex.h"
+#include "ucln_cmn.h"
+#include "brkeng.h"
#include "uassert.h"
+#include "uvector.h"
+
+// if U_LOCAL_SERVICE_HOOK is defined, then localsvc.cpp is expected to be included.
+#if U_LOCAL_SERVICE_HOOK
+#include "localsvc.h"
+#endif
+
+#ifdef RBBI_DEBUG
+static UBool fTrace = FALSE;
+#endif
U_NAMESPACE_BEGIN
@@ -82,7 +96,6 @@ RuleBasedBreakIterator::RuleBasedBreakIterator( const UnicodeString &rules,
UParseError &parseError,
UErrorCode &status)
{
- u_init(&status); // Just in case ICU is not yet initialized
init();
if (U_FAILURE(status)) {return;}
RuleBasedBreakIterator *bi = (RuleBasedBreakIterator *)
@@ -127,12 +140,34 @@ RuleBasedBreakIterator::RuleBasedBreakIterator(const RuleBasedBreakIterator& oth
* Destructor
*/
RuleBasedBreakIterator::~RuleBasedBreakIterator() {
- delete fText;
- fText = NULL;
+ if (fCharIter!=fSCharIter && fCharIter!=fDCharIter) {
+ // fCharIter was adopted from the outside.
+ delete fCharIter;
+ }
+ fCharIter = NULL;
+ delete fSCharIter;
+ fCharIter = NULL;
+ delete fDCharIter;
+ fDCharIter = NULL;
+
+ utext_close(fText);
+
if (fData != NULL) {
fData->removeReference();
fData = NULL;
}
+ if (fCachedBreakPositions) {
+ uprv_free(fCachedBreakPositions);
+ fCachedBreakPositions = NULL;
+ }
+ if (fLanguageBreakEngines) {
+ delete fLanguageBreakEngines;
+ fLanguageBreakEngines = NULL;
+ }
+ if (fUnhandledBreakEngine) {
+ delete fUnhandledBreakEngine;
+ fUnhandledBreakEngine = NULL;
+ }
}
/**
@@ -144,10 +179,26 @@ RuleBasedBreakIterator::operator=(const RuleBasedBreakIterator& that) {
if (this == &that) {
return *this;
}
- delete fText;
- fText = NULL;
- if (that.fText != NULL) {
- fText = that.fText->clone();
+ reset(); // Delete break cache information
+ fBreakType = that.fBreakType;
+ if (fLanguageBreakEngines != NULL) {
+ delete fLanguageBreakEngines;
+ fLanguageBreakEngines = NULL; // Just rebuild for now
+ }
+ // TODO: clone fLanguageBreakEngines from "that"
+ UErrorCode status = U_ZERO_ERROR;
+ fText = utext_clone(fText, that.fText, FALSE, TRUE, &status);
+
+ if (fCharIter!=fSCharIter && fCharIter!=fDCharIter) {
+ delete fCharIter;
+ }
+ fCharIter = NULL;
+
+ if (that.fCharIter != NULL ) {
+ // This is a little bit tricky - it will intially appear that
+ // this->fCharIter is adopted, even if that->fCharIter was
+ // not adopted. That's ok.
+ fCharIter = that.fCharIter->clone();
}
if (fData != NULL) {
@@ -157,7 +208,6 @@ RuleBasedBreakIterator::operator=(const RuleBasedBreakIterator& that) {
if (that.fData != NULL) {
fData = that.fData->addReference();
}
- fTrace = that.fTrace;
return *this;
}
@@ -170,14 +220,24 @@ RuleBasedBreakIterator::operator=(const RuleBasedBreakIterator& that) {
// Initializes all fields, leaving the object in a consistent state.
//
//-----------------------------------------------------------------------------
-UBool RuleBasedBreakIterator::fTrace = FALSE;
void RuleBasedBreakIterator::init() {
-
- fText = NULL;
+ UErrorCode status = U_ZERO_ERROR;
+ fBufferClone = FALSE;
+ fText = utext_openUChars(NULL, NULL, 0, &status);
+ fCharIter = NULL;
+ fSCharIter = NULL;
+ fDCharIter = NULL;
fData = NULL;
fLastRuleStatusIndex = 0;
fLastStatusIndexValid = TRUE;
fDictionaryCharCount = 0;
+ fBreakType = -1;
+
+ fCachedBreakPositions = NULL;
+ fLanguageBreakEngines = NULL;
+ fUnhandledBreakEngine = NULL;
+ fNumCachedBreakPositions = 0;
+ fPositionInCache = 0;
#ifdef RBBI_DEBUG
static UBool debugInitDone = FALSE;
@@ -211,20 +271,26 @@ RuleBasedBreakIterator::clone(void) const {
*/
UBool
RuleBasedBreakIterator::operator==(const BreakIterator& that) const {
- UBool r = FALSE;
if (that.getDynamicClassID() != getDynamicClassID()) {
- return r;
+ return FALSE;
}
const RuleBasedBreakIterator& that2 = (const RuleBasedBreakIterator&) that;
- if (fText == that2.fText ||
- (fText != NULL && that2.fText != NULL && *that2.fText == *fText)) {
- if (that2.fData == fData ||
- (fData != NULL && that2.fData != NULL && *that2.fData == *fData)) {
- r = TRUE;
+
+ if (!utext_equals(fText, that2.fText)) {
+ // The two break iterators are operating on different text,
+ // or have a different interation position.
+ return FALSE;
+ };
+
+ // TODO: need a check for when in a dictionary region at different offsets.
+
+ if (that2.fData == fData ||
+ (fData != NULL && that2.fData != NULL && *that2.fData == *fData)) {
+ // The two break iterators are using the same rules.
+ return TRUE;
}
- }
- return r;
+ return FALSE;
}
/**
@@ -240,6 +306,42 @@ RuleBasedBreakIterator::hashCode(void) const {
return hash;
}
+
+void RuleBasedBreakIterator::setText(UText *ut, UErrorCode &status) {
+ if (U_FAILURE(status)) {
+ return;
+ }
+ reset();
+ fText = utext_clone(fText, ut, FALSE, TRUE, &status);
+
+ // Set up a dummy CharacterIterator to be returned if anyone
+ // calls getText(). With input from UText, there is no reasonable
+ // way to return a characterIterator over the actual input text.
+ // Return one over an empty string instead - this is the closest
+ // we can come to signaling a failure.
+ // (GetText() is obsolete, this failure is sort of OK)
+ if (fDCharIter == NULL) {
+ static UChar c = 0;
+ fDCharIter = new UCharCharacterIterator(&c, 0);
+ }
+
+ if (fCharIter!=fSCharIter && fCharIter!=fDCharIter) {
+ // existing fCharIter was adopted from the outside. Delete it now.
+ delete fCharIter;
+ }
+ fCharIter = fDCharIter;
+
+ this->first();
+}
+
+
+UText *RuleBasedBreakIterator::getUText(UText *fillIn, UErrorCode &status) const {
+ UText *result = utext_clone(fillIn, fText, FALSE, TRUE, &status);
+ return result;
+}
+
+
+
/**
* Returns the description used to create this iterator
*/
@@ -265,23 +367,11 @@ RuleBasedBreakIterator::getRules() const {
//=======================================================================
/**
- * Return a CharacterIterator over the text being analyzed. This version
- * of this method returns the actual CharacterIterator we're using internally.
- * Changing the state of this iterator can have undefined consequences. If
- * you need to change it, clone it first.
- * @return An iterator over the text being analyzed.
+ * Return a CharacterIterator over the text being analyzed.
*/
-const CharacterIterator&
+CharacterIterator&
RuleBasedBreakIterator::getText() const {
- RuleBasedBreakIterator* nonConstThis = (RuleBasedBreakIterator*)this;
-
- // The iterator is initialized pointing to no text at all, so if this
- // function is called while we're in that state, we have to fudge an
- // an iterator to return.
- if (nonConstThis->fText == NULL) {
- nonConstThis->fText = new StringCharacterIterator(UnicodeString());
- }
- return *nonConstThis->fText;
+ return *fCharIter;
}
/**
@@ -291,9 +381,22 @@ RuleBasedBreakIterator::getText() const {
*/
void
RuleBasedBreakIterator::adoptText(CharacterIterator* newText) {
+ // If we are holding a CharacterIterator adopted from a
+ // previous call to this function, delete it now.
+ if (fCharIter!=fSCharIter && fCharIter!=fDCharIter) {
+ delete fCharIter;
+ }
+
+ fCharIter = newText;
+ UErrorCode status = U_ZERO_ERROR;
reset();
- delete fText;
- fText = newText;
+ if (newText==NULL || newText->startIndex() != 0) {
+ // startIndex !=0 wants to be an error, but there's no way to report it.
+ // Make the iterator text be an empty string.
+ fText = utext_openUChars(fText, NULL, 0, &status);
+ } else {
+ fText = utext_openCharacterIterator(fText, newText, &status);
+ }
this->first();
}
@@ -304,15 +407,26 @@ RuleBasedBreakIterator::adoptText(CharacterIterator* newText) {
*/
void
RuleBasedBreakIterator::setText(const UnicodeString& newText) {
+ UErrorCode status = U_ZERO_ERROR;
reset();
- if (fText != NULL && fText->getDynamicClassID()
- == StringCharacterIterator::getStaticClassID()) {
- ((StringCharacterIterator*)fText)->setText(newText);
+ fText = utext_openConstUnicodeString(fText, &newText, &status);
+
+ // Set up a character iterator on the string.
+ // Needed in case someone calls getText().
+ // Can not, unfortunately, do this lazily on the (probably never)
+ // call to getText(), because getText is const.
+ if (fSCharIter == NULL) {
+ fSCharIter = new StringCharacterIterator(newText);
+ } else {
+ fSCharIter->setText(newText);
}
- else {
- delete fText;
- fText = new StringCharacterIterator(newText);
+
+ if (fCharIter!=fSCharIter && fCharIter!=fDCharIter) {
+ // old fCharIter was adopted from the outside. Delete it.
+ delete fCharIter;
}
+ fCharIter = fSCharIter;
+
this->first();
}
@@ -320,23 +434,21 @@ RuleBasedBreakIterator::setText(const UnicodeString& newText) {
/**
* Sets the current iteration position to the beginning of the text.
- * (i.e., the CharacterIterator's starting offset).
* @return The offset of the beginning of the text.
*/
int32_t RuleBasedBreakIterator::first(void) {
reset();
fLastRuleStatusIndex = 0;
fLastStatusIndexValid = TRUE;
- if (fText == NULL)
- return BreakIterator::DONE;
+ //if (fText == NULL)
+ // return BreakIterator::DONE;
- fText->first();
- return fText->getIndex();
+ utext_setNativeIndex(fText, 0);
+ return 0;
}
/**
* Sets the current iteration position to the end of the text.
- * (i.e., the CharacterIterator's ending offset).
* @return The text's past-the-end offset.
*/
int32_t RuleBasedBreakIterator::last(void) {
@@ -347,17 +459,9 @@ int32_t RuleBasedBreakIterator::last(void) {
return BreakIterator::DONE;
}
- // I'm not sure why, but t.last() returns the offset of the last character,
- // rather than the past-the-end offset
- //
- // (It's so a loop like for(p=it.last(); p!=DONE; p=it.previous()) ...
- // will work correctly.)
-
-
fLastStatusIndexValid = FALSE;
- int32_t pos = fText->endIndex();
- fText->setIndex(pos);
-
+ int32_t pos = (int32_t)utext_nativeLength(fText);
+ utext_setNativeIndex(fText, pos);
return pos;
}
@@ -373,7 +477,7 @@ int32_t RuleBasedBreakIterator::last(void) {
int32_t RuleBasedBreakIterator::next(int32_t n) {
int32_t result = current();
while (n > 0) {
- result = handleNext();
+ result = next();
--n;
}
while (n < 0) {
@@ -388,7 +492,26 @@ int32_t RuleBasedBreakIterator::next(int32_t n) {
* @return The position of the first boundary after this one.
*/
int32_t RuleBasedBreakIterator::next(void) {
- return handleNext();
+ // if we have cached break positions and we're still in the range
+ // covered by them, just move one step forward in the cache
+ if (fCachedBreakPositions != NULL) {
+ if (fPositionInCache < fNumCachedBreakPositions - 1) {
+ ++fPositionInCache;
+ int32_t pos = fCachedBreakPositions[fPositionInCache];
+ utext_setNativeIndex(fText, pos);
+ return pos;
+ }
+ else {
+ reset();
+ }
+ }
+
+ int32_t startPos = current();
+ int32_t result = handleNext(fData->fForwardTable);
+ if (fDictionaryCharCount > 0) {
+ result = checkDictionary(startPos, result, FALSE);
+ }
+ return result;
}
/**
@@ -396,15 +519,41 @@ int32_t RuleBasedBreakIterator::next(void) {
* @return The position of the last boundary position preceding this one.
*/
int32_t RuleBasedBreakIterator::previous(void) {
+ int32_t result;
+ int32_t startPos;
+
+ // if we have cached break positions and we're still in the range
+ // covered by them, just move one step backward in the cache
+ if (fCachedBreakPositions != NULL) {
+ if (fPositionInCache > 0) {
+ --fPositionInCache;
+ // If we're at the beginning of the cache, need to reevaluate the
+ // rule status
+ if (fPositionInCache <= 0) {
+ fLastStatusIndexValid = FALSE;
+ }
+ int32_t pos = fCachedBreakPositions[fPositionInCache];
+ utext_setNativeIndex(fText, pos);
+ return pos;
+ }
+ else {
+ reset();
+ }
+ }
+
// if we're already sitting at the beginning of the text, return DONE
- if (fText == NULL || current() == fText->startIndex()) {
+ if (fText == NULL || (startPos = current()) == 0) {
fLastRuleStatusIndex = 0;
fLastStatusIndexValid = TRUE;
return BreakIterator::DONE;
}
if (fData->fSafeRevTable != NULL || fData->fSafeFwdTable != NULL) {
- return handlePrevious(fData->fReverseTable);
+ result = handlePrevious(fData->fReverseTable);
+ if (fDictionaryCharCount > 0) {
+ result = checkDictionary(result, startPos, TRUE);
+ }
+ return result;
}
// old rule syntax
@@ -412,13 +561,18 @@ int32_t RuleBasedBreakIterator::previous(void) {
// break position before the current position (we back our internal
// iterator up one step to prevent handlePrevious() from returning
// the current position), but not necessarily the last one before
+
// where we started
int32_t start = current();
- fText->previous32();
- int32_t lastResult = handlePrevious();
- int32_t result = lastResult;
+ UTEXT_PREVIOUS32(fText);
+ int32_t lastResult = handlePrevious(fData->fReverseTable);
+ if (lastResult == UBRK_DONE) {
+ lastResult = 0;
+ utext_setNativeIndex(fText, 0);
+ }
+ result = lastResult;
int32_t lastTag = 0;
UBool breakTagValid = FALSE;
@@ -427,7 +581,7 @@ int32_t RuleBasedBreakIterator::previous(void) {
// point is our return value
for (;;) {
- result = handleNext();
+ result = next();
if (result == BreakIterator::DONE || result >= start) {
break;
}
@@ -439,15 +593,19 @@ int32_t RuleBasedBreakIterator::previous(void) {
// fLastBreakTag wants to have the value for section of text preceding
// the result position that we are to return (in lastResult.) If
// the backwards rules overshot and the above loop had to do two or more
- // handleNext()s to move up to the desired return position, we will have a valid
+ // next()s to move up to the desired return position, we will have a valid
// tag value. But, if handlePrevious() took us to exactly the correct result positon,
// we wont have a tag value for that position, which is only set by handleNext().
// set the current iteration position to be the last break position
// before where we started, and then return that value
- fText->setIndex(lastResult);
+ utext_setNativeIndex(fText, lastResult);
fLastRuleStatusIndex = lastTag; // for use by getRuleStatus()
fLastStatusIndexValid = breakTagValid;
+
+ // No need to check the dictionary; it will have been handled by
+ // next()
+
return lastResult;
}
@@ -458,16 +616,37 @@ int32_t RuleBasedBreakIterator::previous(void) {
* @return The position of the first break after the current position.
*/
int32_t RuleBasedBreakIterator::following(int32_t offset) {
+ // if we have cached break positions and offset is in the range
+ // covered by them, use them
+ // TODO: could use binary search
+ // TODO: what if offset is outside range, but break is not?
+ if (fCachedBreakPositions != NULL) {
+ if (offset >= fCachedBreakPositions[0]
+ && offset < fCachedBreakPositions[fNumCachedBreakPositions - 1]) {
+ fPositionInCache = 0;
+ // We are guaranteed not to leave the array due to range test above
+ while (offset >= fCachedBreakPositions[fPositionInCache]) {
+ ++fPositionInCache;
+ }
+ int32_t pos = fCachedBreakPositions[fPositionInCache];
+ utext_setNativeIndex(fText, pos);
+ return pos;
+ }
+ else {
+ reset();
+ }
+ }
+
// if the offset passed in is already past the end of the text,
// just return DONE; if it's before the beginning, return the
// text's starting offset
fLastRuleStatusIndex = 0;
fLastStatusIndexValid = TRUE;
- if (fText == NULL || offset >= fText->endIndex()) {
+ if (fText == NULL || offset >= utext_nativeLength(fText)) {
last();
return next();
}
- else if (offset < fText->startIndex()) {
+ else if (offset < 0) {
return first();
}
@@ -479,12 +658,11 @@ int32_t RuleBasedBreakIterator::following(int32_t offset) {
if (fData->fSafeRevTable != NULL) {
// new rule syntax
- /// todo synwee
- fText->setIndex(offset);
+ utext_setNativeIndex(fText, offset);
// move forward one codepoint to prepare for moving back to a
// safe point.
// this handles offset being between a supplementary character
- fText->next32();
+ UTEXT_NEXT32(fText);
// handlePrevious will move most of the time to < 1 boundary away
handlePrevious(fData->fSafeRevTable);
int32_t result = next();
@@ -495,8 +673,8 @@ int32_t RuleBasedBreakIterator::following(int32_t offset) {
}
if (fData->fSafeFwdTable != NULL) {
// backup plan if forward safe table is not available
- fText->setIndex(offset);
- fText->previous32();
+ utext_setNativeIndex(fText, offset);
+ UTEXT_PREVIOUS32(fText);
// handle next will give result >= offset
handleNext(fData->fSafeFwdTable);
// previous will give result 0 or 1 boundary away from offset,
@@ -517,7 +695,7 @@ int32_t RuleBasedBreakIterator::following(int32_t offset) {
return result;
}
// otherwise, we have to sync up first. Use handlePrevious() to back
- // us up to a known break position before the specified position (if
+ // up to a known break position before the specified position (if
// we can determine that the specified position is a break position,
// we don't back up at all). This may or may not be the last break
// position at or before our starting position. Advance forward
@@ -525,9 +703,10 @@ int32_t RuleBasedBreakIterator::following(int32_t offset) {
// we stop on will be the first break position after the specified one.
// old rule syntax
- fText->setIndex(offset);
- if (offset == fText->startIndex()) {
- return handleNext();
+ utext_setNativeIndex(fText, offset);
+ if (offset==0 ||
+ offset==1 && utext_getNativeIndex(fText)==0) {
+ return next();
}
result = previous();
@@ -545,15 +724,39 @@ int32_t RuleBasedBreakIterator::following(int32_t offset) {
* @return The position of the last boundary before the starting position.
*/
int32_t RuleBasedBreakIterator::preceding(int32_t offset) {
+ // if we have cached break positions and offset is in the range
+ // covered by them, use them
+ if (fCachedBreakPositions != NULL) {
+ // TODO: binary search?
+ // TODO: What if offset is outside range, but break is not?
+ if (offset > fCachedBreakPositions[0]
+ && offset <= fCachedBreakPositions[fNumCachedBreakPositions - 1]) {
+ fPositionInCache = 0;
+ while (fPositionInCache < fNumCachedBreakPositions
+ && offset > fCachedBreakPositions[fPositionInCache])
+ ++fPositionInCache;
+ --fPositionInCache;
+ // If we're at the beginning of the cache, need to reevaluate the
+ // rule status
+ if (fPositionInCache <= 0) {
+ fLastStatusIndexValid = FALSE;
+ }
+ utext_setNativeIndex(fText, fCachedBreakPositions[fPositionInCache]);
+ return fCachedBreakPositions[fPositionInCache];
+ }
+ else {
+ reset();
+ }
+ }
+
// if the offset passed in is already past the end of the text,
// just return DONE; if it's before the beginning, return the
-
// text's starting offset
- if (fText == NULL || offset > fText->endIndex()) {
+ if (fText == NULL || offset > utext_nativeLength(fText)) {
// return BreakIterator::DONE;
return last();
}
- else if (offset < fText->startIndex()) {
+ else if (offset < 0) {
return first();
}
@@ -562,18 +765,27 @@ int32_t RuleBasedBreakIterator::preceding(int32_t offset) {
// to carry out this operation
if (fData->fSafeFwdTable != NULL) {
- /// todo synwee
// new rule syntax
- fText->setIndex(offset);
- // move backwards one codepoint to prepare for moving forwards to a
- // safe point.
- // this handles offset being between a supplementary character
- // TODO: would it be better to just check for being in the middle of a surrogate pair,
+ utext_setNativeIndex(fText, offset);
+ int32_t newOffset = (int32_t)UTEXT_GETNATIVEINDEX(fText);
+ if (newOffset != offset) {
+ // Will come here if specified offset was not a code point boundary AND
+ // the underlying implmentation is using UText, which snaps any non-code-point-boundary
+ // indices to the containing code point.
+ // For breakitereator::preceding only, these non-code-point indices need to be moved
+ // up to refer to the following codepoint.
+ UTEXT_NEXT32(fText);
+ offset = (int32_t)UTEXT_GETNATIVEINDEX(fText);
+ }
+
+ // TODO: (synwee) would it be better to just check for being in the middle of a surrogate pair,
// rather than adjusting the position unconditionally?
// (Change would interact with safe rules.)
- fText->previous32();
+ // TODO: change RBBI behavior for off-boundary indices to match that of UText?
+ // affects only preceding(), seems cleaner, but is slightly different.
+ UTEXT_PREVIOUS32(fText);
handleNext(fData->fSafeFwdTable);
- int32_t result = fText->getIndex();
+ int32_t result = (int32_t)UTEXT_GETNATIVEINDEX(fText);
while (result >= offset) {
result = previous();
}
@@ -581,8 +793,13 @@ int32_t RuleBasedBreakIterator::preceding(int32_t offset) {
}
if (fData->fSafeRevTable != NULL) {
// backup plan if forward safe table is not available
- fText->setIndex(offset);
- fText->next32();
+ // TODO: check whether this path can be discarded
+ // It's probably OK to say that rules must supply both safe tables
+ // if they use safe tables at all. We have certainly never described
+ // to anyone how to work with just one safe table.
+ utext_setNativeIndex(fText, offset);
+ UTEXT_NEXT32(fText);
+
// handle previous will give result <= offset
handlePrevious(fData->fSafeRevTable);
@@ -605,7 +822,7 @@ int32_t RuleBasedBreakIterator::preceding(int32_t offset) {
}
// old rule syntax
- fText->setIndex(offset);
+ utext_setNativeIndex(fText, offset);
return previous();
}
@@ -618,23 +835,23 @@ int32_t RuleBasedBreakIterator::preceding(int32_t offset) {
*/
UBool RuleBasedBreakIterator::isBoundary(int32_t offset) {
// the beginning index of the iterator is always a boundary position by definition
- if (fText == NULL || offset == fText->startIndex()) {
+ if (offset == 0) {
first(); // For side effects on current position, tag values.
return TRUE;
}
- if (offset == fText->endIndex()) {
+ if (offset == (int32_t)utext_nativeLength(fText)) {
last(); // For side effects on current position, tag values.
return TRUE;
}
// out-of-range indexes are never boundary positions
- if (offset < fText->startIndex()) {
+ if (offset < 0) {
first(); // For side effects on current position, tag values.
return FALSE;
}
- if (offset > fText->endIndex()) {
+ if (offset > utext_nativeLength(fText)) {
last(); // For side effects on current position, tag values.
return FALSE;
}
@@ -642,7 +859,10 @@ UBool RuleBasedBreakIterator::isBoundary(int32_t offset) {
// otherwise, we can use following() on the position before the specified
// one and return true if the position we get back is the one the user
// specified
- return following(offset - 1) == offset;
+ utext_previous32From(fText, offset);
+ int32_t backOne = (int32_t)UTEXT_GETNATIVEINDEX(fText);
+ UBool result = following(backOne) == offset;
+ return result;
}
/**
@@ -650,112 +870,136 @@ UBool RuleBasedBreakIterator::isBoundary(int32_t offset) {
* @return The current iteration position.
*/
int32_t RuleBasedBreakIterator::current(void) const {
- return (fText != NULL) ? fText->getIndex() : BreakIterator::DONE;
+ int32_t pos = (int32_t)UTEXT_GETNATIVEINDEX(fText);
+ return pos;
}
-
+
//=======================================================================
// implementation
//=======================================================================
+//
+// RBBIRunMode - the state machine runs an extra iteration at the beginning and end
+// of user text. A variable with this enum type keeps track of where we
+// are. The state machine only fetches user input while in the RUN mode.
+//
+enum RBBIRunMode {
+ RBBI_START, // state machine processing is before first char of input
+ RBBI_RUN, // state machine processing is in the user text
+ RBBI_END // state machine processing is after end of user text.
+};
+
//-----------------------------------------------------------------------------------
//
-// handleNext()
-// This method is the actual implementation of the next() method. All iteration
-// vectors through here. This method initializes the state machine to state 1
+// handleNext(stateTable)
+// This method is the actual implementation of the rbbi next() method.
+// This method initializes the state machine to state 1
// and advances through the text character by character until we reach the end
// of the text or the state machine transitions to state 0. We update our return
// value every time the state machine passes through an accepting state.
//
//-----------------------------------------------------------------------------------
-int32_t RuleBasedBreakIterator::handleNext() {
- return handleNext(fData->fForwardTable);
-}
-
int32_t RuleBasedBreakIterator::handleNext(const RBBIStateTable *statetable) {
- if (fTrace) {
- RBBIDebugPuts("Handle Next pos char state category");
- }
+ int32_t state;
+ int16_t category = 0;
+ RBBIRunMode mode;
+
+ RBBIStateTableRow *row;
+ UChar32 c;
+ int32_t lookaheadStatus = 0;
+ int32_t lookaheadTagIdx = 0;
+ int32_t result = 0;
+ int32_t initialPosition = 0;
+ int32_t lookaheadResult = 0;
+ UBool lookAheadHardBreak = (statetable->fFlags & RBBI_LOOKAHEAD_HARD_BREAK) != 0;
+ const char *tableData = statetable->fTableData;
+ uint32_t tableRowLen = statetable->fRowLen;
+
+ #ifdef RBBI_DEBUG
+ if (fTrace) {
+ RBBIDebugPuts("Handle Next pos char state category");
+ }
+ #endif
// No matter what, handleNext alway correctly sets the break tag value.
fLastStatusIndexValid = TRUE;
+ fLastRuleStatusIndex = 0;
// if we're already at the end of the text, return DONE.
- if (fText == NULL || fData == NULL || fText->hasNext() == FALSE) {
- fLastRuleStatusIndex = 0;
+ initialPosition = (int32_t)UTEXT_GETNATIVEINDEX(fText);
+ result = initialPosition;
+ c = UTEXT_NEXT32(fText);
+ if (fData == NULL || c==U_SENTINEL) {
return BreakIterator::DONE;
}
- int32_t initialPosition = fText->getIndex();
- int32_t result = initialPosition;
- int32_t lookaheadResult = 0;
-
- // Initialize the state machine. Begin in state 1
- int32_t state = START_STATE;
- int16_t category;
- UChar32 c = fText->current32();
- RBBIStateTableRow *row;
- int32_t lookaheadStatus = 0;
- int32_t lookaheadTagIdx = 0;
-
- fLastRuleStatusIndex = 0;
-
- row = (RBBIStateTableRow *) // Point to starting row of state table.
- (statetable->fTableData + (statetable->fRowLen * state));
+ // Set the initial state for the state machine
+ state = START_STATE;
+ row = (RBBIStateTableRow *)
+ //(statetable->fTableData + (statetable->fRowLen * state));
+ (tableData + tableRowLen * state);
+
+
+ mode = RBBI_RUN;
+ if (statetable->fFlags & RBBI_BOF_REQUIRED) {
+ category = 2;
+ mode = RBBI_START;
+ }
- // Character Category fetch for starting character.
- // See comments on character category code within loop, below.
- UTRIE_GET16(&fData->fTrie, c, category);
- if ((category & 0x4000) != 0) {
- fDictionaryCharCount++;
- category &= ~0x4000;
- }
// loop until we reach the end of the text or transition to state 0
+ //
for (;;) {
- if (c == CharacterIterator::DONE && fText->hasNext()==FALSE) {
+ if (c == U_SENTINEL) {
// Reached end of input string.
- // Note: CharacterIterator::DONE is 0xffff, which is also a legal
- // character value. Check for DONE first, because it's quicker,
- // but also need to check fText->hasNext() to be certain.
-
- if (lookaheadResult > result) {
- // We ran off the end of the string with a pending look-ahead match.
- // Treat this as if the look-ahead condition had been met, and return
- // the match at the / position from the look-ahead rule.
- result = lookaheadResult;
- fLastRuleStatusIndex = lookaheadTagIdx;
- lookaheadStatus = 0;
- } else if (result == initialPosition) {
- // Ran off end, no match found.
- // move forward one
- fText->setIndex(initialPosition);
- fText->next32();
- fText->getIndex();
+ if (mode == RBBI_END) {
+ // We have already run the loop one last time with the
+ // character set to the psueudo {eof} value. Now it is time
+ // to unconditionally bail out.
+ if (lookaheadResult > result) {
+ // We ran off the end of the string with a pending look-ahead match.
+ // Treat this as if the look-ahead condition had been met, and return
+ // the match at the / position from the look-ahead rule.
+ result = lookaheadResult;
+ fLastRuleStatusIndex = lookaheadTagIdx;
+ lookaheadStatus = 0;
+ }
+ break;
}
- break;
+ // Run the loop one last time with the fake end-of-input character category.
+ mode = RBBI_END;
+ category = 1;
}
- // look up the current character's character category, which tells us
- // which column in the state table to look at.
- // Note: the 16 in UTRIE_GET16 refers to the size of the data being returned,
- // not the size of the character going in, which is a UChar32.
- //
- UTRIE_GET16(&fData->fTrie, c, category);
- // Check the dictionary bit in the character's category.
- // Counter is only used by dictionary based iterators (subclasses).
- // Chars that need to be handled by a dictionary have a flag bit set
- // in their category values.
//
- if ((category & 0x4000) != 0) {
- fDictionaryCharCount++;
- // And off the dictionary flag bit.
- category &= ~0x4000;
+ // Get the char category. An incoming category of 1 or 2 means that
+ // we are preset for doing the beginning or end of input, and
+ // that we shouldn't get a category from an actual text input character.
+ //
+ if (mode == RBBI_RUN) {
+ // look up the current character's character category, which tells us
+ // which column in the state table to look at.
+ // Note: the 16 in UTRIE_GET16 refers to the size of the data being returned,
+ // not the size of the character going in, which is a UChar32.
+ //
+ UTRIE_GET16(&fData->fTrie, c, category);
+
+ // Check the dictionary bit in the character's category.
+ // Counter is only used by dictionary based iterators (subclasses).
+ // Chars that need to be handled by a dictionary have a flag bit set
+ // in their category values.
+ //
+ if ((category & 0x4000) != 0) {
+ fDictionaryCharCount++;
+ // And off the dictionary flag bit.
+ category &= ~0x4000;
+ }
}
#ifdef RBBI_DEBUG
if (fTrace) {
- RBBIDebugPrintf(" %4d ", fText->getIndex());
+ RBBIDebugPrintf(" %4d ", utext_getNativeIndex(fText));
if (0x20<=c && c<0x7f) {
RBBIDebugPrintf("\"%c\" ", c);
} else {
@@ -765,42 +1009,40 @@ int32_t RuleBasedBreakIterator::handleNext(const RBBIStateTable *statetable) {
}
#endif
- // look up a state transition in the state table
+ // State Transition - move machine to its next state
+ //
state = row->fNextState[category];
row = (RBBIStateTableRow *)
- (statetable->fTableData + (statetable->fRowLen * state));
+ // (statetable->fTableData + (statetable->fRowLen * state));
+ (tableData + tableRowLen * state);
- // Get the next character. Doing it here positions the iterator
- // to the correct position for recording matches in the code that
- // follows.
- c = fText->next32();
if (row->fAccepting == -1) {
- // Match found, common case, could have lookahead so we move on to check it
- result = fText->getIndex();
- /// added
+ // Match found, common case.
+ if (mode != RBBI_START) {
+ result = (int32_t)UTEXT_GETNATIVEINDEX(fText);
+ }
fLastRuleStatusIndex = row->fTagIdx; // Remember the break status (tag) values.
}
if (row->fLookAhead != 0) {
if (lookaheadStatus != 0
&& row->fAccepting == lookaheadStatus) {
- // Lookahead match is completed. Set the result accordingly, but only
- // if no other rule has matched further in the mean time.
+ // Lookahead match is completed.
result = lookaheadResult;
fLastRuleStatusIndex = lookaheadTagIdx;
lookaheadStatus = 0;
- /// i think we have to back up to read the lookahead character again
- /// fText->setIndex(lookaheadResult);
- /// TODO: this is a simple hack since reverse rules only have simple
- /// lookahead rules that we can definitely break out from.
- /// we need to make the lookahead rules not chain eventually.
- /// return result;
- /// this is going to be the longest match again
+ // TODO: make a standalone hard break in a rule work.
+ if (lookAheadHardBreak) {
+ utext_setNativeIndex(fText, result);
+ return result;
+ }
+ // Look-ahead completed, but other rules may match further. Continue on
+ // TODO: junk this feature? I don't think it's used anywhwere.
goto continueOn;
}
- int32_t r = fText->getIndex();
+ int32_t r = (int32_t)UTEXT_GETNATIVEINDEX(fText);
lookaheadResult = r;
lookaheadStatus = row->fLookAhead;
lookaheadTagIdx = row->fTagIdx;
@@ -808,13 +1050,12 @@ int32_t RuleBasedBreakIterator::handleNext(const RBBIStateTable *statetable) {
}
- if (row->fAccepting == 0) {
- // No match, nothing of interest happening, common case.
- goto continueOn;
+ if (row->fAccepting != 0) {
+ // Because this is an accepting state, any in-progress look-ahead match
+ // is no longer relavant. Clear out the pending lookahead status.
+ lookaheadStatus = 0; // clear out any pending look-ahead match.
}
- lookaheadStatus = 0; // clear out any pending look-ahead matches.
-
continueOn:
if (state == STOP_STATE) {
// This is the normal exit from the lookup state machine.
@@ -822,6 +1063,20 @@ continueOn:
// longer match is possible, no matter what characters follow.
break;
}
+
+ // Advance to the next character.
+ // If this is a beginning-of-input loop iteration, don't advance
+ // the input position. The next iteration will be processing the
+ // first real input character.
+ if (mode == RBBI_RUN) {
+ c = UTEXT_NEXT32(fText);
+ } else {
+ if (mode == RBBI_START) {
+ mode = RBBI_RUN;
+ }
+ }
+
+
}
// The state machine is done. Check whether it found a match...
@@ -830,230 +1085,138 @@ continueOn:
// (This really indicates a defect in the break rules. They should always match
// at least one character.)
if (result == initialPosition) {
- result = fText->setIndex(initialPosition);
- fText ->next32();
- result = fText->getIndex();
+ utext_setNativeIndex(fText, initialPosition);
+ UTEXT_NEXT32(fText);
+ result = (int32_t)UTEXT_GETNATIVEINDEX(fText);
}
// Leave the iterator at our result position.
- fText->setIndex(result);
- if (fTrace) {
- RBBIDebugPrintf("result = %d\n\n", result);
- }
- return result;
-}
-
-
-//----------------------------------------------------------------
-//
-// handlePrevious(void) This is the variant used with old style rules
-// (Overshoot to a safe point, then move forward)
-//
-//----------------------------------------------------------------
-int32_t RuleBasedBreakIterator::handlePrevious(void) {
- if (fText == NULL || fData == NULL) {
- return 0;
- }
- if (fData->fReverseTable == NULL) {
- return fText->setToStart();
- }
-
- int32_t state = START_STATE;
- int32_t category;
- int32_t lastCategory = 0;
- int32_t result = fText->getIndex();
- int32_t lookaheadStatus = 0;
- int32_t lookaheadResult = 0;
- int32_t lookaheadTagIdx = 0;
- UChar32 c = fText->current32();
- RBBIStateTableRow *row;
-
- row = (RBBIStateTableRow *)
- (this->fData->fReverseTable->fTableData + (state * fData->fReverseTable->fRowLen));
- UTRIE_GET16(&fData->fTrie, c, category);
- if ((category & 0x4000) != 0) {
- fDictionaryCharCount++;
- category &= ~0x4000;
- }
-
- if (fTrace) {
- RBBIDebugPuts("Handle Prev pos char state category");
- }
-
- // loop until we reach the beginning of the text or transition to state 0
- for (;;) {
- if (c == CharacterIterator::DONE && fText->hasPrevious()==FALSE) {
- break;
- }
-
- // save the last character's category and look up the current
- // character's category
- lastCategory = category;
- UTRIE_GET16(&fData->fTrie, c, category);
-
- // Check the dictionary bit in the character's category.
- // Counter is only used by dictionary based iterators.
- //
- if ((category & 0x4000) != 0) {
- fDictionaryCharCount++;
- category &= ~0x4000;
+ utext_setNativeIndex(fText, result);
+ #ifdef RBBI_DEBUG
+ if (fTrace) {
+ RBBIDebugPrintf("result = %d\n\n", result);
}
-
- #ifdef RBBI_DEBUG
- if (fTrace) {
- RBBIDebugPrintf(" %4d ", fText->getIndex());
- if (0x20<=c && c<0x7f) {
- RBBIDebugPrintf("\"%c\" ", c);
- } else {
- RBBIDebugPrintf("%5x ", c);
- }
- RBBIDebugPrintf("%3d %3d\n", state, category);
- }
- #endif
-
- // look up a state transition in the backwards state table
- state = row->fNextState[category];
- row = (RBBIStateTableRow *)
- (this->fData->fReverseTable->fTableData + (state * fData->fReverseTable->fRowLen));
-
- if (row->fAccepting == 0 && row->fLookAhead == 0) {
- // No match, nothing of interest happening, common case.
- goto continueOn;
- }
-
- if (row->fAccepting == -1) {
- // Match found, common case, no lookahead involved.
- result = fText->getIndex();
- lookaheadStatus = 0; // clear out any pending look-ahead matches.
- goto continueOn;
- }
-
- if (row->fAccepting == 0 && row->fLookAhead != 0) {
- // Lookahead match point. Remember it, but only if no other rule
- // has unconditionally matched to this point.
- // TODO: handle case where there's a pending match from a different rule
- // where lookaheadStatus != 0 && lookaheadStatus != row->fLookAhead.
- int32_t r = fText->getIndex();
- if (r > result) {
- lookaheadResult = r;
- lookaheadStatus = row->fLookAhead;
- lookaheadTagIdx = row->fTagIdx;
- }
- goto continueOn;
- }
-
- if (row->fAccepting != 0 && row->fLookAhead != 0) {
- // Lookahead match is completed. Set the result accordingly, but only
- // if no other rule has matched further in the mean time.
- if (lookaheadResult > result) {
- U_ASSERT(row->fAccepting == lookaheadStatus); // TODO: handle this case
- // of overlapping lookahead matches.
- result = lookaheadResult;
- fLastRuleStatusIndex = lookaheadTagIdx;
- lookaheadStatus = 0;
- }
- goto continueOn;
- }
-
-continueOn:
- if (state == STOP_STATE) {
- break;
- }
-
- // then advance one character backwards
- c = fText->previous32();
- }
-
- // Note: the result postion isn't what is returned to the user by previous(),
- // but where the implementation of previous() turns around and
- // starts iterating forward again.
- if (c == CharacterIterator::DONE && fText->hasPrevious()==FALSE) {
- result = fText->startIndex();
- }
- fText->setIndex(result);
-
+ #endif
return result;
}
+
//-----------------------------------------------------------------------------------
//
// handlePrevious()
//
-// This method backs the iterator back up to a "safe position" in the text.
-// This is a position that we know, without any context, may be any position
-// not more than 2 breaks away. Occasionally, the position may be less than
-// one break away.
-// The various calling methods then iterate forward from this safe position to
-// the appropriate position to return.
+// Iterate backwards, according to the logic of the reverse rules.
+// This version handles the exact style backwards rules.
//
// The logic of this function is very similar to handleNext(), above.
//
//-----------------------------------------------------------------------------------
int32_t RuleBasedBreakIterator::handlePrevious(const RBBIStateTable *statetable) {
- if (fText == NULL || statetable == NULL) {
- return 0;
- }
- // break tag is no longer valid after icu switched to exact backwards
- // positioning.
+ int32_t state;
+ int16_t category = 0;
+ RBBIRunMode mode;
+ RBBIStateTableRow *row;
+ UChar32 c;
+ int32_t lookaheadStatus = 0;
+ int32_t result = 0;
+ int32_t initialPosition = 0;
+ int32_t lookaheadResult = 0;
+ UBool lookAheadHardBreak = (statetable->fFlags & RBBI_LOOKAHEAD_HARD_BREAK) != 0;
+
+ #ifdef RBBI_DEBUG
+ if (fTrace) {
+ RBBIDebugPuts("Handle Previous pos char state category");
+ }
+ #endif
+
+ // handlePrevious() never gets the rule status.
+ // Flag the status as invalid; if the user ever asks for status, we will need
+ // to back up, then re-find the break position using handleNext(), which does
+ // get the status value.
fLastStatusIndexValid = FALSE;
- if (statetable == NULL) {
- return fText->setToStart();
- }
+ fLastRuleStatusIndex = 0;
- int32_t state = START_STATE;
- int32_t category;
- int32_t lastCategory = 0;
- UBool hasPassedStartText = !fText->hasPrevious();
- UChar32 c = fText->previous32();
- // previous character
- int32_t result = fText->getIndex();
- int32_t lookaheadStatus = 0;
- int32_t lookaheadResult = 0;
- int32_t lookaheadTagIdx = 0;
- UBool lookAheadHardBreak = (statetable->fFlags & RBBI_LOOKAHEAD_HARD_BREAK) != 0;
+ // if we're already at the start of the text, return DONE.
+ if (fText == NULL || fData == NULL || UTEXT_GETNATIVEINDEX(fText)==0) {
+ return BreakIterator::DONE;
+ }
- RBBIStateTableRow *row;
+ // Set up the starting char.
+ initialPosition = (int32_t)UTEXT_GETNATIVEINDEX(fText);
+ result = initialPosition;
+ c = UTEXT_PREVIOUS32(fText);
+ // Set the initial state for the state machine
+ state = START_STATE;
row = (RBBIStateTableRow *)
- (statetable->fTableData + (state * statetable->fRowLen));
- UTRIE_GET16(&fData->fTrie, c, category);
- if ((category & 0x4000) != 0) {
- fDictionaryCharCount++;
- category &= ~0x4000;
+ (statetable->fTableData + (statetable->fRowLen * state));
+ category = 3;
+ mode = RBBI_RUN;
+ if (statetable->fFlags & RBBI_BOF_REQUIRED) {
+ category = 2;
+ mode = RBBI_START;
}
- if (fTrace) {
- RBBIDebugPuts("Handle Prev pos char state category");
- }
- // loop until we reach the beginning of the text or transition to state 0
+ // loop until we reach the start of the text or transition to state 0
+ //
for (;;) {
- // if (c == CharacterIterator::DONE && fText->hasPrevious()==FALSE) {
- if (hasPassedStartText) {
- // if we have already considered the start of the text
- if (row->fLookAhead != 0 && lookaheadResult == 0) {
- result = 0;
+ if (c == U_SENTINEL) {
+ // Reached end of input string.
+ if (mode == RBBI_END ||
+ *(int32_t *)fData->fHeader->fFormatVersion == 1 ) {
+ // We have already run the loop one last time with the
+ // character set to the psueudo {eof} value. Now it is time
+ // to unconditionally bail out.
+ // (Or we have an old format binary rule file that does not support {eof}.)
+ if (lookaheadResult < result) {
+ // We ran off the end of the string with a pending look-ahead match.
+ // Treat this as if the look-ahead condition had been met, and return
+ // the match at the / position from the look-ahead rule.
+ result = lookaheadResult;
+ lookaheadStatus = 0;
+ } else if (result == initialPosition) {
+ // Ran off start, no match found.
+ // move one index one (towards the start, since we are doing a previous())
+ utext_setNativeIndex(fText, initialPosition);
+ UTEXT_PREVIOUS32(fText); // TODO: shouldn't be necessary. We're already at beginning. Check.
+ }
+ break;
}
- break;
+ // Run the loop one last time with the fake end-of-input character category.
+ mode = RBBI_END;
+ category = 1;
}
- // save the last character's category and look up the current
- // character's category
- lastCategory = category;
- UTRIE_GET16(&fData->fTrie, c, category);
-
- // Check the dictionary bit in the character's category.
- // Counter is only used by dictionary based iterators.
//
- if ((category & 0x4000) != 0) {
- fDictionaryCharCount++;
- category &= ~0x4000;
+ // Get the char category. An incoming category of 1 or 2 means that
+ // we are preset for doing the beginning or end of input, and
+ // that we shouldn't get a category from an actual text input character.
+ //
+ if (mode == RBBI_RUN) {
+ // look up the current character's character category, which tells us
+ // which column in the state table to look at.
+ // Note: the 16 in UTRIE_GET16 refers to the size of the data being returned,
+ // not the size of the character going in, which is a UChar32.
+ //
+ UTRIE_GET16(&fData->fTrie, c, category);
+
+ // Check the dictionary bit in the character's category.
+ // Counter is only used by dictionary based iterators (subclasses).
+ // Chars that need to be handled by a dictionary have a flag bit set
+ // in their category values.
+ //
+ if ((category & 0x4000) != 0) {
+ fDictionaryCharCount++;
+ // And off the dictionary flag bit.
+ category &= ~0x4000;
+ }
}
#ifdef RBBI_DEBUG
if (fTrace) {
- RBBIDebugPrintf(" %4d ", fText->getIndex());
+ RBBIDebugPrintf(" %4d ", (int32_t)utext_getNativeIndex(fText));
if (0x20<=c && c<0x7f) {
RBBIDebugPrintf("\"%c\" ", c);
} else {
@@ -1063,77 +1226,85 @@ int32_t RuleBasedBreakIterator::handlePrevious(const RBBIStateTable *statetable)
}
#endif
- // look up a state transition in the backwards state table
+ // State Transition - move machine to its next state
+ //
state = row->fNextState[category];
row = (RBBIStateTableRow *)
- (statetable->fTableData + (state * statetable->fRowLen));
+ (statetable->fTableData + (statetable->fRowLen * state));
if (row->fAccepting == -1) {
- // Match found, common case, could have lookahead so we move on to check it
- result = fText->getIndex();
- /// added
- fLastRuleStatusIndex = row->fTagIdx; // Remember the break status (tag) value.
+ // Match found, common case.
+ result = (int32_t)UTEXT_GETNATIVEINDEX(fText);
}
if (row->fLookAhead != 0) {
if (lookaheadStatus != 0
&& row->fAccepting == lookaheadStatus) {
- // Lookahead match is completed. Set the result accordingly, but only
- // if no other rule has matched further in the mean time.
+ // Lookahead match is completed.
result = lookaheadResult;
- fLastRuleStatusIndex = lookaheadTagIdx;
lookaheadStatus = 0;
- /// i think we have to back up to read the lookahead character again
- /// fText->setIndex(lookaheadResult);
- /// TODO: this is a simple hack since reverse rules only have simple
- /// lookahead rules that we can definitely break out from.
- /// we need to make the lookahead rules not chain eventually.
- /// return result;
- /// this is going to be the longest match again
-
- /// syn wee todo hard coded for line breaks stuff
- /// needs to provide a tag in rules to ensure a stop.
-
+ // TODO: make a standalone hard break in a rule work.
if (lookAheadHardBreak) {
- fText->setIndex(result);
+ utext_setNativeIndex(fText, result);
return result;
}
- category = lastCategory;
- fText->setIndex(result);
-
+ // Look-ahead completed, but other rules may match further. Continue on
+ // TODO: junk this feature? I don't think it's used anywhwere.
goto continueOn;
}
- int32_t r = fText->getIndex();
- lookaheadResult = r;
- lookaheadStatus = row->fLookAhead;
- fLastRuleStatusIndex = row->fTagIdx;
+ int32_t r = (int32_t)UTEXT_GETNATIVEINDEX(fText);
+ lookaheadResult = r;
+ lookaheadStatus = row->fLookAhead;
goto continueOn;
}
- // not lookahead
- if (row->fAccepting == 0) {
- // No match, nothing of interest happening, common case.
- goto continueOn;
- }
- lookaheadStatus = 0; // clear out any pending look-ahead matches.
+ if (row->fAccepting != 0) {
+ // Because this is an accepting state, any in-progress look-ahead match
+ // is no longer relavant. Clear out the pending lookahead status.
+ lookaheadStatus = 0;
+ }
continueOn:
if (state == STOP_STATE) {
+ // This is the normal exit from the lookup state machine.
+ // We have advanced through the string until it is certain that no
+ // longer match is possible, no matter what characters follow.
break;
}
- // then advance one character backwards
- hasPassedStartText = !fText->hasPrevious();
- c = fText->previous32();
+ // Move (backwards) to the next character to process.
+ // If this is a beginning-of-input loop iteration, don't advance
+ // the input position. The next iteration will be processing the
+ // first real input character.
+ if (mode == RBBI_RUN) {
+ c = UTEXT_PREVIOUS32(fText);
+ } else {
+ if (mode == RBBI_START) {
+ mode = RBBI_RUN;
+ }
+ }
}
- // Note: the result postion isn't what is returned to the user by previous(),
- // but where the implementation of previous() turns around and
- // starts iterating forward again.
- fText->setIndex(result);
+ // The state machine is done. Check whether it found a match...
+
+ // If the iterator failed to advance in the match engine, force it ahead by one.
+ // (This really indicates a defect in the break rules. They should always match
+ // at least one character.)
+ if (result == initialPosition) {
+ utext_setNativeIndex(fText, initialPosition);
+ UTEXT_PREVIOUS32(fText);
+ result = (int32_t)UTEXT_GETNATIVEINDEX(fText);
+ }
+ // Leave the iterator at our result position.
+ utext_setNativeIndex(fText, result);
+ #ifdef RBBI_DEBUG
+ if (fTrace) {
+ RBBIDebugPrintf("result = %d\n\n", result);
+ }
+ #endif
return result;
}
@@ -1141,8 +1312,13 @@ continueOn:
void
RuleBasedBreakIterator::reset()
{
- // Base-class version of this function is a no-op.
- // Subclasses may override with their own reset behavior.
+ if (fCachedBreakPositions) {
+ uprv_free(fCachedBreakPositions);
+ }
+ fCachedBreakPositions = NULL;
+ fNumCachedBreakPositions = 0;
+ fDictionaryCharCount = 0;
+ fPositionInCache = 0;
}
@@ -1163,7 +1339,7 @@ RuleBasedBreakIterator::reset()
void RuleBasedBreakIterator::makeRuleStatusValid() {
if (fLastStatusIndexValid == FALSE) {
// No cached status is available.
- if (fText == NULL || current() == fText->startIndex()) {
+ if (fText == NULL || current() == 0) {
// At start of text, or there is no text. Status is always zero.
fLastRuleStatusIndex = 0;
fLastStatusIndexValid = TRUE;
@@ -1171,6 +1347,9 @@ void RuleBasedBreakIterator::makeRuleStatusValid() {
// Not at start of text. Find status the tedious way.
int32_t pa = current();
previous();
+ if (fNumCachedBreakPositions > 0) {
+ reset(); // Blow off the dictionary cache
+ }
int32_t pb = next();
if (pa != pb) {
// note: the if (pa != pb) test is here only to eliminate warnings for
@@ -1179,7 +1358,6 @@ void RuleBasedBreakIterator::makeRuleStatusValid() {
}
}
}
- U_ASSERT(fLastStatusIndexValid == TRUE);
U_ASSERT(fLastRuleStatusIndex >= 0 && fLastRuleStatusIndex < fData->fStatusMaxIdx);
}
@@ -1289,16 +1467,20 @@ BreakIterator * RuleBasedBreakIterator::createBufferClone(void *stackBuffer,
buf += offsetUp;
}
if (s < sizeof(RuleBasedBreakIterator)) {
- buf = (char *) new RuleBasedBreakIterator;
- if (buf == 0) {
+ // Not enough room in the caller-supplied buffer.
+ // Do a plain-vanilla heap based clone and return that, along with
+ // a warning that the clone was allocated.
+ RuleBasedBreakIterator *clonedBI = new RuleBasedBreakIterator(*this);
+ if (clonedBI == 0) {
status = U_MEMORY_ALLOCATION_ERROR;
- return NULL;
+ } else {
+ status = U_SAFECLONE_ALLOCATED_WARNING;
}
- status = U_SAFECLONE_ALLOCATED_WARNING;
+ return clonedBI;
}
//
- // Clone the object.
+ // Clone the source BI into the caller-supplied buffer.
// TODO: using an overloaded operator new to directly initialize the
// copy in the user's buffer would be better, but it doesn't seem
// to get along with namespaces. Investigate why.
@@ -1309,17 +1491,15 @@ BreakIterator * RuleBasedBreakIterator::createBufferClone(void *stackBuffer,
//
RuleBasedBreakIterator localIter; // Empty break iterator, source for memcpy
RuleBasedBreakIterator *clone = (RuleBasedBreakIterator *)buf;
- uprv_memcpy(clone, &localIter, sizeof(RuleBasedBreakIterator)); // clone = empty, but initialized, iterator.
- *clone = *this; // clone = the real one we want.
- if (status != U_SAFECLONE_ALLOCATED_WARNING) {
- clone->fBufferClone = TRUE;
- }
+ uprv_memcpy(clone, &localIter, sizeof(RuleBasedBreakIterator)); // init C++ gorp, BreakIterator base class part
+ clone->init(); // Init RuleBasedBreakIterator part, (user default constructor)
+ *clone = *this; // clone = the real BI we want.
+ clone->fBufferClone = TRUE; // Flag to prevent deleting storage on close (From C code)
return clone;
}
-
//-------------------------------------------------------------------------------
//
// isDictionaryChar Return true if the category lookup for this char
@@ -1330,16 +1510,324 @@ BreakIterator * RuleBasedBreakIterator::createBufferClone(void *stackBuffer,
// break iterators.
//
//-------------------------------------------------------------------------------
-UBool RuleBasedBreakIterator::isDictionaryChar(UChar32 c) {
+/*UBool RuleBasedBreakIterator::isDictionaryChar(UChar32 c) {
if (fData == NULL) {
return FALSE;
}
uint16_t category;
UTRIE_GET16(&fData->fTrie, c, category);
return (category & 0x4000) != 0;
+}*/
+
+
+//-------------------------------------------------------------------------------
+//
+// checkDictionary This function handles all processing of characters in
+// the "dictionary" set. It will determine the appropriate
+// course of action, and possibly set up a cache in the
+// process.
+//
+//-------------------------------------------------------------------------------
+int32_t RuleBasedBreakIterator::checkDictionary(int32_t startPos,
+ int32_t endPos,
+ UBool reverse) {
+ // Reset the old break cache first.
+ uint32_t dictionaryCount = fDictionaryCharCount;
+ reset();
+
+ if (dictionaryCount <= 1 || (endPos - startPos) <= 1) {
+ return (reverse ? startPos : endPos);
+ }
+
+ // Starting from the starting point, scan towards the proposed result,
+ // looking for the first dictionary character (which may be the one
+ // we're on, if we're starting in the middle of a range).
+ utext_setNativeIndex(fText, reverse ? endPos : startPos);
+ if (reverse) {
+ UTEXT_PREVIOUS32(fText);
+ }
+
+ int32_t rangeStart = startPos;
+ int32_t rangeEnd = endPos;
+
+ uint16_t category;
+ int32_t current;
+ UErrorCode status = U_ZERO_ERROR;
+ UStack breaks(status);
+ int32_t foundBreakCount = 0;
+ UChar32 c = utext_current32(fText);
+
+ UTRIE_GET16(&fData->fTrie, c, category);
+
+ // Is the character we're starting on a dictionary character? If so, we
+ // need to back up to include the entire run; otherwise the results of
+ // the break algorithm will differ depending on where we start. Since
+ // the result is cached and there is typically a non-dictionary break
+ // within a small number of words, there should be little performance impact.
+ if (category & 0x4000) {
+ if (reverse) {
+ do {
+ utext_next32(fText); // TODO: recast to work directly with postincrement.
+ c = utext_current32(fText);
+ UTRIE_GET16(&fData->fTrie, c, category);
+ } while (c != U_SENTINEL && (category & 0x4000));
+ // Back up to the last dictionary character
+ rangeEnd = (int32_t)UTEXT_GETNATIVEINDEX(fText);
+ if (c == U_SENTINEL) {
+ // c = fText->last32();
+ // TODO: why was this if needed?
+ c = UTEXT_PREVIOUS32(fText);
+ }
+ else {
+ c = UTEXT_PREVIOUS32(fText);
+ }
+ }
+ else {
+ do {
+ c = UTEXT_PREVIOUS32(fText);
+ UTRIE_GET16(&fData->fTrie, c, category);
+ }
+ while (c != U_SENTINEL && (category & 0x4000));
+ // Back up to the last dictionary character
+ if (c == U_SENTINEL) {
+ // c = fText->first32();
+ c = utext_current32(fText);
+ }
+ else {
+ utext_next32(fText);
+ c = utext_current32(fText);
+ }
+ rangeStart = (int32_t)UTEXT_GETNATIVEINDEX(fText);;
+ }
+ UTRIE_GET16(&fData->fTrie, c, category);
+ }
+
+ // Loop through the text, looking for ranges of dictionary characters.
+ // For each span, find the appropriate break engine, and ask it to find
+ // any breaks within the span.
+ // Note: we always do this in the forward direction, so that the break
+ // cache is built in the right order.
+ if (reverse) {
+ utext_setNativeIndex(fText, rangeStart);
+ c = utext_current32(fText);
+ UTRIE_GET16(&fData->fTrie, c, category);
+ }
+ while(U_SUCCESS(status)) {
+ while((current = (int32_t)UTEXT_GETNATIVEINDEX(fText)) < rangeEnd && (category & 0x4000) == 0) {
+ utext_next32(fText); // TODO: tweak for post-increment operation
+ c = utext_current32(fText);
+ UTRIE_GET16(&fData->fTrie, c, category);
+ }
+ if (current >= rangeEnd) {
+ break;
+ }
+
+ // We now have a dictionary character. Get the appropriate language object
+ // to deal with it.
+ const LanguageBreakEngine *lbe = getLanguageBreakEngine(c);
+
+ // Ask the language object if there are any breaks. It will leave the text
+ // pointer on the other side of its range, ready to search for the next one.
+ if (lbe != NULL) {
+ foundBreakCount += lbe->findBreaks(fText, rangeStart, rangeEnd, FALSE, fBreakType, breaks);
+ }
+
+ // Reload the loop variables for the next go-round
+ c = utext_current32(fText);
+ UTRIE_GET16(&fData->fTrie, c, category);
+ }
+
+ // If we found breaks, build a new break cache. The first and last entries must
+ // be the original starting and ending position.
+ if (foundBreakCount > 0) {
+ int32_t totalBreaks = foundBreakCount;
+ if (startPos < breaks.elementAti(0)) {
+ totalBreaks += 1;
+ }
+ if (endPos > breaks.peeki()) {
+ totalBreaks += 1;
+ }
+ fCachedBreakPositions = (int32_t *)uprv_malloc(totalBreaks * sizeof(int32_t));
+ if (fCachedBreakPositions != NULL) {
+ int32_t out = 0;
+ fNumCachedBreakPositions = totalBreaks;
+ if (startPos < breaks.elementAti(0)) {
+ fCachedBreakPositions[out++] = startPos;
+ }
+ for (int32_t i = 0; i < foundBreakCount; ++i) {
+ fCachedBreakPositions[out++] = breaks.elementAti(i);
+ }
+ if (endPos > fCachedBreakPositions[out-1]) {
+ fCachedBreakPositions[out] = endPos;
+ }
+ // If there are breaks, then by definition, we are replacing the original
+ // proposed break by one of the breaks we found. Use following() and
+ // preceding() to do the work. They should never recurse in this case.
+ if (reverse) {
+ return preceding(endPos - 1);
+ }
+ else {
+ return following(startPos);
+ }
+ }
+ // If the allocation failed, just fall through to the "no breaks found" case.
+ }
+
+ // If we get here, there were no language-based breaks. Set the text pointer
+ // to the original proposed break.
+ utext_setNativeIndex(fText, reverse ? startPos : endPos);
+ return (reverse ? startPos : endPos);
+}
+
+static UStack *gLanguageBreakFactories = NULL;
+
+U_NAMESPACE_END
+
+// defined in ucln_cmn.h
+
+/**
+ * Release all static memory held by breakiterator.
+ */
+U_CDECL_BEGIN
+static UBool U_CALLCONV breakiterator_cleanup_dict(void) {
+ if (gLanguageBreakFactories) {
+ delete gLanguageBreakFactories;
+ gLanguageBreakFactories = NULL;
+ }
+ return TRUE;
}
+U_CDECL_END
+U_CDECL_BEGIN
+static void U_CALLCONV _deleteFactory(void *obj) {
+ delete (LanguageBreakFactory *) obj;
+}
+U_CDECL_END
+U_NAMESPACE_BEGIN
+static const LanguageBreakEngine*
+getLanguageBreakEngineFromFactory(UChar32 c, int32_t breakType)
+{
+ UBool needsInit;
+ UErrorCode status = U_ZERO_ERROR;
+ umtx_lock(NULL);
+ needsInit = (UBool)(gLanguageBreakFactories == NULL);
+ umtx_unlock(NULL);
+
+ if (needsInit) {
+ UStack *factories = new UStack(_deleteFactory, NULL, status);
+ if (U_SUCCESS(status)) {
+ ICULanguageBreakFactory *builtIn = new ICULanguageBreakFactory(status);
+ factories->push(builtIn, status);
+#ifdef U_LOCAL_SERVICE_HOOK
+ LanguageBreakFactory *extra = (LanguageBreakFactory *)uprv_svc_hook("languageBreakFactory", &status);
+ if (extra != NULL) {
+ factories->push(extra, status);
+ }
+#endif
+ }
+ umtx_lock(NULL);
+ if (gLanguageBreakFactories == NULL) {
+ gLanguageBreakFactories = factories;
+ factories = NULL;
+ ucln_common_registerCleanup(UCLN_COMMON_BREAKITERATOR_DICT, breakiterator_cleanup_dict);
+ }
+ umtx_unlock(NULL);
+ delete factories;
+ }
+
+ if (gLanguageBreakFactories == NULL) {
+ return NULL;
+ }
+
+ int32_t i = gLanguageBreakFactories->size();
+ const LanguageBreakEngine *lbe = NULL;
+ while (--i >= 0) {
+ LanguageBreakFactory *factory = (LanguageBreakFactory *)(gLanguageBreakFactories->elementAt(i));
+ lbe = factory->getEngineFor(c, breakType);
+ if (lbe != NULL) {
+ break;
+ }
+ }
+ return lbe;
+}
+
+
+//-------------------------------------------------------------------------------
+//
+// getLanguageBreakEngine Find an appropriate LanguageBreakEngine for the
+// the characer c.
+//
+//-------------------------------------------------------------------------------
+const LanguageBreakEngine *
+RuleBasedBreakIterator::getLanguageBreakEngine(UChar32 c) {
+ const LanguageBreakEngine *lbe = NULL;
+ UErrorCode status = U_ZERO_ERROR;
+
+ if (fLanguageBreakEngines == NULL) {
+ fLanguageBreakEngines = new UStack(status);
+ if (U_FAILURE(status)) {
+ delete fLanguageBreakEngines;
+ fLanguageBreakEngines = 0;
+ return NULL;
+ }
+ }
+
+ int32_t i = fLanguageBreakEngines->size();
+ while (--i >= 0) {
+ lbe = (const LanguageBreakEngine *)(fLanguageBreakEngines->elementAt(i));
+ if (lbe->handles(c, fBreakType)) {
+ return lbe;
+ }
+ }
+
+ // No existing dictionary took the character. See if a factory wants to
+ // give us a new LanguageBreakEngine for this character.
+ lbe = getLanguageBreakEngineFromFactory(c, fBreakType);
+
+ // If we got one, use it and push it on our stack.
+ if (lbe != NULL) {
+ fLanguageBreakEngines->push((void *)lbe, status);
+ // Even if we can't remember it, we can keep looking it up, so
+ // return it even if the push fails.
+ return lbe;
+ }
+
+ // No engine is forthcoming for this character. Add it to the
+ // reject set. Create the reject break engine if needed.
+ if (fUnhandledBreakEngine == NULL) {
+ fUnhandledBreakEngine = new UnhandledEngine(status);
+ if (U_SUCCESS(status) && fUnhandledBreakEngine == NULL) {
+ status = U_MEMORY_ALLOCATION_ERROR;
+ }
+ // Put it last so that scripts for which we have an engine get tried
+ // first.
+ fLanguageBreakEngines->insertElementAt(fUnhandledBreakEngine, 0, status);
+ // If we can't insert it, or creation failed, get rid of it
+ if (U_FAILURE(status)) {
+ delete fUnhandledBreakEngine;
+ fUnhandledBreakEngine = 0;
+ return NULL;
+ }
+ }
+
+ // Tell the reject engine about the character; at its discretion, it may
+ // add more than just the one character.
+ fUnhandledBreakEngine->handleCharacter(c, fBreakType);
+
+ return fUnhandledBreakEngine;
+}
+
+
+
+/*int32_t RuleBasedBreakIterator::getBreakType() const {
+ return fBreakType;
+}*/
+
+void RuleBasedBreakIterator::setBreakType(int32_t type) {
+ fBreakType = type;
+ reset();
+}
U_NAMESPACE_END
diff --git a/icuSources/common/rbbicst.pl b/icuSources/common/rbbicst.pl
index 704c52f0..3537892c 100644
--- a/icuSources/common/rbbicst.pl
+++ b/icuSources/common/rbbicst.pl
@@ -1,412 +1,453 @@
-#**************************************************************************
-# Copyright (C) 2002-2004 International Business Machines Corporation *
-# and others. All rights reserved. *
-#**************************************************************************
-#
-# rbbicst Compile the RBBI rule paser state table data into initialized C data.
-# Usage:
-# cd icu/source/common
-# perl rbbicst.pl [-j] < rbbirpt.txt > rbbirpt.h
-#
-# The output file, rbbrpt.h, is included by some of the .cpp rbbi
-# implementation files. This perl script is NOT run as part
-# of a normal ICU build. It is run by hand when needed, and the
-# rbbirpt.h generated file is put back into cvs.
-#
-# See rbbirpt.h for a description of the input format for this script.
-#
-
-if ($ARGV[0] eq "-j") {
- $javaOutput = 1;
- shift @ARGV;
-}
-
-
-$num_states = 1; # Always the state number for the line being compiled.
-$line_num = 0; # The line number in the input file.
-
-$states{"pop"} = 255; # Add the "pop" to the list of defined state names.
- # This prevents any state from being labelled with "pop",
- # and resolves references to "pop" in the next state field.
-
-line_loop: while (<>) {
- chomp();
- $line = $_;
- @fields = split();
- $line_num++;
-
- # Remove # comments, which are any fields beginning with a #, plus all
- # that follow on the line.
- for ($i=0; $i<@fields; $i++) {
- if ($fields[$i] =~ /^#/) {
- @fields = @fields[0 .. $i-1];
- last;
- }
- }
- # ignore blank lines, and those with no fields left after stripping comments..
- if (@fields == 0) {
- next;
- }
-
- #
- # State Label: handling.
- # Does the first token end with a ":"? If so, it's the name of a state.
- # Put in a hash, together with the current state number,
- # so that we can later look up the number from the name.
- #
- if (@fields[0] =~ /.*:$/) {
- $state_name = @fields[0];
- $state_name =~ s/://; # strip off the colon from the state name.
-
- if ($states{$state_name} != 0) {
- print " rbbicst: at line $line-num duplicate definition of state $state_name\n";
- }
- $states{$state_name} = $num_states;
- $stateNames[$num_states] = $state_name;
-
- # if the label was the only thing on this line, go on to the next line,
- # otherwise assume that a state definition is on the same line and fall through.
- if (@fields == 1) {
- next line_loop;
- }
- shift @fields; # shift off label field in preparation
- # for handling the rest of the line.
- }
-
- #
- # State Transition line.
- # syntax is this,
- # character [n] target-state [^push-state] [function-name]
- # where
- # [something] is an optional something
- # character is either a single quoted character e.g. '['
- # or a name of a character class, e.g. white_space
- #
-
- $state_line_num[$num_states] = $line_num; # remember line number with each state
- # so we can make better error messages later.
- #
- # First field, character class or literal character for this transition.
- #
- if ($fields[0] =~ /^'.'$/) {
- # We've got a quoted literal character.
- $state_literal_chars[$num_states] = $fields[0];
- $state_literal_chars[$num_states] =~ s/'//g;
- } else {
- # We've got the name of a character class.
- $state_char_class[$num_states] = $fields[0];
- if ($fields[0] =~ /[\W]/) {
- print " rbbicsts: at line $line_num, bad character literal or character class name.\n";
- print " scanning $fields[0]\n";
- exit(-1);
- }
- }
- shift @fields;
-
- #
- # do the 'n' flag
- #
- $state_flag[$num_states] = "FALSE";
- if ($fields[0] eq "n") {
- $state_flag[$num_states] = "TRUE";
- shift @fields;
- }
-
- #
- # do the destination state.
- #
- $state_dest_state[$num_states] = $fields[0];
- if ($fields[0] eq "") {
- print " rbbicsts: at line $line_num, destination state missing.\n";
- exit(-1);
- }
- shift @fields;
-
- #
- # do the push state, if present.
- #
- if ($fields[0] =~ /^\^/) {
- $fields[0] =~ s/^\^//;
- $state_push_state[$num_states] = $fields[0];
- if ($fields[0] eq "" ) {
- print " rbbicsts: at line $line_num, expected state after ^ (no spaces).\n";
- exit(-1);
- }
- shift @fields;
- }
-
- #
- # Lastly, do the optional action name.
- #
- if ($fields[0] ne "") {
- $state_func_name[$num_states] = $fields[0];
- shift @fields;
- }
-
- #
- # There should be no fields left on the line at this point.
- #
- if (@fields > 0) {
- print " rbbicsts: at line $line_num, unexpected extra stuff on input line.\n";
- print " scanning $fields[0]\n";
- }
- $num_states++;
-}
-
-#
-# We've read in the whole file, now go back and output the
-# C source code for the state transition table.
-#
-# We read all states first, before writing anything, so that the state numbers
-# for the destination states are all available to be written.
-#
-
-#
-# Make hashes for the names of the character classes and
-# for the names of the actions that appeared.
-#
-for ($state=1; $state < $num_states; $state++) {
- if ($state_char_class[$state] ne "") {
- if ($charClasses{$state_char_class[$state]} == 0) {
- $charClasses{$state_char_class[$state]} = 1;
- }
- }
- if ($state_func_name[$state] eq "") {
- $state_func_name[$state] = "doNOP";
- }
- if ($actions{$state_action_name[$state]} == 0) {
- $actions{$state_func_name[$state]} = 1;
- }
-}
-
-#
-# Check that all of the destination states have been defined
-#
-#
-$states{"exit"} = 0; # Predefined state name, terminates state machine.
-for ($state=1; $state<$num_states; $state++) {
- if ($states{$state_dest_state[$state]} == 0 && $state_dest_state[$state] ne "exit") {
- print "Error at line $state_line_num[$state]: target state \"$state_dest_state[$state]\" is not defined.\n";
- $errors++;
- }
- if ($state_push_state[$state] ne "" && $states{$state_push_state[$state]} == 0) {
- print "Error at line $state_line_num[$state]: target state \"$state_push_state[$state]\" is not defined.\n";
- $errors++;
- }
-}
-
-die if ($errors>0);
-
-my ($sec, $min, $hour, , $day, $mon, $year, $wday, $yday, $isdst) = localtime;
-$year += 1900;
-
-if ($javaOutput) {
- print "/*\n";
- print " *******************************************************************************\n";
- print " * Copyright (C) 2003-$year,\n";
- print " * International Business Machines Corporation and others. All Rights Reserved.\n";
- print " *******************************************************************************\n";
- print " */\n";
- print " \n";
- print "package com.ibm.icu.text;\n";
- print " \n";
- print "/**\n";
- print " * Generated Java File. Do not edit by hand.\n";
- print " * This file contains the state table for the ICU Rule Based Break Iterator\n";
- print " * rule parser.\n";
- print " * It is generated by the Perl script \"rbbicst.pl\" from\n";
- print " * the rule parser state definitions file \"rbbirpt.txt\".\n";
- print " *\n";
- print " */\n";
-
- print "public class RuleBasedBreakIteratorStateTable\n";
- print "{\n";
-
- #
- # Emit the constants for the actions to be performed.
- #
- $n = 1;
- foreach $act (keys %actions) {
- print " public static final int $act = $n;\n";
- $n++;
- }
- print " \n";
- #
- # emit the state transition table
- #
- print " public static final String[] gRuleParseStateTable = {\n";
- printf(" \"\\u%04.4x\\u%04.4x\\u%04.4x\\u%04.4x\\u%04.4x\"\n", doNOP, 0, 0, 0, 1);
- for ($state=1; $state < $num_states; $state++) {
- printf(" , \"\\u%04.4x", $state_func_name[$state]);
- # print " , {$state_func_name[$state],";
- if ($state_literal_chars[$state] ne "") {
- printf("\\u%04.4x", $state_func_name[$state]);
- }else {
- printf("\\u%04.4x", $charClasses{$state_char_class[$state]});
- }
- printf("\\u%04.4x", $states{$state_dest_state[$state]});
-
- # The push-state field is optional. If omitted, fill field with a zero, which flags
- # the state machine that there is no push state.
- if ($state_push_state[$state] eq "") {
- print "\\u0000";
- } else {
- printf("\\u%04.4x", $states{$state_push_state[$state]});
- }
- printf("\\u%04.4x", $state_flag[$state]);
-
- # For the first row of each state, append the state name.
- # Used for debugging only.
- if ($stateNames[$state] ne "") {
- printf("%-20s", $stateNames[$state]."\"");
- } else {
- printf("%-20s", "\"");
- }
-
- # Put out a C++ comment showing the number (index) of this state row,
- print " // $state ";
- print "\n";
- };
- print " };\n";
- print "}\n";
-}
-else
-{
- #
- # C++ Output ...
- #
-
-
- print "//---------------------------------------------------------------------------------\n";
- print "//\n";
- print "// Generated Header File. Do not edit by hand.\n";
- print "// This file contains the state table for the ICU Rule Based Break Iterator\n";
- print "// rule parser.\n";
- print "// It is generated by the Perl script \"rbbicst.pl\" from\n";
- print "// the rule parser state definitions file \"rbbirpt.txt\".\n";
- print "//\n";
- print "// Copyright (C) 2002-$year International Business Machines Corporation \n";
- print "// and others. All rights reserved. \n";
- print "//\n";
- print "//---------------------------------------------------------------------------------\n";
- print "#ifndef RBBIRPT_H\n";
- print "#define RBBIRPT_H\n";
- print "\n";
- print "U_NAMESPACE_BEGIN\n";
-
- #
- # Emit the constants for indicies of Unicode Sets
- # Define one constant for each of the character classes encountered.
- # At the same time, store the index corresponding to the set name back into hash.
- #
- print "//\n";
- print "// Character classes for RBBI rule scanning.\n";
- print "//\n";
- $i = 128; # State Table values for Unicode char sets range from 128-250.
- # Sets "default", "escaped", etc. get special handling.
- # They have no corresponding UnicodeSet object in the state machine,
- # but are handled by special case code. So we emit no reference
- # to a UnicodeSet object to them here.
- foreach $setName (keys %charClasses) {
- if ($setName eq "default") {
- $charClasses{$setName} = 255;}
- elsif ($setName eq "escaped") {
- $charClasses{$setName} = 254;}
- elsif ($setName eq "escapedP") {
- $charClasses{$setName} = 253;}
- elsif ($setName eq "eof") {
- $charClasses{$setName} = 252;}
- else {
- # Normal character class. Fill in array with a ptr to the corresponding UnicodeSet in the state machine.
- print " static const uint8_t kRuleSet_$setName = $i;\n";
- $charClasses{$setName} = $i;
- $i++;
- }
- }
- print "\n\n";
-
- #
- # Emit the enum for the actions to be performed.
- #
- print "enum RBBI_RuleParseAction {\n";
- foreach $act (keys %actions) {
- print " $act,\n";
- }
- print " rbbiLastAction};\n\n";
-
- #
- # Emit the struct definition for transtion table elements.
- #
- print "//-------------------------------------------------------------------------------\n";
- print "//\n";
- print "// RBBIRuleTableEl represents the structure of a row in the transition table\n";
- print "// for the rule parser state machine.\n";
- print "//-------------------------------------------------------------------------------\n";
- print "struct RBBIRuleTableEl {\n";
- print " RBBI_RuleParseAction fAction;\n";
- print " uint8_t fCharClass; // 0-127: an individual ASCII character\n";
- print " // 128-255: character class index\n";
- print " uint8_t fNextState; // 0-250: normal next-stat numbers\n";
- print " // 255: pop next-state from stack.\n";
- print " uint8_t fPushState;\n";
- print " UBool fNextChar;\n";
- print "};\n\n";
-
- #
- # emit the state transition table
- #
- print "static const struct RBBIRuleTableEl gRuleParseStateTable[] = {\n";
- print " {doNOP, 0, 0, 0, TRUE}\n"; # State 0 is a dummy. Real states start with index = 1.
- for ($state=1; $state < $num_states; $state++) {
- print " , {$state_func_name[$state],";
- if ($state_literal_chars[$state] ne "") {
- $c = $state_literal_chars[$state];
- printf(" %d /* $c */,", ord($c)); # use numeric value, so EBCDIC machines are ok.
- }else {
- print " $charClasses{$state_char_class[$state]},";
- }
- print " $states{$state_dest_state[$state]},";
-
- # The push-state field is optional. If omitted, fill field with a zero, which flags
- # the state machine that there is no push state.
- if ($state_push_state[$state] eq "") {
- print "0, ";
- } else {
- print " $states{$state_push_state[$state]},";
- }
- print " $state_flag[$state]} ";
-
- # Put out a C++ comment showing the number (index) of this state row,
- # and, if this is the first row of the table for this state, the state name.
- print " // $state ";
- if ($stateNames[$state] ne "") {
- print " $stateNames[$state]";
- }
- print "\n";
- };
- print " };\n";
-
-
- #
- # emit a mapping array from state numbers to state names.
- #
- # This array is used for producing debugging output from the rule parser.
- #
- print "#ifdef RBBI_DEBUG\n";
- print "static const char * const RBBIRuleStateNames[] = {";
- for ($state=0; $state<$num_states; $state++) {
- if ($stateNames[$state] ne "") {
- print " \"$stateNames[$state]\",\n";
- } else {
- print " 0,\n";
- }
- }
- print " 0};\n";
- print "#endif\n\n";
-
- print "U_NAMESPACE_END\n";
- print "#endif\n";
-}
-
-
-
+#**************************************************************************
+# Copyright (C) 2002-2005 International Business Machines Corporation *
+# and others. All rights reserved. *
+#**************************************************************************
+#
+# rbbicst Compile the RBBI rule paser state table data into initialized C data.
+# Usage:
+# cd icu/source/common
+# perl rbbicst.pl < rbbirpt.txt > rbbirpt.h
+# perl rbbicst.pl -j < rbbirpt.txt > RBBIRuleParseTable.java
+#
+# The output file, rbbrpt.h, is included by some of the .cpp rbbi
+# implementation files. This perl script is NOT run as part
+# of a normal ICU build. It is run by hand when needed, and the
+# rbbirpt.h generated file is put back into cvs.
+#
+# See rbbirpt.txt for a description of the input format for this script.
+#
+
+if ($ARGV[0] eq "-j") {
+ $javaOutput = 1;
+ shift @ARGV;
+}
+
+
+$num_states = 1; # Always the state number for the line being compiled.
+$line_num = 0; # The line number in the input file.
+
+$states{"pop"} = 255; # Add the "pop" to the list of defined state names.
+ # This prevents any state from being labelled with "pop",
+ # and resolves references to "pop" in the next state field.
+
+line_loop: while (<>) {
+ chomp();
+ $line = $_;
+ @fields = split();
+ $line_num++;
+
+ # Remove # comments, which are any fields beginning with a #, plus all
+ # that follow on the line.
+ for ($i=0; $i<@fields; $i++) {
+ if ($fields[$i] =~ /^#/) {
+ @fields = @fields[0 .. $i-1];
+ last;
+ }
+ }
+ # ignore blank lines, and those with no fields left after stripping comments..
+ if (@fields == 0) {
+ next;
+ }
+
+ #
+ # State Label: handling.
+ # Does the first token end with a ":"? If so, it's the name of a state.
+ # Put in a hash, together with the current state number,
+ # so that we can later look up the number from the name.
+ #
+ if (@fields[0] =~ /.*:$/) {
+ $state_name = @fields[0];
+ $state_name =~ s/://; # strip off the colon from the state name.
+
+ if ($states{$state_name} != 0) {
+ print " rbbicst: at line $line-num duplicate definition of state $state_name\n";
+ }
+ $states{$state_name} = $num_states;
+ $stateNames[$num_states] = $state_name;
+
+ # if the label was the only thing on this line, go on to the next line,
+ # otherwise assume that a state definition is on the same line and fall through.
+ if (@fields == 1) {
+ next line_loop;
+ }
+ shift @fields; # shift off label field in preparation
+ # for handling the rest of the line.
+ }
+
+ #
+ # State Transition line.
+ # syntax is this,
+ # character [n] target-state [^push-state] [function-name]
+ # where
+ # [something] is an optional something
+ # character is either a single quoted character e.g. '['
+ # or a name of a character class, e.g. white_space
+ #
+
+ $state_line_num[$num_states] = $line_num; # remember line number with each state
+ # so we can make better error messages later.
+ #
+ # First field, character class or literal character for this transition.
+ #
+ if ($fields[0] =~ /^'.'$/) {
+ # We've got a quoted literal character.
+ $state_literal_chars[$num_states] = $fields[0];
+ $state_literal_chars[$num_states] =~ s/'//g;
+ } else {
+ # We've got the name of a character class.
+ $state_char_class[$num_states] = $fields[0];
+ if ($fields[0] =~ /[\W]/) {
+ print " rbbicsts: at line $line_num, bad character literal or character class name.\n";
+ print " scanning $fields[0]\n";
+ exit(-1);
+ }
+ }
+ shift @fields;
+
+ #
+ # do the 'n' flag
+ #
+ $state_flag[$num_states] = $javaOutput? "false" : "FALSE";
+ if ($fields[0] eq "n") {
+ $state_flag[$num_states] = $javaOutput? "true": "TRUE";
+ shift @fields;
+ }
+
+ #
+ # do the destination state.
+ #
+ $state_dest_state[$num_states] = $fields[0];
+ if ($fields[0] eq "") {
+ print " rbbicsts: at line $line_num, destination state missing.\n";
+ exit(-1);
+ }
+ shift @fields;
+
+ #
+ # do the push state, if present.
+ #
+ if ($fields[0] =~ /^\^/) {
+ $fields[0] =~ s/^\^//;
+ $state_push_state[$num_states] = $fields[0];
+ if ($fields[0] eq "" ) {
+ print " rbbicsts: at line $line_num, expected state after ^ (no spaces).\n";
+ exit(-1);
+ }
+ shift @fields;
+ }
+
+ #
+ # Lastly, do the optional action name.
+ #
+ if ($fields[0] ne "") {
+ $state_func_name[$num_states] = $fields[0];
+ shift @fields;
+ }
+
+ #
+ # There should be no fields left on the line at this point.
+ #
+ if (@fields > 0) {
+ print " rbbicsts: at line $line_num, unexpected extra stuff on input line.\n";
+ print " scanning $fields[0]\n";
+ }
+ $num_states++;
+}
+
+#
+# We've read in the whole file, now go back and output the
+# C source code for the state transition table.
+#
+# We read all states first, before writing anything, so that the state numbers
+# for the destination states are all available to be written.
+#
+
+#
+# Make hashes for the names of the character classes and
+# for the names of the actions that appeared.
+#
+for ($state=1; $state < $num_states; $state++) {
+ if ($state_char_class[$state] ne "") {
+ if ($charClasses{$state_char_class[$state]} == 0) {
+ $charClasses{$state_char_class[$state]} = 1;
+ }
+ }
+ if ($state_func_name[$state] eq "") {
+ $state_func_name[$state] = "doNOP";
+ }
+ if ($actions{$state_action_name[$state]} == 0) {
+ $actions{$state_func_name[$state]} = 1;
+ }
+}
+
+#
+# Check that all of the destination states have been defined
+#
+#
+$states{"exit"} = 0; # Predefined state name, terminates state machine.
+for ($state=1; $state<$num_states; $state++) {
+ if ($states{$state_dest_state[$state]} == 0 && $state_dest_state[$state] ne "exit") {
+ print "Error at line $state_line_num[$state]: target state \"$state_dest_state[$state]\" is not defined.\n";
+ $errors++;
+ }
+ if ($state_push_state[$state] ne "" && $states{$state_push_state[$state]} == 0) {
+ print "Error at line $state_line_num[$state]: target state \"$state_push_state[$state]\" is not defined.\n";
+ $errors++;
+ }
+}
+
+die if ($errors>0);
+
+#
+# Assign numbers to each of the character classes classes used.
+# Sets are numbered from 128 - 250
+# The values 0-127 in the state table are used for matching
+# individual ASCII characters (the only thing that can appear in the rules.)
+# The "set" names appearing in the code below (default, etc.) need special
+# handling because they do not correspond to a normal set of characters,
+# but trigger special handling by code in the state machine.
+#
+$i = 128;
+foreach $setName (sort keys %charClasses) {
+ if ($setName eq "default") {
+ $charClasses{$setName} = 255;}
+ elsif ($setName eq "escaped") {
+ $charClasses{$setName} = 254;}
+ elsif ($setName eq "escapedP") {
+ $charClasses{$setName} = 253;}
+ elsif ($setName eq "eof") {
+ $charClasses{$setName} = 252;}
+ else {
+ # Normal (single) character class. Number them.
+ $charClasses{$setName} = $i;
+ $i++;
+ }
+}
+
+
+my ($sec, $min, $hour, , $day, $mon, $year, $wday, $yday, $isdst) = localtime;
+$year += 1900;
+
+if ($javaOutput) {
+ print "/*\n";
+ print " *******************************************************************************\n";
+ print " * Copyright (C) 2003-$year,\n";
+ print " * International Business Machines Corporation and others. All Rights Reserved.\n";
+ print " *******************************************************************************\n";
+ print " */\n";
+ print " \n";
+ print "package com.ibm.icu.text;\n";
+ print " \n";
+ print "/**\n";
+ print " * Generated Java File. Do not edit by hand.\n";
+ print " * This file contains the state table for the ICU Rule Based Break Iterator\n";
+ print " * rule parser.\n";
+ print " * It is generated by the Perl script \"rbbicst.pl\" from\n";
+ print " * the rule parser state definitions file \"rbbirpt.txt\".\n";
+ print " * \@internal \n";
+ print " *\n";
+ print " */\n";
+
+ print "class RBBIRuleParseTable\n";
+ print "{\n";
+
+ #
+ # Emit the constants for the actions to be performed.
+ #
+ $n = 1;
+ foreach $act (sort keys %actions) {
+ print " static final short $act = $n;\n";
+ $n++;
+ }
+ print " \n";
+
+ #
+ # Emit constants for char class names
+ #
+ foreach $setName (sort keys %charClasses) {
+ print " static final short kRuleSet_$setName = $charClasses{$setName};\n";
+ }
+ print "\n\n";
+
+
+ print " static class RBBIRuleTableElement { \n";
+ print " short fAction; \n";
+ print " short fCharClass; \n";
+ print " short fNextState; \n";
+ print " short fPushState; \n";
+ print " boolean fNextChar; \n";
+ print " String fStateName; \n";
+ print " RBBIRuleTableElement(short a, int cc, int ns, int ps, boolean nc, String sn) { \n";
+ print " fAction = a; \n";
+ print " fCharClass = (short)cc; \n";
+ print " fNextState = (short)ns; \n";
+ print " fPushState = (short)ps; \n";
+ print " fNextChar = nc; \n";
+ print " fStateName = sn; \n";
+ print " } \n";
+ print " }; \n";
+ print " \n";
+
+
+ print " static RBBIRuleTableElement[] gRuleParseStateTable = { \n ";
+ print " new RBBIRuleTableElement(doNOP, 0, 0,0, true, null ) // 0 \n"; #output the unused state 0.
+ for ($state=1; $state < $num_states; $state++) {
+ print " , new RBBIRuleTableElement($state_func_name[$state],";
+ if ($state_literal_chars[$state] ne "") {
+ $c = $state_literal_chars[$state];
+ print("'$c', ");
+ }else {
+ print " $charClasses{$state_char_class[$state]},";
+ }
+ print " $states{$state_dest_state[$state]},";
+
+ # The push-state field is optional. If omitted, fill field with a zero, which flags
+ # the state machine that there is no push state.
+ if ($state_push_state[$state] eq "") {
+ print "0, ";
+ } else {
+ print " $states{$state_push_state[$state]},";
+ }
+ print " $state_flag[$state], ";
+
+ # if this is the first row of the table for this state, put out the state name.
+ if ($stateNames[$state] ne "") {
+ print " \"$stateNames[$state]\") ";
+ } else {
+ print " null ) ";
+ }
+
+ # Put out a comment showing the number (index) of this state row,
+ print " // $state ";
+ print "\n";
+ }
+ print " };\n";
+
+ print "}; \n";
+
+}
+else
+{
+ #
+ # C++ Output ...
+ #
+
+
+ print "//---------------------------------------------------------------------------------\n";
+ print "//\n";
+ print "// Generated Header File. Do not edit by hand.\n";
+ print "// This file contains the state table for the ICU Rule Based Break Iterator\n";
+ print "// rule parser.\n";
+ print "// It is generated by the Perl script \"rbbicst.pl\" from\n";
+ print "// the rule parser state definitions file \"rbbirpt.txt\".\n";
+ print "//\n";
+ print "// Copyright (C) 2002-$year International Business Machines Corporation \n";
+ print "// and others. All rights reserved. \n";
+ print "//\n";
+ print "//---------------------------------------------------------------------------------\n";
+ print "#ifndef RBBIRPT_H\n";
+ print "#define RBBIRPT_H\n";
+ print "\n";
+ print "U_NAMESPACE_BEGIN\n";
+
+ #
+ # Emit the constants for indicies of Unicode Sets
+ # Define one constant for each of the character classes encountered.
+ # At the same time, store the index corresponding to the set name back into hash.
+ #
+ print "//\n";
+ print "// Character classes for RBBI rule scanning.\n";
+ print "//\n";
+ foreach $setName (sort keys %charClasses) {
+ if ($charClasses{$setName} < 250) {
+ # Normal character class.
+ print " static const uint8_t kRuleSet_$setName = $charClasses{$setName};\n";
+ }
+ }
+ print "\n\n";
+
+ #
+ # Emit the enum for the actions to be performed.
+ #
+ print "enum RBBI_RuleParseAction {\n";
+ foreach $act (sort keys %actions) {
+ print " $act,\n";
+ }
+ print " rbbiLastAction};\n\n";
+
+ #
+ # Emit the struct definition for transtion table elements.
+ #
+ print "//-------------------------------------------------------------------------------\n";
+ print "//\n";
+ print "// RBBIRuleTableEl represents the structure of a row in the transition table\n";
+ print "// for the rule parser state machine.\n";
+ print "//-------------------------------------------------------------------------------\n";
+ print "struct RBBIRuleTableEl {\n";
+ print " RBBI_RuleParseAction fAction;\n";
+ print " uint8_t fCharClass; // 0-127: an individual ASCII character\n";
+ print " // 128-255: character class index\n";
+ print " uint8_t fNextState; // 0-250: normal next-stat numbers\n";
+ print " // 255: pop next-state from stack.\n";
+ print " uint8_t fPushState;\n";
+ print " UBool fNextChar;\n";
+ print "};\n\n";
+
+ #
+ # emit the state transition table
+ #
+ print "static const struct RBBIRuleTableEl gRuleParseStateTable[] = {\n";
+ print " {doNOP, 0, 0, 0, TRUE}\n"; # State 0 is a dummy. Real states start with index = 1.
+ for ($state=1; $state < $num_states; $state++) {
+ print " , {$state_func_name[$state],";
+ if ($state_literal_chars[$state] ne "") {
+ $c = $state_literal_chars[$state];
+ printf(" %d /* $c */,", ord($c)); # use numeric value, so EBCDIC machines are ok.
+ }else {
+ print " $charClasses{$state_char_class[$state]},";
+ }
+ print " $states{$state_dest_state[$state]},";
+
+ # The push-state field is optional. If omitted, fill field with a zero, which flags
+ # the state machine that there is no push state.
+ if ($state_push_state[$state] eq "") {
+ print "0, ";
+ } else {
+ print " $states{$state_push_state[$state]},";
+ }
+ print " $state_flag[$state]} ";
+
+ # Put out a C++ comment showing the number (index) of this state row,
+ # and, if this is the first row of the table for this state, the state name.
+ print " // $state ";
+ if ($stateNames[$state] ne "") {
+ print " $stateNames[$state]";
+ }
+ print "\n";
+ };
+ print " };\n";
+
+
+ #
+ # emit a mapping array from state numbers to state names.
+ #
+ # This array is used for producing debugging output from the rule parser.
+ #
+ print "#ifdef RBBI_DEBUG\n";
+ print "static const char * const RBBIRuleStateNames[] = {";
+ for ($state=0; $state<$num_states; $state++) {
+ if ($stateNames[$state] ne "") {
+ print " \"$stateNames[$state]\",\n";
+ } else {
+ print " 0,\n";
+ }
+ }
+ print " 0};\n";
+ print "#endif\n\n";
+
+ print "U_NAMESPACE_END\n";
+ print "#endif\n";
+}
+
+
+
diff --git a/icuSources/common/rbbidata.cpp b/icuSources/common/rbbidata.cpp
index aa33c610..360290bd 100644
--- a/icuSources/common/rbbidata.cpp
+++ b/icuSources/common/rbbidata.cpp
@@ -1,6 +1,6 @@
/*
***************************************************************************
-* Copyright (C) 1999-2004 International Business Machines Corporation *
+* Copyright (C) 1999-2005 International Business Machines Corporation *
* and others. All rights reserved. *
***************************************************************************
*/
@@ -69,8 +69,11 @@ void RBBIDataWrapper::init(const RBBIDataHeader *data, UErrorCode &status) {
return;
}
fHeader = data;
- if (fHeader->fMagic != 0xb1a0) {
- status = U_BRK_INTERNAL_ERROR;
+ if (fHeader->fMagic != 0xb1a0 ||
+ !(fHeader->fFormatVersion[0] == 3 || // ICU 3.4
+ *(int32_t *)fHeader->fFormatVersion == 1)) // ICU 3.2 and earlier.
+ {
+ status = U_INVALID_FORMAT_ERROR;
return;
}
@@ -234,7 +237,8 @@ void RBBIDataWrapper::printTable(const char *heading, const RBBIStateTable *tab
#ifdef RBBI_DEBUG
void RBBIDataWrapper::printData() {
RBBIDebugPrintf("RBBI Data at %p\n", (void *)fHeader);
- RBBIDebugPrintf(" Version = %d\n", fHeader->fVersion);
+ RBBIDebugPrintf(" Version = {%d %d %d %d}\n", fHeader->fFormatVersion[0], fHeader->fFormatVersion[1],
+ fHeader->fFormatVersion[2], fHeader->fFormatVersion[3]);
RBBIDebugPrintf(" total length of data = %d\n", fHeader->fLength);
RBBIDebugPrintf(" number of character categories = %d\n\n", fHeader->fCatCount);
@@ -267,6 +271,10 @@ ubrk_swap(const UDataSwapper *ds, const void *inData, int32_t length, void *outD
if (status == NULL || U_FAILURE(*status)) {
return 0;
}
+ if(ds==NULL || inData==NULL || length<-1 || (length>0 && outData==NULL)) {
+ *status=U_ILLEGAL_ARGUMENT_ERROR;
+ return 0;
+ }
//
// Check that the data header is for for break data.
@@ -298,10 +306,16 @@ ubrk_swap(const UDataSwapper *ds, const void *inData, int32_t length, void *outD
//
// Get the RRBI Data Header, and check that it appears to be OK.
//
+ // Note: ICU 3.2 and earlier, RBBIDataHeader::fDataFormat was actually
+ // an int32_t with a value of 1. Starting with ICU 3.4,
+ // RBBI's fDataFormat matches the dataFormat field from the
+ // UDataInfo header, four int8_t bytes. The value is {3,1,0,0}
+ //
const uint8_t *inBytes =(const uint8_t *)inData+headerSize;
RBBIDataHeader *rbbiDH = (RBBIDataHeader *)inBytes;
+ UBool formatVersionOne = ds->readUInt32(*(int32_t *)rbbiDH->fFormatVersion) == 1;
if (ds->readUInt32(rbbiDH->fMagic) != 0xb1a0 ||
- ds->readUInt32(rbbiDH->fVersion) != 1 ||
+ !(formatVersionOne || rbbiDH->fFormatVersion[0] == 3) ||
ds->readUInt32(rbbiDH->fLength) < sizeof(RBBIDataHeader))
{
udata_printError(ds, "ubrk_swap(): RBBI Data header is invalid.\n");
@@ -312,7 +326,8 @@ ubrk_swap(const UDataSwapper *ds, const void *inData, int32_t length, void *outD
//
// Prefight operation? Just return the size
//
- int32_t totalSize = headerSize + ds->readUInt32(rbbiDH->fLength);
+ int32_t breakDataLength = ds->readUInt32(rbbiDH->fLength);
+ int32_t totalSize = headerSize + breakDataLength;
if (length < 0) {
return totalSize;
}
@@ -320,15 +335,12 @@ ubrk_swap(const UDataSwapper *ds, const void *inData, int32_t length, void *outD
//
// Check that length passed in is consistent with length from RBBI data header.
//
- if (length > 0) {
- length -= headerSize;
- if ((uint32_t)length < ds->readUInt32(rbbiDH->fLength)) {
- udata_printError(ds, "ubrk_swap(): too few bytes (%d after ICU Data header) for break data.\n",
- length);
- *status=U_INDEX_OUTOFBOUNDS_ERROR;
- return 0;
+ if (length < totalSize) {
+ udata_printError(ds, "ubrk_swap(): too few bytes (%d after ICU Data header) for break data.\n",
+ breakDataLength);
+ *status=U_INDEX_OUTOFBOUNDS_ERROR;
+ return 0;
}
- }
//
@@ -336,7 +348,9 @@ ubrk_swap(const UDataSwapper *ds, const void *inData, int32_t length, void *outD
// we need to reference the header to locate the data, and an
// inplace swap of the header leaves it unusable.
//
- uint8_t *outBytes = (uint8_t *)outData + headerSize;
+ uint8_t *outBytes = (uint8_t *)outData + headerSize;
+ RBBIDataHeader *outputDH = (RBBIDataHeader *)outBytes;
+
int32_t tableStartOffset;
int32_t tableLength;
@@ -346,7 +360,7 @@ ubrk_swap(const UDataSwapper *ds, const void *inData, int32_t length, void *outD
// when originally created. Any unused space between items needs to be zero.
//
if (inBytes != outBytes) {
- uprv_memset(outBytes, 0, length);
+ uprv_memset(outBytes, 0, breakDataLength);
}
//
@@ -412,8 +426,16 @@ ubrk_swap(const UDataSwapper *ds, const void *inData, int32_t length, void *outD
ds->swapArray32(ds, inBytes+ds->readUInt32(rbbiDH->fStatusTable), ds->readUInt32(rbbiDH->fStatusTableLen),
outBytes+ds->readUInt32(rbbiDH->fStatusTable), status);
- // And, last, the header. All 32 bit values.
- ds->swapArray32(ds, inBytes, sizeof(RBBIDataHeader), outBytes, status);
+ // And, last, the header.
+ // For the old version one format, the entire header consists of int32_t values.
+ // For the newer formats, the fDataFormat field is an array of four bytes.
+ // Swap the whole thing as int32_t, then, for the newer format, re-swap the one field.
+ //
+ ds->swapArray32(ds, inBytes, sizeof(RBBIDataHeader), outBytes, status);
+ if (formatVersionOne == FALSE) {
+ ds->swapArray32(ds, outputDH->fFormatVersion, 4, outputDH->fFormatVersion, status);
+ }
+
return totalSize;
}
diff --git a/icuSources/common/rbbidata.h b/icuSources/common/rbbidata.h
index fda2a79d..7ba1db05 100644
--- a/icuSources/common/rbbidata.h
+++ b/icuSources/common/rbbidata.h
@@ -1,7 +1,7 @@
/*
*******************************************************************************
*
-* Copyright (C) 1999-2004, International Business Machines
+* Copyright (C) 1999-2005, International Business Machines
* Corporation and others. All Rights Reserved.
*
*******************************************************************************
@@ -57,17 +57,22 @@ U_NAMESPACE_BEGIN
* The following structs map exactly onto the raw data from ICU common data file.
*/
struct RBBIDataHeader {
- uint32_t fMagic; /* == 0xbla0 */
- uint32_t fVersion; /* == 1 */
- uint32_t fLength; /* Total length in bytes of this RBBI Data, */
- /* including all sections, not just the header. */
- uint32_t fCatCount; /* Number of character categories. */
-
- /* */
- /* Offsets and sizes of each of the subsections within the RBBI data. */
- /* All offsets are bytes from the start of the RBBIDataHeader. */
- /* All sizes are in bytes. */
- /* */
+ uint32_t fMagic; /* == 0xbla0 */
+ uint8_t fFormatVersion[4]; /* Data Format. Same as the value in struct UDataInfo */
+ /* if there is one associated with this data. */
+ /* (version originates in rbbi, is copied to UDataInfo) */
+ /* For ICU 3.2 and earlier, this field was */
+ /* uint32_t fVersion */
+ /* with a value of 1. */
+ uint32_t fLength; /* Total length in bytes of this RBBI Data, */
+ /* including all sections, not just the header. */
+ uint32_t fCatCount; /* Number of character categories. */
+
+ /* */
+ /* Offsets and sizes of each of the subsections within the RBBI data. */
+ /* All offsets are bytes from the start of the RBBIDataHeader. */
+ /* All sizes are in bytes. */
+ /* */
uint32_t fFTable; /* forward state transition table. */
uint32_t fFTableLen;
uint32_t fRTable; /* Offset to the reverse state transition table. */
@@ -126,7 +131,8 @@ struct RBBIStateTable {
};
typedef enum {
- RBBI_LOOKAHEAD_HARD_BREAK = 1
+ RBBI_LOOKAHEAD_HARD_BREAK = 1,
+ RBBI_BOF_REQUIRED = 2
} RBBIStateTableFlags;
diff --git a/icuSources/common/rbbinode.cpp b/icuSources/common/rbbinode.cpp
index b873f218..af467b6d 100644
--- a/icuSources/common/rbbinode.cpp
+++ b/icuSources/common/rbbinode.cpp
@@ -1,6 +1,6 @@
/*
***************************************************************************
-* Copyright (C) 2002-2003 International Business Machines Corporation *
+* Copyright (C) 2002-2006 International Business Machines Corporation *
* and others. All rights reserved. *
***************************************************************************
*/
@@ -33,8 +33,9 @@
U_NAMESPACE_BEGIN
-int RBBINode::gLastSerial = 0;
-
+#ifdef RBBI_DEBUG
+static int gLastSerial = 0;
+#endif
//-------------------------------------------------------------------------
@@ -43,7 +44,9 @@ int RBBINode::gLastSerial = 0;
//
//-------------------------------------------------------------------------
RBBINode::RBBINode(NodeType t) : UMemory() {
+#ifdef RBBI_DEBUG
fSerialNum = ++gLastSerial;
+#endif
fType = t;
fParent = NULL;
fLeftChild = NULL;
@@ -69,7 +72,9 @@ RBBINode::RBBINode(NodeType t) : UMemory() {
RBBINode::RBBINode(const RBBINode &other) : UMemory(other) {
+#ifdef RBBI_DEBUG
fSerialNum = ++gLastSerial;
+#endif
fType = other.fType;
fParent = NULL;
fLeftChild = NULL;
diff --git a/icuSources/common/rbbinode.h b/icuSources/common/rbbinode.h
index 68286792..0cbf6a71 100644
--- a/icuSources/common/rbbinode.h
+++ b/icuSources/common/rbbinode.h
@@ -1,6 +1,6 @@
/********************************************************************
* COPYRIGHT:
- * Copyright (c) 2001-2003, International Business Machines Corporation and
+ * Copyright (c) 2001-2006, International Business Machines Corporation and
* others. All Rights Reserved.
********************************************************************/
@@ -96,20 +96,15 @@ class RBBINode : public UMemory {
#ifdef RBBI_DEBUG
void printNode();
void printTree(UBool withHeading);
-#else
- // Do-nothing inline functions for non-debug builds. Can't make empty defines for member
- // functions - they won't compile at the call sites.
- int fakeField;
- #define printNode() fakeField=0;
- #define printTree(withHeading) fakeField=0;
#endif
private:
RBBINode &operator = (const RBBINode &other); // No defs.
UBool operator == (const RBBINode &other); // Private, so these functions won't accidently be used.
+#ifdef RBBI_DEBUG
int fSerialNum; // Debugging aids.
- static int gLastSerial;
+#endif
};
#ifdef RBBI_DEBUG
diff --git a/icuSources/common/rbbirb.cpp b/icuSources/common/rbbirb.cpp
index 273ef9d1..a3d32c39 100644
--- a/icuSources/common/rbbirb.cpp
+++ b/icuSources/common/rbbirb.cpp
@@ -1,7 +1,7 @@
//
// file: rbbirb.cpp
//
-// Copyright (C) 2002-2004, International Business Machines Corporation and others.
+// Copyright (C) 2002-2005, International Business Machines Corporation and others.
// All Rights Reserved.
//
// This file contains the RBBIRuleBuilder class implementation. This is the main class for
@@ -143,7 +143,7 @@ RBBIDataHeader *RBBIRuleBuilder::flattenData() {
}
// Remove comments and whitespace from the rules to make it smaller.
- UnicodeString strippedRules(RBBIRuleScanner::stripRules(fRules));
+ UnicodeString strippedRules((const UnicodeString&)RBBIRuleScanner::stripRules(fRules));
// Calculate the size of each section in the data.
// Sizes here are padded up to a multiple of 8 for better memory alignment.
@@ -171,10 +171,13 @@ RBBIDataHeader *RBBIRuleBuilder::flattenData() {
uprv_memset(data, 0, totalSize);
- data->fMagic = 0xb1a0;
- data->fVersion = 1;
- data->fLength = totalSize;
- data->fCatCount = fSetBuilder->getNumCharCategories();
+ data->fMagic = 0xb1a0;
+ data->fFormatVersion[0] = 3;
+ data->fFormatVersion[1] = 1;
+ data->fFormatVersion[2] = 0;
+ data->fFormatVersion[3] = 0;
+ data->fLength = totalSize;
+ data->fCatCount = fSetBuilder->getNumCharCategories();
data->fFTable = headerSize;
data->fFTableLen = forwardTableSize;
diff --git a/icuSources/common/rbbirb.h b/icuSources/common/rbbirb.h
index 0e0aba0a..d7a53836 100644
--- a/icuSources/common/rbbirb.h
+++ b/icuSources/common/rbbirb.h
@@ -1,7 +1,7 @@
//
// rbbirb.h
//
-// Copyright (C) 2002-2004, International Business Machines Corporation and others.
+// Copyright (C) 2002-2005, International Business Machines Corporation and others.
// All Rights Reserved.
//
// This file contains declarations for several classes from the
@@ -84,7 +84,7 @@ public:
#else
// A do-nothing inline function for non-debug builds. Member funcs can't be empty
// or the call sites won't compile.
- int fFakeField;
+ int32_t fFakeField;
#define rbbiSymtablePrint() fFakeField=0;
#endif
@@ -200,7 +200,7 @@ struct RBBISetTableEl {
#define RBBIDebugPrintf printf
#define RBBIDebugPuts puts
#else
-inline void RBBIDebugPrintf(...) {}
+#undef RBBIDebugPrintf
#define RBBIDebugPuts(arg)
#endif
diff --git a/icuSources/common/rbbirpt.h b/icuSources/common/rbbirpt.h
index 3b6473d4..deea57b7 100644
--- a/icuSources/common/rbbirpt.h
+++ b/icuSources/common/rbbirpt.h
@@ -6,7 +6,7 @@
// It is generated by the Perl script "rbbicst.pl" from
// the rule parser state definitions file "rbbirpt.txt".
//
-// Copyright (C) 2002-2004 International Business Machines Corporation
+// Copyright (C) 2002-2005 International Business Machines Corporation
// and others. All rights reserved.
//
//---------------------------------------------------------------------------------
@@ -18,44 +18,44 @@ U_NAMESPACE_BEGIN
// Character classes for RBBI rule scanning.
//
static const uint8_t kRuleSet_digit_char = 128;
- static const uint8_t kRuleSet_white_space = 129;
- static const uint8_t kRuleSet_rule_char = 130;
- static const uint8_t kRuleSet_name_start_char = 131;
- static const uint8_t kRuleSet_name_char = 132;
+ static const uint8_t kRuleSet_name_char = 129;
+ static const uint8_t kRuleSet_name_start_char = 130;
+ static const uint8_t kRuleSet_rule_char = 131;
+ static const uint8_t kRuleSet_white_space = 132;
enum RBBI_RuleParseAction {
+ doCheckVarDef,
+ doDotAny,
+ doEndAssign,
+ doEndOfRule,
+ doEndVariableName,
+ doExit,
+ doExprCatOperator,
+ doExprFinished,
doExprOrOperator,
+ doExprRParen,
+ doExprStart,
+ doLParen,
+ doNOP,
doOptionEnd,
- doRuleErrorAssignExpr,
- doTagValue,
- doEndAssign,
- doRuleError,
- doVariableNameExpectedErr,
+ doOptionStart,
+ doReverseDir,
doRuleChar,
- doLParen,
+ doRuleError,
+ doRuleErrorAssignExpr,
+ doScanUnicodeSet,
doSlash,
+ doStartAssign,
doStartTagValue,
- doDotAny,
- doExprFinished,
- doScanUnicodeSet,
- doExprRParen,
doStartVariableName,
- doTagExpectedError,
doTagDigit,
- doUnaryOpStar,
- doEndVariableName,
- doNOP,
- doUnaryOpQuestion,
- doExit,
- doStartAssign,
- doEndOfRule,
+ doTagExpectedError,
+ doTagValue,
doUnaryOpPlus,
- doExprStart,
- doOptionStart,
- doExprCatOperator,
- doReverseDir,
- doCheckVarDef,
+ doUnaryOpQuestion,
+ doUnaryOpStar,
+ doVariableNameExpectedErr,
rbbiLastAction};
//-------------------------------------------------------------------------------
@@ -76,42 +76,42 @@ struct RBBIRuleTableEl {
static const struct RBBIRuleTableEl gRuleParseStateTable[] = {
{doNOP, 0, 0, 0, TRUE}
, {doExprStart, 254, 21, 8, FALSE} // 1 start
- , {doNOP, 129, 1,0, TRUE} // 2
+ , {doNOP, 132, 1,0, TRUE} // 2
, {doExprStart, 36 /* $ */, 80, 90, FALSE} // 3
, {doNOP, 33 /* ! */, 11,0, TRUE} // 4
, {doNOP, 59 /* ; */, 1,0, TRUE} // 5
, {doNOP, 252, 0,0, FALSE} // 6
, {doExprStart, 255, 21, 8, FALSE} // 7
, {doEndOfRule, 59 /* ; */, 1,0, TRUE} // 8 break-rule-end
- , {doNOP, 129, 8,0, TRUE} // 9
+ , {doNOP, 132, 8,0, TRUE} // 9
, {doRuleError, 255, 95,0, FALSE} // 10
, {doNOP, 33 /* ! */, 13,0, TRUE} // 11 rev-option
, {doReverseDir, 255, 20, 8, FALSE} // 12
- , {doOptionStart, 131, 15,0, TRUE} // 13 option-scan1
+ , {doOptionStart, 130, 15,0, TRUE} // 13 option-scan1
, {doRuleError, 255, 95,0, FALSE} // 14
- , {doNOP, 132, 15,0, TRUE} // 15 option-scan2
+ , {doNOP, 129, 15,0, TRUE} // 15 option-scan2
, {doOptionEnd, 255, 17,0, FALSE} // 16
, {doNOP, 59 /* ; */, 1,0, TRUE} // 17 option-scan3
- , {doNOP, 129, 17,0, TRUE} // 18
+ , {doNOP, 132, 17,0, TRUE} // 18
, {doRuleError, 255, 95,0, FALSE} // 19
, {doExprStart, 255, 21, 8, FALSE} // 20 reverse-rule
, {doRuleChar, 254, 30,0, TRUE} // 21 term
- , {doNOP, 129, 21,0, TRUE} // 22
- , {doRuleChar, 130, 30,0, TRUE} // 23
+ , {doNOP, 132, 21,0, TRUE} // 22
+ , {doRuleChar, 131, 30,0, TRUE} // 23
, {doNOP, 91 /* [ */, 86, 30, FALSE} // 24
, {doLParen, 40 /* ( */, 21, 30, TRUE} // 25
, {doNOP, 36 /* $ */, 80, 29, FALSE} // 26
, {doDotAny, 46 /* . */, 30,0, TRUE} // 27
, {doRuleError, 255, 95,0, FALSE} // 28
, {doCheckVarDef, 255, 30,0, FALSE} // 29 term-var-ref
- , {doNOP, 129, 30,0, TRUE} // 30 expr-mod
+ , {doNOP, 132, 30,0, TRUE} // 30 expr-mod
, {doUnaryOpStar, 42 /* * */, 35,0, TRUE} // 31
, {doUnaryOpPlus, 43 /* + */, 35,0, TRUE} // 32
, {doUnaryOpQuestion, 63 /* ? */, 35,0, TRUE} // 33
, {doNOP, 255, 35,0, FALSE} // 34
, {doExprCatOperator, 254, 21,0, FALSE} // 35 expr-cont
- , {doNOP, 129, 35,0, TRUE} // 36
- , {doExprCatOperator, 130, 21,0, FALSE} // 37
+ , {doNOP, 132, 35,0, TRUE} // 36
+ , {doExprCatOperator, 131, 21,0, FALSE} // 37
, {doExprCatOperator, 91 /* [ */, 21,0, FALSE} // 38
, {doExprCatOperator, 40 /* ( */, 21,0, FALSE} // 39
, {doExprCatOperator, 36 /* $ */, 21,0, FALSE} // 40
@@ -124,8 +124,8 @@ static const struct RBBIRuleTableEl gRuleParseStateTable[] = {
, {doSlash, 47 /* / */, 49,0, TRUE} // 47 look-ahead
, {doNOP, 255, 95,0, FALSE} // 48
, {doExprCatOperator, 254, 21,0, FALSE} // 49 expr-cont-no-slash
- , {doNOP, 129, 35,0, TRUE} // 50
- , {doExprCatOperator, 130, 21,0, FALSE} // 51
+ , {doNOP, 132, 35,0, TRUE} // 50
+ , {doExprCatOperator, 131, 21,0, FALSE} // 51
, {doExprCatOperator, 91 /* [ */, 21,0, FALSE} // 52
, {doExprCatOperator, 40 /* ( */, 21,0, FALSE} // 53
, {doExprCatOperator, 36 /* $ */, 21,0, FALSE} // 54
@@ -133,19 +133,19 @@ static const struct RBBIRuleTableEl gRuleParseStateTable[] = {
, {doExprOrOperator, 124 /* | */, 21,0, TRUE} // 56
, {doExprRParen, 41 /* ) */, 255,0, TRUE} // 57
, {doExprFinished, 255, 255,0, FALSE} // 58
- , {doNOP, 129, 59,0, TRUE} // 59 tag-open
+ , {doNOP, 132, 59,0, TRUE} // 59 tag-open
, {doStartTagValue, 128, 62,0, FALSE} // 60
, {doTagExpectedError, 255, 95,0, FALSE} // 61
- , {doNOP, 129, 66,0, TRUE} // 62 tag-value
+ , {doNOP, 132, 66,0, TRUE} // 62 tag-value
, {doNOP, 125 /* } */, 66,0, FALSE} // 63
, {doTagDigit, 128, 62,0, TRUE} // 64
, {doTagExpectedError, 255, 95,0, FALSE} // 65
- , {doNOP, 129, 66,0, TRUE} // 66 tag-close
+ , {doNOP, 132, 66,0, TRUE} // 66 tag-close
, {doTagValue, 125 /* } */, 69,0, TRUE} // 67
, {doTagExpectedError, 255, 95,0, FALSE} // 68
, {doExprCatOperator, 254, 21,0, FALSE} // 69 expr-cont-no-tag
- , {doNOP, 129, 69,0, TRUE} // 70
- , {doExprCatOperator, 130, 21,0, FALSE} // 71
+ , {doNOP, 132, 69,0, TRUE} // 70
+ , {doExprCatOperator, 131, 21,0, FALSE} // 71
, {doExprCatOperator, 91 /* [ */, 21,0, FALSE} // 72
, {doExprCatOperator, 40 /* ( */, 21,0, FALSE} // 73
, {doExprCatOperator, 36 /* $ */, 21,0, FALSE} // 74
@@ -156,15 +156,15 @@ static const struct RBBIRuleTableEl gRuleParseStateTable[] = {
, {doExprFinished, 255, 255,0, FALSE} // 79
, {doStartVariableName, 36 /* $ */, 82,0, TRUE} // 80 scan-var-name
, {doNOP, 255, 95,0, FALSE} // 81
- , {doNOP, 131, 84,0, TRUE} // 82 scan-var-start
+ , {doNOP, 130, 84,0, TRUE} // 82 scan-var-start
, {doVariableNameExpectedErr, 255, 95,0, FALSE} // 83
- , {doNOP, 132, 84,0, TRUE} // 84 scan-var-body
+ , {doNOP, 129, 84,0, TRUE} // 84 scan-var-body
, {doEndVariableName, 255, 255,0, FALSE} // 85
, {doScanUnicodeSet, 91 /* [ */, 255,0, TRUE} // 86 scan-unicode-set
, {doScanUnicodeSet, 112 /* p */, 255,0, TRUE} // 87
, {doScanUnicodeSet, 80 /* P */, 255,0, TRUE} // 88
, {doNOP, 255, 95,0, FALSE} // 89
- , {doNOP, 129, 90,0, TRUE} // 90 assign-or-rule
+ , {doNOP, 132, 90,0, TRUE} // 90 assign-or-rule
, {doStartAssign, 61 /* = */, 21, 93, TRUE} // 91
, {doNOP, 255, 29, 8, FALSE} // 92
, {doEndAssign, 59 /* ; */, 1,0, TRUE} // 93 assign-end
diff --git a/icuSources/common/rbbiscan.cpp b/icuSources/common/rbbiscan.cpp
index 13c44c42..75c69f52 100644
--- a/icuSources/common/rbbiscan.cpp
+++ b/icuSources/common/rbbiscan.cpp
@@ -2,7 +2,7 @@
//
// file: rbbiscan.cpp
//
-// Copyright (C) 2002-2004, International Business Machines Corporation and others.
+// Copyright (C) 2002-2006, International Business Machines Corporation and others.
// All Rights Reserved.
//
// This file contains the Rule Based Break Iterator Rule Builder functions for
@@ -71,7 +71,7 @@ static const UChar kAny[] = {0x61, 0x6e, 0x79, 0x00}; // "any"
U_CDECL_BEGIN
-static void U_EXPORT2 U_CALLCONV RBBISetTable_deleter(void *p) {
+static void U_CALLCONV RBBISetTable_deleter(void *p) {
RBBISetTableEl *px = (RBBISetTableEl *)p;
delete px->key;
// Note: px->val is owned by the linked list "fSetsListHead" in scanner.
@@ -142,7 +142,7 @@ RBBIRuleScanner::RBBIRuleScanner(RBBIRuleBuilder *rb)
}
fSymbolTable = new RBBISymbolTable(this, rb->fRules, *rb->fStatus);
- fSetTable = uhash_open(uhash_hashUnicodeString, uhash_compareUnicodeString, rb->fStatus);
+ fSetTable = uhash_open(uhash_hashUnicodeString, uhash_compareUnicodeString, NULL, rb->fStatus);
uhash_setValueDeleter(fSetTable, RBBISetTable_deleter);
}
@@ -289,6 +289,13 @@ UBool RBBIRuleScanner::doParseActions(EParseAction action)
// Make a symbol table entry for the $variableRef node.
fSymbolTable->addEntry(varRefNode->fText, varRefNode, *fRB->fStatus);
+ if (U_FAILURE(*fRB->fStatus)) {
+ // This is a round-about way to get the parse position set
+ // so that duplicate symbols error messages include a line number.
+ UErrorCode t = *fRB->fStatus;
+ *fRB->fStatus = U_ZERO_ERROR;
+ error(t);
+ }
// Clean up the stack.
delete startExprNode;
@@ -302,7 +309,9 @@ UBool RBBIRuleScanner::doParseActions(EParseAction action)
if (U_FAILURE(*fRB->fStatus)) { // parse tree rooted in TOS node.
break;
}
+#ifdef RBBI_DEBUG
if (fRB->fDebugEnv && uprv_strstr(fRB->fDebugEnv, "rtree")) {printNodeStack("end of rule");}
+#endif
U_ASSERT(fNodeStackPtr == 1);
// If this rule includes a look-ahead '/', add a endMark node to the
@@ -426,7 +435,6 @@ UBool RBBIRuleScanner::doParseActions(EParseAction action)
fRB->fRules.extractBetween(n->fFirstPos, n->fLastPos, n->fText);
break;
}
- break;
case doSlash:
// Scanned a '/', which identifies a look-ahead break position in a rule.
@@ -939,7 +947,9 @@ void RBBIRuleScanner::parse() {
#endif
for (;;) {
- if (fRB->fDebugEnv && uprv_strstr(fRB->fDebugEnv, "scan")) { RBBIDebugPrintf(".");}
+ #ifdef RBBI_DEBUG
+ if (fRB->fDebugEnv && uprv_strstr(fRB->fDebugEnv, "scan")) { RBBIDebugPrintf(".");}
+ #endif
if (tableEl->fCharClass < 127 && fC.fEscaped == FALSE && tableEl->fCharClass == fC.fChar) {
// Table row specified an individual character, not a set, and
// the input character is not escaped, and
@@ -978,7 +988,7 @@ void RBBIRuleScanner::parse() {
// No match on this row, advance to the next row for this state,
tableEl++;
}
- if (fRB->fDebugEnv && uprv_strstr(fRB->fDebugEnv, "scan")) { RBBIDebugPrintf("\n");}
+ if (fRB->fDebugEnv && uprv_strstr(fRB->fDebugEnv, "scan")) { RBBIDebugPuts("");}
//
// We've found the row of the state table that matches the current input
@@ -1062,8 +1072,6 @@ void RBBIRuleScanner::parse() {
//
//---------------------------------------------------------------------------------
#ifdef RBBI_DEBUG
-void RBBIRuleScanner::printNodeStack(const char *) {}
-#else
void RBBIRuleScanner::printNodeStack(const char *title) {
int i;
RBBIDebugPrintf("%s. Dumping node stack...\n", title);
@@ -1130,7 +1138,9 @@ void RBBIRuleScanner::scanSet() {
if (U_FAILURE(localStatus)) {
// TODO: Get more accurate position of the error from UnicodeSet's return info.
// UnicodeSet appears to not be reporting correctly at this time.
- RBBIDebugPrintf("UnicodeSet parse postion.ErrorIndex = %d\n", pos.getIndex());
+ #ifdef RBBI_DEBUG
+ RBBIDebugPrintf("UnicodeSet parse postion.ErrorIndex = %d\n", pos.getIndex());
+ #endif
error(localStatus);
delete uset;
return;
@@ -1138,7 +1148,7 @@ void RBBIRuleScanner::scanSet() {
// Verify that the set contains at least one code point.
//
- if (uset->charAt(0) == -1) {
+ if (uset->isEmpty()) {
// This set is empty.
// Make it an error, because it almost certainly is not what the user wanted.
// Also, avoids having to think about corner cases in the tree manipulation code
diff --git a/icuSources/common/rbbiscan.h b/icuSources/common/rbbiscan.h
index 918f5f9f..89748318 100644
--- a/icuSources/common/rbbiscan.h
+++ b/icuSources/common/rbbiscan.h
@@ -1,7 +1,7 @@
//
// rbbiscan.h
//
-// Copyright (C) 2002-2003, International Business Machines Corporation and others.
+// Copyright (C) 2002-2005, International Business Machines Corporation and others.
// All Rights Reserved.
//
// This file contains declarations for class RBBIRuleScanner
@@ -88,7 +88,9 @@ private:
void findSetFor(const UnicodeString &s, RBBINode *node, UnicodeSet *setToAdopt = NULL);
UChar32 nextCharLL();
+#ifdef RBBI_DEBUG
void printNodeStack(const char *title);
+#endif
RBBINode *pushNewNode(RBBINode::NodeType t);
void scanSet();
@@ -100,8 +102,8 @@ private:
int32_t fNextIndex; // Index of the next character, which
// is the first character not yet scanned.
UBool fQuoteMode; // Scan is in a 'quoted region'
- int fLineNum; // Line number in input file.
- int fCharNum; // Char position within the line.
+ int32_t fLineNum; // Line number in input file.
+ int32_t fCharNum; // Char position within the line.
UChar32 fLastChar; // Previous char, needed to count CR-LF
// as a single line, not two.
@@ -114,12 +116,12 @@ private:
// parsing. index by p[state][char-class]
uint16_t fStack[kStackSize]; // State stack, holds state pushes
- int fStackPtr; // and pops as specified in the state
+ int32_t fStackPtr; // and pops as specified in the state
// transition rules.
RBBINode *fNodeStack[kStackSize]; // Node stack, holds nodes created
// during the parse of a rule
- int fNodeStackPtr;
+ int32_t fNodeStackPtr;
UBool fReverseRule; // True if the rule currently being scanned
diff --git a/icuSources/common/rbbisetb.cpp b/icuSources/common/rbbisetb.cpp
index 50ac3ca1..5337738b 100644
--- a/icuSources/common/rbbisetb.cpp
+++ b/icuSources/common/rbbisetb.cpp
@@ -3,7 +3,7 @@
//
/*
***************************************************************************
-* Copyright (C) 2002-2004 International Business Machines Corporation *
+* Copyright (C) 2002-2005 International Business Machines Corporation *
* and others. All rights reserved. *
***************************************************************************
*/
@@ -94,6 +94,7 @@ RBBISetBuilder::RBBISetBuilder(RBBIRuleBuilder *rb)
fTrie = 0;
fTrieSize = 0;
fGroupCount = 0;
+ fSawBOF = FALSE;
}
@@ -147,7 +148,7 @@ void RBBISetBuilder::build() {
// Find the set of non-overlapping ranges of characters
//
int ni;
- for (ni=0; ; ni++) {
+ for (ni=0; ; ni++) { // Loop over each of the UnicodeSets encountered in the input rules
usetNode = (RBBINode *)this->fRB->fUSetNodes->elementAt(ni);
if (usetNode==NULL) {
break;
@@ -222,6 +223,11 @@ void RBBISetBuilder::build() {
// The groups are numbered, and these group numbers are the set of
// input symbols recognized by the run-time state machine.
//
+ // Numbering: # 0 (state table column 0) is unused.
+ // # 1 is reserved - table column 1 is for end-of-input
+ // # 2 is reserved - table column 2 is for beginning-in-input
+ // # 3 is the first range list.
+ //
RangeDescriptor *rlSearchRange;
for (rlRange = fRangeList; rlRange!=0; rlRange=rlRange->fNext) {
for (rlSearchRange=fRangeList; rlSearchRange != rlRange; rlSearchRange=rlSearchRange->fNext) {
@@ -232,12 +238,42 @@ void RBBISetBuilder::build() {
}
if (rlRange->fNum == 0) {
fGroupCount ++;
- rlRange->fNum = fGroupCount;
+ rlRange->fNum = fGroupCount+2;
rlRange->setDictionaryFlag();
- addValToSets(rlRange->fIncludesSets, fGroupCount);
+ addValToSets(rlRange->fIncludesSets, fGroupCount+2);
+ }
+ }
+
+ // Handle input sets that contain the special string {eof}.
+ // Column 1 of the state table is reserved for EOF on input.
+ // Column 2 is reserved for before-the-start-input.
+ // (This column can be optimized away later if there are no rule
+ // references to {bof}.)
+ // Add this column value (1 or 2) to the equivalent expression
+ // subtree for each UnicodeSet that contains the string {eof}
+ // Because {bof} and {eof} are not a characters in the normal sense,
+ // they doesn't affect the computation of ranges or TRIE.
+ static const UChar eofUString[] = {0x65, 0x6f, 0x66, 0};
+ static const UChar bofUString[] = {0x62, 0x6f, 0x66, 0};
+
+ UnicodeString eofString(eofUString);
+ UnicodeString bofString(bofUString);
+ for (ni=0; ; ni++) { // Loop over each of the UnicodeSets encountered in the input rules
+ usetNode = (RBBINode *)this->fRB->fUSetNodes->elementAt(ni);
+ if (usetNode==NULL) {
+ break;
+ }
+ UnicodeSet *inputSet = usetNode->fInputSet;
+ if (inputSet->contains(eofString)) {
+ addValToSet(usetNode, 1);
+ }
+ if (inputSet->contains(bofString)) {
+ addValToSet(usetNode, 2);
+ fSawBOF = TRUE;
}
}
+
if (fRB->fDebugEnv && uprv_strstr(fRB->fDebugEnv, "rgroup")) {printRangeGroups();}
if (fRB->fDebugEnv && uprv_strstr(fRB->fDebugEnv, "esets")) {printSets();}
@@ -296,7 +332,7 @@ void RBBISetBuilder::serializeTrie(uint8_t *where) {
//------------------------------------------------------------------------
//
// addValToSets Add a runtime-mapped input value to each uset from a
-// list of uset nodes.
+// list of uset nodes. (val corresponds to a state table column.)
// For each of the original Unicode sets - which correspond
// directly to uset nodes - a logically equivalent expression
// is constructed in terms of the remapped runtime input
@@ -312,38 +348,50 @@ void RBBISetBuilder::addValToSets(UVector *sets, uint32_t val) {
for (ix=0; ixsize(); ix++) {
RBBINode *usetNode = (RBBINode *)sets->elementAt(ix);
- RBBINode *leafNode = new RBBINode(RBBINode::leafChar);
- leafNode->fVal = (unsigned short)val;
- if (usetNode->fLeftChild == NULL) {
- usetNode->fLeftChild = leafNode;
- leafNode->fParent = usetNode;
- } else {
- // There are already input symbols present for this set.
- // Set up an OR node, with the previous stuff as the left child
- // and the new value as the right child.
- RBBINode *orNode = new RBBINode(RBBINode::opOr);
- orNode->fLeftChild = usetNode->fLeftChild;
- orNode->fRightChild = leafNode;
- orNode->fLeftChild->fParent = orNode;
- orNode->fRightChild->fParent = orNode;
- usetNode->fLeftChild = orNode;
- orNode->fParent = usetNode;
- }
+ addValToSet(usetNode, val);
}
}
+void RBBISetBuilder::addValToSet(RBBINode *usetNode, uint32_t val) {
+ RBBINode *leafNode = new RBBINode(RBBINode::leafChar);
+ leafNode->fVal = (unsigned short)val;
+ if (usetNode->fLeftChild == NULL) {
+ usetNode->fLeftChild = leafNode;
+ leafNode->fParent = usetNode;
+ } else {
+ // There are already input symbols present for this set.
+ // Set up an OR node, with the previous stuff as the left child
+ // and the new value as the right child.
+ RBBINode *orNode = new RBBINode(RBBINode::opOr);
+ orNode->fLeftChild = usetNode->fLeftChild;
+ orNode->fRightChild = leafNode;
+ orNode->fLeftChild->fParent = orNode;
+ orNode->fRightChild->fParent = orNode;
+ usetNode->fLeftChild = orNode;
+ orNode->fParent = usetNode;
+ }
+}
//------------------------------------------------------------------------
//
-// getNumOutputSets
+// getNumCharCategories
//
//------------------------------------------------------------------------
int32_t RBBISetBuilder::getNumCharCategories() const {
- return fGroupCount + 1;
+ return fGroupCount + 3;
}
+//------------------------------------------------------------------------
+//
+// sawBOF
+//
+//------------------------------------------------------------------------
+UBool RBBISetBuilder::sawBOF() const {
+ return fSawBOF;
+}
+
//------------------------------------------------------------------------
//
@@ -462,7 +510,7 @@ void RBBISetBuilder::printSets() {
RBBIDebugPrintf("\n\nUnicode Sets List\n------------------\n");
for (i=0; ; i++) {
- RBBINode *usetNode;
+ RBBINode *usetNode;
RBBINode *setRef;
RBBINode *varRef;
UnicodeString setName;
diff --git a/icuSources/common/rbbisetb.h b/icuSources/common/rbbisetb.h
index 17544f54..c8bc1df7 100644
--- a/icuSources/common/rbbisetb.h
+++ b/icuSources/common/rbbisetb.h
@@ -2,7 +2,7 @@
// rbbisetb.h
/*
**********************************************************************
-* Copyright (c) 2001-2004, International Business Machines
+* Copyright (c) 2001-2005, International Business Machines
* Corporation and others. All Rights Reserved.
**********************************************************************
*/
@@ -79,13 +79,16 @@ public:
~RBBISetBuilder();
void build();
- void addValToSets(UVector *sets, uint32_t val);
+ void addValToSets(UVector *sets, uint32_t val);
+ void addValToSet (RBBINode *usetNode, uint32_t val);
int32_t getNumCharCategories() const; // CharCategories are the same as input symbol set to the
- // runtime state machine, which are the same as
- // columns in the DFA state table
+ // runtime state machine, which are the same as
+ // columns in the DFA state table
int32_t getTrieSize() /*const*/; // Size in bytes of the serialized Trie.
void serializeTrie(uint8_t *where); // write out the serialized Trie.
UChar32 getFirstChar(int32_t val) const;
+ UBool sawBOF() const; // Indicate whether any references to the {bof} pseudo
+ // character were encountered.
#ifdef RBBI_DEBUG
void printSets();
void printRanges();
@@ -110,10 +113,13 @@ private:
// Groups correspond to character categories -
// groups of ranges that are in the same original UnicodeSets.
// fGroupCount is the index of the last used group.
- // The value is also the number of columns in the RBBI state table being compiled.
- // Index 0 is not used. Funny counting.
+ // fGroupCount+1 is also the number of columns in the RBBI state table being compiled.
+ // State table column 0 is not used. Column 1 is for end-of-input.
+ // column 2 is for group 0. Funny counting.
int32_t fGroupCount;
+ UBool fSawBOF;
+
RBBISetBuilder(const RBBISetBuilder &other); // forbid copying of this class
RBBISetBuilder &operator=(const RBBISetBuilder &other); // forbid copying of this class
};
diff --git a/icuSources/common/rbbistbl.cpp b/icuSources/common/rbbistbl.cpp
index f8aae326..771eb313 100644
--- a/icuSources/common/rbbistbl.cpp
+++ b/icuSources/common/rbbistbl.cpp
@@ -3,7 +3,7 @@
//
/*
***************************************************************************
-* Copyright (C) 2002-2004 International Business Machines Corporation *
+* Copyright (C) 2002-2005 International Business Machines Corporation *
* and others. All rights reserved. *
***************************************************************************
*/
@@ -28,7 +28,7 @@
// when the hash table is deleted.
//
U_CDECL_BEGIN
-static void U_EXPORT2 U_CALLCONV RBBISymbolTableEntry_deleter(void *p) {
+static void U_CALLCONV RBBISymbolTableEntry_deleter(void *p) {
RBBISymbolTableEntry *px = (RBBISymbolTableEntry *)p;
delete px;
}
@@ -44,7 +44,7 @@ RBBISymbolTable::RBBISymbolTable(RBBIRuleScanner *rs, const UnicodeString &rules
fHashTable = NULL;
fCachedSetLookup = NULL;
- fHashTable = uhash_open(uhash_hashUnicodeString, uhash_compareUnicodeString, &status);
+ fHashTable = uhash_open(uhash_hashUnicodeString, uhash_compareUnicodeString, NULL, &status);
// uhash_open checks status
if (U_FAILURE(status)) {
return;
diff --git a/icuSources/common/rbbitblb.cpp b/icuSources/common/rbbitblb.cpp
index b979c92a..6bc60c2d 100644
--- a/icuSources/common/rbbitblb.cpp
+++ b/icuSources/common/rbbitblb.cpp
@@ -1,13 +1,13 @@
-//
-// rbbitblb.cpp
-//
-
/*
**********************************************************************
-* Copyright (c) 2002-2004, International Business Machines
+* Copyright (c) 2002-2006, International Business Machines
* Corporation and others. All Rights Reserved.
**********************************************************************
*/
+//
+// rbbitblb.cpp
+//
+
#include "unicode/utypes.h"
@@ -20,6 +20,7 @@
#include "rbbidata.h"
#include "cstring.h"
#include "uassert.h"
+#include "cmemory.h"
U_NAMESPACE_BEGIN
@@ -75,10 +76,28 @@ void RBBITableBuilder::build() {
// parse tree for the substition expression.
//
fTree = fTree->flattenVariables();
+#ifdef RBBI_DEBUG
if (fRB->fDebugEnv && uprv_strstr(fRB->fDebugEnv, "ftree")) {
RBBIDebugPuts("Parse tree after flattening variable references.");
fTree->printTree(TRUE);
}
+#endif
+
+ //
+ // If the rules contained any references to {bof}
+ // add a {bof} to the
+ // tree. Means that all matches must start out with the
+ // {bof} fake character.
+ //
+ if (fRB->fSetBuilder->sawBOF()) {
+ RBBINode *bofTop = new RBBINode(RBBINode::opCat);
+ RBBINode *bofLeaf = new RBBINode(RBBINode::leafChar);
+ bofTop->fLeftChild = bofLeaf;
+ bofTop->fRightChild = fTree;
+ bofLeaf->fParent = bofTop;
+ bofLeaf->fVal = 2; // Reserved value for {bof}.
+ fTree = bofTop;
+ }
//
// Add a unique right-end marker to the expression.
@@ -97,10 +116,12 @@ void RBBITableBuilder::build() {
// expression.
//
fTree->flattenSets();
+#ifdef RBBI_DEBUG
if (fRB->fDebugEnv && uprv_strstr(fRB->fDebugEnv, "stree")) {
RBBIDebugPuts("Parse tree after flattening Unicode Set references.");
fTree->printTree(TRUE);
}
+#endif
//
@@ -126,6 +147,13 @@ void RBBITableBuilder::build() {
calcChainedFollowPos(fTree);
}
+ //
+ // BOF (start of input) test fixup.
+ //
+ if (fRB->fSetBuilder->sawBOF()) {
+ bofFixup();
+ }
+
//
// Build the DFA state transition tables.
//
@@ -207,6 +235,9 @@ void RBBITableBuilder::calcFirstPos(RBBINode *n) {
n->fType == RBBINode::lookAhead ||
n->fType == RBBINode::tag) {
// These are non-empty leaf node types.
+ // Note: In order to maintain the sort invariant on the set,
+ // this function should only be called on a node whose set is
+ // empty to start with.
n->fFirstPosSet->addElement(n, *fStatus);
return;
}
@@ -250,6 +281,9 @@ void RBBITableBuilder::calcLastPos(RBBINode *n) {
n->fType == RBBINode::lookAhead ||
n->fType == RBBINode::tag) {
// These are non-empty leaf node types.
+ // Note: In order to maintain the sort invariant on the set,
+ // this function should only be called on a node whose set is
+ // empty to start with.
n->fLastPosSet->addElement(n, *fStatus);
return;
}
@@ -343,14 +377,21 @@ void RBBITableBuilder::calcChainedFollowPos(RBBINode *tree) {
// get a list of all endmarker nodes.
tree->findNodes(&endMarkerNodes, RBBINode::endMark, *fStatus);
- // get a list all leaf nodes
+ // get a list all leaf nodes
tree->findNodes(&leafNodes, RBBINode::leafChar, *fStatus);
if (U_FAILURE(*fStatus)) {
return;
}
- // Get all nodes that can be the start a match, which is FirstPosition(root)
- UVector *matchStartNodes = tree->fFirstPosSet;
+ // Get all nodes that can be the start a match, which is FirstPosition()
+ // of the portion of the tree corresponding to user-written rules.
+ // See the tree description in bofFixup().
+ RBBINode *userRuleRoot = tree;
+ if (fRB->fSetBuilder->sawBOF()) {
+ userRuleRoot = tree->fLeftChild->fRightChild;
+ }
+ U_ASSERT(userRuleRoot != NULL);
+ UVector *matchStartNodes = userRuleRoot->fFirstPosSet;
// Iteratate over all leaf nodes,
@@ -383,10 +424,12 @@ void RBBITableBuilder::calcChainedFollowPos(RBBINode *tree) {
// into the rule file.
if (fRB->fLBCMNoChain) {
UChar32 c = this->fRB->fSetBuilder->getFirstChar(endNode->fVal);
- U_ASSERT(c != -1);
- ULineBreak cLBProp = (ULineBreak)u_getIntPropertyValue(c, UCHAR_LINE_BREAK);
- if (cLBProp == U_LB_COMBINING_MARK) {
- continue;
+ if (c != -1) {
+ // c == -1 occurs with sets containing only the {eof} marker string.
+ ULineBreak cLBProp = (ULineBreak)u_getIntPropertyValue(c, UCHAR_LINE_BREAK);
+ if (cLBProp == U_LB_COMBINING_MARK) {
+ continue;
+ }
}
}
@@ -415,6 +458,62 @@ void RBBITableBuilder::calcChainedFollowPos(RBBINode *tree) {
}
+//-----------------------------------------------------------------------------
+//
+// bofFixup. Fixup for state tables that include {bof} beginning of input testing.
+// Do an swizzle similar to chaining, modifying the followPos set of
+// the bofNode to include the followPos nodes from other {bot} nodes
+// scattered through the tree.
+//
+// This function has much in common with calcChainedFollowPos().
+//
+//-----------------------------------------------------------------------------
+void RBBITableBuilder::bofFixup() {
+
+ if (U_FAILURE(*fStatus)) {
+ return;
+ }
+
+ // The parse tree looks like this ...
+ // fTree root --->
+ // / \ .
+ // <#end node>
+ // / \ .
+ // rest
+ // of tree
+ //
+ // We will be adding things to the followPos set of the
+ //
+ RBBINode *bofNode = fTree->fLeftChild->fLeftChild;
+ U_ASSERT(bofNode->fType == RBBINode::leafChar);
+ U_ASSERT(bofNode->fVal == 2);
+
+ // Get all nodes that can be the start a match of the user-written rules
+ // (excluding the fake bofNode)
+ // We want the nodes that can start a match in the
+ // part labeled "rest of tree"
+ //
+ UVector *matchStartNodes = fTree->fLeftChild->fRightChild->fFirstPosSet;
+
+ RBBINode *startNode;
+ int startNodeIx;
+ for (startNodeIx = 0; startNodeIxsize(); startNodeIx++) {
+ startNode = (RBBINode *)matchStartNodes->elementAt(startNodeIx);
+ if (startNode->fType != RBBINode::leafChar) {
+ continue;
+ }
+
+ if (startNode->fVal == bofNode->fVal) {
+ // We found a leaf node corresponding to a {bof} that was
+ // explicitly written into a rule.
+ // Add everything from the followPos set of this node to the
+ // followPos set of the fake bofNode at the start of the tree.
+ //
+ setAdd(bofNode->fFollowPos, startNode->fFollowPos);
+ }
+ }
+}
+
//-----------------------------------------------------------------------------
//
// buildStateTable() Determine the set of runtime DFA states and the
@@ -572,14 +671,29 @@ void RBBITableBuilder::flagAcceptingStates() {
// Any non-zero value for fAccepting means this is an accepting node.
// The value is what will be returned to the user as the break status.
// If no other value was specified, force it to -1.
- sd->fAccepting = endMarker->fVal;
- if (sd->fAccepting == 0) {
- sd->fAccepting = -1;
+
+ if (sd->fAccepting==0) {
+ // State hasn't been marked as accepting yet. Do it now.
+ sd->fAccepting = endMarker->fVal;
+ if (sd->fAccepting == 0) {
+ sd->fAccepting = -1;
+ }
+ }
+ if (sd->fAccepting==-1 && endMarker->fVal != 0) {
+ // Both lookahead and non-lookahead accepting for this state.
+ // Favor the look-ahead. Expedient for line break.
+ // TODO: need a more elegant resolution for conflicting rules.
+ sd->fAccepting = endMarker->fVal;
}
+ // implicit else:
+ // if sd->fAccepting already had a value other than 0 or -1, leave it be.
// If the end marker node is from a look-ahead rule, set
// the fLookAhead field or this state also.
if (endMarker->fLookAheadEnd) {
+ // TODO: don't change value if already set?
+ // TODO: allow for more than one active look-ahead rule in engine.
+ // Make value here an index to a side array in engine?
sd->fLookAhead = sd->fAccepting;
}
}
@@ -644,7 +758,7 @@ void RBBITableBuilder::flagTaggedStates() {
}
for (i=0; isize(); n++) { // For each state s (row in the state table)
RBBIStateDescriptor *sd = (RBBIStateDescriptor *)fDStates->elementAt(n);
if (sd->fPositions->indexOf(tagNode) >= 0) { // if s include the tag node t
@@ -686,9 +800,9 @@ void RBBITableBuilder::mergeRuleStatusVals() {
fRB->fRuleStatusVals->addElement(1, *fStatus); // Num of statuses in group
fRB->fRuleStatusVals->addElement((int32_t)0, *fStatus); // and our single status of zero
}
-
- // For each state
- for (n=0; nsize(); n++) {
+
+ // For each state
+ for (n=0; nsize(); n++) {
RBBIStateDescriptor *sd = (RBBIStateDescriptor *)fDStates->elementAt(n);
UVector *thisStatesTagValues = sd->fTagVals;
if (thisStatesTagValues == NULL) {
@@ -704,7 +818,7 @@ void RBBITableBuilder::mergeRuleStatusVals() {
sd->fTagsIdx = -1;
int32_t thisTagGroupStart = 0; // indexes into the global rule status vals list
int32_t nextTagGroupStart = 0;
-
+
// Loop runs once per group of tags in the global list
while (nextTagGroupStart < fRB->fRuleStatusVals->size()) {
thisTagGroupStart = nextTagGroupStart;
@@ -718,21 +832,21 @@ void RBBITableBuilder::mergeRuleStatusVals() {
// The lengths match, go ahead and compare the actual tag values
// between this state and the group from the global list.
for (i=0; isize(); i++) {
- if (thisStatesTagValues->elementAti(i) !=
+ if (thisStatesTagValues->elementAti(i) !=
fRB->fRuleStatusVals->elementAti(thisTagGroupStart + 1 + i) ) {
- // Mismatch.
+ // Mismatch.
break;
}
}
-
+
if (i == thisStatesTagValues->size()) {
// We found a set of tag values in the global list that match
// those for this state. Use them.
sd->fTagsIdx = thisTagGroupStart;
- break;
+ break;
}
}
-
+
if (sd->fTagsIdx == -1) {
// No suitable entry in the global tag list already. Add one
sd->fTagsIdx = fRB->fRuleStatusVals->size();
@@ -788,23 +902,78 @@ void RBBITableBuilder::sortedAdd(UVector **vector, int32_t val) {
//
// setAdd Set operation on UVector
// dest = dest union source
-// Elements may only appear once. Order is unimportant.
+// Elements may only appear once and must be sorted.
//
//-----------------------------------------------------------------------------
void RBBITableBuilder::setAdd(UVector *dest, UVector *source) {
int destOriginalSize = dest->size();
int sourceSize = source->size();
- int32_t si, di;
+ int32_t di = 0;
+ void *(destS[16]), *(sourceS[16]); // Handle small cases without malloc
+ void **destH = 0, **sourceH = 0;
+ void **destBuff, **sourceBuff;
+ void **destLim, **sourceLim;
- for (si=0; sielementAt(si);
- for (di=0; dielementAt(di) == elToAdd) {
- goto elementAlreadyInDest;
- }
+ if (destOriginalSize > sizeof(destS)/sizeof(destS[0])) {
+ destH = (void **)uprv_malloc(sizeof(void *) * destOriginalSize);
+ destBuff = destH;
+ }
+ else {
+ destBuff = destS;
+ }
+ if (destBuff == 0) {
+ return;
+ }
+ destLim = destBuff + destOriginalSize;
+
+ if (sourceSize > sizeof(sourceS)/sizeof(sourceS[0])) {
+ sourceH = (void **)uprv_malloc(sizeof(void *) * sourceSize);
+ sourceBuff = sourceH;
+ }
+ else {
+ sourceBuff = sourceS;
+ }
+ if (sourceBuff == 0) {
+ if (destH) {
+ uprv_free(destH);
+ }
+ return;
+ }
+ sourceLim = sourceBuff + sourceSize;
+
+ // Avoid multiple "get element" calls by getting the contents into arrays
+ (void) dest->toArray(destBuff);
+ (void) source->toArray(sourceBuff);
+
+ dest->setSize(sourceSize+destOriginalSize);
+
+ while (sourceBuff < sourceLim && destBuff < destLim) {
+ if (*destBuff < *sourceBuff) {
+ dest->setElementAt(*destBuff++, di++);
+ }
+ else if (*sourceBuff < *destBuff) {
+ dest->setElementAt(*sourceBuff++, di++);
+ }
+ else {
+ dest->setElementAt(*sourceBuff++, di++);
+ destBuff++;
}
- dest->addElement(elToAdd, *fStatus);
- elementAlreadyInDest: ;
+ }
+
+ // At most one of these two cleanup loops will execute
+ while (destBuff < destLim) {
+ dest->setElementAt(*destBuff++, di++);
+ }
+ while (sourceBuff < sourceLim) {
+ dest->setElementAt(*sourceBuff++, di++);
+ }
+
+ dest->setSize(di);
+ if (destH) {
+ uprv_free(destH);
+ }
+ if (sourceH) {
+ uprv_free(sourceH);
}
}
@@ -814,40 +983,11 @@ void RBBITableBuilder::setAdd(UVector *dest, UVector *source) {
//
// setEqual Set operation on UVector.
// Compare for equality.
-// Elements may appear only once.
-// Elements may appear in any order.
+// Elements must be sorted.
//
//-----------------------------------------------------------------------------
UBool RBBITableBuilder::setEquals(UVector *a, UVector *b) {
- int32_t aSize = a->size();
- int32_t bSize = b->size();
-
- if (aSize != bSize) {
- return FALSE;
- }
-
- int32_t ax;
- int32_t bx;
- int32_t firstBx = 0;
- void *aVal;
- void *bVal = NULL;
-
- for (ax=0; axelementAt(ax);
- for (bx=firstBx; bxelementAt(bx);
- if (aVal == bVal) {
- if (bx==firstBx) {
- firstBx++;
- }
- break;
- }
- }
- if (aVal != bVal) {
- return FALSE;
- }
- }
- return TRUE;
+ return a->equals(*b);
}
@@ -941,6 +1081,9 @@ void RBBITableBuilder::exportTable(void *where) {
if (fRB->fLookAheadHardBreak) {
table->fFlags |= RBBI_LOOKAHEAD_HARD_BREAK;
}
+ if (fRB->fSetBuilder->sawBOF()) {
+ table->fFlags |= RBBI_BOF_REQUIRED;
+ }
table->fReserved = 0;
for (state=0; statefNumStates; state++) {
@@ -1027,7 +1170,7 @@ void RBBITableBuilder::printRuleStatusTable() {
RBBIDebugPrintf("index | tags \n");
RBBIDebugPrintf("-------------------\n");
-
+
while (nextRecord < tbl->size()) {
thisRecord = nextRecord;
nextRecord = thisRecord + tbl->elementAti(thisRecord) + 1;
@@ -1057,7 +1200,7 @@ RBBIStateDescriptor::RBBIStateDescriptor(int lastInputSymbol, UErrorCode *fStatu
fTagVals = NULL;
fPositions = NULL;
fDtran = NULL;
-
+
fDtran = new UVector(lastInputSymbol+1, *fStatus);
if (U_FAILURE(*fStatus)) {
return;
diff --git a/icuSources/common/rbbitblb.h b/icuSources/common/rbbitblb.h
index e4a2b890..3805b675 100644
--- a/icuSources/common/rbbitblb.h
+++ b/icuSources/common/rbbitblb.h
@@ -4,7 +4,7 @@
/*
**********************************************************************
-* Copyright (c) 2002-2004, International Business Machines
+* Copyright (c) 2002-2005, International Business Machines
* Corporation and others. All Rights Reserved.
**********************************************************************
*/
@@ -51,6 +51,7 @@ private:
void calcLastPos(RBBINode *n);
void calcFollowPos(RBBINode *n);
void calcChainedFollowPos(RBBINode *n);
+ void bofFixup();
void buildStateTable();
void flagAcceptingStates();
void flagLookAheadStates();
diff --git a/icuSources/common/rbtok.cpp b/icuSources/common/rbtok.cpp
new file mode 100644
index 00000000..311afd2d
--- /dev/null
+++ b/icuSources/common/rbtok.cpp
@@ -0,0 +1,254 @@
+/*
+***************************************************************************
+* Copyright (C) 2006 Apple Computer, Inc. All rights reserved. *
+***************************************************************************
+
+*/
+
+#include "unicode/utypes.h"
+
+#if !UCONFIG_NO_BREAK_ITERATION
+
+#include "rbtok.h"
+#include "unicode/ustring.h"
+#include "unicode/utext.h"
+#include "rbbidata.h"
+
+U_NAMESPACE_BEGIN
+
+
+#if defined(__GNUC__) && (__GNUC__ >= 4)
+#pragma GCC optimization_level 3
+#endif
+
+static const int16_t START_STATE = 1; // The state number of the starting state
+static const int16_t STOP_STATE = 0; // The state-transition value indicating "stop"
+
+int32_t RuleBasedTokenizer::tokenize(int32_t maxTokens, RuleBasedTokenRange *outTokenRanges, unsigned long *outTokenFlags)
+{
+ RuleBasedTokenRange *outTokenLimit = outTokenRanges + maxTokens;
+ RuleBasedTokenRange *outTokenP = outTokenRanges;
+ int32_t state;
+ int16_t category;
+
+ const RBBIStateTableRow *row;
+ const RBBIStateTableRow *const startRow = fStartRow;
+
+ int32_t lastAcceptingState = 0;
+ UChar32 c = 0;
+ signed long prev;
+ signed long result;
+ const char *const tableData = fData->fForwardTable->fTableData;
+ const uint32_t tableRowLen = fData->fForwardTable->fRowLen;
+ UText *text = fText;
+
+ #ifdef RBBI_DEBUG
+ if (fTrace) {
+ RBBIDebugPuts("Handle Next pos char state category");
+ }
+ #endif
+
+ fLastStatusIndexValid = FALSE;
+
+ // if we're already at the end of the text, return DONE.
+ prev = (signed long)UTEXT_GETNATIVEINDEX(text);
+
+ // loop until we reach the end of the text or transition to state 0
+ //
+ const UTrie *trie = &fData->fTrie;
+ while (outTokenP < outTokenLimit) {
+ c = UTEXT_NEXT32(text);
+ if (c == U_SENTINEL)
+ {
+ goto exitTokenizer;
+ }
+ // Set the initial state for the state machine
+ state = START_STATE;
+ row = startRow;
+
+ // if we have cached break positions and we're still in the range
+ // covered by them, just move one step forward in the cache
+ if (fCachedBreakPositions != NULL) {
+ if (fPositionInCache < fNumCachedBreakPositions - 1) {
+ ++fPositionInCache;
+ result = fCachedBreakPositions[fPositionInCache];
+ goto emitToken;
+ }
+ else {
+ reset();
+ }
+ }
+
+ while (c != U_SENTINEL) {
+ //
+ // Get the char category. An incoming category of 1 or 2 means that
+ // we are preset for doing the beginning or end of input, and
+ // that we shouldn't get a category from an actual text input character.
+ //
+ // look up the current character's character category, which tells us
+ // which column in the state table to look at.
+ // Note: the 16 in UTRIE_GET16 refers to the size of the data being returned,
+ // not the size of the character going in, which is a UChar32.
+ //
+ if (__builtin_expect((c < 0x100), 1))
+ category = fLatin1Cat[c];
+ else
+ UTRIE_GET16(trie, c, category);
+
+ // Check the dictionary bit in the character's category.
+ // Counter is only used by dictionary based iterators (subclasses).
+ // Chars that need to be handled by a dictionary have a flag bit set
+ // in their category values.
+ //
+ if (__builtin_expect((category & 0x4000) != 0, 0)) {
+ fDictionaryCharCount++;
+ // And off the dictionary flag bit.
+ category &= ~0x4000;
+ }
+
+ #ifdef RBBI_DEBUG
+ if (fTrace) {
+ RBBIDebugPrintf(" %4d ", utext_getNativeIndex(fText));
+ if (0x20<=c && c<0x7f) {
+ RBBIDebugPrintf("\"%c\" ", c);
+ } else {
+ RBBIDebugPrintf("%5x ", c);
+ }
+ RBBIDebugPrintf("%3d %3d\n", state, category);
+ }
+ #endif
+
+ // State Transition - move machine to its next state
+ //
+ state = row->fNextState[category];
+ row = (const RBBIStateTableRow *) (tableData + tableRowLen * state);
+
+ if (row->fAccepting == -1) {
+ // Match found, common case.
+ result = (signed long)UTEXT_GETNATIVEINDEX(text);
+ //fLastRuleStatusIndex = row->fTagIdx; // Remember the break status (tag) values.
+ //lastStatusRow = row;
+ lastAcceptingState = state;
+ }
+
+ if (state == STOP_STATE) {
+ // This is the normal exit from the lookup state machine.
+ // We have advanced through the string until it is certain that no
+ // longer match is possible, no matter what characters follow.
+ break;
+ }
+
+ // Advance to the next character.
+ // If this is a beginning-of-input loop iteration, don't advance
+ // the input position. The next iteration will be processing the
+ // first real input character.
+ c = UTEXT_NEXT32(text);
+ }
+
+ if (fDictionaryCharCount > 0) {
+ result = (signed long) checkDictionary(prev, (int32_t) result, FALSE);
+ }
+
+emitToken:
+ // The state machine is done. Check whether it found a match...
+
+ // Leave the iterator at our result position.
+ UTEXT_SETNATIVEINDEX(text, result);
+
+ RuleBasedTokenRange range = {(signed long)prev, (signed long) (result-prev)};
+ int32_t flags = fStateFlags[lastAcceptingState];
+
+ if (flags == -1)
+ goto skipToken;
+
+ *outTokenP++ = range;
+ if (outTokenFlags)
+ {
+ *outTokenFlags++ = (unsigned long) flags;
+ }
+
+ if (flags & 0x40000000)
+ goto exitTokenizer;
+
+skipToken:
+ prev = result;
+ }
+
+exitTokenizer:
+ return (outTokenP - outTokenRanges);
+}
+
+#if defined (__GNUC__) && (__GNUC__ >= 4)
+#pragma GCC optimization_level reset
+#endif
+
+void
+RuleBasedTokenizer::init()
+{
+ const RBBIStateTable *statetable = fData->fForwardTable;
+ setBreakType(UBRK_WORD);
+ fStartRow = (const RBBIStateTableRow *)
+ (statetable->fTableData + (statetable->fRowLen * START_STATE));
+ UChar i;
+ const UTrie *trie = &fData->fTrie;
+ int16_t category;
+ fLatin1Cat = new int16_t[256];
+ for (i = 0; i < 256; ++i)
+ {
+ //UTRIE_GET16(trie, i, category);
+ //fLatin1Cat[i] = category;
+ fLatin1Cat[i] = _UTRIE_GET_RAW(trie, index, 0, i);
+ }
+ fStateFlags = new int32_t[statetable->fNumStates];
+ for (i = 0; i < statetable->fNumStates; ++i)
+ {
+ const RBBIStateTableRow *row = (const RBBIStateTableRow *)
+ (statetable->fTableData + (statetable->fRowLen * i));
+ int32_t flags = 0;
+ if (row->fAccepting == -1)
+ {
+ const int32_t *vals = (fData->fRuleStatusTable) + (row->fTagIdx);
+ const int32_t *valLimit = vals + 1;
+ valLimit += *vals++;
+ while (vals < valLimit)
+ {
+ int32_t val = *vals++;
+ if (val == 0)
+ {
+ break;
+ }
+ else if (val > 0)
+ {
+ flags |= val;
+ }
+ else
+ {
+ flags = val;
+ break;
+ }
+ }
+ }
+ fStateFlags[i] = flags;
+ }
+}
+
+RuleBasedTokenizer::RuleBasedTokenizer(const UnicodeString &rules, UParseError &parseErr, UErrorCode &err)
+ : RuleBasedBreakIterator(rules, parseErr, err)
+{
+ init();
+}
+
+RuleBasedTokenizer::RuleBasedTokenizer(uint8_t *data, UErrorCode &status)
+ : RuleBasedBreakIterator((RBBIDataHeader *)data, status)
+{
+ init();
+}
+
+RuleBasedTokenizer::~RuleBasedTokenizer() {
+ delete [] fStateFlags;
+ delete [] fLatin1Cat;
+}
+
+U_NAMESPACE_END
+
+#endif /* #if !UCONFIG_NO_BREAK_ITERATION */
diff --git a/icuSources/common/rbtok.h b/icuSources/common/rbtok.h
new file mode 100644
index 00000000..15bb072d
--- /dev/null
+++ b/icuSources/common/rbtok.h
@@ -0,0 +1,110 @@
+/*
+***************************************************************************
+* Copyright (C) 2006 Apple Computer, Inc. All rights reserved. *
+***************************************************************************
+
+*/
+
+#ifndef RBTOK_H
+#define RBTOK_H
+
+#include "unicode/utypes.h"
+
+/**
+ * \file
+ * \brief C++ API: Rule Based Tokenizer
+ */
+
+#if !UCONFIG_NO_BREAK_ITERATION
+
+#include "unicode/urbtok.h"
+#include "unicode/rbbi.h"
+#include "unicode/parseerr.h"
+
+
+U_NAMESPACE_BEGIN
+
+/** @internal */
+struct RBBIDataHeader;
+struct RBBIStateTableRow;
+
+
+/**
+ *
+ * A subclass of RuleBasedBreakIterator that adds tokenization functionality.
+
+ * This class is for internal use only by Apple Computer, Inc.
+ *
+ */
+class U_COMMON_API RuleBasedTokenizer : public RuleBasedBreakIterator {
+
+private:
+ /**
+ * The row corresponding to the start state
+ * @internal
+ */
+ const RBBIStateTableRow *fStartRow;
+
+ /**
+ * The merged flag results for accepting states
+ * @internal
+ */
+ int32_t *fStateFlags;
+
+ /**
+ * Character categories for the Latin1 subset of Unicode
+ * @internal
+ */
+ int16_t *fLatin1Cat;
+
+public:
+ /**
+ * Construct a RuleBasedTokenizer from a set of rules supplied as a string.
+ * @param rules The break rules to be used.
+ * @param parseError In the event of a syntax error in the rules, provides the location
+ * within the rules of the problem.
+ * @param status Information on any errors encountered.
+ * @internal
+ */
+ RuleBasedTokenizer(const UnicodeString &rules, UParseError &parseErr, UErrorCode &status);
+
+ /**
+ * Constructor from a flattened set of RBBI data in uprv_malloc'd memory.
+ * RulesBasedBreakIterators built from a custom set of rules
+ * are created via this constructor; the rules are compiled
+ * into memory, then the break iterator is constructed here.
+ *
+ * The break iterator adopts the memory, and will
+ * free it when done.
+ * @internal
+ */
+ RuleBasedTokenizer(uint8_t *data, UErrorCode &status);
+
+ /**
+ * Destructor
+ * @internal
+ */
+ virtual ~RuleBasedTokenizer();
+
+ /**
+ * Fetch the next set of tokens.
+ * @param maxTokens The maximum number of tokens to return.
+ * @param outTokenRanges Pointer to output array of token ranges.
+ * @param outTokenFlags (optional) pointer to output array of token flags.
+ * @internal
+ */
+ int32_t tokenize(int32_t maxTokens, RuleBasedTokenRange *outTokenRanges, unsigned long *outTokenFlags);
+
+private:
+ /**
+ * Common initialization function, used by constructors.
+ * @internal
+ */
+ void init();
+};
+
+U_NAMESPACE_END
+
+#endif /* #if !UCONFIG_NO_BREAK_ITERATION */
+
+#endif
diff --git a/icuSources/common/resbund_cnv.cpp b/icuSources/common/resbund_cnv.cpp
index b7eddbf3..a18e57e3 100644
--- a/icuSources/common/resbund_cnv.cpp
+++ b/icuSources/common/resbund_cnv.cpp
@@ -1,7 +1,7 @@
/*
*******************************************************************************
*
-* Copyright (C) 1997-2004, International Business Machines
+* Copyright (C) 1997-2006, International Business Machines
* Corporation and others. All Rights Reserved.
*
*******************************************************************************
@@ -42,30 +42,13 @@ ResourceBundle::constructForLocale(const UnicodeString& path,
const Locale& locale,
UErrorCode& error)
{
- char name[300];
-
- if(path.length() >= (int32_t)sizeof(name)) {
- fResource = NULL;
- error = U_ILLEGAL_ARGUMENT_ERROR;
- } else if(!path.isEmpty()) {
- if(uprv_isInvariantUString(path.getBuffer(), path.length())) {
- // the invariant converter is sufficient for package and tree names
- // and is more efficient
- path.extract(0, INT32_MAX, name, (int32_t)sizeof(name), US_INV);
- } else {
-#if !UCONFIG_NO_CONVERSION
- // use the default converter to support variant-character paths
- path.extract(name, sizeof(name), 0, error);
-#else
- // the default converter is not available
- fResource = NULL;
- error = U_UNSUPPORTED_ERROR;
- return;
-#endif
- }
- fResource = ures_open(name, locale.getName(), &error);
- } else {
- fResource = ures_open(0, locale.getName(), &error);
+ if (path.isEmpty()) {
+ fResource = ures_open(NULL, locale.getName(), &error);
+ }
+ else {
+ UnicodeString nullTerminatedPath(path);
+ nullTerminatedPath.append((UChar)0);
+ fResource = ures_openU(nullTerminatedPath.getBuffer(), locale.getName(), &error);
}
}
diff --git a/icuSources/common/ruleiter.cpp b/icuSources/common/ruleiter.cpp
index 7a084aa6..30f136c0 100644
--- a/icuSources/common/ruleiter.cpp
+++ b/icuSources/common/ruleiter.cpp
@@ -1,6 +1,6 @@
/*
**********************************************************************
-* Copyright (c) 2003-2004, International Business Machines
+* Copyright (c) 2003-2005, International Business Machines
* Corporation and others. All Rights Reserved.
**********************************************************************
* Author: Alan Liu
@@ -117,11 +117,13 @@ void RuleCharacterIterator::jumpahead(int32_t count) {
_advance(count);
}
+/*
UnicodeString& RuleCharacterIterator::toString(UnicodeString& result) const {
int32_t b = pos.getIndex();
text.extract(0, b, result);
- return result.append((UChar) 0x7C /*'|'*/).append(text, b, 0x7FFFFFFF);
+ return result.append((UChar) 0x7C).append(text, b, 0x7FFFFFFF); // Insert '|' at index
}
+*/
UChar32 RuleCharacterIterator::_current() const {
if (buf != 0) {
diff --git a/icuSources/common/ruleiter.h b/icuSources/common/ruleiter.h
index 736b54ed..5c86020b 100644
--- a/icuSources/common/ruleiter.h
+++ b/icuSources/common/ruleiter.h
@@ -1,6 +1,6 @@
/*
**********************************************************************
-* Copyright (c) 2003, International Business Machines
+* Copyright (c) 2003-2006, International Business Machines
* Corporation and others. All Rights Reserved.
**********************************************************************
* Author: Alan Liu
@@ -11,7 +11,7 @@
#ifndef _RULEITER_H_
#define _RULEITER_H_
-#include "unicode/utypes.h"
+#include "unicode/uobject.h"
U_NAMESPACE_BEGIN
@@ -26,7 +26,7 @@ class SymbolTable;
* @author Alan Liu
* @since ICU 2.8
*/
-class U_COMMON_API RuleCharacterIterator {
+class RuleCharacterIterator : public UMemory {
// TODO: Ideas for later. (Do not implement if not needed, lest the
// code coverage numbers go down due to unused methods.)
@@ -131,7 +131,7 @@ public:
/**
* An opaque object representing the position of a RuleCharacterIterator.
*/
- struct Pos {
+ struct Pos : public UMemory {
private:
const UnicodeString* buf;
int32_t pos;
@@ -204,7 +204,7 @@ public:
* @param result output parameter to receive a string
* representation of this object
*/
- UnicodeString& toString(UnicodeString& result) const;
+// UnicodeString& toString(UnicodeString& result) const;
private:
/**
diff --git a/icuSources/common/icuserv.cpp b/icuSources/common/serv.cpp
similarity index 99%
rename from icuSources/common/icuserv.cpp
rename to icuSources/common/serv.cpp
index 7bb15812..c00b9c8f 100644
--- a/icuSources/common/icuserv.cpp
+++ b/icuSources/common/serv.cpp
@@ -9,7 +9,7 @@
#if !UCONFIG_NO_SERVICE
-#include "icuserv.h"
+#include "serv.h"
#include "umutex.h"
#undef SERVICE_REFCOUNT
diff --git a/icuSources/common/icuserv.h b/icuSources/common/serv.h
similarity index 98%
rename from icuSources/common/icuserv.h
rename to icuSources/common/serv.h
index eeb4cbcc..72f0a9f4 100644
--- a/icuSources/common/icuserv.h
+++ b/icuSources/common/serv.h
@@ -1,6 +1,6 @@
/**
*******************************************************************************
- * Copyright (C) 2001-2004, International Business Machines Corporation. *
+ * Copyright (C) 2001-2006, International Business Machines Corporation. *
* All Rights Reserved. *
*******************************************************************************
*/
@@ -26,10 +26,11 @@ U_NAMESPACE_END
#include "unicode/unistr.h"
#include "unicode/locid.h"
+#include "unicode/umisc.h"
#include "hash.h"
#include "uvector.h"
-#include "icunotif.h"
+#include "servnotf.h"
class ICUServiceTest;
@@ -203,7 +204,7 @@ public:
*/
/**
- * ICUServiceFactories generate the service objects maintained by the
+ *
An implementing ICUServiceFactory generates the service objects maintained by the
* service. A factory generates a service object from a key,
* updates id->factory mappings, and returns the display name for
* a supported id.
@@ -251,9 +252,10 @@ class U_COMMON_API ICUServiceFactory : public UObject {
/**
* Return, in result, the display name of the id in the provided locale.
* This is an id, not a descriptor. If the id is
- * not visible or not defined by the factory, sets result to bogus. If the
+ * not visible, sets result to bogus. If the
* incoming result is bogus, it remains bogus. Result is returned as a
- * convenience.
+ * convenience. Results are not defined if id is not one supported by this
+ * factory.
*
* @param id a visible id supported by this factory.
* @param locale the locale for which to generate the corresponding localized display name.
@@ -310,7 +312,7 @@ class U_COMMON_API SimpleFactory : public ICUServiceFactory {
* @param status the error code status.
* @return the service object, or NULL if the factory does not support the key.
*/
- UObject* create(const ICUServiceKey& key, const ICUService* service, UErrorCode& status) const;
+ virtual UObject* create(const ICUServiceKey& key, const ICUService* service, UErrorCode& status) const;
/**
* This implementation adds a mapping from ID -> this to result if visible is TRUE,
@@ -319,7 +321,7 @@ class U_COMMON_API SimpleFactory : public ICUServiceFactory {
* @param result the mapping table to update.
* @param status the error code status.
*/
- void updateVisibleIDs(Hashtable& result, UErrorCode& status) const;
+ virtual void updateVisibleIDs(Hashtable& result, UErrorCode& status) const;
/**
*
This implementation returns the factory ID if it equals id and visible is TRUE,
@@ -331,9 +333,9 @@ class U_COMMON_API SimpleFactory : public ICUServiceFactory {
* @param result output parameter to hold the display name.
* @return result.
*/
- UnicodeString& getDisplayName(const UnicodeString& id, const Locale& locale, UnicodeString& result) const;
+ virtual UnicodeString& getDisplayName(const UnicodeString& id, const Locale& locale, UnicodeString& result) const;
- public:
+public:
/**
* UObject RTTI boilerplate.
*/
@@ -435,11 +437,6 @@ private:
U_CAPI void U_EXPORT2
userv_deleteStringPair(void *obj);
-/**
- * Opaque type returned by registerInstance and registerFactory.
- */
-typedef const void* URegistryKey;
-
/*******************************************************************
* ICUService
*/
diff --git a/icuSources/common/servlk.cpp b/icuSources/common/servlk.cpp
new file mode 100644
index 00000000..b6204148
--- /dev/null
+++ b/icuSources/common/servlk.cpp
@@ -0,0 +1,187 @@
+/**
+ *******************************************************************************
+ * Copyright (C) 2001-2004, International Business Machines Corporation and *
+ * others. All Rights Reserved. *
+ *******************************************************************************
+ *
+ *******************************************************************************
+ */
+#include "unicode/utypes.h"
+
+#if !UCONFIG_NO_SERVICE
+
+#include "unicode/resbund.h"
+#include "uresimp.h"
+#include "cmemory.h"
+#include "servloc.h"
+#include "ustrfmt.h"
+#include "uhash.h"
+#include "charstr.h"
+#include "ucln_cmn.h"
+#include "uassert.h"
+
+#define UNDERSCORE_CHAR ((UChar)0x005f)
+#define AT_SIGN_CHAR ((UChar)64)
+#define PERIOD_CHAR ((UChar)46)
+
+U_NAMESPACE_BEGIN
+
+LocaleKey*
+LocaleKey::createWithCanonicalFallback(const UnicodeString* primaryID,
+ const UnicodeString* canonicalFallbackID,
+ UErrorCode& status)
+{
+ return LocaleKey::createWithCanonicalFallback(primaryID, canonicalFallbackID, KIND_ANY, status);
+}
+
+LocaleKey*
+LocaleKey::createWithCanonicalFallback(const UnicodeString* primaryID,
+ const UnicodeString* canonicalFallbackID,
+ int32_t kind,
+ UErrorCode& status)
+{
+ if (primaryID == NULL || U_FAILURE(status)) {
+ return NULL;
+ }
+ UnicodeString canonicalPrimaryID;
+ LocaleUtility::canonicalLocaleString(primaryID, canonicalPrimaryID);
+ return new LocaleKey(*primaryID, canonicalPrimaryID, canonicalFallbackID, kind);
+}
+
+LocaleKey::LocaleKey(const UnicodeString& primaryID,
+ const UnicodeString& canonicalPrimaryID,
+ const UnicodeString* canonicalFallbackID,
+ int32_t kind)
+ : ICUServiceKey(primaryID)
+ , _kind(kind)
+ , _primaryID(canonicalPrimaryID)
+ , _fallbackID()
+ , _currentID()
+{
+ _fallbackID.setToBogus();
+ if (_primaryID.length() != 0) {
+ if (canonicalFallbackID != NULL && _primaryID != *canonicalFallbackID) {
+ _fallbackID = *canonicalFallbackID;
+ }
+ }
+
+ _currentID = _primaryID;
+}
+
+LocaleKey::~LocaleKey() {}
+
+UnicodeString&
+LocaleKey::prefix(UnicodeString& result) const {
+ if (_kind != KIND_ANY) {
+ UChar buffer[64];
+ uprv_itou(buffer, 64, _kind, 10, 0);
+ UnicodeString temp(buffer);
+ result.append(temp);
+ }
+ return result;
+}
+
+int32_t
+LocaleKey::kind() const {
+ return _kind;
+}
+
+UnicodeString&
+LocaleKey::canonicalID(UnicodeString& result) const {
+ return result.append(_primaryID);
+}
+
+UnicodeString&
+LocaleKey::currentID(UnicodeString& result) const {
+ if (!_currentID.isBogus()) {
+ result.append(_currentID);
+ }
+ return result;
+}
+
+UnicodeString&
+LocaleKey::currentDescriptor(UnicodeString& result) const {
+ if (!_currentID.isBogus()) {
+ prefix(result).append(PREFIX_DELIMITER).append(_currentID);
+ } else {
+ result.setToBogus();
+ }
+ return result;
+}
+
+Locale&
+LocaleKey::canonicalLocale(Locale& result) const {
+ return LocaleUtility::initLocaleFromName(_primaryID, result);
+}
+
+Locale&
+LocaleKey::currentLocale(Locale& result) const {
+ return LocaleUtility::initLocaleFromName(_currentID, result);
+}
+
+UBool
+LocaleKey::fallback() {
+ if (!_currentID.isBogus()) {
+ int x = _currentID.lastIndexOf(UNDERSCORE_CHAR);
+ if (x != -1) {
+ _currentID.remove(x); // truncate current or fallback, whichever we're pointing to
+ return TRUE;
+ }
+
+ if (!_fallbackID.isBogus()) {
+ _currentID = _fallbackID;
+ _fallbackID.setToBogus();
+ return TRUE;
+ }
+
+ if (_currentID.length() > 0) {
+ _currentID.remove(0); // completely truncate
+ return TRUE;
+ }
+
+ _currentID.setToBogus();
+ }
+
+ return FALSE;
+}
+
+UBool
+LocaleKey::isFallbackOf(const UnicodeString& id) const {
+ UnicodeString temp(id);
+ parseSuffix(temp);
+ return temp.indexOf(_primaryID) == 0 &&
+ (temp.length() == _primaryID.length() ||
+ temp.charAt(_primaryID.length()) == UNDERSCORE_CHAR);
+}
+
+#ifdef SERVICE_DEBUG
+UnicodeString&
+LocaleKey::debug(UnicodeString& result) const
+{
+ ICUServiceKey::debug(result);
+ result.append(" kind: ");
+ result.append(_kind);
+ result.append(" primaryID: ");
+ result.append(_primaryID);
+ result.append(" fallbackID: ");
+ result.append(_fallbackID);
+ result.append(" currentID: ");
+ result.append(_currentID);
+ return result;
+}
+
+UnicodeString&
+LocaleKey::debugClass(UnicodeString& result) const
+{
+ return result.append("LocaleKey ");
+}
+#endif
+
+UOBJECT_DEFINE_RTTI_IMPLEMENTATION(LocaleKey)
+
+U_NAMESPACE_END
+
+/* !UCONFIG_NO_SERVICE */
+#endif
+
+
diff --git a/icuSources/common/servlkf.cpp b/icuSources/common/servlkf.cpp
new file mode 100644
index 00000000..c455080f
--- /dev/null
+++ b/icuSources/common/servlkf.cpp
@@ -0,0 +1,151 @@
+/**
+ *******************************************************************************
+ * Copyright (C) 2001-2005, International Business Machines Corporation and *
+ * others. All Rights Reserved. *
+ *******************************************************************************
+ *
+ *******************************************************************************
+ */
+#include "unicode/utypes.h"
+
+#if !UCONFIG_NO_SERVICE
+
+#include "unicode/resbund.h"
+#include "uresimp.h"
+#include "cmemory.h"
+#include "servloc.h"
+#include "ustrfmt.h"
+#include "uhash.h"
+#include "charstr.h"
+#include "ucln_cmn.h"
+#include "uassert.h"
+
+#define UNDERSCORE_CHAR ((UChar)0x005f)
+#define AT_SIGN_CHAR ((UChar)64)
+#define PERIOD_CHAR ((UChar)46)
+
+
+U_NAMESPACE_BEGIN
+
+LocaleKeyFactory::LocaleKeyFactory(int32_t coverage)
+ : _name()
+ , _coverage(coverage)
+{
+}
+
+LocaleKeyFactory::LocaleKeyFactory(int32_t coverage, const UnicodeString& name)
+ : _name(name)
+ , _coverage(coverage)
+{
+}
+
+LocaleKeyFactory::~LocaleKeyFactory() {
+}
+
+UObject*
+LocaleKeyFactory::create(const ICUServiceKey& key, const ICUService* service, UErrorCode& status) const {
+ if (handlesKey(key, status)) {
+ const LocaleKey& lkey = (const LocaleKey&)key;
+ int32_t kind = lkey.kind();
+ Locale loc;
+ lkey.currentLocale(loc);
+
+ return handleCreate(loc, kind, service, status);
+ }
+ return NULL;
+}
+
+UBool
+LocaleKeyFactory::handlesKey(const ICUServiceKey& key, UErrorCode& status) const {
+ const Hashtable* supported = getSupportedIDs(status);
+ if (supported) {
+ UnicodeString id;
+ key.currentID(id);
+ return supported->get(id) != NULL;
+ }
+ return FALSE;
+}
+
+void
+LocaleKeyFactory::updateVisibleIDs(Hashtable& result, UErrorCode& status) const {
+ const Hashtable* supported = getSupportedIDs(status);
+ if (supported) {
+ UBool visible = (_coverage & 0x1) == 0;
+
+ const UHashElement* elem = NULL;
+ int32_t pos = 0;
+ while ((elem = supported->nextElement(pos)) != NULL) {
+ const UnicodeString& id = *((const UnicodeString*)elem->key.pointer);
+ if (!visible) {
+ result.remove(id);
+ } else {
+ result.put(id, (void*)this, status); // this is dummy non-void marker used for set semantics
+ if (U_FAILURE(status)) {
+ break;
+ }
+ }
+ }
+ }
+}
+
+UnicodeString&
+LocaleKeyFactory::getDisplayName(const UnicodeString& id, const Locale& locale, UnicodeString& result) const {
+ if ((_coverage & 0x1) == 0) {
+ //UErrorCode status = U_ZERO_ERROR;
+ // assume if this is called on us, we support some fallback of this id
+ // if (isSupportedID(id, status)) {
+ Locale loc;
+ LocaleUtility::initLocaleFromName(id, loc);
+ return loc.getDisplayName(locale, result);
+ // }
+ }
+ result.setToBogus();
+ return result;
+}
+
+UObject*
+LocaleKeyFactory::handleCreate(const Locale& /* loc */,
+ int32_t /* kind */,
+ const ICUService* /* service */,
+ UErrorCode& /* status */) const {
+ return NULL;
+}
+
+//UBool
+//LocaleKeyFactory::isSupportedID(const UnicodeString& id, UErrorCode& status) const {
+// const Hashtable* ids = getSupportedIDs(status);
+// return ids && ids->get(id);
+//}
+
+const Hashtable*
+LocaleKeyFactory::getSupportedIDs(UErrorCode& /* status */) const {
+ return NULL;
+}
+
+#ifdef SERVICE_DEBUG
+UnicodeString&
+LocaleKeyFactory::debug(UnicodeString& result) const
+{
+ debugClass(result);
+ result.append(", name: ");
+ result.append(_name);
+ result.append(", coverage: ");
+ result.append(_coverage);
+ return result;
+}
+
+UnicodeString&
+LocaleKeyFactory::debugClass(UnicodeString& result) const
+{
+ return result.append("LocaleKeyFactory");
+}
+#endif
+
+UOBJECT_DEFINE_RTTI_IMPLEMENTATION(LocaleKeyFactory)
+
+U_NAMESPACE_END
+
+/* !UCONFIG_NO_SERVICE */
+#endif
+
+
diff --git a/icuSources/common/iculserv.h b/icuSources/common/servloc.h
similarity index 92%
rename from icuSources/common/iculserv.h
rename to icuSources/common/servloc.h
index 1798e200..d08b09e3 100644
--- a/icuSources/common/iculserv.h
+++ b/icuSources/common/servloc.h
@@ -1,6 +1,6 @@
/**
*******************************************************************************
- * Copyright (C) 2001-2004, International Business Machines Corporation and *
+ * Copyright (C) 2001-2005, International Business Machines Corporation and *
* others. All Rights Reserved. *
*******************************************************************************
*
@@ -32,7 +32,8 @@ U_NAMESPACE_END
#include "hash.h"
#include "uvector.h"
-#include "icuserv.h"
+#include "serv.h"
+#include "locutil.h"
U_NAMESPACE_BEGIN
@@ -68,7 +69,9 @@ class U_COMMON_API LocaleKey : public ICUServiceKey {
UnicodeString _currentID;
public:
- static const int32_t KIND_ANY; // = -1;
+ enum {
+ KIND_ANY = -1
+ };
/**
* Create a LocaleKey with canonical primary and fallback IDs.
@@ -243,12 +246,12 @@ public:
* Override of superclass method. This adjusts the result based
* on the coverage rule for this factory.
*/
- void updateVisibleIDs(Hashtable& result, UErrorCode& status) const;
+ virtual void updateVisibleIDs(Hashtable& result, UErrorCode& status) const;
/**
* Return a localized name for the locale represented by id.
*/
- UnicodeString& getDisplayName(const UnicodeString& id, const Locale& locale, UnicodeString& result) const;
+ virtual UnicodeString& getDisplayName(const UnicodeString& id, const Locale& locale, UnicodeString& result) const;
protected:
/**
@@ -261,7 +264,7 @@ protected:
* Return true if this id is one the factory supports (visible or
* otherwise).
*/
- virtual UBool isSupportedID(const UnicodeString& id, UErrorCode& status) const;
+ // virtual UBool isSupportedID(const UnicodeString& id, UErrorCode& status) const;
/**
* Return the set of ids that this factory supports (visible or
@@ -319,19 +322,19 @@ class U_COMMON_API SimpleLocaleKeyFactory : public LocaleKeyFactory {
/**
* Override of superclass method. Returns the service object if kind/locale match. Service is not used.
*/
- UObject* create(const ICUServiceKey& key, const ICUService* service, UErrorCode& status) const;
+ virtual UObject* create(const ICUServiceKey& key, const ICUService* service, UErrorCode& status) const;
/**
* Override of superclass method. This adjusts the result based
* on the coverage rule for this factory.
*/
- void updateVisibleIDs(Hashtable& result, UErrorCode& status) const;
+ virtual void updateVisibleIDs(Hashtable& result, UErrorCode& status) const;
protected:
/**
* Return true if this id is equal to the locale name.
*/
- virtual UBool isSupportedID(const UnicodeString& id, UErrorCode& status) const;
+ //virtual UBool isSupportedID(const UnicodeString& id, UErrorCode& status) const;
public:
@@ -537,18 +540,6 @@ class U_COMMON_API ICULocaleService : public ICUService
friend class ServiceEnumeration;
};
-// temporary utility functions, till I know where to find them
-// in header so tests can also access them
-
-class U_COMMON_API LocaleUtility {
-public:
- static UnicodeString& canonicalLocaleString(const UnicodeString* id, UnicodeString& result);
- static Locale& initLocaleFromName(const UnicodeString& id, Locale& result);
- static UnicodeString& initNameFromLocale(const Locale& locale, UnicodeString& result);
- static const Hashtable* getAvailableLocaleNames(const UnicodeString& bundleID);
- static UBool isFallbackOf(const UnicodeString& root, const UnicodeString& child);
-};
-
U_NAMESPACE_END
/* UCONFIG_NO_SERVICE */
diff --git a/icuSources/common/servls.cpp b/icuSources/common/servls.cpp
new file mode 100644
index 00000000..b39e72ed
--- /dev/null
+++ b/icuSources/common/servls.cpp
@@ -0,0 +1,297 @@
+/**
+ *******************************************************************************
+ * Copyright (C) 2001-2004, International Business Machines Corporation and *
+ * others. All Rights Reserved. *
+ *******************************************************************************
+ *
+ *******************************************************************************
+ */
+#include "unicode/utypes.h"
+
+#if !UCONFIG_NO_SERVICE
+
+#include "unicode/resbund.h"
+#include "uresimp.h"
+#include "cmemory.h"
+#include "servloc.h"
+#include "ustrfmt.h"
+#include "uhash.h"
+#include "charstr.h"
+#include "ucln_cmn.h"
+#include "uassert.h"
+
+#define UNDERSCORE_CHAR ((UChar)0x005f)
+#define AT_SIGN_CHAR ((UChar)64)
+#define PERIOD_CHAR ((UChar)46)
+
+U_NAMESPACE_BEGIN
+
+ICULocaleService::ICULocaleService()
+ : fallbackLocale(Locale::getDefault())
+ , llock(0)
+{
+ umtx_init(&llock);
+}
+
+ICULocaleService::ICULocaleService(const UnicodeString& dname)
+ : ICUService(dname)
+ , fallbackLocale(Locale::getDefault())
+ , llock(0)
+{
+ umtx_init(&llock);
+}
+
+ICULocaleService::~ICULocaleService()
+{
+ umtx_destroy(&llock);
+}
+
+UObject*
+ICULocaleService::get(const Locale& locale, UErrorCode& status) const
+{
+ return get(locale, LocaleKey::KIND_ANY, NULL, status);
+}
+
+UObject*
+ICULocaleService::get(const Locale& locale, int32_t kind, UErrorCode& status) const
+{
+ return get(locale, kind, NULL, status);
+}
+
+UObject*
+ICULocaleService::get(const Locale& locale, Locale* actualReturn, UErrorCode& status) const
+{
+ return get(locale, LocaleKey::KIND_ANY, actualReturn, status);
+}
+
+UObject*
+ICULocaleService::get(const Locale& locale, int32_t kind, Locale* actualReturn, UErrorCode& status) const
+{
+ UObject* result = NULL;
+ if (U_FAILURE(status)) {
+ return result;
+ }
+
+ UnicodeString locName(locale.getName(), -1, US_INV);
+ if (locName.isBogus()) {
+ status = U_MEMORY_ALLOCATION_ERROR;
+ } else {
+ ICUServiceKey* key = createKey(&locName, kind, status);
+ if (key) {
+ if (actualReturn == NULL) {
+ result = getKey(*key, status);
+ } else {
+ UnicodeString temp;
+ result = getKey(*key, &temp, status);
+
+ if (result != NULL) {
+ key->parseSuffix(temp);
+ LocaleUtility::initLocaleFromName(temp, *actualReturn);
+ }
+ }
+ delete key;
+ }
+ }
+ return result;
+}
+
+
+URegistryKey
+ICULocaleService::registerInstance(UObject* objToAdopt, const UnicodeString& locale,
+ UBool visible, UErrorCode& status)
+{
+ Locale loc;
+ LocaleUtility::initLocaleFromName(locale, loc);
+ return registerInstance(objToAdopt, loc, LocaleKey::KIND_ANY,
+ visible ? LocaleKeyFactory::VISIBLE : LocaleKeyFactory::INVISIBLE, status);
+}
+
+URegistryKey
+ICULocaleService::registerInstance(UObject* objToAdopt, const Locale& locale, UErrorCode& status)
+{
+ return registerInstance(objToAdopt, locale, LocaleKey::KIND_ANY, LocaleKeyFactory::VISIBLE, status);
+}
+
+URegistryKey
+ICULocaleService::registerInstance(UObject* objToAdopt, const Locale& locale, int32_t kind, UErrorCode& status)
+{
+ return registerInstance(objToAdopt, locale, kind, LocaleKeyFactory::VISIBLE, status);
+}
+
+URegistryKey
+ICULocaleService::registerInstance(UObject* objToAdopt, const Locale& locale, int32_t kind, int32_t coverage, UErrorCode& status)
+{
+ ICUServiceFactory * factory = new SimpleLocaleKeyFactory(objToAdopt, locale, kind, coverage);
+ if (factory != NULL) {
+ return registerFactory(factory, status);
+ }
+ delete objToAdopt;
+ return NULL;
+}
+
+#if 0
+URegistryKey
+ICULocaleService::registerInstance(UObject* objToAdopt, const UnicodeString& locale, UErrorCode& status)
+{
+ return registerInstance(objToAdopt, locale, LocaleKey::KIND_ANY, LocaleKeyFactory::VISIBLE, status);
+}
+
+URegistryKey
+ICULocaleService::registerInstance(UObject* objToAdopt, const UnicodeString& locale, UBool visible, UErrorCode& status)
+{
+ return registerInstance(objToAdopt, locale, LocaleKey::KIND_ANY,
+ visible ? LocaleKeyFactory::VISIBLE : LocaleKeyFactory::INVISIBLE,
+ status);
+}
+
+URegistryKey
+ICULocaleService::registerInstance(UObject* objToAdopt, const UnicodeString& locale, int32_t kind, int32_t coverage, UErrorCode& status)
+{
+ ICUServiceFactory * factory = new SimpleLocaleKeyFactory(objToAdopt, locale, kind, coverage);
+ if (factory != NULL) {
+ return registerFactory(factory, status);
+ }
+ delete objToAdopt;
+ return NULL;
+}
+#endif
+
+class ServiceEnumeration : public StringEnumeration {
+private:
+ const ICULocaleService* _service;
+ int32_t _timestamp;
+ UVector _ids;
+ int32_t _pos;
+
+private:
+ ServiceEnumeration(const ICULocaleService* service, UErrorCode &status)
+ : _service(service)
+ , _timestamp(service->getTimestamp())
+ , _ids(uhash_deleteUnicodeString, NULL, status)
+ , _pos(0)
+ {
+ _service->getVisibleIDs(_ids, status);
+ }
+
+ ServiceEnumeration(const ServiceEnumeration &other, UErrorCode &status)
+ : _service(other._service)
+ , _timestamp(other._timestamp)
+ , _ids(uhash_deleteUnicodeString, NULL, status)
+ , _pos(0)
+ {
+ if(U_SUCCESS(status)) {
+ int32_t i, length;
+
+ length = other._ids.size();
+ for(i = 0; i < length; ++i) {
+ _ids.addElement(((UnicodeString *)other._ids.elementAt(i))->clone(), status);
+ }
+
+ if(U_SUCCESS(status)) {
+ _pos = other._pos;
+ }
+ }
+ }
+
+public:
+ static ServiceEnumeration* create(const ICULocaleService* service) {
+ UErrorCode status = U_ZERO_ERROR;
+ ServiceEnumeration* result = new ServiceEnumeration(service, status);
+ if (U_SUCCESS(status)) {
+ return result;
+ }
+ delete result;
+ return NULL;
+ }
+
+ virtual ~ServiceEnumeration() {}
+
+ virtual StringEnumeration *clone() const {
+ UErrorCode status = U_ZERO_ERROR;
+ ServiceEnumeration *cl = new ServiceEnumeration(*this, status);
+ if(U_FAILURE(status)) {
+ delete cl;
+ cl = NULL;
+ }
+ return cl;
+ }
+
+ UBool upToDate(UErrorCode& status) const {
+ if (U_SUCCESS(status)) {
+ if (_timestamp == _service->getTimestamp()) {
+ return TRUE;
+ }
+ status = U_ENUM_OUT_OF_SYNC_ERROR;
+ }
+ return FALSE;
+ }
+
+ virtual int32_t count(UErrorCode& status) const {
+ return upToDate(status) ? _ids.size() : 0;
+ }
+
+ virtual const UnicodeString* snext(UErrorCode& status) {
+ if (upToDate(status) && (_pos < _ids.size())) {
+ return (const UnicodeString*)_ids[_pos++];
+ }
+ return NULL;
+ }
+
+ virtual void reset(UErrorCode& status) {
+ if (status == U_ENUM_OUT_OF_SYNC_ERROR) {
+ status = U_ZERO_ERROR;
+ }
+ if (U_SUCCESS(status)) {
+ _timestamp = _service->getTimestamp();
+ _pos = 0;
+ _service->getVisibleIDs(_ids, status);
+ }
+ }
+
+public:
+ static UClassID U_EXPORT2 getStaticClassID(void);
+ virtual UClassID getDynamicClassID(void) const;
+};
+
+UOBJECT_DEFINE_RTTI_IMPLEMENTATION(ServiceEnumeration)
+
+StringEnumeration*
+ICULocaleService::getAvailableLocales(void) const
+{
+ return ServiceEnumeration::create(this);
+}
+
+const UnicodeString&
+ICULocaleService::validateFallbackLocale() const
+{
+ const Locale& loc = Locale::getDefault();
+ ICULocaleService* ncThis = (ICULocaleService*)this;
+ {
+ Mutex mutex(&ncThis->llock);
+ if (loc != fallbackLocale) {
+ ncThis->fallbackLocale = loc;
+ LocaleUtility::initNameFromLocale(loc, ncThis->fallbackLocaleName);
+ ncThis->clearServiceCache();
+ }
+ }
+ return fallbackLocaleName;
+}
+
+ICUServiceKey*
+ICULocaleService::createKey(const UnicodeString* id, UErrorCode& status) const
+{
+ return LocaleKey::createWithCanonicalFallback(id, &validateFallbackLocale(), status);
+}
+
+ICUServiceKey*
+ICULocaleService::createKey(const UnicodeString* id, int32_t kind, UErrorCode& status) const
+{
+ return LocaleKey::createWithCanonicalFallback(id, &validateFallbackLocale(), kind, status);
+}
+
+U_NAMESPACE_END
+
+/* !UCONFIG_NO_SERVICE */
+#endif
+
+
diff --git a/icuSources/common/servnotf.cpp b/icuSources/common/servnotf.cpp
new file mode 100644
index 00000000..6adf52ec
--- /dev/null
+++ b/icuSources/common/servnotf.cpp
@@ -0,0 +1,118 @@
+/**
+ *******************************************************************************
+ * Copyright (C) 2001-2006, International Business Machines Corporation and *
+ * others. All Rights Reserved. *
+ *******************************************************************************
+ */
+
+#include "unicode/utypes.h"
+
+#if !UCONFIG_NO_SERVICE
+
+#include "servnotf.h"
+#ifdef NOTIFIER_DEBUG
+#include
+#endif
+
+U_NAMESPACE_BEGIN
+
+EventListener::~EventListener() {}
+UOBJECT_DEFINE_RTTI_IMPLEMENTATION(EventListener)
+
+ICUNotifier::ICUNotifier(void)
+: notifyLock(0), listeners(NULL)
+{
+ umtx_init(¬ifyLock);
+}
+
+ICUNotifier::~ICUNotifier(void) {
+ {
+ Mutex lmx(¬ifyLock);
+ delete listeners;
+ listeners = NULL;
+ }
+ umtx_destroy(¬ifyLock);
+}
+
+
+void
+ICUNotifier::addListener(const EventListener* l, UErrorCode& status)
+{
+ if (U_SUCCESS(status)) {
+ if (l == NULL) {
+ status = U_ILLEGAL_ARGUMENT_ERROR;
+ return;
+ }
+
+ if (acceptsListener(*l)) {
+ Mutex lmx(¬ifyLock);
+ if (listeners == NULL) {
+ listeners = new UVector(5, status);
+ } else {
+ for (int i = 0, e = listeners->size(); i < e; ++i) {
+ const EventListener* el = (const EventListener*)(listeners->elementAt(i));
+ if (l == el) {
+ return;
+ }
+ }
+ }
+
+ listeners->addElement((void*)l, status); // cast away const
+ }
+#ifdef NOTIFIER_DEBUG
+ else {
+ fprintf(stderr, "Listener invalid for this notifier.");
+ exit(1);
+ }
+#endif
+ }
+}
+
+void
+ICUNotifier::removeListener(const EventListener *l, UErrorCode& status)
+{
+ if (U_SUCCESS(status)) {
+ if (l == NULL) {
+ status = U_ILLEGAL_ARGUMENT_ERROR;
+ return;
+ }
+
+ {
+ Mutex lmx(¬ifyLock);
+ if (listeners != NULL) {
+ // identity equality check
+ for (int i = 0, e = listeners->size(); i < e; ++i) {
+ const EventListener* el = (const EventListener*)listeners->elementAt(i);
+ if (l == el) {
+ listeners->removeElementAt(i);
+ if (listeners->size() == 0) {
+ delete listeners;
+ listeners = NULL;
+ }
+ return;
+ }
+ }
+ }
+ }
+ }
+}
+
+void
+ICUNotifier::notifyChanged(void)
+{
+ if (listeners != NULL) {
+ Mutex lmx(¬ifyLock);
+ if (listeners != NULL) {
+ for (int i = 0, e = listeners->size(); i < e; ++i) {
+ EventListener* el = (EventListener*)listeners->elementAt(i);
+ notifyListener(*el);
+ }
+ }
+ }
+}
+
+U_NAMESPACE_END
+
+/* UCONFIG_NO_SERVICE */
+#endif
+
diff --git a/icuSources/common/icunotif.h b/icuSources/common/servnotf.h
similarity index 100%
rename from icuSources/common/icunotif.h
rename to icuSources/common/servnotf.h
diff --git a/icuSources/common/servrbf.cpp b/icuSources/common/servrbf.cpp
new file mode 100644
index 00000000..3a0227f7
--- /dev/null
+++ b/icuSources/common/servrbf.cpp
@@ -0,0 +1,94 @@
+/**
+ *******************************************************************************
+ * Copyright (C) 2001-2005, International Business Machines Corporation and *
+ * others. All Rights Reserved. *
+ *******************************************************************************
+ *
+ *******************************************************************************
+ */
+#include "unicode/utypes.h"
+
+#if !UCONFIG_NO_SERVICE
+
+#include "unicode/resbund.h"
+#include "uresimp.h"
+#include "cmemory.h"
+#include "servloc.h"
+#include "ustrfmt.h"
+#include "uhash.h"
+#include "charstr.h"
+#include "ucln_cmn.h"
+#include "uassert.h"
+
+#define UNDERSCORE_CHAR ((UChar)0x005f)
+#define AT_SIGN_CHAR ((UChar)64)
+#define PERIOD_CHAR ((UChar)46)
+
+U_NAMESPACE_BEGIN
+
+ICUResourceBundleFactory::ICUResourceBundleFactory()
+ : LocaleKeyFactory(VISIBLE)
+ , _bundleName()
+{
+}
+
+ICUResourceBundleFactory::ICUResourceBundleFactory(const UnicodeString& bundleName)
+ : LocaleKeyFactory(VISIBLE)
+ , _bundleName(bundleName)
+{
+}
+
+ICUResourceBundleFactory::~ICUResourceBundleFactory() {}
+
+const Hashtable*
+ICUResourceBundleFactory::getSupportedIDs(UErrorCode& status) const
+{
+ if (U_SUCCESS(status)) {
+ return LocaleUtility::getAvailableLocaleNames(_bundleName);
+ }
+ return NULL;
+}
+
+UObject*
+ICUResourceBundleFactory::handleCreate(const Locale& loc, int32_t /* kind */, const ICUService* /* service */, UErrorCode& status) const
+{
+ if (U_SUCCESS(status)) {
+ // _bundleName is a package name
+ // and should only contain invariant characters
+ // ??? is it always true that the max length of the bundle name is 19?
+ // who made this change? -- dlf
+ char pkg[20];
+ int32_t length;
+ length=_bundleName.extract(0, INT32_MAX, pkg, (int32_t)sizeof(pkg), US_INV);
+ if(length>=(int32_t)sizeof(pkg)) {
+ return NULL;
+ }
+ return new ResourceBundle(pkg, loc, status);
+ }
+ return NULL;
+}
+
+#ifdef SERVICE_DEBUG
+UnicodeString&
+ICUResourceBundleFactory::debug(UnicodeString& result) const
+{
+ LocaleKeyFactory::debug(result);
+ result.append(", bundle: ");
+ return result.append(_bundleName);
+}
+
+UnicodeString&
+ICUResourceBundleFactory::debugClass(UnicodeString& result) const
+{
+ return result.append("ICUResourceBundleFactory");
+}
+#endif
+
+UOBJECT_DEFINE_RTTI_IMPLEMENTATION(ICUResourceBundleFactory)
+
+U_NAMESPACE_END
+
+/* !UCONFIG_NO_SERVICE */
+#endif
+
+
diff --git a/icuSources/common/servslkf.cpp b/icuSources/common/servslkf.cpp
new file mode 100644
index 00000000..b8afaaad
--- /dev/null
+++ b/icuSources/common/servslkf.cpp
@@ -0,0 +1,122 @@
+/**
+ *******************************************************************************
+ * Copyright (C) 2001-2005, International Business Machines Corporation and *
+ * others. All Rights Reserved. *
+ *******************************************************************************
+ *
+ *******************************************************************************
+ */
+#include "unicode/utypes.h"
+
+#if !UCONFIG_NO_SERVICE
+
+#include "unicode/resbund.h"
+#include "uresimp.h"
+#include "cmemory.h"
+#include "servloc.h"
+#include "ustrfmt.h"
+#include "uhash.h"
+#include "charstr.h"
+#include "ucln_cmn.h"
+#include "uassert.h"
+
+#define UNDERSCORE_CHAR ((UChar)0x005f)
+#define AT_SIGN_CHAR ((UChar)64)
+#define PERIOD_CHAR ((UChar)46)
+
+U_NAMESPACE_BEGIN
+
+/*
+ ******************************************************************
+ */
+
+SimpleLocaleKeyFactory::SimpleLocaleKeyFactory(UObject* objToAdopt,
+ const UnicodeString& locale,
+ int32_t kind,
+ int32_t coverage)
+ : LocaleKeyFactory(coverage)
+ , _obj(objToAdopt)
+ , _id(locale)
+ , _kind(kind)
+{
+}
+
+SimpleLocaleKeyFactory::SimpleLocaleKeyFactory(UObject* objToAdopt,
+ const Locale& locale,
+ int32_t kind,
+ int32_t coverage)
+ : LocaleKeyFactory(coverage)
+ , _obj(objToAdopt)
+ , _id()
+ , _kind(kind)
+{
+ LocaleUtility::initNameFromLocale(locale, _id);
+}
+
+SimpleLocaleKeyFactory::~SimpleLocaleKeyFactory()
+{
+ delete _obj;
+ _obj = NULL;
+}
+
+UObject*
+SimpleLocaleKeyFactory::create(const ICUServiceKey& key, const ICUService* service, UErrorCode& status) const
+{
+ if (U_SUCCESS(status)) {
+ const LocaleKey& lkey = (const LocaleKey&)key;
+ if (_kind == LocaleKey::KIND_ANY || _kind == lkey.kind()) {
+ UnicodeString keyID;
+ lkey.currentID(keyID);
+ if (_id == keyID) {
+ return service->cloneInstance(_obj);
+ }
+ }
+ }
+ return NULL;
+}
+
+//UBool
+//SimpleLocaleKeyFactory::isSupportedID(const UnicodeString& id, UErrorCode& /* status */) const
+//{
+// return id == _id;
+//}
+
+void
+SimpleLocaleKeyFactory::updateVisibleIDs(Hashtable& result, UErrorCode& status) const
+{
+ if (U_SUCCESS(status)) {
+ if (_coverage & 0x1) {
+ result.remove(_id);
+ } else {
+ result.put(_id, (void*)this, status);
+ }
+ }
+}
+
+#ifdef SERVICE_DEBUG
+UnicodeString&
+SimpleLocaleKeyFactory::debug(UnicodeString& result) const
+{
+ LocaleKeyFactory::debug(result);
+ result.append(", id: ");
+ result.append(_id);
+ result.append(", kind: ");
+ result.append(_kind);
+ return result;
+}
+
+UnicodeString&
+SimpleLocaleKeyFactory::debugClass(UnicodeString& result) const
+{
+ return result.append("SimpleLocaleKeyFactory");
+}
+#endif
+
+UOBJECT_DEFINE_RTTI_IMPLEMENTATION(SimpleLocaleKeyFactory)
+
+U_NAMESPACE_END
+
+/* !UCONFIG_NO_SERVICE */
+#endif
+
+
diff --git a/icuSources/common/sprpimpl.h b/icuSources/common/sprpimpl.h
index 50d7c350..1422cc3a 100644
--- a/icuSources/common/sprpimpl.h
+++ b/icuSources/common/sprpimpl.h
@@ -1,7 +1,7 @@
/*
*******************************************************************************
*
- * Copyright (C) 2003-2004, International Business Machines
+ * Copyright (C) 2003-2006, International Business Machines
* Corporation and others. All Rights Reserved.
*
*******************************************************************************
@@ -27,6 +27,7 @@
#include "unicode/udata.h"
#include "utrie.h"
#include "udataswp.h"
+#include "ubidi_props.h"
#define _SPREP_DATA_TYPE "spp"
@@ -87,8 +88,9 @@ struct UStringPrepProfile{
UTrie sprepTrie;
const uint16_t* mappingData;
UDataMemory* sprepData;
- UBool isDataLoaded;
+ const UBiDiProps *bdp; /* used only if checkBiDi is set */
int32_t refCount;
+ UBool isDataLoaded;
UBool doNFKC;
UBool checkBiDi;
};
diff --git a/icuSources/common/triedict.cpp b/icuSources/common/triedict.cpp
new file mode 100644
index 00000000..2c58a550
--- /dev/null
+++ b/icuSources/common/triedict.cpp
@@ -0,0 +1,1407 @@
+/**
+ *******************************************************************************
+ * Copyright (C) 2006, International Business Machines Corporation and others. *
+ * All Rights Reserved. *
+ *******************************************************************************
+ */
+
+#include "unicode/utypes.h"
+
+#if !UCONFIG_NO_BREAK_ITERATION
+
+#include "triedict.h"
+#include "unicode/chariter.h"
+#include "unicode/uchriter.h"
+#include "unicode/strenum.h"
+#include "unicode/uenum.h"
+#include "unicode/udata.h"
+#include "cmemory.h"
+#include "udataswp.h"
+#include "uvector.h"
+#include "uvectr32.h"
+#include "uarrsort.h"
+
+//#define DEBUG_TRIE_DICT 1
+
+#ifdef DEBUG_TRIE_DICT
+#include
+#include
+#include
+#endif
+
+U_NAMESPACE_BEGIN
+
+/*******************************************************************
+ * TrieWordDictionary
+ */
+
+TrieWordDictionary::TrieWordDictionary() {
+}
+
+TrieWordDictionary::~TrieWordDictionary() {
+}
+
+/*******************************************************************
+ * MutableTrieDictionary
+ */
+
+// Node structure for the ternary, uncompressed trie
+struct TernaryNode : public UMemory {
+ UChar ch; // UTF-16 code unit
+ uint16_t flags; // Flag word
+ TernaryNode *low; // Less-than link
+ TernaryNode *equal; // Equal link
+ TernaryNode *high; // Greater-than link
+
+ TernaryNode(UChar uc);
+ ~TernaryNode();
+};
+
+enum MutableTrieNodeFlags {
+ kEndsWord = 0x0001 // This node marks the end of a valid word
+};
+
+inline
+TernaryNode::TernaryNode(UChar uc) {
+ ch = uc;
+ flags = 0;
+ low = NULL;
+ equal = NULL;
+ high = NULL;
+}
+
+// Not inline since it's recursive
+TernaryNode::~TernaryNode() {
+ delete low;
+ delete equal;
+ delete high;
+}
+
+MutableTrieDictionary::MutableTrieDictionary( UChar median, UErrorCode &status ) {
+ // Start the trie off with something. Having the root node already present
+ // cuts a special case out of the search/insertion functions.
+ // Making it a median character cuts the worse case for searches from
+ // 4x a balanced trie to 2x a balanced trie. It's best to choose something
+ // that starts a word that is midway in the list.
+ fTrie = new TernaryNode(median);
+ if (fTrie == NULL) {
+ status = U_MEMORY_ALLOCATION_ERROR;
+ }
+ fIter = utext_openUChars(NULL, NULL, 0, &status);
+ if (U_SUCCESS(status) && fIter == NULL) {
+ status = U_MEMORY_ALLOCATION_ERROR;
+ }
+}
+
+MutableTrieDictionary::MutableTrieDictionary( UErrorCode &status ) {
+ fTrie = NULL;
+ fIter = utext_openUChars(NULL, NULL, 0, &status);
+ if (U_SUCCESS(status) && fIter == NULL) {
+ status = U_MEMORY_ALLOCATION_ERROR;
+ }
+}
+
+MutableTrieDictionary::~MutableTrieDictionary() {
+ delete fTrie;
+ utext_close(fIter);
+}
+
+int32_t
+MutableTrieDictionary::search( UText *text,
+ int32_t maxLength,
+ int32_t *lengths,
+ int &count,
+ int limit,
+ TernaryNode *&parent,
+ UBool &pMatched ) const {
+ // TODO: current implementation works in UTF-16 space
+ const TernaryNode *up = NULL;
+ const TernaryNode *p = fTrie;
+ int mycount = 0;
+ pMatched = TRUE;
+ int i;
+
+ UChar uc = utext_current32(text);
+ for (i = 0; i < maxLength && p != NULL; ++i) {
+ while (p != NULL) {
+ if (uc < p->ch) {
+ up = p;
+ p = p->low;
+ }
+ else if (uc == p->ch) {
+ break;
+ }
+ else {
+ up = p;
+ p = p->high;
+ }
+ }
+ if (p == NULL) {
+ pMatched = FALSE;
+ break;
+ }
+ // Must be equal to get here
+ if (limit > 0 && (p->flags & kEndsWord)) {
+ lengths[mycount++] = i+1;
+ --limit;
+ }
+ up = p;
+ p = p->equal;
+ uc = utext_next32(text);
+ uc = utext_current32(text);
+ }
+
+ // Note that there is no way to reach here with up == 0 unless
+ // maxLength is 0 coming in.
+ parent = (TernaryNode *)up;
+ count = mycount;
+ return i;
+}
+
+void
+MutableTrieDictionary::addWord( const UChar *word,
+ int32_t length,
+ UErrorCode &status ) {
+#if 0
+ if (length <= 0) {
+ status = U_ILLEGAL_ARGUMENT_ERROR;
+ return;
+ }
+#endif
+ TernaryNode *parent;
+ UBool pMatched;
+ int count;
+ fIter = utext_openUChars(fIter, word, length, &status);
+
+ int matched;
+ matched = search(fIter, length, NULL, count, 0, parent, pMatched);
+
+ while (matched++ < length) {
+ UChar32 uc = utext_next32(fIter); // TODO: supplemetary support?
+ U_ASSERT(uc != U_SENTINEL);
+ TernaryNode *newNode = new TernaryNode(uc);
+ if (newNode == NULL) {
+ status = U_MEMORY_ALLOCATION_ERROR;
+ return;
+ }
+ if (pMatched) {
+ parent->equal = newNode;
+ }
+ else {
+ pMatched = TRUE;
+ if (uc < parent->ch) {
+ parent->low = newNode;
+ }
+ else {
+ parent->high = newNode;
+ }
+ }
+ parent = newNode;
+ }
+
+ parent->flags |= kEndsWord;
+}
+
+#if 0
+void
+MutableTrieDictionary::addWords( UEnumeration *words,
+ UErrorCode &status ) {
+ int32_t length;
+ const UChar *word;
+ while ((word = uenum_unext(words, &length, &status)) && U_SUCCESS(status)) {
+ addWord(word, length, status);
+ }
+}
+#endif
+
+int32_t
+MutableTrieDictionary::matches( UText *text,
+ int32_t maxLength,
+ int32_t *lengths,
+ int &count,
+ int limit ) const {
+ TernaryNode *parent;
+ UBool pMatched;
+ return search(text, maxLength, lengths, count, limit, parent, pMatched);
+}
+
+// Implementation of iteration for MutableTrieDictionary
+class MutableTrieEnumeration : public StringEnumeration {
+private:
+ UStack fNodeStack; // Stack of nodes to process
+ UVector32 fBranchStack; // Stack of which branch we are working on
+ TernaryNode *fRoot; // Root node
+ static const char fgClassID;
+ enum StackBranch {
+ kLessThan,
+ kEqual,
+ kGreaterThan,
+ kDone
+ };
+
+public:
+ static UClassID U_EXPORT2 getStaticClassID(void) { return (UClassID)&fgClassID; }
+ virtual UClassID getDynamicClassID(void) const { return getStaticClassID(); }
+public:
+ MutableTrieEnumeration(TernaryNode *root, UErrorCode &status)
+ : fNodeStack(status), fBranchStack(status) {
+ fRoot = root;
+ fNodeStack.push(root, status);
+ fBranchStack.push(kLessThan, status);
+ unistr.remove();
+ }
+
+ virtual ~MutableTrieEnumeration() {
+ }
+
+ virtual StringEnumeration *clone() const {
+ UErrorCode status = U_ZERO_ERROR;
+ return new MutableTrieEnumeration(fRoot, status);
+ }
+
+ virtual const UnicodeString *snext(UErrorCode &status) {
+ if (fNodeStack.empty() || U_FAILURE(status)) {
+ return NULL;
+ }
+ TernaryNode *node = (TernaryNode *) fNodeStack.peek();
+ StackBranch where = (StackBranch) fBranchStack.peeki();
+ while (!fNodeStack.empty() && U_SUCCESS(status)) {
+ UBool emit;
+ UBool equal;
+
+ switch (where) {
+ case kLessThan:
+ if (node->low != NULL) {
+ fBranchStack.setElementAt(kEqual, fBranchStack.size()-1);
+ node = (TernaryNode *) fNodeStack.push(node->low, status);
+ where = (StackBranch) fBranchStack.push(kLessThan, status);
+ break;
+ }
+ case kEqual:
+ emit = (node->flags & kEndsWord) != 0;
+ equal = (node->equal != NULL);
+ // If this node should be part of the next emitted string, append
+ // the UChar to the string, and make sure we pop it when we come
+ // back to this node. The character should only be in the string
+ // for as long as we're traversing the equal subtree of this node
+ if (equal || emit) {
+ unistr.append(node->ch);
+ fBranchStack.setElementAt(kGreaterThan, fBranchStack.size()-1);
+ }
+ if (equal) {
+ node = (TernaryNode *) fNodeStack.push(node->equal, status);
+ where = (StackBranch) fBranchStack.push(kLessThan, status);
+ }
+ if (emit) {
+ return &unistr;
+ }
+ if (equal) {
+ break;
+ }
+ case kGreaterThan:
+ // If this node's character is in the string, remove it.
+ if (node->equal != NULL || (node->flags & kEndsWord)) {
+ unistr.truncate(unistr.length()-1);
+ }
+ if (node->high != NULL) {
+ fBranchStack.setElementAt(kDone, fBranchStack.size()-1);
+ node = (TernaryNode *) fNodeStack.push(node->high, status);
+ where = (StackBranch) fBranchStack.push(kLessThan, status);
+ break;
+ }
+ case kDone:
+ fNodeStack.pop();
+ fBranchStack.popi();
+ node = (TernaryNode *) fNodeStack.peek();
+ where = (StackBranch) fBranchStack.peeki();
+ break;
+ default:
+ return NULL;
+ }
+ }
+ return NULL;
+ }
+
+ // Very expensive, but this should never be used.
+ virtual int32_t count(UErrorCode &status) const {
+ MutableTrieEnumeration counter(fRoot, status);
+ int32_t result = 0;
+ while (counter.snext(status) != NULL && U_SUCCESS(status)) {
+ ++result;
+ }
+ return result;
+ }
+
+ virtual void reset(UErrorCode &status) {
+ fNodeStack.removeAllElements();
+ fBranchStack.removeAllElements();
+ fNodeStack.push(fRoot, status);
+ fBranchStack.push(kLessThan, status);
+ unistr.remove();
+ }
+};
+
+const char MutableTrieEnumeration::fgClassID = '\0';
+
+StringEnumeration *
+MutableTrieDictionary::openWords( UErrorCode &status ) const {
+ if (U_FAILURE(status)) {
+ return NULL;
+ }
+ return new MutableTrieEnumeration(fTrie, status);
+}
+
+/*******************************************************************
+ * CompactTrieDictionary
+ */
+
+struct CompactTrieHeader {
+ uint32_t size; // Size of the data in bytes
+ uint32_t magic; // Magic number (including version)
+ uint16_t nodeCount; // Number of entries in offsets[]
+ uint16_t root; // Node number of the root node
+ uint32_t offsets[1]; // Offsets to nodes from start of data
+};
+
+// Note that to avoid platform-specific alignment issues, all members of the node
+// structures should be the same size, or should contain explicit padding to
+// natural alignment boundaries.
+
+// We can't use a bitfield for the flags+count field, because the layout of those
+// is not portable. 12 bits of count allows for up to 4096 entries in a node.
+struct CompactTrieNode {
+ uint16_t flagscount; // Count of sub-entries, plus flags
+};
+
+enum CompactTrieNodeFlags {
+ kVerticalNode = 0x1000, // This is a vertical node
+ kParentEndsWord = 0x2000, // The node whose equal link points to this ends a word
+ kReservedFlag1 = 0x4000,
+ kReservedFlag2 = 0x8000,
+ kCountMask = 0x0FFF, // The count portion of flagscount
+ kFlagMask = 0xF000 // The flags portion of flagscount
+};
+
+// The two node types are distinguished by the kVerticalNode flag.
+
+struct CompactTrieHorizontalEntry {
+ uint16_t ch; // UChar
+ uint16_t equal; // Equal link node index
+};
+
+// We don't use inheritance here because C++ does not guarantee that the
+// base class comes first in memory!!
+
+struct CompactTrieHorizontalNode {
+ uint16_t flagscount; // Count of sub-entries, plus flags
+ CompactTrieHorizontalEntry entries[1];
+};
+
+struct CompactTrieVerticalNode {
+ uint16_t flagscount; // Count of sub-entries, plus flags
+ uint16_t equal; // Equal link node index
+ uint16_t chars[1]; // Code units
+};
+
+// {'Dic', 1}, version 1
+#define COMPACT_TRIE_MAGIC_1 0x44696301
+
+CompactTrieDictionary::CompactTrieDictionary(UDataMemory *dataObj,
+ UErrorCode &status )
+: fUData(dataObj)
+{
+ fData = (const CompactTrieHeader *) udata_getMemory(dataObj);
+ fOwnData = FALSE;
+ if (fData->magic != COMPACT_TRIE_MAGIC_1) {
+ status = U_ILLEGAL_ARGUMENT_ERROR;
+ fData = NULL;
+ }
+}
+CompactTrieDictionary::CompactTrieDictionary( const void *data,
+ UErrorCode &status )
+: fUData(NULL)
+{
+ fData = (const CompactTrieHeader *) data;
+ fOwnData = FALSE;
+ if (fData->magic != COMPACT_TRIE_MAGIC_1) {
+ status = U_ILLEGAL_ARGUMENT_ERROR;
+ fData = NULL;
+ }
+}
+
+CompactTrieDictionary::CompactTrieDictionary( const MutableTrieDictionary &dict,
+ UErrorCode &status )
+: fUData(NULL)
+{
+ fData = compactMutableTrieDictionary(dict, status);
+ fOwnData = !U_FAILURE(status);
+}
+
+CompactTrieDictionary::~CompactTrieDictionary() {
+ if (fOwnData) {
+ uprv_free((void *)fData);
+ }
+ if (fUData) {
+ udata_close(fUData);
+ }
+}
+
+uint32_t
+CompactTrieDictionary::dataSize() const {
+ return fData->size;
+}
+
+const void *
+CompactTrieDictionary::data() const {
+ return fData;
+}
+
+// This function finds the address of a node for us, given its node ID
+static inline const CompactTrieNode *
+getCompactNode(const CompactTrieHeader *header, uint16_t node) {
+ return (const CompactTrieNode *)((const uint8_t *)header + header->offsets[node]);
+}
+
+int32_t
+CompactTrieDictionary::matches( UText *text,
+ int32_t maxLength,
+ int32_t *lengths,
+ int &count,
+ int limit ) const {
+ // TODO: current implementation works in UTF-16 space
+ const CompactTrieNode *node = getCompactNode(fData, fData->root);
+ int mycount = 0;
+
+ UChar uc = utext_current32(text);
+ int i = 0;
+
+ while (node != NULL) {
+ // Check if the node we just exited ends a word
+ if (limit > 0 && (node->flagscount & kParentEndsWord)) {
+ lengths[mycount++] = i;
+ --limit;
+ }
+ // Check that we haven't exceeded the maximum number of input characters.
+ // We have to do that here rather than in the while condition so that
+ // we can check for ending a word, above.
+ if (i >= maxLength) {
+ break;
+ }
+
+ int nodeCount = (node->flagscount & kCountMask);
+ if (nodeCount == 0) {
+ // Special terminal node; return now
+ break;
+ }
+ if (node->flagscount & kVerticalNode) {
+ // Vertical node; check all the characters in it
+ const CompactTrieVerticalNode *vnode = (const CompactTrieVerticalNode *)node;
+ for (int j = 0; j < nodeCount && i < maxLength; ++j) {
+ if (uc != vnode->chars[j]) {
+ // We hit a non-equal character; return
+ goto exit;
+ }
+ utext_next32(text);
+ uc = utext_current32(text);
+ ++i;
+ }
+ // To get here we must have come through the whole list successfully;
+ // go on to the next node. Note that a word cannot end in the middle
+ // of a vertical node.
+ node = getCompactNode(fData, vnode->equal);
+ }
+ else {
+ // Horizontal node; do binary search
+ const CompactTrieHorizontalNode *hnode = (const CompactTrieHorizontalNode *)node;
+ int low = 0;
+ int high = nodeCount-1;
+ int middle;
+ node = NULL; // If we don't find a match, we'll fall out of the loop
+ while (high >= low) {
+ middle = (high+low)/2;
+ if (uc == hnode->entries[middle].ch) {
+ // We hit a match; get the next node and next character
+ node = getCompactNode(fData, hnode->entries[middle].equal);
+ utext_next32(text);
+ uc = utext_current32(text);
+ ++i;
+ break;
+ }
+ else if (uc < hnode->entries[middle].ch) {
+ high = middle-1;
+ }
+ else {
+ low = middle+1;
+ }
+ }
+ }
+ }
+exit:
+ count = mycount;
+ return i;
+}
+
+// Implementation of iteration for CompactTrieDictionary
+class CompactTrieEnumeration : public StringEnumeration {
+private:
+ UVector32 fNodeStack; // Stack of nodes to process
+ UVector32 fIndexStack; // Stack of where in node we are
+ const CompactTrieHeader *fHeader; // Trie data
+ static const char fgClassID;
+
+public:
+ static UClassID U_EXPORT2 getStaticClassID(void) { return (UClassID)&fgClassID; }
+ virtual UClassID getDynamicClassID(void) const { return getStaticClassID(); }
+public:
+ CompactTrieEnumeration(const CompactTrieHeader *header, UErrorCode &status)
+ : fNodeStack(status), fIndexStack(status) {
+ fHeader = header;
+ fNodeStack.push(header->root, status);
+ fIndexStack.push(0, status);
+ unistr.remove();
+ }
+
+ virtual ~CompactTrieEnumeration() {
+ }
+
+ virtual StringEnumeration *clone() const {
+ UErrorCode status = U_ZERO_ERROR;
+ return new CompactTrieEnumeration(fHeader, status);
+ }
+
+ virtual const UnicodeString * snext(UErrorCode &status);
+
+ // Very expensive, but this should never be used.
+ virtual int32_t count(UErrorCode &status) const {
+ CompactTrieEnumeration counter(fHeader, status);
+ int32_t result = 0;
+ while (counter.snext(status) != NULL && U_SUCCESS(status)) {
+ ++result;
+ }
+ return result;
+ }
+
+ virtual void reset(UErrorCode &status) {
+ fNodeStack.removeAllElements();
+ fIndexStack.removeAllElements();
+ fNodeStack.push(fHeader->root, status);
+ fIndexStack.push(0, status);
+ unistr.remove();
+ }
+};
+
+const char CompactTrieEnumeration::fgClassID = '\0';
+
+const UnicodeString *
+CompactTrieEnumeration::snext(UErrorCode &status) {
+ if (fNodeStack.empty() || U_FAILURE(status)) {
+ return NULL;
+ }
+ const CompactTrieNode *node = getCompactNode(fHeader, fNodeStack.peeki());
+ int where = fIndexStack.peeki();
+ while (!fNodeStack.empty() && U_SUCCESS(status)) {
+ int nodeCount = (node->flagscount & kCountMask);
+ UBool goingDown = FALSE;
+ if (nodeCount == 0) {
+ // Terminal node; go up immediately
+ fNodeStack.popi();
+ fIndexStack.popi();
+ node = getCompactNode(fHeader, fNodeStack.peeki());
+ where = fIndexStack.peeki();
+ }
+ else if (node->flagscount & kVerticalNode) {
+ // Vertical node
+ const CompactTrieVerticalNode *vnode = (const CompactTrieVerticalNode *)node;
+ if (where == 0) {
+ // Going down
+ unistr.append((const UChar *)vnode->chars, (int32_t) nodeCount);
+ fIndexStack.setElementAt(1, fIndexStack.size()-1);
+ node = getCompactNode(fHeader, fNodeStack.push(vnode->equal, status));
+ where = fIndexStack.push(0, status);
+ goingDown = TRUE;
+ }
+ else {
+ // Going up
+ unistr.truncate(unistr.length()-nodeCount);
+ fNodeStack.popi();
+ fIndexStack.popi();
+ node = getCompactNode(fHeader, fNodeStack.peeki());
+ where = fIndexStack.peeki();
+ }
+ }
+ else {
+ // Horizontal node
+ const CompactTrieHorizontalNode *hnode = (const CompactTrieHorizontalNode *)node;
+ if (where > 0) {
+ // Pop previous char
+ unistr.truncate(unistr.length()-1);
+ }
+ if (where < nodeCount) {
+ // Push on next node
+ unistr.append((UChar)hnode->entries[where].ch);
+ fIndexStack.setElementAt(where+1, fIndexStack.size()-1);
+ node = getCompactNode(fHeader, fNodeStack.push(hnode->entries[where].equal, status));
+ where = fIndexStack.push(0, status);
+ goingDown = TRUE;
+ }
+ else {
+ // Going up
+ fNodeStack.popi();
+ fIndexStack.popi();
+ node = getCompactNode(fHeader, fNodeStack.peeki());
+ where = fIndexStack.peeki();
+ }
+ }
+ // Check if the parent of the node we've just gone down to ends a
+ // word. If so, return it.
+ if (goingDown && (node->flagscount & kParentEndsWord)) {
+ return &unistr;
+ }
+ }
+ return NULL;
+}
+
+StringEnumeration *
+CompactTrieDictionary::openWords( UErrorCode &status ) const {
+ if (U_FAILURE(status)) {
+ return NULL;
+ }
+ return new CompactTrieEnumeration(fData, status);
+}
+
+//
+// Below here is all code related to converting a ternary trie to a compact trie
+// and back again
+//
+
+// Helper classes to construct the compact trie
+class BuildCompactTrieNode: public UMemory {
+ public:
+ UBool fParentEndsWord;
+ UBool fVertical;
+ UBool fHasDuplicate;
+ int32_t fNodeID;
+ UnicodeString fChars;
+
+ public:
+ BuildCompactTrieNode(UBool parentEndsWord, UBool vertical, UStack &nodes, UErrorCode &status) {
+ fParentEndsWord = parentEndsWord;
+ fHasDuplicate = FALSE;
+ fVertical = vertical;
+ fNodeID = nodes.size();
+ nodes.push(this, status);
+ }
+
+ virtual ~BuildCompactTrieNode() {
+ }
+
+ virtual uint32_t size() {
+ return sizeof(uint16_t);
+ }
+
+ virtual void write(uint8_t *bytes, uint32_t &offset, const UVector32 &/*translate*/) {
+ // Write flag/count
+ *((uint16_t *)(bytes+offset)) = (fChars.length() & kCountMask)
+ | (fVertical ? kVerticalNode : 0) | (fParentEndsWord ? kParentEndsWord : 0 );
+ offset += sizeof(uint16_t);
+ }
+};
+
+class BuildCompactTrieHorizontalNode: public BuildCompactTrieNode {
+ public:
+ UStack fLinks;
+
+ public:
+ BuildCompactTrieHorizontalNode(UBool parentEndsWord, UStack &nodes, UErrorCode &status)
+ : BuildCompactTrieNode(parentEndsWord, FALSE, nodes, status), fLinks(status) {
+ }
+
+ virtual ~BuildCompactTrieHorizontalNode() {
+ }
+
+ virtual uint32_t size() {
+ return offsetof(CompactTrieHorizontalNode,entries) +
+ (fChars.length()*sizeof(CompactTrieHorizontalEntry));
+ }
+
+ virtual void write(uint8_t *bytes, uint32_t &offset, const UVector32 &translate) {
+ BuildCompactTrieNode::write(bytes, offset, translate);
+ int32_t count = fChars.length();
+ for (int32_t i = 0; i < count; ++i) {
+ CompactTrieHorizontalEntry *entry = (CompactTrieHorizontalEntry *)(bytes+offset);
+ entry->ch = fChars[i];
+ entry->equal = translate.elementAti(((BuildCompactTrieNode *)fLinks[i])->fNodeID);
+#ifdef DEBUG_TRIE_DICT
+ if (entry->equal == 0) {
+ fprintf(stderr, "ERROR: horizontal link %d, logical node %d maps to physical node zero\n",
+ i, ((BuildCompactTrieNode *)fLinks[i])->fNodeID);
+ }
+#endif
+ offset += sizeof(CompactTrieHorizontalEntry);
+ }
+ }
+
+ void addNode(UChar ch, BuildCompactTrieNode *link, UErrorCode &status) {
+ fChars.append(ch);
+ fLinks.push(link, status);
+ }
+};
+
+class BuildCompactTrieVerticalNode: public BuildCompactTrieNode {
+ public:
+ BuildCompactTrieNode *fEqual;
+
+ public:
+ BuildCompactTrieVerticalNode(UBool parentEndsWord, UStack &nodes, UErrorCode &status)
+ : BuildCompactTrieNode(parentEndsWord, TRUE, nodes, status) {
+ fEqual = NULL;
+ }
+
+ virtual ~BuildCompactTrieVerticalNode() {
+ }
+
+ virtual uint32_t size() {
+ return offsetof(CompactTrieVerticalNode,chars) + (fChars.length()*sizeof(uint16_t));
+ }
+
+ virtual void write(uint8_t *bytes, uint32_t &offset, const UVector32 &translate) {
+ CompactTrieVerticalNode *node = (CompactTrieVerticalNode *)(bytes+offset);
+ BuildCompactTrieNode::write(bytes, offset, translate);
+ node->equal = translate.elementAti(fEqual->fNodeID);
+ offset += sizeof(node->equal);
+#ifdef DEBUG_TRIE_DICT
+ if (node->equal == 0) {
+ fprintf(stderr, "ERROR: vertical link, logical node %d maps to physical node zero\n",
+ fEqual->fNodeID);
+ }
+#endif
+ fChars.extract(0, fChars.length(), (UChar *)node->chars);
+ offset += sizeof(uint16_t)*fChars.length();
+ }
+
+ void addChar(UChar ch) {
+ fChars.append(ch);
+ }
+
+ void setLink(BuildCompactTrieNode *node) {
+ fEqual = node;
+ }
+};
+
+// Forward declaration
+static void walkHorizontal(const TernaryNode *node,
+ BuildCompactTrieHorizontalNode *building,
+ UStack &nodes,
+ UErrorCode &status);
+
+// Convert one node. Uses recursion.
+
+static BuildCompactTrieNode *
+compactOneNode(const TernaryNode *node, UBool parentEndsWord, UStack &nodes, UErrorCode &status) {
+ if (U_FAILURE(status)) {
+ return NULL;
+ }
+ BuildCompactTrieNode *result = NULL;
+ UBool horizontal = (node->low != NULL || node->high != NULL);
+ if (horizontal) {
+ BuildCompactTrieHorizontalNode *hResult =
+ new BuildCompactTrieHorizontalNode(parentEndsWord, nodes, status);
+ if (hResult == NULL) {
+ status = U_MEMORY_ALLOCATION_ERROR;
+ }
+ if (U_SUCCESS(status)) {
+ walkHorizontal(node, hResult, nodes, status);
+ result = hResult;
+ }
+ }
+ else {
+ BuildCompactTrieVerticalNode *vResult =
+ new BuildCompactTrieVerticalNode(parentEndsWord, nodes, status);
+ if (vResult == NULL) {
+ status = U_MEMORY_ALLOCATION_ERROR;
+ }
+ if (U_SUCCESS(status)) {
+ UBool endsWord = FALSE;
+ // Take up nodes until we end a word, or hit a node with < or > links
+ do {
+ vResult->addChar(node->ch);
+ endsWord = (node->flags & kEndsWord) != 0;
+ node = node->equal;
+ }
+ while(node != NULL && !endsWord && node->low == NULL && node->high == NULL);
+ if (node == NULL) {
+ if (!endsWord) {
+ status = U_ILLEGAL_ARGUMENT_ERROR; // Corrupt input trie
+ }
+ else {
+ vResult->setLink((BuildCompactTrieNode *)nodes[1]);
+ }
+ }
+ else {
+ vResult->setLink(compactOneNode(node, endsWord, nodes, status));
+ }
+ result = vResult;
+ }
+ }
+ return result;
+}
+
+// Walk the set of peers at the same level, to build a horizontal node.
+// Uses recursion.
+
+static void walkHorizontal(const TernaryNode *node,
+ BuildCompactTrieHorizontalNode *building,
+ UStack &nodes,
+ UErrorCode &status) {
+ while (U_SUCCESS(status) && node != NULL) {
+ if (node->low != NULL) {
+ walkHorizontal(node->low, building, nodes, status);
+ }
+ BuildCompactTrieNode *link = NULL;
+ if (node->equal != NULL) {
+ link = compactOneNode(node->equal, (node->flags & kEndsWord) != 0, nodes, status);
+ }
+ else if (node->flags & kEndsWord) {
+ link = (BuildCompactTrieNode *)nodes[1];
+ }
+ if (U_SUCCESS(status) && link != NULL) {
+ building->addNode(node->ch, link, status);
+ }
+ // Tail recurse manually instead of leaving it to the compiler.
+ //if (node->high != NULL) {
+ // walkHorizontal(node->high, building, nodes, status);
+ //}
+ node = node->high;
+ }
+}
+
+U_NAMESPACE_END
+U_CDECL_BEGIN
+static int32_t U_CALLCONV
+_sortBuildNodes(const void * /*context*/, const void *voidl, const void *voidr) {
+ BuildCompactTrieNode *left = *(BuildCompactTrieNode **)voidl;
+ BuildCompactTrieNode *right = *(BuildCompactTrieNode **)voidr;
+ // Check for comparing a node to itself, to avoid spurious duplicates
+ if (left == right) {
+ return 0;
+ }
+ // Most significant is type of node. Can never coalesce.
+ if (left->fVertical != right->fVertical) {
+ return left->fVertical - right->fVertical;
+ }
+ // Next, the "parent ends word" flag. If that differs, we cannot coalesce.
+ if (left->fParentEndsWord != right->fParentEndsWord) {
+ return left->fParentEndsWord - right->fParentEndsWord;
+ }
+ // Next, the string. If that differs, we can never coalesce.
+ int32_t result = left->fChars.compare(right->fChars);
+ if (result != 0) {
+ return result;
+ }
+ // We know they're both the same node type, so branch for the two cases.
+ if (left->fVertical) {
+ result = ((BuildCompactTrieVerticalNode *)left)->fEqual->fNodeID
+ - ((BuildCompactTrieVerticalNode *)right)->fEqual->fNodeID;
+ }
+ else {
+ // We need to compare the links vectors. They should be the
+ // same size because the strings were equal.
+ // We compare the node IDs instead of the pointers, to handle
+ // coalesced nodes.
+ BuildCompactTrieHorizontalNode *hleft, *hright;
+ hleft = (BuildCompactTrieHorizontalNode *)left;
+ hright = (BuildCompactTrieHorizontalNode *)right;
+ int32_t count = hleft->fLinks.size();
+ for (int32_t i = 0; i < count && result == 0; ++i) {
+ result = ((BuildCompactTrieNode *)(hleft->fLinks[i]))->fNodeID -
+ ((BuildCompactTrieNode *)(hright->fLinks[i]))->fNodeID;
+ }
+ }
+ // If they are equal to each other, mark them (speeds coalescing)
+ if (result == 0) {
+ left->fHasDuplicate = TRUE;
+ right->fHasDuplicate = TRUE;
+ }
+ return result;
+}
+U_CDECL_END
+U_NAMESPACE_BEGIN
+
+static void coalesceDuplicates(UStack &nodes, UErrorCode &status) {
+ // We sort the array of nodes to place duplicates next to each other
+ if (U_FAILURE(status)) {
+ return;
+ }
+ int32_t size = nodes.size();
+ void **array = (void **)uprv_malloc(sizeof(void *)*size);
+ if (array == NULL) {
+ status = U_MEMORY_ALLOCATION_ERROR;
+ return;
+ }
+ (void) nodes.toArray(array);
+
+ // Now repeatedly identify duplicates until there are no more
+ int32_t dupes = 0;
+ long passCount = 0;
+#ifdef DEBUG_TRIE_DICT
+ long totalDupes = 0;
+#endif
+ do {
+ BuildCompactTrieNode *node;
+ BuildCompactTrieNode *first = NULL;
+ BuildCompactTrieNode **p;
+ BuildCompactTrieNode **pFirst = NULL;
+ int32_t counter = size - 2;
+ // Sort the array, skipping nodes 0 and 1. Use quicksort for the first
+ // pass for speed. For the second and subsequent passes, we use stable
+ // (insertion) sort for two reasons:
+ // 1. The array is already mostly ordered, so we get better performance.
+ // 2. The way we find one and only one instance of a set of duplicates is to
+ // check that the node ID equals the array index. If we used an unstable
+ // sort for the second or later passes, it's possible that none of the
+ // duplicates would wind up with a node ID equal to its array index.
+ // The sort stability guarantees that, because as we coalesce more and
+ // more groups, the first element of the resultant group will be one of
+ // the first elements of the groups being coalesced.
+ // To use quicksort for the second and subsequent passes, we would have to
+ // find the minimum of the node numbers in a group, and set all the nodes
+ // in the group to that node number.
+ uprv_sortArray(array+2, counter, sizeof(void *), _sortBuildNodes, NULL, (passCount > 0), &status);
+ dupes = 0;
+ for (p = (BuildCompactTrieNode **)array + 2; counter > 0; --counter, ++p) {
+ node = *p;
+ if (node->fHasDuplicate) {
+ if (first == NULL) {
+ first = node;
+ pFirst = p;
+ }
+ else if (_sortBuildNodes(NULL, pFirst, p) != 0) {
+ // Starting a new run of dupes
+ first = node;
+ pFirst = p;
+ }
+ else if (node->fNodeID != first->fNodeID) {
+ // Slave one to the other, note duplicate
+ node->fNodeID = first->fNodeID;
+ dupes += 1;
+ }
+ }
+ else {
+ // This node has no dupes
+ first = NULL;
+ pFirst = NULL;
+ }
+ }
+ passCount += 1;
+#ifdef DEBUG_TRIE_DICT
+ totalDupes += dupes;
+ fprintf(stderr, "Trie node dupe removal, pass %d: %d nodes tagged\n", passCount, dupes);
+#endif
+ }
+ while (dupes > 0);
+#ifdef DEBUG_TRIE_DICT
+ fprintf(stderr, "Trie node dupe removal complete: %d tagged in %d passes\n", totalDupes, passCount);
+#endif
+
+ // We no longer need the temporary array, as the nodes have all been marked appropriately.
+ uprv_free(array);
+}
+
+U_NAMESPACE_END
+U_CDECL_BEGIN
+static void U_CALLCONV _deleteBuildNode(void *obj) {
+ delete (BuildCompactTrieNode *) obj;
+}
+U_CDECL_END
+U_NAMESPACE_BEGIN
+
+CompactTrieHeader *
+CompactTrieDictionary::compactMutableTrieDictionary( const MutableTrieDictionary &dict,
+ UErrorCode &status ) {
+ if (U_FAILURE(status)) {
+ return NULL;
+ }
+#ifdef DEBUG_TRIE_DICT
+ struct tms timing;
+ struct tms previous;
+ (void) ::times(&previous);
+#endif
+ UStack nodes(_deleteBuildNode, NULL, status); // Index of nodes
+
+ // Add node 0, used as the NULL pointer/sentinel.
+ nodes.addElement((int32_t)0, status);
+
+ // Start by creating the special empty node we use to indicate that the parent
+ // terminates a word. This must be node 1, because the builder assumes
+ // that.
+ if (U_FAILURE(status)) {
+ return NULL;
+ }
+ BuildCompactTrieNode *terminal = new BuildCompactTrieNode(TRUE, FALSE, nodes, status);
+ if (terminal == NULL) {
+ status = U_MEMORY_ALLOCATION_ERROR;
+ }
+
+ // This call does all the work of building the new trie structure. The root
+ // will be node 2.
+ BuildCompactTrieNode *root = compactOneNode(dict.fTrie, FALSE, nodes, status);
+#ifdef DEBUG_TRIE_DICT
+ (void) ::times(&timing);
+ fprintf(stderr, "Compact trie built, %d nodes, time user %f system %f\n",
+ nodes.size(), (double)(timing.tms_utime-previous.tms_utime)/CLK_TCK,
+ (double)(timing.tms_stime-previous.tms_stime)/CLK_TCK);
+ previous = timing;
+#endif
+
+ // Now coalesce all duplicate nodes.
+ coalesceDuplicates(nodes, status);
+#ifdef DEBUG_TRIE_DICT
+ (void) ::times(&timing);
+ fprintf(stderr, "Duplicates coalesced, time user %f system %f\n",
+ (double)(timing.tms_utime-previous.tms_utime)/CLK_TCK,
+ (double)(timing.tms_stime-previous.tms_stime)/CLK_TCK);
+ previous = timing;
+#endif
+
+ // Next, build the output trie.
+ // First we compute all the sizes and build the node ID translation table.
+ uint32_t totalSize = offsetof(CompactTrieHeader,offsets);
+ int32_t count = nodes.size();
+ int32_t nodeCount = 1; // The sentinel node we already have
+ BuildCompactTrieNode *node;
+ UVector32 translate(count, status); // Should be no growth needed after this
+ translate.push(0, status); // The sentinel node
+
+ if (U_FAILURE(status)) {
+ return NULL;
+ }
+
+ for (int32_t i = 1; i < count; ++i) {
+ node = (BuildCompactTrieNode *)nodes[i];
+ if (node->fNodeID == i) {
+ // Only one node out of each duplicate set is used
+ if (i >= translate.size()) {
+ // Logically extend the mapping table
+ translate.setSize(i+1);
+ }
+ translate.setElementAt(nodeCount++, i);
+ totalSize += node->size();
+ }
+ }
+
+ // Check for overflowing 16 bits worth of nodes.
+ if (nodeCount > 0x10000) {
+ status = U_ILLEGAL_ARGUMENT_ERROR;
+ return NULL;
+ }
+
+ // Add enough room for the offsets.
+ totalSize += nodeCount*sizeof(uint32_t);
+#ifdef DEBUG_TRIE_DICT
+ (void) ::times(&timing);
+ fprintf(stderr, "Sizes/mapping done, time user %f system %f\n",
+ (double)(timing.tms_utime-previous.tms_utime)/CLK_TCK,
+ (double)(timing.tms_stime-previous.tms_stime)/CLK_TCK);
+ previous = timing;
+ fprintf(stderr, "%d nodes, %d unique, %d bytes\n", nodes.size(), nodeCount, totalSize);
+#endif
+ uint8_t *bytes = (uint8_t *)uprv_malloc(totalSize);
+ if (bytes == NULL) {
+ status = U_MEMORY_ALLOCATION_ERROR;
+ return NULL;
+ }
+
+ CompactTrieHeader *header = (CompactTrieHeader *)bytes;
+ header->size = totalSize;
+ header->nodeCount = nodeCount;
+ header->offsets[0] = 0; // Sentinel
+ header->root = translate.elementAti(root->fNodeID);
+#ifdef DEBUG_TRIE_DICT
+ if (header->root == 0) {
+ fprintf(stderr, "ERROR: root node %d translate to physical zero\n", root->fNodeID);
+ }
+#endif
+ uint32_t offset = offsetof(CompactTrieHeader,offsets)+(nodeCount*sizeof(uint32_t));
+ nodeCount = 1;
+ // Now write the data
+ for (int32_t i = 1; i < count; ++i) {
+ node = (BuildCompactTrieNode *)nodes[i];
+ if (node->fNodeID == i) {
+ header->offsets[nodeCount++] = offset;
+ node->write(bytes, offset, translate);
+ }
+ }
+#ifdef DEBUG_TRIE_DICT
+ (void) ::times(&timing);
+ fprintf(stderr, "Trie built, time user %f system %f\n",
+ (double)(timing.tms_utime-previous.tms_utime)/CLK_TCK,
+ (double)(timing.tms_stime-previous.tms_stime)/CLK_TCK);
+ previous = timing;
+ fprintf(stderr, "Final offset is %d\n", offset);
+
+ // Collect statistics on node types and sizes
+ int hCount = 0;
+ int vCount = 0;
+ size_t hSize = 0;
+ size_t vSize = 0;
+ size_t hItemCount = 0;
+ size_t vItemCount = 0;
+ uint32_t previousOff = offset;
+ for (uint16_t i = nodeCount-1; i >= 2; --i) {
+ const CompactTrieNode *node = getCompactNode(header, i);
+ if (node->flagscount & kVerticalNode) {
+ vCount += 1;
+ vItemCount += (node->flagscount & kCountMask);
+ vSize += previousOff-header->offsets[i];
+ }
+ else {
+ hCount += 1;
+ hItemCount += (node->flagscount & kCountMask);
+ hSize += previousOff-header->offsets[i];
+ }
+ previousOff = header->offsets[i];
+ }
+ fprintf(stderr, "Horizontal nodes: %d total, average %f bytes with %f items\n", hCount,
+ (double)hSize/hCount, (double)hItemCount/hCount);
+ fprintf(stderr, "Vertical nodes: %d total, average %f bytes with %f items\n", vCount,
+ (double)vSize/vCount, (double)vItemCount/vCount);
+#endif
+
+ if (U_FAILURE(status)) {
+ uprv_free(bytes);
+ header = NULL;
+ }
+ else {
+ header->magic = COMPACT_TRIE_MAGIC_1;
+ }
+ return header;
+}
+
+// Forward declaration
+static TernaryNode *
+unpackOneNode( const CompactTrieHeader *header, const CompactTrieNode *node, UErrorCode &status );
+
+
+// Convert a horizontal node (or subarray thereof) into a ternary subtrie
+static TernaryNode *
+unpackHorizontalArray( const CompactTrieHeader *header, const CompactTrieHorizontalEntry *array,
+ int low, int high, UErrorCode &status ) {
+ if (U_FAILURE(status) || low > high) {
+ return NULL;
+ }
+ int middle = (low+high)/2;
+ TernaryNode *result = new TernaryNode(array[middle].ch);
+ if (result == NULL) {
+ status = U_MEMORY_ALLOCATION_ERROR;
+ return NULL;
+ }
+ const CompactTrieNode *equal = getCompactNode(header, array[middle].equal);
+ if (equal->flagscount & kParentEndsWord) {
+ result->flags |= kEndsWord;
+ }
+ result->low = unpackHorizontalArray(header, array, low, middle-1, status);
+ result->high = unpackHorizontalArray(header, array, middle+1, high, status);
+ result->equal = unpackOneNode(header, equal, status);
+ return result;
+}
+
+// Convert one compact trie node into a ternary subtrie
+static TernaryNode *
+unpackOneNode( const CompactTrieHeader *header, const CompactTrieNode *node, UErrorCode &status ) {
+ int nodeCount = (node->flagscount & kCountMask);
+ if (nodeCount == 0 || U_FAILURE(status)) {
+ // Failure, or terminal node
+ return NULL;
+ }
+ if (node->flagscount & kVerticalNode) {
+ const CompactTrieVerticalNode *vnode = (const CompactTrieVerticalNode *)node;
+ TernaryNode *head = NULL;
+ TernaryNode *previous = NULL;
+ TernaryNode *latest = NULL;
+ for (int i = 0; i < nodeCount; ++i) {
+ latest = new TernaryNode(vnode->chars[i]);
+ if (latest == NULL) {
+ status = U_MEMORY_ALLOCATION_ERROR;
+ break;
+ }
+ if (head == NULL) {
+ head = latest;
+ }
+ if (previous != NULL) {
+ previous->equal = latest;
+ }
+ previous = latest;
+ }
+ if (latest != NULL) {
+ const CompactTrieNode *equal = getCompactNode(header, vnode->equal);
+ if (equal->flagscount & kParentEndsWord) {
+ latest->flags |= kEndsWord;
+ }
+ latest->equal = unpackOneNode(header, equal, status);
+ }
+ return head;
+ }
+ else {
+ // Horizontal node
+ const CompactTrieHorizontalNode *hnode = (const CompactTrieHorizontalNode *)node;
+ return unpackHorizontalArray(header, &hnode->entries[0], 0, nodeCount-1, status);
+ }
+}
+
+MutableTrieDictionary *
+CompactTrieDictionary::cloneMutable( UErrorCode &status ) const {
+ MutableTrieDictionary *result = new MutableTrieDictionary( status );
+ if (result == NULL) {
+ status = U_MEMORY_ALLOCATION_ERROR;
+ return NULL;
+ }
+ TernaryNode *root = unpackOneNode(fData, getCompactNode(fData, fData->root), status);
+ if (U_FAILURE(status)) {
+ delete root; // Clean up
+ delete result;
+ return NULL;
+ }
+ result->fTrie = root;
+ return result;
+}
+
+U_NAMESPACE_END
+
+U_CAPI int32_t U_EXPORT2
+triedict_swap(const UDataSwapper *ds, const void *inData, int32_t length, void *outData,
+ UErrorCode *status) {
+
+ if (status == NULL || U_FAILURE(*status)) {
+ return 0;
+ }
+ if(ds==NULL || inData==NULL || length<-1 || (length>0 && outData==NULL)) {
+ *status=U_ILLEGAL_ARGUMENT_ERROR;
+ return 0;
+ }
+
+ //
+ // Check that the data header is for for dictionary data.
+ // (Header contents are defined in genxxx.cpp)
+ //
+ const UDataInfo *pInfo = (const UDataInfo *)((const uint8_t *)inData+4);
+ if(!( pInfo->dataFormat[0]==0x54 && /* dataFormat="TrDc" */
+ pInfo->dataFormat[1]==0x72 &&
+ pInfo->dataFormat[2]==0x44 &&
+ pInfo->dataFormat[3]==0x63 &&
+ pInfo->formatVersion[0]==1 )) {
+ udata_printError(ds, "triedict_swap(): data format %02x.%02x.%02x.%02x (format version %02x) is not recognized\n",
+ pInfo->dataFormat[0], pInfo->dataFormat[1],
+ pInfo->dataFormat[2], pInfo->dataFormat[3],
+ pInfo->formatVersion[0]);
+ *status=U_UNSUPPORTED_ERROR;
+ return 0;
+ }
+
+ //
+ // Swap the data header. (This is the generic ICU Data Header, not the
+ // CompactTrieHeader). This swap also conveniently gets us
+ // the size of the ICU d.h., which lets us locate the start
+ // of the RBBI specific data.
+ //
+ int32_t headerSize=udata_swapDataHeader(ds, inData, length, outData, status);
+
+ //
+ // Get the CompactTrieHeader, and check that it appears to be OK.
+ //
+ const uint8_t *inBytes =(const uint8_t *)inData+headerSize;
+ const CompactTrieHeader *header = (const CompactTrieHeader *)inBytes;
+ if (ds->readUInt32(header->magic) != COMPACT_TRIE_MAGIC_1
+ || ds->readUInt32(header->size) < sizeof(CompactTrieHeader))
+ {
+ udata_printError(ds, "triedict_swap(): CompactTrieHeader is invalid.\n");
+ *status=U_UNSUPPORTED_ERROR;
+ return 0;
+ }
+
+ //
+ // Prefight operation? Just return the size
+ //
+ uint32_t totalSize = ds->readUInt32(header->size);
+ int32_t sizeWithUData = (int32_t)totalSize + headerSize;
+ if (length < 0) {
+ return sizeWithUData;
+ }
+
+ //
+ // Check that length passed in is consistent with length from RBBI data header.
+ //
+ if (length < sizeWithUData) {
+ udata_printError(ds, "triedict_swap(): too few bytes (%d after ICU Data header) for trie data.\n",
+ totalSize);
+ *status=U_INDEX_OUTOFBOUNDS_ERROR;
+ return 0;
+ }
+
+ //
+ // Swap the Data. Do the data itself first, then the CompactTrieHeader, because
+ // we need to reference the header to locate the data, and an
+ // inplace swap of the header leaves it unusable.
+ //
+ uint8_t *outBytes = (uint8_t *)outData + headerSize;
+ CompactTrieHeader *outputHeader = (CompactTrieHeader *)outBytes;
+
+#if 0
+ //
+ // If not swapping in place, zero out the output buffer before starting.
+ //
+ if (inBytes != outBytes) {
+ uprv_memset(outBytes, 0, totalSize);
+ }
+
+ // We need to loop through all the nodes in the offset table, and swap each one.
+ uint16_t nodeCount = ds->readUInt16(header->nodeCount);
+ // Skip node 0, which should always be 0.
+ for (int i = 1; i < nodeCount; ++i) {
+ uint32_t nodeOff = ds->readUInt32(header->offsets[i]);
+ const CompactTrieNode *inNode = (const CompactTrieNode *)(inBytes + nodeOff);
+ CompactTrieNode *outNode = (CompactTrieNode *)(outBytes + nodeOff);
+ uint16_t flagscount = ds->readUInt16(inNode->flagscount);
+ uint16_t itemCount = flagscount & kCountMask;
+ ds->writeUInt16(&outNode->flagscount, flagscount);
+ if (itemCount > 0) {
+ if (flagscount & kVerticalNode) {
+ ds->swapArray16(ds, inBytes+nodeOff+offsetof(CompactTrieVerticalNode,chars),
+ itemCount*sizeof(uint16_t),
+ outBytes+nodeOff+offsetof(CompactTrieVerticalNode,chars), status);
+ uint16_t equal = ds->readUInt16(inBytes+nodeOff+offsetof(CompactTrieVerticalNode,equal);
+ ds->writeUInt16(outBytes+nodeOff+offsetof(CompactTrieVerticalNode,equal));
+ }
+ else {
+ const CompactTrieHorizontalNode *inHNode = (const CompactTrieHorizontalNode *)inNode;
+ CompactTrieHorizontalNode *outHNode = (CompactTrieHorizontalNode *)outNode;
+ for (int j = 0; j < itemCount; ++j) {
+ uint16_t word = ds->readUInt16(inHNode->entries[j].ch);
+ ds->writeUInt16(&outHNode->entries[j].ch, word);
+ word = ds->readUInt16(inHNode->entries[j].equal);
+ ds->writeUInt16(&outHNode->entries[j].equal, word);
+ }
+ }
+ }
+ }
+#endif
+
+ // All the data in all the nodes consist of 16 bit items. Swap them all at once.
+ uint16_t nodeCount = ds->readUInt16(header->nodeCount);
+ uint32_t nodesOff = offsetof(CompactTrieHeader,offsets)+((uint32_t)nodeCount*sizeof(uint32_t));
+ ds->swapArray16(ds, inBytes+nodesOff, totalSize-nodesOff, outBytes+nodesOff, status);
+
+ // Swap the header
+ ds->writeUInt32(&outputHeader->size, totalSize);
+ uint32_t magic = ds->readUInt32(header->magic);
+ ds->writeUInt32(&outputHeader->magic, magic);
+ ds->writeUInt16(&outputHeader->nodeCount, nodeCount);
+ uint16_t root = ds->readUInt16(header->root);
+ ds->writeUInt16(&outputHeader->root, root);
+ ds->swapArray32(ds, inBytes+offsetof(CompactTrieHeader,offsets),
+ sizeof(uint32_t)*(int32_t)nodeCount,
+ outBytes+offsetof(CompactTrieHeader,offsets), status);
+
+ return sizeWithUData;
+}
+
+#endif /* #if !UCONFIG_NO_BREAK_ITERATION */
diff --git a/icuSources/common/triedict.h b/icuSources/common/triedict.h
new file mode 100644
index 00000000..b8796617
--- /dev/null
+++ b/icuSources/common/triedict.h
@@ -0,0 +1,346 @@
+/**
+ *******************************************************************************
+ * Copyright (C) 2006, International Business Machines Corporation and others. *
+ * All Rights Reserved. *
+ *******************************************************************************
+ */
+
+#ifndef TRIEDICT_H
+#define TRIEDICT_H
+
+#include "unicode/utypes.h"
+#include "unicode/uobject.h"
+#include "unicode/utext.h"
+
+struct UEnumeration;
+struct UDataSwapper;
+struct UDataMemory;
+
+ /**
+ * UDataSwapFn function for use in swapping a compact dictionary.
+ *
+ * @param ds Pointer to UDataSwapper containing global data about the
+ * transformation and function pointers for handling primitive
+ * types.
+ * @param inData Pointer to the input data to be transformed or examined.
+ * @param length Length of the data, counting bytes. May be -1 for preflighting.
+ * If length>=0, then transform the data.
+ * If length==-1, then only determine the length of the data.
+ * The length cannot be determined from the data itself for all
+ * types of data (e.g., not for simple arrays of integers).
+ * @param outData Pointer to the output data buffer.
+ * If length>=0 (transformation), then the output buffer must
+ * have a capacity of at least length.
+ * If length==-1, then outData will not be used and can be NULL.
+ * @param pErrorCode ICU UErrorCode parameter, must not be NULL and must
+ * fulfill U_SUCCESS on input.
+ * @return The actual length of the data.
+ *
+ * @see UDataSwapper
+ */
+
+U_CAPI int32_t U_EXPORT2
+triedict_swap(const UDataSwapper *ds,
+ const void *inData, int32_t length, void *outData,
+ UErrorCode *pErrorCode);
+
+U_NAMESPACE_BEGIN
+
+class StringEnumeration;
+struct CompactTrieHeader;
+
+/*******************************************************************
+ * TrieWordDictionary
+ */
+
+/**
+ * TrieWordDictionary is an abstract class that represents a word
+ * dictionary based on a trie. The base protocol is read-only.
+ * Subclasses may allow writing.
+ */
+class U_COMMON_API TrieWordDictionary : public UMemory {
+ public:
+
+ /**
+ * Default constructor.
+ *
+ */
+ TrieWordDictionary();
+
+ /**
+ * Virtual destructor.
+ */
+ virtual ~TrieWordDictionary();
+
+ /**
+ * Find dictionary words that match the text.
+ *
+ * @param text A UText representing the text. The
+ * iterator is left after the longest prefix match in the dictionary.
+ * @param start The current position in text.
+ * @param maxLength The maximum number of code units to match.
+ * @param lengths An array that is filled with the lengths of words that matched.
+ * @param count Filled with the number of elements output in lengths.
+ * @param limit The size of the lengths array; this limits the number of words output.
+ * @return The number of characters in text that were matched.
+ */
+ virtual int32_t matches( UText *text,
+ int32_t maxLength,
+ int32_t *lengths,
+ int &count,
+ int limit ) const = 0;
+
+ /**
+ * Return a StringEnumeration for iterating all the words in the dictionary.
+ *
+ * @param status A status code recording the success of the call.
+ * @return A StringEnumeration that will iterate through the whole dictionary.
+ * The caller is responsible for closing it. The order is unspecified.
+ */
+ virtual StringEnumeration *openWords( UErrorCode &status ) const = 0;
+
+};
+
+/*******************************************************************
+ * MutableTrieDictionary
+ */
+
+/**
+ * MutableTrieDictionary is a TrieWordDictionary that allows words to be
+ * added.
+ */
+
+struct TernaryNode; // Forwards declaration
+
+class U_COMMON_API MutableTrieDictionary : public TrieWordDictionary {
+ private:
+ /**
+ * The root node of the trie
+ * @internal
+ */
+
+ TernaryNode *fTrie;
+
+ /**
+ * A UText for internal use
+ * @internal
+ */
+
+ UText *fIter;
+
+ friend class CompactTrieDictionary; // For fast conversion
+
+ public:
+
+ /**
+ * Constructor.
+ *
+ * @param median A UChar around which to balance the trie. Ideally, it should
+ * begin at least one word that is near the median of the set in the dictionary
+ * @param status A status code recording the success of the call.
+ */
+ MutableTrieDictionary( UChar median, UErrorCode &status );
+
+ /**
+ * Virtual destructor.
+ */
+ virtual ~MutableTrieDictionary();
+
+ /**
+ * Find dictionary words that match the text.
+ *
+ * @param text A UText representing the text. The
+ * iterator is left after the longest prefix match in the dictionary.
+ * @param maxLength The maximum number of code units to match.
+ * @param lengths An array that is filled with the lengths of words that matched.
+ * @param count Filled with the number of elements output in lengths.
+ * @param limit The size of the lengths array; this limits the number of words output.
+ * @return The number of characters in text that were matched.
+ */
+ virtual int32_t matches( UText *text,
+ int32_t maxLength,
+ int32_t *lengths,
+ int &count,
+ int limit ) const;
+
+ /**
+ * Return a StringEnumeration for iterating all the words in the dictionary.
+ *
+ * @param status A status code recording the success of the call.
+ * @return A StringEnumeration that will iterate through the whole dictionary.
+ * The caller is responsible for closing it. The order is unspecified.
+ */
+ virtual StringEnumeration *openWords( UErrorCode &status ) const;
+
+ /**
+ * Add one word to the dictionary.
+ *
+ * @param word A UChar buffer containing the word.
+ * @param length The length of the word.
+ * @param status The resultant status
+ */
+ virtual void addWord( const UChar *word,
+ int32_t length,
+ UErrorCode &status);
+
+#if 0
+ /**
+ * Add all strings from a UEnumeration to the dictionary.
+ *
+ * @param words A UEnumeration that will return the desired words.
+ * @param status The resultant status
+ */
+ virtual void addWords( UEnumeration *words, UErrorCode &status );
+#endif
+
+protected:
+ /**
+ * Search the dictionary for matches.
+ *
+ * @param text A UText representing the text. The
+ * iterator is left after the longest prefix match in the dictionary.
+ * @param maxLength The maximum number of code units to match.
+ * @param lengths An array that is filled with the lengths of words that matched.
+ * @param count Filled with the number of elements output in lengths.
+ * @param limit The size of the lengths array; this limits the number of words output.
+ * @param parent The parent of the current node
+ * @param pMatched The returned parent node matched the input
+ * @return The number of characters in text that were matched.
+ */
+ virtual int32_t search( UText *text,
+ int32_t maxLength,
+ int32_t *lengths,
+ int &count,
+ int limit,
+ TernaryNode *&parent,
+ UBool &pMatched ) const;
+
+private:
+ /**
+ * Private constructor. The root node it not allocated.
+ *
+ * @param status A status code recording the success of the call.
+ */
+ MutableTrieDictionary( UErrorCode &status );
+};
+
+/*******************************************************************
+ * CompactTrieDictionary
+ */
+
+/**
+ * CompactTrieDictionary is a TrieWordDictionary that has been compacted
+ * to save space.
+ */
+class U_COMMON_API CompactTrieDictionary : public TrieWordDictionary {
+ private:
+ /**
+ * The root node of the trie
+ */
+
+ const CompactTrieHeader *fData;
+
+ /**
+ * A UBool indicating whether or not we own the fData.
+ */
+
+ UBool fOwnData;
+
+ UDataMemory *fUData;
+ public:
+ /**
+ * Construct a dictionary from a UDataMemory.
+ *
+ * @param data A pointer to a UDataMemory, which is adopted
+ * @param status A status code giving the result of the constructor
+ */
+ CompactTrieDictionary(UDataMemory *dataObj, UErrorCode &status);
+
+ /**
+ * Construct a dictionary from raw saved data.
+ *
+ * @param data A pointer to the raw data, which is still owned by the caller
+ * @param status A status code giving the result of the constructor
+ */
+ CompactTrieDictionary(const void *dataObj, UErrorCode &status);
+
+ /**
+ * Construct a dictionary from a MutableTrieDictionary.
+ *
+ * @param dict The dictionary to use as input.
+ * @param status A status code recording the success of the call.
+ */
+ CompactTrieDictionary( const MutableTrieDictionary &dict, UErrorCode &status );
+
+ /**
+ * Virtual destructor.
+ */
+ virtual ~CompactTrieDictionary();
+
+ /**
+ * Find dictionary words that match the text.
+ *
+ * @param text A UText representing the text. The
+ * iterator is left after the longest prefix match in the dictionary.
+ * @param maxLength The maximum number of code units to match.
+ * @param lengths An array that is filled with the lengths of words that matched.
+ * @param count Filled with the number of elements output in lengths.
+ * @param limit The size of the lengths array; this limits the number of words output.
+ * @return The number of characters in text that were matched.
+ */
+ virtual int32_t matches( UText *text,
+ int32_t rangeEnd,
+ int32_t *lengths,
+ int &count,
+ int limit ) const;
+
+ /**
+ * Return a StringEnumeration for iterating all the words in the dictionary.
+ *
+ * @param status A status code recording the success of the call.
+ * @return A StringEnumeration that will iterate through the whole dictionary.
+ * The caller is responsible for closing it. The order is unspecified.
+ */
+ virtual StringEnumeration *openWords( UErrorCode &status ) const;
+
+ /**
+ * Return the size of the compact data.
+ *
+ * @return The size of the dictionary's compact data.
+ */
+ virtual uint32_t dataSize() const;
+
+ /**
+ * Return a void * pointer to the compact data, platform-endian.
+ *
+ * @return The data for the compact dictionary, suitable for passing to the
+ * constructor.
+ */
+ virtual const void *data() const;
+
+ /**
+ * Return a MutableTrieDictionary clone of this dictionary.
+ *
+ * @param status A status code recording the success of the call.
+ * @return A MutableTrieDictionary with the same data as this dictionary
+ */
+ virtual MutableTrieDictionary *cloneMutable( UErrorCode &status ) const;
+
+ private:
+
+ /**
+ * Convert a MutableTrieDictionary into a compact data blob.
+ *
+ * @param dict The dictionary to convert.
+ * @param status A status code recording the success of the call.
+ * @return A single data blob starting with a CompactTrieHeader.
+ */
+ static CompactTrieHeader *compactMutableTrieDictionary( const MutableTrieDictionary &dict,
+ UErrorCode &status );
+
+};
+
+U_NAMESPACE_END
+
+ /* TRIEDICT_H */
+#endif
diff --git a/icuSources/common/ubidi.c b/icuSources/common/ubidi.c
index 2e7713f0..bccdbfaa 100644
--- a/icuSources/common/ubidi.c
+++ b/icuSources/common/ubidi.c
@@ -1,7 +1,7 @@
-/*
+/*
******************************************************************************
*
-* Copyright (C) 1999-2004, International Business Machines
+* Copyright (C) 1999-2006, International Business Machines
* Corporation and others. All Rights Reserved.
*
******************************************************************************
@@ -24,6 +24,7 @@
#include "unicode/ustring.h"
#include "unicode/uchar.h"
#include "unicode/ubidi.h"
+#include "ubidi_props.h"
#include "ubidiimp.h"
/*
@@ -52,7 +53,7 @@
* that look at immediately surrounding types.
*
* As a related topic, this implementation does not remove Boundary Neutral
- * types from the input, but ignores them whereever this is relevant.
+ * types from the input, but ignores them wherever this is relevant.
* For example, the loop for the resolution of the weak types reads
* types until it finds a non-BN.
* Also, explicit embedding codes are neither changed into BN nor removed.
@@ -119,7 +120,7 @@ static const Flags flagO[2]={ DIRPROP_FLAG(LRO), DIRPROP_FLAG(RLO) };
/* UBiDi object management -------------------------------------------------- */
U_CAPI UBiDi * U_EXPORT2
-ubidi_open(void)
+ubidi_open(void)
{
UErrorCode errorCode=U_ZERO_ERROR;
return ubidi_openSized(0, 0, &errorCode);
@@ -147,6 +148,13 @@ ubidi_openSized(int32_t maxLength, int32_t maxRunCount, UErrorCode *pErrorCode)
/* reset the object, all pointers NULL, all flags FALSE, all sizes 0 */
uprv_memset(pBiDi, 0, sizeof(UBiDi));
+ /* get BiDi properties */
+ pBiDi->bdp=ubidi_getSingleton(pErrorCode);
+ if(U_FAILURE(*pErrorCode)) {
+ uprv_free(pBiDi);
+ return NULL;
+ }
+
/* allocate memory for arrays as requested */
if(maxLength>0) {
if( !getInitialDirPropsMemory(pBiDi, maxLength) ||
@@ -207,6 +215,9 @@ ubidi_getMemory(void **pMemory, int32_t *pSize, UBool mayAllocate, int32_t sizeN
/* not enough memory, and we must not allocate */
return FALSE;
} else if(sizeNeeded!=*pSize && mayAllocate) {
+ /* FOOD FOR THOUGHT: in hope to improve performance, we should
+ * try never shrinking memory, only growing it when required.
+ */
/* we may try to grow or shrink */
void *memory;
@@ -228,6 +239,7 @@ ubidi_getMemory(void **pMemory, int32_t *pSize, UBool mayAllocate, int32_t sizeN
U_CAPI void U_EXPORT2
ubidi_close(UBiDi *pBiDi) {
if(pBiDi!=NULL) {
+ pBiDi->pParaBiDi=NULL; /* in case one tries to reuse this block */
if(pBiDi->dirPropsMemory!=NULL) {
uprv_free(pBiDi->dirPropsMemory);
}
@@ -237,6 +249,13 @@ ubidi_close(UBiDi *pBiDi) {
if(pBiDi->runsMemory!=NULL) {
uprv_free(pBiDi->runsMemory);
}
+ if(pBiDi->parasMemory!=NULL) {
+ uprv_free(pBiDi->parasMemory);
+ }
+ if(pBiDi->insertPoints.points!=NULL) {
+ uprv_free(pBiDi->insertPoints.points);
+ }
+
uprv_free(pBiDi);
}
}
@@ -247,6 +266,8 @@ U_CAPI void U_EXPORT2
ubidi_setInverse(UBiDi *pBiDi, UBool isInverse) {
if(pBiDi!=NULL) {
pBiDi->isInverse=isInverse;
+ pBiDi->reorderingMode = isInverse ? UBIDI_REORDER_INVERSE_NUMBERS_AS_L
+ : UBIDI_REORDER_DEFAULT;
}
}
@@ -259,81 +280,223 @@ ubidi_isInverse(UBiDi *pBiDi) {
}
}
+/* FOOD FOR THOUGHT: currently the reordering modes are a mixture of
+ * algorithm for direct BiDi, algorithm for inverse BiDi and the bizarre
+ * concept of RUNS_ONLY which is a double operation.
+ * It could be advantageous to divide this into 3 concepts:
+ * a) Operation: direct / inverse / RUNS_ONLY
+ * b) Direct algorithm: default / NUMBERS_SPECIAL / GROUP_NUMBERS_WITH_L
+ * c) Inverse algorithm: default / INVERSE_LIKE_DIRECT / NUMBERS_SPECIAL
+ * This would allow combinations not possible today like RUNS_ONLY with
+ * NUMBERS_SPECIAL.
+ * Also allow to set INSERT_MARKS for the direct step of RUNS_ONLY and
+ * REMOVE_CONTROLS for the inverse step.
+ * Not all combinations would be supported, and probably not all do make sense.
+ * This would need to document which ones are supported and what are the
+ * fallbacks for unsupported combinations.
+ */
+U_CAPI void U_EXPORT2
+ubidi_setReorderingMode(UBiDi *pBiDi, UBiDiReorderingMode reorderingMode) {
+ if ((pBiDi != NULL) && (reorderingMode >= UBIDI_REORDER_DEFAULT)
+ && (reorderingMode < UBIDI_REORDER_COUNT)) {
+ pBiDi->reorderingMode = reorderingMode;
+ pBiDi->isInverse = reorderingMode == UBIDI_REORDER_INVERSE_NUMBERS_AS_L;
+ }
+}
+
+U_CAPI UBiDiReorderingMode U_EXPORT2
+ubidi_getReorderingMode(UBiDi *pBiDi) {
+ if (pBiDi != NULL) {
+ return pBiDi->reorderingMode;
+ } else {
+ return UBIDI_REORDER_DEFAULT;
+ }
+}
+
+U_CAPI void U_EXPORT2
+ubidi_setReorderingOptions(UBiDi *pBiDi, uint32_t reorderingOptions) {
+ if (reorderingOptions & UBIDI_OPTION_REMOVE_CONTROLS) {
+ reorderingOptions&=~UBIDI_OPTION_INSERT_MARKS;
+ }
+ if (pBiDi != NULL) {
+ pBiDi->reorderingOptions = reorderingOptions;
+ }
+}
+
+U_CAPI uint32_t U_EXPORT2
+ubidi_getReorderingOptions(UBiDi *pBiDi) {
+ if (pBiDi != NULL) {
+ return pBiDi->reorderingOptions;
+ } else {
+ return 0;
+ }
+}
+
/* perform (P2)..(P3) ------------------------------------------------------- */
/*
* Get the directional properties for the text,
* calculate the flags bit-set, and
- * determine the partagraph level if necessary.
+ * determine the paragraph level if necessary.
*/
static void
-getDirProps(UBiDi *pBiDi, const UChar *text) {
+getDirProps(UBiDi *pBiDi) {
+ const UChar *text=pBiDi->text;
DirProp *dirProps=pBiDi->dirPropsMemory; /* pBiDi->dirProps is const */
- int32_t i=0, i0, i1, length=pBiDi->length;
+ int32_t i=0, i0, i1, length=pBiDi->originalLength;
Flags flags=0; /* collect all directionalities in the text */
UChar32 uchar;
- DirProp dirProp;
-
- if(IS_DEFAULT_LEVEL(pBiDi->paraLevel)) {
- /* determine the paragraph level (P2..P3) */
- for(;;) {
- i0=i; /* index of first code unit */
- UTF_NEXT_CHAR(text, i, length, uchar);
- i1=i-1; /* index of last code unit, gets the directional property */
- flags|=DIRPROP_FLAG(dirProps[i1]=dirProp=u_charDirection(uchar));
- if(i1>i0) { /* set previous code units' properties to BN */
- flags|=DIRPROP_FLAG(BN);
- do {
- dirProps[--i1]=BN;
- } while(i1>i0);
- }
-
- if(dirProp==L) {
- pBiDi->paraLevel=0;
- break;
- } else if(dirProp==R || dirProp==AL) {
- pBiDi->paraLevel=1;
- break;
- } else if(i>=length) {
- /*
- * see comment in ubidi.h:
- * the DEFAULT_XXX values are designed so that
- * their bit 0 alone yields the intended default
- */
- pBiDi->paraLevel&=1;
- break;
- }
- }
+ DirProp dirProp=0, paraDirDefault=0;/* initialize to avoid compiler warnings */
+ UBool isDefaultLevel=IS_DEFAULT_LEVEL(pBiDi->paraLevel);
+ /* for inverse BiDi, the default para level is set to RTL if there is a
+ strong character at either end of the text */
+ UBool isDefaultLevelInverse=isDefaultLevel &&
+ (pBiDi->reorderingMode==UBIDI_REORDER_INVERSE_LIKE_DIRECT ||
+ pBiDi->reorderingMode==UBIDI_REORDER_INVERSE_FOR_NUMBERS_SPECIAL);
+ int32_t lastArabicPos=-1;
+ int32_t controlCount=0;
+ UBool removeBiDiControls = pBiDi->reorderingOptions &
+ UBIDI_OPTION_REMOVE_CONTROLS;
+
+ typedef enum {
+ NOT_CONTEXTUAL, /* 0: not contextual paraLevel */
+ LOOKING_FOR_STRONG, /* 1: looking for first strong char */
+ FOUND_STRONG_CHAR /* 2: found first strong char */
+ } State;
+ State state;
+ int32_t paraStart=0; /* index of first char in paragraph */
+ DirProp paraDir; /* == CONTEXT_RTL within paragraphs
+ starting with strong R char */
+ DirProp lastStrongDir=0; /* for default level & inverse BiDi */
+ int32_t lastStrongLTR=0; /* for STREAMING option */
+
+ if(pBiDi->reorderingOptions & UBIDI_OPTION_STREAMING) {
+ pBiDi->length=0;
+ lastStrongLTR=0;
+ }
+ if(isDefaultLevel) {
+ paraDirDefault=pBiDi->paraLevel&1 ? CONTEXT_RTL : 0;
+ paraDir=paraDirDefault;
+ lastStrongDir=paraDirDefault;
+ state=LOOKING_FOR_STRONG;
} else {
- flags|=DIRPROP_FLAG_LR(pBiDi->paraLevel);
+ state=NOT_CONTEXTUAL;
+ paraDir=0;
}
-
- /* get the rest of the directional properties and the flags bits */
- while(ii0) { /* set previous code units' properties to BN */
flags|=DIRPROP_FLAG(BN);
do {
- dirProps[--i1]=BN;
+ dirProps[--i1]=BN|paraDir;
} while(i1>i0);
}
+ if(state==LOOKING_FOR_STRONG) {
+ if(dirProp==L) {
+ state=FOUND_STRONG_CHAR;
+ if(paraDir) {
+ paraDir=0;
+ for(i1=paraStart; i1reorderingOptions & UBIDI_OPTION_STREAMING) {
+ pBiDi->length=i; /* i is index to next character */
+ }
+ if(isDefaultLevelInverse && (lastStrongDir==CONTEXT_RTL) &&(paraDir!=lastStrongDir)) {
+ for( ; paraStartparaCount++;
+ }
+ if(isDefaultLevel) {
+ state=LOOKING_FOR_STRONG;
+ paraStart=i; /* i is index to next character */
+ paraDir=paraDirDefault;
+ lastStrongDir=paraDirDefault;
+ }
+ }
+ }
+ if(removeBiDiControls && IS_BIDI_CONTROL_CHAR(uchar)) {
+ controlCount++;
+ }
}
- if(flags&MASK_EMBEDDING) {
- flags|=DIRPROP_FLAG_LR(pBiDi->paraLevel);
+ if(isDefaultLevelInverse && (lastStrongDir==CONTEXT_RTL) &&(paraDir!=lastStrongDir)) {
+ for(i1=paraStart; i1paraLevel=GET_PARALEVEL(pBiDi, 0);
+ }
+ if(pBiDi->reorderingOptions & UBIDI_OPTION_STREAMING) {
+ if((lastStrongLTR>pBiDi->length) &&
+ (GET_PARALEVEL(pBiDi, lastStrongLTR)==0)) {
+ pBiDi->length = lastStrongLTR;
+ }
+ if(pBiDi->lengthoriginalLength) {
+ pBiDi->paraCount--;
+ }
+ }
+ /* The following line does nothing new for contextual paraLevel, but is
+ needed for absolute paraLevel. */
+ flags|=DIRPROP_FLAG_LR(pBiDi->paraLevel);
+
+ if(pBiDi->orderParagraphsLTR && (flags&DIRPROP_FLAG(B))) {
+ flags|=DIRPROP_FLAG(L);
}
+ pBiDi->controlCount = controlCount;
pBiDi->flags=flags;
+ pBiDi->lastArabicPos=lastArabicPos;
}
/* perform (X1)..(X9) ------------------------------------------------------- */
/* determine if the text is mixed-directional or single-directional */
static UBiDiDirection
-directionFromFlags(Flags flags) {
+directionFromFlags(UBiDi *pBiDi) {
+ Flags flags=pBiDi->flags;
/* if the text contains AN and neutrals, then some neutrals may become RTL */
if(!(flags&MASK_RTL || ((flags&DIRPROP_FLAG(AN)) && (flags&MASK_POSSIBLE_N)))) {
return UBIDI_LTR;
@@ -400,23 +563,29 @@ static UBiDiDirection
resolveExplicitLevels(UBiDi *pBiDi) {
const DirProp *dirProps=pBiDi->dirProps;
UBiDiLevel *levels=pBiDi->levels;
-
+ const UChar *text=pBiDi->text;
+
int32_t i=0, length=pBiDi->length;
Flags flags=pBiDi->flags; /* collect all directionalities in the text */
DirProp dirProp;
- UBiDiLevel level=pBiDi->paraLevel;
+ UBiDiLevel level=GET_PARALEVEL(pBiDi, 0);
UBiDiDirection direction;
+ int32_t paraIndex=0;
/* determine if the text is mixed-directional or single-directional */
- direction=directionFromFlags(flags);
+ direction=directionFromFlags(pBiDi);
- /* we may not need to resolve any explicit levels */
- if(direction!=UBIDI_MIXED) {
+ /* we may not need to resolve any explicit levels, but for multiple
+ paragraphs we want to loop on all chars to set the para boundaries */
+ if((direction!=UBIDI_MIXED) && (pBiDi->paraCount==1)) {
/* not mixed directionality: levels don't matter - trailingWSStart will be 0 */
- } else if(!(flags&MASK_EXPLICIT) || pBiDi->isInverse) {
+ } else if((pBiDi->paraCount==1) &&
+ (!(flags&MASK_EXPLICIT) ||
+ (pBiDi->reorderingMode > UBIDI_REORDER_LAST_LOGICAL_TO_VISUAL))) {
/* mixed, but all characters are at the same embedding level */
/* or we are in "inverse BiDi" */
+ /* and we don't have contextual multiple paragraphs with some B char */
/* set all levels to the paragraph level */
for(i=0; iparaLevel;
+ level=GET_PARALEVEL(pBiDi, i);
+ if((i+1)paras[paraIndex++]=i+1;
+ }
+ }
flags|=DIRPROP_FLAG(B);
break;
case BN:
@@ -533,13 +706,17 @@ resolveExplicitLevels(UBiDi *pBiDi) {
if(flags&MASK_EMBEDDING) {
flags|=DIRPROP_FLAG_LR(pBiDi->paraLevel);
}
+ if(pBiDi->orderParagraphsLTR && (flags&DIRPROP_FLAG(B))) {
+ flags|=DIRPROP_FLAG(L);
+ }
/* subsequently, ignore the explicit codes and BN (X9) */
/* again, determine if the text is mixed-directional or single-directional */
pBiDi->flags=flags;
- direction=directionFromFlags(flags);
+ direction=directionFromFlags(pBiDi);
}
+
return direction;
}
@@ -556,27 +733,38 @@ resolveExplicitLevels(UBiDi *pBiDi) {
static UBiDiDirection
checkExplicitLevels(UBiDi *pBiDi, UErrorCode *pErrorCode) {
const DirProp *dirProps=pBiDi->dirProps;
+ DirProp dirProp;
UBiDiLevel *levels=pBiDi->levels;
-
+ const UChar *text=pBiDi->text;
+
int32_t i, length=pBiDi->length;
Flags flags=0; /* collect all directionalities in the text */
- UBiDiLevel level, paraLevel=pBiDi->paraLevel;
+ UBiDiLevel level;
+ uint32_t paraIndex=0;
for(i=0; iparas[paraIndex++]=i+1;
+ }
+ }
}
if(flags&MASK_EMBEDDING) {
flags|=DIRPROP_FLAG_LR(pBiDi->paraLevel);
@@ -584,7 +772,408 @@ checkExplicitLevels(UBiDi *pBiDi, UErrorCode *pErrorCode) {
/* determine if the text is mixed-directional or single-directional */
pBiDi->flags=flags;
- return directionFromFlags(flags);
+ return directionFromFlags(pBiDi);
+}
+
+/*********************************************************************/
+/* The Properties state machine table */
+/*********************************************************************/
+/* */
+/* All table cells are 8 bits: */
+/* bits 0..4: next state */
+/* bits 5..7: action to perform (if > 0) */
+/* */
+/* Cells may be of format "n" where n represents the next state */
+/* (except for the rightmost column). */
+/* Cells may also be of format "_(x,y)" where x represents an action */
+/* to perform and y represents the next state. */
+/* */
+/*********************************************************************/
+/* Definitions and type for properties state table */
+/*********************************************************************/
+#define IMPTABPROPS_COLUMNS 14
+#define IMPTABPROPS_RES (IMPTABPROPS_COLUMNS - 1)
+#define GET_STATEPROPS(cell) ((cell)&0x1f)
+#define GET_ACTIONPROPS(cell) ((cell)>>5)
+#define _(action, newState) ((uint8_t)(newState+(action<<5)))
+
+static const uint8_t groupProp[] = /* dirProp regrouped */
+{
+/* L R EN ES ET AN CS B S WS ON LRE LRO AL RLE RLO PDF NSM BN */
+ 0, 1, 2, 7, 8, 3, 9, 6, 5, 4, 4, 10, 10, 12, 10, 10, 10, 11, 10
+};
+enum { _L=0, _R=1, _EN=2, _AN=3, _ON=4, _S=5, _B=6 }; /* reduced dirProp */
+
+/*********************************************************************/
+/* */
+/* PROPERTIES STATE TABLE */
+/* */
+/* In table impTabProps, */
+/* - the ON column regroups ON and WS */
+/* - the BN column regroups BN, LRE, RLE, LRO, RLO, PDF */
+/* - the Res column is the reduced property assigned to a run */
+/* */
+/* Action 1: process current run1, init new run1 */
+/* 2: init new run2 */
+/* 3: process run1, process run2, init new run1 */
+/* 4: process run1, set run1=run2, init new run2 */
+/* */
+/* Notes: */
+/* 1) This table is used in resolveImplicitLevels(). */
+/* 2) This table triggers actions when there is a change in the Bidi*/
+/* property of incoming characters (action 1). */
+/* 3) Most such property sequences are processed immediately (in */
+/* fact, passed to processPropertySeq(). */
+/* 4) However, numbers are assembled as one sequence. This means */
+/* that undefined situations (like CS following digits, until */
+/* it is known if the next char will be a digit) are held until */
+/* following chars define them. */
+/* Example: digits followed by CS, then comes another CS or ON; */
+/* the digits will be processed, then the CS assigned */
+/* as the start of an ON sequence (action 3). */
+/* 5) There are cases where more than one sequence must be */
+/* processed, for instance digits followed by CS followed by L: */
+/* the digits must be processed as one sequence, and the CS */
+/* must be processed as an ON sequence, all this before starting */
+/* assembling chars for the opening L sequence. */
+/* */
+/* */
+static const uint8_t impTabProps[][IMPTABPROPS_COLUMNS] =
+{
+/* L , R , EN , AN , ON , S , B , ES , ET , CS , BN , NSM , AL , Res */
+/* 0 Init */ { 1 , 2 , 4 , 5 , 7 , 15 , 17 , 7 , 9 , 7 , 0 , 7 , 3 , _ON },
+/* 1 L */ { 1 , _(1,2), _(1,4), _(1,5), _(1,7),_(1,15),_(1,17), _(1,7), _(1,9), _(1,7), 1 , 1 , _(1,3), _L },
+/* 2 R */ { _(1,1), 2 , _(1,4), _(1,5), _(1,7),_(1,15),_(1,17), _(1,7), _(1,9), _(1,7), 2 , 2 , _(1,3), _R },
+/* 3 AL */ { _(1,1), _(1,2), _(1,6), _(1,6), _(1,8),_(1,16),_(1,17), _(1,8), _(1,8), _(1,8), 3 , 3 , 3 , _R },
+/* 4 EN */ { _(1,1), _(1,2), 4 , _(1,5), _(1,7),_(1,15),_(1,17),_(2,10), 11 ,_(2,10), 4 , 4 , _(1,3), _EN },
+/* 5 AN */ { _(1,1), _(1,2), _(1,4), 5 , _(1,7),_(1,15),_(1,17), _(1,7), _(1,9),_(2,12), 5 , 5 , _(1,3), _AN },
+/* 6 AL:EN/AN */ { _(1,1), _(1,2), 6 , 6 , _(1,8),_(1,16),_(1,17), _(1,8), _(1,8),_(2,13), 6 , 6 , _(1,3), _AN },
+/* 7 ON */ { _(1,1), _(1,2), _(1,4), _(1,5), 7 ,_(1,15),_(1,17), 7 ,_(2,14), 7 , 7 , 7 , _(1,3), _ON },
+/* 8 AL:ON */ { _(1,1), _(1,2), _(1,6), _(1,6), 8 ,_(1,16),_(1,17), 8 , 8 , 8 , 8 , 8 , _(1,3), _ON },
+/* 9 ET */ { _(1,1), _(1,2), 4 , _(1,5), 7 ,_(1,15),_(1,17), 7 , 9 , 7 , 9 , 9 , _(1,3), _ON },
+/*10 EN+ES/CS */ { _(3,1), _(3,2), 4 , _(3,5), _(4,7),_(3,15),_(3,17), _(4,7),_(4,14), _(4,7), 10 , _(4,7), _(3,3), _EN },
+/*11 EN+ET */ { _(1,1), _(1,2), 4 , _(1,5), _(1,7),_(1,15),_(1,17), _(1,7), 11 , _(1,7), 11 , 11 , _(1,3), _EN },
+/*12 AN+CS */ { _(3,1), _(3,2), _(3,4), 5 , _(4,7),_(3,15),_(3,17), _(4,7),_(4,14), _(4,7), 12 , _(4,7), _(3,3), _AN },
+/*13 AL:EN/AN+CS */ { _(3,1), _(3,2), 6 , 6 , _(4,8),_(3,16),_(3,17), _(4,8), _(4,8), _(4,8), 13 , _(4,8), _(3,3), _AN },
+/*14 ON+ET */ { _(1,1), _(1,2), _(4,4), _(1,5), 7 ,_(1,15),_(1,17), 7 , 14 , 7 , 14 , 14 , _(1,3), _ON },
+/*15 S */ { _(1,1), _(1,2), _(1,4), _(1,5), _(1,7), 15 ,_(1,17), _(1,7), _(1,9), _(1,7), 15 , _(1,7), _(1,3), _S },
+/*16 AL:S */ { _(1,1), _(1,2), _(1,6), _(1,6), _(1,8), 16 ,_(1,17), _(1,8), _(1,8), _(1,8), 16 , _(1,8), _(1,3), _S },
+/*17 B */ { _(1,1), _(1,2), _(1,4), _(1,5), _(1,7),_(1,15), 17 , _(1,7), _(1,9), _(1,7), 17 , _(1,7), _(1,3), _B }
+};
+
+/* we must undef macro _ because the levels table have a different
+ * structure (4 bits for action and 4 bits for next state.
+ */
+#undef _
+
+/*********************************************************************/
+/* The levels state machine tables */
+/*********************************************************************/
+/* */
+/* All table cells are 8 bits: */
+/* bits 0..3: next state */
+/* bits 4..7: action to perform (if > 0) */
+/* */
+/* Cells may be of format "n" where n represents the next state */
+/* (except for the rightmost column). */
+/* Cells may also be of format "_(x,y)" where x represents an action */
+/* to perform and y represents the next state. */
+/* */
+/* This format limits each table to 16 states each and to 15 actions.*/
+/* */
+/*********************************************************************/
+/* Definitions and type for levels state tables */
+/*********************************************************************/
+#define IMPTABLEVELS_COLUMNS (_B + 2)
+#define IMPTABLEVELS_RES (IMPTABLEVELS_COLUMNS - 1)
+#define GET_STATE(cell) ((cell)&0x0f)
+#define GET_ACTION(cell) ((cell)>>4)
+#define _(action, newState) ((uint8_t)(newState+(action<<4)))
+
+typedef uint8_t ImpTab[][IMPTABLEVELS_COLUMNS];
+typedef uint8_t ImpAct[];
+
+/* FOOD FOR THOUGHT: each ImpTab should have its associated ImpAct,
+ * instead of having a pair of ImpTab and a pair of ImpAct.
+ */
+typedef struct ImpTabPair {
+ ImpTab * pImpTab[2];
+ ImpAct * pImpAct[2];
+} ImpTabPair;
+
+/*********************************************************************/
+/* */
+/* LEVELS STATE TABLES */
+/* */
+/* In all levels state tables, */
+/* - state 0 is the initial state */
+/* - the Res column is the increment to add to the text level */
+/* for this property sequence. */
+/* */
+/* The impAct arrays for each table of a pair map the local action */
+/* numbers of the table to the total list of actions. For instance, */
+/* action 2 in a given table corresponds to the action number which */
+/* appears in entry [2] of the impAct array for that table. */
+/* The first entry of all impAct arrays must be 0. */
+/* */
+/* Action 1: init conditional sequence */
+/* 2: prepend conditional sequence to current sequence */
+/* 3: set ON sequence to new level - 1 */
+/* 4: init EN/AN/ON sequence */
+/* 5: fix EN/AN/ON sequence followed by R */
+/* 6: set previous level sequence to level 2 */
+/* */
+/* Notes: */
+/* 1) These tables are used in processPropertySeq(). The input */
+/* is property sequences as determined by resolveImplicitLevels. */
+/* 2) Most such property sequences are processed immediately */
+/* (levels are assigned). */
+/* 3) However, some sequences cannot be assigned a final level till */
+/* one or more following sequences are received. For instance, */
+/* ON following an R sequence within an even-level paragraph. */
+/* If the following sequence is R, the ON sequence will be */
+/* assigned basic run level+1, and so will the R sequence. */
+/* 4) S is generally handled like ON, since its level will be fixed */
+/* to paragraph level in adjustWSLevels(). */
+/* */
+
+static const ImpTab impTabL_DEFAULT = /* Even paragraph level */
+/* In this table, conditional sequences receive the higher possible level
+ until proven otherwise.
+*/
+{
+/* L , R , EN , AN , ON , S , B , Res */
+/* 0 : init */ { 0 , 1 , 0 , 2 , 0 , 0 , 0 , 0 },
+/* 1 : R */ { 0 , 1 , 3 , 3 , _(1,4), _(1,4), 0 , 1 },
+/* 2 : AN */ { 0 , 1 , 0 , 2 , _(1,5), _(1,5), 0 , 2 },
+/* 3 : R+EN/AN */ { 0 , 1 , 3 , 3 , _(1,4), _(1,4), 0 , 2 },
+/* 4 : R+ON */ { _(2,0), 1 , 3 , 3 , 4 , 4 , _(2,0), 1 },
+/* 5 : AN+ON */ { _(2,0), 1 , _(2,0), 2 , 5 , 5 , _(2,0), 1 }
+};
+static const ImpTab impTabR_DEFAULT = /* Odd paragraph level */
+/* In this table, conditional sequences receive the lower possible level
+ until proven otherwise.
+*/
+{
+/* L , R , EN , AN , ON , S , B , Res */
+/* 0 : init */ { 1 , 0 , 2 , 2 , 0 , 0 , 0 , 0 },
+/* 1 : L */ { 1 , 0 , 1 , 3 , _(1,4), _(1,4), 0 , 1 },
+/* 2 : EN/AN */ { 1 , 0 , 2 , 2 , 0 , 0 , 0 , 1 },
+/* 3 : L+AN */ { 1 , 0 , 1 , 3 , 5 , 5 , 0 , 1 },
+/* 4 : L+ON */ { _(2,1), 0 , _(2,1), 3 , 4 , 4 , 0 , 0 },
+/* 5 : L+AN+ON */ { 1 , 0 , 1 , 3 , 5 , 5 , 0 , 0 }
+};
+static const ImpAct impAct0 = {0,1,2,3,4,5,6};
+static const ImpTabPair impTab_DEFAULT = {{(ImpTab*)&impTabL_DEFAULT,
+ (ImpTab*)&impTabR_DEFAULT},
+ {(ImpAct*)&impAct0, (ImpAct*)&impAct0}};
+
+static const ImpTab impTabL_NUMBERS_SPECIAL = /* Even paragraph level */
+/* In this table, conditional sequences receive the higher possible level
+ until proven otherwise.
+*/
+{
+/* L , R , EN , AN , ON , S , B , Res */
+/* 0 : init */ { 0 , 2 , 1 , 1 , 0 , 0 , 0 , 0 },
+/* 1 : L+EN/AN */ { 0 , 2 , 1 , 1 , 0 , 0 , 0 , 2 },
+/* 2 : R */ { 0 , 2 , 4 , 4 , _(1,3), 0 , 0 , 1 },
+/* 3 : R+ON */ { _(2,0), 2 , 4 , 4 , 3 , 3 , _(2,0), 1 },
+/* 4 : R+EN/AN */ { 0 , 2 , 4 , 4 , _(1,3), _(1,3), 0 , 2 }
+ };
+static const ImpTabPair impTab_NUMBERS_SPECIAL = {{(ImpTab*)&impTabL_NUMBERS_SPECIAL,
+ (ImpTab*)&impTabR_DEFAULT},
+ {(ImpAct*)&impAct0, (ImpAct*)&impAct0}};
+
+static const ImpTab impTabL_GROUP_NUMBERS_WITH_R =
+/* In this table, EN/AN+ON sequences receive levels as if associated with R
+ until proven that there is L or sor/eor on both sides. AN is handled like EN.
+*/
+{
+/* L , R , EN , AN , ON , S , B , Res */
+/* 0 init */ { 0 , 3 , _(1,1), _(1,1), 0 , 0 , 0 , 0 },
+/* 1 EN/AN */ { _(2,0), 3 , 1 , 1 , 2 , _(2,0), _(2,0), 2 },
+/* 2 EN/AN+ON */ { _(2,0), 3 , 1 , 1 , 2 , _(2,0), _(2,0), 1 },
+/* 3 R */ { 0 , 3 , 5 , 5 , _(1,4), 0 , 0 , 1 },
+/* 4 R+ON */ { _(2,0), 3 , 5 , 5 , 4 , _(2,0), _(2,0), 1 },
+/* 5 R+EN/AN */ { 0 , 3 , 5 , 5 , _(1,4), 0 , 0 , 2 }
+};
+static const ImpTab impTabR_GROUP_NUMBERS_WITH_R =
+/* In this table, EN/AN+ON sequences receive levels as if associated with R
+ until proven that there is L on both sides. AN is handled like EN.
+*/
+{
+/* L , R , EN , AN , ON , S , B , Res */
+/* 0 init */ { 2 , 0 , 1 , 1 , 0 , 0 , 0 , 0 },
+/* 1 EN/AN */ { 2 , 0 , 1 , 1 , 0 , 0 , 0 , 1 },
+/* 2 L */ { 2 , 0 , _(1,4), _(1,4), _(1,3), 0 , 0 , 1 },
+/* 3 L+ON */ { _(2,2), 0 , 4 , 4 , 3 , 0 , 0 , 0 },
+/* 4 L+EN/AN */ { _(2,2), 0 , 4 , 4 , 3 , 0 , 0 , 1 }
+};
+static const ImpTabPair impTab_GROUP_NUMBERS_WITH_R = {
+ {(ImpTab*)&impTabL_GROUP_NUMBERS_WITH_R,
+ (ImpTab*)&impTabR_GROUP_NUMBERS_WITH_R},
+ {(ImpAct*)&impAct0, (ImpAct*)&impAct0}};
+
+
+static const ImpTab impTabL_INVERSE_NUMBERS_AS_L =
+/* This table is identical to the Default LTR table except that EN and AN are
+ handled like L.
+*/
+{
+/* L , R , EN , AN , ON , S , B , Res */
+/* 0 : init */ { 0 , 1 , 0 , 0 , 0 , 0 , 0 , 0 },
+/* 1 : R */ { 0 , 1 , 0 , 0 , _(1,4), _(1,4), 0 , 1 },
+/* 2 : AN */ { 0 , 1 , 0 , 0 , _(1,5), _(1,5), 0 , 2 },
+/* 3 : R+EN/AN */ { 0 , 1 , 0 , 0 , _(1,4), _(1,4), 0 , 2 },
+/* 4 : R+ON */ { _(2,0), 1 , _(2,0), _(2,0), 4 , 4 , _(2,0), 1 },
+/* 5 : AN+ON */ { _(2,0), 1 , _(2,0), _(2,0), 5 , 5 , _(2,0), 1 }
+};
+static const ImpTab impTabR_INVERSE_NUMBERS_AS_L =
+/* This table is identical to the Default RTL table except that EN and AN are
+ handled like L.
+*/
+{
+/* L , R , EN , AN , ON , S , B , Res */
+/* 0 : init */ { 1 , 0 , 1 , 1 , 0 , 0 , 0 , 0 },
+/* 1 : L */ { 1 , 0 , 1 , 1 , _(1,4), _(1,4), 0 , 1 },
+/* 2 : EN/AN */ { 1 , 0 , 1 , 1 , 0 , 0 , 0 , 1 },
+/* 3 : L+AN */ { 1 , 0 , 1 , 1 , 5 , 5 , 0 , 1 },
+/* 4 : L+ON */ { _(2,1), 0 , _(2,1), _(2,1), 4 , 4 , 0 , 0 },
+/* 5 : L+AN+ON */ { 1 , 0 , 1 , 1 , 5 , 5 , 0 , 0 }
+};
+static const ImpTabPair impTab_INVERSE_NUMBERS_AS_L = {
+ {(ImpTab*)&impTabL_INVERSE_NUMBERS_AS_L,
+ (ImpTab*)&impTabR_INVERSE_NUMBERS_AS_L},
+ {(ImpAct*)&impAct0, (ImpAct*)&impAct0}};
+
+static const ImpTab impTabR_INVERSE_LIKE_DIRECT = /* Odd paragraph level */
+/* In this table, conditional sequences receive the lower possible level
+ until proven otherwise.
+*/
+{
+/* L , R , EN , AN , ON , S , B , Res */
+/* 0 : init */ { 1 , 0 , 2 , 2 , 0 , 0 , 0 , 0 },
+/* 1 : L */ { 1 , 0 , 1 , 2 , _(1,3), _(1,3), 0 , 1 },
+/* 2 : EN/AN */ { 1 , 0 , 2 , 2 , 0 , 0 , 0 , 1 },
+/* 3 : L+ON */ { _(2,1), _(3,0), 6 , 4 , 3 , 3 , _(3,0), 0 },
+/* 4 : L+ON+AN */ { _(2,1), _(3,0), 6 , 4 , 5 , 5 , _(3,0), 3 },
+/* 5 : L+AN+ON */ { _(2,1), _(3,0), 6 , 4 , 5 , 5 , _(3,0), 2 },
+/* 6 : L+ON+EN */ { _(2,1), _(3,0), 6 , 4 , 3 , 3 , _(3,0), 1 }
+};
+static const ImpAct impAct1 = {0,1,11,12};
+/* FOOD FOR THOUGHT: in LTR table below, check case "JKL 123abc"
+ */
+static const ImpTabPair impTab_INVERSE_LIKE_DIRECT = {
+ {(ImpTab*)&impTabL_DEFAULT,
+ (ImpTab*)&impTabR_INVERSE_LIKE_DIRECT},
+ {(ImpAct*)&impAct0, (ImpAct*)&impAct1}};
+
+static const ImpTab impTabL_INVERSE_LIKE_DIRECT_WITH_MARKS =
+/* The case handled in this table is (visually): R EN L
+*/
+{
+/* L , R , EN , AN , ON , S , B , Res */
+/* 0 : init */ { 0 , _(6,3), 0 , 1 , 0 , 0 , 0 , 0 },
+/* 1 : L+AN */ { 0 , _(6,3), 0 , 1 , _(1,2), _(3,0), 0 , 4 },
+/* 2 : L+AN+ON */ { _(2,0), _(6,3), _(2,0), 1 , 2 , _(3,0), _(2,0), 3 },
+/* 3 : R */ { 0 , _(6,3), _(5,5), _(5,6), _(1,4), _(3,0), 0 , 3 },
+/* 4 : R+ON */ { _(3,0), _(4,3), _(5,5), _(5,6), 4 , _(3,0), _(3,0), 3 },
+/* 5 : R+EN */ { _(3,0), _(4,3), 5 , _(5,6), _(1,4), _(3,0), _(3,0), 4 },
+/* 6 : R+AN */ { _(3,0), _(4,3), _(5,5), 6 , _(1,4), _(3,0), _(3,0), 4 }
+};
+static const ImpTab impTabR_INVERSE_LIKE_DIRECT_WITH_MARKS =
+/* The cases handled in this table are (visually): R EN L
+ R L AN L
+*/
+{
+/* L , R , EN , AN , ON , S , B , Res */
+/* 0 : init */ { _(1,3), 0 , 1 , 1 , 0 , 0 , 0 , 0 },
+/* 1 : R+EN/AN */ { _(2,3), 0 , 1 , 1 , 2 , _(4,0), 0 , 1 },
+/* 2 : R+EN/AN+ON */ { _(2,3), 0 , 1 , 1 , 2 , _(4,0), 0 , 0 },
+/* 3 : L */ { 3 , 0 , 3 , _(3,6), _(1,4), _(4,0), 0 , 1 },
+/* 4 : L+ON */ { _(5,3), _(4,0), 5 , _(3,6), 4 , _(4,0), _(4,0), 0 },
+/* 5 : L+ON+EN */ { _(5,3), _(4,0), 5 , _(3,6), 4 , _(4,0), _(4,0), 1 },
+/* 6 : L+AN */ { _(5,3), _(4,0), 6 , 6 , 4 , _(4,0), _(4,0), 3 }
+};
+static const ImpAct impAct2 = {0,1,7,8,9,10};
+static const ImpTabPair impTab_INVERSE_LIKE_DIRECT_WITH_MARKS = {
+ {(ImpTab*)&impTabL_INVERSE_LIKE_DIRECT_WITH_MARKS,
+ (ImpTab*)&impTabR_INVERSE_LIKE_DIRECT_WITH_MARKS},
+ {(ImpAct*)&impAct0, (ImpAct*)&impAct2}};
+
+static const ImpTabPair impTab_INVERSE_FOR_NUMBERS_SPECIAL = {
+ {(ImpTab*)&impTabL_NUMBERS_SPECIAL,
+ (ImpTab*)&impTabR_INVERSE_LIKE_DIRECT},
+ {(ImpAct*)&impAct0, (ImpAct*)&impAct1}};
+
+static const ImpTab impTabL_INVERSE_FOR_NUMBERS_SPECIAL_WITH_MARKS =
+/* The case handled in this table is (visually): R EN L
+*/
+{
+/* L , R , EN , AN , ON , S , B , Res */
+/* 0 : init */ { 0 , _(6,2), 1 , 1 , 0 , 0 , 0 , 0 },
+/* 1 : L+EN/AN */ { 0 , _(6,2), 1 , 1 , 0 , _(3,0), 0 , 4 },
+/* 2 : R */ { 0 , _(6,2), _(5,4), _(5,4), _(1,3), _(3,0), 0 , 3 },
+/* 3 : R+ON */ { _(3,0), _(4,2), _(5,4), _(5,4), 3 , _(3,0), _(3,0), 3 },
+/* 4 : R+EN/AN */ { _(3,0), _(4,2), 4 , 4 , _(1,3), _(3,0), _(3,0), 4 }
+};
+static const ImpTabPair impTab_INVERSE_FOR_NUMBERS_SPECIAL_WITH_MARKS = {
+ {(ImpTab*)&impTabL_INVERSE_FOR_NUMBERS_SPECIAL_WITH_MARKS,
+ (ImpTab*)&impTabR_INVERSE_LIKE_DIRECT_WITH_MARKS},
+ {(ImpAct*)&impAct0, (ImpAct*)&impAct2}};
+
+#undef _
+
+typedef struct {
+ ImpTab * pImpTab; /* level table pointer */
+ ImpAct * pImpAct; /* action map array */
+ int32_t startON; /* start of ON sequence */
+ int32_t startL2EN; /* start of level 2 sequence */
+ int32_t lastStrongRTL; /* index of last found R or AL */
+ int32_t state; /* current state */
+ UBiDiLevel runLevel; /* run level before implicit solving */
+} LevState;
+
+/*------------------------------------------------------------------------*/
+
+static void
+addPoint(UBiDi *pBiDi, int32_t pos, int32_t flag)
+ /* param pos: position where to insert
+ param flag: one of LRM_BEFORE, LRM_AFTER, RLM_BEFORE, RLM_AFTER
+ */
+{
+#define FIRSTALLOC 10
+ Point point;
+ InsertPoints * pInsertPoints=&(pBiDi->insertPoints);
+
+ if (pInsertPoints->capacity == 0)
+ {
+ pInsertPoints->points=uprv_malloc(sizeof(Point)*FIRSTALLOC);
+ if (pInsertPoints->points == NULL)
+ {
+ pInsertPoints->errorCode=U_MEMORY_ALLOCATION_ERROR;
+ return;
+ }
+ pInsertPoints->capacity=FIRSTALLOC;
+ }
+ if (pInsertPoints->size >= pInsertPoints->capacity) /* no room for new point */
+ {
+ void * savePoints=pInsertPoints->points;
+ pInsertPoints->points=uprv_realloc(pInsertPoints->points,
+ pInsertPoints->capacity*2*sizeof(Point));
+ if (pInsertPoints->points == NULL)
+ {
+ pInsertPoints->points=savePoints;
+ pInsertPoints->errorCode=U_MEMORY_ALLOCATION_ERROR;
+ return;
+ }
+ else pInsertPoints->capacity*=2;
+ }
+ point.pos=pos;
+ point.flag=flag;
+ pInsertPoints->points[pInsertPoints->size]=point;
+ pInsertPoints->size++;
+#undef FIRSTALLOC
}
/* perform rules (Wn), (Nn), and (In) on a run of the text ------------------ */
@@ -595,16 +1184,6 @@ checkExplicitLevels(UBiDi *pBiDi, UErrorCode *pErrorCode) {
* (except for W5: sequences of ET) and keeps track of changes
* in a rule Wp that affect a later Wq (pdirProps;
- UBiDiLevel *levels=pBiDi->levels;
-
- int32_t i, next, neutralStart=-1;
- DirProp prevDirProp, dirProp, nextDirProp, lastStrong, beforeNeutral=L;
- UBiDiLevel numberLevel;
- uint8_t historyOfEN;
-
- /* initialize: current at sor, next at start (it is startisInverse) {
- /*
- * For "inverse BiDi", we set the levels of numbers just like for
- * regular L characters, plus a flag that ubidi_getRuns() will use
- * to set a similar flag on the corresponding output run.
- */
- numberLevel=levels[start];
- if(numberLevel&1) {
- ++numberLevel;
- }
- } else {
- /* normal BiDi: least greater even level */
- numberLevel=(UBiDiLevel)((levels[start]+2)&~1);
- }
-
- /*
- * In all steps of this implementation, BN and explicit embedding codes
- * must be treated as if they didn't exist (X9).
- * They will get levels set before a non-neutral character, and remain
- * undefined before a neutral one, but adjustWSLevels() will take care
- * of all of them.
- */
- while(DIRPROP_FLAG(nextDirProp)&MASK_BN_EXPLICIT) {
- if(++nextpImpTab;
+ ImpAct * pImpAct=pLevState->pImpAct;
+ UBiDiLevel * levels=pBiDi->levels;
+ UBiDiLevel level, addLevel;
+ InsertPoints * pInsertPoints;
+ int32_t start0, k;
+
+ start0=start; /* save original start position */
+ oldStateSeq=pLevState->state;
+ cell=(*pImpTab)[oldStateSeq][_prop];
+ pLevState->state=GET_STATE(cell); /* isolate the new state */
+ actionSeq=(*pImpAct)[GET_ACTION(cell)]; /* isolate the action */
+ addLevel=(*pImpTab)[pLevState->state][IMPTABLEVELS_RES];
+
+ if(actionSeq) {
+ switch(actionSeq) {
+ case 1: /* init ON seq */
+ pLevState->startON=start0;
break;
- }
- }
- /*
- * Note: at the end of this file, there is a prototype
- * of a version of this function that uses a statetable
- * at the core of this state machine.
- * If you make changes to this state machine,
- * please update that prototype as well.
- */
+ case 2: /* prepend ON seq to current seq */
+ start=pLevState->startON;
+ break;
- /* loop for entire run */
- while(nextstartL2EN >= 0) {
+ addPoint(pBiDi, pLevState->startL2EN, LRM_BEFORE);
}
- } while(DIRPROP_FLAG(nextDirProp)&MASK_BN_EXPLICIT);
- historyOfEN<<=EN_SHIFT;
-
- /* (W1..W7) */
- switch(dirProp) {
- case L:
- lastStrong=L;
- break;
- case R:
- lastStrong=R;
- break;
- case AL:
- /* (W3) */
- lastStrong=AL;
- dirProp=R;
- break;
- case EN:
- /* we have to set historyOfEN correctly */
- if(lastStrong==AL) {
- /* (W2) */
- dirProp=AN;
- } else {
- if(lastStrong==L) {
- /* (W7) */
- dirProp=L;
+ pLevState->startL2EN=-1; /* not within previous if since could also be -2 */
+ /* check if we had any relevant EN/AN after R/AL */
+ pInsertPoints=&(pBiDi->insertPoints);
+ if ((pInsertPoints->capacity == 0) ||
+ (pInsertPoints->size <= pInsertPoints->confirmed))
+ {
+ /* nothing, just clean up */
+ pLevState->lastStrongRTL=-1;
+ /* check if we have a pending conditional segment */
+ level=(*pImpTab)[oldStateSeq][IMPTABLEVELS_RES];
+ if ((level & 1) && (pLevState->startON > 0)) { /* after ON */
+ start=pLevState->startON; /* reset to basic run level */
}
- /* this EN stays after (W2) and (W4) - at least before (W7) */
- historyOfEN|=EN_ALL;
- }
- break;
- case ES:
- if( historyOfEN&PREV_EN_AFTER_W2 && /* previous was EN before (W4) */
- nextDirProp==EN && lastStrong!=AL /* next is EN and (W2) won't make it AN */
- ) {
- /* (W4) */
- if(lastStrong!=L) {
- dirProp=EN;
- } else {
- /* (W7) */
- dirProp=L;
+ if (_prop == _S) /* add LRM before S */
+ {
+ addPoint(pBiDi, start0, LRM_BEFORE);
+ pInsertPoints->confirmed=pInsertPoints->size;
}
- historyOfEN|=EN_AFTER_W4;
- } else {
- /* (W6) */
- dirProp=ON;
+ break;
}
- break;
- case CS:
- if( historyOfEN&PREV_EN_AFTER_W2 && /* previous was EN before (W4) */
- nextDirProp==EN && lastStrong!=AL /* next is EN and (W2) won't make it AN */
- ) {
- /* (W4) */
- if(lastStrong!=L) {
- dirProp=EN;
- } else {
- /* (W7) */
- dirProp=L;
- }
- historyOfEN|=EN_AFTER_W4;
- } else if(prevDirProp==AN && /* previous was AN */
- (nextDirProp==AN || /* next is AN */
- (nextDirProp==EN && lastStrong==AL)) /* or (W2) will make it one */
- ) {
- /* (W4) */
- dirProp=AN;
- } else {
- /* (W6) */
- dirProp=ON;
+ /* reset previous RTL cont to level for LTR text */
+ for (k=pLevState->lastStrongRTL+1; kconfirmed=pInsertPoints->size;
+ pLevState->lastStrongRTL=-1;
+ if (_prop == _S) /* add LRM before S */
+ {
+ addPoint(pBiDi, start0, LRM_BEFORE);
+ pInsertPoints->confirmed=pInsertPoints->size;
}
+ break;
- /* now process the sequence of ET like a single ET */
- if((historyOfEN&PREV_EN_AFTER_W4) || /* previous was EN before (W5) */
- (nextDirProp==EN && lastStrong!=AL) /* next is EN and (W2) won't make it AN */
- ) {
- /* (W5) */
- if(lastStrong!=L) {
- dirProp=EN;
- } else {
- /* (W7) */
- dirProp=L;
+ case 4: /* R/AL after possible relevant EN/AN */
+ /* just clean up */
+ pInsertPoints=&(pBiDi->insertPoints);
+ if (pInsertPoints->capacity > 0)
+ /* remove all non confirmed insert points */
+ pInsertPoints->size=pInsertPoints->confirmed;
+ pLevState->startON=-1;
+ pLevState->startL2EN=-1;
+ pLevState->lastStrongRTL=limit - 1;
+ break;
+
+ case 5: /* EN/AN after R/AL + possible cont */
+ /* check for real AN */
+ if ((_prop == _AN) && (NO_CONTEXT_RTL(pBiDi->dirProps[start0]) == AN) &&
+ (pBiDi->reorderingMode!=UBIDI_REORDER_INVERSE_FOR_NUMBERS_SPECIAL))
+ {
+ /* real AN */
+ if (pLevState->startL2EN == -1) /* if no relevant EN already found */
+ {
+ /* just note the righmost digit as a strong RTL */
+ pLevState->lastStrongRTL=limit - 1;
+ break;
}
- } else {
- /* (W6) */
- dirProp=ON;
+ if (pLevState->startL2EN >= 0) /* after EN, no AN */
+ {
+ addPoint(pBiDi, pLevState->startL2EN, LRM_BEFORE);
+ pLevState->startL2EN=-2;
+ }
+ /* note AN */
+ addPoint(pBiDi, start0, LRM_BEFORE);
+ break;
+ }
+ /* if first EN/AN after R/AL */
+ if (pLevState->startL2EN == -1) {
+ pLevState->startL2EN=start0;
}
+ break;
- /* apply the result of (W1), (W5)..(W7) to the entire sequence of ET */
+ case 6: /* note location of latest R/AL */
+ pLevState->lastStrongRTL=limit - 1;
+ pLevState->startON=-1;
break;
- case NSM:
- /* (W1) */
- dirProp=prevDirProp;
- /* set historyOfEN back to prevDirProp's historyOfEN */
- historyOfEN>>=EN_SHIFT;
- /*
- * Technically, this should be done before the switch() in the form
- * if(nextDirProp==NSM) {
- * dirProps[next]=nextDirProp=dirProp;
- * }
- *
- * - effectively one iteration ahead.
- * However, whether the next dirProp is NSM or is equal to the current dirProp
- * does not change the outcome of any condition in (W2)..(W7).
- */
+
+ case 7: /* L after R+ON/EN/AN */
+ /* include possible adjacent number on the left */
+ for (k=start0-1; k>=0 && !(levels[k]&1); k--);
+ if(k>=0) {
+ addPoint(pBiDi, k, RLM_BEFORE); /* add RLM before */
+ pInsertPoints=&(pBiDi->insertPoints);
+ pInsertPoints->confirmed=pInsertPoints->size; /* confirm it */
+ }
+ pLevState->startON=start0;
break;
- default:
+
+ case 8: /* AN after L */
+ /* AN numbers between L text on both sides may be trouble. */
+ /* tentatively bracket with LRMs; will be confirmed if followed by L */
+ addPoint(pBiDi, start0, LRM_BEFORE); /* add LRM before */
+ addPoint(pBiDi, start0, LRM_AFTER); /* add LRM after */
break;
- }
- /* here, it is always [prev,this,next]dirProp!=BN; it may be next>i+1 */
+ case 9: /* R after L+ON/EN/AN */
+ /* false alert, infirm LRMs around previous AN */
+ pInsertPoints=&(pBiDi->insertPoints);
+ pInsertPoints->size=pInsertPoints->confirmed;
+ if (_prop == _S) /* add RLM before S */
+ {
+ addPoint(pBiDi, start0, RLM_BEFORE);
+ pInsertPoints->confirmed=pInsertPoints->size;
+ }
+ break;
- /* perform (Nn) - here, only L, R, EN, AN, and neutrals are left */
- /* for "inverse BiDi", treat neutrals like L */
- /* this is one iteration late for the neutrals */
- if(DIRPROP_FLAG(dirProp)&MASK_N) {
- if(neutralStart<0) {
- /* start of a sequence of neutrals */
- neutralStart=i;
- beforeNeutral=prevDirProp;
+ case 10: /* L after L+ON/AN */
+ level=pLevState->runLevel + addLevel;
+ for(k=pLevState->startON; k=0) {
- UBiDiLevel final;
- /* end of a sequence of neutrals (dirProp is "afterNeutral") */
- if(!(pBiDi->isInverse)) {
- if(beforeNeutral==L) {
- if(dirProp==L) {
- final=0; /* make all neutrals L (N1) */
- } else {
- final=level; /* make all neutrals "e" (N2) */
- }
- } else /* beforeNeutral is one of { R, EN, AN } */ {
- if(dirProp==L) {
- final=level; /* make all neutrals "e" (N2) */
- } else {
- final=1; /* make all neutrals R (N1) */
- }
+ pInsertPoints=&(pBiDi->insertPoints);
+ pInsertPoints->confirmed=pInsertPoints->size; /* confirm inserts */
+ pLevState->startON=start0;
+ break;
+
+ case 11: /* L after L+ON+EN/AN/ON */
+ level=pLevState->runLevel;
+ for(k=start0-1; k>=pLevState->startON; k--) {
+ if(levels[k]==level+3) {
+ while(levels[k]==level+3) {
+ levels[k--]-=2;
}
- } else {
- /* "inverse BiDi": collapse [before]dirProps L, EN, AN into L */
- if(beforeNeutral!=R) {
- if(dirProp!=R) {
- final=0; /* make all neutrals L (N1) */
- } else {
- final=level; /* make all neutrals "e" (N2) */
- }
- } else /* beforeNeutral is one of { R, EN, AN } */ {
- if(dirProp!=R) {
- final=level; /* make all neutrals "e" (N2) */
- } else {
- final=1; /* make all neutrals R (N1) */
- }
+ while(levels[k]==level) {
+ k--;
}
}
- /* perform (In) on the sequence of neutrals */
- if((level^final)&1) {
- /* do something only if we need to _change_ the level */
- do {
- ++levels[neutralStart];
- } while(++neutralStartrunLevel+1;
+ for(k=start0-1; k>=pLevState->startON; k--) {
+ if(levels[k]>level) {
+ levels[k]-=2;
}
- } else /* EN or AN */ {
- /* this level depends on whether we do "inverse BiDi" */
- level=numberLevel;
}
+ break;
- /* apply the new level to the sequence, if necessary */
- while(irunLevel + addLevel;
+ for(k=start; k=0) {
- /*
- * Note that all levels[] values are still the same at this
- * point because this function is called for an entire
- * same-level run.
- * Therefore, we need to read only one actual level.
- */
- UBiDiLevel level=levels[neutralStart], final;
+static void
+resolveImplicitLevels(UBiDi *pBiDi,
+ int32_t start, int32_t limit,
+ DirProp sor, DirProp eor) {
+ const DirProp *dirProps=pBiDi->dirProps;
- /* end of a sequence of neutrals (eor is "afterNeutral") */
- if(!(pBiDi->isInverse)) {
- if(beforeNeutral==L) {
- if(eor==L) {
- final=0; /* make all neutrals L (N1) */
- } else {
- final=level; /* make all neutrals "e" (N2) */
- }
- } else /* beforeNeutral is one of { R, EN, AN } */ {
- if(eor==L) {
- final=level; /* make all neutrals "e" (N2) */
- } else {
- final=1; /* make all neutrals R (N1) */
- }
- }
+ LevState levState;
+ int32_t i, start1, start2;
+ uint8_t oldStateImp, stateImp, actionImp;
+ uint8_t gprop, resProp, cell;
+ UBool inverseRTL;
+ DirProp nextStrongProp=R;
+ int32_t nextStrongPos=-1;
+
+ /* check for RTL inverse BiDi mode */
+ /* FOOD FOR THOUGHT: in case of RTL inverse BiDi, it would make sense to
+ * loop on the text characters from end to start.
+ * This would need a different properties state table (at least different
+ * actions) and different levels state tables (maybe very similar to the
+ * LTR corresponding ones.
+ */
+ inverseRTL=((startlastArabicPos) && (GET_PARALEVEL(pBiDi, start) & 1) &&
+ (pBiDi->reorderingMode==UBIDI_REORDER_INVERSE_LIKE_DIRECT ||
+ pBiDi->reorderingMode==UBIDI_REORDER_INVERSE_FOR_NUMBERS_SPECIAL));
+ /* initialize for levels state table */
+ levState.startL2EN=-1; /* used for INVERSE_LIKE_DIRECT_WITH_MARKS */
+ levState.lastStrongRTL=-1; /* used for INVERSE_LIKE_DIRECT_WITH_MARKS */
+ levState.state=0;
+ levState.runLevel=pBiDi->levels[start];
+ levState.pImpTab=((pBiDi->pImpTabPair)->pImpTab)[levState.runLevel&1];
+ levState.pImpAct=((pBiDi->pImpTabPair)->pImpAct)[levState.runLevel&1];
+ processPropertySeq(pBiDi, &levState, sor, start, start);
+ /* initialize for property state table */
+ if(dirProps[start]==NSM) {
+ stateImp = 1 + sor;
+ } else {
+ stateImp=0;
+ }
+ start1=start;
+ start2=start;
+
+ for(i=start; i<=limit; i++) {
+ if(i>=limit) {
+ gprop=eor;
} else {
- /* "inverse BiDi": collapse [before]dirProps L, EN, AN into L */
- if(beforeNeutral!=R) {
- if(eor!=R) {
- final=0; /* make all neutrals L (N1) */
- } else {
- final=level; /* make all neutrals "e" (N2) */
- }
- } else /* beforeNeutral is one of { R, EN, AN } */ {
- if(eor!=R) {
- final=level; /* make all neutrals "e" (N2) */
- } else {
- final=1; /* make all neutrals R (N1) */
+ DirProp prop, prop1;
+ prop=NO_CONTEXT_RTL(dirProps[i]);
+ if(inverseRTL) {
+ if(prop==AL) {
+ /* AL before EN does not make it AN */
+ prop=R;
+ } else if(prop==EN) {
+ if(nextStrongPos<=i) {
+ /* look for next strong char (L/R/AL) */
+ int32_t j;
+ nextStrongProp=R; /* set default */
+ nextStrongPos=limit;
+ for(j=i+1; jflags&MASK_WS) {
- UBiDiLevel paraLevel=pBiDi->paraLevel;
+ UBool orderParagraphsLTR=pBiDi->orderParagraphsLTR;
Flags flag;
i=pBiDi->trailingWSStart;
while(i>0) {
/* reset a sequence of WS/BN before eop and B/S to the paragraph paraLevel */
- while(i>0 && DIRPROP_FLAG(dirProps[--i])&MASK_WS) {
- levels[i]=paraLevel;
+ while(i>0 && (flag=DIRPROP_FLAG_NC(dirProps[--i]))&MASK_WS) {
+ if(orderParagraphsLTR&&(flag&DIRPROP_FLAG(B))) {
+ levels[i]=0;
+ } else {
+ levels[i]=GET_PARALEVEL(pBiDi, i);
+ }
}
/* reset BN to the next character's paraLevel until B/S, which restarts above loop */
/* here, i+1 is guaranteed to be 0) {
- flag=DIRPROP_FLAG(dirProps[--i]);
+ flag=DIRPROP_FLAG_NC(dirProps[--i]);
if(flag&MASK_BN_EXPLICIT) {
levels[i]=levels[i+1];
+ } else if(orderParagraphsLTR&&(flag&DIRPROP_FLAG(B))) {
+ levels[i]=0;
+ break;
} else if(flag&MASK_B_S) {
- levels[i]=paraLevel;
+ levels[i]=GET_PARALEVEL(pBiDi, i);
break;
}
}
@@ -997,6 +1544,159 @@ adjustWSLevels(UBiDi *pBiDi) {
}
}
+#define BIDI_MIN(x, y) ((x)<(y) ? (x) : (y))
+#define BIDI_ABS(x) ((x)>=0 ? (x) : (-(x)))
+static void
+setParaRunsOnly(UBiDi *pBiDi, const UChar *text, int32_t length,
+ UBiDiLevel paraLevel, UErrorCode *pErrorCode) {
+ void *runsOnlyMemory;
+ int32_t *visualMap;
+ UChar *visualText;
+ const UBiDiLevel *levels;
+ UBiDiLevel *saveLevels;
+ Run *runs;
+ int32_t visualLength, i, j, visualStart, logicalStart,
+ runCount, runLength, addedRuns, insertRemove,
+ start, limit, step, indexOddBit, logicalPos,
+ index, index1;
+ uint32_t saveOptions;
+
+ pBiDi->reorderingMode=UBIDI_REORDER_DEFAULT;
+ if(length==0) {
+ ubidi_setPara(pBiDi, text, length, paraLevel, NULL, pErrorCode);
+ goto cleanup3;
+ }
+ /* obtain memory for mapping table and visual text */
+ runsOnlyMemory=uprv_malloc(length*(sizeof(int32_t)+sizeof(UChar)+sizeof(UBiDiLevel)));
+ if(runsOnlyMemory==NULL) {
+ *pErrorCode=U_MEMORY_ALLOCATION_ERROR;
+ goto cleanup3;
+ }
+ visualMap=runsOnlyMemory;
+ visualText=(UChar *)&visualMap[length];
+ saveLevels=(UBiDiLevel *)&visualText[length];
+ saveOptions=pBiDi->reorderingOptions;
+ if(saveOptions & UBIDI_OPTION_INSERT_MARKS) {
+ pBiDi->reorderingOptions&=~UBIDI_OPTION_INSERT_MARKS;
+ pBiDi->reorderingOptions|=UBIDI_OPTION_REMOVE_CONTROLS;
+ }
+ ubidi_setPara(pBiDi, text, length, paraLevel, NULL, pErrorCode);
+ levels=ubidi_getLevels(pBiDi, pErrorCode);
+
+ /* FOOD FOR THOUGHT: instead of writing the visual text, we could use
+ * the visual map and the dirProps array to drive the second call
+ * to ubidi_setPara (but must make provision for possible removal of
+ * BiDi controls. Alternatively, only use the dirProps array via
+ * customized classifier callback.
+ */
+ visualLength=ubidi_writeReordered(pBiDi, visualText, length,
+ UBIDI_DO_MIRRORING, pErrorCode);
+ pBiDi->reorderingOptions=saveOptions;
+ ubidi_getVisualMap(pBiDi, visualMap, pErrorCode);
+ if(U_FAILURE(*pErrorCode)) {
+ goto cleanup2;
+ }
+ uprv_memcpy(saveLevels, levels, length*sizeof(UBiDiLevel));
+
+ pBiDi->reorderingMode=UBIDI_REORDER_INVERSE_LIKE_DIRECT;
+ paraLevel=pBiDi->paraLevel^1;
+ ubidi_setPara(pBiDi, visualText, visualLength, paraLevel, NULL, pErrorCode);
+ if(U_FAILURE(*pErrorCode)) {
+ goto cleanup1;
+ }
+ ubidi_getRuns(pBiDi);
+ /* check if some runs must be split, count how many splits */
+ addedRuns=0;
+ runCount=pBiDi->runCount;
+ runs=pBiDi->runs;
+ visualStart=0;
+ for(i=0; irunsMemory[0]=runs[0];
+ }
+ runs=pBiDi->runs=pBiDi->runsMemory;
+ pBiDi->runCount+=addedRuns;
+ } else {
+ goto cleanup1;
+ }
+ }
+ /* split runs which are not consecutive in source text */
+ for(i=runCount-1; i>=0; i--) {
+ runLength= i==0 ? runs[0].visualLimit :
+ runs[i].visualLimit-runs[i-1].visualLimit;
+ logicalStart=runs[i].logicalStart;
+ indexOddBit=GET_ODD_BIT(logicalStart);
+ logicalStart=GET_INDEX(logicalStart);
+ if(runLength<2) {
+ if(addedRuns) {
+ runs[i+addedRuns]=runs[i];
+ }
+ logicalPos=visualMap[logicalStart];
+ runs[i+addedRuns].logicalStart=MAKE_INDEX_ODD_PAIR(logicalPos,
+ saveLevels[logicalPos]^indexOddBit);
+ continue;
+ }
+ if(indexOddBit) {
+ start=logicalStart;
+ limit=logicalStart+runLength-1;
+ step=1;
+ } else {
+ start=logicalStart+runLength-1;
+ limit=logicalStart;
+ step=-1;
+ }
+ for(j=start; j!=limit; j+=step) {
+ index=visualMap[j];
+ index1=visualMap[j+step];
+ if((BIDI_ABS(index-index1)!=1) || (saveLevels[index]!=saveLevels[index1])) {
+ logicalPos=BIDI_MIN(visualMap[start], index);
+ runs[i+addedRuns].logicalStart=MAKE_INDEX_ODD_PAIR(logicalPos,
+ saveLevels[logicalPos]^indexOddBit);
+ runs[i+addedRuns].visualLimit=runs[i].visualLimit;
+ runs[i].visualLimit-=BIDI_ABS(j-start)+1;
+ insertRemove=runs[i].insertRemove&(LRM_AFTER|RLM_AFTER);
+ runs[i+addedRuns].insertRemove=insertRemove;
+ runs[i].insertRemove&=~insertRemove;
+ start=j+step;
+ addedRuns--;
+ }
+ }
+ if(addedRuns) {
+ runs[i+addedRuns]=runs[i];
+ }
+ logicalPos=BIDI_MIN(visualMap[start], visualMap[limit]);
+ runs[i+addedRuns].logicalStart=MAKE_INDEX_ODD_PAIR(logicalPos,
+ saveLevels[logicalPos]^indexOddBit);
+ }
+
+ cleanup1:
+ /* restore initial paraLevel */
+ pBiDi->paraLevel^=1;
+ cleanup2:
+ /* restore real text */
+ pBiDi->text=text;
+ /* free memory for mapping table and visual text */
+ uprv_free(runsOnlyMemory);
+ cleanup3:
+ pBiDi->reorderingMode=UBIDI_REORDER_RUNS_ONLY;
+}
+
/* ubidi_setPara ------------------------------------------------------------ */
U_CAPI void U_EXPORT2
@@ -1020,16 +1720,34 @@ ubidi_setPara(UBiDi *pBiDi, const UChar *text, int32_t length,
length=u_strlen(text);
}
+ /* special treatment for RUNS_ONLY mode */
+ if(pBiDi->reorderingMode==UBIDI_REORDER_RUNS_ONLY) {
+ setParaRunsOnly(pBiDi, text, length, paraLevel, pErrorCode);
+ return;
+ }
+
/* initialize the UBiDi structure */
+ pBiDi->pParaBiDi=NULL; /* mark unfinished setPara */
pBiDi->text=text;
- pBiDi->length=length;
+ pBiDi->length=pBiDi->originalLength=pBiDi->resultLength=length;
pBiDi->paraLevel=paraLevel;
pBiDi->direction=UBIDI_LTR;
- pBiDi->trailingWSStart=length; /* the levels[] will reflect the WS run */
+ pBiDi->paraCount=1;
pBiDi->dirProps=NULL;
pBiDi->levels=NULL;
pBiDi->runs=NULL;
+ pBiDi->insertPoints.size=0; /* clean up from last call */
+ pBiDi->insertPoints.confirmed=0; /* clean up from last call */
+
+ /*
+ * Save the original paraLevel if contextual; otherwise, set to 0.
+ */
+ if(IS_DEFAULT_LEVEL(paraLevel)) {
+ pBiDi->defaultParaLevel=paraLevel;
+ } else {
+ pBiDi->defaultParaLevel=0;
+ }
if(length==0) {
/*
@@ -1039,6 +1757,7 @@ ubidi_setPara(UBiDi *pBiDi, const UChar *text, int32_t length,
*/
if(IS_DEFAULT_LEVEL(paraLevel)) {
pBiDi->paraLevel&=1;
+ pBiDi->defaultParaLevel=0;
}
if(paraLevel&1) {
pBiDi->flags=DIRPROP_FLAG(R);
@@ -1049,6 +1768,7 @@ ubidi_setPara(UBiDi *pBiDi, const UChar *text, int32_t length,
}
pBiDi->runCount=0;
+ pBiDi->pParaBiDi=pBiDi; /* mark successful setPara */
return;
}
@@ -1057,15 +1777,32 @@ ubidi_setPara(UBiDi *pBiDi, const UChar *text, int32_t length,
/*
* Get the directional properties,
* the flags bit-set, and
- * determine the partagraph level if necessary.
+ * determine the paragraph level if necessary.
*/
if(getDirPropsMemory(pBiDi, length)) {
pBiDi->dirProps=pBiDi->dirPropsMemory;
- getDirProps(pBiDi, text);
+ getDirProps(pBiDi);
} else {
*pErrorCode=U_MEMORY_ALLOCATION_ERROR;
return;
}
+ /* the processed length may have changed if UBIDI_OPTION_STREAMING */
+ length= pBiDi->length;
+ pBiDi->trailingWSStart=length; /* the levels[] will reflect the WS run */
+ /* allocate paras memory */
+ if(pBiDi->paraCount>1) {
+ if(getInitialParasMemory(pBiDi, pBiDi->paraCount)) {
+ pBiDi->paras=pBiDi->parasMemory;
+ pBiDi->paras[pBiDi->paraCount-1]=length;
+ } else {
+ *pErrorCode=U_MEMORY_ALLOCATION_ERROR;
+ return;
+ }
+ } else {
+ /* initialize paras for single paragraph */
+ pBiDi->paras=pBiDi->simpleParas;
+ pBiDi->simpleParas[0]=length;
+ }
/* are explicit levels specified? */
if(embeddingLevels==NULL) {
@@ -1078,7 +1815,7 @@ ubidi_setPara(UBiDi *pBiDi, const UChar *text, int32_t length,
return;
}
} else {
- /* set BN for all explicit codes, check that all levels are paraLevel..UBIDI_MAX_EXPLICIT_LEVEL */
+ /* set BN for all explicit codes, check that all levels are 0 or paraLevel..UBIDI_MAX_EXPLICIT_LEVEL */
pBiDi->levels=embeddingLevels;
direction=checkExplicitLevels(pBiDi, pErrorCode);
if(U_FAILURE(*pErrorCode)) {
@@ -1107,6 +1844,45 @@ ubidi_setPara(UBiDi *pBiDi, const UChar *text, int32_t length,
pBiDi->trailingWSStart=0;
break;
default:
+ /*
+ * Choose the right implicit state table
+ */
+ switch(pBiDi->reorderingMode) {
+ case UBIDI_REORDER_DEFAULT:
+ pBiDi->pImpTabPair=&impTab_DEFAULT;
+ break;
+ case UBIDI_REORDER_NUMBERS_SPECIAL:
+ pBiDi->pImpTabPair=&impTab_NUMBERS_SPECIAL;
+ break;
+ case UBIDI_REORDER_GROUP_NUMBERS_WITH_R:
+ pBiDi->pImpTabPair=&impTab_GROUP_NUMBERS_WITH_R;
+ break;
+ case UBIDI_REORDER_RUNS_ONLY:
+ /* we should never get here */
+ pBiDi=NULL;
+ pBiDi->text=NULL; /* make the program crash! */
+ break;
+ case UBIDI_REORDER_INVERSE_NUMBERS_AS_L:
+ pBiDi->pImpTabPair=&impTab_INVERSE_NUMBERS_AS_L;
+ break;
+ case UBIDI_REORDER_INVERSE_LIKE_DIRECT:
+ if (pBiDi->reorderingOptions & UBIDI_OPTION_INSERT_MARKS) {
+ pBiDi->pImpTabPair=&impTab_INVERSE_LIKE_DIRECT_WITH_MARKS;
+ } else {
+ pBiDi->pImpTabPair=&impTab_INVERSE_LIKE_DIRECT;
+ }
+ break;
+ case UBIDI_REORDER_INVERSE_FOR_NUMBERS_SPECIAL:
+ if (pBiDi->reorderingOptions & UBIDI_OPTION_INSERT_MARKS) {
+ pBiDi->pImpTabPair=&impTab_INVERSE_FOR_NUMBERS_SPECIAL_WITH_MARKS;
+ } else {
+ pBiDi->pImpTabPair=&impTab_INVERSE_FOR_NUMBERS_SPECIAL;
+ }
+ break;
+ default:
+ pBiDi->pImpTabPair=&impTab_DEFAULT;
+ break;
+ }
/*
* If there are no external levels specified and there
* are no significant explicit level codes in the text,
@@ -1120,8 +1896,8 @@ ubidi_setPara(UBiDi *pBiDi, const UChar *text, int32_t length,
*/
if(embeddingLevels==NULL && !(pBiDi->flags&DIRPROP_FLAG_MULTI_RUNS)) {
resolveImplicitLevels(pBiDi, 0, length,
- GET_LR_FROM_LEVEL(pBiDi->paraLevel),
- GET_LR_FROM_LEVEL(pBiDi->paraLevel));
+ GET_LR_FROM_LEVEL(GET_PARALEVEL(pBiDi, 0)),
+ GET_LR_FROM_LEVEL(GET_PARALEVEL(pBiDi, length-1)));
} else {
/* sor, eor: start and end types of same-level-run */
UBiDiLevel *levels=pBiDi->levels;
@@ -1130,7 +1906,7 @@ ubidi_setPara(UBiDi *pBiDi, const UChar *text, int32_t length,
DirProp sor, eor;
/* determine the first sor and set eor to it because of the loop body (sor=eor there) */
- level=pBiDi->paraLevel;
+ level=GET_PARALEVEL(pBiDi, 0);
nextLevel=levels[0];
if(level0) && (NO_CONTEXT_RTL(pBiDi->dirProps[start-1])==B)) {
+ /* except if this is a new paragraph, then set sor = para level */
+ sor=GET_LR_FROM_LEVEL(GET_PARALEVEL(pBiDi, start));
+ } else {
+ sor=eor;
+ }
/* search for the limit of this run */
while(++limitparaLevel;
+ nextLevel=GET_PARALEVEL(pBiDi, length-1);
}
/* determine eor from max(level, nextLevel); sor is last run's eor */
@@ -1175,24 +1956,43 @@ ubidi_setPara(UBiDi *pBiDi, const UChar *text, int32_t length,
}
} while(limitinsertPoints.errorCode))
+ {
+ *pErrorCode=pBiDi->insertPoints.errorCode;
+ return;
+ }
/* reset the embedding levels for some non-graphic characters (L1), (X9) */
adjustWSLevels(pBiDi);
-
- /* for "inverse BiDi", ubidi_getRuns() modifies the levels of numeric runs following RTL runs */
- if(pBiDi->isInverse) {
- if(!ubidi_getRuns(pBiDi)) {
- *pErrorCode=U_MEMORY_ALLOCATION_ERROR;
- return;
- }
- }
break;
}
+ if(pBiDi->reorderingOptions & UBIDI_OPTION_REMOVE_CONTROLS) {
+ pBiDi->resultLength -= pBiDi->controlCount;
+ } else {
+ pBiDi->resultLength += pBiDi->insertPoints.size;
+ }
+ pBiDi->pParaBiDi=pBiDi; /* mark successful setPara */
+}
+
+U_CAPI void U_EXPORT2
+ubidi_orderParagraphsLTR(UBiDi *pBiDi, UBool orderParagraphsLTR) {
+ if(pBiDi!=NULL) {
+ pBiDi->orderParagraphsLTR=orderParagraphsLTR;
+ }
+}
+
+U_CAPI UBool U_EXPORT2
+ubidi_isOrderParagraphsLTR(UBiDi *pBiDi) {
+ if(pBiDi!=NULL) {
+ return pBiDi->orderParagraphsLTR;
+ } else {
+ return FALSE;
+ }
}
U_CAPI UBiDiDirection U_EXPORT2
ubidi_getDirection(const UBiDi *pBiDi) {
- if(pBiDi!=NULL) {
+ if(IS_VALID_PARA_OR_LINE(pBiDi)) {
return pBiDi->direction;
} else {
return UBIDI_LTR;
@@ -1201,7 +2001,7 @@ ubidi_getDirection(const UBiDi *pBiDi) {
U_CAPI const UChar * U_EXPORT2
ubidi_getText(const UBiDi *pBiDi) {
- if(pBiDi!=NULL) {
+ if(IS_VALID_PARA_OR_LINE(pBiDi)) {
return pBiDi->text;
} else {
return NULL;
@@ -1210,155 +2010,152 @@ ubidi_getText(const UBiDi *pBiDi) {
U_CAPI int32_t U_EXPORT2
ubidi_getLength(const UBiDi *pBiDi) {
- if(pBiDi!=NULL) {
+ if(IS_VALID_PARA_OR_LINE(pBiDi)) {
+ return pBiDi->originalLength;
+ } else {
+ return 0;
+ }
+}
+
+U_CAPI int32_t U_EXPORT2
+ubidi_getProcessedLength(const UBiDi *pBiDi) {
+ if(IS_VALID_PARA_OR_LINE(pBiDi)) {
return pBiDi->length;
} else {
return 0;
}
}
+U_CAPI int32_t U_EXPORT2
+ubidi_getResultLength(const UBiDi *pBiDi) {
+ if(IS_VALID_PARA_OR_LINE(pBiDi)) {
+ return pBiDi->resultLength;
+ } else {
+ return 0;
+ }
+}
+
+/* paragraphs API functions ------------------------------------------------- */
+
U_CAPI UBiDiLevel U_EXPORT2
ubidi_getParaLevel(const UBiDi *pBiDi) {
- if(pBiDi!=NULL) {
+ if(IS_VALID_PARA_OR_LINE(pBiDi)) {
return pBiDi->paraLevel;
} else {
return 0;
}
}
-/* statetable prototype ----------------------------------------------------- */
-
-/*
- * This is here for possible future
- * performance work and is not compiled right now.
- */
-
-#if 0
-/*
- * This is a piece of code that could be part of ubidi.c/resolveImplicitLevels().
- * It replaces in the (Wn) state machine the switch()-if()-cascade with
- * just a few if()s and a state table.
- */
-
-/* use the state table only for the following dirProp's */
-#define MASK_W_TABLE (FLAG(L)|FLAG(R)|FLAG(AL)|FLAG(EN)|FLAG(ES)|FLAG(CS)|FLAG(ET)|FLAG(AN))
-
-/*
- * inputs:
- *
- * 0..1 historyOfEN - 2b
- * 2 prevDirProp==AN - 1b
- * 3..4 lastStrong, one of { L, R, AL, none } - 2b
- * 5..7 dirProp, one of { L, R, AL, EN, ES, CS, ET, AN } - 3b
- * 8..9 nextDirProp, one of { EN, AN, other }
- *
- * total: 10b=1024 states
- */
-enum { _L, _R, _AL, _EN, _ES, _CS, _ET, _AN, _OTHER }; /* lastStrong, dirProp */
-enum { __EN, __AN, __OTHER }; /* nextDirProp */
-
-#define LAST_STRONG_SHIFT 3
-#define DIR_PROP_SHIFT 5
-#define NEXT_DIR_PROP_SHIFT 8
-
-/* masks after shifting */
-#define LAST_STRONG_MASK 3
-#define DIR_PROP_MASK 7
-#define STATE_MASK 0x1f
+U_CAPI int32_t U_EXPORT2
+ubidi_countParagraphs(UBiDi *pBiDi) {
+ if(!IS_VALID_PARA_OR_LINE(pBiDi)) {
+ return 0;
+ } else {
+ return pBiDi->paraCount;
+ }
+}
-/* convert dirProp into _dirProp (above enum) */
-static DirProp inputDirProp[dirPropCount]={ _X<=pBiDi->paraCount ) {
+ *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR;
+ return;
+ }
+ pBiDi=pBiDi->pParaBiDi; /* get Para object if Line object */
+ if(paraIndex) {
+ paraStart=pBiDi->paras[paraIndex-1];
+ } else {
+ paraStart=0;
+ }
+ if(pParaStart!=NULL) {
+ *pParaStart=paraStart;
+ }
+ if(pParaLimit!=NULL) {
+ *pParaLimit=pBiDi->paras[paraIndex];
+ }
+ if(pParaLevel!=NULL) {
+ *pParaLevel=GET_PARALEVEL(pBiDi, paraStart);
+ }
+ return;
+}
-/*
- * outputs:
- *
- * dirProp, one of { L, R, EN, AN, ON } - 3b
- *
- * 0..1 historyOfEN - 2b
- * 2 prevDirProp==AN - 1b
- * 3..4 lastStrong, one of { L, R, AL, none } - 2b
- * 5..7 new dirProp, one of { L, R, EN, AN, ON }
- *
- * total: 8 bits=1 byte per state
- */
-enum { ___L, ___R, ___EN, ___AN, ___ON, ___count };
+U_CAPI int32_t U_EXPORT2
+ubidi_getParagraph(const UBiDi *pBiDi, int32_t charIndex,
+ int32_t *pParaStart, int32_t *pParaLimit,
+ UBiDiLevel *pParaLevel, UErrorCode *pErrorCode) {
+ uint32_t paraIndex;
-/* convert ___dirProp into dirProp (above enum) */
-static DirProp outputDirProp[___count]={ X, ... };
+ /* check the argument values */
+ /* pErrorCode will be checked by the call to ubidi_getParagraphByIndex */
+ if( !IS_VALID_PARA_OR_LINE(pBiDi)) {/* no valid setPara/setLine */
+ *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR;
+ return -1;
+ }
+ pBiDi=pBiDi->pParaBiDi; /* get Para object if Line object */
+ if( charIndex<0 || charIndex>=pBiDi->length ) {
+ *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR;
+ return -1;
+ }
+ for(paraIndex=0; charIndex>=pBiDi->paras[paraIndex]; paraIndex++);
+ ubidi_getParagraphByIndex(pBiDi, paraIndex, pParaStart, pParaLimit, pParaLevel, pErrorCode);
+ return paraIndex;
+}
-/* state table */
-static uint8_t wnTable[1024]={ /* calculate with switch()-if()-cascade */ };
+U_CAPI void U_EXPORT2
+ubidi_setClassCallback(UBiDi *pBiDi, UBiDiClassCallback *newFn,
+ const void *newContext, UBiDiClassCallback **oldFn,
+ const void **oldContext, UErrorCode *pErrorCode)
+{
+ if(pErrorCode==NULL || U_FAILURE(*pErrorCode)) {
+ return;
+ } else if(pBiDi==NULL) {
+ *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR;
+ return;
+ }
+ if( oldFn )
+ {
+ *oldFn = pBiDi->fnClassCallback;
+ }
+ if( oldContext )
+ {
+ *oldContext = pBiDi->coClassCallback;
+ }
+ pBiDi->fnClassCallback = newFn;
+ pBiDi->coClassCallback = newContext;
+}
-static void
-resolveImplicitLevels(BiDi *pBiDi,
- Index start, Index end,
- DirProp sor, DirProp eor) {
- /* new variable */
- uint8_t state;
-
- /* remove variable lastStrong */
-
- /* set initial state (set lastStrong, the rest is 0) */
- state= sor==L ? 0 : _R<>DIR_PROP_SHIFT];
- state&=STATE_MASK;
- } else if(dirProp==ET) {
- /* get sequence of ET; advance only next, not current, previous or historyOfEN */
- while(nextfnClassCallback;
+ }
+ if( context )
+ {
+ *context = pBiDi->coClassCallback;
+ }
+}
- state=wnTable[
- ((int)state)|
- _ET<>DIR_PROP_SHIFT];
- state&=STATE_MASK;
-
- /* apply the result of (W1), (W5)..(W7) to the entire sequence of ET */
- } else if(dirProp==NSM) {
- /* (W1) */
- dirProp=prevDirProp;
- /* keep prevDirProp's EN and AN states! */
- } else /* other */ {
- /* set EN and AN states to 0 */
- state&=LAST_STRONG_MASK<fnClassCallback == NULL ||
+ (dir = (*pBiDi->fnClassCallback)(pBiDi->coClassCallback, c)) == U_BIDI_CLASS_DEFAULT )
+ {
+ return ubidi_getClass(pBiDi->bdp, c);
+ } else {
+ return dir;
}
- /* perform (Nn) and (In) as usual */
}
-#endif
+
diff --git a/icuSources/common/ubidi_props.c b/icuSources/common/ubidi_props.c
new file mode 100644
index 00000000..8538c6c5
--- /dev/null
+++ b/icuSources/common/ubidi_props.c
@@ -0,0 +1,519 @@
+/*
+*******************************************************************************
+*
+* Copyright (C) 2004-2006, International Business Machines
+* Corporation and others. All Rights Reserved.
+*
+*******************************************************************************
+* file name: ubidi_props.c
+* encoding: US-ASCII
+* tab size: 8 (not used)
+* indentation:4
+*
+* created on: 2004dec30
+* created by: Markus W. Scherer
+*
+* Low-level Unicode bidi/shaping properties access.
+*/
+
+#include "unicode/utypes.h"
+#include "unicode/uset.h"
+#include "unicode/udata.h" /* UDataInfo */
+#include "ucmndata.h" /* DataHeader */
+#include "udatamem.h"
+#include "umutex.h"
+#include "uassert.h"
+#include "cmemory.h"
+#include "utrie.h"
+#include "ubidi_props.h"
+#include "ucln_cmn.h"
+
+struct UBiDiProps {
+ UDataMemory *mem;
+ const int32_t *indexes;
+ const uint32_t *mirrors;
+ const uint8_t *jgArray;
+
+ UTrie trie;
+ uint8_t formatVersion[4];
+};
+
+/* data loading etc. -------------------------------------------------------- */
+
+#define UBIDI_HARDCODE_DATA 1
+
+#if UBIDI_HARDCODE_DATA
+
+/* ubidi_props_data.c is machine-generated by genbidi --csource */
+#include "ubidi_props_data.c"
+
+#else
+
+static UBool U_CALLCONV
+isAcceptable(void *context,
+ const char *type, const char *name,
+ const UDataInfo *pInfo) {
+ if(
+ pInfo->size>=20 &&
+ pInfo->isBigEndian==U_IS_BIG_ENDIAN &&
+ pInfo->charsetFamily==U_CHARSET_FAMILY &&
+ pInfo->dataFormat[0]==UBIDI_FMT_0 && /* dataFormat="BiDi" */
+ pInfo->dataFormat[1]==UBIDI_FMT_1 &&
+ pInfo->dataFormat[2]==UBIDI_FMT_2 &&
+ pInfo->dataFormat[3]==UBIDI_FMT_3 &&
+ pInfo->formatVersion[0]==1 &&
+ pInfo->formatVersion[2]==UTRIE_SHIFT &&
+ pInfo->formatVersion[3]==UTRIE_INDEX_SHIFT
+ ) {
+ UBiDiProps *bdp=(UBiDiProps *)context;
+ uprv_memcpy(bdp->formatVersion, pInfo->formatVersion, 4);
+ return TRUE;
+ } else {
+ return FALSE;
+ }
+}
+
+static UBiDiProps *
+ubidi_openData(UBiDiProps *bdpProto,
+ const uint8_t *bin, int32_t length, UErrorCode *pErrorCode) {
+ UBiDiProps *bdp;
+ int32_t size;
+
+ bdpProto->indexes=(const int32_t *)bin;
+ if( (length>=0 && length<16*4) ||
+ bdpProto->indexes[UBIDI_IX_INDEX_TOP]<16
+ ) {
+ /* length or indexes[] too short for minimum indexes[] length of 16 */
+ *pErrorCode=U_INVALID_FORMAT_ERROR;
+ return NULL;
+ }
+ size=bdpProto->indexes[UBIDI_IX_INDEX_TOP]*4;
+ if(length>=0) {
+ if(length>=size && length>=bdpProto->indexes[UBIDI_IX_LENGTH]) {
+ length-=size;
+ } else {
+ /* length too short for indexes[] or for the whole data length */
+ *pErrorCode=U_INVALID_FORMAT_ERROR;
+ return NULL;
+ }
+ }
+ bin+=size;
+ /* from here on, assume that the sizes of the items fit into the total length */
+
+ /* unserialize the trie, after indexes[] */
+ size=bdpProto->indexes[UBIDI_IX_TRIE_SIZE];
+ utrie_unserialize(&bdpProto->trie, bin, size, pErrorCode);
+ if(U_FAILURE(*pErrorCode)) {
+ return NULL;
+ }
+ bin+=size;
+
+ /* get mirrors[] */
+ size=4*bdpProto->indexes[UBIDI_IX_MIRROR_LENGTH];
+ bdpProto->mirrors=(const uint32_t *)bin;
+ bin+=size;
+
+ /* get jgArray[] */
+ size=bdpProto->indexes[UBIDI_IX_JG_LIMIT]-bdpProto->indexes[UBIDI_IX_JG_START];
+ bdpProto->jgArray=bin;
+ bin+=size;
+
+ /* allocate, copy, and return the new UBiDiProps */
+ bdp=(UBiDiProps *)uprv_malloc(sizeof(UBiDiProps));
+ if(bdp==NULL) {
+ *pErrorCode=U_MEMORY_ALLOCATION_ERROR;
+ return NULL;
+ } else {
+ uprv_memcpy(bdp, bdpProto, sizeof(UBiDiProps));
+ return bdp;
+ }
+}
+
+U_CAPI UBiDiProps * U_EXPORT2
+ubidi_openProps(UErrorCode *pErrorCode) {
+ UBiDiProps bdpProto={ NULL }, *bdp;
+
+ bdpProto.mem=udata_openChoice(NULL, UBIDI_DATA_TYPE, UBIDI_DATA_NAME, isAcceptable, &bdpProto, pErrorCode);
+ if(U_FAILURE(*pErrorCode)) {
+ return NULL;
+ }
+
+ bdp=ubidi_openData(
+ &bdpProto,
+ udata_getMemory(bdpProto.mem),
+ udata_getLength(bdpProto.mem),
+ pErrorCode);
+ if(U_FAILURE(*pErrorCode)) {
+ udata_close(bdpProto.mem);
+ return NULL;
+ } else {
+ return bdp;
+ }
+}
+
+U_CAPI UBiDiProps * U_EXPORT2
+ubidi_openBinary(const uint8_t *bin, int32_t length, UErrorCode *pErrorCode) {
+ UBiDiProps bdpProto={ NULL };
+ const DataHeader *hdr;
+
+ if(U_FAILURE(*pErrorCode)) {
+ return NULL;
+ }
+ if(bin==NULL) {
+ *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR;
+ return NULL;
+ }
+
+ /* check the header */
+ if(length>=0 && length<20) {
+ *pErrorCode=U_INVALID_FORMAT_ERROR;
+ return NULL;
+ }
+ hdr=(const DataHeader *)bin;
+ if(
+ !(hdr->dataHeader.magic1==0xda && hdr->dataHeader.magic2==0x27 &&
+ hdr->info.isBigEndian==U_IS_BIG_ENDIAN &&
+ isAcceptable(&bdpProto, UBIDI_DATA_TYPE, UBIDI_DATA_NAME, &hdr->info))
+ ) {
+ *pErrorCode=U_INVALID_FORMAT_ERROR;
+ return NULL;
+ }
+
+ bin+=hdr->dataHeader.headerSize;
+ if(length>=0) {
+ length-=hdr->dataHeader.headerSize;
+ }
+ return ubidi_openData(&bdpProto, bin, length, pErrorCode);
+}
+
+#endif
+
+U_CAPI void U_EXPORT2
+ubidi_closeProps(UBiDiProps *bdp) {
+ if(bdp!=NULL) {
+#if !UBIDI_HARDCODE_DATA
+ udata_close(bdp->mem);
+#endif
+ uprv_free(bdp);
+ }
+}
+
+/* UBiDiProps singleton ----------------------------------------------------- */
+
+static UBiDiProps *gBdp=NULL, *gBdpDummy=NULL;
+#if !UBIDI_HARDCODE_DATA
+static UErrorCode gErrorCode=U_ZERO_ERROR;
+static int8_t gHaveData=0;
+#endif
+
+static UBool U_CALLCONV
+ubidi_cleanup(void) {
+ ubidi_closeProps(gBdp);
+ gBdp=NULL;
+ ubidi_closeProps(gBdpDummy);
+ gBdpDummy=NULL;
+#if !UBIDI_HARDCODE_DATA
+ gErrorCode=U_ZERO_ERROR;
+ gHaveData=0;
+#endif
+ return TRUE;
+}
+
+U_CAPI const UBiDiProps * U_EXPORT2
+ubidi_getSingleton(UErrorCode *pErrorCode) {
+#if UBIDI_HARDCODE_DATA
+ if(U_FAILURE(*pErrorCode)) {
+ return NULL;
+ }
+ return &ubidi_props_singleton;
+#else
+ int8_t haveData;
+
+ if(U_FAILURE(*pErrorCode)) {
+ return NULL;
+ }
+
+ UMTX_CHECK(NULL, gHaveData, haveData);
+
+ if(haveData>0) {
+ /* data was loaded */
+ return gBdp;
+ } else if(haveData<0) {
+ /* data loading failed */
+ *pErrorCode=gErrorCode;
+ return NULL;
+ } else /* haveData==0 */ {
+ /* load the data */
+ UBiDiProps *bdp=ubidi_openProps(pErrorCode);
+ if(U_FAILURE(*pErrorCode)) {
+ gHaveData=-1;
+ gErrorCode=*pErrorCode;
+ return NULL;
+ }
+
+ /* set the static variables */
+ umtx_lock(NULL);
+ if(gBdp==NULL) {
+ gBdp=bdp;
+ bdp=NULL;
+ gHaveData=1;
+ ucln_common_registerCleanup(UCLN_COMMON_UBIDI, ubidi_cleanup);
+ }
+ umtx_unlock(NULL);
+
+ ubidi_closeProps(bdp);
+ return gBdp;
+ }
+#endif
+}
+
+U_CAPI const UBiDiProps * U_EXPORT2
+ubidi_getDummy(UErrorCode *pErrorCode) {
+ UBiDiProps *bdp;
+
+ if(U_FAILURE(*pErrorCode)) {
+ return NULL;
+ }
+
+ UMTX_CHECK(NULL, gBdpDummy, bdp);
+
+ if(bdp!=NULL) {
+ /* the dummy object was already created */
+ return bdp;
+ } else /* bdp==NULL */ {
+ /* create the dummy object */
+ int32_t *indexes;
+
+ bdp=(UBiDiProps *)uprv_malloc(sizeof(UBiDiProps)+UBIDI_IX_TOP*4+UTRIE_DUMMY_SIZE);
+ if(bdp==NULL) {
+ *pErrorCode=U_MEMORY_ALLOCATION_ERROR;
+ return NULL;
+ }
+ uprv_memset(bdp, 0, sizeof(UBiDiProps)+UBIDI_IX_TOP*4);
+
+ bdp->indexes=indexes=(int32_t *)(bdp+1);
+ indexes[UBIDI_IX_INDEX_TOP]=UBIDI_IX_TOP;
+
+ indexes[UBIDI_IX_TRIE_SIZE]=
+ utrie_unserializeDummy(&bdp->trie, indexes+UBIDI_IX_TOP, UTRIE_DUMMY_SIZE, 0, 0, TRUE, pErrorCode);
+ if(U_FAILURE(*pErrorCode)) {
+ uprv_free(bdp);
+ return NULL;
+ }
+
+ bdp->formatVersion[0]=1;
+ bdp->formatVersion[2]=UTRIE_SHIFT;
+ bdp->formatVersion[3]=UTRIE_INDEX_SHIFT;
+
+ /* set the static variables */
+ umtx_lock(NULL);
+ if(gBdpDummy==NULL) {
+ gBdpDummy=bdp;
+ bdp=NULL;
+ ucln_common_registerCleanup(UCLN_COMMON_UBIDI, ubidi_cleanup);
+ }
+ umtx_unlock(NULL);
+
+ uprv_free(bdp);
+ return gBdpDummy;
+ }
+}
+
+/* set of property starts for UnicodeSet ------------------------------------ */
+
+static UBool U_CALLCONV
+_enumPropertyStartsRange(const void *context, UChar32 start, UChar32 limit, uint32_t value) {
+ /* add the start code point to the USet */
+ const USetAdder *sa=(const USetAdder *)context;
+ sa->add(sa->set, start);
+ return TRUE;
+}
+
+U_CAPI void U_EXPORT2
+ubidi_addPropertyStarts(const UBiDiProps *bdp, const USetAdder *sa, UErrorCode *pErrorCode) {
+ int32_t i, length;
+ UChar32 c, start, limit;
+
+ const uint8_t *jgArray;
+ uint8_t prev, jg;
+
+ if(U_FAILURE(*pErrorCode)) {
+ return;
+ }
+
+ /* add the start code point of each same-value range of the trie */
+ utrie_enum(&bdp->trie, NULL, _enumPropertyStartsRange, sa);
+
+ /* add the code points from the bidi mirroring table */
+ length=bdp->indexes[UBIDI_IX_MIRROR_LENGTH];
+ for(i=0; imirrors[i]);
+ sa->addRange(sa->set, c, c+1);
+ }
+
+ /* add the code points from the Joining_Group array where the value changes */
+ start=bdp->indexes[UBIDI_IX_JG_START];
+ limit=bdp->indexes[UBIDI_IX_JG_LIMIT];
+ jgArray=bdp->jgArray;
+ prev=0;
+ while(startadd(sa->set, start);
+ prev=jg;
+ }
+ ++start;
+ }
+ if(prev!=0) {
+ /* add the limit code point if the last value was not 0 (it is now start==limit) */
+ sa->add(sa->set, limit);
+ }
+
+ /* add code points with hardcoded properties, plus the ones following them */
+
+ /* (none right now) */
+}
+
+/* data access primitives --------------------------------------------------- */
+
+/* UTRIE_GET16() itself validates c */
+#define GET_PROPS(bdp, c, result) \
+ UTRIE_GET16(&(bdp)->trie, c, result);
+
+/* property access functions ------------------------------------------------ */
+
+U_CFUNC int32_t
+ubidi_getMaxValue(const UBiDiProps *bdp, UProperty which) {
+ int32_t max;
+
+ if(bdp==NULL) {
+ return -1;
+ }
+
+ max=bdp->indexes[UBIDI_MAX_VALUES_INDEX];
+ switch(which) {
+ case UCHAR_BIDI_CLASS:
+ return (max&UBIDI_CLASS_MASK);
+ case UCHAR_JOINING_GROUP:
+ return (max&UBIDI_MAX_JG_MASK)>>UBIDI_MAX_JG_SHIFT;
+ case UCHAR_JOINING_TYPE:
+ return (max&UBIDI_JT_MASK)>>UBIDI_JT_SHIFT;
+ default:
+ return -1; /* undefined */
+ }
+}
+
+U_CAPI UCharDirection U_EXPORT2
+ubidi_getClass(const UBiDiProps *bdp, UChar32 c) {
+ uint32_t props;
+ GET_PROPS(bdp, c, props);
+ return (UCharDirection)UBIDI_GET_CLASS(props);
+}
+
+U_CAPI UBool U_EXPORT2
+ubidi_isMirrored(const UBiDiProps *bdp, UChar32 c) {
+ uint32_t props;
+ GET_PROPS(bdp, c, props);
+ return (UBool)UBIDI_GET_FLAG(props, UBIDI_IS_MIRRORED_SHIFT);
+}
+
+U_CAPI UChar32 U_EXPORT2
+ubidi_getMirror(const UBiDiProps *bdp, UChar32 c) {
+ uint32_t props;
+ int32_t delta;
+
+ GET_PROPS(bdp, c, props);
+ delta=((int16_t)props)>>UBIDI_MIRROR_DELTA_SHIFT;
+ if(delta!=UBIDI_ESC_MIRROR_DELTA) {
+ return c+delta;
+ } else {
+ /* look for mirror code point in the mirrors[] table */
+ const uint32_t *mirrors;
+ uint32_t m;
+ int32_t i, length;
+ UChar32 c2;
+
+ mirrors=bdp->mirrors;
+ length=bdp->indexes[UBIDI_IX_MIRROR_LENGTH];
+
+ /* linear search */
+ for(i=0; i>UBIDI_JT_SHIFT);
+}
+
+U_CAPI UJoiningGroup U_EXPORT2
+ubidi_getJoiningGroup(const UBiDiProps *bdp, UChar32 c) {
+ UChar32 start, limit;
+
+ start=bdp->indexes[UBIDI_IX_JG_START];
+ limit=bdp->indexes[UBIDI_IX_JG_LIMIT];
+ if(start<=c && cjgArray[c-start];
+ } else {
+ return U_JG_NO_JOINING_GROUP;
+ }
+}
+
+/* public API (see uchar.h) ------------------------------------------------- */
+
+U_CAPI UCharDirection U_EXPORT2
+u_charDirection(UChar32 c) {
+ UErrorCode errorCode=U_ZERO_ERROR;
+ const UBiDiProps *bdp=ubidi_getSingleton(&errorCode);
+ if(bdp!=NULL) {
+ return ubidi_getClass(bdp, c);
+ } else {
+ return U_LEFT_TO_RIGHT;
+ }
+}
+
+U_CAPI UBool U_EXPORT2
+u_isMirrored(UChar32 c) {
+ UErrorCode errorCode=U_ZERO_ERROR;
+ const UBiDiProps *bdp=ubidi_getSingleton(&errorCode);
+ return (UBool)(bdp!=NULL && ubidi_isMirrored(bdp, c));
+}
+
+U_CAPI UChar32 U_EXPORT2
+u_charMirror(UChar32 c) {
+ UErrorCode errorCode=U_ZERO_ERROR;
+ const UBiDiProps *bdp=ubidi_getSingleton(&errorCode);
+ if(bdp!=NULL) {
+ return ubidi_getMirror(bdp, c);
+ } else {
+ return c;
+ }
+}
diff --git a/icuSources/common/ubidi_props.h b/icuSources/common/ubidi_props.h
new file mode 100644
index 00000000..7788c8b4
--- /dev/null
+++ b/icuSources/common/ubidi_props.h
@@ -0,0 +1,160 @@
+/*
+*******************************************************************************
+*
+* Copyright (C) 2004-2005, International Business Machines
+* Corporation and others. All Rights Reserved.
+*
+*******************************************************************************
+* file name: ubidi_props.h
+* encoding: US-ASCII
+* tab size: 8 (not used)
+* indentation:4
+*
+* created on: 2004dec30
+* created by: Markus W. Scherer
+*
+* Low-level Unicode bidi/shaping properties access.
+*/
+
+#ifndef __UBIDI_PROPS_H__
+#define __UBIDI_PROPS_H__
+
+#include "unicode/utypes.h"
+#include "unicode/uset.h"
+#include "uset_imp.h"
+#include "udataswp.h"
+
+U_CDECL_BEGIN
+
+/* library API -------------------------------------------------------------- */
+
+struct UBiDiProps;
+typedef struct UBiDiProps UBiDiProps;
+
+U_CAPI UBiDiProps * U_EXPORT2
+ubidi_openProps(UErrorCode *pErrorCode);
+
+U_CAPI UBiDiProps * U_EXPORT2
+ubidi_openBinary(const uint8_t *bin, int32_t length, UErrorCode *pErrorCode);
+
+U_CAPI void U_EXPORT2
+ubidi_closeProps(UBiDiProps *bdp);
+
+
+U_CAPI const UBiDiProps * U_EXPORT2
+ubidi_getSingleton(UErrorCode *pErrorCode);
+
+/**
+ * Get a singleton dummy object, one that works with no real data.
+ * This can be used when the real data is not available.
+ * Using the dummy can reduce checks for available data after an initial failure.
+ */
+U_CAPI const UBiDiProps * U_EXPORT2
+ubidi_getDummy(UErrorCode *pErrorCode);
+
+
+U_CAPI int32_t U_EXPORT2
+ubidi_swap(const UDataSwapper *ds,
+ const void *inData, int32_t length, void *outData,
+ UErrorCode *pErrorCode);
+
+U_CAPI void U_EXPORT2
+ubidi_addPropertyStarts(const UBiDiProps *bdp, const USetAdder *sa, UErrorCode *pErrorCode);
+
+/* property access functions */
+
+U_CFUNC int32_t
+ubidi_getMaxValue(const UBiDiProps *bdp, UProperty which);
+
+U_CAPI UCharDirection U_EXPORT2
+ubidi_getClass(const UBiDiProps *bdp, UChar32 c);
+
+U_CAPI UBool U_EXPORT2
+ubidi_isMirrored(const UBiDiProps *bdp, UChar32 c);
+
+U_CAPI UChar32 U_EXPORT2
+ubidi_getMirror(const UBiDiProps *bdp, UChar32 c);
+
+U_CAPI UBool U_EXPORT2
+ubidi_isBidiControl(const UBiDiProps *bdp, UChar32 c);
+
+U_CAPI UBool U_EXPORT2
+ubidi_isJoinControl(const UBiDiProps *bdp, UChar32 c);
+
+U_CAPI UJoiningType U_EXPORT2
+ubidi_getJoiningType(const UBiDiProps *bdp, UChar32 c);
+
+U_CAPI UJoiningGroup U_EXPORT2
+ubidi_getJoiningGroup(const UBiDiProps *bdp, UChar32 c);
+
+/* file definitions --------------------------------------------------------- */
+
+#define UBIDI_DATA_NAME "ubidi"
+#define UBIDI_DATA_TYPE "icu"
+
+/* format "BiDi" */
+#define UBIDI_FMT_0 0x42
+#define UBIDI_FMT_1 0x69
+#define UBIDI_FMT_2 0x44
+#define UBIDI_FMT_3 0x69
+
+/* indexes into indexes[] */
+enum {
+ UBIDI_IX_INDEX_TOP,
+ UBIDI_IX_LENGTH,
+ UBIDI_IX_TRIE_SIZE,
+ UBIDI_IX_MIRROR_LENGTH,
+
+ UBIDI_IX_JG_START,
+ UBIDI_IX_JG_LIMIT,
+
+ UBIDI_MAX_VALUES_INDEX=15,
+ UBIDI_IX_TOP=16
+};
+
+/* definitions for 16-bit bidi/shaping properties word ---------------------- */
+
+enum {
+ /* UBIDI_CLASS_SHIFT=0, */ /* bidi class: 5 bits (4..0) */
+ UBIDI_JT_SHIFT=5, /* joining type: 3 bits (7..5) */
+
+ /* UBIDI__SHIFT=8, reserved: 2 bits (9..8) */
+
+ UBIDI_JOIN_CONTROL_SHIFT=10,
+ UBIDI_BIDI_CONTROL_SHIFT=11,
+
+ UBIDI_IS_MIRRORED_SHIFT=12, /* 'is mirrored' */
+ UBIDI_MIRROR_DELTA_SHIFT=13, /* bidi mirroring delta: 3 bits (15..13) */
+
+ UBIDI_MAX_JG_SHIFT=16 /* max JG value in indexes[UBIDI_MAX_VALUES_INDEX] bits 23..16 */
+};
+
+#define UBIDI_CLASS_MASK 0x0000001f
+#define UBIDI_JT_MASK 0x000000e0
+
+#define UBIDI_MAX_JG_MASK 0x00ff0000
+
+#define UBIDI_GET_CLASS(props) ((props)&UBIDI_CLASS_MASK)
+#define UBIDI_GET_FLAG(props, shift) (((props)>>(shift))&1)
+
+enum {
+ UBIDI_ESC_MIRROR_DELTA=-4,
+ UBIDI_MIN_MIRROR_DELTA=-3,
+ UBIDI_MAX_MIRROR_DELTA=3
+};
+
+/* definitions for 32-bit mirror table entry -------------------------------- */
+
+enum {
+ /* the source Unicode code point takes 21 bits (20..0) */
+ UBIDI_MIRROR_INDEX_SHIFT=21,
+ UBIDI_MAX_MIRROR_INDEX=0x7ff
+};
+
+#define UBIDI_GET_MIRROR_CODE_POINT(m) (UChar32)((m)&0x1fffff)
+
+#define UBIDI_GET_MIRROR_INDEX(m) ((m)>>UBIDI_MIRROR_INDEX_SHIFT)
+
+U_CDECL_END
+
+#endif
diff --git a/icuSources/common/ubidi_props_data.c b/icuSources/common/ubidi_props_data.c
new file mode 100644
index 00000000..e4314164
--- /dev/null
+++ b/icuSources/common/ubidi_props_data.c
@@ -0,0 +1,698 @@
+/*
+ * Copyright (C) 1999-2007, International Business Machines
+ * Corporation and others. All Rights Reserved.
+ *
+ * file name: ubidi_props_data.c
+ *
+ * machine-generated on: 2006-06-13
+ * machine-generated on: 2007-02-08 U_DARWIN
+ */
+
+static const UVersionInfo ubidi_props_dataVersion={5,0,0,0};
+
+#ifndef U_DARWIN
+static const int32_t ubidi_props_indexes[UBIDI_IX_TOP]={0x10,0x3f14,0x3d20,0x1a,0x622,0x76e,0,0,0,0,0,0,0,0,0,0x3500b2};
+#else /* U_DARWIN */
+static const int32_t ubidi_props_indexes[UBIDI_IX_TOP]={0x10,0x4024,0x3e30,0x1a,0x622,0x76e,0,0,0,0,0,0,0,0,0,0x3500b2};
+#endif /* U_DARWIN */
+
+#ifndef U_DARWIN
+static const uint16_t ubidi_props_trieIndex[7816]={
+#else /* U_DARWIN */
+static const uint16_t ubidi_props_trieIndex[7952]={
+#endif /* U_DARWIN */
+0x250,0x258,0x260,0x268,0x270,0x278,0x280,0x288,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,
+0x248,0x248,0x248,0x248,0x248,0x28e,0x296,0x29e,0x2a6,0x2a6,0x2a6,0x2aa,0x2b2,0x248,0x248,0x2b5,
+0x248,0x248,0x248,0x248,0x2bd,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x2c3,0x2c8,0x2d0,0x2d2,
+0x2da,0x2e2,0x2ea,0x2f2,0x2f8,0x2ff,0x307,0x30f,0x317,0x31f,0x325,0x32c,0x330,0x337,0x33f,0x345,
+0x2d2,0x2d2,0x2d2,0x2d2,0x2d2,0x2d2,0x2d2,0x2d2,0x34d,0x34e,0x356,0x35e,0x366,0x34e,0x36e,0x376,
+0x34d,0x34e,0x37e,0x382,0x34d,0x34e,0x38a,0x392,0x366,0x397,0x39f,0x248,0x3a4,0x248,0x3ac,0x3b0,
+0x248,0x3b7,0x3bf,0x248,0x248,0x3c5,0x3cd,0x3d5,0x248,0x248,0x3dd,0x248,0x248,0x248,0x3e3,0x248,
+0x248,0x3e9,0x3f1,0x248,0x248,0x3f5,0x3fd,0x248,0x401,0x408,0x248,0x410,0x418,0x41f,0x3a3,0x248,
+0x248,0x427,0x401,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,
+0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x42e,0x248,0x436,0x248,0x248,0x248,
+0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,
+0x248,0x248,0x248,0x248,0x43e,0x248,0x248,0x248,0x446,0x446,0x372,0x372,0x248,0x44c,0x454,0x436,
+0x45c,0x248,0x248,0x248,0x248,0x364,0x248,0x248,0x248,0x464,0x46c,0x248,0x248,0x248,0x46e,0x476,
+0x47e,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x486,0x489,0x3a4,0x491,0x248,0x248,0x248,0x248,
+0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x499,0x3b7,
+0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x49c,0x4a4,0x4a8,
+0x4b0,0x4b8,0x4bf,0x4c7,0x4cf,0x4d7,0x4dd,0x4e1,0x4e9,0x4f1,0x4f9,0x248,0x501,0x476,0x476,0x476,
+0x509,0x511,0x519,0x521,0x526,0x52e,0x536,0x53c,0x544,0x54c,0x248,0x552,0x559,0x476,0x476,0x55f,
+0x476,0x567,0x56f,0x476,0x577,0x248,0x248,0x473,0x476,0x476,0x476,0x476,0x476,0x476,0x476,0x476,
+0x476,0x476,0x476,0x476,0x57f,0x587,0x248,0x248,0x58f,0x595,0x59a,0x5a2,0x581,0x5a8,0x5b0,0x5b8,
+0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x476,0x476,0x476,0x476,0x5c0,0x5c7,0x5cf,0x5d7,
+0x5df,0x5e7,0x5ef,0x5f6,0x5fe,0x606,0x60d,0x615,0x61d,0x625,0x248,0x248,0x248,0x248,0x248,0x248,
+0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x62c,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,
+0x634,0x248,0x248,0x248,0x63c,0x476,0x476,0x479,0x476,0x476,0x476,0x476,0x476,0x476,0x643,0x649,
+0x651,0x659,0x248,0x248,0x661,0x668,0x248,0x287,0x248,0x248,0x248,0x248,0x248,0x248,0x47a,0x248,
+0x669,0x248,0x501,0x671,0x248,0x679,0x681,0x248,0x248,0x248,0x248,0x685,0x248,0x248,0x46e,0x286,
+0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,
+0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,
+0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,
+0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,
+0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,
+0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,
+0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,
+0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,
+0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,
+0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,
+0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,
+0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,
+0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x476,0x476,
+0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,
+0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,
+0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,
+0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,
+0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,
+0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,
+0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,
+0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,
+0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,
+0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,
+0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,
+0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,
+0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,
+0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,
+0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,
+0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,
+0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,
+0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,
+0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,
+0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,
+0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,
+0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,
+0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,
+0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,
+0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,
+0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,
+0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,
+0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,
+0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,
+0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,
+0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,
+0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,
+0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,
+0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,
+0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,
+0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,
+0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,
+0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,
+0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,
+0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,
+0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,
+0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,
+0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,
+0x248,0x248,0x248,0x248,0x501,0x476,0x567,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,
+0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x61d,0x46d,0x248,0x248,0x248,0x248,0x248,0x248,
+0x68d,0x694,0x248,0x697,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,
+0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,
+0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,
+0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,
+0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,
+0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,
+0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,
+0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,
+0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,
+0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,
+0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,
+0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,
+0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,
+0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,
+0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,
+0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,
+0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,
+0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,
+0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,
+0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,
+0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,
+0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,
+0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,
+0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,
+#ifndef U_DARWIN
+0x787,0x78a,0x248,0x792,0x248,0x792,0x248,0x792,0x248,0x792,0x248,0x792,0x248,0x792,0x248,0x792,
+0x248,0x792,0x248,0x792,0x248,0x792,0x248,0x792,0x248,0x792,0x79a,0x792,0x248,0x792,0x248,0x792,
+#else /* U_DARWIN */
+0x7a9,0x7ac,0x248,0x7b4,0x248,0x7b4,0x248,0x7b4,0x248,0x7b4,0x248,0x7b4,0x248,0x7b4,0x248,0x7b4,
+0x248,0x7b4,0x248,0x7b4,0x248,0x7b4,0x248,0x7b4,0x248,0x7b4,0x7bc,0x7b4,0x248,0x7b4,0x248,0x7b4,
+#endif /* U_DARWIN */
+0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,
+0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,
+0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,
+0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,
+0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,
+0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,
+0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,
+0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,
+0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,
+0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,
+0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,
+0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,
+0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,
+0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,
+#ifdef U_DARWIN
+0x475,0x476,0x476,0x69f,0x6a7,0x6af,0x6b7,0x476,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,
+0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x6bf,0x6c7,0x6cb,0x330,0x330,0x330,0x330,0x330,
+0x330,0x330,0x330,0x330,0x330,0x330,0x330,0x330,0x330,0x6cf,0x330,0x330,0x330,0x330,0x6d7,0x6db,
+0x6e3,0x6eb,0x6ef,0x6f7,0x330,0x330,0x330,0x6fb,0x703,0x260,0x70b,0x713,0x248,0x248,0x248,0x71b,
+#endif /* U_DARWIN */
+0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,
+#ifndef U_DARWIN
+0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x69d,0x6a5,0x6a9,0x330,0x330,0x330,0x330,0x330,
+0x330,0x330,0x330,0x330,0x330,0x330,0x330,0x330,0x330,0x6ad,0x330,0x330,0x330,0x330,0x6b5,0x6b9,
+0x6c1,0x6c9,0x6cd,0x6d5,0x330,0x330,0x330,0x6d9,0x6e1,0x260,0x6e9,0x6f1,0x248,0x248,0x248,0x6f9,
+#endif /* not U_DARWIN */
+0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,
+#ifdef U_DARWIN
+0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x723,0x248,0x476,0x476,0x56f,0x248,0x248,0x248,
+#endif /* U_DARWIN */
+0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,
+#ifndef U_DARWIN
+0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x701,0x248,0x476,0x476,0x56f,0x248,0x248,0x248,
+0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,
+0x2d2,0x2d2,0x2d2,0x2d2,0x2d2,0x2d2,0x2d2,0x2d2,0x709,0x2d2,0x2d2,0x2d2,0x2d2,0x2d2,0x2d2,0x2d2,
+0x711,0x715,0x2d2,0x2d2,0x2d2,0x2d2,0x2d2,0x2d2,0x2d2,0x2d2,0x2d2,0x2d2,0x2d2,0x2d2,0x2d2,0x2d2,
+#else /* U_DARWIN */
+0x2d2,0x2d2,0x2d2,0x2d2,0x2d2,0x2d2,0x2d2,0x2d2,0x72b,0x2d2,0x2d2,0x2d2,0x2d2,0x2d2,0x2d2,0x2d2,
+0x733,0x737,0x2d2,0x2d2,0x2d2,0x2d2,0x2d2,0x2d2,0x2d2,0x2d2,0x2d2,0x2d2,0x2d2,0x2d2,0x2d2,0x2d2,
+#endif /* U_DARWIN */
+0x2d2,0x2d2,0x2d2,0x2d2,0x2d2,0x2d2,0x2d2,0x2d2,0x2d2,0x2d2,0x2d2,0x2d2,0x2d2,0x2d2,0x2d2,0x2d2,
+0x2d2,0x2d2,0x2d2,0x2d2,0x2d2,0x2d2,0x2d2,0x2d2,0x2d2,0x2d2,0x2d2,0x2d2,0x2d2,0x2d2,0x2d2,0x2d2,
+#ifndef U_DARWIN
+0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x71d,0x725,0x72b,0x248,0x248,
+0x476,0x476,0x733,0x248,0x248,0x248,0x248,0x248,0x476,0x476,0x73b,0x248,0x248,0x248,0x248,0x248,
+#else /* U_DARWIN */
+0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x73f,0x747,0x74d,0x248,0x248,
+0x476,0x476,0x755,0x248,0x248,0x248,0x248,0x248,0x476,0x476,0x75d,0x248,0x248,0x248,0x248,0x248,
+#endif /* U_DARWIN */
+0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,
+#ifndef U_DARWIN
+0x248,0x248,0x248,0x248,0x248,0x248,0x741,0x248,0x748,0x248,0x744,0x248,0x74b,0x248,0x753,0x757,
+#else /* U_DARWIN */
+0x248,0x248,0x248,0x248,0x248,0x248,0x763,0x248,0x76a,0x248,0x766,0x248,0x76d,0x248,0x775,0x779,
+#endif /* U_DARWIN */
+0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,
+#ifndef U_DARWIN
+0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x75f,
+0x767,0x76f,0x76f,0x76f,0x777,0x777,0x777,0x777,0x2a6,0x2a6,0x2a6,0x2a6,0x2a6,0x2a6,0x2a6,0x77f,
+0x777,0x777,0x777,0x777,0x777,0x777,0x777,0x777,0x777,0x777,0x777,0x777,0x777,0x777,0x777,0x777,
+0x777,0x777,0x777,0x777,0x777,0x777,0x777,0x777,0x777,0x777,0x777,0x777,0x777,0x777,0x777,0x777,
+0x777,0x777,0x777,0x777,0x777,0x777,0x777,0x777,0x777,0x777,0x777,0x777,0x777,0x777,0x777,0x777,
+#else /* U_DARWIN */
+0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x781,
+0x789,0x791,0x791,0x791,0x799,0x799,0x799,0x799,0x2a6,0x2a6,0x2a6,0x2a6,0x2a6,0x2a6,0x2a6,0x7a1,
+0x799,0x799,0x799,0x799,0x799,0x799,0x799,0x799,0x799,0x799,0x799,0x799,0x799,0x799,0x799,0x799,
+0x799,0x799,0x799,0x799,0x799,0x799,0x799,0x799,0x799,0x799,0x799,0x799,0x799,0x799,0x799,0x799,
+0x799,0x799,0x799,0x799,0x799,0x799,0x799,0x799,0x799,0x799,0x799,0x799,0x799,0x799,0x799,0x799,
+#endif /* U_DARWIN */
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,8,7,8,9,7,0x12,0x12,
+0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,7,7,7,8,
+9,0xa,0xa,4,4,4,0xa,0xa,0x300a,0xf00a,0xa,3,6,3,6,6,
+2,2,2,2,2,2,2,2,2,2,6,0xa,0x500a,0xa,0xd00a,0xa,
+0xa,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0x500a,0xa,0xd00a,0xa,0xa,
+0xa,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0x500a,0xa,0xd00a,0xa,0x12,
+0x12,0x12,0x12,0x12,0x12,7,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,
+0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,
+6,0xa,4,4,4,4,0xa,0xa,0xa,0xa,0,0x900a,0xa,0xb2,0xa,0xa,
+4,4,2,2,0xa,0,0xa,0xa,0xa,2,0,0x900a,0xa,0xa,0xa,0xa,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0xa,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0xa,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0xa,0xa,0,0,0,0,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,
+0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0,0xa,0xa,0xa,0xa,0xa,0xa,
+0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0,0,0,0,0xa,0xa,0xa,
+0xa,0xa,0xa,0xa,0xa,0xa,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,
+0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,
+0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,
+0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0,0,0xa,0xa,0,0,
+0,0,0,0,0,0,0xa,0,0,0,0,0,0xa,0xa,0,0xa,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0xa,0,0,0,0,0,
+0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0,0xb1,0xb1,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0xa,0,0,0,0,0,1,0xb1,0xb1,0xb1,
+0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,
+0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,1,0xb1,
+1,0xb1,0xb1,1,0xb1,0xb1,1,0xb1,1,1,1,1,1,1,1,1,
+1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+1,1,1,1,1,1,1,1,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,
+0xd,0xd,0xd,0xd,6,0xd,0xa,0xa,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xd,0xd,
+0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0x8d,0x8d,0x8d,0x8d,0x4d,0x8d,
+0x4d,0x8d,0x4d,0x4d,0x4d,0x4d,0x4d,0x8d,0x8d,0x8d,0x8d,0x4d,0x4d,0x4d,0x4d,0x4d,
+0x4d,0x4d,0x4d,0xd,0xd,0xd,0xd,0xd,0x2d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,
+0x8d,0x4d,0x4d,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,
+0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xd,5,5,5,5,5,5,5,5,
+5,5,4,5,5,0xd,0x4d,0x4d,0xb1,0x8d,0x8d,0x8d,0xd,0x8d,0x8d,0x8d,
+0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x8d,0x8d,0x8d,0x8d,0x8d,0x8d,0x8d,0x8d,
+0x8d,0x8d,0x8d,0x8d,0x8d,0x8d,0x8d,0x8d,0x8d,0x8d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,
+0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,
+0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x8d,0x4d,0x4d,0x8d,
+0x8d,0x8d,0x8d,0x8d,0x8d,0x8d,0x8d,0x8d,0x4d,0x8d,0x4d,0x8d,0x4d,0x4d,0x8d,0x8d,
+0xd,0x8d,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xd,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,
+0xb1,0xd,0xd,0xb1,0xb1,0xa,0xb1,0xb1,0xb1,0xb1,0x8d,0x8d,2,2,2,2,
+2,2,2,2,2,2,0x4d,0x4d,0x4d,0xd,0xd,0x4d,0xd,0xd,0xd,0xd,
+0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xb2,0x8d,0xb1,0x4d,0x4d,
+0x4d,0x8d,0x8d,0x8d,0x8d,0x8d,0x4d,0x4d,0x4d,0x4d,0x8d,0x4d,0x4d,0x4d,0x4d,0x4d,
+0x4d,0x4d,0x4d,0x4d,0x8d,0x4d,0x8d,0x4d,0x8d,0x4d,0x4d,0x8d,0xb1,0xb1,0xb1,0xb1,
+0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xd,
+0xd,0x8d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x8d,0x8d,0x8d,
+0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x8d,0x8d,0x4d,0xd,0xd,
+0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,
+0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,
+0xd,0xd,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xd,0xd,0xd,
+0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,1,1,1,1,
+1,1,1,1,1,1,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,
+0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0xb1,
+0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,1,1,0xa,0xa,0xa,0xa,0x21,1,
+1,1,1,1,0,0xb1,0xb1,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0xb1,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,
+0xb1,0,0,0,0,0xb1,0,0,0,0xb1,0xb1,0xb1,0xb1,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0xb1,0xb1,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0xb1,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0,0,0,
+0,0,0,0,0,0xb1,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0xb1,0xb1,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,4,4,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0xb1,0xb1,0,0,0,0,0xb1,
+0xb1,0,0,0xb1,0xb1,0xb1,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0xb1,0xb1,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0,0xb1,
+0xb1,0,0,0,0,0xb1,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0xb1,0xb1,0,0,0,0,
+0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0xb1,0,0,0xb1,0,0xb1,0xb1,0xb1,
+0,0,0,0,0,0,0,0,0,0xb1,0,0,0,0,0,0,
+0,0,0xb1,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0xb1,0,0,0,0,0,0,0,0,0,0,0,0,0xb1,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,4,0xa,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0,0,0,
+0,0,0xb1,0xb1,0xb1,0,0xb1,0xb1,0xb1,0xb1,0,0,0,0,0,0,
+0,0xb1,0xb1,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0xb1,0,0,0xa0,0,0,0,0,0,0,0xa0,0,0,0,0,0,
+0xb1,0xb1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0xb1,0xb1,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0xa,0xa,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0xb1,0xb1,0xb1,0,0,0,0,0,0,0,0,
+0,0xb1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0xb1,0,0,0,0,0,0,0,0xb1,0xb1,
+0xb1,0,0xb1,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0xb1,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,
+0,0,0,4,0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,
+0xb1,0xb1,0xb1,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0xb1,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0xb1,
+0xb1,0,0,0,0,0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,
+0xb1,0xb1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0xb1,0xb1,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0xb1,0,0xb1,0,0xb1,0x300a,0xf00a,0x300a,0xf00a,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,
+0xb1,0xb1,0xb1,0xb1,0xb1,0,0xb1,0xb1,0,0,0,0,0,0,0,0,
+0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,
+0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,
+0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0,0xb1,0,
+0,0,0xb1,0xb1,0,0xb1,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0xb1,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,
+0xa,0xa,0,0,0,0,0,0,9,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0x300a,0xf00a,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0xa0,0xa0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,
+0,0,0,0,0,0,0xb1,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,
+0xb1,0xb1,0xb1,0xb1,0,0,0,0,0,0,0,4,0,0xb1,0,0,
+0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xb1,0xb1,0xb1,9,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0xb1,0xb1,0xb1,0,0,0,0,0xb1,0xb1,0x11,0x11,0x11,0,0,0,0,
+0,0,0xb1,0,0,0,0,0,0,0xb1,0xb1,0xb1,0,0,0,0,
+0xa,0,0,0,0xa,0xa,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,
+0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,
+0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xb1,
+0xb1,0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0xb1,0,0xb1,0xb1,0xb1,0xb1,0xb1,0,
+0xb1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xb1,
+0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0,0,0,0,0,0,
+0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0xa,0,0xa,
+0xa,0xa,0,0,0,0,0,0,0,0,0,0,0,0xa,0xa,0xa,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0xa,0xa,0xa,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0xa,0xa,0,
+9,9,9,9,9,9,9,9,9,9,9,0xb2,0x412,0x432,0x8a0,0x8a1,
+0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0x300a,0xf00a,0x100a,0x100a,0x300a,0xf00a,0x100a,0x100a,
+0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,9,7,0x8ab,0x8ae,0x8b0,0x8ac,0x8af,6,
+4,4,4,4,4,0xa,0xa,0xa,0xa,0x300a,0xf00a,0xa,0xa,0xa,0xa,0xa,
+6,0x300a,0xf00a,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,
+0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,9,0xb2,0xb2,0xb2,0xb2,
+0x12,0x12,0x12,0x12,0x12,0x12,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,2,0,0,0,
+2,2,2,2,2,2,3,3,0xa,0x300a,0xf00a,0,2,2,2,2,
+2,2,2,2,2,2,3,3,0xa,0x300a,0xf00a,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,4,4,4,4,
+4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,
+4,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,
+0xb1,0xb1,0xb1,0xb1,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0xa,0xa,0,0xa,0xa,0xa,0xa,0,0xa,0xa,0,0,
+0,0,0,0,0,0,0,0,0xa,0,0xa,0xa,0xa,0,0,0,
+0,0,0xa,0xa,0xa,0xa,0xa,0xa,0,0xa,0,0xa,0,0xa,0,0,
+0,0,4,0,0,0,0,0,0,0,0,0,0,0,0xa,0xa,
+0,0,0,0,0x100a,0xa,0xa,0xa,0xa,0,0,0,0,0,0xa,0xa,
+0xa,0xa,0,0,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,
+0xa,0xa,0xa,0xa,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,
+0xa,0xa,0xa,0xa,0xa,0x100a,0x100a,0x100a,0x100a,0xa,0xa,0xa,0x700a,0x700a,0x700a,0xb00a,
+0xb00a,0xb00a,0xa,0xa,0xa,0x100a,3,4,0xa,0x900a,0x100a,0xa,0xa,0xa,0x100a,0x100a,
+0x100a,0x100a,0xa,0x100a,0x100a,0x100a,0x100a,0xa,0x100a,0xa,0x100a,0xa,0xa,0xa,0xa,0x100a,
+0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0xa,0xa,0xa,0xa,0xa,0x100a,0xa,0x100a,
+0x300a,0xf00a,0x100a,0x100a,0x100a,0x100a,0x100a,0x900a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,
+0x100a,0xa,0xa,0xa,0xa,0xa,0x300a,0xf00a,0x300a,0xf00a,0xa,0xa,0xa,0xa,0xa,0xa,
+0xa,0xa,0xa,0x100a,0x100a,0xa,0x100a,0xa,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,
+0xa,0xa,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,
+0x300a,0xf00a,0x300a,0xf00a,0x100a,0xa,0xa,0x300a,0xf00a,0x300a,0xf00a,0xa,0xa,0xa,0xa,0xa,
+0x900a,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0x300a,0xf00a,0xa,0xa,0x900a,0x100a,
+0x900a,0x900a,0x100a,0x900a,0x100a,0x100a,0x100a,0x100a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,
+0x100a,0xa,0xa,0xa,0xa,0xa,0x100a,0x100a,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,
+0xa,0x300a,0xf00a,0x300a,0xf00a,0x900a,0xa,0xa,0x300a,0xf00a,0xa,0xa,0xa,0xa,0x300a,0xf00a,
+0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0xa,0xa,
+0x300a,0xf00a,0x900a,0x900a,0x900a,0x100a,0x900a,0x900a,0x100a,0x100a,0x900a,0x900a,0x900a,0x900a,0x900a,0x100a,
+0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0x300a,0xf00a,0x300a,0xf00a,0xa,0xa,0xa,0xa,
+0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,
+0x100a,0x100a,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0x300a,0xf00a,0xa,0xa,0xa,0xa,0xa,
+0xa,0xa,0xa,0xa,0xa,0xa,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,
+0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0xa,0xa,0xa,0xa,0xa,0xa,
+0xa,0xa,0xa,0xa,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0xa,0xa,0xa,0xa,
+0xa,0xa,0xa,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0xa,0xa,0xa,0xa,
+0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0xa,0xa,0xa,0xa,
+0xa,0xa,0xa,0xa,2,2,2,2,2,2,2,2,2,2,2,2,
+2,2,2,2,2,2,2,2,0,0,0,0,0xa,0xa,0xa,0xa,
+0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,
+0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0,0,0xa,0xa,0xa,0xa,
+0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0xa,0xa,0xa,0xa,0xa,0xa,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0xa,0xa,0xa,
+0xa,0,0xa,0xa,0xa,0xa,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,
+0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0xa,0xa,0xa,
+0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,
+0xa,0xa,0xa,0xa,0,0xa,0,0xa,0xa,0xa,0xa,0,0,0,0xa,0,
+0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,
+0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0xa,0xa,
+0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,
+0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,
+0x100a,0xa,0xa,0x300a,0xf00a,0x300a,0xf00a,0xa,0xa,0xa,0xa,0,0,0,0,0,
+0xa,0xa,0xa,0x100a,0x100a,0x300a,0xf00a,0xa,0xa,0xa,0xa,0xa,0x100a,0x300a,0xf00a,0xa,
+0xa,0xa,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0,0,0,0,
+0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,
+0xa,0xa,0xa,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x700a,0x300a,0xf00a,
+0xb00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0xa,0xa,0x100a,0x100a,0x100a,0x100a,0x100a,
+0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0xa,0xa,0xa,0xa,
+0xa,0xa,0xa,0xa,0x900a,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0x300a,0xf00a,0x100a,0x100a,
+0x300a,0xf00a,0xa,0xa,0xa,0x100a,0xa,0xa,0xa,0xa,0x100a,0x300a,0xf00a,0x300a,0xf00a,0xa,
+0x300a,0xf00a,0xa,0xa,0x300a,0xf00a,0x300a,0xf00a,0x100a,0xa,0xa,0xa,0xa,0x100a,0xa,0x100a,
+0x100a,0x100a,0xa,0xa,0x100a,0x100a,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,
+0x100a,0x900a,0x100a,0x100a,0x300a,0xf00a,0xa,0xa,0x300a,0xf00a,0xa,0xa,0xa,0xa,0xa,0xa,
+0xa,0xa,0xa,0xa,0xa,0xa,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,
+0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0xa,0x100a,0x100a,0x100a,0x100a,0xa,0xa,
+0x100a,0xa,0x100a,0xa,0xa,0x100a,0xa,0x300a,0xf00a,0x300a,0xf00a,0xa,0xa,0xa,0xa,0xa,
+0x300a,0xf00a,0xa,0xa,0xa,0xa,0xa,0xa,0x300a,0xf00a,0x100a,0xa,0xa,0xa,0xa,0xa,
+0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,
+0xa,0xa,0xa,0x100a,0x100a,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0x300a,0xf00a,0xa,0xa,
+0xa,0xa,0x100a,0x100a,0x100a,0x100a,0xa,0x100a,0x100a,0xa,0xa,0x100a,0x100a,0xa,0xa,0xa,
+0xa,0x300a,0xf00a,0x100a,0x100a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x100a,0x100a,0x100a,
+0x100a,0x100a,0x100a,0x300a,0xf00a,0x100a,0x100a,0x100a,0x100a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,
+0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x100a,0x100a,0x100a,0x100a,0x300a,0xf00a,0x100a,0xa,0xa,0x300a,0xf00a,
+0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0xa,0x300a,0xf00a,0x100a,0x100a,0x300a,0xf00a,0x100a,0x100a,0x100a,
+0x100a,0x100a,0x100a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x100a,0x100a,0x100a,0x100a,0x100a,
+0x100a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0xa,0xa,0xa,0xa,0xa,
+0x100a,0xa,0x900a,0xa,0xa,0xa,0x100a,0x900a,0x900a,0x900a,0x100a,0xa,0xa,0xa,0xa,0xa,
+0x300a,0xf00a,0x100a,0xa,0xa,0xa,0xa,0x100a,0xa,0xa,0xa,0x300a,0xf00a,0x300a,0xf00a,0x100a,
+0xa,0x100a,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,
+0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,
+0,0,0,0,0xa,0xa,0xa,0xa,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,
+0xa,0xa,0x300a,0xf00a,0x300a,0xf00a,0xa,0xa,0xa,0x300a,0xf00a,0xa,0x300a,0xf00a,0xa,0xa,
+0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0,0,0,0x300a,0xf00a,0,0,
+0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,
+0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0xa,0xa,0xa,0xa,0xa,
+0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,
+0xa,0xa,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,
+0,0,0,0,9,0xa,0xa,0xa,0xa,0,0,0,0x300a,0xf00a,0x300a,0xf00a,
+0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0xa,0xa,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,
+0xa,0x300a,0xf00a,0x100a,0xa,0,0,0,0,0,0,0,0,0,0xb1,0xb1,
+0xb1,0xb1,0xb1,0xb1,0xa,0,0,0,0,0,0xa,0xa,0,0,0,0,
+0,0xa,0xa,0xa,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0xb1,0xb1,0xa,
+0xa,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0xa,0xa,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0xa,0xa,0xa,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,
+0xa,0xa,0xa,0xa,0,0,0,0,0,0,0,0,0,0,0,0,
+0xa,0xa,0xa,0xa,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0xa,0xa,0xa,0xa,0,
+0,0,0,0,0,0,0x11,0,0,0,0xb1,0,0,0,0,0xb1,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0xb1,0xb1,0,0xa,0xa,0xa,0xa,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+#ifndef U_DARWIN
+0xa,0xa,0xa,0xa,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,1,0xb1,1,1,1,1,1,1,1,1,1,1,3,1,1,
+1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+1,1,1,1,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,
+#else /* U_DARWIN */
+0xa,0xa,0xa,0xa,0,0,0,0,0,0,0,0,0xa,0xa,0xa,0xa,
+0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0x11,0x11,0x11,0x11,
+0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0,0,0xd,1,
+0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,
+0x11,0x11,0x11,0x11,0x11,0x11,1,1,1,1,1,0x11,4,2,0,0,
+0,0,0,0,0,0,0,0,0,0xa,0xa,0xa,0xa,0xa,0,0,
+0xa,0xa,0xa,0xa,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,1,0xb1,1,1,1,1,1,
+1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,
+1,1,1,1,1,1,1,1,1,1,1,1,0xd,0xd,0xd,0xd,
+#endif /* U_DARWIN */
+0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,
+#ifndef U_DARWIN
+0xd,0xd,0xa,0xa,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,
+0xd,0xd,0xd,0xd,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,
+0x12,0x12,0x12,0x12,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,
+0xd,0xa,0xd,0xd,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,
+0xb1,0xb1,0xb1,0xb1,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0,
+0,0,0,0,0xb1,0xb1,0xb1,0xb1,0,0,0,0,0,0,0,0,
+0,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,
+0xa,0xa,0xa,0xa,6,0xa,6,0,0xa,6,0xa,0xa,0xa,0x300a,0xf00a,0x300a,
+0xf00a,0x300a,0xf00a,4,0xa,0xa,3,3,0x300a,0xf00a,0xa,0,0xa,4,4,0xa,
+0,0,0,0,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,
+#else /* U_DARWIN */
+0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xa,0xa,0xd,0xd,0xd,0xd,
+0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0x12,0x12,0x12,0x12,
+0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0xd,0xd,0xd,0xd,
+0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xa,0xd,0xd,0xb1,0xb1,0xb1,0xb1,
+0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xa,0xa,0xa,0xa,
+0xa,0xa,0xa,0xa,0xa,0xa,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,
+0,0,0,0,0,0,0,0,0,0,0,0,0xa,0xa,0xa,0xa,
+0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,6,0xa,6,0,
+0xa,6,0xa,0xa,0xa,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,4,0xa,0xa,3,3,
+0x300a,0xf00a,0xa,0,0xa,4,4,0xa,0,0,0,0,0xd,0xd,0xd,0xd,
+#endif /* U_DARWIN */
+0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,
+#ifndef U_DARWIN
+0xd,0xd,0xd,0xb2,0,0xa,0xa,4,4,4,0xa,0xa,0x300a,0xf00a,0xa,3,
+6,3,6,6,2,2,2,2,2,2,2,2,2,2,6,0xa,
+0x500a,0xa,0xd00a,0xa,0xa,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0x500a,
+0xa,0xd00a,0xa,0x300a,0xf00a,0xa,0x300a,0xf00a,0xa,0xa,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,4,4,0xa,0xa,0xa,4,4,0,0xa,0xa,0xa,0xa,
+0xa,0xa,0xa,0,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0xaa,0xaa,0xaa,
+0xa,0xa,0x12,0x12,0,0xa,0,0,0,0,0,0,0,0,0,0,
+#else /* U_DARWIN */
+0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xb2,0,0xa,0xa,4,
+4,4,0xa,0xa,0x300a,0xf00a,0xa,3,6,3,6,6,2,2,2,2,
+2,2,2,2,2,2,6,0xa,0x500a,0xa,0xd00a,0xa,0xa,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0x500a,0xa,0xd00a,0xa,0x300a,0xf00a,0xa,0x300a,0xf00a,
+0xa,0xa,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,4,4,0xa,0xa,
+0xa,4,4,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0x12,0x12,0x12,0x12,
+0x12,0x12,0x12,0x12,0x12,0xaa,0xaa,0xaa,0xa,0xa,0x12,0x12,0,0xa,0,0,
+#endif /* U_DARWIN */
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+#ifndef U_DARWIN
+0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,
+#else /* U_DARWIN */
+0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,
+#endif /* U_DARWIN */
+1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+#ifndef U_DARWIN
+1,1,1,0xa,1,0xb1,0xb1,0xb1,1,0xb1,0xb1,1,1,1,1,1,
+0xb1,0xb1,0xb1,0xb1,1,1,1,1,1,1,1,1,1,1,1,1,
+1,1,1,1,1,1,1,1,1,1,1,1,0xb1,0xb1,0xb1,1,
+1,1,1,0xb1,0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0,0,
+0,0,0,0,0,0,0,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb1,
+0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0xa,0xa,0xb1,0xb1,
+0xb1,0xa,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0xa,0xa,0xa,0xa,
+0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,
+0xa,0xa,0xa,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0x1000,
+#else /* U_DARWIN */
+1,1,1,1,1,1,1,1,1,1,1,0xa,1,0xb1,0xb1,0xb1,
+1,0xb1,0xb1,1,1,1,1,1,0xb1,0xb1,0xb1,0xb1,1,1,1,1,
+1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+1,1,1,1,0xb1,0xb1,0xb1,1,1,1,1,0xb1,0,0,0,0,
+0,0,0,0xb1,0xb1,0xb1,0,0,0,0,0,0,0,0,0,0xb2,
+0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,
+0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xb1,0xb1,
+0xb1,0xb1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0xa,0xa,0xb1,0xb1,0xb1,0xa,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,
+0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0,0,0,0,
+#endif /* U_DARWIN */
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+#ifndef U_DARWIN
+0,0,0,0,0,0x1000,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0x1000,
+0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,
+#else /* U_DARWIN */
+0,0,0,0,0,0,0,0x1000,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0x1000,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0x1000,0,0,0,0,0,0,0,0,
+0,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
+#endif /* U_DARWIN */
+2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
+#ifndef U_DARWIN
+2,2,2,2,2,2,2,2,2,2,2,2,0,0,0,0,
+#else /* U_DARWIN */
+2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,
+#endif /* U_DARWIN */
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+#ifndef U_DARWIN
+0,0,0,0,0,0,0,0,0,0,0x12,0x12,0x12,0xb2,0x12,0x12,
+#else /* U_DARWIN */
+0,0,0x12,0x12,0x12,0xb2,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,
+#endif /* U_DARWIN */
+0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,
+#ifndef U_DARWIN
+0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0xb2,0xb2,0xb2,0xb2,
+#else /* U_DARWIN */
+0x12,0x12,0x12,0x12,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,
+#endif /* U_DARWIN */
+0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,
+#ifndef U_DARWIN
+0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0x12,0x12,0x12,0x12,
+#else /* U_DARWIN */
+0xb2,0xb2,0xb2,0xb2,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,
+#endif /* U_DARWIN */
+0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,
+#ifndef U_DARWIN
+0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0xb1,0xb1,0xb1,0xb1,
+0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0x12,0x12,0x12,0x12,
+0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x820,0,0x840,0x860,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0x880,0x8a0,0,0,
+0,0,0,0,0,0,0,0x8c0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0x8c0,0x8e0,0x900,0x900,0x900,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0
+#else /* U_DARWIN */
+0x12,0x12,0x12,0x12,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,
+0xb1,0xb1,0xb1,0xb1,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,
+0x12,0x12,0x12,0x12,0x820,0,0x840,0x860,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0x880,0x8a0,0,0,0,0,0,0,0,0,0,0x8c0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0x8c0,
+0x8e0,0x900,0x900,0x900,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+#endif /* U_DARWIN */
+};
+
+static const uint32_t ubidi_props_mirrors[26]={
+0x2000ab,0xbb,0x2a02215,0x1202243,0x2802298,0x2c022a6,0x30022a8,0x2e022a9,0x32022ab,0x6022cd,0x1e022f2,0x20022f3,0x22022f4,0x24022f6,0x26022f7,0x14022fa,
+0x16022fb,0x18022fc,0x1a022fd,0x1c022fe,0x8029b8,0x4029f5,0xa02ade,0xe02ae3,0xc02ae4,0x1002ae5
+};
+
+static const uint8_t ubidi_props_jgArray[332]={
+3,3,0x2c,3,0x2d,3,4,0x2a,4,4,0xd,0xd,0xd,6,6,0x1f,
+0x1f,0x23,0x23,0x21,0x21,0x28,0x28,1,1,0,0,0,0,0,0,9,
+0x1d,0x13,0x16,0x18,0x1a,0x10,0x2c,0x2d,0x2d,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,4,0x1d,0,3,
+3,3,0,3,0x2c,0x2c,0x2d,4,4,4,4,4,4,4,4,0xd,
+0xd,0xd,0xd,0xd,0xd,0xd,6,6,6,6,6,6,6,6,6,0x1f,
+0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x23,0x23,0x23,0x21,0x21,0x28,1,9,
+9,9,9,9,9,0x1d,0x1d,0xb,0x26,0xb,0x13,0x13,0x13,0xb,0xb,0xb,
+0xb,0xb,0xb,0x16,0x16,0x16,0x16,0x1a,0x1a,0x1a,0x1a,0x1a,0x15,0xd,0x2a,0x11,
+0x11,0xe,0x2c,0x2c,0x2c,0x2c,0x2c,0x2c,0x2c,0x2c,0x2d,0x2f,0x2d,0x2c,0x2d,0x2d,
+0x2e,0x2e,0,0x2a,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,6,0x1f,0,0,
+0,0,0,0,0,0,0,0,0x23,0x21,1,0,0,0x15,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,
+5,0xc,0xc,7,7,0xf,0x27,0x32,0x12,0x2b,0x2b,0x30,0x31,0x14,0x17,0x19,
+0x1b,0x24,0xa,8,0x1c,0x20,0x22,0x1e,7,0x25,0x29,5,0xc,7,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0x35,0x34,0x33,4,4,
+4,4,4,4,4,0xd,0xd,6,6,0x1f,0x23,1,1,1,9,9,
+0xb,0xb,0xb,0x18,0x18,0x1a,0x1a,0x1a,0x16,0x1f,0x1f,0x23
+};
+
+static const UBiDiProps ubidi_props_singleton={
+ NULL,
+ ubidi_props_indexes,
+ ubidi_props_mirrors,
+ ubidi_props_jgArray,
+ {
+ ubidi_props_trieIndex,
+ NULL,
+ utrie_defaultGetFoldingOffset,
+ 2336,
+#ifndef U_DARWIN
+ 5480,
+#else /* U_DARWIN */
+ 5616,
+#endif /* U_DARWIN */
+ 0,
+ TRUE
+ },
+ { 1,0,5,2 }
+};
diff --git a/icuSources/common/ubidiimp.h b/icuSources/common/ubidiimp.h
index 310e2a72..ca68858d 100644
--- a/icuSources/common/ubidiimp.h
+++ b/icuSources/common/ubidiimp.h
@@ -1,7 +1,7 @@
-/*
+/*
******************************************************************************
*
-* Copyright (C) 1999-2001, International Business Machines
+* Copyright (C) 1999-2006, International Business Machines
* Corporation and others. All Rights Reserved.
*
******************************************************************************
@@ -22,6 +22,7 @@
#include "unicode/utypes.h"
#include "unicode/uchar.h"
+#include "ubidi_props.h"
/* miscellaneous definitions ---------------------------------------------- */
@@ -32,7 +33,7 @@ typedef uint32_t Flags;
is easier with the same names for the BiDi types in the code as there.
See UCharDirection in uchar.h .
*/
-enum {
+enum {
L= U_LEFT_TO_RIGHT,
R= U_RIGHT_TO_LEFT,
EN= U_EUROPEAN_NUMBER,
@@ -101,45 +102,127 @@ enum {
/* the dirProp's L and R are defined to 0 and 1 values in UCharDirection */
#define GET_LR_FROM_LEVEL(level) ((DirProp)((level)&1))
-#define IS_DEFAULT_LEVEL(level) (((level)&0xfe)==0xfe)
+#define IS_DEFAULT_LEVEL(level) ((level)>=0xfe)
+
+/*
+ * The following bit is ORed to the property of characters in paragraphs
+ * with contextual RTL direction when paraLevel is contextual.
+ */
+#define CONTEXT_RTL 0x80
+#define NO_CONTEXT_RTL(dir) ((dir)&~CONTEXT_RTL)
+/*
+ * The following is a variant of DIRPROP_FLAG which ignores the CONTEXT_RTL bit.
+ */
+#define DIRPROP_FLAG_NC(dir) (1UL<<(NO_CONTEXT_RTL(dir)))
+
+#define GET_PARALEVEL(ubidi, index) \
+ (UBiDiLevel)((ubidi)->defaultParaLevel ? (ubidi)->dirProps[index]>>7 \
+ : (ubidi)->paraLevel)
+
+/* Paragraph type for multiple paragraph support ---------------------------- */
+typedef int32_t Para;
+
+#define CR 0x000D
+#define LF 0x000A
/* Run structure for reordering --------------------------------------------- */
+enum {
+ LRM_BEFORE=1,
+ LRM_AFTER=2,
+ RLM_BEFORE=4,
+ RLM_AFTER=8
+};
typedef struct Run {
int32_t logicalStart, /* first character of the run; b31 indicates even/odd level */
- visualLimit; /* last visual position of the run +1 */
+ visualLimit, /* last visual position of the run +1 */
+ insertRemove; /* if >0, flags for inserting LRM/RLM before/after run,
+ if <0, count of bidi controls within run */
} Run;
/* in a Run, logicalStart will get this bit set if the run level is odd */
#define INDEX_ODD_BIT (1UL<<31)
-#define MAKE_INDEX_ODD_PAIR(index, level) (index|((int32_t)level<<31))
-#define ADD_ODD_BIT_FROM_LEVEL(x, level) ((x)|=((int32_t)level<<31))
+#define MAKE_INDEX_ODD_PAIR(index, level) ((index)|((int32_t)(level)<<31))
+#define ADD_ODD_BIT_FROM_LEVEL(x, level) ((x)|=((int32_t)(level)<<31))
#define REMOVE_ODD_BIT(x) ((x)&=~INDEX_ODD_BIT)
-#define GET_INDEX(x) (x&~INDEX_ODD_BIT)
-#define GET_ODD_BIT(x) ((uint32_t)x>>31)
-#define IS_ODD_RUN(x) ((x&INDEX_ODD_BIT)!=0)
-#define IS_EVEN_RUN(x) ((x&INDEX_ODD_BIT)==0)
+#define GET_INDEX(x) ((x)&~INDEX_ODD_BIT)
+#define GET_ODD_BIT(x) ((uint32_t)(x)>>31)
+#define IS_ODD_RUN(x) (((x)&INDEX_ODD_BIT)!=0)
+#define IS_EVEN_RUN(x) (((x)&INDEX_ODD_BIT)==0)
U_CFUNC UBool
ubidi_getRuns(UBiDi *pBiDi);
+/** BiDi control code points */
+enum {
+ ZWNJ_CHAR=0x200c,
+ ZWJ_CHAR,
+ LRM_CHAR,
+ RLM_CHAR,
+ LRE_CHAR=0x202a,
+ RLE_CHAR,
+ PDF_CHAR,
+ LRO_CHAR,
+ RLO_CHAR
+};
+
+#define IS_BIDI_CONTROL_CHAR(c) (((uint32_t)(c)&0xfffffffc)==ZWNJ_CHAR || (uint32_t)((c)-LRE_CHAR)<5)
+
+/* InsertPoints structure for noting where to put BiDi marks ---------------- */
+
+typedef struct Point {
+ int32_t pos; /* position in text */
+ int32_t flag; /* flag for LRM/RLM, before/after */
+} Point;
+
+typedef struct InsertPoints {
+ int32_t capacity; /* number of points allocated */
+ int32_t size; /* number of points used */
+ int32_t confirmed; /* number of points confirmed */
+ UErrorCode errorCode; /* for eventual memory shortage */
+ Point *points; /* pointer to array of points */
+} InsertPoints;
+
+
/* UBiDi structure ----------------------------------------------------------- */
struct UBiDi {
+ /* pointer to parent paragraph object (pointer to self if this object is
+ * a paragraph object); set to NULL in a newly opened object; set to a
+ * real value after a successful execution of ubidi_setPara or ubidi_setLine
+ */
+ const UBiDi * pParaBiDi;
+
+ const UBiDiProps *bdp;
+
/* alias pointer to the current text */
const UChar *text;
/* length of the current text */
+ int32_t originalLength;
+
+ /* if the UBIDI_OPTION_STREAMING option is set, this is the length
+ * of text actually processed by ubidi_setPara, which may be shorter than
+ * the original length.
+ * Otherwise, it is identical to the original length.
+ */
int32_t length;
+ /* if the UBIDI_OPTION_REMOVE_CONTROLS option is set, and/or
+ * marks are allowed to be inserted in one of the reordering mode, the
+ * length of the result string may be different from the processed length.
+ */
+ int32_t resultLength;
+
/* memory sizes in bytes */
- int32_t dirPropsSize, levelsSize, runsSize;
+ int32_t dirPropsSize, levelsSize, parasSize, runsSize;
/* allocated memory */
DirProp *dirPropsMemory;
UBiDiLevel *levelsMemory;
+ Para *parasMemory;
Run *runsMemory;
/* indicators for whether memory may be allocated after ubidi_open() */
@@ -152,8 +235,29 @@ struct UBiDi {
/* are we performing an approximation of the "inverse BiDi" algorithm? */
UBool isInverse;
+ /* are we using the basic algorithm or its variation? */
+ UBiDiReorderingMode reorderingMode;
+
+ /* UBIDI_REORDER_xxx values must be ordered so that all the regular
+ * logical to visual modes come first, and all inverse BiDi modes
+ * come last.
+ */
+ #define UBIDI_REORDER_LAST_LOGICAL_TO_VISUAL UBIDI_REORDER_NUMBERS_SPECIAL
+
+ /* bitmask for reordering options */
+ uint32_t reorderingOptions;
+
+ /* must block separators receive level 0? */
+ UBool orderParagraphsLTR;
+
/* the paragraph level */
UBiDiLevel paraLevel;
+ /* original paraLevel when contextual */
+ /* must be one of UBIDI_DEFAULT_xxx or 0 if not contextual */
+ UBiDiLevel defaultParaLevel;
+
+ /* the following is set in ubidi_setPara, used in processPropertySeq */
+ const struct ImpTabPair * pImpTabPair; /* pointer to levels state table pair */
/* the overall paragraph or line directionality - see UBiDiDirection */
UBiDiDirection direction;
@@ -161,18 +265,43 @@ struct UBiDi {
/* flags is a bit set for which directional properties are in the text */
Flags flags;
+ /* lastArabicPos is index to the last AL in the text, -1 if none */
+ int32_t lastArabicPos;
+
/* characters after trailingWSStart are WS and are */
/* implicitly at the paraLevel (rule (L1)) - levels may not reflect that */
int32_t trailingWSStart;
+ /* fields for paragraph handling */
+ int32_t paraCount; /* set in getDirProps() */
+ Para *paras; /* limits of paragraphs, filled in
+ ResolveExplicitLevels() or CheckExplicitLevels() */
+
+ /* for single paragraph text, we only need a tiny array of paras (no malloc()) */
+ Para simpleParas[1];
+
/* fields for line reordering */
int32_t runCount; /* ==-1: runs not set up yet */
Run *runs;
/* for non-mixed text, we only need a tiny array of runs (no malloc()) */
Run simpleRuns[1];
+
+ /* for inverse Bidi with insertion of directional marks */
+ InsertPoints insertPoints;
+
+ /* for option UBIDI_OPTION_REMOVE_CONTROLS */
+ int32_t controlCount;
+
+ /* for Bidi class callback */
+ UBiDiClassCallback *fnClassCallback; /* action pointer */
+ const void *coClassCallback; /* context pointer */
};
+#define IS_VALID_PARA(x) ((x) && ((x)->pParaBiDi==(x)))
+#define IS_VALID_LINE(x) ((x) && ((x)->pParaBiDi) && ((x)->pParaBiDi->pParaBiDi==(x)->pParaBiDi))
+#define IS_VALID_PARA_OR_LINE(x) ((x) && ((x)->pParaBiDi==(x) || (((x)->pParaBiDi) && (x)->pParaBiDi->pParaBiDi==(x)->pParaBiDi)))
+
/* helper function to (re)allocate memory if allowed */
U_CFUNC UBool
ubidi_getMemory(void **pMemory, int32_t *pSize, UBool mayAllocate, int32_t sizeNeeded);
@@ -199,6 +328,10 @@ ubidi_getMemory(void **pMemory, int32_t *pSize, UBool mayAllocate, int32_t sizeN
ubidi_getMemory((void **)&(pBiDi)->levelsMemory, &(pBiDi)->levelsSize, \
TRUE, (length))
+#define getInitialParasMemory(pBiDi, length) \
+ ubidi_getMemory((void **)&(pBiDi)->parasMemory, &(pBiDi)->parasSize, \
+ TRUE, (length)*sizeof(Para))
+
#define getInitialRunsMemory(pBiDi, length) \
ubidi_getMemory((void **)&(pBiDi)->runsMemory, &(pBiDi)->runsSize, \
TRUE, (length)*sizeof(Run))
diff --git a/icuSources/common/ubidiln.c b/icuSources/common/ubidiln.c
index 6731cf2a..31866b47 100644
--- a/icuSources/common/ubidiln.c
+++ b/icuSources/common/ubidiln.c
@@ -1,7 +1,7 @@
-/*
+/*
******************************************************************************
*
-* Copyright (C) 1999-2003, International Business Machines
+* Copyright (C) 1999-2006, International Business Machines
* Corporation and others. All Rights Reserved.
*
******************************************************************************
@@ -33,8 +33,8 @@
* text in a single paragraph or in a line of a single paragraph
* which has already been processed according to
* the Unicode 3.0 BiDi algorithm as defined in
- * http://www.unicode.org/unicode/reports/tr9/ , version 5,
- * also described in The Unicode Standard, Version 3.0 .
+ * http://www.unicode.org/unicode/reports/tr9/ , version 13,
+ * also described in The Unicode Standard, Version 4.0.1 .
*
* This means that there is a UBiDi object with a levels
* and a dirProps array.
@@ -86,6 +86,9 @@
*
* To make subsequent operations easier, we also include the run
* before the WS if it is at the paraLevel - we merge the two here.
+ *
+ * This function is called only from ubidi_setLine(), so pBiDi->paraLevel is
+ * set correctly for the line even when contextual multiple paragraphs.
*/
static void
setTrailingWSStart(UBiDi *pBiDi) {
@@ -96,8 +99,18 @@ setTrailingWSStart(UBiDi *pBiDi) {
int32_t start=pBiDi->length;
UBiDiLevel paraLevel=pBiDi->paraLevel;
+ /* If the line is terminated by a block separator, all preceding WS etc...
+ are already set to paragraph level.
+ Setting trailingWSStart to pBidi->length will avoid changing the
+ level of B chars from 0 to paraLevel in ubidi_getLevels when
+ orderParagraphsLTR==TRUE.
+ */
+ if(NO_CONTEXT_RTL(dirProps[start-1])==B) {
+ pBiDi->trailingWSStart=start; /* currently == pBiDi->length */
+ return;
+ }
/* go backwards across all WS, BN, explicit codes */
- while(start>0 && DIRPROP_FLAG(dirProps[start-1])&MASK_WS) {
+ while(start>0 && DIRPROP_FLAG_NC(dirProps[start-1])&MASK_WS) {
--start;
}
@@ -121,21 +134,39 @@ ubidi_setLine(const UBiDi *pParaBiDi,
/* check the argument values */
if(pErrorCode==NULL || U_FAILURE(*pErrorCode)) {
return;
- } else if(pParaBiDi==NULL || pLineBiDi==NULL) {
+ } else if(!IS_VALID_PARA(pParaBiDi) || pLineBiDi==NULL) {
*pErrorCode=U_ILLEGAL_ARGUMENT_ERROR;
return;
} else if(start<0 || start>limit || limit>pParaBiDi->length) {
*pErrorCode=U_INDEX_OUTOFBOUNDS_ERROR;
return;
+ } else if(ubidi_getParagraph(pParaBiDi, start, NULL, NULL, NULL, pErrorCode) !=
+ ubidi_getParagraph(pParaBiDi, limit-1, NULL, NULL, NULL, pErrorCode)) {
+ /* the line crosses a paragraph boundary */
+ *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR;
+ return;
}
/* set the values in pLineBiDi from its pParaBiDi parent */
+ pLineBiDi->pParaBiDi=NULL; /* mark unfinished setLine */
pLineBiDi->text=pParaBiDi->text+start;
length=pLineBiDi->length=limit-start;
- pLineBiDi->paraLevel=pParaBiDi->paraLevel;
-
+ pLineBiDi->resultLength=pLineBiDi->originalLength=length;
+ pLineBiDi->paraLevel=GET_PARALEVEL(pParaBiDi, start);
+ pLineBiDi->paraCount=pParaBiDi->paraCount;
pLineBiDi->runs=NULL;
pLineBiDi->flags=0;
+ pLineBiDi->reorderingMode=pParaBiDi->reorderingMode;
+ pLineBiDi->reorderingOptions=pParaBiDi->reorderingOptions;
+ pLineBiDi->controlCount=0;
+ if(pParaBiDi->controlCount>0) {
+ int32_t j;
+ for(j=start; jtext[j])) {
+ pLineBiDi->controlCount++;
+ }
+ }
+ }
if(length>0) {
pLineBiDi->dirProps=pParaBiDi->dirProps+start;
@@ -222,16 +253,17 @@ ubidi_setLine(const UBiDi *pParaBiDi,
pLineBiDi->dirProps=NULL;
pLineBiDi->levels=NULL;
}
+ pLineBiDi->pParaBiDi=pParaBiDi; /* mark successful setLine */
return;
}
U_CAPI UBiDiLevel U_EXPORT2
ubidi_getLevelAt(const UBiDi *pBiDi, int32_t charIndex) {
/* return paraLevel if in the trailing WS run, otherwise the real level */
- if(pBiDi==NULL || charIndex<0 || pBiDi->length<=charIndex) {
+ if(!IS_VALID_PARA_OR_LINE(pBiDi) || charIndex<0 || pBiDi->length<=charIndex) {
return 0;
} else if(pBiDi->direction!=UBIDI_MIXED || charIndex>=pBiDi->trailingWSStart) {
- return pBiDi->paraLevel;
+ return GET_PARALEVEL(pBiDi, charIndex);
} else {
return pBiDi->levels[charIndex];
}
@@ -243,7 +275,7 @@ ubidi_getLevels(UBiDi *pBiDi, UErrorCode *pErrorCode) {
if(pErrorCode==NULL || U_FAILURE(*pErrorCode)) {
return NULL;
- } else if(pBiDi==NULL || (length=pBiDi->length)<=0) {
+ } else if(!IS_VALID_PARA_OR_LINE(pBiDi) || (length=pBiDi->length)<=0) {
*pErrorCode=U_ILLEGAL_ARGUMENT_ERROR;
return NULL;
}
@@ -267,6 +299,8 @@ ubidi_getLevels(UBiDi *pBiDi, UErrorCode *pErrorCode) {
if(start>0 && levels!=pBiDi->levels) {
uprv_memcpy(levels, pBiDi->levels, start);
}
+ /* pBiDi->paraLevel is ok even if contextual multiple paragraphs,
+ since pBidi is a line object */
uprv_memset(levels+start, pBiDi->paraLevel, length-start);
/* this new levels array is set for the line and reflects the WS run */
@@ -284,7 +318,8 @@ ubidi_getLogicalRun(const UBiDi *pBiDi, int32_t logicalStart,
int32_t *pLogicalLimit, UBiDiLevel *pLevel) {
int32_t length;
- if(pBiDi==NULL || logicalStart<0 || (length=pBiDi->length)<=logicalStart) {
+ if(!IS_VALID_PARA_OR_LINE(pBiDi) || logicalStart<0 ||
+ (length=pBiDi->length)<=logicalStart) {
return;
}
@@ -293,7 +328,7 @@ ubidi_getLogicalRun(const UBiDi *pBiDi, int32_t logicalStart,
*pLogicalLimit=length;
}
if(pLevel!=NULL) {
- *pLevel=pBiDi->paraLevel;
+ *pLevel=GET_PARALEVEL(pBiDi, logicalStart);
}
} else {
UBiDiLevel *levels=pBiDi->levels;
@@ -318,7 +353,8 @@ U_CAPI int32_t U_EXPORT2
ubidi_countRuns(UBiDi *pBiDi, UErrorCode *pErrorCode) {
if(pErrorCode==NULL || U_FAILURE(*pErrorCode)) {
return -1;
- } else if(pBiDi==NULL || (pBiDi->runCount<0 && !ubidi_getRuns(pBiDi))) {
+ } else if(!IS_VALID_PARA_OR_LINE(pBiDi) ||
+ (pBiDi->runCount<0 && !ubidi_getRuns(pBiDi))) {
*pErrorCode=U_MEMORY_ALLOCATION_ERROR;
return -1;
} else {
@@ -329,7 +365,7 @@ ubidi_countRuns(UBiDi *pBiDi, UErrorCode *pErrorCode) {
U_CAPI UBiDiDirection U_EXPORT2
ubidi_getVisualRun(UBiDi *pBiDi, int32_t runIndex,
int32_t *pLogicalStart, int32_t *pLength) {
- if( pBiDi==NULL || runIndex<0 ||
+ if( !IS_VALID_PARA_OR_LINE(pBiDi) || runIndex<0 ||
(pBiDi->runCount==-1 && !ubidi_getRuns(pBiDi)) ||
runIndex>=pBiDi->runCount
) {
@@ -361,6 +397,7 @@ getSingleRun(UBiDi *pBiDi, UBiDiLevel level) {
/* fill and reorder the single run */
pBiDi->runs[0].logicalStart=MAKE_INDEX_ODD_PAIR(0, level);
pBiDi->runs[0].visualLimit=pBiDi->length;
+ pBiDi->runs[0].insertRemove=0;
}
/* reorder the runs array (L2) ---------------------------------------------- */
@@ -398,10 +435,9 @@ getSingleRun(UBiDi *pBiDi, UBiDiLevel level) {
*/
static void
reorderLine(UBiDi *pBiDi, UBiDiLevel minLevel, UBiDiLevel maxLevel) {
- Run *runs;
+ Run *runs, tempRun;
UBiDiLevel *levels;
- int32_t firstRun, endRun, limitRun, runCount,
- temp;
+ int32_t firstRun, endRun, limitRun, runCount;
/* nothing to do? */
if(maxLevel<=(minLevel|1)) {
@@ -444,14 +480,9 @@ reorderLine(UBiDi *pBiDi, UBiDiLevel minLevel, UBiDiLevel maxLevel) {
/* Swap the entire sequence of runs from firstRun to limitRun-1. */
endRun=limitRun-1;
while(firstRunruns;
+ int32_t runCount=pBiDi->runCount, visualStart=0, i, length, logicalStart;
+
+ for(i=0; i=logicalStart) && (logicalIndex<(logicalStart+length))) {
+ return i;
+ }
+ visualStart+=length;
+ }
+ /* we should never get here */
+ i=length+25;
+ i/=(i-length-25); /* force program crash */
+ return 0;
+}
+
/*
* Compute the runs array from the levels array.
* After ubidi_getRuns() returns TRUE, runCount is guaranteed to be >0
* and the runs are reordered.
* Odd-level runs have visualStart on their visual right edge and
* they progress visually to the left.
+ * If option UBIDI_OPTION_INSERT_MARKS is set, insertRemove will contain the
+ * sum of appropriate LRM/RLM_BEFORE/AFTER flags.
+ * If option UBIDI_OPTION_REMOVE_CONTROLS is set, insertRemove will contain the
+ * negative number of BiDi control characters within this run.
*/
U_CFUNC UBool
ubidi_getRuns(UBiDi *pBiDi) {
if(pBiDi->direction!=UBIDI_MIXED) {
/* simple, single-run case - this covers length==0 */
+ /* pBiDi->paraLevel is ok even for contextual multiple paragraphs */
getSingleRun(pBiDi, pBiDi->paraLevel);
} else /* UBIDI_MIXED, length>0 */ {
/* mixed directionality */
@@ -521,7 +570,7 @@ ubidi_getRuns(UBiDi *pBiDi) {
limit=pBiDi->trailingWSStart;
if(limit==0) {
/* there is only WS on this line */
- getSingleRun(pBiDi, pBiDi->paraLevel);
+ getSingleRun(pBiDi, GET_PARALEVEL(pBiDi, 0));
} else {
UBiDiLevel *levels=pBiDi->levels;
int32_t i, runCount;
@@ -550,7 +599,7 @@ ubidi_getRuns(UBiDi *pBiDi) {
int32_t runIndex, start;
UBiDiLevel minLevel=UBIDI_MAX_EXPLICIT_LEVEL+1, maxLevel=0;
- /* now, count a (non-mergable) WS run */
+ /* now, count a (non-mergeable) WS run */
if(limit444, 484->444, 575->555, 595->555 */
- /* however, that would take longer and make other functions more complicated */
+ /* FOOD FOR THOUGHT: this could be optimized, e.g.:
+ * 464->444, 484->444, 575->555, 595->555
+ * However, that would take longer. Check also how it would
+ * interact with BiDi control removal and inserting Marks.
+ */
runIndex=0;
/* search for the run limits and initialize visualLimit values with the run lengths */
@@ -586,6 +638,7 @@ ubidi_getRuns(UBiDi *pBiDi) {
/* i is another run limit */
runs[runIndex].logicalStart=start;
runs[runIndex].visualLimit=i-start;
+ runs[runIndex].insertRemove=0;
++runIndex;
} while(iparaLevel is ok even
+ if contextual multiple paragraphs. */
if(pBiDi->paraLevelparaLevel;
}
@@ -605,17 +660,17 @@ ubidi_getRuns(UBiDi *pBiDi) {
reorderLine(pBiDi, minLevel, maxLevel);
/* now add the direction flags and adjust the visualLimit's to be just that */
- ADD_ODD_BIT_FROM_LEVEL(runs[0].logicalStart, levels[runs[0].logicalStart]);
- limit=runs[0].visualLimit;
-
/* this loop will also handle the trailing WS run */
- for(i=1; iparaLevel is ok even if
+ contextual multiple paragraphs. */
if(runIndexparaLevel & 1) != 0)? 0 : runIndex;
@@ -624,6 +679,30 @@ ubidi_getRuns(UBiDi *pBiDi) {
}
}
}
+
+ /* handle insert LRM/RLM BEFORE/AFTER run */
+ if(pBiDi->insertPoints.size>0) {
+ Point *point, *start=pBiDi->insertPoints.points,
+ *limit=start+pBiDi->insertPoints.size;
+ int32_t runIndex;
+ for(point=start; pointpos);
+ pBiDi->runs[runIndex].insertRemove|=point->flag;
+ }
+ }
+
+ /* handle remove BiDi control characters */
+ if(pBiDi->controlCount>0) {
+ int32_t runIndex;
+ const UChar *start=pBiDi->text, *limit=start+pBiDi->length, *pu;
+ for(pu=start; puruns[runIndex].insertRemove--;
+ }
+ }
+ }
+
return TRUE;
}
@@ -794,9 +873,10 @@ ubidi_reorderVisual(const UBiDiLevel *levels, int32_t length, int32_t *indexMap)
U_CAPI int32_t U_EXPORT2
ubidi_getVisualIndex(UBiDi *pBiDi, int32_t logicalIndex, UErrorCode *pErrorCode) {
+ int32_t visualIndex;
if(pErrorCode==NULL || U_FAILURE(*pErrorCode)) {
return 0;
- } else if(pBiDi==NULL) {
+ } else if(!IS_VALID_PARA_OR_LINE(pBiDi)) {
*pErrorCode=U_ILLEGAL_ARGUMENT_ERROR;
return 0;
} else if(logicalIndex<0 || pBiDi->length<=logicalIndex) {
@@ -806,9 +886,11 @@ ubidi_getVisualIndex(UBiDi *pBiDi, int32_t logicalIndex, UErrorCode *pErrorCode)
/* we can do the trivial cases without the runs array */
switch(pBiDi->direction) {
case UBIDI_LTR:
- return logicalIndex;
+ visualIndex=logicalIndex;
+ break;
case UBIDI_RTL:
- return pBiDi->length-logicalIndex-1;
+ visualIndex=pBiDi->length-logicalIndex-1;
+ break;
default:
if(pBiDi->runCount<0 && !ubidi_getRuns(pBiDi)) {
*pErrorCode=U_MEMORY_ALLOCATION_ERROR;
@@ -824,92 +906,288 @@ ubidi_getVisualIndex(UBiDi *pBiDi, int32_t logicalIndex, UErrorCode *pErrorCode)
if(offset>=0 && offsetinsertPoints.size>0) {
+ /* add the number of added marks until the calculated visual index */
+ Run *runs=pBiDi->runs;
+ int32_t i, length, insertRemove;
+ int32_t visualStart=0, markFound=0;
+ for(i=0; ; i++, visualStart+=length) {
+ length=runs[i].visualLimit-visualStart;
+ insertRemove=runs[i].insertRemove;
+ if(insertRemove & (LRM_BEFORE|RLM_BEFORE)) {
+ markFound++;
+ }
+ /* is it the run containing the visual index? */
+ if(visualIndexcontrolCount>0) {
+ /* subtract the number of controls until the calculated visual index */
+ Run *runs=pBiDi->runs;
+ int32_t i, j, start, limit, length, insertRemove;
+ int32_t visualStart=0, controlFound=0;
+ UChar uchar=pBiDi->text[logicalIndex];
+ /* is the logical index pointing to a control ? */
+ if(IS_BIDI_CONTROL_CHAR(uchar)) {
+ return UBIDI_MAP_NOWHERE;
+ }
+ /* loop on runs */
+ for(i=0; ; i++, visualStart+=length) {
+ length=runs[i].visualLimit-visualStart;
+ insertRemove=runs[i].insertRemove;
+ /* calculated visual index is beyond this run? */
+ if(visualIndex>=runs[i].visualLimit) {
+ controlFound-=insertRemove;
+ continue;
+ }
+ /* calculated visual index must be within current run */
+ if(insertRemove==0) {
+ return visualIndex-controlFound;
+ }
+ if(IS_EVEN_RUN(runs[i].logicalStart)) {
+ /* LTR: check from run start to logical index */
+ start=runs[i].logicalStart;
+ limit=logicalIndex;
+ } else {
+ /* RTL: check from logical index to run end */
+ start=logicalIndex+1;
+ limit=runs[i].logicalStart+length;
+ }
+ for(j=start; jtext[j];
+ if(IS_BIDI_CONTROL_CHAR(uchar)) {
+ controlFound++;
+ }
+ }
+ return visualIndex-controlFound;
+ }
+ }
+
+ return visualIndex;
}
U_CAPI int32_t U_EXPORT2
ubidi_getLogicalIndex(UBiDi *pBiDi, int32_t visualIndex, UErrorCode *pErrorCode) {
+ Run *runs;
+ int32_t i, runCount, start;
if(pErrorCode==NULL || U_FAILURE(*pErrorCode)) {
return 0;
- } else if(pBiDi==NULL) {
+ } else if(!IS_VALID_PARA_OR_LINE(pBiDi)) {
*pErrorCode=U_ILLEGAL_ARGUMENT_ERROR;
return 0;
- } else if(visualIndex<0 || pBiDi->length<=visualIndex) {
+ } else if(visualIndex<0 || pBiDi->resultLength<=visualIndex) {
*pErrorCode=U_INDEX_OUTOFBOUNDS_ERROR;
return 0;
- } else {
- /* we can do the trivial cases without the runs array */
- switch(pBiDi->direction) {
- case UBIDI_LTR:
+ }
+ /* we can do the trivial cases without the runs array */
+ if(pBiDi->insertPoints.size==0 && pBiDi->controlCount==0) {
+ if(pBiDi->direction==UBIDI_LTR) {
return visualIndex;
- case UBIDI_RTL:
+ }
+ else if(pBiDi->direction==UBIDI_RTL) {
return pBiDi->length-visualIndex-1;
- default:
- if(pBiDi->runCount<0 && !ubidi_getRuns(pBiDi)) {
- *pErrorCode=U_MEMORY_ALLOCATION_ERROR;
- return 0;
- } else {
- Run *runs=pBiDi->runs;
- int32_t i, runCount=pBiDi->runCount, start;
-
- if(runCount<=10) {
- /* linear search for the run */
- for(i=0; visualIndex>=runs[i].visualLimit; ++i) {}
- } else {
- /* binary search for the run */
- int32_t begin=0, limit=runCount;
+ }
+ if(pBiDi->runCount<0 && !ubidi_getRuns(pBiDi)) {
+ *pErrorCode=U_MEMORY_ALLOCATION_ERROR;
+ return 0;
+ }
+ }
- /* the middle if() will guaranteed find the run, we don't need a loop limit */
- for(;;) {
- i=(begin+limit)/2;
- if(visualIndex>=runs[i].visualLimit) {
- begin=i+1;
- } else if(i==0 || visualIndex>=runs[i-1].visualLimit) {
- break;
- } else {
- limit=i;
- }
- }
+ runs=pBiDi->runs;
+ runCount=pBiDi->runCount;
+ if(pBiDi->insertPoints.size>0) {
+ /* handle inserted LRM/RLM */
+ int32_t markFound=0, insertRemove;
+ int32_t visualStart=0, length;
+ runs=pBiDi->runs;
+ /* subtract number of marks until visual index */
+ for(i=0; ; i++, visualStart+=length) {
+ length=runs[i].visualLimit-visualStart;
+ insertRemove=runs[i].insertRemove;
+ if(insertRemove&(LRM_BEFORE|RLM_BEFORE)) {
+ if(visualIndex<=(visualStart+markFound)) {
+ return UBIDI_MAP_NOWHERE;
}
-
- start=runs[i].logicalStart;
- if(IS_EVEN_RUN(start)) {
- /* LTR */
- /* the offset in runs[i] is visualIndex-runs[i-1].visualLimit */
- if(i>0) {
- visualIndex-=runs[i-1].visualLimit;
- }
- return GET_INDEX(start)+visualIndex;
- } else {
- /* RTL */
- return GET_INDEX(start)+runs[i].visualLimit-visualIndex-1;
+ markFound++;
+ }
+ /* is adjusted visual index within this run? */
+ if(visualIndex<(runs[i].visualLimit+markFound)) {
+ visualIndex-=markFound;
+ break;
+ }
+ if(insertRemove&(LRM_AFTER|RLM_AFTER)) {
+ if(visualIndex==(visualStart+length+markFound)) {
+ return UBIDI_MAP_NOWHERE;
+ }
+ markFound++;
+ }
+ }
+ }
+ else if(pBiDi->controlCount>0) {
+ /* handle removed BiDi control characters */
+ int32_t controlFound=0, insertRemove, length;
+ int32_t logicalStart, logicalEnd, visualStart=0, j, k;
+ UChar uchar;
+ UBool evenRun;
+ /* add number of controls until visual index */
+ for(i=0; ; i++, visualStart+=length) {
+ length=runs[i].visualLimit-visualStart;
+ insertRemove=runs[i].insertRemove;
+ /* is adjusted visual index beyond current run? */
+ if(visualIndex>=(runs[i].visualLimit-controlFound+insertRemove)) {
+ controlFound-=insertRemove;
+ continue;
+ }
+ /* adjusted visual index is within current run */
+ if(insertRemove==0) {
+ visualIndex+=controlFound;
+ break;
+ }
+ /* count non-control chars until visualIndex */
+ logicalStart=runs[i].logicalStart;
+ evenRun=IS_EVEN_RUN(logicalStart);
+ REMOVE_ODD_BIT(logicalStart);
+ logicalEnd=logicalStart+length-1;
+ for(j=0; jtext[k];
+ if(IS_BIDI_CONTROL_CHAR(uchar)) {
+ controlFound++;
+ }
+ if((visualIndex+controlFound)==(visualStart+j)) {
+ break;
}
}
+ visualIndex+=controlFound;
+ break;
}
}
+ /* handle all cases */
+ if(runCount<=10) {
+ /* linear search for the run */
+ for(i=0; visualIndex>=runs[i].visualLimit; ++i) {}
+ } else {
+ /* binary search for the run */
+ int32_t begin=0, limit=runCount;
+
+ /* the middle if() is guaranteed to find the run, we don't need a loop limit */
+ for(;;) {
+ i=(begin+limit)/2;
+ if(visualIndex>=runs[i].visualLimit) {
+ begin=i+1;
+ } else if(i==0 || visualIndex>=runs[i-1].visualLimit) {
+ break;
+ } else {
+ limit=i;
+ }
+ }
+ }
+
+ start=runs[i].logicalStart;
+ if(IS_EVEN_RUN(start)) {
+ /* LTR */
+ /* the offset in runs[i] is visualIndex-runs[i-1].visualLimit */
+ if(i>0) {
+ visualIndex-=runs[i-1].visualLimit;
+ }
+ return start+visualIndex;
+ } else {
+ /* RTL */
+ return GET_INDEX(start)+runs[i].visualLimit-visualIndex-1;
+ }
}
U_CAPI void U_EXPORT2
ubidi_getLogicalMap(UBiDi *pBiDi, int32_t *indexMap, UErrorCode *pErrorCode) {
- UBiDiLevel *levels;
+ const UBiDiLevel *levels;
/* ubidi_getLevels() checks all of its and our arguments */
- if((levels=(UBiDiLevel *)ubidi_getLevels(pBiDi, pErrorCode))==NULL) {
+ if((levels=ubidi_getLevels(pBiDi, pErrorCode))==NULL) {
/* no op */
} else if(indexMap==NULL) {
*pErrorCode=U_ILLEGAL_ARGUMENT_ERROR;
} else {
ubidi_reorderLogical(levels, pBiDi->length, indexMap);
+
+ if(pBiDi->insertPoints.size>0) {
+ int32_t markFound=0, runCount=pBiDi->runCount;
+ int32_t visualStart=0, length, insertRemove, i, j;
+ Run *runs=pBiDi->runs;
+ /* add number of marks found until each index */
+ for(i=0; i0) {
+ int32_t logicalStart=GET_INDEX(runs[i].logicalStart);
+ int32_t limit=logicalStart+length;
+ for(j=logicalStart; jcontrolCount>0) {
+ int32_t controlFound=0, runCount=pBiDi->runCount;
+ int32_t visualStart=0, length, insertRemove, i, j, k;
+ int32_t logicalStart, logicalEnd;
+ UBool evenRun;
+ UChar uchar;
+ Run *runs=pBiDi->runs;
+ /* subtract number of controls found until each index */
+ for(i=0; itext[k];
+ if(IS_BIDI_CONTROL_CHAR(uchar)) {
+ controlFound++;
+ indexMap[k]=UBIDI_MAP_NOWHERE;
+ continue;
+ }
+ indexMap[k]-=controlFound;
+ }
+ }
+ }
}
}
@@ -923,7 +1201,7 @@ ubidi_getVisualMap(UBiDi *pBiDi, int32_t *indexMap, UErrorCode *pErrorCode) {
} else {
/* fill a visual-to-logical index map using the runs[] */
Run *runs=pBiDi->runs, *runsLimit=runs+pBiDi->runCount;
- int32_t logicalStart, visualStart, visualLimit;
+ int32_t logicalStart, visualStart, visualLimit, *pi=indexMap;
visualStart=0;
for(; runsvisualLimit;
if(IS_EVEN_RUN(logicalStart)) {
do { /* LTR */
- *indexMap++ = logicalStart++;
+ *pi++ = logicalStart++;
} while(++visualStartinsertPoints.size>0) {
+ int32_t markFound=0, runCount=pBiDi->runCount;
+ int32_t insertRemove, i, j, k;
+ runs=pBiDi->runs;
+ /* count all inserted marks */
+ for(i=0; iresultLength;
+ for(i=runCount-1; i>=0 && markFound>0; i--) {
+ insertRemove=runs[i].insertRemove;
+ if(insertRemove&(LRM_AFTER|RLM_AFTER)) {
+ indexMap[--k]= UBIDI_MAP_NOWHERE;
+ markFound--;
+ }
+ visualStart= i>0 ? runs[i-1].visualLimit : 0;
+ for(j=runs[i].visualLimit-1; j>=visualStart && markFound>0; j--) {
+ indexMap[--k]=indexMap[j];
+ }
+ if(insertRemove&(LRM_BEFORE|RLM_BEFORE)) {
+ indexMap[--k]= UBIDI_MAP_NOWHERE;
+ markFound--;
+ }
+ }
+ }
+ else if(pBiDi->controlCount>0) {
+ int32_t runCount=pBiDi->runCount, logicalEnd;
+ int32_t insertRemove, length, i, j, k, m;
+ UChar uchar;
+ UBool evenRun;
+ runs=pBiDi->runs;
+ visualStart=0;
+ /* move forward indexes by number of preceding controls */
+ k=0;
+ for(i=0; itext[m];
+ if(!IS_BIDI_CONTROL_CHAR(uchar)) {
+ indexMap[k++]=m;
+ }
+ }
+ }
+ }
}
}
U_CAPI void U_EXPORT2
ubidi_invertMap(const int32_t *srcMap, int32_t *destMap, int32_t length) {
- if(srcMap!=NULL && destMap!=NULL) {
- srcMap+=length;
+ if(srcMap!=NULL && destMap!=NULL && length>0) {
+ const int32_t *pi;
+ int32_t destLength=-1, count=0;
+ /* find highest value and count positive indexes in srcMap */
+ pi=srcMap+length;
+ while(pi>srcMap) {
+ if(*--pi>destLength) {
+ destLength=*pi;
+ }
+ if(*pi>=0) {
+ count++;
+ }
+ }
+ destLength++; /* add 1 for origin 0 */
+ if(count0) {
- destMap[*--srcMap]=--length;
+ if(*--pi>=0) {
+ destMap[*pi]=--length;
+ } else {
+ --length;
+ }
}
}
}
diff --git a/icuSources/common/ubidiwrt.c b/icuSources/common/ubidiwrt.c
index 2d16465d..acbc4bb4 100644
--- a/icuSources/common/ubidiwrt.c
+++ b/icuSources/common/ubidiwrt.c
@@ -1,7 +1,7 @@
-/*
+/*
******************************************************************************
*
-* Copyright (C) 2000-2001, International Business Machines
+* Copyright (C) 2000-2006, International Business Machines
* Corporation and others. All Rights Reserved.
*
******************************************************************************
@@ -46,18 +46,6 @@
# error reimplement ubidi_writeReordered() for UTF-8, see comment above
#endif
-/** BiDi control code points */
-enum {
- LRM_CHAR=0x200e,
- RLM_CHAR,
- LRE_CHAR=0x202a,
- RLE_CHAR,
- PDF_CHAR,
- LRO_CHAR,
- RLO_CHAR
-};
-
-#define IS_BIDI_CONTROL_CHAR(c) (((uint32_t)(c)&0xfffffffe)==LRM_CHAR || (uint32_t)((c)-LRE_CHAR)<5)
#define IS_COMBINING(type) ((1UL<<(type))&(1UL<text)==NULL || (length=pBiDi->length)<0 ||
destSize<0 || (destSize>0 && dest==NULL))
{
*pErrorCode=U_ILLEGAL_ARGUMENT_ERROR;
@@ -388,7 +376,7 @@ ubidi_writeReordered(UBiDi *pBiDi,
/* do input and output overlap? */
if( dest!=NULL &&
((text>=dest && text=text && dest=text && destoriginalLength)))
{
*pErrorCode=U_ILLEGAL_ARGUMENT_ERROR;
return 0;
@@ -408,14 +396,32 @@ ubidi_writeReordered(UBiDi *pBiDi,
saveDest=dest;
destCapacity=destSize;
+ /*
+ * Option "insert marks" implies UBIDI_INSERT_LRM_FOR_NUMERIC if the
+ * reordering mode (checked below) is appropriate.
+ */
+ if(pBiDi->reorderingOptions & UBIDI_OPTION_INSERT_MARKS) {
+ options|=UBIDI_INSERT_LRM_FOR_NUMERIC;
+ options&=~UBIDI_REMOVE_BIDI_CONTROLS;
+ }
+ /*
+ * Option "remove controls" implies UBIDI_REMOVE_BIDI_CONTROLS
+ * and cancels UBIDI_INSERT_LRM_FOR_NUMERIC.
+ */
+ if(pBiDi->reorderingOptions & UBIDI_OPTION_REMOVE_CONTROLS) {
+ options|=UBIDI_REMOVE_BIDI_CONTROLS;
+ options&=~UBIDI_INSERT_LRM_FOR_NUMERIC;
+ }
/*
* If we do not perform the "inverse BiDi" algorithm, then we
* don't need to insert any LRMs, and don't need to test for it.
*/
- if(!ubidi_isInverse(pBiDi)) {
+ if((pBiDi->reorderingMode != UBIDI_REORDER_INVERSE_NUMBERS_AS_L) &&
+ (pBiDi->reorderingMode != UBIDI_REORDER_INVERSE_LIKE_DIRECT) &&
+ (pBiDi->reorderingMode != UBIDI_REORDER_INVERSE_FOR_NUMBERS_SPECIAL) &&
+ (pBiDi->reorderingMode != UBIDI_REORDER_RUNS_ONLY)) {
options&=~UBIDI_INSERT_LRM_FOR_NUMERIC;
}
-
/*
* Iterate through all visual runs and copy the run text segments to
* the destination, according to the options.
@@ -447,17 +453,36 @@ ubidi_writeReordered(UBiDi *pBiDi,
}
} else {
/* insert BiDi controls for "inverse BiDi" */
+ const DirProp *dirProps=pBiDi->dirProps;
const UChar *src;
+ UChar uc;
UBiDiDirection dir;
+ int32_t markFlag;
for(run=0; runruns[run].insertRemove;
+ if(markFlag<0) { /* insert count */
+ markFlag=0;
+ }
if(UBIDI_LTR==dir) {
- if(/*run>0 &&*/ u_charDirection(*src)!=U_LEFT_TO_RIGHT) {
+ if((pBiDi->isInverse) &&
+ (/*run>0 &&*/ dirProps[logicalStart]!=L)) {
+ markFlag |= LRM_BEFORE;
+ }
+ if (markFlag & LRM_BEFORE) {
+ uc=LRM_CHAR;
+ }
+ else if (markFlag & RLM_BEFORE) {
+ uc=RLM_CHAR;
+ }
+ else uc=0;
+ if(uc) {
if(destSize>0) {
- *dest++=LRM_CHAR;
+ *dest++=uc;
}
--destSize;
}
@@ -468,16 +493,38 @@ ubidi_writeReordered(UBiDi *pBiDi,
dest+=runLength;
destSize-=runLength;
- if(/*runisInverse) &&
+ (/*run0) {
- *dest++=LRM_CHAR;
+ *dest++=uc;
}
--destSize;
}
- } else {
- if(/*run>0 &&*/ !(MASK_R_AL&1UL<isInverse) &&
+ (/*run>0 &&*/ !(MASK_R_AL&DIRPROP_FLAG(dirProps[logicalStart+runLength-1])))) {
+ markFlag |= RLM_BEFORE;
+ }
+ if (markFlag & LRM_BEFORE) {
+ uc=LRM_CHAR;
+ }
+ else if (markFlag & RLM_BEFORE) {
+ uc=RLM_CHAR;
+ }
+ else uc=0;
+ if(uc) {
if(destSize>0) {
- *dest++=RLM_CHAR;
+ *dest++=uc;
}
--destSize;
}
@@ -488,9 +535,20 @@ ubidi_writeReordered(UBiDi *pBiDi,
dest+=runLength;
destSize-=runLength;
- if(/*runisInverse) &&
+ (/*run0) {
- *dest++=RLM_CHAR;
+ *dest++=uc;
}
--destSize;
}
@@ -516,6 +574,7 @@ ubidi_writeReordered(UBiDi *pBiDi,
}
} else {
/* insert BiDi controls for "inverse BiDi" */
+ const DirProp *dirProps=pBiDi->dirProps;
const UChar *src;
UBiDiDirection dir;
@@ -525,7 +584,7 @@ ubidi_writeReordered(UBiDi *pBiDi,
src=text+logicalStart;
if(UBIDI_LTR==dir) {
- if(/*run0) {
*dest++=LRM_CHAR;
}
@@ -538,14 +597,14 @@ ubidi_writeReordered(UBiDi *pBiDi,
dest+=runLength;
destSize-=runLength;
- if(/*run>0 &&*/ u_charDirection(*src)!=U_LEFT_TO_RIGHT) {
+ if(/*run>0 &&*/ dirProps[logicalStart]!=L) {
if(destSize>0) {
*dest++=LRM_CHAR;
}
--destSize;
}
} else {
- if(/*run0) {
*dest++=RLM_CHAR;
}
@@ -558,7 +617,7 @@ ubidi_writeReordered(UBiDi *pBiDi,
dest+=runLength;
destSize-=runLength;
- if(/*run>0 &&*/ !(MASK_R_AL&1UL<0 &&*/ !(MASK_R_AL&DIRPROP_FLAG(dirProps[logicalStart+runLength-1]))) {
if(destSize>0) {
*dest++=RLM_CHAR;
}
diff --git a/icuSources/common/ubrk.cpp b/icuSources/common/ubrk.cpp
index 710fd980..3f941a54 100644
--- a/icuSources/common/ubrk.cpp
+++ b/icuSources/common/ubrk.cpp
@@ -1,6 +1,6 @@
/*
*****************************************************************************************
-* Copyright (C) 1996-2004, International Business Machines
+* Copyright (C) 1996-2006, International Business Machines
* Corporation and others. All Rights Reserved.
*****************************************************************************************
*/
@@ -17,6 +17,7 @@
#include "unicode/uchriter.h"
#include "unicode/rbbi.h"
#include "rbbirb.h"
+#include "uassert.h"
U_NAMESPACE_USE
@@ -59,6 +60,9 @@ ubrk_open(UBreakIteratorType type,
case UBRK_TITLE:
result = BreakIterator::createTitleInstance(Locale(locale), *status);
break;
+
+ default:
+ *status = U_ILLEGAL_ARGUMENT_ERROR;
}
// check for allocation error
@@ -70,16 +74,12 @@ ubrk_open(UBreakIteratorType type,
return 0;
}
- UCharCharacterIterator *iter = 0;
- iter = new UCharCharacterIterator(text, textLength);
- if(iter == 0) {
- *status = U_MEMORY_ALLOCATION_ERROR;
- delete result;
- return 0;
- }
- result->adoptText(iter);
- return (UBreakIterator*)result;
+ UBreakIterator *uBI = (UBreakIterator *)result;
+ if (text != NULL) {
+ ubrk_setText(uBI, text, textLength, status);
+ }
+ return uBI;
}
@@ -109,17 +109,11 @@ ubrk_openRules( const UChar *rules,
return 0;
}
+ UBreakIterator *uBI = (UBreakIterator *)result;
if (text != NULL) {
- UCharCharacterIterator *iter = 0;
- iter = new UCharCharacterIterator(text, textLength);
- if(iter == 0) {
- *status = U_MEMORY_ALLOCATION_ERROR;
- delete result;
- return 0;
- }
- result->adoptText(iter);
+ ubrk_setText(uBI, text, textLength, status);
}
- return (UBreakIterator *)result;
+ return uBI;
}
@@ -140,6 +134,12 @@ ubrk_safeClone(
*status = U_ILLEGAL_ARGUMENT_ERROR;
return 0;
}
+ // Clear any incoming Safe Clone Allocated warning.
+ // Propagating this through to our return would really
+ // confuse our caller.
+ if (*status==U_SAFECLONE_ALLOCATED_WARNING) {
+ *status = U_ZERO_ERROR;
+ }
return (UBreakIterator *)(((BreakIterator*)bi)->
createBufferClone(stackBuffer, *pBufferSize, *status));
}
@@ -166,59 +166,62 @@ ubrk_setText(UBreakIterator* bi,
int32_t textLength,
UErrorCode* status)
{
+ BreakIterator *brit = (BreakIterator *)bi;
+ UText ut = UTEXT_INITIALIZER;
+ utext_openUChars(&ut, text, textLength, status);
+ brit->setText(&ut, *status);
+ // A stack allocated UText wrapping a UCHar * string
+ // can be dumped without explicitly closing it.
+}
- if (U_FAILURE(*status)) return;
- const CharacterIterator& biText = ((BreakIterator*)bi)->getText();
- int32_t textLen = (textLength == -1 ? u_strlen(text) : textLength);
- if (biText.getDynamicClassID() == UCharCharacterIterator::getStaticClassID()) {
- ((UCharCharacterIterator&)biText).setText(text, textLen);
- }
- else {
- UCharCharacterIterator *iter = 0;
- iter = new UCharCharacterIterator(text, textLen);
- if(iter == 0) {
- *status = U_MEMORY_ALLOCATION_ERROR;
- return;
- }
- ((BreakIterator*)bi)->adoptText(iter);
- }
+U_DRAFT void U_EXPORT2
+ubrk_setUText(UBreakIterator *bi,
+ UText *text,
+ UErrorCode *status)
+{
+ RuleBasedBreakIterator *brit = (RuleBasedBreakIterator *)bi;
+ brit->RuleBasedBreakIterator::setText(text, *status);
}
+
+
+
+
U_CAPI int32_t U_EXPORT2
ubrk_current(const UBreakIterator *bi)
{
- return ((BreakIterator*)bi)->current();
+ return ((RuleBasedBreakIterator*)bi)->RuleBasedBreakIterator::current();
}
U_CAPI int32_t U_EXPORT2
ubrk_next(UBreakIterator *bi)
{
- return ((BreakIterator*)bi)->next();
+ return ((RuleBasedBreakIterator*)bi)->RuleBasedBreakIterator::next();
}
U_CAPI int32_t U_EXPORT2
ubrk_previous(UBreakIterator *bi)
{
- return ((BreakIterator*)bi)->previous();
+ return ((RuleBasedBreakIterator*)bi)->RuleBasedBreakIterator::previous();
}
U_CAPI int32_t U_EXPORT2
ubrk_first(UBreakIterator *bi)
{
- return ((BreakIterator*)bi)->first();
+ return ((RuleBasedBreakIterator*)bi)->RuleBasedBreakIterator::first();
}
U_CAPI int32_t U_EXPORT2
ubrk_last(UBreakIterator *bi)
{
- return ((BreakIterator*)bi)->last();
+ return ((RuleBasedBreakIterator*)bi)->RuleBasedBreakIterator::last();
}
U_CAPI int32_t U_EXPORT2
@@ -226,7 +229,7 @@ ubrk_preceding(UBreakIterator *bi,
int32_t offset)
{
- return ((BreakIterator*)bi)->preceding(offset);
+ return ((RuleBasedBreakIterator*)bi)->RuleBasedBreakIterator::preceding(offset);
}
U_CAPI int32_t U_EXPORT2
@@ -234,7 +237,7 @@ ubrk_following(UBreakIterator *bi,
int32_t offset)
{
- return ((BreakIterator*)bi)->following(offset);
+ return ((RuleBasedBreakIterator*)bi)->RuleBasedBreakIterator::following(offset);
}
U_CAPI const char* U_EXPORT2
@@ -255,26 +258,26 @@ ubrk_countAvailable()
U_CAPI UBool U_EXPORT2
ubrk_isBoundary(UBreakIterator *bi, int32_t offset)
{
- return ((BreakIterator *)bi)->isBoundary(offset);
+ return ((RuleBasedBreakIterator *)bi)->RuleBasedBreakIterator::isBoundary(offset);
}
U_CAPI int32_t U_EXPORT2
ubrk_getRuleStatus(UBreakIterator *bi)
{
- return ((RuleBasedBreakIterator *)bi)->getRuleStatus();
+ return ((RuleBasedBreakIterator *)bi)->RuleBasedBreakIterator::getRuleStatus();
}
U_CAPI int32_t U_EXPORT2
ubrk_getRuleStatusVec(UBreakIterator *bi, int32_t *fillInVec, int32_t capacity, UErrorCode *status)
{
- return ((RuleBasedBreakIterator *)bi)->getRuleStatusVec(fillInVec, capacity, *status);
+ return ((RuleBasedBreakIterator *)bi)->RuleBasedBreakIterator::getRuleStatusVec(fillInVec, capacity, *status);
}
U_CAPI const char* U_EXPORT2
-ubrk_getLocaleByType(const UBreakIterator *bi,
- ULocDataLocaleType type,
+ubrk_getLocaleByType(const UBreakIterator *bi,
+ ULocDataLocaleType type,
UErrorCode* status)
{
if (bi == NULL) {
diff --git a/icuSources/common/ubrkimpl.h b/icuSources/common/ubrkimpl.h
new file mode 100644
index 00000000..e4909712
--- /dev/null
+++ b/icuSources/common/ubrkimpl.h
@@ -0,0 +1,13 @@
+/*
+**********************************************************************
+* Copyright (C) 2006, International Business Machines
+* Corporation and others. All Rights Reserved.
+**********************************************************************
+*/
+
+#ifndef UBRKIMPL_H
+#define UBRKIMPL_H
+
+#define U_ICUDATA_BRKITR U_ICUDATA_NAME U_TREE_SEPARATOR_STRING "brkitr"
+
+#endif /*UBRKIMPL_H*/
diff --git a/icuSources/common/ucase.c b/icuSources/common/ucase.c
index 76b26bb9..c21045a0 100644
--- a/icuSources/common/ucase.c
+++ b/icuSources/common/ucase.c
@@ -1,7 +1,7 @@
/*
*******************************************************************************
*
-* Copyright (C) 2004, International Business Machines
+* Copyright (C) 2004-2006, International Business Machines
* Corporation and others. All Rights Reserved.
*
*******************************************************************************
@@ -33,6 +33,7 @@ struct UCaseProps {
UDataMemory *mem;
const int32_t *indexes;
const uint16_t *exceptions;
+ const UChar *unfold;
UTrie trie;
uint8_t formatVersion[4];
@@ -40,6 +41,15 @@ struct UCaseProps {
/* data loading etc. -------------------------------------------------------- */
+#define UCASE_HARDCODE_DATA 1
+
+#if UCASE_HARDCODE_DATA
+
+/* ucase_props_data.c is machine-generated by gencase --csource */
+#include "ucase_props_data.c"
+
+#else
+
static UBool U_CALLCONV
isAcceptable(void *context,
const char *type, const char *name,
@@ -68,38 +78,50 @@ static UCaseProps *
ucase_openData(UCaseProps *cspProto,
const uint8_t *bin, int32_t length, UErrorCode *pErrorCode) {
UCaseProps *csp;
- int32_t size, trieSize;
+ int32_t size;
cspProto->indexes=(const int32_t *)bin;
- if( cspProto->indexes[UCASE_IX_INDEX_TOP]<16 ||
- (length>=0 && lengthindexes[UCASE_IX_LENGTH])
+ if( (length>=0 && length<16*4) ||
+ cspProto->indexes[UCASE_IX_INDEX_TOP]<16
) {
+ /* length or indexes[] too short for minimum indexes[] length of 16 */
*pErrorCode=U_INVALID_FORMAT_ERROR;
return NULL;
}
-
- /* get the trie address, after indexes[] */
size=cspProto->indexes[UCASE_IX_INDEX_TOP]*4;
- bin+=size;
- if(length>=0 && (length-=size)<16) {
- *pErrorCode=U_INVALID_FORMAT_ERROR;
- return NULL;
+ if(length>=0) {
+ if(length>=size && length>=cspProto->indexes[UCASE_IX_LENGTH]) {
+ length-=size;
+ } else {
+ /* length too short for indexes[] or for the whole data length */
+ *pErrorCode=U_INVALID_FORMAT_ERROR;
+ return NULL;
+ }
}
+ bin+=size;
+ /* from here on, assume that the sizes of the items fit into the total length */
- /* unserialize the trie */
- trieSize=cspProto->indexes[UCASE_IX_TRIE_SIZE];
- trieSize=utrie_unserialize(&cspProto->trie, bin, length>=0 ? length : trieSize, pErrorCode);
+ /* unserialize the trie, after indexes[] */
+ size=cspProto->indexes[UCASE_IX_TRIE_SIZE];
+ utrie_unserialize(&cspProto->trie, bin, size, pErrorCode);
if(U_FAILURE(*pErrorCode)) {
return NULL;
}
+ bin+=size;
/* get exceptions[] */
- bin+=trieSize;
- if(length>=0 && (length-=trieSize)<2*cspProto->indexes[UCASE_IX_EXC_LENGTH]) {
- *pErrorCode=U_INVALID_FORMAT_ERROR;
- return NULL;
- }
+ size=2*cspProto->indexes[UCASE_IX_EXC_LENGTH];
cspProto->exceptions=(const uint16_t *)bin;
+ bin+=size;
+
+ /* get unfold[] */
+ size=2*cspProto->indexes[UCASE_IX_UNFOLD_LENGTH];
+ if(size!=0) {
+ cspProto->unfold=(const UChar *)bin;
+ bin+=size;
+ } else {
+ cspProto->unfold=NULL;
+ }
/* allocate, copy, and return the new UCaseProps */
csp=(UCaseProps *)uprv_malloc(sizeof(UCaseProps));
@@ -169,30 +191,46 @@ ucase_openBinary(const uint8_t *bin, int32_t length, UErrorCode *pErrorCode) {
return ucase_openData(&cspProto, bin, length, pErrorCode);
}
+#endif
+
U_CAPI void U_EXPORT2
ucase_close(UCaseProps *csp) {
if(csp!=NULL) {
+#if !UCASE_HARDCODE_DATA
udata_close(csp->mem);
+#endif
uprv_free(csp);
}
}
/* UCaseProps singleton ----------------------------------------------------- */
-static UCaseProps *gCsp=NULL;
+static UCaseProps *gCsp=NULL, *gCspDummy=NULL;
+#if !UCASE_HARDCODE_DATA
static UErrorCode gErrorCode=U_ZERO_ERROR;
static int8_t gHaveData=0;
+#endif
static UBool U_CALLCONV ucase_cleanup(void) {
ucase_close(gCsp);
gCsp=NULL;
+ ucase_close(gCspDummy);
+ gCspDummy=NULL;
+#if !UCASE_HARDCODE_DATA
gErrorCode=U_ZERO_ERROR;
gHaveData=0;
+#endif
return TRUE;
}
-U_CAPI UCaseProps * U_EXPORT2
+U_CAPI const UCaseProps * U_EXPORT2
ucase_getSingleton(UErrorCode *pErrorCode) {
+#if UCASE_HARDCODE_DATA
+ if(U_FAILURE(*pErrorCode)) {
+ return NULL;
+ }
+ return &ucase_props_singleton;
+#else
int8_t haveData;
if(U_FAILURE(*pErrorCode)) {
@@ -230,107 +268,59 @@ ucase_getSingleton(UErrorCode *pErrorCode) {
ucase_close(csp);
return gCsp;
}
+#endif
}
-/* Unicode case mapping data swapping --------------------------------------- */
-
-U_CAPI int32_t U_EXPORT2
-ucase_swap(const UDataSwapper *ds,
- const void *inData, int32_t length, void *outData,
- UErrorCode *pErrorCode) {
- const UDataInfo *pInfo;
- int32_t headerSize;
-
- const uint8_t *inBytes;
- uint8_t *outBytes;
-
- const int32_t *inIndexes;
- int32_t indexes[16];
-
- int32_t i, offset, count, size;
-
- /* udata_swapDataHeader checks the arguments */
- headerSize=udata_swapDataHeader(ds, inData, length, outData, pErrorCode);
- if(pErrorCode==NULL || U_FAILURE(*pErrorCode)) {
- return 0;
- }
+U_CAPI const UCaseProps * U_EXPORT2
+ucase_getDummy(UErrorCode *pErrorCode) {
+ UCaseProps *csp;
- /* check data format and format version */
- pInfo=(const UDataInfo *)((const char *)inData+4);
- if(!(
- pInfo->dataFormat[0]==UCASE_FMT_0 && /* dataFormat="cAsE" */
- pInfo->dataFormat[1]==UCASE_FMT_1 &&
- pInfo->dataFormat[2]==UCASE_FMT_2 &&
- pInfo->dataFormat[3]==UCASE_FMT_3 &&
- pInfo->formatVersion[0]==1 &&
- pInfo->formatVersion[2]==UTRIE_SHIFT &&
- pInfo->formatVersion[3]==UTRIE_INDEX_SHIFT
- )) {
- udata_printError(ds, "ucase_swap(): data format %02x.%02x.%02x.%02x (format version %02x) is not recognized as case mapping data\n",
- pInfo->dataFormat[0], pInfo->dataFormat[1],
- pInfo->dataFormat[2], pInfo->dataFormat[3],
- pInfo->formatVersion[0]);
- *pErrorCode=U_UNSUPPORTED_ERROR;
- return 0;
+ if(U_FAILURE(*pErrorCode)) {
+ return NULL;
}
- inBytes=(const uint8_t *)inData+headerSize;
- outBytes=(uint8_t *)outData+headerSize;
+ UMTX_CHECK(NULL, gCspDummy, csp);
- inIndexes=(const int32_t *)inBytes;
-
- if(length>=0) {
- length-=headerSize;
- if(length<16*4) {
- udata_printError(ds, "ucase_swap(): too few bytes (%d after header) for case mapping data\n",
- length);
- *pErrorCode=U_INDEX_OUTOFBOUNDS_ERROR;
- return 0;
+ if(csp!=NULL) {
+ /* the dummy object was already created */
+ return csp;
+ } else /* csp==NULL */ {
+ /* create the dummy object */
+ int32_t *indexes;
+
+ csp=(UCaseProps *)uprv_malloc(sizeof(UCaseProps)+UCASE_IX_TOP*4+UTRIE_DUMMY_SIZE);
+ if(csp==NULL) {
+ *pErrorCode=U_MEMORY_ALLOCATION_ERROR;
+ return NULL;
}
- }
-
- /* read the first 16 indexes (ICU 3.2/format version 1: UCASE_IX_TOP==16, might grow) */
- for(i=0; i<16; ++i) {
- indexes[i]=udata_readInt32(ds, inIndexes[i]);
- }
-
- /* get the total length of the data */
- size=indexes[UCASE_IX_LENGTH];
+ uprv_memset(csp, 0, sizeof(UCaseProps)+UCASE_IX_TOP*4);
- if(length>=0) {
- if(lengthindexes=indexes=(int32_t *)(csp+1);
+ indexes[UCASE_IX_INDEX_TOP]=UCASE_IX_TOP;
- /* copy the data for inaccessible bytes */
- if(inBytes!=outBytes) {
- uprv_memcpy(outBytes, inBytes, size);
+ indexes[UCASE_IX_TRIE_SIZE]=
+ utrie_unserializeDummy(&csp->trie, indexes+UCASE_IX_TOP, UTRIE_DUMMY_SIZE, 0, 0, TRUE, pErrorCode);
+ if(U_FAILURE(*pErrorCode)) {
+ uprv_free(csp);
+ return NULL;
}
- offset=0;
-
- /* swap the int32_t indexes[] */
- count=indexes[UCASE_IX_INDEX_TOP]*4;
- ds->swapArray32(ds, inBytes, count, outBytes, pErrorCode);
- offset+=count;
-
- /* swap the UTrie */
- count=indexes[UCASE_IX_TRIE_SIZE];
- utrie_swap(ds, inBytes+offset, count, outBytes+offset, pErrorCode);
- offset+=count;
+ csp->formatVersion[0]=1;
+ csp->formatVersion[2]=UTRIE_SHIFT;
+ csp->formatVersion[3]=UTRIE_INDEX_SHIFT;
- /* swap the uint16_t exceptions[] */
- count=indexes[UCASE_IX_EXC_LENGTH]*2;
- ds->swapArray16(ds, inBytes+offset, count, outBytes+offset, pErrorCode);
- offset+=count;
+ /* set the static variables */
+ umtx_lock(NULL);
+ if(gCspDummy==NULL) {
+ gCspDummy=csp;
+ csp=NULL;
+ ucln_common_registerCleanup(UCLN_COMMON_UCASE, ucase_cleanup);
+ }
+ umtx_unlock(NULL);
- U_ASSERT(offset==size);
+ uprv_free(csp);
+ return gCspDummy;
}
-
- return headerSize+size;
}
/* set of property starts for UnicodeSet ------------------------------------ */
@@ -338,13 +328,13 @@ ucase_swap(const UDataSwapper *ds,
static UBool U_CALLCONV
_enumPropertyStartsRange(const void *context, UChar32 start, UChar32 limit, uint32_t value) {
/* add the start code point to the USet */
- USetAdder *sa=(USetAdder *)context;
+ const USetAdder *sa=(const USetAdder *)context;
sa->add(sa->set, start);
return TRUE;
}
U_CAPI void U_EXPORT2
-ucase_addPropertyStarts(const UCaseProps *csp, USetAdder *sa, UErrorCode *pErrorCode) {
+ucase_addPropertyStarts(const UCaseProps *csp, const USetAdder *sa, UErrorCode *pErrorCode) {
if(U_FAILURE(*pErrorCode)) {
return;
}
@@ -368,8 +358,6 @@ ucase_addPropertyStarts(const UCaseProps *csp, USetAdder *sa, UErrorCode *pError
#define GET_PROPS(csp, c, result) \
UTRIE_GET16(&(csp)->trie, c, result);
-#define GET_CASE_TYPE(props) ((props)&UCASE_TYPE_MASK)
-#define GET_SIGNED_DELTA(props) ((int16_t)(props)>>UCASE_DELTA_SHIFT)
#define GET_EXCEPTIONS(csp, props) ((csp)->exceptions+((props)>>UCASE_EXC_SHIFT))
#define PROPS_HAS_EXCEPTION(props) ((props)&UCASE_EXCEPTION)
@@ -423,8 +411,8 @@ ucase_tolower(const UCaseProps *csp, UChar32 c) {
uint16_t props;
GET_PROPS(csp, c, props);
if(!PROPS_HAS_EXCEPTION(props)) {
- if(GET_CASE_TYPE(props)>=UCASE_UPPER) {
- c+=GET_SIGNED_DELTA(props);
+ if(UCASE_GET_TYPE(props)>=UCASE_UPPER) {
+ c+=UCASE_GET_DELTA(props);
}
} else {
const uint16_t *pe=GET_EXCEPTIONS(csp, props);
@@ -441,8 +429,8 @@ ucase_toupper(const UCaseProps *csp, UChar32 c) {
uint16_t props;
GET_PROPS(csp, c, props);
if(!PROPS_HAS_EXCEPTION(props)) {
- if(GET_CASE_TYPE(props)==UCASE_LOWER) {
- c+=GET_SIGNED_DELTA(props);
+ if(UCASE_GET_TYPE(props)==UCASE_LOWER) {
+ c+=UCASE_GET_DELTA(props);
}
} else {
const uint16_t *pe=GET_EXCEPTIONS(csp, props);
@@ -459,8 +447,8 @@ ucase_totitle(const UCaseProps *csp, UChar32 c) {
uint16_t props;
GET_PROPS(csp, c, props);
if(!PROPS_HAS_EXCEPTION(props)) {
- if(GET_CASE_TYPE(props)==UCASE_LOWER) {
- c+=GET_SIGNED_DELTA(props);
+ if(UCASE_GET_TYPE(props)==UCASE_LOWER) {
+ c+=UCASE_GET_DELTA(props);
}
} else {
const uint16_t *pe=GET_EXCEPTIONS(csp, props);
@@ -478,12 +466,212 @@ ucase_totitle(const UCaseProps *csp, UChar32 c) {
return c;
}
+U_CAPI void U_EXPORT2
+ucase_addCaseClosure(const UCaseProps *csp, UChar32 c, const USetAdder *sa) {
+ uint16_t props;
+
+ /*
+ * Hardcode the case closure of i and its relatives and ignore the
+ * data file data for these characters.
+ * The Turkic dotless i and dotted I with their case mapping conditions
+ * and case folding option make the related characters behave specially.
+ * This code matches their closure behavior to their case folding behavior.
+ */
+ static const UChar
+ iDot[2]= { 0x69, 0x307 };
+
+ switch(c) {
+ case 0x49:
+ /* regular i and I are in one equivalence class */
+ sa->add(sa->set, 0x69);
+ return;
+ case 0x69:
+ sa->add(sa->set, 0x49);
+ return;
+ case 0x130:
+ /* dotted I is in a class with <0069 0307> (for canonical equivalence with <0049 0307>) */
+ sa->addString(sa->set, iDot, 2);
+ return;
+ case 0x131:
+ /* dotless i is in a class by itself */
+ return;
+ default:
+ /* otherwise use the data file data */
+ break;
+ }
+
+ GET_PROPS(csp, c, props);
+ if(!PROPS_HAS_EXCEPTION(props)) {
+ if(UCASE_GET_TYPE(props)!=UCASE_NONE) {
+ /* add the one simple case mapping, no matter what type it is */
+ int32_t delta=UCASE_GET_DELTA(props);
+ if(delta!=0) {
+ sa->add(sa->set, c+delta);
+ }
+ }
+ } else {
+ /*
+ * c has exceptions, so there may be multiple simple and/or
+ * full case mappings. Add them all.
+ */
+ const uint16_t *pe0, *pe=GET_EXCEPTIONS(csp, props);
+ const UChar *closure;
+ uint16_t excWord=*pe++;
+ int32_t index, closureLength, fullLength, length;
+
+ pe0=pe;
+
+ /* add all simple case mappings */
+ for(index=UCASE_EXC_LOWER; index<=UCASE_EXC_TITLE; ++index) {
+ if(HAS_SLOT(excWord, index)) {
+ pe=pe0;
+ GET_SLOT_VALUE(excWord, index, pe, c);
+ sa->add(sa->set, c);
+ }
+ }
+
+ /* get the closure string pointer & length */
+ if(HAS_SLOT(excWord, UCASE_EXC_CLOSURE)) {
+ pe=pe0;
+ GET_SLOT_VALUE(excWord, UCASE_EXC_CLOSURE, pe, closureLength);
+ closureLength&=UCASE_CLOSURE_MAX_LENGTH; /* higher bits are reserved */
+ closure=(const UChar *)pe+1; /* behind this slot, unless there are full case mappings */
+ } else {
+ closureLength=0;
+ closure=NULL;
+ }
+
+ /* add the full case folding */
+ if(HAS_SLOT(excWord, UCASE_EXC_FULL_MAPPINGS)) {
+ pe=pe0;
+ GET_SLOT_VALUE(excWord, UCASE_EXC_FULL_MAPPINGS, pe, fullLength);
+
+ /* start of full case mapping strings */
+ ++pe;
+
+ fullLength&=0xffff; /* bits 16 and higher are reserved */
+
+ /* skip the lowercase result string */
+ pe+=fullLength&UCASE_FULL_LOWER;
+ fullLength>>=4;
+
+ /* add the full case folding string */
+ length=fullLength&0xf;
+ if(length!=0) {
+ sa->addString(sa->set, (const UChar *)pe, length);
+ pe+=length;
+ }
+
+ /* skip the uppercase and titlecase strings */
+ fullLength>>=4;
+ pe+=fullLength&0xf;
+ fullLength>>=4;
+ pe+=fullLength;
+
+ closure=(const UChar *)pe; /* behind full case mappings */
+ }
+
+ /* add each code point in the closure string */
+ for(index=0; indexadd(sa->set, c);
+ }
+ }
+}
+
+/*
+ * compare s, which has a length, with t, which has a maximum length or is NUL-terminated
+ * must be length>0 and max>0 and length<=max
+ */
+static U_INLINE int32_t
+strcmpMax(const UChar *s, int32_t length, const UChar *t, int32_t max) {
+ int32_t c1, c2;
+
+ max-=length; /* we require length<=max, so no need to decrement max in the loop */
+ do {
+ c1=*s++;
+ c2=*t++;
+ if(c2==0) {
+ return 1; /* reached the end of t but not of s */
+ }
+ c1-=c2;
+ if(c1!=0) {
+ return c1; /* return difference result */
+ }
+ } while(--length>0);
+ /* ends with length==0 */
+
+ if(max==0 || *t==0) {
+ return 0; /* equal to length of both strings */
+ } else {
+ return -max; /* return lengh difference */
+ }
+}
+
+U_CAPI UBool U_EXPORT2
+ucase_addStringCaseClosure(const UCaseProps *csp, const UChar *s, int32_t length, const USetAdder *sa) {
+ const UChar *unfold, *p;
+ int32_t i, start, limit, result, unfoldRows, unfoldRowWidth, unfoldStringWidth;
+
+ if(csp->unfold==NULL || s==NULL) {
+ return FALSE; /* no reverse case folding data, or no string */
+ }
+ if(length<=1) {
+ /* the string is too short to find any match */
+ /*
+ * more precise would be:
+ * if(!u_strHasMoreChar32Than(s, length, 1))
+ * but this does not make much practical difference because
+ * a single supplementary code point would just not be found
+ */
+ return FALSE;
+ }
+
+ unfold=csp->unfold;
+ unfoldRows=unfold[UCASE_UNFOLD_ROWS];
+ unfoldRowWidth=unfold[UCASE_UNFOLD_ROW_WIDTH];
+ unfoldStringWidth=unfold[UCASE_UNFOLD_STRING_WIDTH];
+ unfold+=unfoldRowWidth;
+
+ if(length>unfoldStringWidth) {
+ /* the string is too long to find any match */
+ return FALSE;
+ }
+
+ /* do a binary search for the string */
+ start=0;
+ limit=unfoldRows;
+ while(startadd(sa->set, c);
+ ucase_addCaseClosure(csp, c, sa);
+ }
+ return TRUE;
+ } else if(result<0) {
+ limit=i;
+ } else /* result>0 */ {
+ start=i+1;
+ }
+ }
+
+ return FALSE; /* string not found */
+}
+
/** @return UCASE_NONE, UCASE_LOWER, UCASE_UPPER, UCASE_TITLE */
U_CAPI int32_t U_EXPORT2
ucase_getType(const UCaseProps *csp, UChar32 c) {
uint16_t props;
GET_PROPS(csp, c, props);
- return GET_CASE_TYPE(props);
+ return UCASE_GET_TYPE(props);
}
/** @return same as ucase_getType(), or <0 if c is case-ignorable */
@@ -492,7 +680,7 @@ ucase_getTypeOrIgnorable(const UCaseProps *csp, UChar32 c) {
int32_t type;
uint16_t props;
GET_PROPS(csp, c, props);
- type=GET_CASE_TYPE(props);
+ type=UCASE_GET_TYPE(props);
if(type!=UCASE_NONE) {
return type;
} else if(
@@ -530,70 +718,6 @@ ucase_isCaseSensitive(const UCaseProps *csp, UChar32 c) {
return (UBool)((props&UCASE_SENSITIVE)!=0);
}
-/* public API (see uchar.h) ------------------------------------------------- */
-
-U_CAPI UBool U_EXPORT2
-u_isULowercase(UChar32 c) {
- UErrorCode errorCode=U_ZERO_ERROR;
- UCaseProps *csp=ucase_getSingleton(&errorCode);
- return (UBool)(csp!=NULL && UCASE_LOWER==ucase_getType(csp, c));
-}
-
-U_CAPI UBool U_EXPORT2
-u_isUUppercase(UChar32 c) {
- UErrorCode errorCode=U_ZERO_ERROR;
- UCaseProps *csp=ucase_getSingleton(&errorCode);
- return (UBool)(csp!=NULL && UCASE_UPPER==ucase_getType(csp, c));
-}
-
-/* Transforms the Unicode character to its lower case equivalent.*/
-U_CAPI UChar32 U_EXPORT2
-u_tolower(UChar32 c) {
- UErrorCode errorCode=U_ZERO_ERROR;
- UCaseProps *csp=ucase_getSingleton(&errorCode);
- if(csp!=NULL) {
- return ucase_tolower(csp, c);
- } else {
- return c;
- }
-}
-
-/* Transforms the Unicode character to its upper case equivalent.*/
-U_CAPI UChar32 U_EXPORT2
-u_toupper(UChar32 c) {
- UErrorCode errorCode=U_ZERO_ERROR;
- UCaseProps *csp=ucase_getSingleton(&errorCode);
- if(csp!=NULL) {
- return ucase_toupper(csp, c);
- } else {
- return c;
- }
-}
-
-/* Transforms the Unicode character to its title case equivalent.*/
-U_CAPI UChar32 U_EXPORT2
-u_totitle(UChar32 c) {
- UErrorCode errorCode=U_ZERO_ERROR;
- UCaseProps *csp=ucase_getSingleton(&errorCode);
- if(csp!=NULL) {
- return ucase_totitle(csp, c);
- } else {
- return c;
- }
-}
-
-/* return the simple case folding mapping for c */
-U_CAPI UChar32 U_EXPORT2
-u_foldCase(UChar32 c, uint32_t options) {
- UErrorCode errorCode=U_ZERO_ERROR;
- UCaseProps *csp=ucase_getSingleton(&errorCode);
- if(csp!=NULL) {
- return ucase_fold(csp, c, options);
- } else {
- return c;
- }
-}
-
/* string casing ------------------------------------------------------------ */
/*
@@ -693,13 +817,13 @@ enum {
/* separator? */
#define is_sep(c) ((c)=='_' || (c)=='-' || (c)==0)
-/*
+/**
* Requires non-NULL locale ID but otherwise does the equivalent of
* checking for language codes as if uloc_getLanguage() were called:
* Accepts both 2- and 3-letter codes and accepts case variants.
*/
-static int32_t
-getCaseLocale(const char *locale, int32_t *locCache) {
+U_CFUNC int32_t
+ucase_getCaseLocale(const char *locale, int32_t *locCache) {
int32_t result;
char c;
@@ -775,7 +899,7 @@ isFollowedByCasedLetter(const UCaseProps *csp, UCaseContextIterator *iter, void
for(/* dir!=0 sets direction */; (c=iter(context, dir))>=0; dir=0) {
GET_PROPS(csp, c, props);
- if(GET_CASE_TYPE(props)!=UCASE_NONE) {
+ if(UCASE_GET_TYPE(props)!=UCASE_NONE) {
return TRUE; /* followed by cased letter */
} else if(c==0x307 || (props&(UCASE_EXCEPTION|UCASE_CASE_IGNORABLE))==UCASE_CASE_IGNORABLE) {
/* case-ignorable, continue with the loop */
@@ -934,8 +1058,8 @@ ucase_toFullLower(const UCaseProps *csp, UChar32 c,
result=c;
GET_PROPS(csp, c, props);
if(!PROPS_HAS_EXCEPTION(props)) {
- if(GET_CASE_TYPE(props)>=UCASE_UPPER) {
- result=c+GET_SIGNED_DELTA(props);
+ if(UCASE_GET_TYPE(props)>=UCASE_UPPER) {
+ result=c+UCASE_GET_DELTA(props);
}
} else {
const uint16_t *pe=GET_EXCEPTIONS(csp, props), *pe2;
@@ -946,7 +1070,7 @@ ucase_toFullLower(const UCaseProps *csp, UChar32 c,
if(excWord&UCASE_EXC_CONDITIONAL_SPECIAL) {
/* use hardcoded conditions and mappings */
- int32_t loc=getCaseLocale(locale, locCache);
+ int32_t loc=ucase_getCaseLocale(locale, locCache);
/*
* Test for conditional mappings first
@@ -1081,8 +1205,8 @@ toUpperOrTitle(const UCaseProps *csp, UChar32 c,
result=c;
GET_PROPS(csp, c, props);
if(!PROPS_HAS_EXCEPTION(props)) {
- if(GET_CASE_TYPE(props)==UCASE_LOWER) {
- result=c+GET_SIGNED_DELTA(props);
+ if(UCASE_GET_TYPE(props)==UCASE_LOWER) {
+ result=c+UCASE_GET_DELTA(props);
}
} else {
const uint16_t *pe=GET_EXCEPTIONS(csp, props), *pe2;
@@ -1093,7 +1217,7 @@ toUpperOrTitle(const UCaseProps *csp, UChar32 c,
if(excWord&UCASE_EXC_CONDITIONAL_SPECIAL) {
/* use hardcoded conditions and mappings */
- int32_t loc=getCaseLocale(locale, locCache);
+ int32_t loc=ucase_getCaseLocale(locale, locCache);
if(loc==LOC_TURKISH && c==0x69) {
/*
@@ -1219,25 +1343,17 @@ ucase_toFullTitle(const UCaseProps *csp, UChar32 c,
0049; C; 0069; # LATIN CAPITAL LETTER I
0130; F; 0069 0307; # LATIN CAPITAL LETTER I WITH DOT ABOVE
- * U+0130 is otherwise lowercased to U+0069 (UnicodeData.txt).
- *
- * In case this code is used with CaseFolding.txt from an older version of Unicode
- * where CaseFolding.txt contains mappings with a status of 'I' that
- * have the opposite polarity ('I' mappings are included by default but excluded for Turkic),
- * we must also hardcode the Unicode 3.2 mappings for the code points
- * with 'I' mappings.
- * Unicode 3.1.1 has 'I' mappings for U+0130 and U+0131.
- * Unicode 3.2 has a 'T' mapping for U+0130, and lowercases U+0131 to itself (see UnicodeData.txt).
+ * U+0130 has no simple case folding (simple-case-folds to itself).
*/
/* return the simple case folding mapping for c */
U_CAPI UChar32 U_EXPORT2
-ucase_fold(UCaseProps *csp, UChar32 c, uint32_t options) {
+ucase_fold(const UCaseProps *csp, UChar32 c, uint32_t options) {
uint16_t props;
GET_PROPS(csp, c, props);
if(!PROPS_HAS_EXCEPTION(props)) {
- if(GET_CASE_TYPE(props)>=UCASE_UPPER) {
- c+=GET_SIGNED_DELTA(props);
+ if(UCASE_GET_TYPE(props)>=UCASE_UPPER) {
+ c+=UCASE_GET_DELTA(props);
}
} else {
const uint16_t *pe=GET_EXCEPTIONS(csp, props);
@@ -1251,8 +1367,8 @@ ucase_fold(UCaseProps *csp, UChar32 c, uint32_t options) {
/* 0049; C; 0069; # LATIN CAPITAL LETTER I */
return 0x69;
} else if(c==0x130) {
- /* no simple default mapping for U+0130, use UnicodeData.txt */
- return 0x69;
+ /* no simple case folding for U+0130 */
+ return c;
}
} else {
/* Turkic mappings */
@@ -1305,8 +1421,8 @@ ucase_toFullFolding(const UCaseProps *csp, UChar32 c,
result=c;
GET_PROPS(csp, c, props);
if(!PROPS_HAS_EXCEPTION(props)) {
- if(GET_CASE_TYPE(props)>=UCASE_UPPER) {
- result=c+GET_SIGNED_DELTA(props);
+ if(UCASE_GET_TYPE(props)>=UCASE_UPPER) {
+ result=c+UCASE_GET_DELTA(props);
}
} else {
const uint16_t *pe=GET_EXCEPTIONS(csp, props), *pe2;
@@ -1368,3 +1484,116 @@ ucase_toFullFolding(const UCaseProps *csp, UChar32 c,
return (result==c) ? ~result : result;
}
+
+/* case mapping properties API ---------------------------------------------- */
+
+/* get the UCaseProps singleton, or else its dummy, once and for all */
+static const UCaseProps *
+getCaseProps() {
+ /*
+ * This lazy intialization with double-checked locking (without mutex protection for
+ * the initial check) is transiently unsafe under certain circumstances.
+ * Check the readme and use u_init() if necessary.
+ */
+
+ /* the initial check is performed by the GET_CASE_PROPS() macro */
+ const UCaseProps *csp;
+ UErrorCode errorCode=U_ZERO_ERROR;
+
+ csp=ucase_getSingleton(&errorCode);
+ if(U_FAILURE(errorCode)) {
+ errorCode=U_ZERO_ERROR;
+ csp=ucase_getDummy(&errorCode);
+ if(U_FAILURE(errorCode)) {
+ return NULL;
+ }
+ }
+
+ return csp;
+}
+
+/*
+ * In ICU 3.0, most Unicode properties were loaded from uprops.icu.
+ * ICU 3.2 adds ucase.icu for case mapping properties.
+ * ICU 3.4 adds ubidi.icu for bidi/shaping properties and
+ * removes case/bidi/shaping properties from uprops.icu.
+ *
+ * Loading of uprops.icu was never mutex-protected and required u_init()
+ * for thread safety.
+ * In order to maintain performance for all such properties,
+ * ucase.icu and ubidi.icu are loaded lazily, without mutexing.
+ * u_init() will try to load them for thread safety,
+ * but u_init() will not fail if they are missing.
+ *
+ * uchar.c maintains a tri-state flag for (not loaded/loaded/failed to load)
+ * and an error code for load failure.
+ * Instead, here we try to load at most once.
+ * If it works, we use the resulting singleton object.
+ * If it fails, then we get a dummy object, which always works unless
+ * we are seriously out of memory.
+ * After the first try, we have a never-changing pointer to either the
+ * real singleton or the dummy.
+ *
+ * This method is used in Unicode properties APIs (uchar.h) that
+ * do not have a service object and also do not have an error code parameter.
+ * Other API implementations get the singleton themselves
+ * (with mutexing), store it in the service object, and report errors.
+ */
+#define GET_CASE_PROPS() (gCsp!=NULL ? gCsp : getCaseProps())
+
+/* public API (see uchar.h) */
+
+U_CAPI UBool U_EXPORT2
+u_isULowercase(UChar32 c) {
+ return (UBool)(UCASE_LOWER==ucase_getType(GET_CASE_PROPS(), c));
+}
+
+U_CAPI UBool U_EXPORT2
+u_isUUppercase(UChar32 c) {
+ return (UBool)(UCASE_UPPER==ucase_getType(GET_CASE_PROPS(), c));
+}
+
+/* Transforms the Unicode character to its lower case equivalent.*/
+U_CAPI UChar32 U_EXPORT2
+u_tolower(UChar32 c) {
+ return ucase_tolower(GET_CASE_PROPS(), c);
+}
+
+/* Transforms the Unicode character to its upper case equivalent.*/
+U_CAPI UChar32 U_EXPORT2
+u_toupper(UChar32 c) {
+ return ucase_toupper(GET_CASE_PROPS(), c);
+}
+
+/* Transforms the Unicode character to its title case equivalent.*/
+U_CAPI UChar32 U_EXPORT2
+u_totitle(UChar32 c) {
+ return ucase_totitle(GET_CASE_PROPS(), c);
+}
+
+/* return the simple case folding mapping for c */
+U_CAPI UChar32 U_EXPORT2
+u_foldCase(UChar32 c, uint32_t options) {
+ return ucase_fold(GET_CASE_PROPS(), c, options);
+}
+
+U_CFUNC int32_t U_EXPORT2
+ucase_hasBinaryProperty(UChar32 c, UProperty which) {
+ /* case mapping properties */
+ const UCaseProps *csp=GET_CASE_PROPS();
+ if(csp==NULL) {
+ return FALSE;
+ }
+ switch(which) {
+ case UCHAR_LOWERCASE:
+ return (UBool)(UCASE_LOWER==ucase_getType(csp, c));
+ case UCHAR_UPPERCASE:
+ return (UBool)(UCASE_UPPER==ucase_getType(csp, c));
+ case UCHAR_SOFT_DOTTED:
+ return ucase_isSoftDotted(csp, c);
+ case UCHAR_CASE_SENSITIVE:
+ return ucase_isCaseSensitive(csp, c);
+ default:
+ return FALSE;
+ }
+}
diff --git a/icuSources/common/ucase.h b/icuSources/common/ucase.h
index f137d9bf..e3e5be05 100644
--- a/icuSources/common/ucase.h
+++ b/icuSources/common/ucase.h
@@ -1,7 +1,7 @@
/*
*******************************************************************************
*
-* Copyright (C) 2004, International Business Machines
+* Copyright (C) 2004-2006, International Business Machines
* Corporation and others. All Rights Reserved.
*
*******************************************************************************
@@ -41,9 +41,17 @@ U_CAPI void U_EXPORT2
ucase_close(UCaseProps *csp);
-U_CAPI UCaseProps * U_EXPORT2
+U_CAPI const UCaseProps * U_EXPORT2
ucase_getSingleton(UErrorCode *pErrorCode);
+/**
+ * Get a singleton dummy object, one that works with no real data.
+ * This can be used when the real data is not available.
+ * Using the dummy can reduce checks for available data after an initial failure.
+ */
+U_CAPI const UCaseProps * U_EXPORT2
+ucase_getDummy(UErrorCode *pErrorCode);
+
U_CAPI int32_t U_EXPORT2
ucase_swap(const UDataSwapper *ds,
@@ -51,7 +59,15 @@ ucase_swap(const UDataSwapper *ds,
UErrorCode *pErrorCode);
U_CAPI void U_EXPORT2
-ucase_addPropertyStarts(const UCaseProps *csp, USetAdder *sa, UErrorCode *pErrorCode);
+ucase_addPropertyStarts(const UCaseProps *csp, const USetAdder *sa, UErrorCode *pErrorCode);
+
+/**
+ * Requires non-NULL locale ID but otherwise does the equivalent of
+ * checking for language codes as if uloc_getLanguage() were called:
+ * Accepts both 2- and 3-letter codes and accepts case variants.
+ */
+U_CFUNC int32_t
+ucase_getCaseLocale(const char *locale, int32_t *locCache);
/**
* Bit mask for getting just the options from a string compare options word
@@ -81,7 +97,34 @@ U_CAPI UChar32 U_EXPORT2
ucase_totitle(const UCaseProps *csp, UChar32 c);
U_CAPI UChar32 U_EXPORT2
-ucase_fold(UCaseProps *csp, UChar32 c, uint32_t options);
+ucase_fold(const UCaseProps *csp, UChar32 c, uint32_t options);
+
+/**
+ * Adds all simple case mappings and the full case folding for c to sa,
+ * and also adds special case closure mappings.
+ * c itself is not added.
+ * For example, the mappings
+ * - for s include long s
+ * - for sharp s include ss
+ * - for k include the Kelvin sign
+ */
+U_CAPI void U_EXPORT2
+ucase_addCaseClosure(const UCaseProps *csp, UChar32 c, const USetAdder *sa);
+
+/**
+ * Maps the string to single code points and adds the associated case closure
+ * mappings.
+ * The string is mapped to code points if it is their full case folding string.
+ * In other words, this performs a reverse full case folding and then
+ * adds the case closure items of the resulting code points.
+ * If the string is found and its closure applied, then
+ * the string itself is added as well as part of its code points' closure.
+ * It must be length>=0.
+ *
+ * @return TRUE if the string was found
+ */
+U_CAPI UBool U_EXPORT2
+ucase_addStringCaseClosure(const UCaseProps *csp, const UChar *s, int32_t length, const USetAdder *sa);
/** @return UCASE_NONE, UCASE_LOWER, UCASE_UPPER, UCASE_TITLE */
U_CAPI int32_t U_EXPORT2
@@ -108,7 +151,8 @@ ucase_isCaseSensitive(const UCaseProps *csp, UChar32 c);
* It does not support random access or an arbitrary change of
* iteration direction.
*
- * The direction parameter either starts
+ * The code point being case-mapped itself is never returned by
+ * this iterator.
*
* @param context A pointer to the iterator's working data.
* @param dir If <0 then start iterating backward from the character;
@@ -194,6 +238,9 @@ ucase_toFullFolding(const UCaseProps *csp, UChar32 c,
const UChar **pString,
uint32_t options);
+U_CFUNC int32_t U_EXPORT2
+ucase_hasBinaryProperty(UChar32 c, UProperty which);
+
/* file definitions --------------------------------------------------------- */
#define UCASE_DATA_NAME "ucase"
@@ -211,6 +258,7 @@ enum {
UCASE_IX_LENGTH,
UCASE_IX_TRIE_SIZE,
UCASE_IX_EXC_LENGTH,
+ UCASE_IX_UNFOLD_LENGTH,
UCASE_IX_MAX_FULL_LENGTH=15,
UCASE_IX_TOP=16
@@ -227,6 +275,8 @@ enum {
UCASE_TITLE
};
+#define UCASE_GET_TYPE(props) ((props)&UCASE_TYPE_MASK)
+
#define UCASE_SENSITIVE 4
#define UCASE_EXCEPTION 8
@@ -264,7 +314,7 @@ enum {
UCASE_EXC_TITLE,
UCASE_EXC_4, /* reserved */
UCASE_EXC_5, /* reserved */
- UCASE_EXC_6, /* reserved */
+ UCASE_EXC_CLOSURE,
UCASE_EXC_FULL_MAPPINGS,
UCASE_EXC_ALL_SLOTS /* one past the last slot */
};
@@ -296,6 +346,17 @@ enum {
#define UCASE_FULL_UPPER 0xf00
#define UCASE_FULL_TITLE 0xf000
+/* maximum lengths */
+#define UCASE_FULL_MAPPINGS_MAX_LENGTH (4*0xf)
+#define UCASE_CLOSURE_MAX_LENGTH 0xf
+
+/* constants for reverse case folding ("unfold") data */
+enum {
+ UCASE_UNFOLD_ROWS,
+ UCASE_UNFOLD_ROW_WIDTH,
+ UCASE_UNFOLD_STRING_WIDTH
+};
+
U_CDECL_END
#endif
diff --git a/icuSources/common/ucase_props_data.c b/icuSources/common/ucase_props_data.c
new file mode 100644
index 00000000..015269b1
--- /dev/null
+++ b/icuSources/common/ucase_props_data.c
@@ -0,0 +1,648 @@
+/*
+ * Copyright (C) 1999-2007, International Business Machines
+ * Corporation and others. All Rights Reserved.
+ *
+ * file name: ucase_props_data.c
+ *
+ * machine-generated on: 2006-06-13
+ * machine-generated on: 2007-02-08 U_DARWIN
+ */
+
+static const UVersionInfo ucase_props_dataVersion={5,0,0,0};
+
+#ifndef U_DARWIN
+static const int32_t ucase_props_indexes[UCASE_IX_TOP]={0x10,0x466a,0x3980,0x4e3,0x172,0,0,0,0,0,0,0,0,0,0,3};
+#else /* U_DARWIN */
+static const int32_t ucase_props_indexes[UCASE_IX_TOP]={0x10,0x46ca,0x39e0,0x4e3,0x172,0,0,0,0,0,0,0,0,0,0,3};
+#endif /* U_DARWIN */
+
+#ifndef U_DARWIN
+static const uint16_t ucase_props_trieIndex[7352]={
+#else /* U_DARWIN */
+static const uint16_t ucase_props_trieIndex[7400]={
+#endif /* U_DARWIN */
+0x238,0x240,0x248,0x250,0x258,0x260,0x268,0x270,0x278,0x27e,0x285,0x288,0x290,0x298,0x2a0,0x2a8,
+0x278,0x2b0,0x2b8,0x2c0,0x2c8,0x2d0,0x2d8,0x2e0,0x2e8,0x2ee,0x2f6,0x2fe,0x306,0x30e,0x316,0x31c,
+0x324,0x328,0x32c,0x278,0x334,0x278,0x33c,0x278,0x340,0x345,0x34a,0x352,0x359,0x361,0x369,0x36c,
+0x374,0x230,0x37c,0x384,0x230,0x230,0x389,0x391,0x396,0x39b,0x3a3,0x230,0x230,0x3aa,0x230,0x3b0,
+0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x3b8,0x3b9,0x3c1,0x3c9,0x3d1,0x3b9,0x3d9,0x3c9,
+0x3b8,0x3b9,0x3e1,0x3e5,0x3b8,0x3b9,0x3ed,0x3c9,0x3d1,0x3f1,0x3f9,0x230,0x3fe,0x230,0x406,0x230,
+0x230,0x40a,0x412,0x230,0x230,0x3f1,0x419,0x3c9,0x230,0x230,0x421,0x230,0x230,0x230,0x427,0x230,
+0x230,0x42d,0x434,0x230,0x230,0x438,0x440,0x230,0x444,0x44b,0x230,0x452,0x45a,0x461,0x469,0x230,
+0x230,0x46e,0x475,0x230,0x230,0x47d,0x485,0x3ff,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,
+0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x487,0x230,0x230,0x230,0x230,0x230,
+0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,
+0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x48f,0x48f,0x495,0x495,0x230,0x49a,0x4a2,0x230,
+0x4aa,0x230,0x4b2,0x230,0x230,0x407,0x230,0x230,0x230,0x4ba,0x230,0x230,0x230,0x230,0x230,0x230,
+0x4c1,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x4c9,0x4cc,0x4d4,0x4da,0x230,0x230,0x230,0x230,
+0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x4e2,0x4e2,0x4e2,0x4ea,0x4e5,0x4f2,0x4fa,0x4fd,
+0x278,0x505,0x278,0x50d,0x510,0x278,0x518,0x51b,0x523,0x52b,0x533,0x53b,0x543,0x54b,0x553,0x55b,
+0x563,0x56a,0x230,0x572,0x57a,0x230,0x580,0x588,0x590,0x598,0x5a0,0x5a8,0x5b0,0x230,0x230,0x230,
+0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,
+0x230,0x230,0x230,0x230,0x230,0x5b3,0x5b9,0x5bf,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,
+0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,
+0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,
+0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,
+0x5c7,0x5cc,0x5d0,0x5d8,0x278,0x278,0x278,0x5e0,0x5e8,0x5f0,0x230,0x23e,0x230,0x230,0x230,0x230,
+0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,
+0x3d0,0x5f6,0x230,0x230,0x5fd,0x230,0x230,0x4b3,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,
+0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,
+0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,
+0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,
+0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,
+0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,
+0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,
+0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,
+0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,
+0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,
+0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,
+0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,
+0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,
+0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,
+0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,
+0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,
+0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,
+0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,
+0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,
+0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,
+0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,
+0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,
+0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,
+0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,
+0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,
+0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,
+0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,
+0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,
+0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,
+0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,
+0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,
+0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,
+0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,
+0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,
+0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,
+0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,
+0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,
+0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,
+0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,
+0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,
+0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,
+0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,
+0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,
+0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,
+0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,
+0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,
+0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,
+0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,
+0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,
+0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,
+0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,
+0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,
+0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,
+0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,
+0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,
+0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,
+0x3cc,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,
+0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,
+0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,
+0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x605,0x60d,0x230,0x230,0x230,0x230,0x230,0x230,
+0x614,0x3b7,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,
+0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,
+0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,
+0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,
+0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,
+0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,
+0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,
+0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,
+0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,
+0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,
+0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,
+0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,
+0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,
+0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,
+0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,
+0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,
+0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,
+0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,
+0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,
+0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,
+0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,
+0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,
+0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,
+0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,
+#ifndef U_DARWIN
+0x71b,0x71e,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,
+0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x726,0x230,0x230,0x230,0x230,0x230,
+#else /* U_DARWIN */
+0x727,0x72a,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,
+0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x732,0x230,0x230,0x230,0x230,0x230,
+#endif /* U_DARWIN */
+0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,
+0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,
+0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,
+0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,
+0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,
+0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,
+0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,
+0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,
+0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,
+0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,
+0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,
+0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,
+0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,
+0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,
+#ifdef U_DARWIN
+0x230,0x230,0x230,0x618,0x620,0x36b,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,
+0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x628,0x230,0x230,0x230,0x230,0x230,0x230,0x230,
+#endif /* U_DARWIN */
+0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,
+#ifndef U_DARWIN
+0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x61c,0x230,0x230,0x230,0x230,0x230,0x230,0x230,
+#else /* U_DARWIN */
+0x630,0x638,0x230,0x230,0x230,0x230,0x230,0x23a,0x230,0x640,0x648,0x64f,0x40a,0x230,0x230,0x657,
+#endif /* U_DARWIN */
+0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,
+#ifndef U_DARWIN
+0x624,0x62c,0x230,0x230,0x230,0x230,0x230,0x23a,0x230,0x634,0x63c,0x643,0x40a,0x230,0x230,0x64b,
+#endif /* not U_DARWIN */
+0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,
+#ifdef U_DARWIN
+0x65f,0x665,0x669,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,
+#endif /* U_DARWIN */
+0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,
+#ifndef U_DARWIN
+0x653,0x659,0x65d,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,
+#endif /* not U_DARWIN */
+0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,
+#ifndef U_DARWIN
+0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,
+0x665,0x669,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,
+0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x671,0x679,0x67f,0x230,0x230,
+0x230,0x230,0x687,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,
+0x68f,0x697,0x69c,0x6a2,0x6aa,0x6b2,0x6ba,0x693,0x6c2,0x6ca,0x6d2,0x6d9,0x694,0x68f,0x697,0x692,
+0x6a2,0x695,0x690,0x6e1,0x693,0x6e9,0x6f1,0x6f9,0x700,0x6ec,0x6f4,0x6fc,0x703,0x6ef,0x70b,0x230,
+0x3d1,0x713,0x713,0x713,0x230,0x230,0x230,0x230,0x713,0x713,0x713,0x713,0x713,0x713,0x713,0x624,
+#else /* U_DARWIN */
+0x671,0x675,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,
+0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x67d,0x685,0x68b,0x230,0x230,
+0x230,0x230,0x693,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,
+0x69b,0x6a3,0x6a8,0x6ae,0x6b6,0x6be,0x6c6,0x69f,0x6ce,0x6d6,0x6de,0x6e5,0x6a0,0x69b,0x6a3,0x69e,
+0x6ae,0x6a1,0x69c,0x6ed,0x69f,0x6f5,0x6fd,0x705,0x70c,0x6f8,0x700,0x708,0x70f,0x6fb,0x717,0x230,
+0x3d1,0x71f,0x71f,0x71f,0x230,0x230,0x230,0x230,0x71f,0x71f,0x71f,0x71f,0x71f,0x71f,0x71f,0x630,
+#endif /* U_DARWIN */
+0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0x40,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0x40,0,0,0,0,0,
+0,0x806,0x806,0x806,0x806,0x806,0x806,0x806,0x806,0xe,0x5e,0x7e,0x806,0x806,0x806,0x806,
+0x806,0x806,0x806,0xbe,0x806,0x806,0x806,0x806,0x806,0x806,0x806,0,0,0,0x40,0,
+0x40,0xf805,0xf805,0xf805,0xf805,0xf805,0xf805,0xf805,0xf805,0xfd,0xf815,0x14d,0xf805,0xf805,0xf805,0xf805,
+0xf805,0xf805,0xf805,0x18d,0xf805,0xf805,0xf805,0xf805,0xf805,0xf805,0xf805,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0x40,0,1,0,0,0x40,0,0x40,
+0,0,0,0,0x40,0x1cd,0,0x40,0x40,0,1,0,0,0,0,0,
+0x806,0x806,0x806,0x806,0x806,0x1fe,0x806,0x806,0x806,0x806,0x806,0x806,0x23e,0x25e,0x806,0x806,
+0x806,0x806,0x806,0x806,0x806,0x806,0x806,0,0x806,0x806,0x806,0x806,0x806,0x806,0x806,0x27d,
+0xf805,0xf805,0xf805,0xf805,0xf805,0x2fd,0xf805,0xf805,0xf805,0xf805,0xf805,0xf805,0xf805,0xf805,0xf805,0xf805,
+0xf805,0xf805,0xf805,0xf805,0xf805,0xf805,0xf805,0,0xf805,0xf805,0xf805,0xf805,0xf805,0xf805,0xf805,0x1e45,
+0x46,0xffc5,0x46,0xffc5,0x46,0xffc5,0x46,0xffc5,0x46,0xffc5,0x46,0xffc5,0x46,0xffc5,0x46,0xffc5,
+0x46,0xffc5,0x46,0xffc5,0x46,0xffc5,0x46,0xffc5,0x46,0xffc5,0x46,0xffc5,0x46,0xffc5,0x46,0xffc5,
+0x33e,0xffc5,0x46,0xffc5,0x46,0xffc5,0x35e,0xffd5,0x37e,0x3cd,0x46,0xffc5,0x46,0xffc5,0x46,0xffc5,
+1,0x46,0xffc5,0x46,0xffc5,0x46,0xffc5,0x46,0xffc5,0x46,0xffc5,0x46,0xffc5,0x41d,0x46,0xffc5,
+0x46,0xffc5,0x46,0xffc5,0x46,0xffc5,0x46,0xffc5,0x46,0xffc5,0x46,0xffc5,0x46,0xffc5,0x46,0xffc5,
+0x46,0xffc5,0x46,0xffc5,0x46,0xffc5,0x46,0xffc5,0xe1c6,0x46,0xffc5,0x46,0xffc5,0x46,0xffc5,0x49d,
+0x30c5,0x3486,0x46,0xffc5,0x46,0xffc5,0x3386,0x46,0xffc5,0x3346,0x3346,0x46,0xffc5,1,0x13c6,0x3286,
+0x32c6,0x46,0xffc5,0x3346,0x33c6,0x1845,0x34c6,0x3446,0x46,0xffc5,0x28c5,1,0x34c6,0x3546,0x2085,0x3586,
+0x46,0xffc5,0x46,0xffc5,0x46,0xffc5,0x3686,0x46,0xffc5,0x3686,1,1,0x46,0xffc5,0x3686,0x46,
+0xffc5,0x3646,0x3646,0x46,0xffc5,0x46,0xffc5,0x36c6,0x46,0xffc5,1,0,0x46,0xffc5,1,0xe05,
+0,0,0,0,0x4ce,0x4ff,0x53d,0x56e,0x59f,0x5dd,0x60e,0x63f,0x67d,0x46,0xffc5,0x46,
+0xffc5,0x46,0xffc5,0x46,0xffc5,0x46,0xffc5,0x46,0xffc5,0x46,0xffc5,0x46,0xffc5,0xec45,0x46,0xffc5,
+0x46,0xffc5,0x46,0xffc5,0x46,0xffc5,0x46,0xffc5,0x46,0xffc5,0x46,0xffc5,0x46,0xffc5,0x46,0xffc5,
+0x6ad,0x72e,0x75f,0x79d,0x46,0xffc5,0xe7c6,0xf206,0x46,0xffc5,0x46,0xffc5,0x46,0xffc5,0x46,0xffc5,
+0xdf86,1,0x46,0xffc5,0x46,0xffc5,0x46,0xffc5,0x46,0xffc5,0x46,0xffc5,0x46,0xffc5,0x46,0xffc5,
+0x46,0xffc5,0x46,0xffc5,1,1,1,1,1,1,0x7ce,0x46,0xffc5,0xd746,0x7ee,1,
+1,0x46,0xffc5,0xcf46,0x1146,0x11c6,0x46,0xffc5,0x46,0xffd5,0x46,0xffc5,0x46,0xffc5,0x46,0xffc5,
+1,1,1,0xcb85,0xcc85,1,0xccc5,0xccc5,1,0xcd85,1,0xcd45,1,1,1,1,
+0xccc5,1,1,0xcc45,1,1,1,1,0xcbd5,0xcb45,1,0x80d,1,1,1,0xcb45,
+1,1,0xcac5,1,1,0xca85,1,1,1,1,1,1,1,0x82d,1,1,
+0xc985,1,1,0xc985,1,1,1,1,0xc985,0xeec5,0xc9c5,0xc9c5,0xee45,1,1,1,
+1,1,0xc945,1,0,1,1,1,1,1,1,1,1,0x11,1,1,
+1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+1,1,0x11,1,1,1,1,1,1,0x40,0x40,0x40,0x44,0x40,0x44,0x40,
+1,1,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,
+0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,
+1,1,1,1,1,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,
+0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,
+0x64,0x64,0x60,0x60,0x60,0x60,0x60,0x84c,0x64,0x60,0x64,0x60,0x64,0x60,0x60,0x60,
+0x60,0x60,0x60,0x64,0x60,0x70,0x70,0x70,0x70,0x70,0x70,0x70,0x70,0x70,0x70,0x70,
+0x70,0x70,0x70,0x70,0x70,0x70,0x70,0x70,0x70,0x74,0x70,0x70,0x70,0x70,0x70,0x70,
+0x70,0x70,0x70,0x70,0x70,0x60,0x60,0x60,0x60,0x60,0x64,0x60,0x60,0x85d,0x60,0x70,
+0x70,0x70,0x60,0x60,0x60,0x70,0x70,0x40,0x60,0x60,0x60,0x70,0x70,0x70,0x70,0x60,
+0x70,0x70,0x70,0x60,0x70,0x70,0x70,0x70,0x70,0x70,0x70,0x60,0x60,0x60,0x60,0x60,
+0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0,0,0,0,0x40,0x40,0,0,
+0,0,1,0x2085,0x2085,0x2085,0,0,0,0,0,0,0x40,0x40,0x986,0,
+0x946,0x946,0x946,0,0x1006,0,0xfc6,0xfc6,0x8ad,0x806,0x97e,0x806,0x806,0x9be,0x806,0x806,
+0x9fe,0xa4e,0xa9e,0x806,0xade,0x806,0x806,0x806,0xb1e,0xb5e,0,0xb9e,0x806,0x806,0xbde,0x806,
+0x806,0xc1e,0x806,0x806,0xf685,0xf6c5,0xf6c5,0xf6c5,0xc5d,0xf805,0xd2d,0xf805,0xf805,0xd6d,0xf805,0xf805,
+0xdad,0xdfd,0xe4d,0xf805,0xe8d,0xf805,0xf805,0xf805,0xecd,0xf0d,0xf4d,0xf7d,0xf805,0xf805,0xfbd,0xf805,
+0xf805,0xffd,0xf805,0xf805,0xf005,0xf045,0xf045,0,0x103d,0x106d,2,2,2,0x10bd,0x10ed,1,
+0x46,0xffc5,0x46,0xffc5,0x46,0xffc5,0x46,0xffc5,0x46,0xffc5,0x46,0xffc5,0x46,0xffc5,0x46,0xffc5,
+0x111d,0x114d,0x1c5,0x11,0x117e,0x11cd,0,0x46,0xffc5,0xfe46,0x46,0xffc5,1,0xdf86,0xdf86,0xdf86,
+0x1406,0x1406,0x1406,0x1406,0x1406,0x1406,0x1406,0x1406,0x1406,0x1406,0x1406,0x1406,0x1406,0x1406,0x1406,0x1406,
+0x806,0x806,0x806,0x806,0x806,0x806,0x806,0x806,0x806,0x806,0x806,0x806,0x806,0x806,0x806,0x806,
+0xf805,0xf805,0xf805,0xf805,0xf805,0xf805,0xf805,0xf805,0xf805,0xf805,0xf805,0xf805,0xf805,0xf805,0xf805,0xf805,
+0xec05,0xec05,0xec05,0xec05,0xec05,0xec05,0xec15,0xec05,0xec15,0xec05,0xec05,0xec05,0xec05,0xec05,0xec05,0xec05,
+0x46,0xffc5,0,0x60,0x60,0x60,0x60,0,0x40,0x40,0x46,0xffc5,0x46,0xffc5,0x46,0xffc5,
+0x46,0xffc5,0x46,0xffc5,0x46,0xffc5,0x46,0xffc5,0x46,0xffc5,0x46,0xffc5,0x46,0xffc5,0x46,0xffc5,
+0x3c6,0x46,0xffc5,0x46,0xffc5,0x46,0xffc5,0x46,0xffc5,0x46,0xffc5,0x46,0xffc5,0x46,0xffc5,0xfc45,
+0x46,0xffc5,0x46,0xffc5,0x46,0xffc5,0x46,0xffc5,0x46,0xffc5,0x46,0xffc5,0x46,0xffc5,0x46,0xffc5,
+0x46,0xffc5,0x46,0xffc5,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0xc06,0xc06,0xc06,0xc06,0xc06,0xc06,0xc06,0xc06,0xc06,0xc06,0xc06,
+0xc06,0xc06,0xc06,0xc06,0xc06,0xc06,0xc06,0xc06,0xc06,0xc06,0xc06,0xc06,0xc06,0xc06,0xc06,0,
+0,0x40,0,0,0,0,0,0,0,0xf405,0xf405,0xf405,0xf405,0xf405,0xf405,0xf405,
+0xf405,0xf405,0xf405,0xf405,0xf405,0xf405,0xf405,0xf405,0xf405,0xf405,0xf405,0xf405,0xf405,0xf405,0xf405,0xf405,
+0xf405,0xf405,0xf405,0xf405,0xf405,0xf405,0xf405,0xf405,0xf405,0xf405,0xf405,0x11fd,0,0,0,0,
+0,0,0,0,0,0x70,0x60,0x60,0x60,0x60,0x70,0x60,0x60,0x60,0x70,0x70,
+0x60,0x60,0x60,0x60,0x60,0x60,0x70,0x70,0x70,0x70,0x70,0x70,0x60,0x60,0x70,0x60,
+0x60,0x70,0x70,0x60,0x70,0x70,0x70,0x70,0x70,0x70,0x70,0x70,0x70,0x70,0x70,0x70,
+0x70,0x70,0,0x70,0,0x70,0x70,0,0x60,0x70,0,0x70,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0x40,0,0,0,0,0,0,0,0,0,0,0,
+0x40,0x40,0x40,0x40,0,0,0,0,0,0,0,0,0,0,0,0,
+0x60,0x60,0x60,0x60,0x60,0x60,0,0,0,0,0,0,0,0,0,0,
+0x40,0,0,0,0,0,0,0,0,0,0,0x70,0x70,0x70,0x70,0x70,
+0x70,0x70,0x70,0x60,0x60,0x70,0x70,0x60,0x60,0x60,0x60,0x60,0x70,0x60,0x60,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0x70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0x60,0x60,0x60,0x60,0x60,0x60,
+0x60,0x40,0x40,0x60,0x60,0x60,0x60,0x70,0x60,0x40,0x40,0x60,0x60,0,0x70,0x60,
+0x60,0x70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0x40,0,0x70,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0x60,0x70,0x60,0x60,
+0x70,0x60,0x60,0x70,0x70,0x70,0x60,0x70,0x70,0x60,0x70,0x60,0x60,0x60,0x70,0x60,
+0x70,0x60,0x70,0x60,0x70,0x60,0x60,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0x40,0x40,
+0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0x60,0x60,0x60,0x60,0x60,
+0x60,0x60,0x70,0x60,0x40,0x40,0,0,0,0,0x40,0,0,0,0,0,
+0,0x40,0x40,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0x70,0,0,0,0,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0,0,0,
+0,0x70,0,0,0,0x60,0x70,0x60,0x60,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0x40,0x40,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0x40,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0x40,0x40,0x40,0x40,0,0,0,0,0,0,0,
+0,0x70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0x40,0x40,0,0,0,0,0x40,0x40,0,0,0x40,
+0x40,0x70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0x40,0x40,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0x40,0x40,0x40,0x40,0x40,0,0x40,0x40,0,0,0,
+0,0x70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0x70,0,0,0x40,0,0x40,0x40,0x40,0,0,0,0,0,0,0,0,
+0,0x70,0,0,0,0,0,0,0,0,0x40,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0x40,0,0,0,0,0,0,0,
+0,0,0,0,0,0x70,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0x40,0x40,0x40,0,0,0,0,0,0x40,0x40,
+0x40,0,0x40,0x40,0x40,0x70,0,0,0,0,0,0,0,0x70,0x70,0,
+0,0,0,0,0,0,0,0,0,0,0x40,0,0,0,0,0,
+0x40,0x70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0x40,0x40,0x40,0,0,0,0,0,0,0,0,
+0,0x70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0x70,0,0,0,0,0,0,0,0x40,0x40,
+0x40,0,0x40,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0x40,0,0,0x40,0x40,0x40,0x40,0x70,0x70,0x70,0,
+0,0,0,0,0,0,0x40,0x40,0x70,0x70,0x70,0x70,0x40,0x40,0x40,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0x40,0,0,0x40,0x40,0x40,0x40,0x70,0x70,0,0x40,0x40,0,0,0,
+0,0,0,0,0,0,0x40,0,0x70,0x70,0x70,0x70,0x40,0x40,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0x70,0x70,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0x70,0,0x70,0,0x70,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0x70,0x70,0x40,0x70,0x40,0x40,0x40,
+0x40,0x40,0x70,0x70,0x70,0x70,0x40,0,0x70,0x40,0x60,0x60,0x70,0,0x60,0x60,
+0,0,0,0,0,0,0,0,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,
+0,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,
+0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,
+0x40,0,0,0,0,0,0,0,0,0,0x70,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0x40,0x40,0x40,0x40,0,0x40,0,0,0,0x40,0x70,
+0,0x70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0x40,0x40,0,0,
+0,0,0,0,0x127e,0x129e,0x12be,0x12de,0x12fe,0x131e,0x133e,0x135e,0x137e,0x139e,0x13be,0x13de,
+0x13fe,0x141e,0x143e,0x145e,0x147e,0x149e,0x14be,0x14de,0x14fe,0x151e,0x153e,0x155e,0x157e,0x159e,0x15be,0x15de,
+0x15fe,0x161e,0x163e,0x165e,0x167e,0x169e,0x16be,0x16de,0x16fe,0x171e,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0x60,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0x40,0x40,
+0x70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0x40,0x40,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0x40,0x40,0,0x40,
+0x40,0x40,0x40,0x40,0x40,0x40,0,0,0,0,0,0,0,0,0x40,0,
+0,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x70,0x40,0,0,0,0x40,
+0,0,0,0,0,0x60,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0x40,0x40,0x40,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0x40,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0x40,0x40,0x40,0,0,0,0,0x40,
+0x40,0,0,0,0,0,0,0,0,0,0x40,0,0,0,0,0,
+0,0x70,0x60,0x70,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0x60,0x70,0,0,0,
+0,0,0,0,0x40,0x40,0x40,0x40,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0x70,0,0x40,0x40,0x40,0x40,0x40,0,0x40,0,0,0,
+0,0,0x40,0,0x30,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0x60,0x70,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0,0,0,0,
+0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,
+1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+1,1,1,1,1,1,1,1,1,1,0x11,1,1,1,1,1,
+1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+1,1,1,1,1,0x173d,1,1,1,1,1,1,0x11,1,1,1,
+0x11,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+1,1,1,1,1,1,1,1,0x60,0x60,0x70,0x60,0x60,0x60,0x60,0x60,
+0x60,0x60,0x70,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0x60,0x70,0x46,0xffc5,0x46,0xffc5,0x46,0xffc5,0x46,0xffc5,0x46,0xffc5,0x46,0xffc5,
+0x46,0xffd5,0x46,0xffc5,0x46,0xffc5,0x46,0xffc5,0x46,0xffc5,0x46,0xffc5,0x46,0xffc5,0x46,0xffc5,
+0x46,0xffc5,0x46,0xffc5,0x175e,0x179d,0x46,0xffc5,0x46,0xffc5,0x46,0xffc5,0x46,0xffc5,0x46,0xffc5,
+0x46,0xffc5,0x46,0xffc5,0x46,0xffc5,0x46,0xffc5,0x46,0xffc5,0x46,0xffc5,0x46,0xffc5,0x46,0xffc5,
+0x46,0xffc5,0x46,0xffc5,0x46,0xffc5,0x17dd,0x185d,0x18dd,0x195d,0x19dd,0x1a5d,0,0,0,0,
+0x46,0xffc5,0x46,0xffc5,0x46,0xffc5,0x46,0xffc5,0x46,0xffc5,0x46,0xffd5,0x46,0xffc5,0x46,0xffc5,
+0x46,0xffc5,0x46,0xffc5,0x46,0xffc5,0x46,0xffc5,0x46,0xffc5,0x46,0xffc5,0x46,0xffc5,0x46,0xffc5,
+0x46,0xffc5,0x46,0xffc5,0x46,0xffc5,0,0,0,0,0,0,0x205,0x205,0x205,0x205,
+0x205,0x205,0x205,0x205,0xfe06,0xfe06,0xfe06,0xfe06,0xfe06,0xfe06,0xfe06,0xfe06,0x205,0x205,0x205,0x205,
+0x205,0x205,0,0,0xfe06,0xfe06,0xfe06,0xfe06,0xfe06,0xfe06,0,0,0x205,0x205,0x205,0x205,
+0x205,0x205,0x205,0x205,0xfe06,0xfe06,0xfe06,0xfe06,0xfe06,0xfe06,0xfe06,0xfe06,0x205,0x205,0x205,0x205,
+0x205,0x205,0x205,0x205,0xfe06,0xfe06,0xfe06,0xfe06,0xfe06,0xfe06,0xfe06,0xfe06,0x205,0x205,0x205,0x205,
+0x205,0x205,0,0,0xfe06,0xfe06,0xfe06,0xfe06,0xfe06,0xfe06,0,0,0x1a8d,0x205,0x1b0d,0x205,
+0x1bbd,0x205,0x1c6d,0x205,0,0xfe06,0,0xfe06,0,0xfe06,0,0xfe06,0x205,0x205,0x205,0x205,
+0x205,0x205,0x205,0x205,0xfe06,0xfe06,0xfe06,0xfe06,0xfe06,0xfe06,0xfe06,0xfe06,0x1285,0x1285,0x1585,0x1585,
+0x1585,0x1585,0x1905,0x1905,0x2005,0x2005,0x1c05,0x1c05,0x1f85,0x1f85,0,0,0x1d1d,0x1d8d,0x1dfd,0x1e6d,
+0x1edd,0x1f4d,0x1fbd,0x202d,0x209f,0x210f,0x217f,0x21ef,0x225f,0x22cf,0x233f,0x23af,0x241d,0x248d,0x24fd,0x256d,
+0x25dd,0x264d,0x26bd,0x272d,0x279f,0x280f,0x287f,0x28ef,0x295f,0x29cf,0x2a3f,0x2aaf,0x2b1d,0x2b8d,0x2bfd,0x2c6d,
+0x2cdd,0x2d4d,0x2dbd,0x2e2d,0x2e9f,0x2f0f,0x2f7f,0x2fef,0x305f,0x30cf,0x313f,0x31af,0x205,0x205,0x321d,0x329d,
+0x330d,0,0x338d,0x340d,0xfe06,0xfe06,0xed86,0xed86,0x34bf,0x40,0x352d,0x40,0x40,0x40,0x357d,0x35fd,
+0x366d,0,0x36ed,0x376d,0xea86,0xea86,0xea86,0xea86,0x381f,0x40,0x40,0x40,0x205,0x205,0x388d,0x393d,
+0,0,0x3a0d,0x3a8d,0xfe06,0xfe06,0xe706,0xe706,0,0x40,0x40,0x40,0x205,0x205,0x3b3d,0x3bed,
+0x3cbd,0x1c5,0x3d3d,0x3dbd,0xfe06,0xfe06,0xe406,0xe406,0xfe46,0x40,0x40,0x40,0,0,0x3e6d,0x3eed,
+0x3f5d,0,0x3fdd,0x405d,0xe006,0xe006,0xe086,0xe086,0x410f,0x40,0x40,0,0,0,0,0,
+0,0,0,0,0,0,0,0x40,0x40,0x40,0x40,0x40,0,0,0,0,
+0,0,0,0,0,0x40,0,0,0,0,0,0,0,0,0,0x40,
+0,0,0x40,0x40,0x40,0x40,0x40,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0x40,0x40,0x40,0x40,0,0,0,0,
+0,0,0x40,0x40,0x40,0x40,0x40,0x40,0,0x11,0,0,0,0,0,0,
+0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0x60,0x60,0x70,0x70,0x60,0x60,0x60,0x60,0x70,0x70,0x70,0x60,0x60,0x40,0x40,0x40,
+0x40,0x60,0x40,0x40,0x40,0x70,0x70,0x60,0x70,0x60,0x70,0x70,0x70,0x70,0x70,0x70,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,2,0,0,0,0,2,0,0,1,2,2,2,1,1,
+2,2,2,1,0,2,0,0,0,2,2,2,2,2,0,0,
+0,0,0,0,2,0,0x417e,0,2,0,0x41be,0x41fe,2,2,0,1,
+2,2,0x706,2,1,0,0,0,0,1,0,0,1,1,2,2,
+0,0,0,0,0,2,1,1,0x11,0x11,0,0,0,0,0xf905,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0x406,0x406,0x406,0x406,0x406,0x406,0x406,0x406,0x406,0x406,0x406,0x406,0x406,0x406,0x406,0x406,
+0xfc05,0xfc05,0xfc05,0xfc05,0xfc05,0xfc05,0xfc05,0xfc05,0xfc05,0xfc05,0xfc05,0xfc05,0xfc05,0xfc05,0xfc05,0xfc05,
+0,0,0,0x46,0xffc5,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0x686,0x686,0x686,0x686,0x686,0x686,0x686,0x686,0x686,0x686,0x686,0x686,0x686,0x686,
+0x686,0x686,0x686,0x686,0xf985,0xf985,0xf985,0xf985,0xf985,0xf985,0xf985,0xf985,0xf985,0xf985,0xf985,0xf985,
+0xf985,0xf985,0xf985,0xf985,0xf985,0xf985,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0xc06,0xc06,0xc06,0xc06,
+0xc06,0xc06,0xc06,0xc06,0xc06,0xc06,0xc06,0xc06,0xc06,0xc06,0xc06,0xc06,0xc06,0xc06,0xc06,0xc06,
+0xc06,0xc06,0xc06,0xc06,0xc06,0xc06,0xc06,0xc06,0xc06,0xc06,0xc06,0xc06,0xc06,0xc06,0xc06,0,
+0xf405,0xf405,0xf405,0xf405,0xf405,0xf405,0xf405,0xf405,0xf405,0xf405,0xf405,0xf405,0xf405,0xf405,0xf405,0xf405,
+0xf405,0xf405,0xf405,0xf405,0xf405,0xf405,0xf405,0xf405,0xf405,0xf405,0xf405,0xf405,0xf405,0xf405,0xf405,0,
+0x46,0xffc5,0x423e,0x425e,0x427e,0x429d,0x42bd,0x46,0xffc5,0x46,0xffc5,0x46,0xffc5,0,0,0,
+0,0,0,0,1,0x46,0xffc5,1,0,0,0,0,0,0,0,0,
+0x46,0xffc5,0x46,0xffc5,1,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0x42dd,0x42fd,0x431d,0x433d,0x435d,0x437d,0x439d,0x43bd,0x43dd,0x43fd,0x441d,0x443d,0x445d,0x447d,0x449d,0x44bd,
+0x44dd,0x44fd,0x451d,0x453d,0x455d,0x457d,0x459d,0x45bd,0x45dd,0x45fd,0x461d,0x463d,0x465d,0x467d,0x469d,0x46bd,
+0x46dd,0x46fd,0x471d,0x473d,0x475d,0x477d,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0x70,0x70,0x70,0x70,0x70,0x70,0,0x40,0x40,0x40,0x40,0x40,0,0,
+0,0,0,0x40,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0x70,0x70,0x40,
+0x40,0x40,0x40,0,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,
+0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0,
+0,0,0,0,0x40,0x40,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0x70,0,0,0,0,0x40,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+#ifdef U_DARWIN
+0x40,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0x40,
+0,0,0,0,0x40,0,0,0,0,0x40,0x70,0x70,0x70,0x70,0x70,0x70,
+0x70,0x70,0x70,0x70,0x70,0x70,0x40,0,0,0x40,0,0,0,0,0,0x70,
+#endif /* U_DARWIN */
+0x479d,0x481d,0x489d,0x491d,0x49cd,0x4a7d,0x4b1d,0,0,0,0,0,0,0,0,0,
+0,0,0,0x4bbd,0x4c3d,0x4cbd,0x4d3d,0x4dbd,0,0,0,0,0,0,0x70,0,
+0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0x60,0x60,0x60,0x60,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0x806,0x806,0x806,0x806,0x806,0x806,0x806,0x806,0x806,0x806,0x806,0x806,0x806,0x806,0x806,
+0x806,0x806,0x806,0x806,0x806,0x806,0x806,0x806,0x806,0x806,0x806,0,0,0,0x40,0,
+0x40,0xf805,0xf805,0xf805,0xf805,0xf805,0xf805,0xf805,0xf805,0xf805,0xf805,0xf805,0xf805,0xf805,0xf805,0xf805,
+0xf805,0xf805,0xf805,0xf805,0xf805,0xf805,0xf805,0xf805,0xf805,0xf805,0xf805,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0x40,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0x40,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0x40,0x40,0x40,0,0,0,0,0xa06,0xa06,0xa06,0xa06,
+0xa06,0xa06,0xa06,0xa06,0xa06,0xa06,0xa06,0xa06,0xa06,0xa06,0xa06,0xa06,0xa06,0xa06,0xa06,0xa06,
+0xa06,0xa06,0xa06,0xa06,0xa06,0xa06,0xa06,0xa06,0xa06,0xa06,0xa06,0xa06,0xf605,0xf605,0xf605,0xf605,
+0xf605,0xf605,0xf605,0xf605,0xf605,0xf605,0xf605,0xf605,0xf605,0xf605,0xf605,0xf605,0xf605,0xf605,0xf605,0xf605,
+0xf605,0xf605,0xf605,0xf605,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0x40,0x40,0x40,0,0x40,0x40,0,0,0,0,0,
+0x40,0x70,0x40,0x60,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0x60,0x70,0x70,0,
+0,0,0,0x70,0,0,0,0,0,0x30,0x30,0x70,0x70,0x70,0,0,
+0,0x30,0x30,0x30,0x30,0x30,0x30,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x70,
+0x70,0x70,0x70,0x70,0x70,0x70,0x70,0,0,0x60,0x60,0x60,0x60,0x60,0x70,0x70,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0x60,0x60,0x60,0x60,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0x60,0x60,
+0x60,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,
+2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
+2,2,2,2,2,2,1,1,1,1,1,1,1,1,0x11,0x11,
+1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,
+1,1,1,1,1,0,0x11,0x11,1,1,1,1,1,1,1,1,
+2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
+2,2,2,2,2,2,2,2,2,2,1,1,1,1,1,1,
+1,1,0x11,0x11,1,1,1,1,1,1,1,1,1,1,1,1,
+1,1,1,1,2,0,2,2,0,0,2,0,0,2,2,0,
+0,2,2,2,2,0,2,2,2,2,2,2,2,2,1,1,
+1,1,0,1,0,1,0x11,0x11,1,1,1,1,0,1,1,1,
+1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,
+2,2,2,2,2,2,2,2,1,1,1,1,2,2,0,2,
+2,2,2,0,0,2,2,2,2,2,2,2,2,0,2,2,
+2,2,2,2,2,0,1,1,1,1,1,1,1,1,0x11,0x11,
+1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+2,2,0,2,2,2,2,0,2,2,2,2,2,0,2,0,
+0,0,2,2,2,2,2,2,2,0,1,1,1,1,1,1,
+1,1,0x11,0x11,1,1,1,1,1,1,1,1,1,1,1,1,
+2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
+2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,
+1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,
+2,2,2,2,1,1,1,1,1,1,0,0,2,2,2,2,
+2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
+2,2,2,2,2,0,1,1,1,1,1,1,1,1,1,1,
+1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,
+1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,
+2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,
+1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+1,1,1,1,1,0,1,1,1,1,1,1,2,2,2,2,
+2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,0,
+1,1,1,1,1,1,2,1,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0x40,0x40,0x40,0x40,
+0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,
+0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0,0x820,0x840,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0x860,0x880,0,0,
+0,0,0,0,0,0,0,0,0x8a0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0
+};
+
+static const uint16_t ucase_props_exceptions[1251]={
+0xc041,0x69,2,0x130,0x131,0x4001,0x6a,0x41,0x6b,1,0x212a,0x41,0x73,1,0x17f,0x5044,
+0x49,2,0x130,0x131,0x44,0x4b,1,0x212a,0x44,0x53,1,0x17f,6,0x3bc,0x39c,0x41,
+0xe5,1,0x212b,0x4001,0xec,0x4001,0xed,0x80,0x2220,0x73,0x73,0x53,0x53,0x53,0x73,0x44,
+0xc5,1,0x212b,0x4001,0x129,0x4001,0x12f,0xc041,0x69,2,0x131,0x49,0x44,0x49,2,0x69,
+0x130,0x80,0x2220,0x2bc,0x6e,0x2bc,0x4e,0x2bc,0x4e,6,0x73,0x53,9,0x1c6,0x1c5,0xd,
+0x1c6,0x1c4,0x1c5,0xc,0x1c4,0x1c5,9,0x1c9,0x1c8,0xd,0x1c9,0x1c7,0x1c8,0xc,0x1c7,0x1c8,
+9,0x1cc,0x1cb,0xd,0x1cc,0x1ca,0x1cb,0xc,0x1ca,0x1cb,0x80,0x2220,0x6a,0x30c,0x4a,0x30c,
+0x4a,0x30c,9,0x1f3,0x1f2,0xd,0x1f3,0x1f1,0x1f2,0xc,0x1f1,0x1f2,1,0x2c65,1,0x2c66,
+4,0x2c62,4,0x2c64,0x6000,0x3046,0x3b9,0x399,1,0x1fbe,0xc0,1,0x3330,0x3b9,0x308,0x301,
+0x399,0x308,0x301,0x399,0x308,0x301,0x1fd3,0x41,0x3b2,1,0x3d0,0x41,0x3b5,1,0x3f5,0x41,
+0x3b8,2,0x3d1,0x3f4,0x41,0x3b9,2,0x345,0x1fbe,0x41,0x3ba,1,0x3f0,0x41,0x3bc,1,
+0xb5,0x41,0x3c0,1,0x3d6,0x41,0x3c1,1,0x3f1,0x4041,0x3c3,1,0x3c2,0x41,0x3c6,1,
+0x3d5,0x41,0x3c9,1,0x2126,0xc0,1,0x3330,0x3c5,0x308,0x301,0x3a5,0x308,0x301,0x3a5,0x308,
+0x301,0x1fe3,0x44,0x392,1,0x3d0,0x44,0x395,1,0x3f5,0x44,0x398,2,0x3d1,0x3f4,0x44,
+0x399,2,0x345,0x1fbe,0x44,0x39a,1,0x3f0,0x44,0x39c,1,0xb5,0x44,0x3a0,1,0x3d6,
+0x44,0x3a1,1,0x3f1,6,0x3c3,0x3a3,0x44,0x3a3,1,0x3c2,0x44,0x3a6,1,0x3d5,0x44,
+0x3a9,1,0x2126,6,0x3b2,0x392,0x46,0x3b8,0x398,1,0x3f4,6,0x3c6,0x3a6,6,0x3c0,
+0x3a0,6,0x3ba,0x39a,6,0x3c1,0x3a1,0x41,0x3b8,2,0x398,0x3d1,6,0x3b5,0x395,0x80,
+0x2220,0x565,0x582,0x535,0x552,0x535,0x582,1,0x2d00,1,0x2d01,1,0x2d02,1,0x2d03,1,
+0x2d04,1,0x2d05,1,0x2d06,1,0x2d07,1,0x2d08,1,0x2d09,1,0x2d0a,1,0x2d0b,1,
+0x2d0c,1,0x2d0d,1,0x2d0e,1,0x2d0f,1,0x2d10,1,0x2d11,1,0x2d12,1,0x2d13,1,
+0x2d14,1,0x2d15,1,0x2d16,1,0x2d17,1,0x2d18,1,0x2d19,1,0x2d1a,1,0x2d1b,1,
+0x2d1c,1,0x2d1d,1,0x2d1e,1,0x2d1f,1,0x2d20,1,0x2d21,1,0x2d22,1,0x2d23,1,
+0x2d24,1,0x2d25,4,0x2c63,0x41,0x1e61,1,0x1e9b,0x44,0x1e60,1,0x1e9b,0x80,0x2220,0x68,
+0x331,0x48,0x331,0x48,0x331,0x80,0x2220,0x74,0x308,0x54,0x308,0x54,0x308,0x80,0x2220,0x77,
+0x30a,0x57,0x30a,0x57,0x30a,0x80,0x2220,0x79,0x30a,0x59,0x30a,0x59,0x30a,0x80,0x2220,0x61,
+0x2be,0x41,0x2be,0x41,0x2be,6,0x1e61,0x1e60,0x80,0x2220,0x3c5,0x313,0x3a5,0x313,0x3a5,0x313,
+0x80,0x3330,0x3c5,0x313,0x300,0x3a5,0x313,0x300,0x3a5,0x313,0x300,0x80,0x3330,0x3c5,0x313,0x301,
+0x3a5,0x313,0x301,0x3a5,0x313,0x301,0x80,0x3330,0x3c5,0x313,0x342,0x3a5,0x313,0x342,0x3a5,0x313,
+0x342,0x84,0x1f88,0x220,0x1f00,0x3b9,0x1f08,0x399,0x84,0x1f89,0x220,0x1f01,0x3b9,0x1f09,0x399,0x84,
+0x1f8a,0x220,0x1f02,0x3b9,0x1f0a,0x399,0x84,0x1f8b,0x220,0x1f03,0x3b9,0x1f0b,0x399,0x84,0x1f8c,0x220,
+0x1f04,0x3b9,0x1f0c,0x399,0x84,0x1f8d,0x220,0x1f05,0x3b9,0x1f0d,0x399,0x84,0x1f8e,0x220,0x1f06,0x3b9,
+0x1f0e,0x399,0x84,0x1f8f,0x220,0x1f07,0x3b9,0x1f0f,0x399,0x81,0x1f80,0x220,0x1f00,0x3b9,0x1f08,0x399,
+0x81,0x1f81,0x220,0x1f01,0x3b9,0x1f09,0x399,0x81,0x1f82,0x220,0x1f02,0x3b9,0x1f0a,0x399,0x81,0x1f83,
+0x220,0x1f03,0x3b9,0x1f0b,0x399,0x81,0x1f84,0x220,0x1f04,0x3b9,0x1f0c,0x399,0x81,0x1f85,0x220,0x1f05,
+0x3b9,0x1f0d,0x399,0x81,0x1f86,0x220,0x1f06,0x3b9,0x1f0e,0x399,0x81,0x1f87,0x220,0x1f07,0x3b9,0x1f0f,
+0x399,0x84,0x1f98,0x220,0x1f20,0x3b9,0x1f28,0x399,0x84,0x1f99,0x220,0x1f21,0x3b9,0x1f29,0x399,0x84,
+0x1f9a,0x220,0x1f22,0x3b9,0x1f2a,0x399,0x84,0x1f9b,0x220,0x1f23,0x3b9,0x1f2b,0x399,0x84,0x1f9c,0x220,
+0x1f24,0x3b9,0x1f2c,0x399,0x84,0x1f9d,0x220,0x1f25,0x3b9,0x1f2d,0x399,0x84,0x1f9e,0x220,0x1f26,0x3b9,
+0x1f2e,0x399,0x84,0x1f9f,0x220,0x1f27,0x3b9,0x1f2f,0x399,0x81,0x1f90,0x220,0x1f20,0x3b9,0x1f28,0x399,
+0x81,0x1f91,0x220,0x1f21,0x3b9,0x1f29,0x399,0x81,0x1f92,0x220,0x1f22,0x3b9,0x1f2a,0x399,0x81,0x1f93,
+0x220,0x1f23,0x3b9,0x1f2b,0x399,0x81,0x1f94,0x220,0x1f24,0x3b9,0x1f2c,0x399,0x81,0x1f95,0x220,0x1f25,
+0x3b9,0x1f2d,0x399,0x81,0x1f96,0x220,0x1f26,0x3b9,0x1f2e,0x399,0x81,0x1f97,0x220,0x1f27,0x3b9,0x1f2f,
+0x399,0x84,0x1fa8,0x220,0x1f60,0x3b9,0x1f68,0x399,0x84,0x1fa9,0x220,0x1f61,0x3b9,0x1f69,0x399,0x84,
+0x1faa,0x220,0x1f62,0x3b9,0x1f6a,0x399,0x84,0x1fab,0x220,0x1f63,0x3b9,0x1f6b,0x399,0x84,0x1fac,0x220,
+0x1f64,0x3b9,0x1f6c,0x399,0x84,0x1fad,0x220,0x1f65,0x3b9,0x1f6d,0x399,0x84,0x1fae,0x220,0x1f66,0x3b9,
+0x1f6e,0x399,0x84,0x1faf,0x220,0x1f67,0x3b9,0x1f6f,0x399,0x81,0x1fa0,0x220,0x1f60,0x3b9,0x1f68,0x399,
+0x81,0x1fa1,0x220,0x1f61,0x3b9,0x1f69,0x399,0x81,0x1fa2,0x220,0x1f62,0x3b9,0x1f6a,0x399,0x81,0x1fa3,
+0x220,0x1f63,0x3b9,0x1f6b,0x399,0x81,0x1fa4,0x220,0x1f64,0x3b9,0x1f6c,0x399,0x81,0x1fa5,0x220,0x1f65,
+0x3b9,0x1f6d,0x399,0x81,0x1fa6,0x220,0x1f66,0x3b9,0x1f6e,0x399,0x81,0x1fa7,0x220,0x1f67,0x3b9,0x1f6f,
+0x399,0x80,0x2220,0x1f70,0x3b9,0x1fba,0x399,0x1fba,0x345,0x84,0x1fbc,0x220,0x3b1,0x3b9,0x391,0x399,
+0x80,0x2220,0x3ac,0x3b9,0x386,0x399,0x386,0x345,0x80,0x2220,0x3b1,0x342,0x391,0x342,0x391,0x342,
+0x80,0x3330,0x3b1,0x342,0x3b9,0x391,0x342,0x399,0x391,0x342,0x345,0x81,0x1fb3,0x220,0x3b1,0x3b9,
+0x391,0x399,0x46,0x3b9,0x399,1,0x345,0x80,0x2220,0x1f74,0x3b9,0x1fca,0x399,0x1fca,0x345,0x84,
+0x1fcc,0x220,0x3b7,0x3b9,0x397,0x399,0x80,0x2220,0x3ae,0x3b9,0x389,0x399,0x389,0x345,0x80,0x2220,
+0x3b7,0x342,0x397,0x342,0x397,0x342,0x80,0x3330,0x3b7,0x342,0x3b9,0x397,0x342,0x399,0x397,0x342,
+0x345,0x81,0x1fc3,0x220,0x3b7,0x3b9,0x397,0x399,0x80,0x3330,0x3b9,0x308,0x300,0x399,0x308,0x300,
+0x399,0x308,0x300,0xc0,1,0x3330,0x3b9,0x308,0x301,0x399,0x308,0x301,0x399,0x308,0x301,0x390,
+0x80,0x2220,0x3b9,0x342,0x399,0x342,0x399,0x342,0x80,0x3330,0x3b9,0x308,0x342,0x399,0x308,0x342,
+0x399,0x308,0x342,0x80,0x3330,0x3c5,0x308,0x300,0x3a5,0x308,0x300,0x3a5,0x308,0x300,0xc0,1,
+0x3330,0x3c5,0x308,0x301,0x3a5,0x308,0x301,0x3a5,0x308,0x301,0x3b0,0x80,0x2220,0x3c1,0x313,0x3a1,
+0x313,0x3a1,0x313,0x80,0x2220,0x3c5,0x342,0x3a5,0x342,0x3a5,0x342,0x80,0x3330,0x3c5,0x308,0x342,
+0x3a5,0x308,0x342,0x3a5,0x308,0x342,0x80,0x2220,0x1f7c,0x3b9,0x1ffa,0x399,0x1ffa,0x345,0x84,0x1ffc,
+0x220,0x3c9,0x3b9,0x3a9,0x399,0x80,0x2220,0x3ce,0x3b9,0x38f,0x399,0x38f,0x345,0x80,0x2220,0x3c9,
+0x342,0x3a9,0x342,0x3a9,0x342,0x80,0x3330,0x3c9,0x342,0x3b9,0x3a9,0x342,0x399,0x3a9,0x342,0x345,
+0x81,0x1ff3,0x220,0x3c9,0x3b9,0x3a9,0x399,0x41,0x3c9,1,0x3a9,0x41,0x6b,1,0x4b,0x41,
+0xe5,1,0xc5,1,0x26b,1,0x1d7d,1,0x27d,4,0x23a,4,0x23e,4,0x10a0,4,
+0x10a1,4,0x10a2,4,0x10a3,4,0x10a4,4,0x10a5,4,0x10a6,4,0x10a7,4,0x10a8,4,
+0x10a9,4,0x10aa,4,0x10ab,4,0x10ac,4,0x10ad,4,0x10ae,4,0x10af,4,0x10b0,4,
+0x10b1,4,0x10b2,4,0x10b3,4,0x10b4,4,0x10b5,4,0x10b6,4,0x10b7,4,0x10b8,4,
+0x10b9,4,0x10ba,4,0x10bb,4,0x10bc,4,0x10bd,4,0x10be,4,0x10bf,4,0x10c0,4,
+0x10c1,4,0x10c2,4,0x10c3,4,0x10c4,4,0x10c5,0x80,0x2220,0x66,0x66,0x46,0x46,0x46,
+0x66,0x80,0x2220,0x66,0x69,0x46,0x49,0x46,0x69,0x80,0x2220,0x66,0x6c,0x46,0x4c,0x46,
+0x6c,0x80,0x3330,0x66,0x66,0x69,0x46,0x46,0x49,0x46,0x66,0x69,0x80,0x3330,0x66,0x66,
+0x6c,0x46,0x46,0x4c,0x46,0x66,0x6c,0xc0,1,0x2220,0x73,0x74,0x53,0x54,0x53,0x74,
+0xfb06,0xc0,1,0x2220,0x73,0x74,0x53,0x54,0x53,0x74,0xfb05,0x80,0x2220,0x574,0x576,0x544,
+0x546,0x544,0x576,0x80,0x2220,0x574,0x565,0x544,0x535,0x544,0x565,0x80,0x2220,0x574,0x56b,0x544,
+0x53b,0x544,0x56b,0x80,0x2220,0x57e,0x576,0x54e,0x546,0x54e,0x576,0x80,0x2220,0x574,0x56d,0x544,
+0x53d,0x544,0x56d
+};
+
+static const uint16_t ucase_props_unfold[370]={
+0x49,5,3,0,0,0x61,0x2be,0,0x1e9a,0,0x66,0x66,0,0xfb00,0,0x66,
+0x66,0x69,0xfb03,0,0x66,0x66,0x6c,0xfb04,0,0x66,0x69,0,0xfb01,0,0x66,0x6c,
+0,0xfb02,0,0x68,0x331,0,0x1e96,0,0x69,0x307,0,0x130,0,0x6a,0x30c,0,
+0x1f0,0,0x73,0x73,0,0xdf,0,0x73,0x74,0,0xfb05,0xfb06,0x74,0x308,0,0x1e97,
+0,0x77,0x30a,0,0x1e98,0,0x79,0x30a,0,0x1e99,0,0x2bc,0x6e,0,0x149,0,
+0x3ac,0x3b9,0,0x1fb4,0,0x3ae,0x3b9,0,0x1fc4,0,0x3b1,0x342,0,0x1fb6,0,0x3b1,
+0x342,0x3b9,0x1fb7,0,0x3b1,0x3b9,0,0x1fb3,0x1fbc,0x3b7,0x342,0,0x1fc6,0,0x3b7,0x342,
+0x3b9,0x1fc7,0,0x3b7,0x3b9,0,0x1fc3,0x1fcc,0x3b9,0x308,0x300,0x1fd2,0,0x3b9,0x308,0x301,
+0x390,0x1fd3,0x3b9,0x308,0x342,0x1fd7,0,0x3b9,0x342,0,0x1fd6,0,0x3c1,0x313,0,0x1fe4,
+0,0x3c5,0x308,0x300,0x1fe2,0,0x3c5,0x308,0x301,0x3b0,0x1fe3,0x3c5,0x308,0x342,0x1fe7,0,
+0x3c5,0x313,0,0x1f50,0,0x3c5,0x313,0x300,0x1f52,0,0x3c5,0x313,0x301,0x1f54,0,0x3c5,
+0x313,0x342,0x1f56,0,0x3c5,0x342,0,0x1fe6,0,0x3c9,0x342,0,0x1ff6,0,0x3c9,0x342,
+0x3b9,0x1ff7,0,0x3c9,0x3b9,0,0x1ff3,0x1ffc,0x3ce,0x3b9,0,0x1ff4,0,0x565,0x582,0,
+0x587,0,0x574,0x565,0,0xfb14,0,0x574,0x56b,0,0xfb15,0,0x574,0x56d,0,0xfb17,
+0,0x574,0x576,0,0xfb13,0,0x57e,0x576,0,0xfb16,0,0x1f00,0x3b9,0,0x1f80,0x1f88,
+0x1f01,0x3b9,0,0x1f81,0x1f89,0x1f02,0x3b9,0,0x1f82,0x1f8a,0x1f03,0x3b9,0,0x1f83,0x1f8b,0x1f04,
+0x3b9,0,0x1f84,0x1f8c,0x1f05,0x3b9,0,0x1f85,0x1f8d,0x1f06,0x3b9,0,0x1f86,0x1f8e,0x1f07,0x3b9,
+0,0x1f87,0x1f8f,0x1f20,0x3b9,0,0x1f90,0x1f98,0x1f21,0x3b9,0,0x1f91,0x1f99,0x1f22,0x3b9,0,
+0x1f92,0x1f9a,0x1f23,0x3b9,0,0x1f93,0x1f9b,0x1f24,0x3b9,0,0x1f94,0x1f9c,0x1f25,0x3b9,0,0x1f95,
+0x1f9d,0x1f26,0x3b9,0,0x1f96,0x1f9e,0x1f27,0x3b9,0,0x1f97,0x1f9f,0x1f60,0x3b9,0,0x1fa0,0x1fa8,
+0x1f61,0x3b9,0,0x1fa1,0x1fa9,0x1f62,0x3b9,0,0x1fa2,0x1faa,0x1f63,0x3b9,0,0x1fa3,0x1fab,0x1f64,
+0x3b9,0,0x1fa4,0x1fac,0x1f65,0x3b9,0,0x1fa5,0x1fad,0x1f66,0x3b9,0,0x1fa6,0x1fae,0x1f67,0x3b9,
+0,0x1fa7,0x1faf,0x1f70,0x3b9,0,0x1fb2,0,0x1f74,0x3b9,0,0x1fc2,0,0x1f7c,0x3b9,0,
+0x1ff2,0
+};
+
+static const UCaseProps ucase_props_singleton={
+ NULL,
+ ucase_props_indexes,
+ ucase_props_exceptions,
+ ucase_props_unfold,
+ {
+ ucase_props_trieIndex,
+ NULL,
+ utrie_defaultGetFoldingOffset,
+ 2240,
+#ifndef U_DARWIN
+ 5112,
+#else /* U_DARWIN */
+ 5160,
+#endif /* U_DARWIN */
+ 0,
+ TRUE
+ },
+ { 1,1,5,2 }
+};
diff --git a/icuSources/common/ucasemap.c b/icuSources/common/ucasemap.c
new file mode 100644
index 00000000..02f94762
--- /dev/null
+++ b/icuSources/common/ucasemap.c
@@ -0,0 +1,333 @@
+/*
+*******************************************************************************
+*
+* Copyright (C) 2005, International Business Machines
+* Corporation and others. All Rights Reserved.
+*
+*******************************************************************************
+* file name: ucasemap.c
+* encoding: US-ASCII
+* tab size: 8 (not used)
+* indentation:4
+*
+* created on: 2005may06
+* created by: Markus W. Scherer
+*
+* Case mapping service object and functions using it.
+*/
+
+#include "unicode/utypes.h"
+#include "unicode/uloc.h"
+#include "unicode/ustring.h"
+#include "unicode/ucasemap.h"
+#include "cmemory.h"
+#include "cstring.h"
+#include "ucase.h"
+#include "ustr_imp.h"
+
+/* UCaseMap service object -------------------------------------------------- */
+
+struct UCaseMap {
+ const UCaseProps *csp;
+ char locale[32];
+ int32_t locCache;
+ uint32_t options;
+};
+
+U_DRAFT UCaseMap * U_EXPORT2
+ucasemap_open(const char *locale, uint32_t options, UErrorCode *pErrorCode) {
+ UCaseMap *csm;
+
+ if(U_FAILURE(*pErrorCode)) {
+ return NULL;
+ }
+
+ csm=(UCaseMap *)uprv_malloc(sizeof(UCaseMap));
+ if(csm==NULL) {
+ return NULL;
+ }
+ uprv_memset(csm, 0, sizeof(UCaseMap));
+
+ csm->csp=ucase_getSingleton(pErrorCode);
+ ucasemap_setLocale(csm, locale, pErrorCode);
+ if(U_FAILURE(*pErrorCode)) {
+ uprv_free(csm);
+ return NULL;
+ }
+
+ csm->options=options;
+ return csm;
+}
+
+U_DRAFT void U_EXPORT2
+ucasemap_close(UCaseMap *csm) {
+ if(csm!=NULL) {
+ uprv_free(csm);
+ }
+}
+
+U_DRAFT const char * U_EXPORT2
+ucasemap_getLocale(const UCaseMap *csm) {
+ return csm->locale;
+}
+
+U_DRAFT uint32_t U_EXPORT2
+ucasemap_getOptions(const UCaseMap *csm) {
+ return csm->options;
+}
+
+U_DRAFT void U_EXPORT2
+ucasemap_setLocale(UCaseMap *csm, const char *locale, UErrorCode *pErrorCode) {
+ int32_t length;
+
+ if(U_FAILURE(*pErrorCode)) {
+ return;
+ }
+
+ length=uloc_getName(locale, csm->locale, (int32_t)sizeof(csm->locale), pErrorCode);
+ if(*pErrorCode==U_BUFFER_OVERFLOW_ERROR || length==sizeof(csm->locale)) {
+ *pErrorCode=U_ZERO_ERROR;
+ /* we only really need the language code for case mappings */
+ length=uloc_getLanguage(locale, csm->locale, (int32_t)sizeof(csm->locale), pErrorCode);
+ }
+ if(length==sizeof(csm->locale)) {
+ *pErrorCode=U_BUFFER_OVERFLOW_ERROR;
+ }
+ csm->locCache=0;
+ if(U_SUCCESS(*pErrorCode)) {
+ ucase_getCaseLocale(csm->locale, &csm->locCache);
+ } else {
+ csm->locale[0]=0;
+ }
+}
+
+U_DRAFT void U_EXPORT2
+ucasemap_setOptions(UCaseMap *csm, uint32_t options, UErrorCode *pErrorCode) {
+ csm->options=options;
+}
+
+/* UTF-8 string case mappings ----------------------------------------------- */
+
+/* append a full case mapping result, see UCASE_MAX_STRING_LENGTH */
+static U_INLINE int32_t
+appendResult(uint8_t *dest, int32_t destIndex, int32_t destCapacity,
+ int32_t result, const UChar *s) {
+ UChar32 c;
+ int32_t length, destLength;
+ UErrorCode errorCode;
+
+ /* decode the result */
+ if(result<0) {
+ /* (not) original code point */
+ c=~result;
+ length=-1;
+ } else if(result<=UCASE_MAX_STRING_LENGTH) {
+ c=U_SENTINEL;
+ length=result;
+ } else {
+ c=result;
+ length=-1;
+ }
+
+ if(destIndexindex=csc->cpStart;
+ csc->dir=dir;
+ } else if(dir>0) {
+ /* reset for forward iteration */
+ csc->index=csc->cpLimit;
+ csc->dir=dir;
+ } else {
+ /* continue current iteration direction */
+ dir=csc->dir;
+ }
+
+ if(dir<0) {
+ if(csc->startindex) {
+ U8_PREV((const uint8_t *)csc->p, csc->start, csc->index, c);
+ return c;
+ }
+ } else {
+ if(csc->indexlimit) {
+ U8_NEXT((const uint8_t *)csc->p, csc->index, csc->limit, c);
+ return c;
+ }
+ }
+ return U_SENTINEL;
+}
+
+typedef int32_t U_CALLCONV
+UCaseMapFull(const UCaseProps *csp, UChar32 c,
+ UCaseContextIterator *iter, void *context,
+ const UChar **pString,
+ const char *locale, int32_t *locCache);
+
+/*
+ * Case-maps [srcStart..srcLimit[ but takes
+ * context [0..srcLength[ into account.
+ */
+static int32_t
+_caseMap(const UCaseMap *csm, UCaseMapFull *map,
+ uint8_t *dest, int32_t destCapacity,
+ const uint8_t *src, UCaseContext *csc,
+ int32_t srcStart, int32_t srcLimit,
+ UErrorCode *pErrorCode) {
+ const UChar *s;
+ UChar32 c;
+ int32_t srcIndex, destIndex;
+ int32_t locCache;
+
+ locCache=csm->locCache;
+
+ /* case mapping loop */
+ srcIndex=srcStart;
+ destIndex=0;
+ while(srcIndexcpStart=srcIndex;
+ U8_NEXT(src, srcIndex, srcLimit, c);
+ csc->cpLimit=srcIndex;
+ c=map(csm->csp, c, utf8_caseContextIterator, csc, &s, csm->locale, &locCache);
+ destIndex=appendResult(dest, destIndex, destCapacity, c, s);
+ }
+
+ if(destIndex>destCapacity) {
+ *pErrorCode=U_BUFFER_OVERFLOW_ERROR;
+ }
+ return destIndex;
+}
+
+/*
+ * Implement argument checking and buffer handling
+ * for string case mapping as a common function.
+ */
+enum {
+ TO_LOWER,
+ TO_UPPER,
+ TO_TITLE,
+ FOLD_CASE
+};
+
+/* common internal function for public API functions */
+
+static int32_t
+caseMap(const UCaseMap *csm,
+ uint8_t *dest, int32_t destCapacity,
+ const uint8_t *src, int32_t srcLength,
+ int32_t toWhichCase,
+ UErrorCode *pErrorCode) {
+ UCaseContext csc={ NULL };
+ int32_t destLength;
+
+ /* check argument values */
+ if(U_FAILURE(*pErrorCode)) {
+ return 0;
+ }
+ if( destCapacity<0 ||
+ (dest==NULL && destCapacity>0) ||
+ src==NULL ||
+ srcLength<-1
+ ) {
+ *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR;
+ return 0;
+ }
+
+ /* get the string length */
+ if(srcLength==-1) {
+ srcLength=uprv_strlen((const char *)src);
+ }
+
+ /* check for overlapping source and destination */
+ if( dest!=NULL &&
+ ((src>=dest && src<(dest+destCapacity)) ||
+ (dest>=src && dest<(src+srcLength)))
+ ) {
+ *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR;
+ return 0;
+ }
+
+ destLength=0;
+
+ csc.p=(void *)src;
+ csc.limit=srcLength;
+
+ if(toWhichCase==TO_LOWER) {
+ destLength=_caseMap(csm, ucase_toFullLower,
+ dest, destCapacity,
+ src, &csc,
+ 0, srcLength,
+ pErrorCode);
+ } else /* if(toWhichCase==TO_UPPER) */ {
+ destLength=_caseMap(csm, ucase_toFullUpper,
+ dest, destCapacity,
+ src, &csc,
+ 0, srcLength,
+ pErrorCode);
+ }
+
+ return u_terminateChars((char *)dest, destCapacity, destLength, pErrorCode);
+}
+
+/* public API functions */
+
+U_DRAFT int32_t U_EXPORT2
+ucasemap_utf8ToLower(const UCaseMap *csm,
+ char *dest, int32_t destCapacity,
+ const char *src, int32_t srcLength,
+ UErrorCode *pErrorCode) {
+ return caseMap(csm,
+ (uint8_t *)dest, destCapacity,
+ (const uint8_t *)src, srcLength,
+ TO_LOWER, pErrorCode);
+}
+
+U_DRAFT int32_t U_EXPORT2
+ucasemap_utf8ToUpper(const UCaseMap *csm,
+ char *dest, int32_t destCapacity,
+ const char *src, int32_t srcLength,
+ UErrorCode *pErrorCode) {
+ return caseMap(csm,
+ (uint8_t *)dest, destCapacity,
+ (const uint8_t *)src, srcLength,
+ TO_UPPER, pErrorCode);
+}
diff --git a/icuSources/common/uchar.c b/icuSources/common/uchar.c
index 29c288aa..718e87a4 100644
--- a/icuSources/common/uchar.c
+++ b/icuSources/common/uchar.c
@@ -1,6 +1,6 @@
/*
********************************************************************************
-* Copyright (C) 1996-2004, International Business Machines
+* Copyright (C) 1996-2006, International Business Machines
* Corporation and others. All Rights Reserved.
********************************************************************************
*
@@ -35,6 +35,15 @@
/* dynamically loaded Unicode character properties -------------------------- */
+#define UCHAR_HARDCODE_DATA 1
+
+#if UCHAR_HARDCODE_DATA
+
+/* uchar_props_data.c is machine-generated by genprops --csource */
+#include "uchar_props_data.c"
+
+#else
+
/*
* loaded uprops.dat -
* for a description of the file format, see icu/source/tools/genprops/store.c
@@ -49,8 +58,7 @@ static uint8_t formatVersion[4]={ 0, 0, 0, 0 };
static UVersionInfo dataVersion={ 0, 0, 0, 0 };
static UTrie propsTrie={ 0 }, propsVectorsTrie={ 0 };
-static const uint32_t *pData32=NULL, *props32Table=NULL, *exceptionsTable=NULL, *propsVectors=NULL;
-static const UChar *ucharsTable=NULL;
+static const uint32_t *pData32=NULL, *propsVectors=NULL;
static int32_t countPropsVectors=0, propsVectorsColumns=0;
static int8_t havePropsData=0; /* == 0 -> Data has not been loaded.
@@ -61,16 +69,6 @@ static int8_t havePropsData=0; /* == 0 -> Data has not been loaded.
/* index values loaded from uprops.dat */
static int32_t indexes[UPROPS_INDEX_COUNT];
-/* if bit 15 is set, then the folding offset is in bits 14..0 of the 16-bit trie result */
-static int32_t U_CALLCONV
-getFoldingPropsOffset(uint32_t data) {
- if(data&0x8000) {
- return (int32_t)(data&0x7fff);
- } else {
- return 0;
- }
-}
-
static UBool U_CALLCONV
isAcceptable(void *context,
const char *type, const char *name,
@@ -83,7 +81,7 @@ isAcceptable(void *context,
pInfo->dataFormat[1]==0x50 &&
pInfo->dataFormat[2]==0x72 &&
pInfo->dataFormat[3]==0x6f &&
- pInfo->formatVersion[0]==3 &&
+ pInfo->formatVersion[0]==4 &&
pInfo->formatVersion[2]==UTRIE_SHIFT &&
pInfo->formatVersion[3]==UTRIE_INDEX_SHIFT
) {
@@ -102,11 +100,9 @@ static UBool U_CALLCONV uchar_cleanup(void)
propsData=NULL;
}
pData32=NULL;
- props32Table=NULL;
- exceptionsTable=NULL;
- ucharsTable=NULL;
propsVectors=NULL;
countPropsVectors=0;
+ uprv_memset(dataVersion, 0, U_MAX_VERSION_LENGTH);
dataErrorCode=U_ZERO_ERROR;
havePropsData=0;
@@ -139,23 +135,27 @@ _openProps(UCharProps *ucp, UErrorCode *pErrorCode) {
if(U_FAILURE(*pErrorCode)) {
return;
}
- ucp->propsTrie.getFoldingOffset=getFoldingPropsOffset;
- /* unserialize the properties vectors trie, if any */
- if( p[UPROPS_ADDITIONAL_TRIE_INDEX]!=0 &&
- p[UPROPS_ADDITIONAL_VECTORS_INDEX]!=0
- ) {
- length=(int32_t)(p[UPROPS_ADDITIONAL_VECTORS_INDEX]-p[UPROPS_ADDITIONAL_TRIE_INDEX])*4;
+ /* unserialize the properties vectors trie */
+ length=(int32_t)(p[UPROPS_ADDITIONAL_VECTORS_INDEX]-p[UPROPS_ADDITIONAL_TRIE_INDEX])*4;
+ if(length>0) {
length=utrie_unserialize(&ucp->propsVectorsTrie, (const uint8_t *)(p+p[UPROPS_ADDITIONAL_TRIE_INDEX]), length, pErrorCode);
- if(U_FAILURE(*pErrorCode)) {
- uprv_memset(&ucp->propsVectorsTrie, 0, sizeof(ucp->propsVectorsTrie));
- } else {
- ucp->propsVectorsTrie.getFoldingOffset=getFoldingPropsOffset;
- }
+ }
+ if(length<=0 || U_FAILURE(*pErrorCode)) {
+ /*
+ * length==0:
+ * Allow the properties vectors trie to be missing -
+ * also requires propsVectorsColumns=indexes[UPROPS_ADDITIONAL_VECTORS_COLUMNS_INDEX]
+ * to be zero so that this trie is never accessed.
+ */
+ uprv_memset(&ucp->propsVectorsTrie, 0, sizeof(ucp->propsVectorsTrie));
}
}
-U_CFUNC int8_t
+#endif
+
+#if !UCHAR_HARDCODE_DATA
+static int8_t
uprv_loadPropsData(UErrorCode *pErrorCode) {
/* load Unicode character properties data from file if necessary */
@@ -166,7 +166,6 @@ uprv_loadPropsData(UErrorCode *pErrorCode) {
*/
if(havePropsData==0) {
UCharProps ucp={ NULL };
- UCaseProps *csp;
if(U_FAILURE(*pErrorCode)) {
return havePropsData;
@@ -185,14 +184,10 @@ uprv_loadPropsData(UErrorCode *pErrorCode) {
ucp.pData32=NULL;
uprv_memcpy(&propsTrie, &ucp.propsTrie, sizeof(propsTrie));
uprv_memcpy(&propsVectorsTrie, &ucp.propsVectorsTrie, sizeof(propsVectorsTrie));
- csp=NULL;
}
/* initialize some variables */
uprv_memcpy(indexes, pData32, sizeof(indexes));
- props32Table=pData32+indexes[UPROPS_PROPS32_INDEX];
- exceptionsTable=pData32+indexes[UPROPS_EXCEPTIONS_INDEX];
- ucharsTable=(const UChar *)(pData32+indexes[UPROPS_EXCEPTIONS_TOP_INDEX]);
/* additional properties */
if(indexes[UPROPS_ADDITIONAL_VECTORS_INDEX]!=0) {
@@ -216,7 +211,6 @@ uprv_loadPropsData(UErrorCode *pErrorCode) {
return havePropsData;
}
-
static int8_t
loadPropsData(void) {
UErrorCode errorCode = U_ZERO_ERROR;
@@ -224,146 +218,20 @@ loadPropsData(void) {
return retVal;
}
+#endif
-/* Unicode properties data swapping ----------------------------------------- */
-
-U_CAPI int32_t U_EXPORT2
-uprops_swap(const UDataSwapper *ds,
- const void *inData, int32_t length, void *outData,
- UErrorCode *pErrorCode) {
- const UDataInfo *pInfo;
- int32_t headerSize, i;
-
- int32_t dataIndexes[UPROPS_INDEX_COUNT];
- const int32_t *inData32;
-
- /* udata_swapDataHeader checks the arguments */
- headerSize=udata_swapDataHeader(ds, inData, length, outData, pErrorCode);
- if(pErrorCode==NULL || U_FAILURE(*pErrorCode)) {
- return 0;
- }
-
- /* check data format and format version */
- pInfo=(const UDataInfo *)((const char *)inData+4);
- if(!(
- pInfo->dataFormat[0]==0x55 && /* dataFormat="UPro" */
- pInfo->dataFormat[1]==0x50 &&
- pInfo->dataFormat[2]==0x72 &&
- pInfo->dataFormat[3]==0x6f &&
- pInfo->formatVersion[0]==3 &&
- pInfo->formatVersion[2]==UTRIE_SHIFT &&
- pInfo->formatVersion[3]==UTRIE_INDEX_SHIFT
- )) {
- udata_printError(ds, "uprops_swap(): data format %02x.%02x.%02x.%02x (format version %02x) is not a Unicode properties file\n",
- pInfo->dataFormat[0], pInfo->dataFormat[1],
- pInfo->dataFormat[2], pInfo->dataFormat[3],
- pInfo->formatVersion[0]);
- *pErrorCode=U_UNSUPPORTED_ERROR;
- return 0;
- }
-
- /* the properties file must contain at least the indexes array */
- if(length>=0 && (length-headerSize)=0) {
- int32_t *outData32;
-
- if((length-headerSize)<(4*dataIndexes[UPROPS_RESERVED_INDEX])) {
- udata_printError(ds, "uprops_swap(): too few bytes (%d after header) for a Unicode properties file\n",
- length-headerSize);
- *pErrorCode=U_INDEX_OUTOFBOUNDS_ERROR;
- return 0;
- }
-
- outData32=(int32_t *)((char *)outData+headerSize);
-
- /* copy everything for inaccessible data (padding) */
- if(inData32!=outData32) {
- uprv_memcpy(outData32, inData32, 4*dataIndexes[UPROPS_RESERVED_INDEX]);
- }
-
- /* swap the indexes[16] */
- ds->swapArray32(ds, inData32, 4*UPROPS_INDEX_COUNT, outData32, pErrorCode);
-
- /*
- * swap the main properties UTrie
- * PT serialized properties trie, see utrie.h (byte size: 4*(i0-16))
- */
- utrie_swap(ds,
- inData32+UPROPS_INDEX_COUNT,
- 4*(dataIndexes[UPROPS_PROPS32_INDEX]-UPROPS_INDEX_COUNT),
- outData32+UPROPS_INDEX_COUNT,
- pErrorCode);
-
- /*
- * swap the properties and exceptions words
- * P const uint32_t props32[i1-i0];
- * E const uint32_t exceptions[i2-i1];
- */
- ds->swapArray32(ds,
- inData32+dataIndexes[UPROPS_PROPS32_INDEX],
- 4*(dataIndexes[UPROPS_EXCEPTIONS_TOP_INDEX]-dataIndexes[UPROPS_PROPS32_INDEX]),
- outData32+dataIndexes[UPROPS_PROPS32_INDEX],
- pErrorCode);
-
- /*
- * swap the UChars
- * U const UChar uchars[2*(i3-i2)];
- */
- ds->swapArray16(ds,
- inData32+dataIndexes[UPROPS_EXCEPTIONS_TOP_INDEX],
- 4*(dataIndexes[UPROPS_ADDITIONAL_TRIE_INDEX]-dataIndexes[UPROPS_EXCEPTIONS_TOP_INDEX]),
- outData32+dataIndexes[UPROPS_EXCEPTIONS_TOP_INDEX],
- pErrorCode);
-
- /*
- * swap the additional UTrie
- * i3 additionalTrieIndex; -- 32-bit unit index to the additional trie for more properties
- */
- utrie_swap(ds,
- inData32+dataIndexes[UPROPS_ADDITIONAL_TRIE_INDEX],
- 4*(dataIndexes[UPROPS_ADDITIONAL_VECTORS_INDEX]-dataIndexes[UPROPS_ADDITIONAL_TRIE_INDEX]),
- outData32+dataIndexes[UPROPS_ADDITIONAL_TRIE_INDEX],
- pErrorCode);
+/* constants and macros for access to the data ------------------------------ */
- /*
- * swap the properties vectors
- * PV const uint32_t propsVectors[(i6-i4)/i5][i5]==uint32_t propsVectors[i6-i4];
- */
- ds->swapArray32(ds,
- inData32+dataIndexes[UPROPS_ADDITIONAL_VECTORS_INDEX],
- 4*(dataIndexes[UPROPS_RESERVED_INDEX]-dataIndexes[UPROPS_ADDITIONAL_VECTORS_INDEX]),
- outData32+dataIndexes[UPROPS_ADDITIONAL_VECTORS_INDEX],
- pErrorCode);
- }
+/* getting a uint32_t properties word from the data */
+#if UCHAR_HARDCODE_DATA
- /* i6 reservedItemIndex; -- 32-bit unit index to the top of the properties vectors table */
- return headerSize+4*dataIndexes[UPROPS_RESERVED_INDEX];
-}
+#define GET_PROPS(c, result) UTRIE_GET16(&propsTrie, c, result);
-/* constants and macros for access to the data ------------------------------ */
+#else
-/* getting a uint32_t properties word from the data */
#define HAVE_DATA (havePropsData>0 || loadPropsData()>0)
-#define VALIDATE(c) (((uint32_t)(c))<=0x10ffff && HAVE_DATA)
#define GET_PROPS_UNSAFE(c, result) \
- UTRIE_GET16(&propsTrie, c, result); \
- (result)=props32Table[(result)]
+ UTRIE_GET16(&propsTrie, c, result);
#define GET_PROPS(c, result) \
if(HAVE_DATA) { \
GET_PROPS_UNSAFE(c, result); \
@@ -371,44 +239,14 @@ uprops_swap(const UDataSwapper *ds,
(result)=0; \
}
-/* finding an exception value */
-#define HAVE_EXCEPTION_VALUE(flags, index) ((flags)&(1UL<<(index)))
-
-/* number of bits in an 8-bit integer value */
-#define EXC_GROUP 8
-static const uint8_t flagsOffset[256]={
- 0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4,
- 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,
- 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,
- 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
- 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,
- 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
- 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
- 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,
- 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,
- 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
- 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
- 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,
- 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
- 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,
- 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,
- 4, 5, 5, 6, 5, 6, 6, 7, 5, 6, 6, 7, 6, 7, 7, 8
-};
-
-#define ADD_EXCEPTION_OFFSET(flags, index, offset) { \
- if((index)>=EXC_GROUP) { \
- (offset)+=flagsOffset[(flags)&((1<>=EXC_GROUP; \
- (index)-=EXC_GROUP; \
- } \
- (offset)+=flagsOffset[(flags)&((1<<(index))-1)]; \
-}
+#endif
U_CFUNC UBool
uprv_haveProperties(UErrorCode *pErrorCode) {
if(U_FAILURE(*pErrorCode)) {
return FALSE;
}
+#if !UCHAR_HARDCODE_DATA
if(havePropsData==0) {
uprv_loadPropsData(pErrorCode);
}
@@ -416,6 +254,7 @@ uprv_haveProperties(UErrorCode *pErrorCode) {
*pErrorCode=dataErrorCode;
return FALSE;
}
+#endif
return TRUE;
}
@@ -437,8 +276,7 @@ struct _EnumTypeCallback {
static uint32_t U_CALLCONV
_enumTypeValue(const void *context, uint32_t value) {
- /* access the general category from the 32-bit properties, and those from the 16-bit trie value */
- return GET_CATEGORY(props32Table[value]);
+ return GET_CATEGORY(value);
}
static UBool U_CALLCONV
@@ -453,7 +291,11 @@ U_CAPI void U_EXPORT2
u_enumCharTypes(UCharEnumTypeRange *enumRange, const void *context) {
struct _EnumTypeCallback callback;
- if(enumRange==NULL || !HAVE_DATA) {
+ if(enumRange==NULL
+#if !UCHAR_HARDCODE_DATA
+ || !HAVE_DATA
+#endif
+ ) {
return;
}
@@ -523,7 +365,7 @@ u_isUAlphabetic(UChar32 c) {
return (u_getUnicodeProperties(c, 1)&U_MASK(UPROPS_ALPHABETIC))!=0;
}
-/* Checks if ch is a letter or a decimal digit */
+/* Checks if c is a letter or a decimal digit */
U_CAPI UBool U_EXPORT2
u_isalnum(UChar32 c) {
uint32_t props;
@@ -531,6 +373,15 @@ u_isalnum(UChar32 c) {
return (UBool)((CAT_MASK(props)&(U_GC_L_MASK|U_GC_ND_MASK))!=0);
}
+/**
+ * Checks if c is alphabetic, or a decimal digit; implements UCHAR_POSIX_ALNUM.
+ * @internal
+ */
+U_CFUNC UBool
+u_isalnumPOSIX(UChar32 c) {
+ return (UBool)(u_isUAlphabetic(c) || u_isdigit(c));
+}
+
/* Checks if ch is a unicode character with assigned character type.*/
U_CAPI UBool U_EXPORT2
u_isdefined(UChar32 c) {
@@ -596,8 +447,10 @@ u_isblank(UChar32 c) {
if((uint32_t)c<=0x9f) {
return c==9 || c==0x20; /* TAB or SPACE */
} else {
- /* White_Space but not LS (Zl) or PS (Zp) */
- return u_isUWhiteSpace(c) && ((c&0xfffffffe)!=0x2028);
+ /* Zs */
+ uint32_t props;
+ GET_PROPS(c, props);
+ return (UBool)(GET_CATEGORY(props)==U_SPACE_SEPARATOR);
}
}
@@ -615,6 +468,22 @@ u_isprint(UChar32 c) {
return (UBool)((CAT_MASK(props)&U_GC_C_MASK)==0);
}
+/**
+ * Checks if c is in \p{graph}\p{blank} - \p{cntrl}.
+ * Implements UCHAR_POSIX_PRINT.
+ * @internal
+ */
+U_CFUNC UBool
+u_isprintPOSIX(UChar32 c) {
+ uint32_t props;
+ GET_PROPS(c, props);
+ /*
+ * The only cntrl character in graph+blank is TAB (in blank).
+ * Here we implement (blank-TAB)=Zs instead of calling u_isblank().
+ */
+ return (UBool)((GET_CATEGORY(props)==U_SPACE_SEPARATOR) || u_isgraphPOSIX(c));
+}
+
U_CAPI UBool U_EXPORT2
u_isgraph(UChar32 c) {
uint32_t props;
@@ -625,6 +494,24 @@ u_isgraph(UChar32 c) {
==0);
}
+/**
+ * Checks if c is in
+ * [^\p{space}\p{gc=Control}\p{gc=Surrogate}\p{gc=Unassigned}]
+ * with space=\p{Whitespace} and Control=Cc.
+ * Implements UCHAR_POSIX_GRAPH.
+ * @internal
+ */
+U_CFUNC UBool
+u_isgraphPOSIX(UChar32 c) {
+ uint32_t props;
+ GET_PROPS(c, props);
+ /* \p{space}\p{gc=Control} == \p{gc=Z}\p{Control} */
+ /* comparing ==0 returns FALSE for the categories mentioned */
+ return (UBool)((CAT_MASK(props)&
+ (U_GC_CC_MASK|U_GC_CS_MASK|U_GC_CN_MASK|U_GC_Z_MASK))
+ ==0);
+}
+
U_CAPI UBool U_EXPORT2
u_ispunct(UChar32 c) {
uint32_t props;
@@ -695,155 +582,87 @@ u_isJavaIDPart(UChar32 c) {
U_CAPI int32_t U_EXPORT2
u_charDigitValue(UChar32 c) {
- uint32_t props, numericType;
+ uint32_t props;
GET_PROPS(c, props);
- numericType=GET_NUMERIC_TYPE(props);
- if(numericType==1) {
- if(!PROPS_VALUE_IS_EXCEPTION(props)) {
- return GET_SIGNED_VALUE(props);
- } else {
- const uint32_t *pe=GET_EXCEPTIONS(props);
- uint32_t firstExceptionValue=*pe;
- if(HAVE_EXCEPTION_VALUE(firstExceptionValue, EXC_NUMERIC_VALUE)) {
- int i=EXC_NUMERIC_VALUE;
- ++pe;
- ADD_EXCEPTION_OFFSET(firstExceptionValue, i, pe);
- return (int32_t)*pe;
- }
- }
+ if(GET_NUMERIC_TYPE(props)==1) {
+ return GET_NUMERIC_VALUE(props);
+ } else {
+ return -1;
}
-
- return -1;
}
U_CAPI double U_EXPORT2
u_getNumericValue(UChar32 c) {
- uint32_t props, numericType;
+ uint32_t props, numericType, numericValue;
GET_PROPS(c, props);
numericType=GET_NUMERIC_TYPE(props);
- if(numericType==0 || numericType>=(int32_t)U_NT_COUNT) {
+ if(numericType==0 || numericType>=UPROPS_NT_COUNT) {
return U_NO_NUMERIC_VALUE;
- } else {
- if(!PROPS_VALUE_IS_EXCEPTION(props)) {
- return GET_SIGNED_VALUE(props);
- } else {
- const uint32_t *pe;
- uint32_t firstExceptionValue;
-
- double numValue;
- uint32_t denominator;
-
- pe=GET_EXCEPTIONS(props);
- firstExceptionValue=*pe++;
-
- if(HAVE_EXCEPTION_VALUE(firstExceptionValue, EXC_NUMERIC_VALUE)) {
- uint32_t flags=firstExceptionValue;
- int i=EXC_NUMERIC_VALUE;
- const uint32_t *p=pe;
- int32_t numerator;
-
- ADD_EXCEPTION_OFFSET(flags, i, p);
- numerator=(int32_t)*p;
-
- /*
- * There are special values for huge numbers that are powers of ten.
- * genprops/store.c documents:
- * if numericValue=0x7fffff00+x then numericValue=10^x
- */
- if(numerator<0x7fffff00) {
- numValue=(double)numerator;
- } else {
- numerator&=0xff;
-
- /* 10^x without math.h */
- numValue=1.;
- while(numerator>=4) {
- numValue*=10000.;
- numerator-=4;
- }
- switch(numerator) {
- case 3:
- numValue*=1000.;
- break;
- case 2:
- numValue*=100.;
- break;
- case 1:
- numValue*=10.;
- break;
- case 0:
- default:
- break;
- }
- }
- } else {
- numValue=0.;
- }
- if(HAVE_EXCEPTION_VALUE(firstExceptionValue, EXC_DENOMINATOR_VALUE)) {
- uint32_t flags=firstExceptionValue;
- int i=EXC_DENOMINATOR_VALUE;
- const uint32_t *p=pe;
- ADD_EXCEPTION_OFFSET(flags, i, p);
- denominator=*p;
- } else {
- denominator=0;
- }
-
- switch(firstExceptionValue&((1UL<0) */
- default:
- return U_NO_NUMERIC_VALUE;
- }
- }
}
-}
-/* Gets the character's linguistic directionality.*/
-U_CAPI UCharDirection U_EXPORT2
-u_charDirection(UChar32 c) {
- uint32_t props;
- GET_PROPS(c, props);
- return (UCharDirection)GET_BIDI_CLASS(props);
-}
+ numericValue=GET_NUMERIC_VALUE(props);
-U_CAPI UBool U_EXPORT2
-u_isMirrored(UChar32 c) {
- uint32_t props;
- GET_PROPS(c, props);
- return (UBool)(props&(1UL<>UPROPS_FRACTION_NUM_SHIFT;
+ denominator=(numericValue&UPROPS_FRACTION_DEN_MASK)+UPROPS_FRACTION_DEN_OFFSET;
+
+ if(numerator==0) {
+ numerator=-1;
+ }
+ return (double)numerator/(double)denominator;
+ } else /* numericType==UPROPS_NT_LARGE */ {
+ /* large value with exponent */
+ double numValue;
+ int32_t mant, exp;
+
+ mant=(int32_t)numericValue>>UPROPS_LARGE_MANT_SHIFT;
+ exp=(int32_t)numericValue&UPROPS_LARGE_EXP_MASK;
+ if(mant==0) {
+ mant=1;
+ exp+=UPROPS_LARGE_EXP_OFFSET_EXTRA;
+ } else if(mant>9) {
+ return U_NO_NUMERIC_VALUE; /* reserved mantissa value */
} else {
- return c;
+ exp+=UPROPS_LARGE_EXP_OFFSET;
}
+
+ numValue=mant;
+
+ /* multiply by 10^exp without math.h */
+ while(exp>=4) {
+ numValue*=10000.;
+ exp-=4;
+ }
+ switch(exp) {
+ case 3:
+ numValue*=1000.;
+ break;
+ case 2:
+ numValue*=100.;
+ break;
+ case 1:
+ numValue*=10.;
+ break;
+ case 0:
+ default:
+ break;
+ }
+
+ return numValue;
}
}
+/* ICU 3.4: bidi/shaping properties moved to ubidi_props.c */
+
/* ICU 2.1: u_getCombiningClass() moved to unorm.cpp */
U_CAPI int32_t U_EXPORT2
@@ -885,11 +704,7 @@ u_forDigit(int32_t digit, int8_t radix) {
U_CAPI void U_EXPORT2
u_getUnicodeVersion(UVersionInfo versionArray) {
if(versionArray!=NULL) {
- if(HAVE_DATA) {
- uprv_memcpy(versionArray, dataVersion, U_MAX_VERSION_LENGTH);
- } else {
- uprv_memset(versionArray, 0, U_MAX_VERSION_LENGTH);
- }
+ uprv_memcpy(versionArray, dataVersion, U_MAX_VERSION_LENGTH);
}
}
@@ -901,8 +716,10 @@ u_getUnicodeProperties(UChar32 c, int32_t column) {
uint32_t props;
GET_PROPS(c, props);
return props;
- } else if( !HAVE_DATA || countPropsVectors==0 ||
- (uint32_t)c>0x10ffff ||
+ } else if(
+#if !UCHAR_HARDCODE_DATA
+ !HAVE_DATA || countPropsVectors==0 ||
+#endif
column<0 || column>=propsVectorsColumns
) {
return 0;
@@ -914,7 +731,9 @@ u_getUnicodeProperties(UChar32 c, int32_t column) {
U_CFUNC int32_t
uprv_getMaxValues(int32_t column) {
+#if !UCHAR_HARDCODE_DATA
if(HAVE_DATA) {
+#endif
switch(column) {
case 0:
return indexes[UPROPS_MAX_VALUES_INDEX];
@@ -923,9 +742,11 @@ uprv_getMaxValues(int32_t column) {
default:
return 0;
}
+#if !UCHAR_HARDCODE_DATA
} else {
return 0;
}
+#endif
}
/*
@@ -978,11 +799,11 @@ u_charAge(UChar32 c, UVersionInfo versionArray) {
U_CAPI UScriptCode U_EXPORT2
uscript_getScript(UChar32 c, UErrorCode *pErrorCode) {
if(pErrorCode==NULL || U_FAILURE(*pErrorCode)) {
- return 0;
+ return USCRIPT_INVALID_CODE;
}
if((uint32_t)c>0x10ffff) {
*pErrorCode=U_ILLEGAL_ARGUMENT_ERROR;
- return 0;
+ return USCRIPT_INVALID_CODE;
}
return (UScriptCode)(u_getUnicodeProperties(c, 0)&UPROPS_SCRIPT_MASK);
@@ -997,7 +818,7 @@ ublock_getCode(UChar32 c) {
/* for Hangul_Syllable_Type */
U_CAPI void U_EXPORT2
-uhst_addPropertyStarts(USetAdder *sa, UErrorCode *pErrorCode) {
+uhst_addPropertyStarts(const USetAdder *sa, UErrorCode *pErrorCode) {
UChar32 c;
int32_t value, value2;
@@ -1005,10 +826,12 @@ uhst_addPropertyStarts(USetAdder *sa, UErrorCode *pErrorCode) {
return;
}
+#if !UCHAR_HARDCODE_DATA
if(!HAVE_DATA) {
*pErrorCode=dataErrorCode;
return;
}
+#endif
/* add code points with hardcoded properties, plus the ones following them */
@@ -1061,7 +884,7 @@ uhst_addPropertyStarts(USetAdder *sa, UErrorCode *pErrorCode) {
static UBool U_CALLCONV
_enumPropertyStartsRange(const void *context, UChar32 start, UChar32 limit, uint32_t value) {
/* add the start code point to the USet */
- USetAdder *sa=(USetAdder *)context;
+ const USetAdder *sa=(const USetAdder *)context;
sa->add(sa->set, start);
return TRUE;
}
@@ -1069,25 +892,28 @@ _enumPropertyStartsRange(const void *context, UChar32 start, UChar32 limit, uint
#define USET_ADD_CP_AND_NEXT(sa, cp) sa->add(sa->set, cp); sa->add(sa->set, cp+1)
U_CAPI void U_EXPORT2
-uchar_addPropertyStarts(USetAdder *sa, UErrorCode *pErrorCode) {
+uchar_addPropertyStarts(const USetAdder *sa, UErrorCode *pErrorCode) {
if(U_FAILURE(*pErrorCode)) {
return;
}
+#if !UCHAR_HARDCODE_DATA
if(!HAVE_DATA) {
*pErrorCode=dataErrorCode;
return;
}
+#endif
- /* add the start code point of each same-value range of each trie */
+ /* add the start code point of each same-value range of the main trie */
utrie_enum(&propsTrie, NULL, _enumPropertyStartsRange, sa);
- utrie_enum(&propsVectorsTrie, NULL, _enumPropertyStartsRange, sa);
/* add code points with hardcoded properties, plus the ones following them */
+ /* add for u_isblank() */
+ USET_ADD_CP_AND_NEXT(sa, TAB);
+
/* add for IS_THAT_CONTROL_SPACE() */
- sa->add(sa->set, TAB); /* range TAB..CR */
- sa->add(sa->set, CR+1);
+ sa->add(sa->set, CR+1); /* range TAB..CR */
sa->add(sa->set, 0x1c);
sa->add(sa->set, 0x1f+1);
USET_ADD_CP_AND_NEXT(sa, NL);
@@ -1105,23 +931,21 @@ uchar_addPropertyStarts(USetAdder *sa, UErrorCode *pErrorCode) {
USET_ADD_CP_AND_NEXT(sa, FIGURESP);
USET_ADD_CP_AND_NEXT(sa, NNBSP);
- /* add for u_charDigitValue() */
- USET_ADD_CP_AND_NEXT(sa, 0x3007);
- USET_ADD_CP_AND_NEXT(sa, 0x4e00);
- USET_ADD_CP_AND_NEXT(sa, 0x4e8c);
- USET_ADD_CP_AND_NEXT(sa, 0x4e09);
- USET_ADD_CP_AND_NEXT(sa, 0x56db);
- USET_ADD_CP_AND_NEXT(sa, 0x4e94);
- USET_ADD_CP_AND_NEXT(sa, 0x516d);
- USET_ADD_CP_AND_NEXT(sa, 0x4e03);
- USET_ADD_CP_AND_NEXT(sa, 0x516b);
- USET_ADD_CP_AND_NEXT(sa, 0x4e5d);
-
/* add for u_digit() */
sa->add(sa->set, U_a);
sa->add(sa->set, U_z+1);
sa->add(sa->set, U_A);
sa->add(sa->set, U_Z+1);
+ sa->add(sa->set, U_FW_a);
+ sa->add(sa->set, U_FW_z+1);
+ sa->add(sa->set, U_FW_A);
+ sa->add(sa->set, U_FW_Z+1);
+
+ /* add for u_isxdigit() */
+ sa->add(sa->set, U_f+1);
+ sa->add(sa->set, U_F+1);
+ sa->add(sa->set, U_FW_f+1);
+ sa->add(sa->set, U_FW_F+1);
/* add for UCHAR_DEFAULT_IGNORABLE_CODE_POINT what was not added above */
sa->add(sa->set, WJ); /* range WJ..NOMDIG */
@@ -1132,8 +956,24 @@ uchar_addPropertyStarts(USetAdder *sa, UErrorCode *pErrorCode) {
/* add for UCHAR_GRAPHEME_BASE and others */
USET_ADD_CP_AND_NEXT(sa, CGJ);
+}
- /* add for UCHAR_JOINING_TYPE */
- sa->add(sa->set, ZWNJ); /* range ZWNJ..ZWJ */
- sa->add(sa->set, ZWJ+1);
+U_CAPI void U_EXPORT2
+upropsvec_addPropertyStarts(const USetAdder *sa, UErrorCode *pErrorCode) {
+ if(U_FAILURE(*pErrorCode)) {
+ return;
+ }
+
+#if !UCHAR_HARDCODE_DATA
+ if(!HAVE_DATA) {
+ *pErrorCode=dataErrorCode;
+ return;
+ }
+#endif
+
+ /* add the start code point of each same-value range of the properties vectors trie */
+ if(propsVectorsColumns>0) {
+ /* if propsVectorsColumns==0 then the properties vectors trie may not be there at all */
+ utrie_enum(&propsVectorsTrie, NULL, _enumPropertyStartsRange, sa);
+ }
}
diff --git a/icuSources/common/uchar_props_data.c b/icuSources/common/uchar_props_data.c
new file mode 100644
index 00000000..3dabf335
--- /dev/null
+++ b/icuSources/common/uchar_props_data.c
@@ -0,0 +1,3772 @@
+/*
+ * Copyright (C) 1999-2007, International Business Machines
+ * Corporation and others. All Rights Reserved.
+ *
+ * file name: uchar_props_data.c
+ *
+ * machine-generated on: 2006-06-13
+ * machine-generated on: 2007-03-29 U_DARWIN
+ */
+
+static const UVersionInfo formatVersion={4,0,5,2};
+
+static const UVersionInfo dataVersion={5,0,0,0};
+
+#ifndef U_DARWIN
+static const uint16_t propsTrie_index[13440]={
+#else /* U_DARWIN */
+static const uint16_t propsTrie_index[13612]={
+#endif /* U_DARWIN */
+0x2a8,0x2b0,0x2b8,0x2c0,0x2c8,0x2d0,0x2d8,0x2e0,0x2e8,0x2ea,0x2f0,0x2f3,0x2fb,0x303,0x30b,0x313,
+0x2e8,0x319,0x321,0x325,0x328,0x32e,0x336,0x33e,0x346,0x346,0x346,0x34a,0x352,0x35a,0x35f,0x365,
+0x36d,0x371,0x325,0x2e8,0x379,0x2e8,0x381,0x2e8,0x385,0x38a,0x38f,0x397,0x39d,0x3a2,0x3aa,0x3b0,
+0x3b8,0x3c0,0x3c8,0x3d0,0x3d5,0x3d5,0x3d8,0x3e0,0x3e8,0x3ed,0x3f3,0x3f8,0x3d5,0x400,0x408,0x40e,
+0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x416,0x418,0x420,0x428,0x430,0x436,0x43e,0x446,
+0x44e,0x454,0x45c,0x464,0x46c,0x472,0x47a,0x482,0x430,0x48a,0x492,0x49a,0x4a2,0x4aa,0x4b2,0x4b9,
+0x4c1,0x4c7,0x4cf,0x4d7,0x4df,0x4e5,0x4ed,0x4f5,0x4df,0x4fd,0x505,0x4d7,0x50d,0x514,0x51c,0x524,
+0x52c,0x530,0x538,0x2a0,0x540,0x548,0x550,0x2a0,0x558,0x560,0x568,0x56e,0x576,0x57d,0x585,0x2a0,
+0x3d5,0x58d,0x595,0x2a0,0x2a0,0x36d,0x59d,0x5a1,0x3d5,0x3d5,0x5a9,0x3d5,0x3d5,0x5b1,0x3d5,0x5b3,
+0x3d5,0x3d5,0x5bb,0x3d5,0x5c3,0x5c7,0x5cf,0x3d5,0x5d5,0x3d5,0x5db,0x5e3,0x5eb,0x3d5,0x3d5,0x5f3,
+0x52c,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,
+0x3d5,0x3d5,0x3d5,0x5fb,0x603,0x3d5,0x3d5,0x60b,0x613,0x61b,0x623,0x62b,0x3d5,0x633,0x63b,0x643,
+0x64b,0x3d5,0x653,0x655,0x3d5,0x65d,0x2a0,0x2a0,0x665,0x66d,0x675,0x67a,0x3d5,0x682,0x68a,0x692,
+0x69a,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x6a2,0x6a5,0x6ad,0x6b5,0x2a0,0x2a0,0x2a0,0x2a0,
+0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x325,0x6bd,0x6c0,0x6c8,0x6cf,0x6c0,0x6d7,0x6da,
+0x2e8,0x2e8,0x2e8,0x2e8,0x6e2,0x2e8,0x2e8,0x6ea,0x6f2,0x6fa,0x702,0x70a,0x712,0x716,0x71e,0x726,
+0x72e,0x736,0x73e,0x746,0x74e,0x756,0x75c,0x764,0x76c,0x774,0x77c,0x784,0x78c,0x794,0x799,0x79f,
+0x7a4,0x7a4,0x7a4,0x7a4,0x7a4,0x7a4,0x7a4,0x7a4,0x7ac,0x7b4,0x692,0x7b7,0x7bf,0x7c6,0x7cb,0x7d3,
+0x692,0x7db,0x7e3,0x7eb,0x7ee,0x692,0x692,0x7f5,0x692,0x692,0x692,0x692,0x692,0x7fd,0x805,0x807,
+0x692,0x692,0x692,0x80f,0x813,0x81b,0x2a0,0x2a0,0x823,0x829,0x82e,0x836,0x83e,0x844,0x84c,0x853,
+0x692,0x692,0x692,0x692,0x692,0x692,0x692,0x692,0x7a4,0x7a4,0x7a4,0x7a4,0x85b,0x7a4,0x862,0x869,
+0x7a4,0x7a4,0x7a4,0x7a4,0x7a4,0x7a4,0x7a4,0x7a4,0x871,0x879,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,
+0x36d,0x881,0x885,0x88d,0x2e8,0x2e8,0x2e8,0x895,0x325,0x89d,0x3d5,0x8a4,0x8ac,0x8b4,0x8b4,0x2a0,
+0x8bc,0x2a0,0x2a0,0x2a0,0x8c4,0x692,0x692,0x8cb,0x692,0x692,0x692,0x692,0x692,0x692,0x8d3,0x8d9,
+0x8e1,0x8e9,0x52c,0x3d5,0x8f1,0x8f9,0x3d5,0x8fb,0x52b,0x903,0x3d5,0x3d5,0x908,0x655,0x90e,0x661,
+0x916,0x91e,0x925,0x692,0x91e,0x92d,0x692,0x916,0x692,0x692,0x692,0x692,0x692,0x692,0x692,0x692,
+#ifndef U_DARWIN
+0xc64,0x3d5,0x3d5,0x3d5,0xbfc,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,
+#else /* U_DARWIN */
+0xc8f,0x3d5,0x3d5,0x3d5,0xc27,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,
+#endif /* U_DARWIN */
+0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,
+#ifndef U_DARWIN
+0x3d5,0xc6a,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,
+0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0xc84,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,
+#else /* U_DARWIN */
+0x3d5,0xc95,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,
+0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0xcaf,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,
+#endif /* U_DARWIN */
+0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,
+0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,
+0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,
+0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,
+0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,
+0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,
+0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,
+0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,
+#ifndef U_DARWIN
+0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0xbb3,0x692,0x692,
+0xbdc,0x3d5,0xc99,0x3d5,0xc01,0xcde,0xcb1,0xc17,0xc62,0x3d5,0x3d5,0xccd,0x3d5,0x3d5,0x3d5,0x3d5,
+0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0xce6,0x3d5,0xced,0xc07,0x3d5,0x3d5,0x3d5,0x3d5,
+0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0xcb9,0x3d5,0x3d5,0x3d5,0xc1f,0x3d5,
+#else /* U_DARWIN */
+0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0xbcb,0x692,0x692,
+0xc07,0x3d5,0xcc4,0x3d5,0xc2c,0xd09,0xcdc,0xc42,0xc8d,0x3d5,0x3d5,0xcf8,0x3d5,0x3d5,0x3d5,0x3d5,
+0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0xd11,0x3d5,0xd18,0xc32,0x3d5,0x3d5,0x3d5,0x3d5,
+0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0xce4,0x3d5,0x3d5,0x3d5,0xc4a,0x3d5,
+#endif /* U_DARWIN */
+0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,
+#ifndef U_DARWIN
+0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0xc42,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,
+0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0xbe0,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,
+#else /* U_DARWIN */
+0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0xc6d,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,
+0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0xc0b,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,
+#endif /* U_DARWIN */
+0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,
+0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,
+#ifndef U_DARWIN
+0x3d5,0x3d5,0x3d5,0xbe7,0x3d5,0x3d5,0x3d5,0xca1,0xbee,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,
+#else /* U_DARWIN */
+0x3d5,0x3d5,0x3d5,0xc12,0x3d5,0x3d5,0x3d5,0xccc,0xc19,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,
+#endif /* U_DARWIN */
+0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,
+#ifndef U_DARWIN
+0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0xcbd,0x3d5,0x3d5,0xc95,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,
+#else /* U_DARWIN */
+0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0xce8,0x3d5,0x3d5,0xcc0,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,
+#endif /* U_DARWIN */
+0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,
+#ifndef U_DARWIN
+0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0xc88,0x3d5,
+#else /* U_DARWIN */
+0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0xcb3,0x3d5,
+#endif /* U_DARWIN */
+0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,
+0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,
+0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,
+0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,
+0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,
+#ifndef U_DARWIN
+0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0xca9,0x3d5,0x3d5,0x3d5,
+#else /* U_DARWIN */
+0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0xcd4,0x3d5,0x3d5,0x3d5,
+#endif /* U_DARWIN */
+0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,
+#ifndef U_DARWIN
+0x3d5,0x3d5,0x3d5,0xcd2,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,
+#else /* U_DARWIN */
+0x3d5,0x3d5,0x3d5,0xcfd,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,
+#endif /* U_DARWIN */
+0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,
+0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,
+0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,
+0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,
+#ifndef U_DARWIN
+0x3d5,0x3d5,0x3d5,0x3d5,0xc49,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,
+#else /* U_DARWIN */
+0x3d5,0x3d5,0x3d5,0x3d5,0xc74,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,
+#endif /* U_DARWIN */
+0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,
+#ifndef U_DARWIN
+0x3d5,0xcda,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,
+#else /* U_DARWIN */
+0x3d5,0xd05,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,
+#endif /* U_DARWIN */
+0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,
+0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,
+0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,
+#ifndef U_DARWIN
+0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0xc0c,0x3d5,0x3d5,0x3d5,0xc11,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,
+#else /* U_DARWIN */
+0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0xc37,0x3d5,0x3d5,0x3d5,0xc3c,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,
+#endif /* U_DARWIN */
+0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,
+0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,
+0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,
+0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,
+#ifndef U_DARWIN
+0x3d5,0x3d5,0xc79,0xc7d,0x3d5,0x3d5,0x3d5,0xbd4,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,
+#else /* U_DARWIN */
+0x3d5,0x3d5,0xca4,0xca8,0x3d5,0x3d5,0x3d5,0xbff,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,
+#endif /* U_DARWIN */
+0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,
+0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,
+0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,
+0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x654,0x2a0,0x2a0,
+0x935,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,
+0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,
+0x3d5,0x3d5,0x3d5,0x3d5,0x93b,0x692,0x7db,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,
+0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x943,0x94b,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,
+0x953,0x95b,0x3d5,0x963,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,
+0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,
+0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,
+0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,
+0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,
+0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,
+0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,
+0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,
+0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,
+0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,
+0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,
+0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,
+0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,
+0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,
+0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,
+0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,
+0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,
+0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,
+0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,
+0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,
+0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,
+0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,
+0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,
+#ifndef U_DARWIN
+0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0xbbb,0x2a0,0x2a0,
+0xcf5,0xcf8,0xd00,0xd07,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,
+0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0xd0f,0x2a0,0xd17,0xd18,0xd17,0xd18,
+0xbc3,0xbc3,0xbc3,0xbc3,0xbc3,0xbc3,0xbc3,0xbc3,0xbc3,0xbc3,0xbc3,0xbc3,0xbc3,0xbc3,0xbc3,0xbc3,
+0xbc3,0xbc3,0xbc3,0xbc3,0xbc3,0xbc3,0xbc3,0xbc3,0xbc3,0xbc3,0xbc3,0xbc3,0xbc3,0xbc3,0xbc3,0xbc3,
+0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,
+0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,
+0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,
+0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,
+0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,
+0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,
+0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,
+0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,
+0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,
+0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,
+0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,
+0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,
+0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,
+0x3d5,0x96b,0x3d5,0x971,0x3d5,0x3d5,0x5b3,0x2a0,0x979,0x981,0x989,0x3d5,0x3d5,0x3f7,0x991,0x3d5,
+0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x996,0x661,0x3d5,0x99e,0x3d5,0x9a4,0x9a8,
+0x9b0,0x9b8,0x9bf,0x9c7,0x3d5,0x3d5,0x3d5,0x9cd,0x9d5,0x2b8,0x9dd,0x9e5,0x9ea,0x9f2,0x9fa,0xa02,
+0xbc3,0xbc3,0xbc3,0xbc3,0xbc3,0xbc3,0xbc3,0xbc3,0xbc3,0xbc3,0xbc3,0xbc3,0xbc3,0xbc3,0xbc3,0xbc3,
+0xbc3,0xbc3,0xbc3,0xbc3,0xbc3,0xbc3,0xbc3,0xbc3,0xbc3,0xbc3,0xbc3,0xbc3,0xbc3,0xbc3,0xbc3,0xbc3,
+0xa0a,0xa11,0xa19,0x2a0,0x3d5,0x3d5,0x3d5,0xa21,0xa29,0xa31,0xa39,0xa41,0xa48,0x2a0,0x2a0,0x2a0,
+0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x9f2,0xa50,0xa58,0x2a0,0xa60,0x3d5,0xa68,0x2a0,
+0x36d,0xa70,0xa74,0x3d5,0x417,0xa7c,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,
+#else /* U_DARWIN */
+0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0xbd3,0x2a0,0x2a0,
+0xd20,0xd23,0xd2b,0xd32,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,
+0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0xd3a,0x2a0,0xd42,0xd43,0xd42,0xd43,
+0xbdb,0xbdb,0xbdb,0xbdb,0xbdb,0xbdb,0xbdb,0xbdb,0xbdb,0xbdb,0xbdb,0xbdb,0xbdb,0xbdb,0xbdb,0xbdb,
+0xbdb,0xbdb,0xbdb,0xbdb,0xbdb,0xbdb,0xbdb,0xbdb,0xbdb,0xbdb,0xbdb,0xbdb,0xbdb,0xbdb,0xbdb,0xbdb,
+0xbe3,0xbe3,0xbe3,0xbe3,0xbe3,0xbe3,0xbe3,0xbe3,0xbe3,0xbe3,0xbe3,0xbe3,0xbe3,0xbe3,0xbe3,0xbe3,
+0xbe3,0xbe3,0xbe3,0xbe3,0xbe3,0xbe3,0xbe3,0xbe3,0xbe3,0xbe3,0xbe3,0xbe3,0xbe3,0xbe3,0xbe3,0xbe3,
+0xbe3,0xbe3,0xbe3,0xbe3,0xbe3,0xbe3,0xbe3,0xbe3,0xbe3,0xbe3,0xbe3,0xbe3,0xbe3,0xbe3,0xbe3,0xbe3,
+0xbe3,0xbe3,0xbe3,0xbe3,0xbe3,0xbe3,0xbe3,0xbe3,0xbe3,0xbe3,0xbe3,0xbe3,0xbe3,0xbe3,0xbe3,0xbe3,
+0xbe3,0xbe3,0xbe3,0xbe3,0xbe3,0xbe3,0xbe3,0xbe3,0xbe3,0xbe3,0xbe3,0xbe3,0xbe3,0xbe3,0xbe3,0xbe3,
+0xbe3,0xbe3,0xbe3,0xbe3,0xbe3,0xbe3,0xbe3,0xbe3,0xbe3,0xbe3,0xbe3,0xbe3,0xbe3,0xbe3,0xbe3,0xbe3,
+0xbe3,0xbe3,0xbe3,0xbe3,0xbe3,0xbe3,0xbe3,0xbe3,0xbe3,0xbe3,0xbe3,0xbe3,0xbe3,0xbe3,0xbe3,0xbe3,
+0xbe3,0xbe3,0xbe3,0xbe3,0xbe3,0xbe3,0xbe3,0xbe3,0xbe3,0xbe3,0xbe3,0xbe3,0xbe3,0xbe3,0xbe3,0xbe3,
+0xbe3,0xbe3,0xbe3,0xbe3,0xbe3,0xbe3,0xbe3,0xbe3,0xbe3,0xbe3,0xbe3,0xbe3,0xbe3,0xbe3,0xbe3,0xbe3,
+0xbe3,0xbe3,0xbe3,0xbe3,0xbe3,0xbe3,0xbe3,0xbe3,0xbe3,0xbe3,0xbe3,0xbe3,0xbe3,0xbe3,0xbe3,0xbe3,
+0xbe3,0xbe3,0xbe3,0xbe3,0xbe3,0xbe3,0xbe3,0xbe3,0xbe3,0xbe3,0xbe3,0xbe3,0xbe3,0xbe3,0xbe3,0xbe3,
+0xbe3,0xbe3,0xbe3,0xbe3,0xbe3,0xbe3,0xbe3,0xbe3,0xbe3,0xbe3,0xbe3,0xbe3,0xbe3,0xbe3,0xbe3,0xbe3,
+0xbeb,0x692,0x692,0xbef,0x96b,0x973,0x97b,0x692,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,
+0x3d5,0x983,0x3d5,0x989,0x3d5,0x3d5,0x5b3,0x2a0,0x991,0x999,0x9a1,0x3d5,0x3d5,0x3f7,0x9a9,0x3d5,
+0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x9ae,0x661,0x3d5,0x9b6,0x3d5,0x9bc,0x9c0,
+0x9c8,0x9d0,0x9d7,0x9df,0x3d5,0x3d5,0x3d5,0x9e5,0x9ed,0x2b8,0x9f5,0x9fd,0xa02,0xa0a,0xa12,0xa1a,
+0xbdb,0xbdb,0xbdb,0xbdb,0xbdb,0xbdb,0xbdb,0xbdb,0xbdb,0xbdb,0xbdb,0xbdb,0xbdb,0xbdb,0xbdb,0xbdb,
+0xbdb,0xbdb,0xbdb,0xbdb,0xbdb,0xbdb,0xbdb,0xbdb,0xbdb,0xbdb,0xbdb,0xbdb,0xbdb,0xbdb,0xbdb,0xbdb,
+0xa22,0xa29,0xa31,0x2a0,0x3d5,0x3d5,0x3d5,0xa39,0xa41,0xa49,0xa51,0xa59,0xa60,0x2a0,0x2a0,0x2a0,
+0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0xa0a,0xa68,0xa70,0x2a0,0xa78,0x3d5,0xa80,0x2a0,
+0x36d,0xa88,0xa8c,0x3d5,0x417,0xa94,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,
+#endif /* U_DARWIN */
+0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,
+#ifndef U_DARWIN
+0xa84,0xa87,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0xa8f,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,
+0xa97,0xa9e,0xaa6,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,
+#else /* U_DARWIN */
+0xa9c,0xa9f,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0xaa7,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,
+0xaaf,0xab6,0xabe,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,
+#endif /* U_DARWIN */
+0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,
+#ifndef U_DARWIN
+0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0xaae,0x2a0,0x2a0,0x2a0,0x2a0,
+0xab6,0xabe,0xac6,0xace,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,
+#else /* U_DARWIN */
+0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0xac6,0x2a0,0x2a0,0x2a0,0x2a0,
+0xace,0xad6,0xade,0xae6,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,
+#endif /* U_DARWIN */
+0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,
+#ifndef U_DARWIN
+0x692,0x692,0x692,0x692,0x692,0x692,0x692,0x8d3,0x692,0xad6,0x692,0xadd,0xae5,0xaeb,0xaef,0x2a0,
+0x692,0x692,0xaf7,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x692,0x692,0xaff,0xb07,0x2a0,0x2a0,0x2a0,0x2a0,
+0xb0f,0xb16,0xb1b,0xb21,0xb29,0xb31,0xb39,0xb13,0xb41,0xb49,0xb51,0xb56,0xb28,0xb0f,0xb16,0xb12,
+0xb21,0xb5e,0xb10,0xb61,0xb13,0xb69,0xb71,0xb79,0xb80,0xb6c,0xb74,0xb7c,0xb83,0xb6f,0xb8b,0xb93,
+0xc90,0x3d5,0x3d5,0xc50,0x3d5,0x3d5,0x3d5,0xc58,0x3d5,0xc72,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,
+#else /* U_DARWIN */
+0x692,0x692,0x692,0x692,0x692,0x692,0x692,0x8d3,0x692,0xaee,0x692,0xaf5,0xafd,0xb03,0xb07,0x2a0,
+0x692,0x692,0xb0f,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x692,0x692,0xb17,0xb1f,0x2a0,0x2a0,0x2a0,0x2a0,
+0xb27,0xb2e,0xb33,0xb39,0xb41,0xb49,0xb51,0xb2b,0xb59,0xb61,0xb69,0xb6e,0xb40,0xb27,0xb2e,0xb2a,
+0xb39,0xb76,0xb28,0xb79,0xb2b,0xb81,0xb89,0xb91,0xb98,0xb84,0xb8c,0xb94,0xb9b,0xb87,0xba3,0xbab,
+0xcbb,0x3d5,0x3d5,0xc7b,0x3d5,0x3d5,0x3d5,0xc83,0x3d5,0xc9d,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,
+#endif /* U_DARWIN */
+0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,
+0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,
+0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,
+#ifndef U_DARWIN
+0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0xbf4,0x3d5,0x3d5,0xcc5,0x3d5,0x3d5,0x3d5,
+0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0xc25,0xc2d,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,
+#else /* U_DARWIN */
+0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0xc1f,0x3d5,0x3d5,0xcf0,0x3d5,0x3d5,0x3d5,
+0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0xc50,0xc58,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,
+#endif /* U_DARWIN */
+0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,
+#ifndef U_DARWIN
+0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0xc11,0x3d5,0x3d5,0x3d5,
+0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0xc34,0x3d5,0x3d5,0x3d5,
+#else /* U_DARWIN */
+0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0xc3c,0x3d5,0x3d5,0x3d5,
+0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0xc5f,0x3d5,0x3d5,0x3d5,
+#endif /* U_DARWIN */
+0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,
+0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,
+#ifndef U_DARWIN
+0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0xc3b,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,
+#else /* U_DARWIN */
+0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0xc66,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,
+#endif /* U_DARWIN */
+0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,
+#ifndef U_DARWIN
+0x3d5,0x3d5,0x3d5,0xc5d,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,
+#else /* U_DARWIN */
+0x3d5,0x3d5,0x3d5,0xc88,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,
+#endif /* U_DARWIN */
+0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,
+0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x8ac,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,
+0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,
+0x417,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,
+#ifndef U_DARWIN
+0xb9b,0xba3,0xba3,0xba3,0x2a0,0x2a0,0x2a0,0x2a0,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0xbab,
+#else /* U_DARWIN */
+0xbb3,0xbbb,0xbbb,0xbbb,0x2a0,0x2a0,0x2a0,0x2a0,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0xbc3,
+#endif /* U_DARWIN */
+0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,
+#ifndef U_DARWIN
+0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,
+0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,
+0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,
+0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcc,
+#else /* U_DARWIN */
+0xbe3,0xbe3,0xbe3,0xbe3,0xbe3,0xbe3,0xbe3,0xbe3,0xbe3,0xbe3,0xbe3,0xbe3,0xbe3,0xbe3,0xbe3,0xbe3,
+0xbe3,0xbe3,0xbe3,0xbe3,0xbe3,0xbe3,0xbe3,0xbe3,0xbe3,0xbe3,0xbe3,0xbe3,0xbe3,0xbe3,0xbe3,0xbe3,
+0xbe3,0xbe3,0xbe3,0xbe3,0xbe3,0xbe3,0xbe3,0xbe3,0xbe3,0xbe3,0xbe3,0xbe3,0xbe3,0xbe3,0xbe3,0xbe3,
+0xbe3,0xbe3,0xbe3,0xbe3,0xbe3,0xbe3,0xbe3,0xbe3,0xbe3,0xbe3,0xbe3,0xbe3,0xbe3,0xbe3,0xbe3,0xbf7,
+#endif /* U_DARWIN */
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,
+0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,
+0xc,0x17,0x17,0x17,0x19,0x17,0x17,0x17,0x14,0x15,0x17,0x18,0x17,0x13,0x17,0x17,
+0x29,0x129,0x229,0x329,0x429,0x529,0x629,0x729,0x829,0x929,0x17,0x17,0x18,0x18,0x18,0x17,
+0x17,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+1,1,1,1,1,1,1,1,1,1,1,0x14,0x17,0x15,0x1a,0x16,
+0x1a,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
+2,2,2,2,2,2,2,2,2,2,2,0x14,0x18,0x15,0x18,0xf,
+0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,
+0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,
+0xc,0x17,0x19,0x19,0x19,0x19,0x1b,0x1b,0x1a,0x1b,2,0x1c,0x18,0x10,0x1b,0x1a,
+0x1b,0x18,0x24b,0x34b,0x1a,2,0x1b,0x17,0x1a,0x14b,2,0x1d,0xa8b,0x88b,0x1a8b,0x17,
+1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+1,1,1,1,1,1,1,0x18,1,1,1,1,1,1,1,2,
+2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
+2,2,2,2,2,2,2,0x18,2,2,2,2,2,2,2,2,
+1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,
+1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,
+2,1,2,1,2,1,2,1,2,2,1,2,1,2,1,2,
+1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,
+1,2,1,2,1,1,2,1,2,1,2,2,2,1,1,2,
+1,2,1,1,2,1,1,1,2,2,1,1,1,1,2,1,
+1,2,1,1,1,2,2,2,1,1,2,1,1,2,1,2,
+1,2,1,1,2,1,2,2,1,2,1,1,2,1,1,1,
+2,1,2,1,1,2,2,5,1,2,2,2,5,5,5,5,
+1,3,2,1,3,2,1,3,2,1,2,1,2,1,2,1,
+2,1,2,1,2,1,2,1,2,2,1,2,1,2,1,2,
+1,2,1,2,1,2,1,2,1,2,1,2,2,1,3,2,
+1,2,1,1,1,2,1,2,1,2,1,2,1,2,1,2,
+1,2,1,2,1,2,1,2,2,2,2,2,2,2,1,1,
+2,1,1,2,2,1,2,1,1,1,1,2,1,2,1,2,
+1,2,1,2,2,2,2,2,2,2,2,2,2,2,2,2,
+2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
+2,2,2,2,5,2,2,2,2,2,2,2,2,2,2,2,
+2,2,2,2,2,2,2,2,4,4,4,4,4,4,4,4,
+4,4,4,4,4,4,4,4,4,4,0x1a,0x1a,0x1a,0x1a,4,4,
+4,4,4,4,4,4,4,4,4,4,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,
+0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,4,4,4,4,4,0x1a,0x1a,0x1a,
+0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,4,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,
+0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,6,6,6,6,6,6,6,6,
+6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,
+6,6,6,6,6,6,6,6,0,0,0,0,0x1a,0x1a,0,0,
+0,0,4,2,2,2,0x17,0,0,0,0,0,0x1a,0x1a,1,0x17,
+1,1,1,0,1,0,1,1,2,1,1,1,1,1,1,1,
+1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,
+1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,
+2,2,2,2,2,2,2,2,2,2,2,0,2,2,1,1,
+1,2,2,2,1,2,1,2,1,2,1,2,1,2,1,2,
+1,2,1,2,2,2,2,2,1,2,0x18,1,2,1,1,2,
+2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,
+2,2,2,2,1,2,0x1b,6,6,6,6,0,7,7,1,2,
+1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,
+1,2,1,2,1,1,2,1,2,1,2,1,2,1,2,1,
+2,1,2,2,1,2,1,2,1,2,1,2,1,2,1,2,
+1,2,1,2,1,2,1,2,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,
+1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+1,1,1,0,0,4,0x17,0x17,0x17,0x17,0x17,0x17,0,2,2,2,
+2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
+2,2,2,2,2,2,2,2,2,2,2,2,0,0x17,0x13,0,
+0,0,0,0,0,6,6,6,6,6,6,6,6,6,6,6,
+6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,
+6,6,6,6,6,6,0x17,6,0x17,6,6,0x17,6,6,0x17,6,
+0,0,0,0,0,0,0,0,5,5,5,5,5,5,5,5,
+5,5,5,5,5,5,5,5,5,5,5,0,0,0,0,0,
+5,5,5,0x17,0x17,0,0,0,0,0,0,0,0,0,0,0,
+0x10,0x10,0x10,0x10,0,0,0,0,0,0,0,0x19,0x17,0x17,0x1b,0x1b,
+6,6,6,6,6,6,0,0,0,0,0,0x17,0,0,0x17,0x17,
+0,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
+5,5,5,5,5,5,5,5,5,5,5,0,0,0,0,0,
+4,5,5,5,5,5,5,5,5,5,5,6,6,6,6,6,
+6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,0,
+0x29,0x129,0x229,0x329,0x429,0x529,0x629,0x729,0x829,0x929,0x17,0x17,0x17,0x17,5,5,
+6,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
+5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
+5,5,5,5,0x17,5,6,6,6,6,6,6,6,0x10,7,6,
+6,6,6,6,6,4,4,6,6,0x1b,6,6,6,6,5,5,
+0x29,0x129,0x229,0x329,0x429,0x529,0x629,0x729,0x829,0x929,5,5,5,0x1b,0x1b,5,
+0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0,0x10,
+5,6,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
+5,5,5,5,6,6,6,6,6,6,6,6,6,6,6,6,
+6,6,6,6,6,6,6,0,0,5,5,5,5,5,5,5,
+5,5,5,5,5,5,5,5,5,5,5,5,5,5,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+5,5,5,5,5,5,6,6,6,6,6,6,6,6,6,6,
+6,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0x29,0x129,0x229,0x329,0x429,0x529,0x629,0x729,0x829,0x929,5,5,5,5,5,5,
+5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
+5,5,5,6,6,6,6,6,6,6,6,6,4,4,0x1b,0x17,
+0x17,0x17,4,0,0,0,0,0,0,6,6,8,5,5,5,5,
+5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
+5,5,5,5,5,5,5,5,5,5,0,0,6,5,8,8,
+8,6,6,6,6,6,6,6,6,8,8,8,8,6,0,0,
+5,6,6,6,6,0,0,0,5,5,5,5,5,5,5,5,
+5,5,6,6,0x17,0x17,0x29,0x129,0x229,0x329,0x429,0x529,0x629,0x729,0x829,0x929,
+0x17,0,0,0,0,0,0,0,0,0,0,5,5,5,5,5,
+0,6,8,8,0,5,5,5,5,5,5,5,5,0,0,5,
+5,0,0,5,5,5,5,5,5,5,5,5,5,5,5,5,
+5,0,5,5,5,5,5,5,5,0,5,0,0,0,5,5,
+5,5,0,0,6,5,8,8,8,6,6,6,6,0,0,8,
+8,0,0,8,8,6,5,0,0,0,0,0,0,0,0,8,
+0,0,0,0,5,5,0,5,5,5,6,6,0,0,0x29,0x129,
+0x229,0x329,0x429,0x529,0x629,0x729,0x829,0x929,5,5,0x19,0x19,0x16b,0x26b,0x36b,0x46b,
+0xb,0x106b,0x1b,0,0,0,0,0,0,6,6,8,0,5,5,5,
+5,5,5,0,0,0,0,5,5,0,0,5,5,5,5,5,
+5,5,5,5,5,5,5,5,5,0,5,5,5,5,5,5,
+5,0,5,5,0,5,5,0,5,5,0,0,6,0,8,8,
+8,6,6,0,0,0,0,6,6,0,0,6,6,6,0,0,
+0,0,0,0,0,0,0,0,0,5,5,5,5,0,5,0,
+0,0,0,0,0,0,0x29,0x129,0x229,0x329,0x429,0x529,0x629,0x729,0x829,0x929,
+6,6,5,5,5,0,0,0,0,0,0,0,0,0,0,0,
+0,6,6,8,0,5,5,5,5,5,5,5,5,5,0,5,
+5,5,0,5,5,5,5,5,5,5,5,5,5,5,5,5,
+5,0,5,5,5,5,5,5,5,0,5,5,0,5,5,5,
+5,5,0,0,6,5,8,8,8,6,6,6,6,6,0,6,
+6,8,0,8,8,6,0,0,5,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,5,5,6,6,0,0,0x29,0x129,
+0x229,0x329,0x429,0x529,0x629,0x729,0x829,0x929,0,0x19,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,5,5,5,5,5,5,5,5,
+5,0,5,5,5,5,5,5,5,0,5,5,0,5,5,5,
+5,5,0,0,6,5,8,6,8,6,6,6,0,0,0,8,
+8,0,0,8,8,6,0,0,0,0,0,0,0,0,6,8,
+0,0,0,0,5,5,0,5,5,5,0,0,0,0,0x29,0x129,
+0x229,0x329,0x429,0x529,0x629,0x729,0x829,0x929,0x1b,5,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,6,5,0,5,5,5,
+5,5,5,0,0,0,5,5,5,0,5,5,5,5,0,0,
+0,5,5,0,5,0,5,5,0,0,0,5,5,0,0,0,
+5,5,5,0,0,0,5,5,5,5,5,5,5,5,5,5,
+5,5,0,0,0,0,8,8,6,8,8,0,0,0,8,8,
+8,0,8,8,8,6,0,0,0,0,0,0,0,0,0,8,
+0,0,0,0,0,0,0,0,0,0,0x29,0x129,0x229,0x329,0x429,0x529,
+0x629,0x729,0x829,0x929,0xa6b,0x646b,0x11ab,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x19,0x1b,0,
+0,0,0,0,0,8,8,8,0,5,5,5,5,5,5,5,
+5,0,5,5,5,0,5,5,5,5,5,5,5,5,5,5,
+5,5,5,5,5,0,5,5,5,5,5,5,5,5,5,5,
+0,5,5,5,5,5,0,0,0,0,6,6,6,8,8,8,
+8,0,6,6,6,0,6,6,6,6,0,0,0,0,0,0,
+0,6,6,0,0,0,0,0,0,0,0,0,5,5,0,0,
+0,0,0x29,0x129,0x229,0x329,0x429,0x529,0x629,0x729,0x829,0x929,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,8,
+0,5,5,5,5,5,5,5,5,0,5,5,5,0,5,5,
+5,5,5,5,5,5,5,5,5,5,5,5,5,0,5,5,
+5,5,5,5,5,5,5,5,0,5,5,5,5,5,0,0,
+6,5,8,6,8,8,8,8,8,0,6,8,8,0,8,8,
+6,6,0,0,0,0,0,0,0,8,8,0,0,0,0,0,
+0,0,5,0,5,5,6,6,0,0,0x29,0x129,0x229,0x329,0x429,0x529,
+0x629,0x729,0x829,0x929,0,0x1b,0x1b,0,0,0,0,0,0,0,0,0,
+0,0,0,0,5,5,5,5,5,5,5,5,5,0,5,5,
+5,5,5,5,5,5,5,5,5,5,5,5,5,5,0,0,
+0,0,8,8,8,6,6,6,0,0,8,8,8,0,8,8,
+8,6,0,0,0,0,0,0,0,0,0,8,0,0,0,0,
+0,0,0,0,0,0,8,8,0,5,5,5,5,5,5,5,
+5,5,5,5,5,5,5,5,5,5,5,0,0,0,5,5,
+5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
+5,5,0,5,5,5,5,5,5,5,5,5,0,5,0,0,
+5,5,5,5,5,5,5,0,0,0,6,0,0,0,0,8,
+8,8,6,6,6,0,6,0,8,8,8,8,8,8,8,8,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,8,8,0x17,0,0,0,0,0,0,0,0,0,0,0,
+0,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
+5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
+5,6,5,5,6,6,6,6,6,6,6,0,0,0,0,0x19,
+5,5,5,5,5,5,4,6,6,6,6,6,6,6,6,0x17,
+0x29,0x129,0x229,0x329,0x429,0x529,0x629,0x729,0x829,0x929,0x17,0x17,0,0,0,0,
+0,5,5,0,5,0,0,5,5,0,5,0,0,5,0,0,
+0,0,0,0,5,5,5,5,0,5,5,5,5,5,5,5,
+0,5,5,5,0,5,0,5,0,0,5,5,0,5,5,5,
+5,6,5,5,6,6,6,6,6,6,0,6,6,5,0,0,
+5,5,5,5,5,0,4,0,6,6,6,6,6,6,0,0,
+0x29,0x129,0x229,0x329,0x429,0x529,0x629,0x729,0x829,0x929,0,0,5,5,0,0,
+5,0x1b,0x1b,0x1b,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,
+0x17,0x17,0x17,0x1b,0x1b,0x1b,0x1b,0x1b,6,6,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
+0x29,0x129,0x229,0x329,0x429,0x529,0x629,0x729,0x829,0x929,0x88b,0x188b,0x288b,0x388b,0x488b,0x588b,
+0x688b,0x788b,0x888b,0x8b,0x1b,6,0x1b,6,0x1b,6,0x14,0x15,0x14,0x15,8,8,
+5,5,5,5,5,5,5,5,0,5,5,5,5,5,5,5,
+5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
+5,5,5,0,0,0,0,0,0,6,6,6,6,6,6,6,
+6,6,6,6,6,6,6,8,6,6,6,6,6,0x17,6,6,
+5,5,5,5,0,0,0,0,6,6,6,6,6,6,6,6,
+0,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,
+6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,
+6,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,6,0x1b,0x1b,0x1b,0x1b,0x1b,
+0x1b,0,0,0x1b,0x17,0x17,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,5,5,0,5,5,5,5,5,0,5,5,0,
+8,6,6,6,6,8,6,0,0,0,6,6,8,6,0,0,
+0,0,0,0,0x29,0x129,0x229,0x329,0x429,0x529,0x629,0x729,0x829,0x929,0x17,0x17,
+0x17,0x17,0x17,0x17,5,5,5,5,5,5,8,8,6,6,0,0,
+0,0,0,0,1,1,1,1,1,1,0,0,0,0,0,0,
+0,0,0,0,5,5,5,5,5,5,5,5,5,5,5,5,
+5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,0x17,
+4,0,0,0,5,5,5,5,5,5,5,5,5,5,5,5,
+5,5,5,5,5,5,5,5,5,5,5,5,5,5,0,0,
+0,0,0,5,5,5,5,0,0,0,0,0,5,5,5,5,
+5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
+5,5,5,5,5,5,0,0,0,0,0,0,5,5,5,5,
+5,5,5,5,5,0,5,5,5,5,0,0,5,5,5,5,
+5,5,5,0,5,0,5,5,5,5,0,0,5,5,5,5,
+5,5,5,5,5,0,5,5,5,5,0,0,5,5,5,5,
+5,5,5,5,5,5,5,5,5,5,5,5,5,0,5,5,
+5,5,0,0,5,5,5,5,5,5,5,0,5,0,5,5,
+5,5,0,0,5,5,5,5,5,5,5,5,5,5,5,5,
+5,5,5,0,5,5,5,5,5,5,5,5,5,5,5,5,
+5,5,5,5,5,0,5,5,5,5,0,0,5,5,5,5,
+5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
+5,5,5,5,5,5,5,0,0,0,0,6,0x1b,0x17,0x17,0x17,
+0x17,0x17,0x17,0x17,0x17,0x14b,0x24b,0x34b,0x44b,0x54b,0x64b,0x74b,0x84b,0x94b,0xa6b,0x146b,
+0x1e6b,0x286b,0x326b,0x3c6b,0x466b,0x506b,0x5a6b,0x646b,0x12ab,0,0,0,5,5,5,5,
+5,5,5,5,5,5,5,5,5,5,5,5,0x1b,0x1b,0x1b,0x1b,
+0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0,0,0,0,0,5,5,5,5,
+5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
+5,0,0,0,0,0,0,0,0,0,0,0,5,5,5,5,
+5,5,5,5,5,5,5,5,5,0x17,0x17,5,5,5,5,5,
+5,5,5,0,0,0,0,0,0,0,0,0,0xc,5,5,5,
+5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
+5,5,5,5,5,5,5,0x14,0x15,0,0,0,5,5,5,5,
+5,5,5,5,5,5,5,0x17,0x17,0x17,0x116a,0x126a,0x136a,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,5,5,5,5,
+5,5,5,5,5,5,5,5,5,0,5,5,5,5,6,6,
+6,0,0,0,0,0,0,0,0,0,0,0,5,5,5,5,
+5,5,5,5,5,5,5,5,5,5,5,5,5,5,6,6,
+6,0x17,0x17,0,0,0,0,0,0,0,0,0,5,5,5,5,
+5,5,5,5,5,5,5,5,5,5,5,5,5,5,6,6,
+0,0,0,0,0,0,0,0,0,0,0,0,5,5,5,5,
+5,5,5,5,5,5,5,5,5,0,5,5,5,0,6,6,
+0,0,0,0,0,0,0,0,0,0,0,0,5,5,5,5,
+5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
+0x10,0x10,8,6,6,6,6,6,6,6,8,8,8,8,8,8,
+8,8,6,8,8,6,6,6,6,6,6,6,6,6,6,6,
+0x17,0x17,0x17,4,0x17,0x17,0x17,0x19,5,6,0,0,0x29,0x129,0x229,0x329,
+0x429,0x529,0x629,0x729,0x829,0x929,0,0,0,0,0,0,0x6b,0x16b,0x26b,0x36b,
+0x46b,0x56b,0x66b,0x76b,0x86b,0x96b,0,0,0,0,0,0,0x17,0x17,0x17,0x17,
+0x17,0x17,0x13,0x17,0x17,0x17,0x17,6,6,6,0xc,0,0x29,0x129,0x229,0x329,
+0x429,0x529,0x629,0x729,0x829,0x929,0,0,0,0,0,0,5,5,5,4,
+5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
+5,5,5,5,5,5,5,5,5,5,5,5,0,0,0,0,
+0,0,0,0,5,5,5,5,5,5,5,5,5,6,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,5,5,5,5,5,5,5,5,5,5,5,5,
+5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
+5,0,0,0,6,6,6,8,8,8,8,6,6,8,8,8,
+0,0,0,0,8,8,6,8,8,8,8,8,8,6,6,6,
+0,0,0,0,0x1b,0,0,0,0x17,0x17,0x29,0x129,0x229,0x329,0x429,0x529,
+0x629,0x729,0x829,0x929,5,5,5,5,5,5,5,5,5,5,5,5,
+5,5,5,5,5,5,0,0,5,5,5,5,5,0,0,0,
+0,0,0,0,0,0,0,0,5,5,5,5,5,5,5,5,
+5,5,0,0,0,0,0,0,8,8,8,8,8,8,8,8,
+8,8,8,8,8,8,8,8,8,5,5,5,5,5,5,5,
+8,8,0,0,0,0,0,0,0x29,0x129,0x229,0x329,0x429,0x529,0x629,0x729,
+0x829,0x929,0,0,0,0,0x17,0x17,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
+0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
+0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,5,5,5,5,5,5,5,5,
+5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,6,
+6,8,8,8,0,0,0x17,0x17,6,6,6,6,8,5,5,5,
+5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
+5,5,5,5,5,5,5,5,6,8,6,6,6,6,6,8,
+6,8,8,8,8,8,6,8,8,5,5,5,5,5,5,5,
+0,0,0,0,0x29,0x129,0x229,0x329,0x429,0x529,0x629,0x729,0x829,0x929,0x17,0x17,
+0x17,0x17,0x17,0x17,0x17,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,6,
+6,6,6,6,6,6,6,6,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
+0x1b,0,0,0,2,2,2,2,2,2,2,2,2,2,2,2,
+4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,
+4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,
+4,4,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
+2,2,2,2,2,2,2,2,4,2,2,2,2,2,2,2,
+2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
+2,2,2,2,2,2,2,4,4,4,4,4,6,6,6,6,
+6,6,6,6,6,6,6,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,6,6,1,2,1,2,1,2,1,2,
+1,2,1,2,1,2,1,2,1,2,1,2,1,2,2,2,
+2,2,2,2,0,0,0,0,1,2,1,2,1,2,1,2,
+1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,
+1,2,0,0,0,0,0,0,2,2,2,2,2,2,2,2,
+1,1,1,1,1,1,1,1,2,2,2,2,2,2,0,0,
+1,1,1,1,1,1,0,0,2,2,2,2,2,2,2,2,
+1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,
+1,1,1,1,1,1,1,1,2,2,2,2,2,2,0,0,
+1,1,1,1,1,1,0,0,2,2,2,2,2,2,2,2,
+0,1,0,1,0,1,0,1,2,2,2,2,2,2,2,2,
+1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,
+2,2,2,2,2,2,0,0,2,2,2,2,2,2,2,2,
+3,3,3,3,3,3,3,3,2,2,2,2,2,2,2,2,
+3,3,3,3,3,3,3,3,2,2,2,2,2,0,2,2,
+1,1,1,1,3,0x1a,2,0x1a,0x1a,0x1a,2,2,2,0,2,2,
+1,1,1,1,3,0x1a,0x1a,0x1a,2,2,2,2,0,0,2,2,
+1,1,1,1,0,0x1a,0x1a,0x1a,2,2,2,2,2,2,2,2,
+1,1,1,1,1,0x1a,0x1a,0x1a,0,0,2,2,2,0,2,2,
+1,1,1,1,3,0x1a,0x1a,0,0xc,0xc,0xc,0xc,0xc,0xc,0xc,0xc,
+0xc,0xc,0xc,0x10,0x10,0x10,0x10,0x10,0x13,0x13,0x13,0x13,0x13,0x13,0x17,0x17,
+0x1c,0x1d,0x14,0x1c,0x1c,0x1d,0x14,0x1c,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,
+0xd,0xe,0x10,0x10,0x10,0x10,0x10,0xc,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,
+0x17,0x1c,0x1d,0x17,0x17,0x17,0x17,0x16,0x16,0x17,0x17,0x17,0x18,0x14,0x15,0x17,
+0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x18,0x17,0x16,0x17,0x17,0x17,
+0x17,0x17,0x17,0x17,0x17,0x17,0x17,0xc,0x10,0x10,0x10,0x10,0,0,0,0,
+0,0,0x10,0x10,0x10,0x10,0x10,0x10,0x4b,2,0,0,0x44b,0x54b,0x64b,0x74b,
+0x84b,0x94b,0x18,0x18,0x18,0x14,0x15,2,0x4b,0x14b,0x24b,0x34b,0x44b,0x54b,0x64b,0x74b,
+0x84b,0x94b,0x18,0x18,0x18,0x14,0x15,0,4,4,4,4,4,0,0,0,
+0,0,0,0,0,0,0,0,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,
+0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+6,6,6,6,6,6,6,6,6,6,6,6,6,7,7,7,
+7,6,7,7,7,6,6,6,6,6,6,6,6,6,6,6,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0x1b,0x1b,1,0x1b,0x1b,0x1b,0x1b,1,0x1b,0x1b,2,1,1,1,2,2,
+1,1,1,2,0x1b,1,0x1b,0x1b,0x1b,1,1,1,1,1,0x1b,0x1b,
+0x1b,0x1b,0x1b,0x1b,1,0x1b,1,0x1b,1,0x1b,1,1,1,1,0x1b,2,
+1,1,1,1,2,5,5,5,5,2,0x1b,0x1b,2,2,1,1,
+0x18,0x18,0x18,0x18,0x18,1,2,2,2,2,0x1b,0x18,0x1b,0x1b,2,0,
+0,0,0,0x98b,0x118b,0xb8b,0x138b,0x1b8b,0x238b,0xc8b,0x2c8b,0xe8b,0x1e8b,0x2e8b,0x3e8b,0x16b,
+0x16a,0x26a,0x36a,0x46a,0x56a,0x66a,0x76a,0x86a,0x96a,0xa6a,0xb6a,0xc6a,0x326a,0x646a,0x50aa,0x11aa,
+0x16a,0x26a,0x36a,0x46a,0x56a,0x66a,0x76a,0x86a,0x96a,0xa6a,0xb6a,0xc6a,0x326a,0x646a,0x50aa,0x11aa,
+0x11aa,0x51aa,0x12aa,1,2,0,0,0,0,0,0,0,0,0,0,0,
+0x18,0x18,0x18,0x18,0x18,0x1b,0x1b,0x1b,0x1b,0x1b,0x18,0x18,0x1b,0x1b,0x1b,0x1b,
+0x18,0x1b,0x1b,0x18,0x1b,0x1b,0x18,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x18,0x1b,
+0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
+0x1b,0x1b,0x18,0x18,0x1b,0x1b,0x18,0x1b,0x18,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
+0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
+0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,
+0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,
+0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x18,0x18,0x18,0x18,0x1b,0x1b,0x1b,0x1b,
+0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
+0x18,0x18,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x14,0x15,0x1b,0x1b,0x1b,0x1b,0x1b,
+0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
+0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x18,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
+0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
+0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,
+0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x1b,0x1b,0x1b,0x1b,
+0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
+0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x18,0x18,0x18,0x18,0x18,0x18,0x1b,0x1b,
+0x1b,0x1b,0x1b,0x1b,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0x1b,0x1b,0x1b,0x1b,
+0x1b,0x1b,0x1b,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0x1b,0x1b,0x1b,0x1b,
+0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0x14b,0x24b,0x34b,0x44b,
+0x54b,0x64b,0x74b,0x84b,0x94b,0xa6b,0xb6b,0xc6b,0xd6b,0xe6b,0xf6b,0x106b,0x116b,0x126b,0x136b,0x146b,
+0x14b,0x24b,0x34b,0x44b,0x54b,0x64b,0x74b,0x84b,0x94b,0xa6b,0xb6b,0xc6b,0xd6b,0xe6b,0xf6b,0x106b,
+0x116b,0x126b,0x136b,0x146b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x4b,0xb6b,
+0xc6b,0xd6b,0xe6b,0xf6b,0x106b,0x116b,0x126b,0x136b,0x146b,0x14b,0x24b,0x34b,0x44b,0x54b,0x64b,0x74b,
+0x84b,0x94b,0xa6b,0x4b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
+0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x18,0x1b,0x1b,0x1b,0x1b,
+0x1b,0x1b,0x1b,0x1b,0x1b,0x18,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
+0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
+0x1b,0x1b,0x1b,0x1b,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x1b,0x1b,0x1b,0x1b,
+0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x18,0x1b,0x1b,0x1b,0x1b,
+0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
+0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0,0,0x1b,0x1b,0x1b,0x1b,
+0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0x1b,0x1b,0x1b,
+0x1b,0,0x1b,0x1b,0x1b,0x1b,0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
+0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0x1b,0x1b,0x1b,
+0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
+0x1b,0x1b,0x1b,0x1b,0,0x1b,0,0x1b,0x1b,0x1b,0x1b,0,0,0,0x1b,0,
+0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
+0x14,0x15,0x14,0x15,0x14,0x15,0x14,0x15,0x14,0x15,0x14,0x15,0x14,0x15,0x14b,0x24b,
+0x34b,0x44b,0x54b,0x64b,0x74b,0x84b,0x94b,0xa6b,0x14b,0x24b,0x34b,0x44b,0x54b,0x64b,0x74b,0x84b,
+0x94b,0xa6b,0x14b,0x24b,0x34b,0x44b,0x54b,0x64b,0x74b,0x84b,0x94b,0xa6b,0x1b,0,0,0,
+0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
+0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,
+0x18,0x18,0x18,0x18,0x18,0x14,0x15,0x18,0x18,0x18,0x18,0,0,0,0,0,
+0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,
+0x18,0x18,0x14,0x15,0x14,0x15,0x14,0x15,0,0,0,0,0x18,0x18,0x18,0x18,
+0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x14,
+0x15,0x14,0x15,0x14,0x15,0x14,0x15,0x14,0x15,0x14,0x15,0x14,0x15,0x14,0x15,0x14,
+0x15,0x14,0x15,0x14,0x15,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,
+0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,
+0x14,0x15,0x14,0x15,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,
+0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,
+0x14,0x15,0x18,0x18,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
+0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,
+0,0,0,0,0x1b,0x1b,0x1b,0x1b,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,
+1,1,1,0,2,2,2,2,2,2,2,2,2,2,2,2,
+2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
+2,2,2,0,1,2,1,1,1,2,2,1,2,1,2,1,
+2,0,0,0,0,0,0,0,2,1,2,2,0,0,0,0,
+0,0,0,0,1,2,1,2,2,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0x17,0x17,0x17,
+0x17,0x88b,0x17,0x17,2,2,2,2,2,2,0,0,0,0,0,0,
+0,0,0,0,5,5,5,5,5,5,5,5,5,5,5,5,
+5,5,5,5,5,5,0,0,0,0,0,0,0,0,0,4,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
+5,5,5,5,5,5,5,0,0,0,0,0,0,0,0,0,
+5,5,5,5,5,5,5,0,5,5,5,5,5,5,5,0,
+5,5,5,5,5,5,5,0,5,5,5,5,5,5,5,0,
+0x17,0x17,0x1c,0x1d,0x1c,0x1d,0x17,0x17,0x17,0x1c,0x1d,0x17,0x1c,0x1d,0x17,0x17,
+0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x13,0,0,0,0,0x1c,0x1d,0,0,
+0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
+0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0x1b,0x1b,0x1b,0x1b,0x1b,
+0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
+0,0,0,0,0,0,0,0,0,0,0,0,0x1b,0x1b,0x1b,0x1b,
+0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
+0x1b,0x1b,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
+0,0,0,0,0xc,0x17,0x17,0x17,0x1b,4,5,0x6a,0x14,0x15,0x14,0x15,
+0x14,0x15,0x14,0x15,0x14,0x15,0x1b,0x1b,0x14,0x15,0x14,0x15,0x14,0x15,0x14,0x15,
+0x13,0x14,0x15,0x15,0x1b,0x16a,0x26a,0x36a,0x46a,0x56a,0x66a,0x76a,0x86a,0x96a,6,6,
+6,6,6,6,0x13,4,4,4,4,4,0x1b,0x1b,0xa6a,0x146a,0x1e6a,4,
+5,0x17,0x1b,0x1b,5,5,5,5,5,5,5,5,5,5,5,5,
+5,5,5,5,5,5,5,5,5,5,5,0,0,6,6,0x1a,
+0x1a,4,4,5,0x13,5,5,5,5,5,5,5,5,5,5,5,
+5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
+5,5,5,5,5,5,5,0x17,4,4,4,5,5,5,5,5,
+5,5,5,5,5,5,5,5,5,0,0,0,0,5,5,5,
+5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,0,
+0x1b,0x1b,0x16b,0x26b,0x36b,0x46b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
+0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
+0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
+0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0x16b,0x26b,0x36b,0x46b,0x56b,0x66b,0x76b,0x86b,
+0x96b,0xa6b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
+0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0,0,0,0,0,0,0,
+0,0,0,0,0x1b,0x156b,0x166b,0x176b,0x186b,0x196b,0x1a6b,0x1b6b,0x1c6b,0x1d6b,0x1e6b,0x1f6b,
+0x206b,0x216b,0x226b,0x236b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
+0x1b,0x1b,0x1b,0x1b,0x1b,0x246b,0x256b,0x266b,0x276b,0x286b,0x296b,0x2a6b,0x2b6b,0x2c6b,0x2d6b,0x2e6b,
+0x2f6b,0x306b,0x316b,0x326b,5,5,5,5,5,5,5,5,5,5,5,5,
+5,5,5,5,5,5,5,5,5,4,5,5,5,5,5,5,
+5,5,5,5,5,5,5,5,5,0,0,0,0x1b,0x1b,0x1b,0x1b,
+0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1a,0x1a,0x1a,0x1a,
+0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,
+0x1a,0x1a,0x1a,4,4,4,4,0,0,0,0,0,0x1a,0x1a,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,5,5,8,5,
+5,5,6,5,5,5,5,6,5,5,5,5,5,5,5,5,
+5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,8,
+8,6,6,8,0x1b,0x1b,0x1b,0x1b,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,5,5,5,5,
+5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
+#ifndef U_DARWIN
+0x17,0x17,0x17,0x17,0,0,0,0,0,0,0,0,5,5,5,5,
+#else /* U_DARWIN */
+0x17,0x17,0x17,0x17,0,0,0,0,0,0,0,0,0x1b,0x1b,5,0x19,
+6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,
+6,6,6,6,6,6,5,5,5,5,5,6,0x19,0x4b,0xd6a,0xe6a,
+0xf6a,0xd6a,0xe6a,0xf6a,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
+0x15,0x17,0x17,0x17,4,0x13,0x13,0x17,0x18,0x18,0x14,0x15,0x18,5,5,5,
+5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
+5,5,5,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,5,5,5,5,
+#endif /* U_DARWIN */
+5,5,5,5,5,5,5,5,5,5,0,0,5,5,5,5,
+5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,0,
+0,0,0,0,5,5,5,5,5,5,5,5,5,5,5,5,
+5,5,5,5,2,2,2,2,2,2,2,0,0,0,0,0,
+0,0,0,0,0,0,0,2,2,2,2,2,0,0,0,0,
+0,5,6,5,5,5,5,5,5,5,5,5,5,0x18,5,5,
+5,5,5,5,5,5,5,5,5,5,5,0,5,5,5,5,
+5,0,5,0,5,5,0,5,5,0,5,5,5,5,5,5,
+5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
+5,5,5,5,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,5,5,5,5,5,5,5,5,5,
+5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
+5,5,5,5,5,5,0x14,0x15,5,5,5,5,5,5,5,5,
+5,5,5,5,5,5,5,5,0,0,5,5,5,5,5,5,
+5,5,5,5,5,5,5,5,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+5,5,5,5,5,5,5,5,5,5,5,5,0x19,0x1b,0,0,
+6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,
+0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x14,0x15,0x17,0,0,0,0,0,0,
+6,6,6,6,0,0,0,0,0,0,0,0,0,0,0,0,
+0x17,0x13,0x13,0x16,0x16,0x14,0x15,0x14,0x15,0x14,0x15,0x14,0x15,0x14,0x15,0x14,
+0x15,0x17,0x17,0x14,0x15,0x17,0x17,0x17,0x17,0x16,0x16,0x16,0x17,0x17,0x17,0,
+0x17,0x17,0x17,0x17,0x13,0x14,0x15,0x14,0x15,0x14,0x15,0x17,0x17,0x17,0x18,0x13,
+0x18,0x18,0x18,0,0x17,0x19,0x17,0x17,0,0,0,0,5,5,5,5,
+5,0,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
+5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
+5,0,0,0x10,0,0x17,0x17,0x17,0x19,0x17,0x17,0x17,0x14,0x15,0x17,0x18,
+0x17,0x13,0x17,0x17,0x29,0x129,0x229,0x329,0x429,0x529,0x629,0x729,0x829,0x929,0x17,0x17,
+0x18,0x18,0x18,0x17,0x1a,2,2,2,2,2,2,2,2,2,2,2,
+2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0x14,
+0x18,0x15,0x18,0x14,0x15,0x17,0x14,0x15,0x17,0x17,5,5,5,5,5,5,
+5,5,5,5,4,5,5,5,5,5,5,5,5,5,5,5,
+5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
+5,5,5,5,5,5,4,4,5,5,5,5,5,5,5,5,
+5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
+5,5,5,5,5,5,5,0,0,0,5,5,5,5,5,5,
+0,0,5,5,5,5,5,5,0,0,5,5,5,5,5,5,
+0,0,5,5,5,0,0,0,0x19,0x19,0x18,0x1a,0x1b,0x19,0x19,0,
+0x1b,0x18,0x18,0x18,0x18,0x1b,0x1b,0,0,0,0,0,0,0,0,0,
+0,0x10,0x10,0x10,0x1b,0x1b,0,0,5,5,5,5,5,5,5,5,
+5,5,5,5,0,5,5,5,5,5,5,5,5,5,5,5,
+5,5,5,5,5,5,5,5,5,5,5,0,5,5,5,5,
+5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,0,
+5,5,0,5,5,5,5,5,5,5,5,5,5,5,5,5,
+5,5,0,0,5,5,5,5,5,5,5,5,5,5,5,5,
+5,5,0,0,5,5,5,5,5,5,5,5,5,5,5,5,
+5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,0,
+0,0,0,0,0x17,0x17,0x1b,0,0,0,0,0x16b,0x26b,0x36b,0x46b,0x56b,
+0x66b,0x76b,0x86b,0x96b,0xa6b,0x146b,0x1e6b,0x286b,0x326b,0x3c6b,0x466b,0x506b,0x5a6b,0x646b,0xc86b,0x30ab,
+0x40ab,0x50ab,0x60ab,0x70ab,0x80ab,0x90ab,0x11ab,0x21ab,0x31ab,0x41ab,0x51ab,0x61ab,0x71ab,0x81ab,0x91ab,0x12ab,
+0x22ab,0x32ab,0x42ab,0x52ab,0x62ab,0x72ab,0x82ab,0x92ab,0,0,0,0x1b,0x1b,0x1b,0x1b,0x1b,
+0x1b,0x1b,0x1b,0x1b,0xa8a,0x88a,0x16a,0x56a,0x326a,0x50aa,0x51aa,0x52aa,0x56a,0xa6a,0x326a,0x646a,
+0x50aa,0x11aa,0x51aa,0x56a,0xa6a,0x326a,0x646a,0x50aa,0x11aa,0x12aa,0x52aa,0xa6a,0x16a,0x16a,0x16a,0x26a,
+0x26a,0x26a,0x26a,0x56a,0xa6a,0xa6a,0xa6a,0xa6a,0xa6a,0x1e6a,0x326a,0x326a,0x326a,0x326a,0x646a,0x30aa,
+0x50aa,0x50aa,0x50aa,0x50aa,0x50aa,0x11aa,0x51aa,0x56a,0x326a,0x88b,0x88b,0x118b,0x1a8b,0x1b,0x1b,0x1b,
+0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x6b,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0x16b,0x56b,0xa6b,0x326b,0,0,0,0,0,0,0,0,0,0,0,0,
+5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
+5,0x5a6a,5,5,5,5,5,5,5,5,0x90aa,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
+5,5,5,5,5,5,5,5,5,5,5,5,5,5,0,0x17,
+5,5,5,5,0,0,0,0,5,5,5,5,5,5,5,5,
+0x17,0x16a,0x26a,0xa6a,0x146a,0x646a,0,0,0,0,0,0,0,0,0,0,
+1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,
+2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
+5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
+0x29,0x129,0x229,0x329,0x429,0x529,0x629,0x729,0x829,0x929,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+5,5,5,5,5,5,0,0,5,0,5,5,5,5,5,5,
+5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
+5,5,0,5,5,0,0,0,5,0,0,5,5,5,5,5,
+5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
+5,5,0x16b,0xa6b,0x146b,0x646b,0,0,0,0,0,0x17,5,6,6,6,
+0,6,6,0,0,0,0,0,6,6,6,6,5,5,5,5,
+0,5,5,5,0,5,5,5,5,5,5,5,5,5,5,5,
+5,5,5,5,5,5,5,5,5,5,5,5,0,0,0,0,
+6,6,6,0,0,0,0,6,0x14b,0x24b,0x34b,0x44b,0xa6b,0x146b,0x646b,0x11ab,
+0,0,0,0,0,0,0,0,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,
+0x17,0,0,0,0,0,0,0,5,5,5,5,5,5,5,5,
+5,5,5,5,5,5,5,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0x26a,0x36a,0x46a,0x56a,0x66a,0x76a,0x86a,0x96a,
+0x36a,0x46a,0x56a,0x66a,0x76a,0x86a,0x96a,0x46a,0x56a,0x66a,0x76a,0x86a,0x96a,0x16a,0x26a,0x36a,
+0x46a,0x56a,0x66a,0x76a,0x86a,0x96a,0x16a,0x26a,0x36a,0x46a,0x56a,0x26a,0x36a,0x36a,0x46a,0x56a,
+0x66a,0x76a,0x86a,0x96a,0x16a,0x26a,0x36a,0x36a,0x46a,0x56a,0xa,0xa,0x16a,0x26a,0x36a,0x36a,
+0x46a,0x56a,0x36a,0x36a,0x46a,0x46a,0x46a,0x46a,0x66a,0x76a,0x76a,0x76a,0x86a,0x86a,0x96a,0x96a,
+0x96a,0x96a,0x26a,0x36a,0x46a,0x56a,0x66a,0x16a,0x26a,0x36a,0x46a,0x46a,0x56a,0x56a,0xa,0xa,
+0x16a,0x26a,0x98a,0x118a,0x2c8a,0x98a,0x118a,0xe8a,0xa8a,0xc8a,0xa8a,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0x17,0x17,0x17,0x17,0,0,0,0,
+0,0,0,0,0,0,0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,
+0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
+0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,8,8,6,6,6,0x1b,0x1b,
+0x1b,8,8,8,8,8,8,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,6,
+6,6,6,6,6,6,6,0x1b,0x1b,6,6,6,6,6,6,6,
+0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
+0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,6,6,6,6,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
+0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
+0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0,0x1b,0x1b,6,6,
+6,0x1b,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0x1b,0x1b,0x1b,0x1b,
+0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
+0x1b,0x1b,0x1b,0,0,0,0,0,0,0,0,0,0x16b,0x26b,0x36b,0x46b,
+0x56b,0x66b,0x76b,0x86b,0x96b,0xa6b,0x146b,0x1e6b,0x286b,0x326b,0x3c6b,0x466b,0x506b,0x5a6b,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,
+1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,
+2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,
+1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,
+2,0,2,2,2,2,2,2,2,2,2,2,1,1,1,1,
+1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,
+2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
+1,0,1,1,0,0,1,0,0,1,1,0,0,1,1,1,
+1,0,1,1,1,1,1,1,1,1,2,2,2,2,0,2,
+0,2,2,2,2,2,2,2,0,2,2,2,2,2,2,2,
+2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,
+1,1,1,1,2,2,2,2,1,1,0,1,1,1,1,0,
+0,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,
+1,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
+2,2,2,2,2,2,2,2,2,2,2,2,1,1,0,1,
+1,1,1,0,1,1,1,1,1,0,1,0,0,0,1,1,
+1,1,1,1,1,0,2,2,2,2,2,2,2,2,2,2,
+2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,
+1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,
+2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
+2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,
+1,1,1,1,2,2,2,2,2,2,0,0,1,1,1,1,
+1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+1,1,1,1,1,0x18,2,2,2,2,2,2,2,2,2,2,
+2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0x18,
+2,2,2,2,2,2,1,1,1,1,1,1,1,1,1,1,
+1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0x18,
+2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
+2,2,2,2,2,0x18,2,2,2,2,2,2,1,1,1,1,
+1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,0x18,
+2,2,2,2,2,2,1,2,0,0,0x29,0x129,0x229,0x329,0x429,0x529,
+0x629,0x729,0x829,0x929,0x29,0x129,0x229,0x329,0x429,0x529,0x629,0x729,0x829,0x929,0x29,0x129,
+0x229,0x329,0x429,0x529,0x629,0x729,0x829,0x929,0x29,0x129,0x229,0x329,0x429,0x529,0x629,0x729,
+0x829,0x929,0x29,0x129,0x229,0x329,0x429,0x529,0x629,0x729,0x829,0x929,0,0x10,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0x10,0x10,0x10,0x10,
+0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,
+0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,6,6,6,6,
+6,6,6,6,6,6,6,6,6,6,6,6,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,5,5,5,5,
+5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
+5,5,0,0,0,0,0,0,0,0,0,0,5,5,5,5,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0x12,0x12,0x12,0x12,
+0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,
+0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x11,0x11,0x11,0x11,
+0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,
+#ifndef U_DARWIN
+0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0,0,
+5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
+5,5,5,5,5,5,0x65,5,5,5,5,5,5,5,5,5,
+0x165,5,5,0x765,5,5,5,0x12a5,5,0x365,5,5,5,5,5,5,
+#else /* U_DARWIN */
+0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x1b,0x1b,
+0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
+0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,6,6,6,6,
+6,6,6,6,6,6,6,6,6,6,6,6,0x11,0x11,0x11,0x11,
+0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,
+0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0,0,5,5,5,5,
+#endif /* U_DARWIN */
+5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
+#ifndef U_DARWIN
+5,0x165,5,5,5,5,5,5,5,0x165,5,5,5,5,5,5,
+#else /* U_DARWIN */
+5,5,0x65,5,5,5,5,5,5,5,5,5,0x165,5,5,0x765,
+5,5,5,0x12a5,5,0x365,5,5,5,5,5,5,5,5,5,5,
+5,5,5,5,5,5,5,5,5,5,5,5,5,0x165,5,5,
+5,5,5,5,5,0x165,5,5,5,5,5,5,5,5,5,5,
+#endif /* U_DARWIN */
+5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
+#ifdef U_DARWIN
+5,5,0x165,5,5,5,5,5,5,5,5,5,5,5,5,5,
+0x165,0x265,0x365,5,0x265,5,5,5,5,5,5,5,5,5,5,5,
+#endif /* U_DARWIN */
+5,5,5,5,5,5,0x165,5,5,5,5,5,5,5,5,5,
+#ifndef U_DARWIN
+5,5,5,5,0x165,0x265,0x365,5,0x265,5,5,5,5,5,5,5,
+5,5,5,5,5,5,5,5,5,5,0x165,5,5,5,5,5,
+#else /* U_DARWIN */
+5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,0x265,
+#endif /* U_DARWIN */
+5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
+#ifndef U_DARWIN
+5,5,5,0x265,5,5,5,5,5,5,5,5,5,5,5,5,
+#else /* U_DARWIN */
+5,5,5,5,5,5,5,5,5,5,5,5,0x265,5,5,5,
+5,5,5,5,0x565,5,0x465,5,5,5,5,5,5,5,5,5,
+5,0x265,5,0x865,5,0x665,5,5,5,5,5,5,5,5,5,5,
+5,5,5,5,5,5,5,5,5,5,0x265,5,5,5,5,0x265,
+#endif /* U_DARWIN */
+5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
+#ifndef U_DARWIN
+0x265,5,5,5,5,5,5,5,0x565,5,0x465,5,5,5,5,5,
+5,5,5,5,5,0x265,5,0x865,5,0x665,5,5,5,5,5,5,
+5,5,5,5,5,5,5,5,5,5,5,5,5,5,0x265,5,
+5,5,5,0x265,5,5,5,5,5,5,5,5,5,5,5,5,
+5,5,5,5,0x265,5,5,5,5,5,5,5,5,5,5,5,
+5,5,5,5,0x365,5,5,5,5,5,5,5,5,5,5,5,
+5,5,5,5,5,5,5,5,5,5,5,5,5,0x365,0x365,0x365,
+#else /* U_DARWIN */
+0x265,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
+#endif /* U_DARWIN */
+0x365,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
+#ifndef U_DARWIN
+5,5,5,5,5,5,5,5,5,5,5,5,5,5,0x665,5,
+#else /* U_DARWIN */
+5,5,5,5,5,5,5,5,5,0x365,0x365,0x365,0x365,5,5,5,
+#endif /* U_DARWIN */
+5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
+#ifndef U_DARWIN
+5,0x365,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
+#else /* U_DARWIN */
+5,5,5,5,5,5,5,5,5,5,0x665,5,5,5,5,5,
+#endif /* U_DARWIN */
+5,5,5,5,5,5,5,5,5,5,5,5,5,0x365,5,5,
+5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
+#ifndef U_DARWIN
+5,5,5,5,5,5,5,5,0x365,5,5,5,5,5,5,5,
+#else /* U_DARWIN */
+5,5,5,5,5,5,5,5,5,0x365,5,5,5,5,5,5,
+#endif /* U_DARWIN */
+5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
+#ifndef U_DARWIN
+5,5,5,5,5,5,5,0x365,5,5,5,5,5,5,5,5,
+#else /* U_DARWIN */
+5,5,5,5,0x365,5,5,5,5,5,5,5,5,5,5,5,
+5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
+5,5,5,0x365,5,5,5,5,5,5,5,5,5,5,5,5,
+5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,0x465,
+5,5,5,5,5,5,0x465,5,5,5,5,5,5,5,5,5,
+#endif /* U_DARWIN */
+5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
+#ifndef U_DARWIN
+5,5,5,0x465,5,5,5,5,5,5,0x465,5,5,5,5,5,
+#else /* U_DARWIN */
+0x465,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
+5,5,5,5,5,5,5,5,5,5,5,5,5,5,0x465,5,
+#endif /* U_DARWIN */
+5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
+#ifndef U_DARWIN
+5,5,5,5,0x465,5,5,5,5,5,5,5,5,5,5,5,
+#else /* U_DARWIN */
+5,5,5,5,5,5,5,5,5,5,5,5,5,0x465,5,5,
+#endif /* U_DARWIN */
+5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
+#ifndef U_DARWIN
+5,5,0x465,5,5,5,5,5,5,5,5,5,5,5,5,5,
+#else /* U_DARWIN */
+5,0x565,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
+5,5,5,5,5,5,5,5,5,5,5,5,5,5,0x565,5,
+#endif /* U_DARWIN */
+5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
+#ifndef U_DARWIN
+5,0x465,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
+#endif /* not U_DARWIN */
+5,5,5,5,5,0x565,5,5,5,5,5,5,5,5,5,5,
+5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
+#ifndef U_DARWIN
+5,5,0x565,5,5,5,5,5,5,5,5,5,5,5,5,5,
+5,5,5,5,5,5,5,5,5,0x565,5,5,5,5,5,5,
+#else /* U_DARWIN */
+5,5,5,5,5,5,0x665,5,5,5,5,5,0x6465,5,5,5,
+#endif /* U_DARWIN */
+5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
+#ifndef U_DARWIN
+5,5,5,5,5,5,5,5,5,5,0x665,5,5,5,5,5,
+0x6465,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
+5,5,5,5,5,5,5,5,5,5,5,5,0x665,5,5,5,
+#else /* U_DARWIN */
+5,5,5,5,5,5,5,5,0x665,5,5,5,5,5,5,5,
+5,5,5,5,5,5,5,5,5,0x765,5,5,5,5,5,5,
+5,5,5,5,5,5,5,5,5,5,5,5,5,5,0x765,5,
+#endif /* U_DARWIN */
+5,5,5,5,5,5,5,5,5,5,5,5,5,0x765,5,5,
+5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
+#ifndef U_DARWIN
+5,5,0x765,5,5,5,5,5,5,5,5,5,5,5,5,5,
+5,0x765,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
+#else /* U_DARWIN */
+5,5,5,5,5,5,5,5,5,5,5,5,0x865,5,5,5,
+#endif /* U_DARWIN */
+5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
+#ifndef U_DARWIN
+0x865,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
+#else /* U_DARWIN */
+5,5,5,5,5,5,5,5,5,5,5,5,5,0x965,5,5,
+#endif /* U_DARWIN */
+5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
+#ifndef U_DARWIN
+5,0x965,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
+#else /* U_DARWIN */
+5,5,5,5,5,5,5,5,5,5,5,5,5,5,0x965,0x1465,
+#endif /* U_DARWIN */
+5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
+#ifndef U_DARWIN
+5,5,0x965,0x1465,5,5,5,5,5,5,5,5,5,5,5,5,
+5,5,5,5,5,5,5,5,5,5,0x965,5,5,5,5,5,
+5,5,5,5,0xa65,5,5,5,5,5,5,5,5,5,5,5,
+#else /* U_DARWIN */
+5,5,5,5,5,5,0x965,5,5,5,5,5,5,5,5,5,
+0xa65,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
+5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,0x11a5,
+5,0xa65,5,0x11a5,0x1465,0x1e65,5,5,5,5,5,5,0x2865,5,5,5,
+#endif /* U_DARWIN */
+5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
+#ifndef U_DARWIN
+5,5,5,0x11a5,5,0xa65,5,0x11a5,0x1465,0x1e65,5,5,5,5,5,5,
+0x2865,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
+#else /* U_DARWIN */
+5,5,5,5,5,5,5,5,5,5,5,5,5,5,0xa65,5,
+5,5,5,0x1e65,5,5,5,5,5,5,5,5,0x2865,5,5,5,
+5,5,5,5,5,5,5,5,5,5,5,5,0x2865,5,5,5,
+#endif /* U_DARWIN */
+5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
+#ifndef U_DARWIN
+5,5,0xa65,5,5,5,5,0x1e65,5,5,5,5,5,5,5,5,
+0x2865,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
+0x2865,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
+5,5,5,5,0x6465,5,5,5,5,5,5,5,5,5,5,5,
+#else /* U_DARWIN */
+0x6465,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
+#endif /* U_DARWIN */
+5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
+#ifndef U_DARWIN
+5,5,5,5,5,5,0x6465,5,5,5,5,5,5,5,5,5,
+5,5,5,5,0x12a5,5,5,5,5,5,5,5,5,5,5,5,
+#else /* U_DARWIN */
+5,5,0x6465,5,5,5,5,5,5,5,5,5,5,5,5,5,
+0x12a5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
+#endif /* U_DARWIN */
+5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
+#ifndef U_DARWIN
+5,5,5,5,5,5,5,0x16a5,5,5,5,5,0x16a5,5,5,5,
+#else /* U_DARWIN */
+5,5,5,0x16a5,5,5,5,5,0x16a5,5,5,5,5,5,5,5,
+#endif /* U_DARWIN */
+5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
+#ifndef U_DARWIN
+5,5,5,5,5,5,5,5,5,5,0x1aa5,5,5,5,5,5,
+#else /* U_DARWIN */
+5,5,5,5,5,5,0x1aa5,5,5,5,5,5,5,5,5,5,
+#endif /* U_DARWIN */
+5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
+#ifndef U_DARWIN
+5,5,5,5,0x820,0x840,0x860,0,0,0,0,0,0x880,0x8a0,0,0,
+#else /* U_DARWIN */
+0x820,0x840,0x860,0,0,0,0,0,0x880,0x8a0,0,0,0,0,0,0,
+#endif /* U_DARWIN */
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+#ifndef U_DARWIN
+0,0,0,0,0x8c0,0x8e0,0,0,0,0,0,0,0,0,0,0,
+0x900,0x920,0x940,0x920,0x920,0x920,0x920,0x920,0x960,0x920,0x980,0x920,0x920,0x920,0x9a0,0x920,
+0x920,0x920,0x920,0x920,0x920,0x920,0x920,0x920,0x9c0,0x920,0x920,0x920,0x920,0x920,0x920,0x920,
+0x920,0x920,0x920,0x920,0x920,0x9e0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0xa00,0,0xa20,0,0,0,
+#else /* U_DARWIN */
+0x8c0,0x8e0,0,0,0,0,0,0,0,0,0,0,0x900,0x920,0x940,0x920,
+0x920,0x920,0x920,0x920,0x960,0x920,0x980,0x920,0x920,0x920,0x9a0,0x920,0x920,0x920,0x920,0x920,
+0x920,0x920,0x920,0x920,0x9c0,0x920,0x920,0x920,0x920,0x920,0x920,0x920,0x920,0x920,0x920,0x920,
+0x920,0x9e0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0xa00,0,0xa20,0,0,0,0,0,0,0,
+#endif /* U_DARWIN */
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+#ifndef U_DARWIN
+0,0,0,0,0,0,0,0,0,0,0,0,0xa40,0xa40,0xa40,0xa40,
+#else /* U_DARWIN */
+0,0,0,0,0,0,0,0,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,
+#endif /* U_DARWIN */
+0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,
+#ifndef U_DARWIN
+0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa60
+#else /* U_DARWIN */
+0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa60
+#endif /* U_DARWIN */
+};
+
+static const UTrie propsTrie={
+ propsTrie_index,
+ NULL,
+ utrie_defaultGetFoldingOffset,
+ 2688,
+#ifndef U_DARWIN
+ 10752,
+#else /* U_DARWIN */
+ 10924,
+#endif /* U_DARWIN */
+ 0,
+ TRUE
+};
+
+#ifndef U_DARWIN
+static const uint16_t propsVectorsTrie_index[16924]={
+0x2a8,0x2b0,0x2b8,0x2c0,0x2c8,0x2d0,0x2d8,0x2e0,0xb1b,0xb22,0xb2a,0xb31,0xb39,0xb41,0xb49,0xb51,
+0xb58,0xde3,0xb60,0xb64,0xb67,0xb6d,0xa52,0xb75,0xcdc,0xcdc,0xce4,0x340,0x348,0x350,0x358,0xb7d,
+0xba9,0xca7,0xb85,0xb8d,0x360,0xb93,0xb9b,0xba1,0x860,0x368,0x36d,0x375,0x37c,0xcbc,0x384,0x38a,
+0x392,0x39a,0x3a2,0xbb9,0xbc9,0xbcb,0xbb1,0xbc1,0x3aa,0xdeb,0x3b2,0x91a,0xdf3,0x3ba,0x1016,0x9cc,
+#else /* U_DARWIN */
+static const uint16_t propsVectorsTrie_index[17132]={
+0x2a8,0x2b0,0x2b8,0x2c0,0x2c8,0x2d0,0x2d8,0x2e0,0xb2b,0xb32,0xb3a,0xb41,0xb49,0xb51,0xb59,0xb61,
+0xb68,0xe17,0xb70,0xb74,0xb77,0xb7d,0xa5a,0xb85,0xd10,0xd10,0xd18,0x340,0x348,0x350,0x358,0xb8d,
+0xbb9,0xcd3,0xb95,0xb9d,0x360,0xba3,0xbab,0xbb1,0x860,0x368,0x36d,0x375,0x37c,0xcf0,0x384,0x38a,
+0x392,0x39a,0x3a2,0xbc9,0xbd9,0xbdb,0xbc1,0xbd1,0x3aa,0xe1f,0x3b2,0x91a,0xe27,0x3ba,0x104a,0x9cc,
+#endif /* U_DARWIN */
+0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x3c2,0x3c8,0x3d0,0x3d8,0x3e0,0x3e6,0x3ee,0x3f6,
+0x3fe,0x404,0x40c,0x414,0x41c,0x422,0x42a,0x432,0x43a,0x440,0x448,0x450,0x458,0x460,0x468,0x46f,
+0x477,0x47d,0x485,0x48d,0x495,0x49b,0x4a3,0x4ab,0x4b3,0x4b9,0x4c1,0x4c9,0x4d1,0x4d8,0x4e0,0x4e8,
+#ifndef U_DARWIN
+0x4f0,0x4f4,0x4fc,0x503,0x50b,0x513,0x51b,0x523,0xdad,0xdb5,0x52b,0x533,0x53b,0x543,0x54b,0x550,
+0xe70,0x558,0x560,0x567,0x567,0xbd3,0x56f,0x573,0xd74,0xd74,0x57b,0xd84,0xd85,0x583,0xd7c,0x585,
+0xdfb,0xdfd,0x58d,0xdfd,0x595,0x59a,0x5a2,0xe02,0x5a8,0xdfd,0x5ae,0x5b6,0x959,0xe0a,0xe0a,0x5be,
+0x5c6,0xe12,0xe12,0xe12,0xe12,0xe12,0xe12,0xe12,0xe12,0xe12,0xe12,0xe12,0xe12,0xe12,0xe12,0xe12,
+0xe12,0xe12,0xe12,0x5cb,0x5d3,0xe1a,0xe1a,0x5db,0x868,0x870,0x878,0x880,0xe80,0xe78,0x5e3,0x5eb,
+0x5f3,0xe22,0xe2a,0x5fb,0xe22,0x2e8,0x2a0,0x2a0,0x897,0x89f,0x8a7,0x8ac,0x100e,0x994,0x99c,0xf5e,
+0x922,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x101e,0x1023,0x9d4,0x9dc,0x2a0,0x2a0,0x2a0,0x2a0,
+0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0xf7e,0xf66,0xf76,0xf6e,0xfee,0xfe6,0x936,0x939,
+0xbdb,0xbdb,0xbdb,0xbdb,0x603,0xbdb,0xbdb,0x60b,0x613,0xbe3,0x617,0x61f,0xbe3,0x627,0x62f,0x637,
+0xa62,0xa5a,0xbeb,0x63f,0x647,0x64f,0x655,0x65d,0xa6a,0xa72,0x665,0xa7a,0x66d,0xbf3,0xa82,0xbfa,
+0xa8a,0xa92,0xa9a,0xaa2,0xaaa,0xab1,0xc02,0xc0a,0xab9,0xc12,0xc15,0xc17,0xe32,0xf13,0xf19,0x675,
+0xc1f,0x67d,0x685,0xac1,0xac6,0xac9,0xacf,0xa42,0xad7,0xad7,0xadc,0xa4a,0xae4,0xaec,0xaf4,0xafc,
+0xb04,0xc27,0xb0b,0xb13,0x68d,0x695,0x69a,0x69a,0x6a2,0x6a8,0x6b0,0x6b8,0x6c0,0x6c6,0x888,0x88f,
+0xe3a,0xe3a,0xe3a,0xe3a,0xe3a,0xe3a,0xe3a,0xe3a,0xf21,0xf21,0xf21,0xf21,0xf29,0xf30,0xf32,0xf39,
+0xf41,0xf45,0xf45,0xf48,0xf45,0xf45,0xf4e,0xf45,0x8b4,0x8bc,0x8bd,0x8bd,0x8bd,0x8bd,0x8bd,0x8bd,
+0xfd6,0x969,0x96d,0x9e4,0xfc6,0xfc6,0xfc6,0x941,0xfce,0x961,0xffe,0x9bc,0x949,0x951,0x951,0x2a0,
+0x9ac,0x9b4,0x9b4,0x9b4,0x6ce,0xe42,0xe42,0x6d6,0xe4a,0xe4a,0xe4a,0xe4a,0xe4a,0xe4a,0x6de,0x2ec,
+0xcd4,0xcec,0x6e6,0xcf4,0x6ee,0xcfc,0xd04,0xd0c,0x6f6,0x6fb,0xd14,0xd1b,0x700,0x708,0x92a,0x92e,
+0x710,0xd2b,0x718,0xd23,0xd34,0xd38,0xd30,0x720,0xd56,0xd56,0xd40,0xd46,0xd56,0xd56,0xd57,0xd4e,
+0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,
+0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,
+0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,
+0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,
+0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,
+0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,
+0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,
+0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,
+0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,
+0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,
+0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,
+0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,
+0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0x728,0xf86,0xf86,
+0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,
+0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,
+0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,
+0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,
+0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,
+0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,
+0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,
+0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,
+0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,
+0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,
+0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,
+0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,
+0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,
+0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,
+0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,
+0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,
+0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,
+0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,
+0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,
+0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,
+0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,
+0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,
+0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,
+0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,
+0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,
+0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,
+0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,
+0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,
+0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,
+0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,
+0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,
+0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,
+0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,
+0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,
+0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,
+0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,
+0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,
+0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,
+0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,
+0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,
+0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0x730,0x737,0x737,
+0xe5a,0xe60,0xe60,0xe60,0xe60,0xe60,0xe60,0xe60,0xe60,0xe60,0xe60,0xe60,0xe60,0xe60,0xe60,0xe60,
+0xe60,0xe60,0xe60,0xe60,0xe60,0xe60,0xe60,0xe60,0xe60,0xe60,0xe60,0xe60,0xe60,0xe60,0xe60,0xe60,
+0xe60,0xe60,0xe60,0xe60,0x73f,0xe68,0x2f4,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,
+#else /* U_DARWIN */
+0x4f0,0x4f4,0x4fc,0x503,0x50b,0x513,0x51b,0x523,0xde1,0xde9,0x52b,0x533,0x53b,0x543,0x54b,0x550,
+0xea4,0x558,0x560,0x567,0x567,0xbe3,0x56f,0x573,0xda8,0xda8,0x57b,0xdb8,0xdb9,0x583,0xdb0,0x585,
+0xe2f,0xe31,0x58d,0xe31,0x595,0x59a,0x5a2,0xe36,0x5a8,0xe31,0x5ae,0x5b6,0x959,0xe3e,0xe3e,0x5be,
+0x5c6,0xe46,0xe46,0xe46,0xe46,0xe46,0xe46,0xe46,0xe46,0xe46,0xe46,0xe46,0xe46,0xe46,0xe46,0xe46,
+0xe46,0xe46,0xe46,0x5cb,0x5d3,0xe4e,0xe4e,0x5db,0x868,0x870,0x878,0x880,0xeb4,0xeac,0x5e3,0x5eb,
+0x5f3,0xe56,0xe5e,0x5fb,0xe56,0x2e8,0x2a0,0x2a0,0x897,0x89f,0x8a7,0x8ac,0x1042,0x994,0x99c,0xf92,
+0x922,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x1052,0x1057,0x9d4,0x9dc,0x2a0,0x2a0,0x2a0,0x2a0,
+0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0xfb2,0xf9a,0xfaa,0xfa2,0x1022,0x101a,0x936,0x939,
+0xbeb,0xbeb,0xbeb,0xbeb,0x603,0xbeb,0xbeb,0x60b,0x613,0xbf3,0x617,0x61f,0xbf3,0x627,0x62f,0x637,
+0xa6a,0xa62,0xbfb,0x63f,0x647,0x64f,0x655,0x65d,0xa72,0xa7a,0x665,0xa82,0x66d,0xc03,0xa8a,0xc0a,
+0xa92,0xa9a,0xaa2,0xaaa,0xab2,0xab9,0xc12,0xc1a,0xac1,0xc22,0xc25,0xc27,0xe66,0xf47,0xf4d,0x675,
+0xc2f,0x67d,0x685,0xac9,0xace,0xad1,0xad7,0xa4a,0xadf,0xadf,0xae4,0xa52,0xaec,0xaf4,0xafc,0xb04,
+0xb0c,0xc37,0xb13,0xb1b,0x68d,0x695,0x69a,0x69a,0x6a2,0x6a8,0x6b0,0x6b8,0x6c0,0x6c6,0x888,0x88f,
+0xe6e,0xe6e,0xe6e,0xe6e,0xe6e,0xe6e,0xe6e,0xe6e,0xf55,0xf55,0xf55,0xf55,0xf5d,0xf64,0xf66,0xf6d,
+0xf75,0xf79,0xf79,0xf7c,0xf79,0xf79,0xf82,0xf79,0x8b4,0x8bc,0x8bd,0x8bd,0x8bd,0x8bd,0x8bd,0x8bd,
+0x100a,0x969,0x96d,0x9e4,0xffa,0xffa,0xffa,0x941,0x1002,0x961,0x1032,0x9bc,0x949,0x951,0x951,0x2a0,
+0x9ac,0x9b4,0x9b4,0x9b4,0x6ce,0xe76,0xe76,0x6d6,0xe7e,0xe7e,0xe7e,0xe7e,0xe7e,0xe7e,0x6de,0x2ec,
+0xd08,0xd20,0x6e6,0xd28,0x6ee,0xd30,0xd38,0xd40,0x6f6,0x6fb,0xd48,0xd4f,0x700,0x708,0x92a,0x92e,
+0x710,0xd5f,0x718,0xd57,0xd68,0xd6c,0xd64,0x720,0xd8a,0xd8a,0xd74,0xd7a,0xd8a,0xd8a,0xd8b,0xd82,
+0xe86,0xe86,0xe86,0xe86,0xe86,0xe86,0xe86,0xe86,0xe86,0xe86,0xe86,0xe86,0xe86,0xe86,0xe86,0xe86,
+0xe86,0xe86,0xe86,0xe86,0xe86,0xe86,0xe86,0xe86,0xe86,0xe86,0xe86,0xe86,0xe86,0xe86,0xe86,0xe86,
+0xe86,0xe86,0xe86,0xe86,0xe86,0xe86,0xe86,0xe86,0xe86,0xe86,0xe86,0xe86,0xe86,0xe86,0xe86,0xe86,
+0xe86,0xe86,0xe86,0xe86,0xe86,0xe86,0xe86,0xe86,0xe86,0xe86,0xe86,0xe86,0xe86,0xe86,0xe86,0xe86,
+0xe86,0xe86,0xe86,0xe86,0xe86,0xe86,0xe86,0xe86,0xe86,0xe86,0xe86,0xe86,0xe86,0xe86,0xe86,0xe86,
+0xe86,0xe86,0xe86,0xe86,0xe86,0xe86,0xe86,0xe86,0xe86,0xe86,0xe86,0xe86,0xe86,0xe86,0xe86,0xe86,
+0xe86,0xe86,0xe86,0xe86,0xe86,0xe86,0xe86,0xe86,0xe86,0xe86,0xe86,0xe86,0xe86,0xe86,0xe86,0xe86,
+0xe86,0xe86,0xe86,0xe86,0xe86,0xe86,0xe86,0xe86,0xe86,0xe86,0xe86,0xe86,0xe86,0xe86,0xe86,0xe86,
+0xe86,0xe86,0xe86,0xe86,0xe86,0xe86,0xe86,0xe86,0xe86,0xe86,0xe86,0xe86,0xe86,0xe86,0xe86,0xe86,
+0xe86,0xe86,0xe86,0xe86,0xe86,0xe86,0xe86,0xe86,0xe86,0xe86,0xe86,0xe86,0xe86,0xe86,0xe86,0xe86,
+0xe86,0xe86,0xe86,0xe86,0xe86,0xe86,0xe86,0xe86,0xe86,0xe86,0xe86,0xe86,0xe86,0xe86,0xe86,0xe86,
+0xe86,0xe86,0xe86,0xe86,0xe86,0xe86,0xe86,0xe86,0xe86,0xe86,0xe86,0xe86,0xe86,0xe86,0xe86,0xe86,
+0xe86,0xe86,0xe86,0xe86,0xe86,0xe86,0xe86,0xe86,0xe86,0xe86,0xe86,0xe86,0xe86,0x728,0xfba,0xfba,
+0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,
+0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,
+0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,
+0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,
+0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,
+0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,
+0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,
+0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,
+0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,
+0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,
+0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,
+0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,
+0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,
+0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,
+0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,
+0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,
+0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,
+0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,
+0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,
+0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,
+0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,
+0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,
+0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,
+0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,
+0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,
+0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,
+0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,
+0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,
+0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,
+0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,
+0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,
+0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,
+0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,
+0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,
+0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,
+0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,
+0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,
+0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,
+0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,
+0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,
+0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0xd93,0x730,0x737,0x737,
+0xe8e,0xe94,0xe94,0xe94,0xe94,0xe94,0xe94,0xe94,0xe94,0xe94,0xe94,0xe94,0xe94,0xe94,0xe94,0xe94,
+0xe94,0xe94,0xe94,0xe94,0xe94,0xe94,0xe94,0xe94,0xe94,0xe94,0xe94,0xe94,0xe94,0xe94,0xe94,0xe94,
+0xe94,0xe94,0xe94,0xe94,0x73f,0xe9c,0x2f4,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,
+#endif /* U_DARWIN */
+0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x98c,0x9ec,0x9ed,0x9ed,0x9ed,0x9ed,0x9ed,0x9ed,
+#ifndef U_DARWIN
+0xff6,0x2fc,0x102b,0x9f5,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,
+#else /* U_DARWIN */
+0x102a,0x2fc,0x105f,0x9f5,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,
+#endif /* U_DARWIN */
+0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,
+#ifndef U_DARWIN
+0xdd5,0xdd6,0xdd7,0xdd8,0xdd9,0xdda,0xddb,0xdd5,0xdd6,0xdd7,0xdd8,0xdd9,0xdda,0xddb,0xdd5,0xdd6,
+0xdd7,0xdd8,0xdd9,0xdda,0xddb,0xdd5,0xdd6,0xdd7,0xdd8,0xdd9,0xdda,0xddb,0xdd5,0xdd6,0xdd7,0xdd8,
+0xdd9,0xdda,0xddb,0xdd5,0xdd6,0xdd7,0xdd8,0xdd9,0xdda,0xddb,0xdd5,0xdd6,0xdd7,0xdd8,0xdd9,0xdda,
+0xddb,0xdd5,0xdd6,0xdd7,0xdd8,0xdd9,0xdda,0xddb,0xdd5,0xdd6,0xdd7,0xdd8,0xdd9,0xdda,0xddb,0xdd5,
+0xdd6,0xdd7,0xdd8,0xdd9,0xdda,0xddb,0xdd5,0xdd6,0xdd7,0xdd8,0xdd9,0xdda,0xddb,0xdd5,0xdd6,0xdd7,
+0xdd8,0xdd9,0xdda,0xddb,0xdd5,0xdd6,0xdd7,0xdd8,0xdd9,0xdda,0xddb,0xdd5,0xdd6,0xdd7,0xdd8,0xdd9,
+0xdda,0xddb,0xdd5,0xdd6,0xdd7,0xdd8,0xdd9,0xdda,0xddb,0xdd5,0xdd6,0xdd7,0xdd8,0xdd9,0xdda,0xddb,
+0xdd5,0xdd6,0xdd7,0xdd8,0xdd9,0xdda,0xddb,0xdd5,0xdd6,0xdd7,0xdd8,0xdd9,0xdda,0xddb,0xdd5,0xdd6,
+0xdd7,0xdd8,0xdd9,0xdda,0xddb,0xdd5,0xdd6,0xdd7,0xdd8,0xdd9,0xdda,0xddb,0xdd5,0xdd6,0xdd7,0xdd8,
+0xdd9,0xdda,0xddb,0xdd5,0xdd6,0xdd7,0xdd8,0xdd9,0xdda,0xddb,0xdd5,0xdd6,0xdd7,0xdd8,0xdd9,0xdda,
+0xddb,0xdd5,0xdd6,0xdd7,0xdd8,0xdd9,0xdda,0xddb,0xdd5,0xdd6,0xdd7,0xdd8,0xdd9,0xdda,0xddb,0xdd5,
+0xdd6,0xdd7,0xdd8,0xdd9,0xdda,0xddb,0xdd5,0xdd6,0xdd7,0xdd8,0xdd9,0xdda,0xddb,0xdd5,0xdd6,0xdd7,
+0xdd8,0xdd9,0xdda,0xddb,0xdd5,0xdd6,0xdd7,0xdd8,0xdd9,0xdda,0xddb,0xdd5,0xdd6,0xdd7,0xdd8,0xdd9,
+0xdda,0xddb,0xdd5,0xdd6,0xdd7,0xdd8,0xdd9,0xdda,0xddb,0xdd5,0xdd6,0xdd7,0xdd8,0xdd9,0xdda,0xddb,
+0xdd5,0xdd6,0xdd7,0xdd8,0xdd9,0xdda,0xddb,0xdd5,0xdd6,0xdd7,0xdd8,0xdd9,0xdda,0xddb,0xdd5,0xdd6,
+0xdd7,0xdd8,0xdd9,0xdda,0xddb,0xdd5,0xdd6,0xdd7,0xdd8,0xdd9,0xdda,0xddb,0xdd5,0xdd6,0xdd7,0xdd8,
+0xdd9,0xdda,0xddb,0xdd5,0xdd6,0xdd7,0xdd8,0xdd9,0xdda,0xddb,0xdd5,0xdd6,0xdd7,0xdd8,0xdd9,0xdda,
+0xddb,0xdd5,0xdd6,0xdd7,0xdd8,0xdd9,0xdda,0xddb,0xdd5,0xdd6,0xdd7,0xdd8,0xdd9,0xdda,0xddb,0xdd5,
+0xdd6,0xdd7,0xdd8,0xdd9,0xdda,0xddb,0xdd5,0xdd6,0xdd7,0xdd8,0xdd9,0xdda,0xddb,0xdd5,0xdd6,0xdd7,
+0xdd8,0xdd9,0xdda,0xddb,0xdd5,0xdd6,0xdd7,0xdd8,0xdd9,0xdda,0xddb,0xdd5,0xdd6,0xdd7,0xdd8,0xdd9,
+0xdda,0xddb,0xdd5,0xdd6,0xdd7,0xdd8,0xdd9,0xdda,0xddb,0xdd5,0xdd6,0xdd7,0xdd8,0xdd9,0xdda,0xddb,
+0xdd5,0xdd6,0xdd7,0xdd8,0xdd9,0xdda,0xddb,0xdd5,0xdd6,0xdd7,0xdd8,0xdd9,0xdda,0x304,0x2a0,0x2a0,
+0x1043,0x1046,0x104e,0x1054,0x105c,0x105d,0x2a0,0x1065,0x2a0,0x1065,0x2a0,0x1065,0x2a0,0x1065,0x2a0,0x1065,
+0x2a0,0x1065,0x2a0,0x1065,0x2a0,0x1065,0x2a0,0x1065,0x2a0,0x1065,0x106d,0x1065,0x1075,0x1076,0x107e,0x107f,
+0xdcd,0xdcd,0xdcd,0xdcd,0xdcd,0xdcd,0xdcd,0xdcd,0xdcd,0xdcd,0xdcd,0xdcd,0xdcd,0xdcd,0xdcd,0xdcd,
+0xdcd,0xdcd,0xdcd,0xdcd,0xdcd,0xdcd,0xdcd,0xdcd,0xdcd,0xdcd,0xdcd,0xdcd,0xdcd,0xdcd,0xdcd,0xdcd,
+#else /* U_DARWIN */
+0xe09,0xe0a,0xe0b,0xe0c,0xe0d,0xe0e,0xe0f,0xe09,0xe0a,0xe0b,0xe0c,0xe0d,0xe0e,0xe0f,0xe09,0xe0a,
+0xe0b,0xe0c,0xe0d,0xe0e,0xe0f,0xe09,0xe0a,0xe0b,0xe0c,0xe0d,0xe0e,0xe0f,0xe09,0xe0a,0xe0b,0xe0c,
+0xe0d,0xe0e,0xe0f,0xe09,0xe0a,0xe0b,0xe0c,0xe0d,0xe0e,0xe0f,0xe09,0xe0a,0xe0b,0xe0c,0xe0d,0xe0e,
+0xe0f,0xe09,0xe0a,0xe0b,0xe0c,0xe0d,0xe0e,0xe0f,0xe09,0xe0a,0xe0b,0xe0c,0xe0d,0xe0e,0xe0f,0xe09,
+0xe0a,0xe0b,0xe0c,0xe0d,0xe0e,0xe0f,0xe09,0xe0a,0xe0b,0xe0c,0xe0d,0xe0e,0xe0f,0xe09,0xe0a,0xe0b,
+0xe0c,0xe0d,0xe0e,0xe0f,0xe09,0xe0a,0xe0b,0xe0c,0xe0d,0xe0e,0xe0f,0xe09,0xe0a,0xe0b,0xe0c,0xe0d,
+0xe0e,0xe0f,0xe09,0xe0a,0xe0b,0xe0c,0xe0d,0xe0e,0xe0f,0xe09,0xe0a,0xe0b,0xe0c,0xe0d,0xe0e,0xe0f,
+0xe09,0xe0a,0xe0b,0xe0c,0xe0d,0xe0e,0xe0f,0xe09,0xe0a,0xe0b,0xe0c,0xe0d,0xe0e,0xe0f,0xe09,0xe0a,
+0xe0b,0xe0c,0xe0d,0xe0e,0xe0f,0xe09,0xe0a,0xe0b,0xe0c,0xe0d,0xe0e,0xe0f,0xe09,0xe0a,0xe0b,0xe0c,
+0xe0d,0xe0e,0xe0f,0xe09,0xe0a,0xe0b,0xe0c,0xe0d,0xe0e,0xe0f,0xe09,0xe0a,0xe0b,0xe0c,0xe0d,0xe0e,
+0xe0f,0xe09,0xe0a,0xe0b,0xe0c,0xe0d,0xe0e,0xe0f,0xe09,0xe0a,0xe0b,0xe0c,0xe0d,0xe0e,0xe0f,0xe09,
+0xe0a,0xe0b,0xe0c,0xe0d,0xe0e,0xe0f,0xe09,0xe0a,0xe0b,0xe0c,0xe0d,0xe0e,0xe0f,0xe09,0xe0a,0xe0b,
+0xe0c,0xe0d,0xe0e,0xe0f,0xe09,0xe0a,0xe0b,0xe0c,0xe0d,0xe0e,0xe0f,0xe09,0xe0a,0xe0b,0xe0c,0xe0d,
+0xe0e,0xe0f,0xe09,0xe0a,0xe0b,0xe0c,0xe0d,0xe0e,0xe0f,0xe09,0xe0a,0xe0b,0xe0c,0xe0d,0xe0e,0xe0f,
+0xe09,0xe0a,0xe0b,0xe0c,0xe0d,0xe0e,0xe0f,0xe09,0xe0a,0xe0b,0xe0c,0xe0d,0xe0e,0xe0f,0xe09,0xe0a,
+0xe0b,0xe0c,0xe0d,0xe0e,0xe0f,0xe09,0xe0a,0xe0b,0xe0c,0xe0d,0xe0e,0xe0f,0xe09,0xe0a,0xe0b,0xe0c,
+0xe0d,0xe0e,0xe0f,0xe09,0xe0a,0xe0b,0xe0c,0xe0d,0xe0e,0xe0f,0xe09,0xe0a,0xe0b,0xe0c,0xe0d,0xe0e,
+0xe0f,0xe09,0xe0a,0xe0b,0xe0c,0xe0d,0xe0e,0xe0f,0xe09,0xe0a,0xe0b,0xe0c,0xe0d,0xe0e,0xe0f,0xe09,
+0xe0a,0xe0b,0xe0c,0xe0d,0xe0e,0xe0f,0xe09,0xe0a,0xe0b,0xe0c,0xe0d,0xe0e,0xe0f,0xe09,0xe0a,0xe0b,
+0xe0c,0xe0d,0xe0e,0xe0f,0xe09,0xe0a,0xe0b,0xe0c,0xe0d,0xe0e,0xe0f,0xe09,0xe0a,0xe0b,0xe0c,0xe0d,
+0xe0e,0xe0f,0xe09,0xe0a,0xe0b,0xe0c,0xe0d,0xe0e,0xe0f,0xe09,0xe0a,0xe0b,0xe0c,0xe0d,0xe0e,0xe0f,
+0xe09,0xe0a,0xe0b,0xe0c,0xe0d,0xe0e,0xe0f,0xe09,0xe0a,0xe0b,0xe0c,0xe0d,0xe0e,0x304,0x2a0,0x2a0,
+0x1077,0x107a,0x1082,0x1088,0x1090,0x1091,0x2a0,0x1099,0x2a0,0x1099,0x2a0,0x1099,0x2a0,0x1099,0x2a0,0x1099,
+0x2a0,0x1099,0x2a0,0x1099,0x2a0,0x1099,0x2a0,0x1099,0x2a0,0x1099,0x10a1,0x1099,0x10a9,0x10aa,0x10b2,0x10b3,
+0xe01,0xe01,0xe01,0xe01,0xe01,0xe01,0xe01,0xe01,0xe01,0xe01,0xe01,0xe01,0xe01,0xe01,0xe01,0xe01,
+0xe01,0xe01,0xe01,0xe01,0xe01,0xe01,0xe01,0xe01,0xe01,0xe01,0xe01,0xe01,0xe01,0xe01,0xe01,0xe01,
+#endif /* U_DARWIN */
+0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,
+0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,
+0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,
+0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,
+0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,
+0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,
+0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,
+0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,
+0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,
+0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,
+0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,
+0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,
+#ifndef U_DARWIN
+0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xd67,0xd67,0xd67,0xd67,0xd67,0xd67,0xd67,0xd67,
+0xd6c,0x747,0xf56,0x74d,0x1006,0x1006,0x751,0x758,0x760,0x768,0x770,0xc3f,0xc46,0x778,0x77d,0xc4e,
+0xc84,0xc84,0xc2f,0xc37,0xc56,0xc7b,0xc7c,0xc8c,0xc5e,0xc63,0x785,0xc6b,0x78d,0xc73,0x795,0x799,
+0x9c4,0x7a1,0x7a9,0x7b1,0xc94,0xc9a,0xc9f,0x7b9,0x7c9,0xcc4,0xccc,0xcaf,0xcb4,0x7d1,0x7d9,0x7c1,
+0xdbd,0xdbd,0xdbd,0xdbd,0xdbd,0xdbd,0xdbd,0xdbd,0xdbd,0xdbd,0xdbd,0xdbd,0xdbd,0xdbd,0xdbd,0xdbd,
+0xdbd,0xdbd,0xdbd,0xdbd,0xdbd,0xdbd,0xdbd,0xdbd,0xdbd,0xdbd,0xdbd,0xdbd,0xdc5,0xdc5,0xdc5,0xdc5,
+0x8c5,0x8cc,0x8d4,0x8dc,0xf8e,0xf8e,0xf8e,0x8e4,0x8ec,0x8ef,0xfbe,0xfb6,0x30c,0x2a0,0x2a0,0x2a0,
+0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x7e1,0x7e9,0x314,0x2a0,0x8f7,0xfde,0x9a4,0x2a0,
+0xe95,0xe88,0xe8d,0xf96,0x8ff,0x31c,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,
+#else /* U_DARWIN */
+0xa42,0xc3f,0xc43,0xcdb,0xc4b,0xb23,0xc53,0xc3f,0xd9b,0xd9b,0xd9b,0xd9b,0xd9b,0xd9b,0xd9b,0xd9b,
+0xda0,0x747,0xf8a,0x74d,0x103a,0x103a,0x751,0x758,0x760,0x768,0x770,0xc6b,0xc72,0x778,0x77d,0xc7a,
+0xcb0,0xcb0,0xc5b,0xc63,0xc82,0xca7,0xca8,0xcb8,0xc8a,0xc8f,0x785,0xc97,0x78d,0xc9f,0x795,0x799,
+0x9c4,0x7a1,0x7a9,0x7b1,0xcc0,0xcc6,0xccb,0x7b9,0x7c9,0xcf8,0xd00,0xce3,0xce8,0x7d1,0x7d9,0x7c1,
+0xdf1,0xdf1,0xdf1,0xdf1,0xdf1,0xdf1,0xdf1,0xdf1,0xdf1,0xdf1,0xdf1,0xdf1,0xdf1,0xdf1,0xdf1,0xdf1,
+0xdf1,0xdf1,0xdf1,0xdf1,0xdf1,0xdf1,0xdf1,0xdf1,0xdf1,0xdf1,0xdf1,0xdf1,0xdf9,0xdf9,0xdf9,0xdf9,
+0x8c5,0x8cc,0x8d4,0x8dc,0xfc2,0xfc2,0xfc2,0x8e4,0x8ec,0x8ef,0xff2,0xfea,0x30c,0x2a0,0x2a0,0x2a0,
+0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x7e1,0x7e9,0x314,0x2a0,0x8f7,0x1012,0x9a4,0x2a0,
+0xec9,0xebc,0xec1,0xfca,0x8ff,0x31c,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,
+#endif /* U_DARWIN */
+0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,
+0x907,0x90a,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x9fd,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,
+0x975,0x97c,0x984,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,
+#ifndef U_DARWIN
+0x1033,0x1033,0x1033,0x1033,0x1033,0x1033,0x1033,0x1033,0x1033,0x1033,0x1033,0x1033,0x1033,0x1033,0x1033,0x1033,
+0x1033,0x1033,0x1033,0x1033,0x1033,0x1033,0x1033,0x1033,0x1033,0x1033,0x1033,0xa05,0xa09,0xa09,0xa09,0xa09,
+0x103b,0x103b,0x103b,0xa11,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,
+#else /* U_DARWIN */
+0x1067,0x1067,0x1067,0x1067,0x1067,0x1067,0x1067,0x1067,0x1067,0x1067,0x1067,0x1067,0x1067,0x1067,0x1067,0x1067,
+0x1067,0x1067,0x1067,0x1067,0x1067,0x1067,0x1067,0x1067,0x1067,0x1067,0x1067,0xa05,0xa09,0xa09,0xa09,0xa09,
+0x106f,0x106f,0x106f,0xa11,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,
+#endif /* U_DARWIN */
+0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,
+#ifndef U_DARWIN
+0xe9d,0xe9d,0xe9d,0xe9d,0xe9d,0xe9d,0xe9d,0x7f1,0xea5,0x7f9,0xea6,0xeae,0xeb6,0xebc,0x801,0x809,
+0xfae,0xfae,0x324,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0xf9e,0xf9e,0x912,0xa19,0x2a0,0x2a0,0x2a0,0x2a0,
+0xee5,0xee0,0x811,0xee3,0x819,0x821,0x829,0xee9,0x831,0x839,0x841,0xee2,0xeea,0xee5,0xee0,0xee8,
+0xee3,0xeeb,0xee6,0xee1,0xee9,0x848,0xec4,0xecc,0xed3,0xeda,0xec7,0xecf,0xed6,0xedd,0x850,0xf0b,
+#else /* U_DARWIN */
+0xed1,0xed1,0xed1,0xed1,0xed1,0xed1,0xed1,0x7f1,0xed9,0x7f9,0xeda,0xee2,0xeea,0xef0,0x801,0x809,
+0xfe2,0xfe2,0x324,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0xfd2,0xfd2,0x912,0xa19,0x2a0,0x2a0,0x2a0,0x2a0,
+0xf19,0xf14,0x811,0xf17,0x819,0x821,0x829,0xf1d,0x831,0x839,0x841,0xf16,0xf1e,0xf19,0xf14,0xf1c,
+0xf17,0xf1f,0xf1a,0xf15,0xf1d,0x848,0xef8,0xf00,0xf07,0xf0e,0xefb,0xf03,0xf0a,0xf11,0x850,0xf3f,
+#endif /* U_DARWIN */
+0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,
+0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x328,
+#ifndef U_DARWIN
+0xefb,0xefb,0xefb,0xefb,0xefb,0xefb,0xefb,0xefb,0xefb,0xefb,0xefb,0xefb,0xefb,0xefb,0xefb,0xefb,
+0xefb,0xefb,0xefb,0xefb,0xefb,0xefb,0xefb,0xefb,0xefb,0xefb,0xefb,0xefb,0xefb,0xefb,0xefb,0xefb,
+0xefb,0xefb,0xefb,0xefb,0xefb,0xefb,0xefb,0xefb,0xefb,0xefb,0xefb,0xefb,0xefb,0xefb,0xefb,0xefb,
+0xefb,0xefb,0xefb,0xefb,0xefb,0xefb,0xa2a,0xa21,0xa21,0xa21,0xa21,0xa21,0xa21,0xa21,0xa21,0xa21,
+#else /* U_DARWIN */
+0xf2f,0xf2f,0xf2f,0xf2f,0xf2f,0xf2f,0xf2f,0xf2f,0xf2f,0xf2f,0xf2f,0xf2f,0xf2f,0xf2f,0xf2f,0xf2f,
+0xf2f,0xf2f,0xf2f,0xf2f,0xf2f,0xf2f,0xf2f,0xf2f,0xf2f,0xf2f,0xf2f,0xf2f,0xf2f,0xf2f,0xf2f,0xf2f,
+0xf2f,0xf2f,0xf2f,0xf2f,0xf2f,0xf2f,0xf2f,0xf2f,0xf2f,0xf2f,0xf2f,0xf2f,0xf2f,0xf2f,0xf2f,0xf2f,
+0xf2f,0xf2f,0xf2f,0xf2f,0xf2f,0xf2f,0xa2a,0xa21,0xa21,0xa21,0xa21,0xa21,0xa21,0xa21,0xa21,0xa21,
+#endif /* U_DARWIN */
+0xa21,0xa21,0xa21,0xa21,0xa21,0xa21,0xa21,0xa21,0xa21,0xa21,0xa21,0xa21,0xa21,0xa21,0xa21,0xa21,
+0xa21,0xa21,0xa21,0xa21,0xa21,0xa21,0xa21,0xa21,0xa21,0xa21,0xa21,0xa21,0xa21,0xa21,0xa21,0xa21,
+#ifndef U_DARWIN
+0xf03,0xf03,0xf03,0xf03,0xf03,0xf03,0xf03,0xf03,0xf03,0xf03,0xf03,0xf03,0xf03,0xf03,0xf03,0xf03,
+#else /* U_DARWIN */
+0xf37,0xf37,0xf37,0xf37,0xf37,0xf37,0xf37,0xf37,0xf37,0xf37,0xf37,0xf37,0xf37,0xf37,0xf37,0xf37,
+#endif /* U_DARWIN */
+0xa32,0xa21,0xa21,0xa21,0xa21,0xa21,0xa21,0xa21,0xa21,0xa21,0xa21,0xa21,0xa21,0xa21,0xa21,0xa21,
+0xa21,0xa21,0xa21,0xa21,0xa21,0xa21,0xa21,0xa21,0xa21,0xa21,0xa21,0xa21,0xa21,0xa21,0xa21,0xa21,
+0xa21,0xa21,0xa21,0xa21,0xa21,0xa21,0xa21,0xa21,0xa21,0xa21,0xa21,0xa21,0xa21,0xa21,0xa21,0xa22,
+#ifndef U_DARWIN
+0x858,0xef3,0xef3,0xef3,0x330,0x330,0x330,0x330,0xfa6,0xfa6,0xfa6,0xfa6,0xfa6,0xfa6,0xfa6,0x338,
+#else /* U_DARWIN */
+0x858,0xf27,0xf27,0xf27,0x330,0x330,0x330,0x330,0xfda,0xfda,0xfda,0xfda,0xfda,0xfda,0xfda,0x338,
+#endif /* U_DARWIN */
+0x330,0x330,0x330,0x330,0x330,0x330,0x330,0x330,0x330,0x330,0x330,0x330,0x330,0x330,0x330,0x330,
+0x330,0x330,0x330,0x330,0x330,0x330,0x330,0x330,0x330,0x330,0x330,0x330,0x330,0x330,0x330,0x330,
+0x330,0x330,0x330,0x330,0x330,0x330,0x330,0x330,0x330,0x330,0x330,0x330,0x330,0x330,0x330,0x330,
+#ifndef U_DARWIN
+0xd9d,0xd9d,0xd9d,0xd9d,0xd9d,0xd9d,0xd9d,0xd9d,0xd9d,0xd9d,0xd9d,0xd9d,0xd9d,0xd9d,0xd9d,0xd9d,
+0xd9d,0xd9d,0xd9d,0xd9d,0xd9d,0xd9d,0xd9d,0xd9d,0xd9d,0xd9d,0xd9d,0xd9d,0xd9d,0xd9d,0xd9d,0xd9d,
+0xd9d,0xd9d,0xd9d,0xd9d,0xd9d,0xd9d,0xd9d,0xd9d,0xd9d,0xd9d,0xd9d,0xd9d,0xd9d,0xd9d,0xd9d,0xd9d,
+0xd9d,0xd9d,0xd9d,0xd9d,0xd9d,0xd9d,0xd9d,0xd9d,0xd9d,0xd9d,0xd9d,0xd9d,0xd9d,0xd9d,0xd9d,0xd8d,
+0xda5,0xda5,0xda5,0xda5,0xda5,0xda5,0xda5,0xda5,0xda5,0xda5,0xda5,0xda5,0xda5,0xda5,0xda5,0xda5,
+0xda5,0xda5,0xda5,0xda5,0xda5,0xda5,0xda5,0xda5,0xda5,0xda5,0xda5,0xda5,0xda5,0xda5,0xda5,0xda5,
+0xda5,0xda5,0xda5,0xda5,0xda5,0xda5,0xda5,0xda5,0xda5,0xda5,0xda5,0xda5,0xda5,0xda5,0xda5,0xda5,
+0xda5,0xda5,0xda5,0xda5,0xda5,0xda5,0xda5,0xda5,0xda5,0xda5,0xda5,0xda5,0xda5,0xda5,0xda5,0xd95,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0x495,0x495,0x495,0x495,0x495,0x495,0x495,0x495,0x495,0x426,0x621,0x450,0x450,0x54c,0x495,0x495,
+0x495,0x495,0x495,0x495,0x495,0x495,0x495,0x495,0x495,0x495,0x495,0x495,0x495,0x495,0x495,0x495,
+0x747,0x561,0x717,0x3ff,0x6fc,0x6d2,0x3ff,0x71a,0x69f,0x474,0x3ff,0x6ff,0x61b,0x573,0x61e,0x74a,
+0x687,0x687,0x687,0x687,0x687,0x687,0x687,0x687,0x687,0x687,0x618,0x61b,0x402,0x402,0x402,0x561,
+0x3ff,0x417,0x417,0x417,0x417,0x417,0x417,0x411,0x411,0x411,0x411,0x411,0x411,0x411,0x411,0x411,
+0x411,0x411,0x411,0x411,0x411,0x411,0x411,0x411,0x411,0x411,0x411,0x69f,0x6fc,0x474,0x408,0x40b,
+0x405,0x414,0x414,0x414,0x414,0x414,0x414,0x40e,0x40e,0x40e,0x40e,0x40e,0x40e,0x40e,0x40e,0x40e,
+0x40e,0x40e,0x40e,0x40e,0x40e,0x40e,0x40e,0x40e,0x40e,0x40e,0x40e,0x69f,0x447,0x474,0x402,0x495,
+0x498,0x498,0x498,0x498,0x498,0x750,0x498,0x498,0x498,0x498,0x498,0x498,0x498,0x498,0x498,0x498,
+0x498,0x498,0x498,0x498,0x498,0x498,0x498,0x498,0x498,0x498,0x498,0x498,0x498,0x498,0x498,0x498,
+0x567,0x17d,0x6d5,0x702,0x6ed,0x702,0x41a,0x17d,0x183,0x1f2,0x189,0x708,0x41d,0x43b,0x3a8,0x420,
+0x6c0,0x6f0,0x17a,0x17a,0x44d,0x1f5,0x17d,0x186,0x183,0x17a,0x189,0x708,0x177,0x177,0x177,0x17d,
+0x1fb,0x1fb,0x1fb,0x1fb,0x1fb,0x1fb,0x3b1,0x1fb,0x1fb,0x1fb,0x1fb,0x1fb,0x1fb,0x1fb,0x1fb,0x1fb,
+0x3b1,0x1fb,0x1fb,0x1fb,0x1fb,0x1fb,0x1fb,0x180,0x3b1,0x1fb,0x1fb,0x1fb,0x1fb,0x1fb,0x3b1,0x3ab,
+0x3ae,0x3ae,0x1f8,0x1f8,0x1f8,0x1f8,0x3ab,0x1f8,0x3ae,0x3ae,0x3ae,0x1f8,0x3ae,0x3ae,0x1f8,0x1f8,
+0x3ab,0x1f8,0x3ae,0x3ae,0x1f8,0x1f8,0x1f8,0x180,0x3ab,0x3ae,0x3ae,0x1f8,0x3ae,0x1f8,0x3ab,0x1f8,
+0x840,0x840,0x840,0x840,0x840,0x840,0x840,0x840,0x840,0x8b8,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0x8d9,0x8d9,0x8dc,0x8dc,0x8d9,0x8d9,0x8d9,0x8d9,0x8d9,0x8d9,0x8d9,0x8d9,0x8d,0x8d,0x8d,0x8d,
+0x8ee,0xa41,0x8ee,0x8ee,0x8ee,0xa41,0x8ee,0xa8,0xa8,0xa8,0xa8,0xa8,0xa8,0xa8,0xa8,0xa8,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0xbf1,0xbf1,0xbf1,0xc4b,0xc4b,0xc42,0xc42,0xc4b,0xbee,0xbee,0xbee,0xbee,0x138,0x138,0x138,0x138,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0x7c5,0x7c5,0x7c5,0x7c5,0xab,0xab,0xab,0xab,0xab,0xab,0xab,0xab,0xab,0xab,0xab,0xab,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0xbac,0xbac,0xbac,0xbac,0xbac,0xbac,0xbac,0xbac,0xbac,0xbac,0xbac,0x10b,0x10b,0x10b,0x10b,0x10b,
+#else /* U_DARWIN */
+0xdd1,0xdd1,0xdd1,0xdd1,0xdd1,0xdd1,0xdd1,0xdd1,0xdd1,0xdd1,0xdd1,0xdd1,0xdd1,0xdd1,0xdd1,0xdd1,
+0xdd1,0xdd1,0xdd1,0xdd1,0xdd1,0xdd1,0xdd1,0xdd1,0xdd1,0xdd1,0xdd1,0xdd1,0xdd1,0xdd1,0xdd1,0xdd1,
+0xdd1,0xdd1,0xdd1,0xdd1,0xdd1,0xdd1,0xdd1,0xdd1,0xdd1,0xdd1,0xdd1,0xdd1,0xdd1,0xdd1,0xdd1,0xdd1,
+0xdd1,0xdd1,0xdd1,0xdd1,0xdd1,0xdd1,0xdd1,0xdd1,0xdd1,0xdd1,0xdd1,0xdd1,0xdd1,0xdd1,0xdd1,0xdc1,
+0xdd9,0xdd9,0xdd9,0xdd9,0xdd9,0xdd9,0xdd9,0xdd9,0xdd9,0xdd9,0xdd9,0xdd9,0xdd9,0xdd9,0xdd9,0xdd9,
+0xdd9,0xdd9,0xdd9,0xdd9,0xdd9,0xdd9,0xdd9,0xdd9,0xdd9,0xdd9,0xdd9,0xdd9,0xdd9,0xdd9,0xdd9,0xdd9,
+0xdd9,0xdd9,0xdd9,0xdd9,0xdd9,0xdd9,0xdd9,0xdd9,0xdd9,0xdd9,0xdd9,0xdd9,0xdd9,0xdd9,0xdd9,0xdd9,
+0xdd9,0xdd9,0xdd9,0xdd9,0xdd9,0xdd9,0xdd9,0xdd9,0xdd9,0xdd9,0xdd9,0xdd9,0xdd9,0xdd9,0xdd9,0xdc9,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0x4b0,0x4b0,0x4b0,0x4b0,0x4b0,0x4b0,0x4b0,0x4b0,0x4b0,0x438,0x64b,0x465,0x465,0x56d,0x4b0,0x4b0,
+0x4b0,0x4b0,0x4b0,0x4b0,0x4b0,0x4b0,0x4b0,0x4b0,0x4b0,0x4b0,0x4b0,0x4b0,0x4b0,0x4b0,0x4b0,0x4b0,
+0x77d,0x582,0x74d,0x40b,0x732,0x705,0x40b,0x750,0x6d2,0x48c,0x40b,0x735,0x645,0x594,0x648,0x780,
+0x6b7,0x6b7,0x6b7,0x6b7,0x6b7,0x6b7,0x6b7,0x6b7,0x6b7,0x6b7,0x642,0x645,0x40e,0x40e,0x40e,0x582,
+0x40b,0x423,0x423,0x423,0x423,0x423,0x423,0x41d,0x41d,0x41d,0x41d,0x41d,0x41d,0x41d,0x41d,0x41d,
+0x41d,0x41d,0x41d,0x41d,0x41d,0x41d,0x41d,0x41d,0x41d,0x41d,0x41d,0x6d2,0x732,0x48c,0x414,0x417,
+0x411,0x420,0x420,0x420,0x420,0x420,0x420,0x41a,0x41a,0x41a,0x41a,0x41a,0x41a,0x41a,0x41a,0x41a,
+0x41a,0x41a,0x41a,0x41a,0x41a,0x41a,0x41a,0x41a,0x41a,0x41a,0x41a,0x6d2,0x459,0x48c,0x40e,0x4b0,
+0x4b3,0x4b3,0x4b3,0x4b3,0x4b3,0x786,0x4b3,0x4b3,0x4b3,0x4b3,0x4b3,0x4b3,0x4b3,0x4b3,0x4b3,0x4b3,
+0x4b3,0x4b3,0x4b3,0x4b3,0x4b3,0x4b3,0x4b3,0x4b3,0x4b3,0x4b3,0x4b3,0x4b3,0x4b3,0x4b3,0x4b3,0x4b3,
+0x588,0x17d,0x708,0x738,0x723,0x738,0x426,0x17d,0x183,0x1f5,0x189,0x73e,0x429,0x44d,0x3b1,0x42c,
+0x6f3,0x726,0x17a,0x17a,0x462,0x1f8,0x17d,0x186,0x183,0x17a,0x189,0x73e,0x177,0x177,0x177,0x17d,
+0x1fe,0x1fe,0x1fe,0x1fe,0x1fe,0x1fe,0x3ba,0x1fe,0x1fe,0x1fe,0x1fe,0x1fe,0x1fe,0x1fe,0x1fe,0x1fe,
+0x3ba,0x1fe,0x1fe,0x1fe,0x1fe,0x1fe,0x1fe,0x180,0x3ba,0x1fe,0x1fe,0x1fe,0x1fe,0x1fe,0x3ba,0x3b4,
+0x3b7,0x3b7,0x1fb,0x1fb,0x1fb,0x1fb,0x3b4,0x1fb,0x3b7,0x3b7,0x3b7,0x1fb,0x3b7,0x3b7,0x1fb,0x1fb,
+0x3b4,0x1fb,0x3b7,0x3b7,0x1fb,0x1fb,0x1fb,0x180,0x3b4,0x3b7,0x3b7,0x1fb,0x3b7,0x1fb,0x3b4,0x1fb,
+0x876,0x876,0x876,0x876,0x876,0x876,0x876,0x876,0x876,0x8ee,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0x90f,0x90f,0x912,0x912,0x90f,0x90f,0x90f,0x90f,0x90f,0x90f,0x90f,0x90f,0x8d,0x8d,0x8d,0x8d,
+0x924,0xa77,0x924,0x924,0x924,0xa77,0x924,0xa8,0xa8,0xa8,0xa8,0xa8,0xa8,0xa8,0xa8,0xa8,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0xc27,0xc27,0xc27,0xc81,0xc81,0xc78,0xc78,0xc81,0xc24,0xc24,0xc24,0xc24,0x138,0x138,0x138,0x138,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0x7fb,0x7fb,0x7fb,0x7fb,0xab,0xab,0xab,0xab,0xab,0xab,0xab,0xab,0xab,0xab,0xab,0xab,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0xbe2,0xbe2,0xbe2,0xbe2,0xbe2,0xbe2,0xbe2,0xbe2,0xbe2,0xbe2,0xbe2,0x10b,0x10b,0x10b,0x10b,0x10b,
+#endif /* U_DARWIN */
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+#ifndef U_DARWIN
+0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0xc9,0xc9,0xc9,0xc9,0xc9,
+#else /* U_DARWIN */
+0x97b,0x97b,0x97b,0x97b,0x97b,0x97b,0x97b,0x97b,0x97b,0x97b,0x97b,0xc9,0xc9,0xc9,0xc9,0xc9,
+#endif /* U_DARWIN */
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+#ifndef U_DARWIN
+0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xff,0xff,0xff,0xff,0xff,0xff,
+#else /* U_DARWIN */
+0xb85,0xb85,0xb85,0xb85,0xb85,0xb85,0xb85,0xb85,0xb85,0xb85,0xff,0xff,0xff,0xff,0xff,0xff,
+#endif /* U_DARWIN */
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+#ifndef U_DARWIN
+0xba9,0xba9,0xc2a,0xc2a,0xc2a,0xba9,0x108,0x108,0x108,0x108,0x108,0x108,0x108,0x108,0x108,0x108,
+#else /* U_DARWIN */
+0xbdf,0xbdf,0xc60,0xc60,0xc60,0xbdf,0x108,0x108,0x108,0x108,0x108,0x108,0x108,0x108,0x108,0x108,
+#endif /* U_DARWIN */
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+#ifndef U_DARWIN
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0x765,0x765,
+#else /* U_DARWIN */
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0x79b,0x79b,
+#endif /* U_DARWIN */
+3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,
+3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,
+#ifndef U_DARWIN
+0xb34,0xb34,0xb34,0xb34,0xb34,0xb34,0xb34,0xb34,0xb34,0xb34,0xb34,0xb34,0xb34,0xb34,0xb34,0xb34,
+#else /* U_DARWIN */
+0xb6a,0xb6a,0xb6a,0xb6a,0xb6a,0xb6a,0xb6a,0xb6a,0xb6a,0xb6a,0xb6a,0xb6a,0xb6a,0xb6a,0xb6a,0xb6a,
+#endif /* U_DARWIN */
+3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,
+#ifndef U_DARWIN
+0x570,0x570,0x8cd,0xa2c,0xa2c,0xa2c,0xa2c,0xa2c,0xa2c,0xa2c,0xa2c,0xa2c,0xa2c,0xa2c,0xa2c,0xa2c,
+6,6,6,6,0x243,0x240,6,6,6,6,0x249,0xc93,0xc93,0xc93,0x60f,6,
+6,6,6,6,0x246,0x243,0x258,0x237,0x258,0x258,0x258,6,0x258,6,0x258,0x258,
+0x24f,0x3cf,0x3cf,0x3cf,0x3cf,0x3cf,0x3cf,0x3cf,0x3cf,0x3cf,0x3cf,0x3cf,0x3cf,0x3cf,0x3cf,0x3cf,
+0x3cf,0x3cf,6,0x3cf,0x3cf,0x3cf,0x3cf,0x3cf,0x3cf,0x3cf,0x258,0x258,0x24f,0x24f,0x24f,0x24f,
+0x24f,0x3cc,0x3cc,0x3cc,0x3cc,0x3cc,0x3cc,0x3cc,0x3cc,0x3cc,0x3cc,0x3cc,0x3cc,0x3cc,0x3cc,0x3cc,
+0x3cc,0x3cc,0x24c,0x3cc,0x3cc,0x3cc,0x3cc,0x3cc,0x3cc,0x3cc,0x24f,0x24f,0x24f,0x24f,0x24f,6,
+0x25b,0x25b,0x25e,0x258,0x258,0x25b,0x252,0x7e3,0x98d,0x98a,0x255,0x7e3,0x255,0x7e3,0x255,0x7e3,
+0x26a,0x264,0x261,0x49b,0x49b,0x49b,0x49b,9,0x894,0x894,0x993,0x990,0x7ec,0x7e6,0x7ec,0x7e6,
+0x26a,0x264,0x26a,0x264,0x26a,0x264,0x26a,0x264,0x26a,0x264,0x26a,0x264,0x26a,0x264,0x26a,0x264,
+#else /* U_DARWIN */
+0x591,0x591,0x903,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,
+6,6,6,6,0x246,0x243,6,6,6,6,0x24c,0xcc9,0xcc9,0xcc9,0x639,6,
+6,6,6,6,0x249,0x246,0x25b,0x23a,0x25b,0x25b,0x25b,6,0x25b,6,0x25b,0x25b,
+0x252,0x3d8,0x3d8,0x3d8,0x3d8,0x3d8,0x3d8,0x3d8,0x3d8,0x3d8,0x3d8,0x3d8,0x3d8,0x3d8,0x3d8,0x3d8,
+0x3d8,0x3d8,6,0x3d8,0x3d8,0x3d8,0x3d8,0x3d8,0x3d8,0x3d8,0x25b,0x25b,0x252,0x252,0x252,0x252,
+0x252,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,
+0x3d5,0x3d5,0x24f,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x252,0x252,0x252,0x252,0x252,6,
+0x25e,0x25e,0x261,0x25b,0x25b,0x25e,0x255,0x819,0x9c3,0x9c0,0x258,0x819,0x258,0x819,0x258,0x819,
+0x26d,0x267,0x264,0x4b6,0x4b6,0x4b6,0x4b6,9,0x8ca,0x8ca,0x9c9,0x9c6,0x822,0x81c,0x822,0x81c,
+0x26d,0x267,0x26d,0x267,0x26d,0x267,0x26d,0x267,0x26d,0x267,0x26d,0x267,0x26d,0x267,0x26d,0x267,
+#endif /* U_DARWIN */
+0xd8,0xd8,0xd8,0xd8,0xd8,0xd8,0xd8,0xd8,0xd8,0xd8,0xd8,0xd8,0xd8,0xd8,0xd8,0xd8,
+#ifndef U_DARWIN
+0xc,0x27c,0x27c,0x27c,0x27c,0x27c,0x27c,0x27c,0x27c,0x27c,0x27c,0x27c,0x27c,0x27c,0x27c,0x27c,
+0x27c,0x27c,0x27c,0x27c,0x27c,0x27c,0x27c,0x27c,0x27c,0x27c,0x27c,0xc,0xc,0x27f,0x270,0x270,
+0x273,0x270,0x273,0x270,0xc,0x276,0x276,0x276,0x276,0x276,0x276,0x276,0x276,0x276,0x276,0x276,
+0x276,0x276,0x276,0x276,0x276,0x276,0x276,0x276,0x276,0x276,0x276,0x276,0x276,0x276,0x276,0x276,
+0x276,0x276,0x276,0x276,0x276,0x276,0x276,0x279,0xc,0x612,0x86a,0xc,0xc,0xc,0xc,0xc,
+0xf,0x78c,0x78c,0x78c,0x78c,0x78c,0x78c,0x78c,0x78c,0x78c,0x78c,0x78c,0x78c,0x78c,0x78c,0x78c,
+0x282,0x49e,0x49e,0x28b,0x78f,0xc1e,0xc51,0xc1e,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,
+0x28e,0x28e,0x28e,0x28e,0x28e,0x28e,0x28e,0x28e,0x28e,0x28e,0x28e,0x28e,0x28e,0x28e,0x28e,0x28e,
+0x28e,0x28e,0x28e,0xf,0xf,0xf,0xf,0xf,0x28e,0x28e,0x28e,0x288,0x285,0xf,0xf,0xf,
+0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xa89,0xa89,0xa89,0xa89,0x12,0x12,0x12,0x12,
+0x12,0x12,0x12,0xc7b,0x54f,0xb49,0xa8c,0xa8c,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0x12,0x12,
+0x12,0x12,0x12,0x54f,0x12,0x12,0xc54,0x552,0x12,0x29a,0x29d,0x29d,0x29d,0x29d,0x29d,0x29a,
+0x29a,0x29a,0x29a,0x29a,0x29a,0x29a,0x29a,0x29a,0x29a,0x29a,0x29a,0x29a,0x29a,0x29a,0x29a,0x29a,
+0x29a,0x29a,0x29a,0x12,0x12,0x12,0x12,0x12,0x294,0x29a,0x29a,0x29a,0x29a,0x29a,0x29a,0x29a,
+0x29a,0x29a,0x29a,0x4a4,0x4a4,0x4a4,0x4a4,0x4a4,0x4a4,0x4a4,0x4a4,0x897,0x897,0x897,0xb13,0xb19,
+0xb16,0xc21,0xc21,0xc21,0xc21,0xc21,0xc21,0x12,0x801,0x801,0x801,0x7fe,0x7fe,0x7fe,0x7fe,0x7fe,
+0x7fe,0x7fe,0x7fe,0x7fb,0x7fe,0x7fb,0x15,0x7f8,0x804,0x89a,0x804,0x804,0x804,0x804,0x804,0x804,
+0x804,0x804,0x804,0x804,0x804,0x804,0x804,0x804,0x89d,0x89d,0x89d,0x89d,0x89d,0x89d,0x89d,0x89d,
+0x89d,0x89d,0x89d,0x15,0x15,0xa92,0xa92,0xa92,0xbb2,0xbb2,0xbb2,0xbb2,0xbb2,0xbb2,0xbb2,0xbb2,
+0xbb2,0xbb2,0xbb2,0xbb2,0xbb2,0xbb2,0xbb2,0xbb2,0x807,0x807,0x807,0x807,0x807,0x807,0x8a3,0x8a3,
+0x8a3,0x8a3,0x8a3,0x8a3,0x8a3,0x8a3,0x8a3,0x8a3,0x8a3,0x999,0x18,0x18,0x18,0x18,0x18,0x18,
+0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x1b,0x4b0,0x4b0,0x4b9,0xa95,0x2a9,0x2a9,0x2a9,
+0x2a9,0x2a9,0x2a9,0x2a9,0x2a9,0x2a9,0x2a9,0x2a9,0x2a9,0x2a9,0x2a9,0x2a9,0x2a9,0x2a9,0x2a9,0x2a9,
+0x2a9,0x2a9,0x2a9,0x2a9,0x2a9,0x2a9,0x2a9,0x2a9,0x2a9,0x2ac,0x2a9,0x2a9,0x2a9,0x2a9,0x2a9,0x2a9,
+0x2a9,0x2ac,0x2a9,0x2a9,0x2ac,0x2a9,0x2a9,0x2a9,0x2a9,0x2a9,0x1b,0x1b,0x4b3,0x2a9,0x4b9,0x4b9,
+0x4b9,0x4b0,0x4b0,0x4b0,0x4b0,0x4b0,0x4b0,0x4b0,0x4b0,0x4b9,0x4b9,0x4b9,0x4b9,0x4b6,0x1b,0x1b,
+0x2a9,0x4b3,0x4b3,0x4b3,0x4b3,0x1b,0x1b,0x1b,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,
+0x2a9,0x2a9,0x4b0,0x4b0,0x42c,0x42c,0x666,0x666,0x666,0x666,0x666,0x666,0x666,0x666,0x666,0x666,
+0x2a6,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0xc9c,0xc9c,0xb73,0xc9c,0xc9c,
+0x1e,0x4bc,0x4c5,0x4c5,0x1e,0x2b2,0x2b2,0x2b2,0x2b2,0x2b2,0x2b2,0x2b2,0x2b2,0x1e,0x1e,0x2b2,
+0x2b2,0x1e,0x1e,0x2b2,0x2b2,0x2b2,0x2b2,0x2b2,0x2b2,0x2b2,0x2b2,0x2b2,0x2b2,0x2b2,0x2b2,0x2b2,
+0x2b2,0x1e,0x2b2,0x2b2,0x2b2,0x2b2,0x2b2,0x2b2,0x2b2,0x1e,0x2b2,0x1e,0x1e,0x1e,0x2b2,0x2b2,
+0x2b2,0x2b2,0x1e,0x1e,0x4bf,0xa98,0x4bc,0x4c5,0x4c5,0x4bc,0x4bc,0x4bc,0x4bc,0x1e,0x1e,0x4c5,
+0x4c5,0x1e,0x1e,0x4c8,0x4c8,0x4c2,0xb76,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x4bc,
+0x1e,0x1e,0x1e,0x1e,0x2b5,0x2b5,0x1e,0x2b5,0x2b2,0x2b2,0x4bc,0x4bc,0x1e,0x1e,0x669,0x669,
+0x669,0x669,0x669,0x669,0x669,0x669,0x669,0x669,0x2b2,0x2b2,0x6db,0x6db,0x2af,0x2af,0x2af,0x2af,
+0x2af,0x2af,0x2af,0x1e,0x1e,0x1e,0x1e,0x1e,0x21,0xb1c,0x4cb,0xb1f,0x21,0x2b8,0x2b8,0x2b8,
+0x2b8,0x2b8,0x2b8,0x21,0x21,0x21,0x21,0x2b8,0x2b8,0x21,0x21,0x2b8,0x2b8,0x2b8,0x2b8,0x2b8,
+0x2b8,0x2b8,0x2b8,0x2b8,0x2b8,0x2b8,0x2b8,0x2b8,0x2b8,0x21,0x2b8,0x2b8,0x2b8,0x2b8,0x2b8,0x2b8,
+0x2b8,0x21,0x2b8,0x2bb,0x21,0x2b8,0x2bb,0x21,0x2b8,0x2b8,0x21,0x21,0x4ce,0x21,0x4d4,0x4d4,
+0x4d4,0x4cb,0x4cb,0x21,0x21,0x21,0x21,0x4cb,0x4cb,0x21,0x21,0x4cb,0x4cb,0x4d1,0x21,0x21,
+0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x2bb,0x2bb,0x2bb,0x2b8,0x21,0x2bb,0x21,
+0x21,0x21,0x21,0x21,0x21,0x21,0x66c,0x66c,0x66c,0x66c,0x66c,0x66c,0x66c,0x66c,0x66c,0x66c,
+0x4cb,0x4cb,0x2b8,0x2b8,0x2b8,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,
+0x24,0x4d7,0x4d7,0x4e0,0x24,0x2be,0x2be,0x2be,0x2be,0x2be,0x2be,0x2be,0xa9b,0x2be,0x24,0x2be,
+0x2be,0x2be,0x24,0x2be,0x2be,0x2be,0x2be,0x2be,0x2be,0x2be,0x2be,0x2be,0x2be,0x2be,0x2be,0x2be,
+0x2be,0x24,0x2be,0x2be,0x2be,0x2be,0x2be,0x2be,0x2be,0x24,0x2be,0x2be,0x24,0x2be,0x2be,0x2be,
+0x2be,0x2be,0x24,0x24,0x4da,0x2be,0x4e0,0x4e0,0x4e0,0x4d7,0x4d7,0x4d7,0x4d7,0x4d7,0x24,0x4d7,
+0x4d7,0x4e0,0x24,0x4e0,0x4e0,0x4dd,0x24,0x24,0x2be,0x24,0x24,0x24,0x24,0x24,0x24,0x24,
+0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x2be,0xa9b,0xb22,0xb22,0x24,0x24,0x66f,0x66f,
+0x66f,0x66f,0x66f,0x66f,0x66f,0x66f,0x66f,0x66f,0x24,0xb55,0x24,0x24,0x24,0x24,0x24,0x24,
+0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x27,0x4e3,0x4ec,0x4ec,0x27,0x2c4,0x2c4,0x2c4,
+0x2c4,0x2c4,0x2c4,0x2c4,0x2c4,0x27,0x27,0x2c4,0x2c4,0x27,0x27,0x2c4,0x2c4,0x2c4,0x2c4,0x2c4,
+0x2c4,0x2c4,0x2c4,0x2c4,0x2c4,0x2c4,0x2c4,0x2c4,0x2c4,0x27,0x2c4,0x2c4,0x2c4,0x2c4,0x2c4,0x2c4,
+0x2c4,0x27,0x2c4,0x2c4,0x27,0xa9e,0x2c4,0x2c4,0x2c4,0x2c4,0x27,0x27,0x4e6,0x2c4,0x4e3,0x4e3,
+0x4ec,0x4e3,0x4e3,0x4e3,0x27,0x27,0x27,0x4ec,0x4ef,0x27,0x27,0x4ef,0x4ef,0x4e9,0x27,0x27,
+0x27,0x27,0x27,0x27,0x27,0x27,0x4e3,0x4e3,0x27,0x27,0x27,0x27,0x2c7,0x2c7,0x27,0x2c4,
+0x2c4,0x2c4,0x27,0x27,0x27,0x27,0x672,0x672,0x672,0x672,0x672,0x672,0x672,0x672,0x672,0x672,
+0x2c1,0xa9e,0x27,0x27,0x27,0x27,0x27,0x27,0x27,0x27,0x27,0x27,0x27,0x27,0x27,0x27,
+0x2a,0x2a,0x4f2,0x2cd,0x2a,0x2cd,0x2cd,0x2cd,0x2cd,0x2cd,0x2cd,0x2a,0x2a,0x2a,0x2cd,0x2cd,
+0x2cd,0x2a,0x2cd,0x2cd,0x2d0,0x2cd,0x2a,0x2a,0x2a,0x2cd,0x2cd,0x2a,0x2cd,0x2a,0x2cd,0x2cd,
+0x2a,0x2a,0x2a,0x2cd,0x2cd,0x2a,0x2a,0x2a,0x2cd,0x2cd,0x2cd,0x2a,0x2a,0x2a,0x2cd,0x2cd,
+0x2cd,0x2cd,0x2cd,0x2cd,0x2cd,0x2cd,0xb79,0x2cd,0x2cd,0x2cd,0x2a,0x2a,0x2a,0x2a,0x4f2,0x4f8,
+0x4f2,0x4f8,0x4f8,0x2a,0x2a,0x2a,0x4f8,0x4f8,0x4f8,0x2a,0x4fb,0x4fb,0x4fb,0x4f5,0x2a,0x2a,
+0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x4f2,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
+0x2a,0x2a,0xc6f,0x675,0x675,0x675,0x675,0x675,0x675,0x675,0x675,0x675,0x2ca,0x2ca,0x2ca,0xaa1,
+0xaa1,0xaa1,0xaa1,0xaa1,0xaa1,0xb58,0xaa1,0x2a,0x2a,0x2a,0x2a,0x2a,0x2d,0x507,0x507,0x507,
+0x2d,0x2d3,0x2d3,0x2d3,0x2d3,0x2d3,0x2d3,0x2d3,0x2d3,0x2d,0x2d3,0x2d3,0x2d3,0x2d,0x2d3,0x2d3,
+0x2d3,0x2d3,0x2d3,0x2d3,0x2d3,0x2d3,0x2d3,0x2d3,0x2d3,0x2d3,0x2d3,0x2d3,0x2d3,0x2d,0x2d3,0x2d3,
+0x2d3,0x2d3,0x2d3,0x2d3,0x2d3,0x2d3,0x2d3,0x2d3,0x2d,0x2d3,0x2d3,0x2d3,0x2d3,0x2d3,0x2d,0x2d,
+0x2d,0x2d,0x4fe,0x4fe,0x4fe,0x507,0x507,0x507,0x507,0x2d,0x4fe,0x4fe,0x501,0x2d,0x4fe,0x4fe,
+0x4fe,0x504,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x4fe,0x4fe,0x2d,0x2d,0x2d,0x2d,0x2d,
+0x2d,0x2d,0x2d,0x2d,0x2d3,0x2d3,0x2d,0x2d,0x2d,0x2d,0x678,0x678,0x678,0x678,0x678,0x678,
+0x678,0x678,0x678,0x678,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,
+0x2d,0x2d,0x2d,0x2d,0x30,0x30,0x510,0x510,0x30,0x2d6,0x2d6,0x2d6,0x2d6,0x2d6,0x2d6,0x2d6,
+0x2d6,0x30,0x2d6,0x2d6,0x2d6,0x30,0x2d6,0x2d6,0x2d6,0x2d6,0x2d6,0x2d6,0x2d6,0x2d6,0x2d6,0x2d6,
+0x2d6,0x2d6,0x2d6,0x2d6,0x2d6,0x30,0x2d6,0x2d6,0x2d6,0x2d6,0x2d6,0x2d6,0x2d6,0x2d6,0x2d6,0x2d6,
+0x30,0x2d6,0x2d6,0x2d6,0x2d6,0x2d6,0x30,0x30,0xb25,0xaa4,0x510,0x50a,0x513,0x510,0x50a,0x510,
+0x510,0x30,0x50a,0x513,0x513,0x30,0x513,0x513,0x50a,0x50d,0x30,0x30,0x30,0x30,0x30,0x30,
+0x30,0x50a,0x50a,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x2d6,0x30,0x2d6,0x2d6,0xd0e,0xd0e,
+0x30,0x30,0x67b,0x67b,0x67b,0x67b,0x67b,0x67b,0x67b,0x67b,0x67b,0x67b,0x30,0xc9f,0xc9f,0x30,
+0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x33,0x33,0x51c,0x51c,
+0x33,0x2d9,0x2d9,0x2d9,0x2d9,0x2d9,0x2d9,0x2d9,0x2d9,0x33,0x2d9,0x2d9,0x2d9,0x33,0x2d9,0x2d9,
+0x2d9,0x2d9,0x2d9,0x2d9,0x2d9,0x2d9,0x2d9,0x2d9,0x2d9,0x2d9,0x2d9,0x2d9,0x2d9,0x33,0x2d9,0x2d9,
+0x2d9,0x2d9,0x2d9,0x2d9,0x2d9,0x2d9,0x2d9,0x2d9,0x2d9,0x2d9,0x2d9,0x2d9,0x2d9,0x2d9,0x33,0x33,
+0x33,0x33,0x516,0x51c,0x51c,0x516,0x516,0x516,0x33,0x33,0x51c,0x51c,0x51c,0x33,0x51f,0x51f,
+0x51f,0x519,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x516,0x33,0x33,0x33,0x33,
+0x33,0x33,0x33,0x33,0x2d9,0x2d9,0x33,0x33,0x33,0x33,0x67e,0x67e,0x67e,0x67e,0x67e,0x67e,
+0x67e,0x67e,0x67e,0x67e,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,
+0x33,0x33,0x33,0x33,0x36,0x36,0x8ac,0x8ac,0x36,0x80d,0x80d,0x80d,0x80d,0x80d,0x80d,0x80d,
+0x80d,0x80d,0x80d,0x80d,0x80d,0x80d,0x80d,0x80d,0x80d,0x80d,0x80d,0x36,0x36,0x36,0x80d,0x80d,
+0x80d,0x80d,0x80d,0x80d,0x80d,0x80d,0x80d,0x80d,0x80d,0x80d,0x80d,0x80d,0x80d,0x80d,0x80d,0x80d,
+0x80d,0x80d,0x36,0x80d,0x80d,0x80d,0x80d,0x80d,0x80d,0x80d,0x80d,0x80d,0x36,0x80d,0x36,0x36,
+0x80d,0x80d,0x80d,0x80d,0x80d,0x80d,0x80d,0x36,0x36,0x36,0x8a9,0x36,0x36,0x36,0x36,0x8a6,
+0x8ac,0x8ac,0x8a6,0x8a6,0x8a6,0x36,0x8a6,0x36,0x8ac,0x8ac,0x8af,0x8ac,0x8af,0x8af,0x8af,0x8a6,
+#else /* U_DARWIN */
+0xc,0x27f,0x27f,0x27f,0x27f,0x27f,0x27f,0x27f,0x27f,0x27f,0x27f,0x27f,0x27f,0x27f,0x27f,0x27f,
+0x27f,0x27f,0x27f,0x27f,0x27f,0x27f,0x27f,0x27f,0x27f,0x27f,0x27f,0xc,0xc,0x282,0x273,0x273,
+0x276,0x273,0x276,0x273,0xc,0x279,0x279,0x279,0x279,0x279,0x279,0x279,0x279,0x279,0x279,0x279,
+0x279,0x279,0x279,0x279,0x279,0x279,0x279,0x279,0x279,0x279,0x279,0x279,0x279,0x279,0x279,0x279,
+0x279,0x279,0x279,0x279,0x279,0x279,0x279,0x27c,0xc,0x63c,0x8a0,0xc,0xc,0xc,0xc,0xc,
+0xf,0x7c2,0x7c2,0x7c2,0x7c2,0x7c2,0x7c2,0x7c2,0x7c2,0x7c2,0x7c2,0x7c2,0x7c2,0x7c2,0x7c2,0x7c2,
+0x285,0x4b9,0x4b9,0x28e,0x7c5,0xc54,0xc87,0xc54,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,
+0x291,0x291,0x291,0x291,0x291,0x291,0x291,0x291,0x291,0x291,0x291,0x291,0x291,0x291,0x291,0x291,
+0x291,0x291,0x291,0xf,0xf,0xf,0xf,0xf,0x291,0x291,0x291,0x28b,0x288,0xf,0xf,0xf,
+0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xabf,0xabf,0xabf,0xabf,0x12,0x12,0x12,0x12,
+0x12,0x12,0x12,0xcb1,0x570,0xb7f,0xac2,0xac2,0xb49,0xb49,0xb49,0xb49,0xb49,0xb49,0x12,0x12,
+0x12,0x12,0x12,0x570,0x12,0x12,0xc8a,0x573,0x12,0x29d,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x29d,
+0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,
+0x29d,0x29d,0x29d,0x12,0x12,0x12,0x12,0x12,0x297,0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,
+0x29d,0x29d,0x29d,0x4bf,0x4bf,0x4bf,0x4bf,0x4bf,0x4bf,0x4bf,0x4bf,0x8cd,0x8cd,0x8cd,0xb49,0xb4f,
+0xb4c,0xc57,0xc57,0xc57,0xc57,0xc57,0xc57,0x12,0x837,0x837,0x837,0x834,0x834,0x834,0x834,0x834,
+0x834,0x834,0x834,0x831,0x834,0x831,0x15,0x82e,0x83a,0x8d0,0x83a,0x83a,0x83a,0x83a,0x83a,0x83a,
+0x83a,0x83a,0x83a,0x83a,0x83a,0x83a,0x83a,0x83a,0x8d3,0x8d3,0x8d3,0x8d3,0x8d3,0x8d3,0x8d3,0x8d3,
+0x8d3,0x8d3,0x8d3,0x15,0x15,0xac8,0xac8,0xac8,0xbe8,0xbe8,0xbe8,0xbe8,0xbe8,0xbe8,0xbe8,0xbe8,
+0xbe8,0xbe8,0xbe8,0xbe8,0xbe8,0xbe8,0xbe8,0xbe8,0x83d,0x83d,0x83d,0x83d,0x83d,0x83d,0x8d9,0x8d9,
+0x8d9,0x8d9,0x8d9,0x8d9,0x8d9,0x8d9,0x8d9,0x8d9,0x8d9,0x9cf,0x18,0x18,0x18,0x18,0x18,0x18,
+0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x1b,0x4cb,0x4cb,0x4d4,0xacb,0x2ac,0x2ac,0x2ac,
+0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,
+0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2af,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,
+0x2ac,0x2af,0x2ac,0x2ac,0x2af,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x1b,0x1b,0x4ce,0x2ac,0x4d4,0x4d4,
+0x4d4,0x4cb,0x4cb,0x4cb,0x4cb,0x4cb,0x4cb,0x4cb,0x4cb,0x4d4,0x4d4,0x4d4,0x4d4,0x4d1,0x1b,0x1b,
+0x2ac,0x4ce,0x4ce,0x4ce,0x4ce,0x1b,0x1b,0x1b,0x2af,0x2af,0x2af,0x2af,0x2af,0x2af,0x2af,0x2af,
+0x2ac,0x2ac,0x4cb,0x4cb,0x43e,0x43e,0x696,0x696,0x696,0x696,0x696,0x696,0x696,0x696,0x696,0x696,
+0x2a9,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0xcd2,0xcd2,0xba9,0xcd2,0xcd2,
+0x1e,0x4d7,0x4e0,0x4e0,0x1e,0x2b5,0x2b5,0x2b5,0x2b5,0x2b5,0x2b5,0x2b5,0x2b5,0x1e,0x1e,0x2b5,
+0x2b5,0x1e,0x1e,0x2b5,0x2b5,0x2b5,0x2b5,0x2b5,0x2b5,0x2b5,0x2b5,0x2b5,0x2b5,0x2b5,0x2b5,0x2b5,
+0x2b5,0x1e,0x2b5,0x2b5,0x2b5,0x2b5,0x2b5,0x2b5,0x2b5,0x1e,0x2b5,0x1e,0x1e,0x1e,0x2b5,0x2b5,
+0x2b5,0x2b5,0x1e,0x1e,0x4da,0xace,0x4d7,0x4e0,0x4e0,0x4d7,0x4d7,0x4d7,0x4d7,0x1e,0x1e,0x4e0,
+0x4e0,0x1e,0x1e,0x4e3,0x4e3,0x4dd,0xbac,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x4d7,
+0x1e,0x1e,0x1e,0x1e,0x2b8,0x2b8,0x1e,0x2b8,0x2b5,0x2b5,0x4d7,0x4d7,0x1e,0x1e,0x699,0x699,
+0x699,0x699,0x699,0x699,0x699,0x699,0x699,0x699,0x2b5,0x2b5,0x70e,0x70e,0x2b2,0x2b2,0x2b2,0x2b2,
+0x2b2,0x2b2,0x2b2,0x1e,0x1e,0x1e,0x1e,0x1e,0x21,0xb52,0x4e6,0xb55,0x21,0x2bb,0x2bb,0x2bb,
+0x2bb,0x2bb,0x2bb,0x21,0x21,0x21,0x21,0x2bb,0x2bb,0x21,0x21,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,
+0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x21,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,
+0x2bb,0x21,0x2bb,0x2be,0x21,0x2bb,0x2be,0x21,0x2bb,0x2bb,0x21,0x21,0x4e9,0x21,0x4ef,0x4ef,
+0x4ef,0x4e6,0x4e6,0x21,0x21,0x21,0x21,0x4e6,0x4e6,0x21,0x21,0x4e6,0x4e6,0x4ec,0x21,0x21,
+0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x2be,0x2be,0x2be,0x2bb,0x21,0x2be,0x21,
+0x21,0x21,0x21,0x21,0x21,0x21,0x69c,0x69c,0x69c,0x69c,0x69c,0x69c,0x69c,0x69c,0x69c,0x69c,
+0x4e6,0x4e6,0x2bb,0x2bb,0x2bb,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,
+0x24,0x4f2,0x4f2,0x4fb,0x24,0x2c1,0x2c1,0x2c1,0x2c1,0x2c1,0x2c1,0x2c1,0xad1,0x2c1,0x24,0x2c1,
+0x2c1,0x2c1,0x24,0x2c1,0x2c1,0x2c1,0x2c1,0x2c1,0x2c1,0x2c1,0x2c1,0x2c1,0x2c1,0x2c1,0x2c1,0x2c1,
+0x2c1,0x24,0x2c1,0x2c1,0x2c1,0x2c1,0x2c1,0x2c1,0x2c1,0x24,0x2c1,0x2c1,0x24,0x2c1,0x2c1,0x2c1,
+0x2c1,0x2c1,0x24,0x24,0x4f5,0x2c1,0x4fb,0x4fb,0x4fb,0x4f2,0x4f2,0x4f2,0x4f2,0x4f2,0x24,0x4f2,
+0x4f2,0x4fb,0x24,0x4fb,0x4fb,0x4f8,0x24,0x24,0x2c1,0x24,0x24,0x24,0x24,0x24,0x24,0x24,
+0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x2c1,0xad1,0xb58,0xb58,0x24,0x24,0x69f,0x69f,
+0x69f,0x69f,0x69f,0x69f,0x69f,0x69f,0x69f,0x69f,0x24,0xb8b,0x24,0x24,0x24,0x24,0x24,0x24,
+0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x27,0x4fe,0x507,0x507,0x27,0x2c7,0x2c7,0x2c7,
+0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x27,0x27,0x2c7,0x2c7,0x27,0x27,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,
+0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x27,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,
+0x2c7,0x27,0x2c7,0x2c7,0x27,0xad4,0x2c7,0x2c7,0x2c7,0x2c7,0x27,0x27,0x501,0x2c7,0x4fe,0x4fe,
+0x507,0x4fe,0x4fe,0x4fe,0x27,0x27,0x27,0x507,0x50a,0x27,0x27,0x50a,0x50a,0x504,0x27,0x27,
+0x27,0x27,0x27,0x27,0x27,0x27,0x4fe,0x4fe,0x27,0x27,0x27,0x27,0x2ca,0x2ca,0x27,0x2c7,
+0x2c7,0x2c7,0x27,0x27,0x27,0x27,0x6a2,0x6a2,0x6a2,0x6a2,0x6a2,0x6a2,0x6a2,0x6a2,0x6a2,0x6a2,
+0x2c4,0xad4,0x27,0x27,0x27,0x27,0x27,0x27,0x27,0x27,0x27,0x27,0x27,0x27,0x27,0x27,
+0x2a,0x2a,0x50d,0x2d0,0x2a,0x2d0,0x2d0,0x2d0,0x2d0,0x2d0,0x2d0,0x2a,0x2a,0x2a,0x2d0,0x2d0,
+0x2d0,0x2a,0x2d0,0x2d0,0x2d3,0x2d0,0x2a,0x2a,0x2a,0x2d0,0x2d0,0x2a,0x2d0,0x2a,0x2d0,0x2d0,
+0x2a,0x2a,0x2a,0x2d0,0x2d0,0x2a,0x2a,0x2a,0x2d0,0x2d0,0x2d0,0x2a,0x2a,0x2a,0x2d0,0x2d0,
+0x2d0,0x2d0,0x2d0,0x2d0,0x2d0,0x2d0,0xbaf,0x2d0,0x2d0,0x2d0,0x2a,0x2a,0x2a,0x2a,0x50d,0x513,
+0x50d,0x513,0x513,0x2a,0x2a,0x2a,0x513,0x513,0x513,0x2a,0x516,0x516,0x516,0x510,0x2a,0x2a,
+0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x50d,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
+0x2a,0x2a,0xca5,0x6a5,0x6a5,0x6a5,0x6a5,0x6a5,0x6a5,0x6a5,0x6a5,0x6a5,0x2cd,0x2cd,0x2cd,0xad7,
+0xad7,0xad7,0xad7,0xad7,0xad7,0xb8e,0xad7,0x2a,0x2a,0x2a,0x2a,0x2a,0x2d,0x522,0x522,0x522,
+0x2d,0x2d6,0x2d6,0x2d6,0x2d6,0x2d6,0x2d6,0x2d6,0x2d6,0x2d,0x2d6,0x2d6,0x2d6,0x2d,0x2d6,0x2d6,
+0x2d6,0x2d6,0x2d6,0x2d6,0x2d6,0x2d6,0x2d6,0x2d6,0x2d6,0x2d6,0x2d6,0x2d6,0x2d6,0x2d,0x2d6,0x2d6,
+0x2d6,0x2d6,0x2d6,0x2d6,0x2d6,0x2d6,0x2d6,0x2d6,0x2d,0x2d6,0x2d6,0x2d6,0x2d6,0x2d6,0x2d,0x2d,
+0x2d,0x2d,0x519,0x519,0x519,0x522,0x522,0x522,0x522,0x2d,0x519,0x519,0x51c,0x2d,0x519,0x519,
+0x519,0x51f,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x519,0x519,0x2d,0x2d,0x2d,0x2d,0x2d,
+0x2d,0x2d,0x2d,0x2d,0x2d6,0x2d6,0x2d,0x2d,0x2d,0x2d,0x6a8,0x6a8,0x6a8,0x6a8,0x6a8,0x6a8,
+0x6a8,0x6a8,0x6a8,0x6a8,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,
+0x2d,0x2d,0x2d,0x2d,0x30,0x30,0x52b,0x52b,0x30,0x2d9,0x2d9,0x2d9,0x2d9,0x2d9,0x2d9,0x2d9,
+0x2d9,0x30,0x2d9,0x2d9,0x2d9,0x30,0x2d9,0x2d9,0x2d9,0x2d9,0x2d9,0x2d9,0x2d9,0x2d9,0x2d9,0x2d9,
+0x2d9,0x2d9,0x2d9,0x2d9,0x2d9,0x30,0x2d9,0x2d9,0x2d9,0x2d9,0x2d9,0x2d9,0x2d9,0x2d9,0x2d9,0x2d9,
+0x30,0x2d9,0x2d9,0x2d9,0x2d9,0x2d9,0x30,0x30,0xb5b,0xada,0x52b,0x525,0x52e,0x52b,0x525,0x52b,
+0x52b,0x30,0x525,0x52e,0x52e,0x30,0x52e,0x52e,0x525,0x528,0x30,0x30,0x30,0x30,0x30,0x30,
+0x30,0x525,0x525,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x2d9,0x30,0x2d9,0x2d9,0xd44,0xd44,
+0x30,0x30,0x6ab,0x6ab,0x6ab,0x6ab,0x6ab,0x6ab,0x6ab,0x6ab,0x6ab,0x6ab,0x30,0xcd5,0xcd5,0x30,
+0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x33,0x33,0x537,0x537,
+0x33,0x2dc,0x2dc,0x2dc,0x2dc,0x2dc,0x2dc,0x2dc,0x2dc,0x33,0x2dc,0x2dc,0x2dc,0x33,0x2dc,0x2dc,
+0x2dc,0x2dc,0x2dc,0x2dc,0x2dc,0x2dc,0x2dc,0x2dc,0x2dc,0x2dc,0x2dc,0x2dc,0x2dc,0x33,0x2dc,0x2dc,
+0x2dc,0x2dc,0x2dc,0x2dc,0x2dc,0x2dc,0x2dc,0x2dc,0x2dc,0x2dc,0x2dc,0x2dc,0x2dc,0x2dc,0x33,0x33,
+0x33,0x33,0x531,0x537,0x537,0x531,0x531,0x531,0x33,0x33,0x537,0x537,0x537,0x33,0x53a,0x53a,
+0x53a,0x534,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x531,0x33,0x33,0x33,0x33,
+0x33,0x33,0x33,0x33,0x2dc,0x2dc,0x33,0x33,0x33,0x33,0x6ae,0x6ae,0x6ae,0x6ae,0x6ae,0x6ae,
+0x6ae,0x6ae,0x6ae,0x6ae,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,
+0x33,0x33,0x33,0x33,0x36,0x36,0x8e2,0x8e2,0x36,0x843,0x843,0x843,0x843,0x843,0x843,0x843,
+0x843,0x843,0x843,0x843,0x843,0x843,0x843,0x843,0x843,0x843,0x843,0x36,0x36,0x36,0x843,0x843,
+0x843,0x843,0x843,0x843,0x843,0x843,0x843,0x843,0x843,0x843,0x843,0x843,0x843,0x843,0x843,0x843,
+0x843,0x843,0x36,0x843,0x843,0x843,0x843,0x843,0x843,0x843,0x843,0x843,0x36,0x843,0x36,0x36,
+0x843,0x843,0x843,0x843,0x843,0x843,0x843,0x36,0x36,0x36,0x8df,0x36,0x36,0x36,0x36,0x8dc,
+0x8e2,0x8e2,0x8dc,0x8dc,0x8dc,0x36,0x8dc,0x36,0x8e2,0x8e2,0x8e5,0x8e2,0x8e5,0x8e5,0x8e5,0x8dc,
+#endif /* U_DARWIN */
+0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,
+#ifndef U_DARWIN
+0x36,0x36,0x8ac,0x8ac,0x80a,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,
+0x39,0x729,0x729,0x729,0x729,0x729,0x729,0x729,0x729,0x729,0x729,0x729,0x729,0x729,0x729,0x729,
+0x729,0x729,0x729,0x729,0x729,0x729,0x729,0x729,0x729,0x729,0x729,0x729,0x729,0x729,0x729,0x729,
+0x729,0x71d,0x729,0x726,0x71d,0x71d,0x71d,0x71d,0x71d,0x71d,0x723,0x39,0x39,0x39,0x39,0x6de,
+0x72f,0x72f,0x72f,0x72f,0x72f,0x729,0x72c,0x720,0x720,0x720,0x720,0x720,0x720,0x71d,0x720,0x2dc,
+0x681,0x681,0x681,0x681,0x681,0x681,0x681,0x681,0x681,0x681,0x42f,0x42f,0x39,0x39,0x39,0x39,
+#else /* U_DARWIN */
+0x36,0x36,0x8e2,0x8e2,0x840,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,
+0x39,0x75f,0x75f,0x75f,0x75f,0x75f,0x75f,0x75f,0x75f,0x75f,0x75f,0x75f,0x75f,0x75f,0x75f,0x75f,
+0x75f,0x75f,0x75f,0x75f,0x75f,0x75f,0x75f,0x75f,0x75f,0x75f,0x75f,0x75f,0x75f,0x75f,0x75f,0x75f,
+0x75f,0x753,0x75f,0x75c,0x753,0x753,0x753,0x753,0x753,0x753,0x759,0x39,0x39,0x39,0x39,0x711,
+0x765,0x765,0x765,0x765,0x765,0x75f,0x762,0x756,0x756,0x756,0x756,0x756,0x756,0x753,0x756,0x2df,
+0x6b1,0x6b1,0x6b1,0x6b1,0x6b1,0x6b1,0x6b1,0x6b1,0x6b1,0x6b1,0x441,0x441,0x39,0x39,0x39,0x39,
+#endif /* U_DARWIN */
+0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,
+#ifndef U_DARWIN
+0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x3c,0x73b,0x73b,0x3c,
+0x73b,0x3c,0x3c,0x73b,0x73b,0x3c,0x73b,0x3c,0x3c,0x73b,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,
+0x73b,0x73b,0x73b,0x73b,0x3c,0x73b,0x73b,0x73b,0x73b,0x73b,0x73b,0x73b,0x3c,0x73b,0x73b,0x73b,
+0x3c,0x73b,0x3c,0x73b,0x3c,0x3c,0x73b,0x73b,0x3c,0x73b,0x73b,0x73b,0x73b,0x732,0x73b,0x738,
+0x732,0x732,0x732,0x732,0x732,0x732,0x3c,0x732,0x732,0x73b,0x3c,0x3c,0x744,0x744,0x744,0x744,
+0x744,0x3c,0x741,0x3c,0x735,0x735,0x735,0x735,0x735,0x732,0x3c,0x3c,0x684,0x684,0x684,0x684,
+0x684,0x684,0x684,0x684,0x684,0x684,0x3c,0x3c,0x73e,0x73e,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,
+#else /* U_DARWIN */
+0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x3c,0x771,0x771,0x3c,
+0x771,0x3c,0x3c,0x771,0x771,0x3c,0x771,0x3c,0x3c,0x771,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,
+0x771,0x771,0x771,0x771,0x3c,0x771,0x771,0x771,0x771,0x771,0x771,0x771,0x3c,0x771,0x771,0x771,
+0x3c,0x771,0x3c,0x771,0x3c,0x3c,0x771,0x771,0x3c,0x771,0x771,0x771,0x771,0x768,0x771,0x76e,
+0x768,0x768,0x768,0x768,0x768,0x768,0x3c,0x768,0x768,0x771,0x3c,0x3c,0x77a,0x77a,0x77a,0x77a,
+0x77a,0x3c,0x777,0x3c,0x76b,0x76b,0x76b,0x76b,0x76b,0x768,0x3c,0x3c,0x6b4,0x6b4,0x6b4,0x6b4,
+0x6b4,0x6b4,0x6b4,0x6b4,0x6b4,0x6b4,0x3c,0x3c,0x774,0x774,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,
+#endif /* U_DARWIN */
+0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,
+#ifndef U_DARWIN
+0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x777,0x777,0x777,0x77a,
+0x777,0x777,0x777,0x777,0x3f,0x777,0x777,0x777,0x777,0x77a,0x777,0x777,0x777,0x777,0x77a,0x777,
+0x777,0x777,0x777,0x77a,0x777,0x777,0x777,0x777,0x77a,0x777,0x777,0x777,0x777,0x777,0x777,0x777,
+0x777,0x777,0x777,0x777,0x777,0x77a,0x813,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x792,0x792,0x795,
+0x792,0x795,0x795,0x798,0x795,0x798,0x792,0x792,0x792,0x792,0x792,0x783,0x792,0x795,0x79b,0x79b,
+0x79e,0x780,0x79b,0x79b,0x777,0x777,0x777,0x777,0x3f,0x3f,0x3f,0x3f,0x792,0x792,0x792,0x795,
+0x792,0x792,0x8b2,0x792,0x3f,0x792,0x792,0x792,0x792,0x795,0x792,0x792,0x792,0x792,0x795,0x792,
+0x792,0x792,0x792,0x795,0x792,0x792,0x792,0x792,0x795,0x792,0x8b2,0x8b2,0x8b2,0x792,0x792,0x792,
+0x792,0x792,0x792,0x792,0x8b2,0x795,0x8b2,0x8b2,0x8b2,0x3f,0x86d,0x86d,0x810,0x810,0x810,0x810,
+0x810,0x810,0x8b5,0x810,0x810,0x810,0x810,0x810,0x810,0x3f,0x3f,0x810,0xc0f,0xc0f,0x3f,0x3f,
+#else /* U_DARWIN */
+0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x7ad,0x7ad,0x7ad,0x7b0,
+0x7ad,0x7ad,0x7ad,0x7ad,0x3f,0x7ad,0x7ad,0x7ad,0x7ad,0x7b0,0x7ad,0x7ad,0x7ad,0x7ad,0x7b0,0x7ad,
+0x7ad,0x7ad,0x7ad,0x7b0,0x7ad,0x7ad,0x7ad,0x7ad,0x7b0,0x7ad,0x7ad,0x7ad,0x7ad,0x7ad,0x7ad,0x7ad,
+0x7ad,0x7ad,0x7ad,0x7ad,0x7ad,0x7b0,0x849,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x7c8,0x7c8,0x7cb,
+0x7c8,0x7cb,0x7cb,0x7ce,0x7cb,0x7ce,0x7c8,0x7c8,0x7c8,0x7c8,0x7c8,0x7b9,0x7c8,0x7cb,0x7d1,0x7d1,
+0x7d4,0x7b6,0x7d1,0x7d1,0x7ad,0x7ad,0x7ad,0x7ad,0x3f,0x3f,0x3f,0x3f,0x7c8,0x7c8,0x7c8,0x7cb,
+0x7c8,0x7c8,0x8e8,0x7c8,0x3f,0x7c8,0x7c8,0x7c8,0x7c8,0x7cb,0x7c8,0x7c8,0x7c8,0x7c8,0x7cb,0x7c8,
+0x7c8,0x7c8,0x7c8,0x7cb,0x7c8,0x7c8,0x7c8,0x7c8,0x7cb,0x7c8,0x8e8,0x8e8,0x8e8,0x7c8,0x7c8,0x7c8,
+0x7c8,0x7c8,0x7c8,0x7c8,0x8e8,0x7cb,0x8e8,0x8e8,0x8e8,0x3f,0x8a3,0x8a3,0x846,0x846,0x846,0x846,
+0x846,0x846,0x8eb,0x846,0x846,0x846,0x846,0x846,0x846,0x3f,0x3f,0x846,0xc45,0xc45,0x3f,0x3f,
+#endif /* U_DARWIN */
+0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,
+0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,
+#ifndef U_DARWIN
+0x918,0x918,0x42,0x918,0x918,0x918,0x91b,0x918,0x42,0x918,0x918,0x42,0x915,0x90c,0x90c,0x90c,
+0x90c,0x915,0x90c,0x42,0x42,0x42,0x90c,0x90f,0x915,0x912,0x42,0x42,0x42,0x42,0x42,0x42,
+0x8fa,0x8fa,0x8fa,0x8fa,0x8fa,0x8fa,0x8fa,0x8fa,0x8fa,0x8fa,0x870,0x870,0x816,0x816,0x816,0x816,
+0x918,0x918,0x918,0x918,0x918,0x918,0x915,0x915,0x90c,0x90c,0x42,0x42,0x42,0x42,0x42,0x42,
+#else /* U_DARWIN */
+0x94e,0x94e,0x42,0x94e,0x94e,0x94e,0x951,0x94e,0x42,0x94e,0x94e,0x42,0x94b,0x942,0x942,0x942,
+0x942,0x94b,0x942,0x42,0x42,0x42,0x942,0x945,0x94b,0x948,0x42,0x42,0x42,0x42,0x42,0x42,
+0x930,0x930,0x930,0x930,0x930,0x930,0x930,0x930,0x930,0x930,0x8a6,0x8a6,0x84c,0x84c,0x84c,0x84c,
+0x94e,0x94e,0x94e,0x94e,0x94e,0x94e,0x94b,0x94b,0x942,0x942,0x42,0x42,0x42,0x42,0x42,0x42,
+#endif /* U_DARWIN */
+0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,
+#ifndef U_DARWIN
+0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x2e5,0x2e5,0x2e5,0x2e5,
+0x2e5,0x2e5,0x45,0x45,0x45,0x45,0x45,0x45,0x45,0x45,0x45,0x45,0x2e2,0x2e2,0x2e2,0x2e2,
+0x2e2,0x2e2,0x2e2,0x2e2,0x2e2,0x2e2,0x2e2,0x2e2,0x2e2,0x2e2,0x2e2,0x2e2,0x2e2,0x2e2,0x2e2,0x2e2,
+0x2e2,0x2e2,0x2e2,0x99c,0x99c,0xb7c,0xb7c,0x2df,0xb7f,0x45,0x45,0x45,0x756,0x756,0x756,0x756,
+0x756,0x756,0x756,0x756,0x756,0x756,0x756,0x756,0x756,0x756,0x756,0x756,0x756,0x756,0x756,0x756,
+0x756,0x756,0x756,0x756,0x756,0x756,0x48,0x48,0x48,0x48,0x48,0x759,0x75f,0x75f,0x75f,0x48,
+0x48,0x48,0x48,0x48,0x75c,0x75c,0x75c,0x75c,0x75c,0x75c,0x75c,0x75c,0x75c,0x75c,0x75c,0x75c,
+0x75c,0x75c,0x75c,0x75c,0x75c,0x75c,0x75c,0x75c,0x75c,0x75c,0x75c,0x75c,0x75c,0x75c,0x48,0x48,
+0x48,0x48,0x48,0x48,0x825,0x825,0x825,0x825,0x825,0x825,0x825,0xb85,0x825,0x4b,0x825,0x825,
+0x825,0x825,0x4b,0x4b,0x825,0x825,0x825,0x825,0x825,0x825,0x825,0x4b,0x825,0x4b,0x825,0x825,
+0x825,0x825,0x4b,0x4b,0x825,0x825,0x825,0x825,0x825,0x825,0x825,0xb85,0x825,0x4b,0x825,0x825,
+0x825,0x825,0x4b,0x4b,0x825,0x825,0x825,0x825,0x825,0x825,0x825,0x825,0x825,0x825,0x825,0x825,
+0x825,0x825,0x825,0x825,0x825,0x825,0x825,0xb85,0x825,0x4b,0x825,0x825,0x825,0x825,0x4b,0x4b,
+0x825,0x825,0x825,0x825,0x825,0x825,0x825,0x4b,0x825,0x4b,0x825,0x825,0x825,0x825,0x4b,0x4b,
+0x825,0x825,0x825,0x825,0x825,0x825,0x825,0xb85,0x825,0x825,0x825,0x825,0x825,0x825,0x825,0x4b,
+0x825,0x825,0x825,0x825,0x825,0x825,0x825,0x825,0x825,0x825,0x825,0x825,0x825,0x825,0x825,0xb85,
+0x825,0x4b,0x825,0x825,0x825,0x825,0x4b,0x4b,0x825,0x825,0x825,0x825,0x825,0x825,0x825,0xb85,
+0x825,0x825,0x825,0x825,0x825,0x825,0x825,0x825,0x825,0x825,0x825,0x825,0x825,0x825,0x825,0x825,
+0x825,0x825,0x825,0x4b,0x4b,0x4b,0x4b,0xc24,0xb82,0x873,0x81f,0x81c,0x81c,0x81c,0x81c,0x81f,
+0x81f,0x822,0x822,0x822,0x822,0x822,0x822,0x822,0x822,0x822,0x819,0x819,0x819,0x819,0x819,0x819,
+0x819,0x819,0x819,0x819,0x819,0x4b,0x4b,0x4b,0x828,0x828,0x828,0x828,0x828,0x828,0x828,0x828,
+0x828,0x828,0x828,0x828,0x828,0x828,0x828,0x828,0x828,0x828,0x828,0x828,0x828,0x4e,0x4e,0x4e,
+0x4e,0x4e,0x4e,0x4e,0x4e,0x4e,0x4e,0x4e,0x51,0x831,0x831,0x831,0x831,0x831,0x831,0x831,
+0x831,0x831,0x831,0x831,0x831,0x831,0x831,0x831,0x831,0x831,0x831,0x831,0x831,0x831,0x831,0x831,
+0x831,0x831,0x831,0x831,0x831,0x831,0x831,0x831,0x831,0x82b,0x82e,0x831,0x831,0x831,0x831,0x831,
+0x831,0x831,0x831,0x51,0x51,0x51,0x51,0x51,0x51,0x51,0x51,0x51,0x876,0x834,0x834,0x834,
+0x834,0x834,0x834,0x834,0x834,0x834,0x834,0x834,0x834,0x834,0x834,0x834,0x834,0x834,0x834,0x834,
+0x834,0x834,0x834,0x834,0x834,0x834,0x834,0x903,0x891,0x54,0x54,0x54,0x837,0x837,0x837,0x837,
+0x837,0x837,0x837,0x837,0x837,0x837,0x837,0x879,0x879,0x879,0x837,0x837,0x837,0x57,0x57,0x57,
+0x57,0x57,0x57,0x57,0x57,0x57,0x57,0x57,0x57,0x57,0x57,0x57,0x92d,0x92d,0x92d,0x92d,
+0x92d,0x92d,0x921,0x92d,0x92d,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x927,0x92a,
+0x87f,0x87f,0x8f1,0x930,0x87c,0x83a,0x87f,0x906,0x930,0xb5b,0x5a,0x5a,0x8fd,0x8fd,0x8fd,0x8fd,
+0x8fd,0x8fd,0x8fd,0x8fd,0x8fd,0x8fd,0x5a,0x5a,0x5a,0x5a,0x5a,0x5a,0xaa7,0xaa7,0xaa7,0xaa7,
+0xaa7,0xaa7,0xaa7,0xaa7,0xaa7,0xaa7,0x5a,0x5a,0x5a,0x5a,0x5a,0x5a,0x83d,0x83d,0x882,0x885,
+0x888,0x882,0x88e,0x83d,0x888,0x88b,0x83d,0x8bb,0x8bb,0x8bb,0x8c7,0x5d,0x900,0x900,0x900,0x900,
+0x900,0x900,0x900,0x900,0x900,0x900,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x840,0x840,0x840,0x840,
+0x840,0x840,0x840,0x840,0x840,0x840,0x840,0x840,0x840,0x840,0x840,0x840,0x840,0x840,0x840,0x840,
+0x840,0x840,0x840,0x840,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x2ee,0x2e8,0x2ee,0x2e8,
+0x2ee,0x2e8,0x2ee,0x2e8,0x2ee,0x2e8,0x2ee,0x2e8,0x2ee,0x2e8,0x2ee,0x2e8,0x2ee,0x2e8,0x2ee,0x2e8,
+0x2ee,0x2e8,0x2e8,0x2e8,0x2e8,0x2e8,0x2eb,0x77d,0x60,0x60,0x60,0x60,0x2ee,0x2e8,0x2ee,0x2e8,
+0x2ee,0x2e8,0x2ee,0x2e8,0x2ee,0x2e8,0x2ee,0x2e8,0x2ee,0x2e8,0x2ee,0x2e8,0x2ee,0x2e8,0x2ee,0x2e8,
+0x2ee,0x2e8,0x2ee,0x2e8,0x2ee,0x2e8,0x60,0x60,0x60,0x60,0x60,0x60,0x2f7,0x2f7,0x2f7,0x2f7,
+0x2f7,0x2f7,0x2f7,0x2f7,0x2fa,0x2fa,0x2fa,0x2fa,0x2fa,0x2fa,0x2fa,0x2fa,0x2f7,0x2f7,0x2f7,0x2f7,
+0x2f7,0x2f7,0x63,0x63,0x2fa,0x2fa,0x2fa,0x2fa,0x2fa,0x2fa,0x63,0x63,0x2f7,0x2f7,0x2f7,0x2f7,
+0x2f7,0x2f7,0x2f7,0x2f7,0x63,0x2fa,0x63,0x2fa,0x63,0x2fa,0x63,0x2fa,0x2f7,0x2f7,0x2f7,0x2f7,
+0x2f7,0x2f7,0x2f7,0x2f7,0x2fa,0x2fa,0x2fa,0x2fa,0x2fa,0x2fa,0x2fa,0x2fa,0x2f7,0x2f7,0x2f7,0x2f7,
+0x2f7,0x2f7,0x2f7,0x2f7,0x2f7,0x2f7,0x2f7,0x2f7,0x2f7,0x2f7,0x63,0x63,0x2f7,0x2f7,0x2f7,0x2f7,
+0x2f7,0x2f7,0x2f7,0x2f7,0x2fa,0x2fa,0x2fa,0x2fa,0x2fa,0x2fa,0x2fa,0x2fa,0x2f7,0x2f7,0x2f7,0x2f7,
+0x2f7,0x63,0x2f7,0x2f7,0x2fa,0x2fa,0x2fa,0x2fa,0x2fa,0x2f4,0x2f7,0x2f4,0x2f4,0x2f1,0x2f7,0x2f7,
+0x2f7,0x63,0x2f7,0x2f7,0x2fa,0x2fa,0x2fa,0x2fa,0x2fa,0x2f1,0x2f1,0x2f1,0x2f7,0x2f7,0x2f7,0x2f7,
+0x63,0x63,0x2f7,0x2f7,0x2fa,0x2fa,0x2fa,0x2fa,0x63,0x2f1,0x2f1,0x2f1,0x2f7,0x2f7,0x2f7,0x2f7,
+0x2f7,0x2f7,0x2f7,0x2f7,0x2fa,0x2fa,0x2fa,0x2fa,0x2fa,0x2f1,0x2f1,0x2f1,0x63,0x63,0x2f7,0x2f7,
+0x2f7,0x63,0x2f7,0x2f7,0x2fa,0x2fa,0x2fa,0x2fa,0x2fa,0x2f1,0x2f4,0x63,0xa71,0x99f,0x99f,0x99f,
+0x66,0x66,0x66,0x66,0x66,0x66,0x528,0x528,0x528,0x528,0x528,0x528,0x30c,0x9ab,0x69,0x69,
+0x1a1,0x30c,0x30c,0x30c,0x30c,0x30c,0x312,0x318,0x312,0x693,0x45c,0x1a4,0x309,0x19e,0x19e,0x19e,
+0x19e,0x309,0x309,0x309,0x309,0x309,0x30f,0x315,0x30f,0x690,0x459,0x69,0xb8b,0xb8b,0xb8b,0xb8b,
+0xb8b,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x6e1,0x6e1,0x6e1,0x6e1,
+0x6e1,0x6e1,0x6e1,0x6bd,0x6e4,0x6f6,0x6e1,0x7b6,0x7cb,0x909,0x909,0x909,0xa6e,0xa6e,0xc7e,0xc7e,
+0xc7e,0xc7e,0x6c,0x6c,0x6c,0x6c,0x6c,0x6c,0x6c,0x6c,0x6c,0x6c,0x6c,0x6c,0x6c,0x6c,
+0x6c,0x6c,0x6c,0x6c,0x531,0x531,0x531,0x531,0x531,0x531,0x531,0x531,0x531,0x531,0x531,0x531,
+0x531,0x52e,0x52e,0x52e,0x52e,0x531,0x8be,0x8be,0xa11,0xa17,0xa17,0xa14,0xa14,0xa14,0xa14,0xc27,
+0xd11,0xd11,0xd11,0xd11,0x6f,0x6f,0x6f,0x6f,0x6f,0x6f,0x6f,0x6f,0x6f,0x6f,0x6f,0x6f,
+0x6f,0x6f,0x6f,0x6f,0x9b4,0x9b1,0x9b1,0x9b1,0x9b1,0x9ba,0x9b7,0x9b7,0x9b7,0x9b7,0x9ae,0x9b1,
+0xb8e,0xca2,0xca5,0x72,0x75,0x75,0x75,0x3e7,0x1b3,0x16b,0x33c,0x33c,0x33c,0x33c,0x33c,0x1b3,
+0x3e7,0x3e7,0x1b3,0x33c,0x342,0x342,0x342,0x84f,0xca8,0x75,0x75,0x75,0x75,0x75,0x75,0x75,
+0x75,0x75,0x75,0x75,0x1bf,0x1bf,0x1bf,0x1bf,0x1bf,0x1bc,0x1bc,0x1bc,0x1bc,0x1bc,0x351,0x351,
+0x348,0x348,0x348,0x348,0xcae,0xcae,0xcab,0xcab,0xcab,0xcab,0xcab,0xcab,0x78,0x78,0x78,0x78,
+#else /* U_DARWIN */
+0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x2e8,0x2e8,0x2e8,0x2e8,
+0x2e8,0x2e8,0x45,0x45,0x45,0x45,0x45,0x45,0x45,0x45,0x45,0x45,0x2e5,0x2e5,0x2e5,0x2e5,
+0x2e5,0x2e5,0x2e5,0x2e5,0x2e5,0x2e5,0x2e5,0x2e5,0x2e5,0x2e5,0x2e5,0x2e5,0x2e5,0x2e5,0x2e5,0x2e5,
+0x2e5,0x2e5,0x2e5,0x9d2,0x9d2,0xbb2,0xbb2,0x2e2,0xbb5,0x45,0x45,0x45,0x78c,0x78c,0x78c,0x78c,
+0x78c,0x78c,0x78c,0x78c,0x78c,0x78c,0x78c,0x78c,0x78c,0x78c,0x78c,0x78c,0x78c,0x78c,0x78c,0x78c,
+0x78c,0x78c,0x78c,0x78c,0x78c,0x78c,0x48,0x48,0x48,0x48,0x48,0x78f,0x795,0x795,0x795,0x48,
+0x48,0x48,0x48,0x48,0x792,0x792,0x792,0x792,0x792,0x792,0x792,0x792,0x792,0x792,0x792,0x792,
+0x792,0x792,0x792,0x792,0x792,0x792,0x792,0x792,0x792,0x792,0x792,0x792,0x792,0x792,0x48,0x48,
+0x48,0x48,0x48,0x48,0x85b,0x85b,0x85b,0x85b,0x85b,0x85b,0x85b,0xbbb,0x85b,0x4b,0x85b,0x85b,
+0x85b,0x85b,0x4b,0x4b,0x85b,0x85b,0x85b,0x85b,0x85b,0x85b,0x85b,0x4b,0x85b,0x4b,0x85b,0x85b,
+0x85b,0x85b,0x4b,0x4b,0x85b,0x85b,0x85b,0x85b,0x85b,0x85b,0x85b,0xbbb,0x85b,0x4b,0x85b,0x85b,
+0x85b,0x85b,0x4b,0x4b,0x85b,0x85b,0x85b,0x85b,0x85b,0x85b,0x85b,0x85b,0x85b,0x85b,0x85b,0x85b,
+0x85b,0x85b,0x85b,0x85b,0x85b,0x85b,0x85b,0xbbb,0x85b,0x4b,0x85b,0x85b,0x85b,0x85b,0x4b,0x4b,
+0x85b,0x85b,0x85b,0x85b,0x85b,0x85b,0x85b,0x4b,0x85b,0x4b,0x85b,0x85b,0x85b,0x85b,0x4b,0x4b,
+0x85b,0x85b,0x85b,0x85b,0x85b,0x85b,0x85b,0xbbb,0x85b,0x85b,0x85b,0x85b,0x85b,0x85b,0x85b,0x4b,
+0x85b,0x85b,0x85b,0x85b,0x85b,0x85b,0x85b,0x85b,0x85b,0x85b,0x85b,0x85b,0x85b,0x85b,0x85b,0xbbb,
+0x85b,0x4b,0x85b,0x85b,0x85b,0x85b,0x4b,0x4b,0x85b,0x85b,0x85b,0x85b,0x85b,0x85b,0x85b,0xbbb,
+0x85b,0x85b,0x85b,0x85b,0x85b,0x85b,0x85b,0x85b,0x85b,0x85b,0x85b,0x85b,0x85b,0x85b,0x85b,0x85b,
+0x85b,0x85b,0x85b,0x4b,0x4b,0x4b,0x4b,0xc5a,0xbb8,0x8a9,0x855,0x852,0x852,0x852,0x852,0x855,
+0x855,0x858,0x858,0x858,0x858,0x858,0x858,0x858,0x858,0x858,0x84f,0x84f,0x84f,0x84f,0x84f,0x84f,
+0x84f,0x84f,0x84f,0x84f,0x84f,0x4b,0x4b,0x4b,0x85e,0x85e,0x85e,0x85e,0x85e,0x85e,0x85e,0x85e,
+0x85e,0x85e,0x85e,0x85e,0x85e,0x85e,0x85e,0x85e,0x85e,0x85e,0x85e,0x85e,0x85e,0x4e,0x4e,0x4e,
+0x4e,0x4e,0x4e,0x4e,0x4e,0x4e,0x4e,0x4e,0x51,0x867,0x867,0x867,0x867,0x867,0x867,0x867,
+0x867,0x867,0x867,0x867,0x867,0x867,0x867,0x867,0x867,0x867,0x867,0x867,0x867,0x867,0x867,0x867,
+0x867,0x867,0x867,0x867,0x867,0x867,0x867,0x867,0x867,0x861,0x864,0x867,0x867,0x867,0x867,0x867,
+0x867,0x867,0x867,0x51,0x51,0x51,0x51,0x51,0x51,0x51,0x51,0x51,0x8ac,0x86a,0x86a,0x86a,
+0x86a,0x86a,0x86a,0x86a,0x86a,0x86a,0x86a,0x86a,0x86a,0x86a,0x86a,0x86a,0x86a,0x86a,0x86a,0x86a,
+0x86a,0x86a,0x86a,0x86a,0x86a,0x86a,0x86a,0x939,0x8c7,0x54,0x54,0x54,0x86d,0x86d,0x86d,0x86d,
+0x86d,0x86d,0x86d,0x86d,0x86d,0x86d,0x86d,0x8af,0x8af,0x8af,0x86d,0x86d,0x86d,0x57,0x57,0x57,
+0x57,0x57,0x57,0x57,0x57,0x57,0x57,0x57,0x57,0x57,0x57,0x57,0x963,0x963,0x963,0x963,
+0x963,0x963,0x957,0x963,0x963,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95d,0x960,
+0x8b5,0x8b5,0x927,0x966,0x8b2,0x870,0x8b5,0x93c,0x966,0xb91,0x5a,0x5a,0x933,0x933,0x933,0x933,
+0x933,0x933,0x933,0x933,0x933,0x933,0x5a,0x5a,0x5a,0x5a,0x5a,0x5a,0xadd,0xadd,0xadd,0xadd,
+0xadd,0xadd,0xadd,0xadd,0xadd,0xadd,0x5a,0x5a,0x5a,0x5a,0x5a,0x5a,0x873,0x873,0x8b8,0x8bb,
+0x8be,0x8b8,0x8c4,0x873,0x8be,0x8c1,0x873,0x8f1,0x8f1,0x8f1,0x8fd,0x5d,0x936,0x936,0x936,0x936,
+0x936,0x936,0x936,0x936,0x936,0x936,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x876,0x876,0x876,0x876,
+0x876,0x876,0x876,0x876,0x876,0x876,0x876,0x876,0x876,0x876,0x876,0x876,0x876,0x876,0x876,0x876,
+0x876,0x876,0x876,0x876,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x2f1,0x2eb,0x2f1,0x2eb,
+0x2f1,0x2eb,0x2f1,0x2eb,0x2f1,0x2eb,0x2f1,0x2eb,0x2f1,0x2eb,0x2f1,0x2eb,0x2f1,0x2eb,0x2f1,0x2eb,
+0x2f1,0x2eb,0x2eb,0x2eb,0x2eb,0x2eb,0x2ee,0x7b3,0x60,0x60,0x60,0x60,0x2f1,0x2eb,0x2f1,0x2eb,
+0x2f1,0x2eb,0x2f1,0x2eb,0x2f1,0x2eb,0x2f1,0x2eb,0x2f1,0x2eb,0x2f1,0x2eb,0x2f1,0x2eb,0x2f1,0x2eb,
+0x2f1,0x2eb,0x2f1,0x2eb,0x2f1,0x2eb,0x60,0x60,0x60,0x60,0x60,0x60,0x2fa,0x2fa,0x2fa,0x2fa,
+0x2fa,0x2fa,0x2fa,0x2fa,0x2fd,0x2fd,0x2fd,0x2fd,0x2fd,0x2fd,0x2fd,0x2fd,0x2fa,0x2fa,0x2fa,0x2fa,
+0x2fa,0x2fa,0x63,0x63,0x2fd,0x2fd,0x2fd,0x2fd,0x2fd,0x2fd,0x63,0x63,0x2fa,0x2fa,0x2fa,0x2fa,
+0x2fa,0x2fa,0x2fa,0x2fa,0x63,0x2fd,0x63,0x2fd,0x63,0x2fd,0x63,0x2fd,0x2fa,0x2fa,0x2fa,0x2fa,
+0x2fa,0x2fa,0x2fa,0x2fa,0x2fd,0x2fd,0x2fd,0x2fd,0x2fd,0x2fd,0x2fd,0x2fd,0x2fa,0x2fa,0x2fa,0x2fa,
+0x2fa,0x2fa,0x2fa,0x2fa,0x2fa,0x2fa,0x2fa,0x2fa,0x2fa,0x2fa,0x63,0x63,0x2fa,0x2fa,0x2fa,0x2fa,
+0x2fa,0x2fa,0x2fa,0x2fa,0x2fd,0x2fd,0x2fd,0x2fd,0x2fd,0x2fd,0x2fd,0x2fd,0x2fa,0x2fa,0x2fa,0x2fa,
+0x2fa,0x63,0x2fa,0x2fa,0x2fd,0x2fd,0x2fd,0x2fd,0x2fd,0x2f7,0x2fa,0x2f7,0x2f7,0x2f4,0x2fa,0x2fa,
+0x2fa,0x63,0x2fa,0x2fa,0x2fd,0x2fd,0x2fd,0x2fd,0x2fd,0x2f4,0x2f4,0x2f4,0x2fa,0x2fa,0x2fa,0x2fa,
+0x63,0x63,0x2fa,0x2fa,0x2fd,0x2fd,0x2fd,0x2fd,0x63,0x2f4,0x2f4,0x2f4,0x2fa,0x2fa,0x2fa,0x2fa,
+0x2fa,0x2fa,0x2fa,0x2fa,0x2fd,0x2fd,0x2fd,0x2fd,0x2fd,0x2f4,0x2f4,0x2f4,0x63,0x63,0x2fa,0x2fa,
+0x2fa,0x63,0x2fa,0x2fa,0x2fd,0x2fd,0x2fd,0x2fd,0x2fd,0x2f4,0x2f7,0x63,0xaa7,0x9d5,0x9d5,0x9d5,
+0x66,0x66,0x66,0x66,0x66,0x66,0x543,0x543,0x543,0x543,0x543,0x543,0x30f,0x9e1,0x69,0x69,
+0x1a1,0x30f,0x30f,0x30f,0x30f,0x30f,0x315,0x31b,0x315,0x6c3,0x471,0x1a4,0x30c,0x19e,0x19e,0x19e,
+0x19e,0x30c,0x30c,0x30c,0x30c,0x30c,0x312,0x318,0x312,0x6c0,0x46e,0x69,0xbc1,0xbc1,0xbc1,0xbc1,
+0xbc1,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x714,0x714,0x714,0x714,
+0x714,0x714,0x714,0x6f0,0x717,0x72c,0x714,0x7ec,0x801,0x93f,0x93f,0x93f,0xaa4,0xaa4,0xcb4,0xcb4,
+0xcb4,0xcb4,0x6c,0x6c,0x6c,0x6c,0x6c,0x6c,0x6c,0x6c,0x6c,0x6c,0x6c,0x6c,0x6c,0x6c,
+0x6c,0x6c,0x6c,0x6c,0x54c,0x54c,0x54c,0x54c,0x54c,0x54c,0x54c,0x54c,0x54c,0x54c,0x54c,0x54c,
+0x54c,0x549,0x549,0x549,0x549,0x54c,0x8f4,0x8f4,0xa47,0xa4d,0xa4d,0xa4a,0xa4a,0xa4a,0xa4a,0xc5d,
+0xd47,0xd47,0xd47,0xd47,0x6f,0x6f,0x6f,0x6f,0x6f,0x6f,0x6f,0x6f,0x6f,0x6f,0x6f,0x6f,
+0x6f,0x6f,0x6f,0x6f,0x9ea,0x9e7,0x9e7,0x9e7,0x9e7,0x9f0,0x9ed,0x9ed,0x9ed,0x9ed,0x9e4,0x9e7,
+0xbc4,0xcd8,0xcdb,0x72,0x75,0x75,0x75,0x3f0,0x1b3,0x16b,0x33f,0x33f,0x33f,0x33f,0x33f,0x1b3,
+0x3f0,0x3f0,0x1b3,0x33f,0x345,0x345,0x345,0x885,0xcde,0x75,0x75,0x75,0x75,0x75,0x75,0x75,
+0x75,0x75,0x75,0x75,0x1bf,0x1bf,0x1bf,0x1bf,0x1bf,0x1bc,0x1bc,0x1bc,0x1bc,0x1bc,0x354,0x354,
+0x34b,0x34b,0x34b,0x34b,0xce4,0xce4,0xce1,0xce1,0xce1,0xce1,0xce1,0xce1,0x78,0x78,0x78,0x78,
+#endif /* U_DARWIN */
+0x78,0x78,0x78,0x78,0x78,0x78,0x78,0x78,0x78,0x78,0x78,0x78,0x78,0x78,0x78,0x78,
+#ifndef U_DARWIN
+0x78,0x78,0x78,0x78,0x363,0x363,0x363,0x363,0x363,0x858,0x858,0x7b,0x7b,0x7b,0x7b,0x7b,
+#else /* U_DARWIN */
+0x78,0x78,0x78,0x78,0x366,0x366,0x366,0x366,0x366,0x88e,0x88e,0x7b,0x7b,0x7b,0x7b,0x7b,
+#endif /* U_DARWIN */
+0x7b,0x7b,0x7b,0x7b,0x7b,0x7b,0x7b,0x7b,0x7b,0x7b,0x7b,0x7b,0x7b,0x7b,0x7b,0x7b,
+#ifndef U_DARWIN
+0x7b,0x7b,0x7b,0x7b,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x7e,
+#else /* U_DARWIN */
+0x7b,0x7b,0x7b,0x7b,0x369,0x369,0x369,0x369,0x369,0x369,0x369,0x369,0x369,0x369,0x369,0x7e,
+#endif /* U_DARWIN */
+0x7e,0x7e,0x7e,0x7e,0x7e,0x7e,0x7e,0x7e,0x7e,0x7e,0x7e,0x7e,0x7e,0x7e,0x7e,0x7e,
+#ifndef U_DARWIN
+0x7e,0x7e,0x7e,0x7e,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0xab9,0xab9,
+0xab9,0xab9,0xab9,0xab9,0xab9,0xab9,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,
+0xb97,0x81,0x81,0x81,0xab9,0xab9,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,
+0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xcb1,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x81,
+#else /* U_DARWIN */
+0x7e,0x7e,0x7e,0x7e,0xa05,0xa05,0xa05,0xa05,0xa05,0xa05,0xa05,0xa05,0xa05,0xa05,0xaef,0xaef,
+0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xbcd,0xbcd,0xbcd,0xbcd,0xbcd,0xbcd,0xbcd,0xbcd,0xbcd,0xbcd,
+0xbcd,0x81,0x81,0x81,0xaef,0xaef,0xbcd,0xbcd,0xbcd,0xbcd,0xbcd,0xbcd,0xbcd,0xbcd,0xbcd,0xbcd,
+0xbcd,0xbcd,0xbcd,0xbcd,0xbcd,0xbcd,0xce7,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x81,
+#endif /* U_DARWIN */
+0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x81,
+#ifndef U_DARWIN
+0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x84,0x375,0x375,0x375,0x375,0x84,0x375,0x375,
+0x375,0x375,0x84,0x84,0x375,0x375,0x375,0x375,0x375,0x375,0x375,0x375,0x375,0x375,0x375,0x375,
+0x375,0x375,0x375,0x375,0x375,0x375,0x375,0x375,0x84,0x375,0x375,0x375,0x375,0x375,0x375,0x375,
+0x375,0x375,0x375,0x375,0x375,0x375,0x375,0x375,0x375,0x375,0x375,0x375,0x375,0x3ed,0x375,0x375,
+0x375,0x375,0x375,0x375,0x375,0x375,0x375,0x375,0x375,0x375,0x375,0x375,0x84,0x375,0x84,0x375,
+0x375,0x375,0x375,0x84,0x84,0x84,0x375,0x84,0x375,0x375,0x375,0x70e,0x70e,0x70e,0x70e,0x84,
+0x84,0x375,0x55b,0x55b,0x375,0x375,0x375,0x375,0xa5c,0xa02,0xa5c,0xa02,0xa5c,0xa02,0xa5c,0xa02,
+0xa5c,0xa02,0xa5c,0xa02,0xa5c,0xa02,0x1ec,0x1ec,0x1ec,0x1ec,0x1ec,0x1ec,0x1ec,0x1ec,0x1ec,0x1ec,
+#else /* U_DARWIN */
+0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x84,0x378,0x378,0x378,0x378,0x84,0x378,0x378,
+0x378,0x378,0x84,0x84,0x378,0x378,0x378,0x378,0x378,0x378,0x378,0x378,0x378,0x378,0x378,0x378,
+0x378,0x378,0x378,0x378,0x378,0x378,0x378,0x378,0x84,0x378,0x378,0x378,0x378,0x378,0x378,0x378,
+0x378,0x378,0x378,0x378,0x378,0x378,0x378,0x378,0x378,0x378,0x378,0x378,0x378,0x3f6,0x378,0x378,
+0x378,0x378,0x378,0x378,0x378,0x378,0x378,0x378,0x378,0x378,0x378,0x378,0x84,0x378,0x84,0x378,
+0x378,0x378,0x378,0x84,0x84,0x84,0x378,0x84,0x378,0x378,0x378,0x744,0x744,0x744,0x744,0x84,
+0x84,0x378,0x57c,0x57c,0x378,0x378,0x378,0x378,0xa92,0xa38,0xa92,0xa38,0xa92,0xa38,0xa92,0xa38,
+0xa92,0xa38,0xa92,0xa38,0xa92,0xa38,0x1ec,0x1ec,0x1ec,0x1ec,0x1ec,0x1ec,0x1ec,0x1ec,0x1ec,0x1ec,
+#endif /* U_DARWIN */
+0x174,0x174,0x174,0x174,0x174,0x174,0x174,0x174,0x174,0x174,0x174,0x174,0x174,0x174,0x174,0x174,
+#ifndef U_DARWIN
+0x174,0x174,0x174,0x174,0x375,0x84,0x84,0x84,0x375,0x375,0x375,0x375,0x375,0x375,0x375,0x375,
+0x375,0x375,0x375,0x375,0x375,0x375,0x375,0x375,0x84,0x375,0x375,0x375,0x375,0x375,0x375,0x375,
+0x375,0x375,0x375,0x375,0x375,0x375,0x375,0x84,0x8d0,0x8d0,0x8d0,0x8d0,0x8d0,0x8d0,0x8d0,0x8d0,
+0x8d0,0x8d0,0x8d0,0x8d0,0x8d0,0x8d0,0x8d0,0x8d0,0x8d0,0x8d0,0x8d0,0x8d0,0x8d0,0x8d0,0x8d0,0x8d0,
+0x8d0,0x8d0,0x87,0x8d0,0x8d0,0x8d0,0x8d0,0x8d3,0x8d0,0x8d0,0x8d0,0x8d0,0x8d0,0x8d0,0x8d0,0x8d0,
+0x8d0,0x8d0,0x8d0,0x8d0,0x8d0,0x8d0,0x8d0,0x8d0,0x8d0,0x8d0,0x8d0,0x8d3,0x87,0x87,0x87,0x87,
+0x87,0x87,0x87,0x87,0x87,0x87,0x87,0x87,0x8d6,0x8d6,0x8d6,0x8d6,0x8d6,0x8d6,0x8d6,0x8d6,
+0x8d6,0x8d6,0x8d6,0x8d6,0x8d6,0x8d6,0x8d6,0x8d6,0x8d6,0x8d6,0x8d6,0x8d6,0x8d6,0x8d6,0x8a,0x8a,
+0x8a,0x8a,0x8a,0x8a,0x8a,0x8a,0x8a,0x8a,0x90,0x642,0x5b5,0x642,0x5b5,0x642,0x5b5,0x642,
+0x5b5,0x642,0x5b5,0x5b5,0x5b8,0x5b5,0x5b8,0x5b5,0x5b8,0x5b5,0x5b8,0x5b5,0x5b8,0x5b5,0x5b8,0x5b5,
+0x5b8,0x5b5,0x5b8,0x5b5,0x5b8,0x5b5,0x5b8,0x5b5,0x5b5,0x5b5,0x5b5,0x642,0x5b5,0x642,0x5b5,0x642,
+0x5b5,0x5b5,0x5b5,0x5b5,0x5b5,0x5b5,0x642,0x5b5,0x5b5,0x5b5,0x5b5,0x5b5,0x5b8,0xa53,0xa53,0x90,
+0x90,0x549,0x549,0x63f,0x63f,0x645,0x648,0xa38,0x93,0x93,0x93,0x93,0x93,0x5c1,0x5c1,0x5c1,
+0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,
+0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x93,0x93,0x93,0x96,0x5c4,0x5c4,0x5c4,
+0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x96,
+0x5ca,0x5ca,0x5cd,0x5cd,0x5cd,0x5cd,0x5cd,0x5cd,0x5cd,0x5cd,0x5cd,0x5cd,0x5cd,0x5cd,0x5cd,0x5cd,
+0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,
+0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99,
+0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,
+0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0xb40,0xb40,0x9c,
+0x5d3,0x5d3,0x5d3,0x5d3,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,
+0xb3d,0xa3e,0xa3e,0xa3e,0xa3e,0xa3e,0xa3e,0xa3e,0xa3e,0xa3e,0xa3e,0xa3e,0xa3e,0xa3e,0xa3e,0xa3e,
+0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,
+0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x9c,
+0x8e8,0x8e8,0x8e8,0x8e8,0x8e8,0x8e8,0x8e8,0x8e8,0x8e8,0x8e8,0x8e8,0x8e8,0x8e8,0x8e8,0x8e8,0x8e8,
+0x8e8,0x8e8,0x8e8,0x8e8,0x8e8,0x8e8,0x9f,0x9f,0x9f,0x9f,0x9f,0x9f,0x9f,0x9f,0x9f,0x9f,
+0x5e5,0x5e5,0x5e5,0x5e5,0x5e5,0x5e5,0xc60,0xc60,0xc60,0xc60,0xc60,0xc60,0xc60,0xc60,0xc60,0xc60,
+0xc60,0xc60,0xc60,0xc60,0xc60,0xc60,0xc60,0xc60,0xc60,0xc60,0xc60,0xc60,0xa2,0xa2,0xa2,0xa2,
+#else /* U_DARWIN */
+0x174,0x174,0x174,0x174,0x378,0x84,0x84,0x84,0x378,0x378,0x378,0x378,0x378,0x378,0x378,0x378,
+0x378,0x378,0x378,0x378,0x378,0x378,0x378,0x378,0x84,0x378,0x378,0x378,0x378,0x378,0x378,0x378,
+0x378,0x378,0x378,0x378,0x378,0x378,0x378,0x84,0x906,0x906,0x906,0x906,0x906,0x906,0x906,0x906,
+0x906,0x906,0x906,0x906,0x906,0x906,0x906,0x906,0x906,0x906,0x906,0x906,0x906,0x906,0x906,0x906,
+0x906,0x906,0x87,0x906,0x906,0x906,0x906,0x909,0x906,0x906,0x906,0x906,0x906,0x906,0x906,0x906,
+0x906,0x906,0x906,0x906,0x906,0x906,0x906,0x906,0x906,0x906,0x906,0x909,0x87,0x87,0x87,0x87,
+0x87,0x87,0x87,0x87,0x87,0x87,0x87,0x87,0x90c,0x90c,0x90c,0x90c,0x90c,0x90c,0x90c,0x90c,
+0x90c,0x90c,0x90c,0x90c,0x90c,0x90c,0x90c,0x90c,0x90c,0x90c,0x90c,0x90c,0x90c,0x90c,0x8a,0x8a,
+0x8a,0x8a,0x8a,0x8a,0x8a,0x8a,0x8a,0x8a,0x90,0x66c,0x5dc,0x66c,0x5dc,0x66c,0x5dc,0x66c,
+0x5dc,0x66c,0x5dc,0x5dc,0x5df,0x5dc,0x5df,0x5dc,0x5df,0x5dc,0x5df,0x5dc,0x5df,0x5dc,0x5df,0x5dc,
+0x5df,0x5dc,0x5df,0x5dc,0x5df,0x5dc,0x5df,0x5dc,0x5dc,0x5dc,0x5dc,0x66c,0x5dc,0x66c,0x5dc,0x66c,
+0x5dc,0x5dc,0x5dc,0x5dc,0x5dc,0x5dc,0x66c,0x5dc,0x5dc,0x5dc,0x5dc,0x5dc,0x5df,0xa89,0xa89,0x90,
+0x90,0x56a,0x56a,0x669,0x669,0x66f,0x672,0xa6e,0x93,0x93,0x93,0x93,0x93,0x5e8,0x5e8,0x5e8,
+0x5e8,0x5e8,0x5e8,0x5e8,0x5e8,0x5e8,0x5e8,0x5e8,0x5e8,0x5e8,0x5e8,0x5e8,0x5e8,0x5e8,0x5e8,0x5e8,
+0x5e8,0x5e8,0x5e8,0x5e8,0x5e8,0x5e8,0x5e8,0x5e8,0x5e8,0x93,0x93,0x93,0x96,0x5eb,0x5eb,0x5eb,
+0x5eb,0x5eb,0x5eb,0x5eb,0x5eb,0x5eb,0x5eb,0x5eb,0x5eb,0x5eb,0x5eb,0x5eb,0x5eb,0x5eb,0x5eb,0x96,
+0x5f1,0x5f1,0x5f4,0x5f4,0x5f4,0x5f4,0x5f4,0x5f4,0x5f4,0x5f4,0x5f4,0x5f4,0x5f4,0x5f4,0x5f4,0x5f4,
+0x91b,0x91b,0x91b,0x91b,0x91b,0x91b,0x91b,0x91b,0x91b,0x91b,0x91b,0x91b,0x91b,0x91b,0x91b,0x91b,
+0x91b,0x91b,0x91b,0x91b,0x91b,0x91b,0x91b,0x91b,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99,
+0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,
+0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0xb76,0xb76,0x9c,
+0x5fa,0x5fa,0x5fa,0x5fa,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,
+0xb73,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,
+0x5fd,0x5fd,0x5fd,0x5fd,0x5fd,0x5fd,0x5fd,0x5fd,0x5fd,0x5fd,0x5fd,0x5fd,0x5fd,0x5fd,0x5fd,0x5fd,
+0x5fd,0x5fd,0x5fd,0x5fd,0x5fd,0x5fd,0x5fd,0x5fd,0x5fd,0x5fd,0x5fd,0x5fd,0x5fd,0x5fd,0x5fd,0x9c,
+0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,
+0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0x9f,0x9f,0x9f,0x9f,0x9f,0x9f,0x9f,0x9f,0x9f,0x9f,
+0x60c,0x60c,0x60c,0x60c,0x60c,0x60c,0xc96,0xc96,0xc96,0xc96,0xc96,0xc96,0xc96,0xc96,0xc96,0xc96,
+0xc96,0xc96,0xc96,0xc96,0xc96,0xc96,0xc96,0xc96,0xc96,0xc96,0xc96,0xc96,0xa2,0xa2,0xa2,0xa2,
+#endif /* U_DARWIN */
+0xa2,0xa2,0xa2,0xa2,0xa2,0xa2,0xa2,0xa2,0xa2,0xa2,0xa2,0xa2,0xa2,0xa2,0xa2,0xa2,
+#ifndef U_DARWIN
+0xa2,0xa2,0xa2,0xa2,0xa2,0xa2,0xa2,0xa2,0xa2,0xa2,0xa2,0xa2,0x8eb,0x8eb,0x8eb,0x8eb,
+0x8eb,0x8eb,0x8eb,0x8eb,0x8eb,0x8eb,0x8eb,0x8eb,0x8eb,0xa5,0xa5,0xa5,0x8ee,0x8ee,0x8ee,0x8ee,
+0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x5e8,0x5eb,0x5e8,0x5eb,
+0x5eb,0x5e8,0x5e8,0x5eb,0x5eb,0x5eb,0x5e8,0x5e8,0x5e8,0x5e8,0xae,0xae,0xa44,0xa44,0xa44,0xa44,
+0xa44,0xa44,0xa44,0xa44,0xa44,0xa44,0xa44,0xa44,0xa44,0xa44,0xa44,0xa44,0xa44,0xa44,0xa44,0xae,
+0xae,0xae,0xae,0xae,0xc63,0xc63,0xc63,0xc63,0xc63,0xc63,0xc63,0xc63,0xc63,0xc63,0xc63,0xc63,
+0xc63,0xc63,0xc63,0xc63,0xc63,0xc63,0xc63,0xc63,0xc63,0xc63,0xc63,0xc63,0xc63,0xc63,0xae,0xae,
+#else /* U_DARWIN */
+0xa2,0xa2,0xa2,0xa2,0xa2,0xa2,0xa2,0xa2,0xa2,0xa2,0xa2,0xa2,0x921,0x921,0x921,0x921,
+0x921,0x921,0x921,0x921,0x921,0x921,0x921,0x921,0x921,0xa5,0xa5,0xa5,0x924,0x924,0x924,0x924,
+0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x60f,0x612,0x60f,0x612,
+0x612,0x60f,0x60f,0x612,0x612,0x612,0x60f,0x60f,0x60f,0x60f,0xae,0xae,0xa7a,0xa7a,0xa7a,0xa7a,
+0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0xae,
+0xae,0xae,0xae,0xae,0xc99,0xc99,0xc99,0xc99,0xc99,0xc99,0xc99,0xc99,0xc99,0xc99,0xc99,0xc99,
+0xc99,0xc99,0xc99,0xc99,0xc99,0xc99,0xc99,0xc99,0xc99,0xc99,0xc99,0xc99,0xc99,0xc99,0xae,0xae,
+#endif /* U_DARWIN */
+0xae,0xae,0xae,0xae,0xae,0xae,0xae,0xae,0xae,0xae,0xae,0xae,0xae,0xae,0xae,0xae,
+0xae,0xae,0xae,0xae,0xae,0xae,0xae,0xae,0xae,0xae,0xae,0xae,0xae,0xae,0xae,0xae,
+#ifndef U_DARWIN
+0x387,0x387,0x387,0x387,0x387,0x387,0x387,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,
+0xb1,0xb1,0xb1,0x378,0x378,0x378,0x378,0x378,0xb1,0xb1,0xb1,0xb1,0xb1,0x864,0x534,0x37e,
+0x384,0x384,0x384,0x384,0x384,0x384,0x384,0x384,0x384,0x37b,0x37e,0x37e,0x37e,0x37e,0x37e,0x37e,
+0x37e,0x37e,0x37e,0x37e,0x37e,0x37e,0x37e,0xb1,0x37e,0x37e,0x37e,0x37e,0x37e,0xb1,0x37e,0xb1,
+0x37e,0x37e,0xb1,0x37e,0x37e,0xb1,0x37e,0x37e,0x37e,0x37e,0x37e,0x37e,0x37e,0x37e,0x37e,0x381,
+0x393,0x38d,0x393,0x38d,0x390,0x396,0x393,0x38d,0x390,0x396,0x393,0x38d,0x390,0x396,0x393,0x38d,
+0x393,0x38d,0x390,0x396,0x393,0x38d,0x393,0x38d,0x390,0x396,0x393,0x38d,0x390,0x396,0x393,0x38d,
+0x393,0x38d,0xb4,0xb4,0xb4,0xb4,0xb4,0xb4,0xb4,0xb4,0xb4,0xb4,0xb4,0xb4,0xb4,0xb4,
+0xb4,0xb4,0xb4,0xb4,0xb4,0xb4,0xb4,0x393,0x38d,0x390,0x396,0x393,0x38d,0x393,0x38d,0x393,
+0x38d,0x393,0x393,0x38d,0xb4,0xb4,0xb4,0xb4,0xb4,0xb4,0xb4,0xb4,0xb4,0xb4,0xb4,0xb4,
+0xb4,0xb4,0xb4,0xb4,0x390,0x38d,0x390,0x390,0x390,0x390,0x390,0x390,0x38d,0x390,0x38d,0x38d,
+0x390,0x390,0x38d,0x38d,0x38d,0x38d,0x38d,0x390,0x38d,0x38d,0x390,0x38d,0x390,0x390,0x390,0x38d,
+0x390,0x390,0x390,0x390,0xb4,0xb4,0x390,0x390,0x390,0x390,0x38d,0x38d,0x390,0x38d,0x38d,0x38d,
+0x38d,0x390,0x38d,0x38d,0x38d,0x38d,0x38d,0x390,0x390,0x390,0x38d,0x38d,0xb4,0xb4,0xb4,0xb4,
+0xb4,0xb4,0xb4,0xb4,0x936,0x936,0x936,0x936,0x936,0x936,0x936,0x936,0x936,0x936,0x936,0x936,
+0x936,0x936,0x936,0x936,0x393,0x393,0x393,0x393,0x393,0x393,0x393,0x393,0x393,0x393,0x38a,0x38a,
+0xa6b,0xabc,0xb4,0xb4,0x537,0x537,0x537,0x537,0xb7,0xb7,0xb7,0xb7,0xb7,0xb7,0xb7,0xb7,
+0xb7,0xb7,0xb7,0xb7,0x5f1,0x5f4,0x5f4,0x5fa,0x5fa,0x6ab,0x486,0x6ab,0x486,0x6ab,0x486,0x6ab,
+0x486,0x6ab,0x486,0x6ab,0x486,0x6ae,0x489,0x6ae,0x489,0xa47,0xa47,0xb52,0xb10,0x5ee,0x5ee,0x5ee,
+0x5ee,0x5f7,0x5f7,0x5f7,0x48f,0x603,0x492,0xba,0x65a,0x65a,0x564,0x564,0x600,0x6b1,0x48c,0x6b1,
+0x48c,0x6b1,0x48c,0x5fd,0x5fd,0x606,0x606,0x609,0x606,0x606,0x606,0xba,0x606,0x705,0x6d8,0x5fd,
+0xba,0xba,0xba,0xba,0x399,0x3a5,0x399,0x9d2,0x399,0xbd,0x399,0x3a5,0x399,0x3a5,0x399,0x3a5,
+0x399,0x3a5,0x399,0x3a5,0x3a5,0x3a2,0x39c,0x39f,0x3a5,0x3a2,0x39c,0x39f,0x3a5,0x3a2,0x39c,0x39f,
+0x3a5,0x3a2,0x39c,0x3a2,0x39c,0x3a2,0x39c,0x39f,0x3a5,0x3a2,0x39c,0x3a2,0x39c,0x3a2,0x39c,0x3a2,
+0x39c,0xbd,0xbd,0x753,0x6cf,0x6f9,0x585,0x588,0x57c,0x6f9,0x6f9,0xc3,0x3f0,0x3f3,0x3f3,0x3f3,
+0x3f3,0x3f0,0x3f0,0xc3,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0x8c1,0x8c1,0x8c1,
+0x7c8,0x1ef,0x165,0x165,0xc3,0x55e,0x582,0x57c,0x6f9,0x6cf,0x57c,0x582,0x69c,0x46b,0x57c,0x585,
+0x46e,0x57f,0x471,0x57c,0x591,0x591,0x591,0x591,0x591,0x591,0x591,0x591,0x591,0x591,0x636,0x636,
+0x585,0x585,0x585,0x55e,0x3f9,0x3f6,0x3f6,0x3f6,0x3f6,0x3f6,0x3f6,0x3f6,0x3f6,0x3f6,0x3f6,0x3f6,
+0x3f6,0x3f6,0x3f6,0x3f6,0x3f6,0x3f6,0x3f6,0x3f6,0x3f6,0x3f6,0x3f6,0x3f6,0x3f6,0x3f6,0x3f6,0x3f6,
+0x3f6,0x3f6,0x3f6,0xc3,0xc3,0xc3,0x3f6,0x3f6,0x3f6,0x3f6,0x3f6,0x3f6,0xc3,0xc3,0x3f6,0x3f6,
+0x3f6,0x3f6,0x3f6,0x3f6,0xc3,0xc3,0x3f6,0x3f6,0x3f6,0x3f6,0x3f6,0x3f6,0xc3,0xc3,0x3f6,0x3f6,
+0x3f6,0xc3,0xc3,0xc3,0x942,0x942,0x942,0x942,0x942,0x942,0x942,0x942,0x942,0x942,0x942,0x942,
+0x942,0x942,0x942,0x942,0x942,0x942,0x942,0x942,0x942,0x942,0x942,0x942,0x942,0x942,0x942,0x942,
+0x942,0x942,0x942,0xc6,0x93f,0x93f,0x93f,0x93f,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,
+0xc6,0xc6,0xc6,0xc6,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,
+0x945,0x945,0x945,0x945,0x94e,0x94e,0x94e,0x94e,0x94e,0x94e,0x94e,0x94e,0x94e,0x94e,0x94e,0x94e,
+0x94e,0x94e,0x94e,0x94e,0x94e,0x94e,0x94e,0x94e,0x94e,0x94e,0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,
+0xcc,0xcc,0xcc,0xcc,0x951,0x951,0x951,0x951,0x951,0x951,0x951,0xcf,0xcf,0xcf,0x951,0x951,
+0x951,0x951,0x951,0x951,0x951,0x951,0x951,0x951,0x951,0x951,0x951,0x951,0x951,0x951,0x951,0x951,
+0x951,0x951,0x951,0x951,0x954,0x951,0x951,0x951,0x951,0x951,0x951,0x951,0x951,0x951,0x951,0x951,
+0x951,0x951,0x951,0x951,0x951,0x951,0x951,0x951,0x951,0x951,0x951,0x951,0x951,0x951,0x951,0x951,
+0x951,0x951,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,
+#else /* U_DARWIN */
+0x390,0x390,0x390,0x390,0x390,0x390,0x390,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,
+0xb1,0xb1,0xb1,0x381,0x381,0x381,0x381,0x381,0xb1,0xb1,0xb1,0xb1,0xb1,0x89a,0x552,0x387,
+0x38d,0x38d,0x38d,0x38d,0x38d,0x38d,0x38d,0x38d,0x38d,0x384,0x387,0x387,0x387,0x387,0x387,0x387,
+0x387,0x387,0x387,0x387,0x387,0x387,0x387,0xb1,0x387,0x387,0x387,0x387,0x387,0xb1,0x387,0xb1,
+0x387,0x387,0xb1,0x387,0x387,0xb1,0x387,0x387,0x387,0x387,0x387,0x387,0x387,0x387,0x387,0x38a,
+0x39c,0x396,0x39c,0x396,0x399,0x39f,0x39c,0x396,0x399,0x39f,0x39c,0x396,0x399,0x39f,0x39c,0x396,
+0x39c,0x396,0x399,0x39f,0x39c,0x396,0x39c,0x396,0x399,0x39f,0x39c,0x396,0x399,0x39f,0x39c,0x396,
+0x39c,0x396,0xb4,0xb4,0xb4,0xb4,0xb4,0xb4,0xb4,0xb4,0xb4,0xb4,0xb4,0xb4,0xb4,0xb4,
+0xb4,0xb4,0xb4,0xb4,0xb4,0xb4,0xb4,0x39c,0x396,0x399,0x39f,0x39c,0x396,0x39c,0x396,0x39c,
+0x396,0x39c,0x39c,0x396,0xb4,0xb4,0xb4,0xb4,0xb4,0xb4,0xb4,0xb4,0xb4,0xb4,0xb4,0xb4,
+0xb4,0xb4,0xb4,0xb4,0x399,0x396,0x399,0x399,0x399,0x399,0x399,0x399,0x396,0x399,0x396,0x396,
+0x399,0x399,0x396,0x396,0x396,0x396,0x396,0x399,0x396,0x396,0x399,0x396,0x399,0x399,0x399,0x396,
+0x399,0x399,0x399,0x399,0xb4,0xb4,0x399,0x399,0x399,0x399,0x396,0x396,0x399,0x396,0x396,0x396,
+0x396,0x399,0x396,0x396,0x396,0x396,0x396,0x399,0x399,0x399,0x396,0x396,0xb4,0xb4,0xb4,0xb4,
+0xb4,0xb4,0xb4,0xb4,0x96c,0x96c,0x96c,0x96c,0x96c,0x96c,0x96c,0x96c,0x96c,0x96c,0x96c,0x96c,
+0x96c,0x96c,0x96c,0x96c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x393,0x393,
+0xaa1,0xaf2,0xb4,0xb4,0x555,0x555,0x555,0x555,0xb7,0xb7,0xb7,0xb7,0xb7,0xb7,0xb7,0xb7,
+0xb7,0xb7,0xb7,0xb7,0x618,0x61b,0x61b,0x621,0x621,0x6de,0x4a1,0x6de,0x4a1,0x6de,0x4a1,0x6de,
+0x4a1,0x6de,0x4a1,0x6de,0x4a1,0x6e1,0x4a4,0x6e1,0x4a4,0xa7d,0xa7d,0xb88,0xb46,0x615,0x615,0x615,
+0x615,0x61e,0x61e,0x61e,0x4aa,0x62a,0x4ad,0xba,0x68a,0x68a,0x585,0x585,0x627,0x6e4,0x4a7,0x6e4,
+0x4a7,0x6e4,0x4a7,0x624,0x624,0x62d,0x62d,0x630,0x62d,0x62d,0x62d,0xba,0x62d,0x73b,0x70b,0x624,
+0xba,0xba,0xba,0xba,0x3a2,0x3ae,0x3a2,0xa08,0x3a2,0xbd,0x3a2,0x3ae,0x3a2,0x3ae,0x3a2,0x3ae,
+0x3a2,0x3ae,0x3a2,0x3ae,0x3ae,0x3ab,0x3a5,0x3a8,0x3ae,0x3ab,0x3a5,0x3a8,0x3ae,0x3ab,0x3a5,0x3a8,
+0x3ae,0x3ab,0x3a5,0x3ab,0x3a5,0x3ab,0x3a5,0x3a8,0x3ae,0x3ab,0x3a5,0x3ab,0x3a5,0x3ab,0x3a5,0x3ab,
+0x3a5,0xbd,0xbd,0x789,0x702,0x72f,0x5ac,0x5af,0x5a3,0x72f,0x72f,0xc3,0x3fc,0x3ff,0x3ff,0x3ff,
+0x3ff,0x3fc,0x3fc,0xc3,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0x8f7,0x8f7,0x8f7,
+0x7fe,0x1ef,0x165,0x165,0xc3,0x57f,0x5a9,0x5a3,0x72f,0x702,0x5a3,0x5a9,0x6cf,0x483,0x5a3,0x5ac,
+0x486,0x5a6,0x489,0x5a3,0x5b8,0x5b8,0x5b8,0x5b8,0x5b8,0x5b8,0x5b8,0x5b8,0x5b8,0x5b8,0x660,0x660,
+0x5ac,0x5ac,0x5ac,0x57f,0x405,0x402,0x402,0x402,0x402,0x402,0x402,0x402,0x402,0x402,0x402,0x402,
+0x402,0x402,0x402,0x402,0x402,0x402,0x402,0x402,0x402,0x402,0x402,0x402,0x402,0x402,0x402,0x402,
+0x402,0x402,0x402,0xc3,0xc3,0xc3,0x402,0x402,0x402,0x402,0x402,0x402,0xc3,0xc3,0x402,0x402,
+0x402,0x402,0x402,0x402,0xc3,0xc3,0x402,0x402,0x402,0x402,0x402,0x402,0xc3,0xc3,0x402,0x402,
+0x402,0xc3,0xc3,0xc3,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,
+0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,
+0x978,0x978,0x978,0xc6,0x975,0x975,0x975,0x975,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,
+0xc6,0xc6,0xc6,0xc6,0x97b,0x97b,0x97b,0x97b,0x97b,0x97b,0x97b,0x97b,0x97b,0x97b,0x97b,0x97b,
+0x97b,0x97b,0x97b,0x97b,0x984,0x984,0x984,0x984,0x984,0x984,0x984,0x984,0x984,0x984,0x984,0x984,
+0x984,0x984,0x984,0x984,0x984,0x984,0x984,0x984,0x984,0x984,0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,
+0xcc,0xcc,0xcc,0xcc,0x987,0x987,0x987,0x987,0x987,0x987,0x987,0xcf,0xcf,0xcf,0x987,0x987,
+0x987,0x987,0x987,0x987,0x987,0x987,0x987,0x987,0x987,0x987,0x987,0x987,0x987,0x987,0x987,0x987,
+0x987,0x987,0x987,0x987,0x98a,0x987,0x987,0x987,0x987,0x987,0x987,0x987,0x987,0x987,0x987,0x987,
+0x987,0x987,0x987,0x987,0x987,0x987,0x987,0x987,0x987,0x987,0x987,0x987,0x987,0x987,0x987,0x987,
+0x987,0x987,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,
+#endif /* U_DARWIN */
+0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,
+#ifndef U_DARWIN
+0xcf,0xcf,0xcf,0xcf,0x95d,0x95d,0x95d,0x95d,0x95d,0x95d,0x95d,0x95d,0x95d,0x95d,0x95d,0x95d,
+0x95d,0x95d,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0xd2,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,
+0x95a,0x95a,0x95a,0x95a,0x95d,0x95d,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,
+0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,
+0x95d,0xd2,0x95d,0x95d,0xd2,0xd2,0x95d,0xd2,0xd2,0x95d,0x95d,0xd2,0xd2,0x95d,0x95d,0x95d,
+0x95d,0xd2,0x95d,0x95d,0x95d,0x95d,0x95d,0x95d,0x95d,0x95d,0x95a,0x95a,0x95a,0x95a,0xd2,0x95a,
+0xd2,0x95a,0x95a,0x95a,0x95a,0xac5,0x95a,0x95a,0xd2,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,
+0x95a,0x95a,0x95a,0x95a,0x95d,0x95d,0x95d,0x95d,0x95d,0x95d,0x95d,0x95d,0x95d,0x95d,0x95d,0x95d,
+0x95d,0x95d,0x95d,0x95d,0x95a,0x95a,0x95a,0x95a,0x95d,0x95d,0xd2,0x95d,0x95d,0x95d,0x95d,0xd2,
+0xd2,0x95d,0x95d,0x95d,0x95d,0x95d,0x95d,0x95d,0x95d,0xd2,0x95d,0x95d,0x95d,0x95d,0x95d,0x95d,
+0x95d,0xd2,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,
+0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95d,0x95d,0xd2,0x95d,
+0x95d,0x95d,0x95d,0xd2,0x95d,0x95d,0x95d,0x95d,0x95d,0xd2,0x95d,0xd2,0xd2,0xd2,0x95d,0x95d,
+0x95d,0x95d,0x95d,0x95d,0x95d,0xd2,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,
+0x95a,0x95a,0x95a,0x95a,0xb9a,0xb9a,0xd2,0xd2,0x95d,0x95d,0x95d,0x95d,0x95d,0x95d,0x95d,0x95d,
+0x95d,0x95d,0x95d,0x95d,0x95d,0x95d,0x95d,0x95d,0x95d,0x95d,0x95d,0x95d,0x95d,0x95d,0x95d,0x95d,
+0x95a,0x95a,0x95a,0x957,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0xcb7,0xcb4,0xd2,0xd2,0x97b,0x97b,
+0x97b,0x97b,0x97b,0x97b,0x97b,0x97b,0x97b,0x97b,0x97b,0x97b,0x97b,0x97b,0x97b,0x97b,0x97b,0x97b,
+0xd5,0x972,0xd5,0xd5,0xd5,0xd5,0xd5,0xd5,0xd5,0xd5,0xd5,0xd5,0xd5,0xd5,0xd5,0xd5,
+#else /* U_DARWIN */
+0xcf,0xcf,0xcf,0xcf,0x993,0x993,0x993,0x993,0x993,0x993,0x993,0x993,0x993,0x993,0x993,0x993,
+0x993,0x993,0x990,0x990,0x990,0x990,0x990,0x990,0x990,0xd2,0x990,0x990,0x990,0x990,0x990,0x990,
+0x990,0x990,0x990,0x990,0x993,0x993,0x990,0x990,0x990,0x990,0x990,0x990,0x990,0x990,0x990,0x990,
+0x990,0x990,0x990,0x990,0x990,0x990,0x990,0x990,0x990,0x990,0x990,0x990,0x990,0x990,0x990,0x990,
+0x993,0xd2,0x993,0x993,0xd2,0xd2,0x993,0xd2,0xd2,0x993,0x993,0xd2,0xd2,0x993,0x993,0x993,
+0x993,0xd2,0x993,0x993,0x993,0x993,0x993,0x993,0x993,0x993,0x990,0x990,0x990,0x990,0xd2,0x990,
+0xd2,0x990,0x990,0x990,0x990,0xafb,0x990,0x990,0xd2,0x990,0x990,0x990,0x990,0x990,0x990,0x990,
+0x990,0x990,0x990,0x990,0x993,0x993,0x993,0x993,0x993,0x993,0x993,0x993,0x993,0x993,0x993,0x993,
+0x993,0x993,0x993,0x993,0x990,0x990,0x990,0x990,0x993,0x993,0xd2,0x993,0x993,0x993,0x993,0xd2,
+0xd2,0x993,0x993,0x993,0x993,0x993,0x993,0x993,0x993,0xd2,0x993,0x993,0x993,0x993,0x993,0x993,
+0x993,0xd2,0x990,0x990,0x990,0x990,0x990,0x990,0x990,0x990,0x990,0x990,0x990,0x990,0x990,0x990,
+0x990,0x990,0x990,0x990,0x990,0x990,0x990,0x990,0x990,0x990,0x990,0x990,0x993,0x993,0xd2,0x993,
+0x993,0x993,0x993,0xd2,0x993,0x993,0x993,0x993,0x993,0xd2,0x993,0xd2,0xd2,0xd2,0x993,0x993,
+0x993,0x993,0x993,0x993,0x993,0xd2,0x990,0x990,0x990,0x990,0x990,0x990,0x990,0x990,0x990,0x990,
+0x990,0x990,0x990,0x990,0xbd0,0xbd0,0xd2,0xd2,0x993,0x993,0x993,0x993,0x993,0x993,0x993,0x993,
+0x993,0x993,0x993,0x993,0x993,0x993,0x993,0x993,0x993,0x993,0x993,0x993,0x993,0x993,0x993,0x993,
+0x990,0x990,0x990,0x98d,0x990,0x990,0x990,0x990,0x990,0x990,0xced,0xcea,0xd2,0xd2,0x9b1,0x9b1,
+0x9b1,0x9b1,0x9b1,0x9b1,0x9b1,0x9b1,0x9b1,0x9b1,0x9b1,0x9b1,0x9b1,0x9b1,0x9b1,0x9b1,0x9b1,0x9b1,
+0xd5,0x9a8,0xd5,0xd5,0xd5,0xd5,0xd5,0xd5,0xd5,0xd5,0xd5,0xd5,0xd5,0xd5,0xd5,0xd5,
+#endif /* U_DARWIN */
+0xd5,0xd5,0xd5,0xd5,0xd5,0xd5,0xd5,0xd5,0xd5,0xd5,0xd5,0xd5,0xd5,0xd5,0xd5,0xd5,
+#ifndef U_DARWIN
+0x9d8,0x9d5,0x9d8,0x9d5,0x9d8,0x9d5,0x9d8,0x9d5,0x9d8,0x9d5,0x9d8,0x9d5,0x9d8,0x9d5,0x9d8,0x9d5,
+0xcbd,0xcba,0xcbd,0xcba,0xd8,0xd8,0xd8,0xd8,0xd8,0xd8,0xd8,0xd8,0xd8,0xd8,0xd8,0xd8,
+0x9db,0x9db,0x9db,0x9db,0x9db,0x9db,0x9db,0x9db,0x9db,0x9db,0x9db,0x9db,0x9db,0xdb,0x9db,0x9db,
+0x9db,0x9db,0xa1a,0xa1a,0xa1d,0xdb,0xdb,0xdb,0xdb,0xdb,0xdb,0xdb,0xdb,0xdb,0xdb,0xdb,
+0x9de,0x9de,0x9de,0x9de,0x9de,0x9de,0x9de,0x9de,0x9de,0x9de,0x9de,0x9de,0x9de,0x9de,0x9de,0x9de,
+0x9de,0x9de,0xa20,0xa20,0xa23,0x9ff,0x9ff,0xde,0xde,0xde,0xde,0xde,0xde,0xde,0xde,0xde,
+0x9e1,0x9e1,0x9e1,0x9e1,0x9e1,0x9e1,0x9e1,0x9e1,0x9e1,0x9e1,0x9e1,0x9e1,0x9e1,0x9e1,0x9e1,0x9e1,
+0x9e1,0x9e1,0xa26,0xa26,0xe1,0xe1,0xe1,0xe1,0xe1,0xe1,0xe1,0xe1,0xe1,0xe1,0xe1,0xe1,
+0x9e4,0x9e4,0x9e4,0x9e4,0x9e4,0x9e4,0x9e4,0x9e4,0x9e4,0x9e4,0x9e4,0x9e4,0x9e4,0xe4,0x9e4,0x9e4,
+0x9e4,0xe4,0xa29,0xa29,0xe4,0xe4,0xe4,0xe4,0xe4,0xe4,0xe4,0xe4,0xe4,0xe4,0xe4,0xe4,
+0xb9d,0xb9d,0xb9d,0xb9d,0xb9d,0xc75,0xc12,0xcc0,0xcc0,0xcc0,0xcc0,0xe7,0xe7,0xe7,0xe7,0xe7,
+0x9e7,0x9e7,0x9e7,0x9e7,0x9e7,0x9e7,0x9e7,0x9e7,0x9e7,0x9e7,0x9e7,0x9e7,0x9e7,0x9e7,0x9e7,0x9e7,
+0x9e7,0x9e7,0xa65,0xa0b,0xa65,0xa0b,0xa65,0xa0b,0xe7,0xe7,0xe7,0xe7,0x9ea,0x9ea,0x9ea,0x9ea,
+0x9ea,0x9ea,0x9ea,0x9ea,0x9ea,0x9ea,0x9ea,0x9ea,0x9ea,0x9ea,0x9ea,0x9ea,0xacb,0xacb,0xacb,0xacb,
+0xacb,0xacb,0xacb,0xacb,0xacb,0xacb,0xacb,0xacb,0xacb,0xacb,0xacb,0xacb,0xacb,0xacb,0xacb,0xacb,
+0xacb,0xacb,0xacb,0xacb,0xacb,0xacb,0xacb,0xacb,0xacb,0xea,0xea,0xea,0xb28,0xb28,0xb28,0xb2e,
+0xb2e,0xb2e,0xb2e,0xb28,0xb28,0xb2e,0xb2e,0xb2e,0xea,0xea,0xea,0xea,0xb2e,0xb2e,0xb28,0xb2e,
+0xb2e,0xb2e,0xb2e,0xb2e,0xb2e,0xb2b,0xb2b,0xb2b,0xea,0xea,0xea,0xea,0xac8,0xea,0xea,0xea,
+0xb37,0xb37,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb5e,0xb5e,0xb5e,0xb5e,
+0xb5e,0xb5e,0xb5e,0xb5e,0xb5e,0xb5e,0xb5e,0xb5e,0xb5e,0xb5e,0xb5e,0xb5e,0xb5e,0xb5e,0xed,0xed,
+0xb5e,0xb5e,0xb5e,0xb5e,0xb5e,0xed,0xed,0xed,0xed,0xed,0xed,0xed,0xed,0xed,0xed,0xed,
+0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xba6,0xba6,
+0xba6,0xba6,0xba6,0xba6,0xcc3,0xcc3,0xcc3,0xcc3,0xcc3,0xcc3,0xcc3,0xf0,0xf0,0xf0,0xf0,0xf0,
+0xcc3,0xcc3,0xcc3,0xcc3,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,
+#else /* U_DARWIN */
+0xa0e,0xa0b,0xa0e,0xa0b,0xa0e,0xa0b,0xa0e,0xa0b,0xa0e,0xa0b,0xa0e,0xa0b,0xa0e,0xa0b,0xa0e,0xa0b,
+0xcf3,0xcf0,0xcf3,0xcf0,0xd8,0xd8,0xd8,0xd8,0xd8,0xd8,0xd8,0xd8,0xd8,0xd8,0xd8,0xd8,
+0xa11,0xa11,0xa11,0xa11,0xa11,0xa11,0xa11,0xa11,0xa11,0xa11,0xa11,0xa11,0xa11,0xdb,0xa11,0xa11,
+0xa11,0xa11,0xa50,0xa50,0xa53,0xdb,0xdb,0xdb,0xdb,0xdb,0xdb,0xdb,0xdb,0xdb,0xdb,0xdb,
+0xa14,0xa14,0xa14,0xa14,0xa14,0xa14,0xa14,0xa14,0xa14,0xa14,0xa14,0xa14,0xa14,0xa14,0xa14,0xa14,
+0xa14,0xa14,0xa56,0xa56,0xa59,0xa35,0xa35,0xde,0xde,0xde,0xde,0xde,0xde,0xde,0xde,0xde,
+0xa17,0xa17,0xa17,0xa17,0xa17,0xa17,0xa17,0xa17,0xa17,0xa17,0xa17,0xa17,0xa17,0xa17,0xa17,0xa17,
+0xa17,0xa17,0xa5c,0xa5c,0xe1,0xe1,0xe1,0xe1,0xe1,0xe1,0xe1,0xe1,0xe1,0xe1,0xe1,0xe1,
+0xa1a,0xa1a,0xa1a,0xa1a,0xa1a,0xa1a,0xa1a,0xa1a,0xa1a,0xa1a,0xa1a,0xa1a,0xa1a,0xe4,0xa1a,0xa1a,
+0xa1a,0xe4,0xa5f,0xa5f,0xe4,0xe4,0xe4,0xe4,0xe4,0xe4,0xe4,0xe4,0xe4,0xe4,0xe4,0xe4,
+0xbd3,0xbd3,0xbd3,0xbd3,0xbd3,0xcab,0xc48,0xcf6,0xcf6,0xcf6,0xcf6,0xe7,0xe7,0xe7,0xe7,0xe7,
+0xa1d,0xa1d,0xa1d,0xa1d,0xa1d,0xa1d,0xa1d,0xa1d,0xa1d,0xa1d,0xa1d,0xa1d,0xa1d,0xa1d,0xa1d,0xa1d,
+0xa1d,0xa1d,0xa9b,0xa41,0xa9b,0xa41,0xa9b,0xa41,0xe7,0xe7,0xe7,0xe7,0xa20,0xa20,0xa20,0xa20,
+0xa20,0xa20,0xa20,0xa20,0xa20,0xa20,0xa20,0xa20,0xa20,0xa20,0xa20,0xa20,0xb01,0xb01,0xb01,0xb01,
+0xb01,0xb01,0xb01,0xb01,0xb01,0xb01,0xb01,0xb01,0xb01,0xb01,0xb01,0xb01,0xb01,0xb01,0xb01,0xb01,
+0xb01,0xb01,0xb01,0xb01,0xb01,0xb01,0xb01,0xb01,0xb01,0xea,0xea,0xea,0xb5e,0xb5e,0xb5e,0xb64,
+0xb64,0xb64,0xb64,0xb5e,0xb5e,0xb64,0xb64,0xb64,0xea,0xea,0xea,0xea,0xb64,0xb64,0xb5e,0xb64,
+0xb64,0xb64,0xb64,0xb64,0xb64,0xb61,0xb61,0xb61,0xea,0xea,0xea,0xea,0xafe,0xea,0xea,0xea,
+0xb6d,0xb6d,0xb82,0xb82,0xb82,0xb82,0xb82,0xb82,0xb82,0xb82,0xb82,0xb82,0xb94,0xb94,0xb94,0xb94,
+0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xed,0xed,
+0xb94,0xb94,0xb94,0xb94,0xb94,0xed,0xed,0xed,0xed,0xed,0xed,0xed,0xed,0xed,0xed,0xed,
+0xb1f,0xb1f,0xb1f,0xb1f,0xb1f,0xb1f,0xb1f,0xb1f,0xb1f,0xb1f,0xb1f,0xb1f,0xb1f,0xb1f,0xbdc,0xbdc,
+0xbdc,0xbdc,0xbdc,0xbdc,0xcf9,0xcf9,0xcf9,0xcf9,0xcf9,0xcf9,0xcf9,0xf0,0xf0,0xf0,0xf0,0xf0,
+0xcf9,0xcf9,0xcf9,0xcf9,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,
+#endif /* U_DARWIN */
+0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,
+#ifndef U_DARWIN
+0xf0,0xf0,0xf0,0xf0,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,
+0xf3,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,
+0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xf3,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,
+0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xf3,0xaef,0xaef,0xf3,0xaef,
+0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xf3,0xf3,
+0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xf3,0xf3,
+#else /* U_DARWIN */
+0xf0,0xf0,0xf0,0xf0,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,
+0xf3,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,
+0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xf3,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,
+0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xf3,0xb25,0xb25,0xf3,0xb25,
+0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xf3,0xf3,
+0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xf3,0xf3,
+#endif /* U_DARWIN */
+0xf3,0xf3,0xf3,0xf3,0xf3,0xf3,0xf3,0xf3,0xf3,0xf3,0xf3,0xf3,0xf3,0xf3,0xf3,0xf3,
+0xf3,0xf3,0xf3,0xf3,0xf3,0xf3,0xf3,0xf3,0xf3,0xf3,0xf3,0xf3,0xf3,0xf3,0xf3,0xf3,
+#ifndef U_DARWIN
+0xaf2,0xaf2,0xaf2,0xaf2,0xaf2,0xaf2,0xaf2,0xaf2,0xaf2,0xaf2,0xaf2,0xaf2,0xaf2,0xaf2,0xaf2,0xaf2,
+0xaf2,0xaf2,0xaf2,0xaf2,0xaf2,0xaf2,0xaf2,0xaf2,0xaf2,0xaf2,0xaf2,0xf6,0xf6,0xf6,0xf6,0xf6,
+0xb0a,0xb0a,0xb0a,0xf9,0xf9,0xf9,0xf9,0xaf5,0xaf5,0xaf5,0xaf5,0xaf5,0xaf5,0xaf5,0xaf5,0xaf5,
+0xaf5,0xaf5,0xaf5,0xaf5,0xaf5,0xaf5,0xaf5,0xaf5,0xaf5,0xaf5,0xaf5,0xaf5,0xaf5,0xaf5,0xaf5,0xaf5,
+0xf9,0xf9,0xf9,0xaf5,0xaf5,0xaf5,0xaf5,0xaf5,0xaf5,0xaf5,0xaf5,0xaf5,0xaf8,0xaf8,0xaf8,0xaf8,
+0xaf8,0xaf8,0xaf8,0xaf8,0xaf8,0xaf8,0xaf8,0xaf8,0xaf8,0xaf8,0xaf8,0xaf8,0xaf8,0xaf8,0xaf8,0xaf8,
+0xaf8,0xaf8,0xaf8,0xaf8,0xaf8,0xaf8,0xaf8,0xaf8,0xaf8,0xaf8,0xfc,0xb0d,0xafe,0xafe,0xafe,0xafe,
+0xafe,0xafe,0xafe,0xafe,0xafe,0xafe,0xafe,0xafe,0xafe,0xafe,0xafe,0xafe,0xafe,0xafe,0xafe,0xafe,
+0xafe,0xafe,0xafe,0xafe,0xafe,0xafe,0xafe,0xafe,0xafe,0xafe,0xff,0xff,0xb01,0xb01,0xb01,0xb01,
+0xb01,0xb01,0x102,0x102,0xb01,0x102,0xb01,0xb01,0xb01,0xb01,0xb01,0xb01,0xb01,0xb01,0xb01,0xb01,
+0xb01,0xb01,0xb01,0xb01,0xb01,0xb01,0xb01,0xb01,0xb01,0xb01,0xb01,0xb01,0xb01,0xb01,0x102,0xb01,
+0xb01,0x102,0x102,0x102,0xb01,0x102,0x102,0xb01,0xb04,0xb04,0xb04,0xb04,0xb04,0xb04,0xb04,0xb04,
+0xb04,0xb04,0xb04,0xb04,0xb04,0xb04,0xb04,0xb04,0xb04,0xb04,0xb04,0xb04,0xb04,0xb04,0xb04,0x105,
+0x105,0x105,0x105,0x105,0x105,0x105,0x105,0x105,0xbb2,0xbb2,0xbb2,0xbb2,0xbb2,0xbb2,0xbb2,0xbb2,
+0xbb2,0xbb2,0xbb2,0xbb2,0xbb2,0xbb2,0x10e,0x10e,0x10e,0x10e,0x10e,0x10e,0x10e,0x10e,0x10e,0x10e,
+0x10e,0x10e,0x10e,0x10e,0x10e,0x10e,0x10e,0x10e,0xbb8,0xbb8,0xbb8,0xbb8,0xbb8,0xbb8,0xbb8,0xbb8,
+0xbb8,0xbb8,0xbb8,0xbb8,0xbb8,0xbb8,0xbb8,0xbb8,0xbb8,0xbb8,0xbb8,0xbb8,0xbb8,0xbb8,0xbb8,0xc2d,
+0xc2d,0xc30,0xc30,0xc30,0x111,0x111,0xbfd,0xbb5,0xc66,0xc66,0xc66,0xc66,0xc66,0xc66,0xc66,0xc66,
+0xc66,0xc66,0xc66,0xc66,0xc66,0xc66,0xc66,0xc66,0x114,0x114,0x114,0x114,0x114,0x114,0x114,0x114,
+0x114,0x114,0x114,0x114,0x114,0x114,0x114,0x114,0xa59,0xa59,0xa59,0xa59,0xa59,0xa59,0xa59,0xa59,
+0xa59,0xa59,0xa59,0xa59,0xa59,0xa59,0xa59,0xa59,0xc33,0xc33,0xc33,0xc33,0xd14,0xd14,0xd14,0xd14,
+0xd14,0xd14,0xd14,0x117,0x117,0x117,0x117,0x117,0x117,0x117,0x117,0x117,0x117,0x117,0x117,0x117,
+#else /* U_DARWIN */
+0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,
+0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xf6,0xf6,0xf6,0xf6,0xf6,
+0xb40,0xb40,0xb40,0xf9,0xf9,0xf9,0xf9,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,
+0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,
+0xf9,0xf9,0xf9,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2e,0xb2e,0xb2e,0xb2e,
+0xb2e,0xb2e,0xb2e,0xb2e,0xb2e,0xb2e,0xb2e,0xb2e,0xb2e,0xb2e,0xb2e,0xb2e,0xb2e,0xb2e,0xb2e,0xb2e,
+0xb2e,0xb2e,0xb2e,0xb2e,0xb2e,0xb2e,0xb2e,0xb2e,0xb2e,0xb2e,0xfc,0xb43,0xb34,0xb34,0xb34,0xb34,
+0xb34,0xb34,0xb34,0xb34,0xb34,0xb34,0xb34,0xb34,0xb34,0xb34,0xb34,0xb34,0xb34,0xb34,0xb34,0xb34,
+0xb34,0xb34,0xb34,0xb34,0xb34,0xb34,0xb34,0xb34,0xb34,0xb34,0xff,0xff,0xb37,0xb37,0xb37,0xb37,
+0xb37,0xb37,0x102,0x102,0xb37,0x102,0xb37,0xb37,0xb37,0xb37,0xb37,0xb37,0xb37,0xb37,0xb37,0xb37,
+0xb37,0xb37,0xb37,0xb37,0xb37,0xb37,0xb37,0xb37,0xb37,0xb37,0xb37,0xb37,0xb37,0xb37,0x102,0xb37,
+0xb37,0x102,0x102,0x102,0xb37,0x102,0x102,0xb37,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,
+0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0x105,
+0x105,0x105,0x105,0x105,0x105,0x105,0x105,0x105,0xbe8,0xbe8,0xbe8,0xbe8,0xbe8,0xbe8,0xbe8,0xbe8,
+0xbe8,0xbe8,0xbe8,0xbe8,0xbe8,0xbe8,0x10e,0x10e,0x10e,0x10e,0x10e,0x10e,0x10e,0x10e,0x10e,0x10e,
+0x10e,0x10e,0x10e,0x10e,0x10e,0x10e,0x10e,0x10e,0xbee,0xbee,0xbee,0xbee,0xbee,0xbee,0xbee,0xbee,
+0xbee,0xbee,0xbee,0xbee,0xbee,0xbee,0xbee,0xbee,0xbee,0xbee,0xbee,0xbee,0xbee,0xbee,0xbee,0xc63,
+0xc63,0xc66,0xc66,0xc66,0x111,0x111,0xc33,0xbeb,0xc9c,0xc9c,0xc9c,0xc9c,0xc9c,0xc9c,0xc9c,0xc9c,
+0xc9c,0xc9c,0xc9c,0xc9c,0xc9c,0xc9c,0xc9c,0xc9c,0x114,0x114,0x114,0x114,0x114,0x114,0x114,0x114,
+0x114,0x114,0x114,0x114,0x114,0x114,0x114,0x114,0xa8f,0xa8f,0xa8f,0xa8f,0xa8f,0xa8f,0xa8f,0xa8f,
+0xa8f,0xa8f,0xa8f,0xa8f,0xa8f,0xa8f,0xa8f,0xa8f,0xc69,0xc69,0xc69,0xc69,0xd4a,0xd4a,0xd4a,0xd4a,
+0xd4a,0xd4a,0xd4a,0x117,0x117,0x117,0x117,0x117,0x117,0x117,0x117,0x117,0x117,0x117,0x117,0x117,
+#endif /* U_DARWIN */
+0x117,0x117,0x117,0x117,0x117,0x117,0x117,0x117,0x117,0x117,0x117,0x117,0x117,0x117,0x117,0x117,
+#ifndef U_DARWIN
+0x117,0x117,0xd14,0xd14,0xbc1,0xbbe,0xbc1,0xbbe,0xbbe,0xbbb,0xbbb,0xbbb,0xbbb,0xbbb,0xbbb,0x11a,
+0x11a,0x11a,0x11a,0x11a,0x11a,0x11a,0x11a,0x11a,0x11a,0x11a,0x11a,0x11a,0x11a,0xc00,0xc00,0xc00,
+0xc00,0xbbb,0xc00,0xc00,0xbc4,0xbc4,0xbc4,0xbc4,0xbc4,0xbc4,0xbc4,0xbc4,0xbc4,0xbc4,0xbc4,0xbc4,
+0xbc4,0xbc4,0xbc4,0xbc4,0xbc4,0xbc4,0xbc4,0xbc4,0xbc4,0xbc4,0xbc4,0x11d,0x11d,0x11d,0x11d,0x11d,
+0x11d,0x11d,0x11d,0x11d,0xbc4,0xbc4,0xbc4,0xbc4,0xbc4,0xbc4,0xbc4,0x11d,0xbc4,0xbc4,0xbc4,0xbc4,
+0xbc4,0xbc4,0xbc4,0x11d,0xbc4,0xbc4,0xbc4,0xbc4,0xbc4,0xbc4,0xbc4,0x11d,0xbc4,0xbc4,0xbc4,0xbc4,
+0xbc4,0xbc4,0xbc4,0x11d,0xbca,0xbca,0xbca,0xbca,0xbca,0xbca,0xbca,0xbca,0xbca,0xbca,0xbca,0xbca,
+0xbca,0xbca,0xbca,0xbca,0xbc7,0xbc7,0xbc7,0xbc7,0xbc7,0xbc7,0xbc7,0xbc7,0xbc7,0xbc7,0x120,0x120,
+0x120,0x120,0x120,0x120,0xbcd,0xbcd,0xbcd,0xbcd,0xbcd,0xbcd,0x123,0x123,0x123,0x123,0x123,0x123,
+0x123,0x123,0x123,0x123,0xbf4,0xbf4,0xbf4,0xbf4,0xbf4,0xbf4,0xbf4,0xbf4,0xbf4,0xbf4,0xbf4,0xbf4,
+0xbf4,0xbf4,0xbf4,0xbf4,0xbd3,0xbd3,0xbd3,0xbd3,0xbd3,0xbd3,0xbd3,0xbd3,0xbd3,0xbd3,0xbd3,0xbd3,
+0xbd3,0xbd3,0xbd3,0x126,0xbd0,0xbd0,0xbd0,0xbd0,0xbd0,0xbd0,0xbd0,0xbd0,0xbd0,0xbd0,0xbd0,0xbd0,
+0xbd0,0xbd0,0xbd0,0xbd0,0xbd0,0xbd0,0xbd0,0xbd0,0xbd0,0xbd0,0xbd0,0xbd0,0xbd0,0xbd0,0xbd0,0xbd0,
+0xbd0,0xbd0,0xbd0,0x126,0xbd9,0xc39,0xc39,0xc39,0x129,0xc39,0xc39,0x129,0x129,0x129,0x129,0x129,
+0xc39,0xc39,0xc39,0xc39,0xbd9,0xbd9,0xbd9,0xbd9,0x129,0xbd9,0xbd9,0xbd9,0x129,0xbd9,0xbd9,0xbd9,
+0xbd9,0xbd9,0xbd9,0xbd9,0xbd9,0xbd9,0xbd9,0xbd9,0xbd9,0xbd9,0xbd9,0xbd9,0xbd9,0xbd9,0xbd9,0xbd9,
+0xbd9,0xbd9,0xbd9,0xbd9,0x129,0x129,0x129,0x129,0xc36,0xc36,0xc36,0x129,0x129,0x129,0x129,0xc3c,
+0xbd6,0xbd6,0xbd6,0xbd6,0xbd6,0xbd6,0xbd6,0xbd6,0x129,0x129,0x129,0x129,0x129,0x129,0x129,0x129,
+0xc03,0xc03,0xc03,0xc03,0xc03,0xc03,0xc03,0xc03,0xbd6,0x129,0x129,0x129,0x129,0x129,0x129,0x129,
+0xbdc,0xbdc,0xbdc,0xbdc,0xbdc,0xbdc,0xbdc,0xbdc,0xbdc,0xbdc,0xbdc,0xbdc,0xbdc,0xbdc,0xbdc,0xbdc,
+0xbdc,0xbdc,0xbdc,0xbdc,0xbdc,0xbdc,0xbdc,0xcc6,0xcc6,0xcc6,0xcc6,0x12c,0x12c,0x12c,0x12c,0x12c,
+0xc8a,0xc8a,0xc8a,0xc8a,0xc8a,0xc8a,0xc8a,0xc8a,0xc8a,0xc8a,0x12f,0x12f,0x12f,0x12f,0x12f,0x12f,
+0xc87,0xc87,0xc87,0xc87,0xc87,0xc87,0xc87,0xc87,0xc87,0xc87,0xc87,0xc87,0xc87,0xc87,0xc87,0xc87,
+0xc87,0xc8a,0xc8a,0xc8a,0xc8a,0xc8a,0xc8a,0xc8a,0xc87,0xc87,0x12f,0x12f,0x12f,0x12f,0x12f,0x12f,
+0xc72,0xc72,0xc72,0xc72,0xc72,0xc72,0xc72,0xc72,0xc72,0xc72,0x12f,0x12f,0x12f,0x12f,0xc84,0xc84,
+0xbdf,0xbdf,0xbdf,0xbdf,0x132,0x132,0x132,0x132,0xbdf,0xbdf,0xbdf,0xbdf,0xbdf,0xbdf,0xbdf,0xbdf,
+0xc06,0xbdf,0xbdf,0xbdf,0xbdf,0xbdf,0x132,0x132,0x132,0x132,0x132,0x132,0x132,0x132,0x132,0x132,
+0xc81,0xc81,0xc81,0xc81,0xc81,0xc81,0xc81,0xc81,0xc81,0xc81,0xc81,0xc81,0xc81,0xc81,0xc09,0xc09,
+0xc09,0xc09,0xc09,0xc09,0xc09,0xc09,0xbeb,0xc0c,0x135,0x135,0x135,0x135,0xc81,0xc81,0x135,0x135,
+#else /* U_DARWIN */
+0x117,0x117,0xd4a,0xd4a,0xbf7,0xbf4,0xbf7,0xbf4,0xbf4,0xbf1,0xbf1,0xbf1,0xbf1,0xbf1,0xbf1,0x11a,
+0x11a,0x11a,0x11a,0x11a,0x11a,0x11a,0x11a,0x11a,0x11a,0x11a,0x11a,0x11a,0x11a,0xc36,0xc36,0xc36,
+0xc36,0xbf1,0xc36,0xc36,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,
+0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0x11d,0x11d,0x11d,0x11d,0x11d,
+0x11d,0x11d,0x11d,0x11d,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0x11d,0xbfa,0xbfa,0xbfa,0xbfa,
+0xbfa,0xbfa,0xbfa,0x11d,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0x11d,0xbfa,0xbfa,0xbfa,0xbfa,
+0xbfa,0xbfa,0xbfa,0x11d,0xc00,0xc00,0xc00,0xc00,0xc00,0xc00,0xc00,0xc00,0xc00,0xc00,0xc00,0xc00,
+0xc00,0xc00,0xc00,0xc00,0xbfd,0xbfd,0xbfd,0xbfd,0xbfd,0xbfd,0xbfd,0xbfd,0xbfd,0xbfd,0x120,0x120,
+0x120,0x120,0x120,0x120,0xc03,0xc03,0xc03,0xc03,0xc03,0xc03,0x123,0x123,0x123,0x123,0x123,0x123,
+0x123,0x123,0x123,0x123,0xc2a,0xc2a,0xc2a,0xc2a,0xc2a,0xc2a,0xc2a,0xc2a,0xc2a,0xc2a,0xc2a,0xc2a,
+0xc2a,0xc2a,0xc2a,0xc2a,0xc09,0xc09,0xc09,0xc09,0xc09,0xc09,0xc09,0xc09,0xc09,0xc09,0xc09,0xc09,
+0xc09,0xc09,0xc09,0x126,0xc06,0xc06,0xc06,0xc06,0xc06,0xc06,0xc06,0xc06,0xc06,0xc06,0xc06,0xc06,
+0xc06,0xc06,0xc06,0xc06,0xc06,0xc06,0xc06,0xc06,0xc06,0xc06,0xc06,0xc06,0xc06,0xc06,0xc06,0xc06,
+0xc06,0xc06,0xc06,0x126,0xc0f,0xc6f,0xc6f,0xc6f,0x129,0xc6f,0xc6f,0x129,0x129,0x129,0x129,0x129,
+0xc6f,0xc6f,0xc6f,0xc6f,0xc0f,0xc0f,0xc0f,0xc0f,0x129,0xc0f,0xc0f,0xc0f,0x129,0xc0f,0xc0f,0xc0f,
+0xc0f,0xc0f,0xc0f,0xc0f,0xc0f,0xc0f,0xc0f,0xc0f,0xc0f,0xc0f,0xc0f,0xc0f,0xc0f,0xc0f,0xc0f,0xc0f,
+0xc0f,0xc0f,0xc0f,0xc0f,0x129,0x129,0x129,0x129,0xc6c,0xc6c,0xc6c,0x129,0x129,0x129,0x129,0xc72,
+0xc0c,0xc0c,0xc0c,0xc0c,0xc0c,0xc0c,0xc0c,0xc0c,0x129,0x129,0x129,0x129,0x129,0x129,0x129,0x129,
+0xc39,0xc39,0xc39,0xc39,0xc39,0xc39,0xc39,0xc39,0xc0c,0x129,0x129,0x129,0x129,0x129,0x129,0x129,
+0xc12,0xc12,0xc12,0xc12,0xc12,0xc12,0xc12,0xc12,0xc12,0xc12,0xc12,0xc12,0xc12,0xc12,0xc12,0xc12,
+0xc12,0xc12,0xc12,0xc12,0xc12,0xc12,0xc12,0xcfc,0xcfc,0xcfc,0xcfc,0x12c,0x12c,0x12c,0x12c,0x12c,
+0xcc0,0xcc0,0xcc0,0xcc0,0xcc0,0xcc0,0xcc0,0xcc0,0xcc0,0xcc0,0x12f,0x12f,0x12f,0x12f,0x12f,0x12f,
+0xcbd,0xcbd,0xcbd,0xcbd,0xcbd,0xcbd,0xcbd,0xcbd,0xcbd,0xcbd,0xcbd,0xcbd,0xcbd,0xcbd,0xcbd,0xcbd,
+0xcbd,0xcc0,0xcc0,0xcc0,0xcc0,0xcc0,0xcc0,0xcc0,0xcbd,0xcbd,0x12f,0x12f,0x12f,0x12f,0x12f,0x12f,
+0xca8,0xca8,0xca8,0xca8,0xca8,0xca8,0xca8,0xca8,0xca8,0xca8,0x12f,0x12f,0x12f,0x12f,0xcba,0xcba,
+0xc15,0xc15,0xc15,0xc15,0x132,0x132,0x132,0x132,0xc15,0xc15,0xc15,0xc15,0xc15,0xc15,0xc15,0xc15,
+0xc3c,0xc15,0xc15,0xc15,0xc15,0xc15,0x132,0x132,0x132,0x132,0x132,0x132,0x132,0x132,0x132,0x132,
+0xcb7,0xcb7,0xcb7,0xcb7,0xcb7,0xcb7,0xcb7,0xcb7,0xcb7,0xcb7,0xcb7,0xcb7,0xcb7,0xcb7,0xc3f,0xc3f,
+0xc3f,0xc3f,0xc3f,0xc3f,0xc3f,0xc3f,0xc21,0xc42,0x135,0x135,0x135,0x135,0xcb7,0xcb7,0x135,0x135,
+#endif /* U_DARWIN */
+0x135,0x135,0x135,0x135,0x135,0x135,0x135,0x135,0x135,0x135,0x135,0x135,0x135,0x135,0x135,0x135,
+0x135,0x135,0x135,0x135,0x135,0x135,0x135,0x135,0x135,0x135,0x135,0x135,0x135,0x135,0x135,0x135,
+#ifndef U_DARWIN
+0xbf4,0xbf4,0xbf4,0xbf4,0xbf4,0xbf4,0x13b,0x13b,0x13b,0x13b,0x13b,0x13b,0x13b,0x13b,0x13b,0xbf7,
+#else /* U_DARWIN */
+0xc2a,0xc2a,0xc2a,0xc2a,0xc2a,0xc2a,0x13b,0x13b,0x13b,0x13b,0x13b,0x13b,0x13b,0x13b,0x13b,0xc2d,
+#endif /* U_DARWIN */
+0x13b,0x13b,0x13b,0x13b,0x13b,0x13b,0x13b,0x13b,0x13b,0x13b,0x13b,0x13b,0x13b,0x13b,0x13b,0x13b,
+#ifndef U_DARWIN
+0xa2f,0xa2f,0xa2f,0xa2f,0xa2f,0xa2f,0xa2f,0xa2f,0xa2f,0xa2f,0xa2f,0xa2f,0xa2f,0xa2f,0xa2f,0xa2f,
+0xc6c,0xc15,0xc15,0xc6c,0xc6c,0xc57,0xc57,0xc78,0xc18,0xc69,0x13e,0x13e,0x13e,0x13e,0x13e,0x13e,
+0xccc,0xccc,0xccc,0xccc,0xccc,0xccc,0xccc,0xccc,0xccc,0xccc,0xccc,0xd17,0xd17,0xd17,0xd17,0xd17,
+0xd17,0xd17,0xd17,0xd17,0xccf,0xccf,0xcc9,0xcc9,0xd2f,0xd29,0xcd2,0x141,0x141,0x141,0x141,0x141,
+0xd23,0xd23,0xd1a,0xd23,0xd26,0xcd8,0xcd8,0xcd8,0xcd8,0xcd8,0xcd8,0xcd8,0x144,0x144,0x144,0x144,
+0xd35,0xd35,0xd35,0xd35,0xd35,0xd35,0xd35,0xd35,0xd35,0xd35,0xcff,0xcff,0xcf9,0xcfc,0xcff,0xcff,
+0xcf9,0xcd5,0xcd5,0xcd5,0xcd5,0xcd5,0xcd5,0xcd5,0xcd5,0xcd5,0xcd5,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,
+0xd1d,0xd1d,0xd1d,0xd1d,0xcd5,0xcd5,0xcd5,0xcd5,0xcd5,0xcd5,0xcd5,0xcd5,0xcd5,0x144,0x144,0x144,
+0xce1,0xcde,0xce1,0xce1,0xce1,0xcde,0xcde,0xce1,0xcde,0xce1,0xcde,0xce1,0xcde,0x147,0x147,0x147,
+0x147,0x147,0x147,0x147,0xcde,0xce1,0xcde,0xcde,0x147,0x147,0x147,0x147,0x147,0x147,0x147,0x147,
+0xce4,0xce4,0x14a,0x14a,0x14a,0x14a,0x14a,0x14a,0x14a,0x14a,0x14a,0x14a,0x14a,0x14a,0x14a,0x14a,
+#else /* U_DARWIN */
+0xa65,0xa65,0xa65,0xa65,0xa65,0xa65,0xa65,0xa65,0xa65,0xa65,0xa65,0xa65,0xa65,0xa65,0xa65,0xa65,
+0xca2,0xc4b,0xc4b,0xca2,0xca2,0xc8d,0xc8d,0xcae,0xc4e,0xc9f,0x13e,0x13e,0x13e,0x13e,0x13e,0x13e,
+0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd4d,0xd4d,0xd4d,0xd4d,0xd4d,
+0xd4d,0xd4d,0xd4d,0xd4d,0xd05,0xd05,0xcff,0xcff,0xd65,0xd5f,0xd08,0x141,0x141,0x141,0x141,0x141,
+0xd59,0xd59,0xd50,0xd59,0xd5c,0xd0e,0xd0e,0xd0e,0xd0e,0xd0e,0xd0e,0xd0e,0x144,0x144,0x144,0x144,
+0xd6b,0xd6b,0xd6b,0xd6b,0xd6b,0xd6b,0xd6b,0xd6b,0xd6b,0xd6b,0xd35,0xd35,0xd2f,0xd32,0xd35,0xd35,
+0xd2f,0xd0b,0xd0b,0xd0b,0xd0b,0xd0b,0xd0b,0xd0b,0xd0b,0xd0b,0xd0b,0xd53,0xd53,0xd53,0xd53,0xd53,
+0xd53,0xd53,0xd53,0xd53,0xd0b,0xd0b,0xd0b,0xd0b,0xd0b,0xd0b,0xd0b,0xd0b,0xd0b,0x144,0x144,0x144,
+0xd17,0xd14,0xd17,0xd17,0xd17,0xd14,0xd14,0xd17,0xd14,0xd17,0xd14,0xd17,0xd14,0x147,0x147,0x147,
+0x147,0x147,0x147,0x147,0xd14,0xd17,0xd14,0xd14,0x147,0x147,0x147,0x147,0x147,0x147,0x147,0x147,
+0xd1a,0xd1a,0x14a,0x14a,0x14a,0x14a,0x14a,0x14a,0x14a,0x14a,0x14a,0x14a,0x14a,0x14a,0x14a,0x14a,
+#endif /* U_DARWIN */
+0x14a,0x14a,0x14a,0x14a,0x14a,0x14a,0x14a,0x14a,0x14a,0x14a,0x14a,0x14a,0x14a,0x14a,0x14a,0x14a,
+#ifndef U_DARWIN
+0x14a,0x14a,0x14a,0x14a,0xce7,0xce7,0xce7,0xce7,0xce7,0xce7,0xce7,0xce7,0xce7,0xce7,0xce7,0xce7,
+0xce7,0xce7,0xce7,0xce7,0xce7,0xce7,0xce7,0xce7,0xd08,0xd08,0xd2c,0xd2c,0x14d,0x14d,0x14d,0x14d,
+0x14d,0x14d,0x14d,0x14d,0xced,0xced,0xced,0xced,0xced,0xced,0xced,0xced,0xced,0xced,0xced,0xced,
+0xced,0xced,0xced,0xced,0xced,0xced,0xced,0xced,0xced,0xced,0xcea,0xcea,0xcea,0xcea,0x150,0x150,
+0x150,0x150,0x150,0xd02,0xcf0,0xcf0,0xcf0,0xcf0,0xcf0,0xcf0,0xcf0,0xcf0,0xcf0,0xcf0,0xcf0,0xcf0,
+0xcf0,0xcf0,0xcf0,0x153,0x153,0x153,0x153,0x153,0x153,0x153,0x153,0x153,0x153,0x153,0x153,0x153,
+#else /* U_DARWIN */
+0x14a,0x14a,0x14a,0x14a,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,
+0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd3e,0xd3e,0xd62,0xd62,0x14d,0x14d,0x14d,0x14d,
+0x14d,0x14d,0x14d,0x14d,0xd23,0xd23,0xd23,0xd23,0xd23,0xd23,0xd23,0xd23,0xd23,0xd23,0xd23,0xd23,
+0xd23,0xd23,0xd23,0xd23,0xd23,0xd23,0xd23,0xd23,0xd23,0xd23,0xd20,0xd20,0xd20,0xd20,0x150,0x150,
+0x150,0x150,0x150,0xd38,0xd26,0xd26,0xd26,0xd26,0xd26,0xd26,0xd26,0xd26,0xd26,0xd26,0xd26,0xd26,
+0xd26,0xd26,0xd26,0x153,0x153,0x153,0x153,0x153,0x153,0x153,0x153,0x153,0x153,0x153,0x153,0x153,
+#endif /* U_DARWIN */
+0x153,0x153,0x153,0x153,0x153,0x153,0x153,0x153,0x153,0x153,0x153,0x153,0x153,0x153,0x153,0x153,
+#ifndef U_DARWIN
+0x153,0x153,0x153,0x153,0xcf3,0xcf3,0xcf3,0x156,0x156,0x156,0x156,0x156,0x156,0x156,0x156,0x156,
+0x156,0x156,0x156,0x156,0xd05,0xd05,0xd05,0xd05,0x156,0x156,0x156,0x156,0x156,0x156,0x156,0x156,
+0x156,0x156,0x156,0x156,0xcf6,0xcf6,0xcf6,0xcf6,0xcf6,0xcf6,0xcf6,0xcf6,0xcf6,0xcf6,0xcf6,0xcf6,
+0xcf6,0xcf6,0xcf6,0xcf6,0xcf6,0xcf6,0x159,0x159,0x159,0x159,0x159,0x159,0x159,0x159,0x159,0x159,
+#else /* U_DARWIN */
+0x153,0x153,0x153,0x153,0xd29,0xd29,0xd29,0x156,0x156,0x156,0x156,0x156,0x156,0x156,0x156,0x156,
+0x156,0x156,0x156,0x156,0xd3b,0xd3b,0xd3b,0xd3b,0x156,0x156,0x156,0x156,0x156,0x156,0x156,0x156,
+0x156,0x156,0x156,0x156,0xd2c,0xd2c,0xd2c,0xd2c,0xd2c,0xd2c,0xd2c,0xd2c,0xd2c,0xd2c,0xd2c,0xd2c,
+0xd2c,0xd2c,0xd2c,0xd2c,0xd2c,0xd2c,0x159,0x159,0x159,0x159,0x159,0x159,0x159,0x159,0x159,0x159,
+#endif /* U_DARWIN */
+0x159,0x159,0x159,0x159,0x15c,0x15c,0x15c,0x15c,0x15c,0x15c,0x15c,0x15c,0x15c,0x15c,0x15c,0x15c,
+0x15c,0x15c,0x15c,0x15c,0x15c,0x15c,0x15c,0x15c,0x15c,0x15c,0x15c,0x15c,0x15c,0x15c,0x15c,0x15c,
+#ifndef U_DARWIN
+0x15c,0x15c,0x15c,0x15c,0x15c,0x15c,0x765,0x765,0x975,0x975,0x975,0x975,0x975,0x975,0x975,0x975,
+0x975,0x975,0x975,0x975,0x975,0x975,0x975,0x975,0x975,0x975,0x975,0x975,0x975,0x975,0x975,0x15f,
+0x15f,0x15f,0x15f,0x15f,0x15f,0x15f,0x15f,0x15f,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,
+0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,
+0x978,0x978,0x978,0x978,0x978,0x978,0x162,0x162,0x168,0x168,0x168,0x168,0x168,0x168,0x168,0x168,
+#else /* U_DARWIN */
+0x15c,0x15c,0x15c,0x15c,0x15c,0x15c,0x79b,0x79b,0x9ab,0x9ab,0x9ab,0x9ab,0x9ab,0x9ab,0x9ab,0x9ab,
+0x9ab,0x9ab,0x9ab,0x9ab,0x9ab,0x9ab,0x9ab,0x9ab,0x9ab,0x9ab,0x9ab,0x9ab,0x9ab,0x9ab,0x9ab,0x15f,
+0x15f,0x15f,0x15f,0x15f,0x15f,0x15f,0x15f,0x15f,0x9ae,0x9ae,0x9ae,0x9ae,0x9ae,0x9ae,0x9ae,0x9ae,
+0x9ae,0x9ae,0x9ae,0x9ae,0x9ae,0x9ae,0x9ae,0x9ae,0x9ae,0x9ae,0x9ae,0x9ae,0x9ae,0x9ae,0x9ae,0x9ae,
+0x9ae,0x9ae,0x9ae,0x9ae,0x9ae,0x9ae,0x162,0x162,0x168,0x168,0x168,0x168,0x168,0x168,0x168,0x168,
+#endif /* U_DARWIN */
+0x168,0x168,0x168,0x168,0x168,0x168,0x168,0x168,0x168,0x168,0x168,0x168,0x168,0x168,0x168,0x168,
+#ifndef U_DARWIN
+0x168,0x168,0x168,0x168,0x168,0x168,0x168,0x168,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,
+0x1d4,0x1d4,0x16e,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981,
+0x981,0x981,0x981,0x981,0x981,0x981,0x981,0xb07,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,
+0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x171,0x369,0x369,0x369,
+0x369,0x369,0x369,0x369,0x369,0x369,0x369,0x369,0x22b,0x22b,0x225,0x225,0x3c9,0x225,0x22e,0x18f,
+0x44a,0x18f,0x18f,0x18f,0x44a,0x18f,0x22e,0x22e,0x192,0x231,0x225,0x225,0x225,0x225,0x225,0x225,
+0x18c,0x18c,0x18c,0x18c,0x228,0x18c,0x225,0x867,0x195,0x195,0x3de,0x2fd,0x60c,0x60c,0x60c,0x43e,
+0x453,0x453,0x522,0x522,0x522,0x522,0x522,0x8ca,0x6c3,0x6b4,0x6c6,0x6c9,0x6ba,0x6c3,0x6b7,0x6b7,
+0x2fd,0x70b,0x70b,0x195,0x627,0x624,0x3e1,0x303,0x432,0x432,0x435,0x435,0x435,0x435,0x435,0x56a,
+0x435,0x435,0x435,0x74d,0x52b,0x52b,0x525,0x525,0x444,0x56d,0x438,0x441,0x423,0x198,0x19b,0x300,
+0x711,0x714,0x68d,0x70b,0x711,0x711,0x68d,0x70b,0x31e,0x31e,0x333,0x6cc,0x31b,0x1a7,0x31e,0x32a,
+0x31b,0x6cc,0x32d,0x333,0x333,0x333,0x32d,0x32d,0x333,0x333,0x333,0x1ad,0x31b,0x333,0x6f3,0x31b,
+0x327,0x333,0x333,0x333,0x333,0x333,0x31b,0x31b,0x321,0x1a7,0x1aa,0x31b,0x333,0x31b,0x3e4,0x31b,
+0x333,0x324,0x339,0x1b0,0x333,0x333,0x327,0x32d,0x333,0x333,0x336,0x333,0x32d,0x330,0x330,0x330,
+0x330,0x84c,0x849,0xab0,0xb91,0x9b7,0x9ba,0x9ba,0x1b9,0x1b9,0x1b9,0x1b9,0x1b9,0x1b9,0x1b9,0x1b9,
+0x1b9,0x1b9,0x1b9,0x1b9,0x345,0x345,0x345,0x345,0x1b6,0x1b6,0x1b6,0x1b6,0x1b6,0x1b6,0x1b6,0x1b6,
+0x1b6,0x1b6,0x33f,0x33f,0x33f,0x33f,0x33f,0x33f,0x348,0x348,0x348,0x348,0x348,0x348,0x348,0x348,
+0x348,0x348,0x348,0x348,0x348,0x34b,0x351,0x351,0x348,0x348,0x1bf,0x348,0x1bf,0x348,0x348,0x348,
+0x348,0x348,0x348,0x348,0x348,0x348,0x348,0x348,0x1c2,0x354,0x1c2,0x1c2,0x357,0x354,0x354,0x1c2,
+0x1c2,0x357,0x354,0x1c2,0x357,0x354,0x354,0x1c2,0x354,0x1c2,0x6ea,0x6e7,0x354,0x1c2,0x354,0x354,
+0x354,0x354,0x1c2,0x354,0x354,0x1c2,0x1c2,0x1c2,0x1c2,0x354,0x354,0x1c2,0x357,0x1c2,0x357,0x1c2,
+0x1c2,0x1c2,0x1c2,0x1c2,0x1c8,0x35a,0x1c2,0x35a,0x35a,0x354,0x354,0x354,0x1c2,0x1c2,0x1c2,0x1c2,
+0x354,0x354,0x354,0x354,0x1c2,0x1c2,0x354,0x354,0x354,0x357,0x354,0x354,0x357,0x354,0x354,0x357,
+0x1c2,0x357,0x354,0x354,0x1c2,0x354,0x354,0x354,0x354,0x354,0x1c2,0x354,0x354,0x354,0x354,0x354,
+0x354,0x354,0x354,0x354,0x354,0x354,0x354,0x354,0x1c5,0x1c2,0x357,0x354,0x1c2,0x1c2,0x1c2,0x1c2,
+0x354,0x354,0x1c2,0x1c2,0x354,0x357,0x1c5,0x1c5,0x357,0x357,0x354,0x354,0x357,0x357,0x354,0x354,
+0x357,0x357,0x354,0x354,0x354,0x354,0x354,0x354,0x357,0x357,0x1c2,0x1c2,0x357,0x357,0x1c2,0x1c2,
+0x357,0x357,0x354,0x354,0x354,0x354,0x354,0x354,0x354,0x354,0x354,0x354,0x354,0x1c2,0x354,0x354,
+0x354,0x1c2,0x354,0x354,0x354,0x354,0x354,0x354,0x354,0x1c2,0x354,0x354,0x354,0x354,0x354,0x354,
+0x357,0x357,0x357,0x357,0x354,0x354,0x354,0x354,0x354,0x354,0x354,0x354,0x354,0x354,0x354,0x354,
+0x354,0x354,0x354,0x1c2,0x35d,0x855,0x35d,0x35d,0x35d,0x35d,0x35d,0x35d,0x360,0x360,0x360,0x360,
+0x35d,0x35d,0x35d,0x35d,0x35d,0x35d,0x1cb,0x35d,0x35d,0x35d,0x35d,0x35d,0x35d,0x35d,0x35d,0x35d,
+0x35d,0x35d,0x35d,0x35d,0x1d1,0x1d1,0x1d1,0x1d1,0x1d1,0x1d1,0x1d1,0x1d1,0x1d1,0x1d1,0x1d1,0x1d1,
+#else /* U_DARWIN */
+0x168,0x168,0x168,0x168,0x168,0x168,0x168,0x168,0x168,0x168,0x37b,0x37b,0x37b,0x37b,0x37b,0x37b,
+0x37b,0x37b,0x37b,0x37b,0x37b,0x37b,0x37b,0x37b,0x37b,0x37b,0x37b,0x37b,0x37b,0x37b,0x37b,0x37b,
+0x37b,0x37b,0x37b,0x37b,0x37b,0x37b,0x37b,0x37b,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,
+0x1d4,0x1d4,0x16e,0x9b7,0x9b7,0x9b7,0x9b7,0x9b7,0x9b7,0x9b7,0x9b7,0x9b7,0x9b7,0x9b7,0x9b7,0x9b7,
+0x9b7,0x9b7,0x9b7,0x9b7,0x9b7,0x9b7,0x9b7,0xb3d,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,
+0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x171,0x36c,0x36c,0x36c,
+0x36c,0x36c,0x36c,0x36c,0x36c,0x36c,0x36c,0x36c,0x22e,0x22e,0x228,0x228,0x3d2,0x228,0x231,0x18f,
+0x45f,0x18f,0x18f,0x18f,0x45f,0x18f,0x231,0x231,0x192,0x234,0x228,0x228,0x228,0x228,0x228,0x228,
+0x18c,0x18c,0x18c,0x18c,0x22b,0x18c,0x228,0x89d,0x195,0x195,0x3e7,0x300,0x633,0x633,0x633,0x450,
+0x468,0x468,0x53d,0x53d,0x53d,0x53d,0x53d,0x900,0x6f6,0x6e7,0x6f9,0x6fc,0x6ed,0x6f6,0x6ea,0x6ea,
+0x300,0x741,0x741,0x195,0x651,0x64e,0x3ea,0x306,0x444,0x444,0x447,0x447,0x447,0x447,0x447,0x58b,
+0x447,0x447,0x447,0x783,0x546,0x546,0x540,0x540,0x456,0x58e,0x44a,0x453,0x435,0x198,0x19b,0x303,
+0x747,0x74a,0x6bd,0x741,0x747,0x747,0x6bd,0x741,0x321,0x321,0x336,0x6ff,0x31e,0x1a7,0x321,0x32d,
+0x31e,0x6ff,0x330,0x336,0x336,0x336,0x330,0x330,0x336,0x336,0x336,0x1ad,0x31e,0x336,0x729,0x31e,
+0x32a,0x336,0x336,0x336,0x336,0x336,0x31e,0x31e,0x324,0x1a7,0x1aa,0x31e,0x336,0x31e,0x3ed,0x31e,
+0x336,0x327,0x33c,0x1b0,0x336,0x336,0x32a,0x330,0x336,0x336,0x339,0x336,0x330,0x333,0x333,0x333,
+0x333,0x882,0x87f,0xae6,0xbc7,0x9ed,0x9f0,0x9f0,0x1b9,0x1b9,0x1b9,0x1b9,0x1b9,0x1b9,0x1b9,0x1b9,
+0x1b9,0x1b9,0x1b9,0x1b9,0x348,0x348,0x348,0x348,0x1b6,0x1b6,0x1b6,0x1b6,0x1b6,0x1b6,0x1b6,0x1b6,
+0x1b6,0x1b6,0x342,0x342,0x342,0x342,0x342,0x342,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,
+0x34b,0x34b,0x34b,0x34b,0x34b,0x34e,0x354,0x354,0x34b,0x34b,0x1bf,0x34b,0x1bf,0x34b,0x34b,0x34b,
+0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x1c2,0x357,0x1c2,0x1c2,0x35a,0x357,0x357,0x1c2,
+0x1c2,0x35a,0x357,0x1c2,0x35a,0x357,0x357,0x1c2,0x357,0x1c2,0x71d,0x71a,0x357,0x1c2,0x357,0x357,
+0x357,0x357,0x1c2,0x357,0x357,0x1c2,0x1c2,0x1c2,0x1c2,0x357,0x357,0x1c2,0x35a,0x1c2,0x35a,0x1c2,
+0x1c2,0x1c2,0x1c2,0x1c2,0x1c8,0x35d,0x1c2,0x35d,0x35d,0x357,0x357,0x357,0x1c2,0x1c2,0x1c2,0x1c2,
+0x357,0x357,0x357,0x357,0x1c2,0x1c2,0x357,0x357,0x357,0x35a,0x357,0x357,0x35a,0x357,0x357,0x35a,
+0x1c2,0x35a,0x357,0x357,0x1c2,0x357,0x357,0x357,0x357,0x357,0x1c2,0x357,0x357,0x357,0x357,0x357,
+0x357,0x357,0x357,0x357,0x357,0x357,0x357,0x357,0x1c5,0x1c2,0x35a,0x357,0x1c2,0x1c2,0x1c2,0x1c2,
+0x357,0x357,0x1c2,0x1c2,0x357,0x35a,0x1c5,0x1c5,0x35a,0x35a,0x357,0x357,0x35a,0x35a,0x357,0x357,
+0x35a,0x35a,0x357,0x357,0x357,0x357,0x357,0x357,0x35a,0x35a,0x1c2,0x1c2,0x35a,0x35a,0x1c2,0x1c2,
+0x35a,0x35a,0x357,0x357,0x357,0x357,0x357,0x357,0x357,0x357,0x357,0x357,0x357,0x1c2,0x357,0x357,
+0x357,0x1c2,0x357,0x357,0x357,0x357,0x357,0x357,0x357,0x1c2,0x357,0x357,0x357,0x357,0x357,0x357,
+0x35a,0x35a,0x35a,0x35a,0x357,0x357,0x357,0x357,0x357,0x357,0x357,0x357,0x357,0x357,0x357,0x357,
+0x357,0x357,0x357,0x1c2,0x360,0x88b,0x360,0x360,0x360,0x360,0x360,0x360,0x363,0x363,0x363,0x363,
+0x360,0x360,0x360,0x360,0x360,0x360,0x1cb,0x360,0x360,0x360,0x360,0x360,0x360,0x360,0x360,0x360,
+0x360,0x360,0x360,0x360,0x1d1,0x1d1,0x1d1,0x1d1,0x1d1,0x1d1,0x1d1,0x1d1,0x1d1,0x1d1,0x1d1,0x1d1,
+#endif /* U_DARWIN */
+0x1d1,0x1d1,0x1d1,0x1d1,0x1d1,0x1d1,0x1d1,0x1d1,0x1ce,0x1ce,0x1ce,0x1ce,0x1ce,0x1ce,0x1ce,0x1ce,
+0x1ce,0x1ce,0x1ce,0x1ce,0x1ce,0x1ce,0x1ce,0x1ce,0x1ce,0x1ce,0x1ce,0x1ce,0x1ce,0x1ce,0x1ce,0x1ce,
+0x1ce,0x1ce,0x1ce,0x1ce,0x1ce,0x1ce,0x1ce,0x1ce,0x1ce,0x1ce,0x1d7,0x1d7,0x1d7,0x1d7,0x1d7,0x1d7,
+0x1d7,0x1d7,0x1d7,0x1d7,0x1d7,0x1d7,0x1d7,0x1d7,0x1d7,0x1d7,0x1d7,0x1d7,0x1d4,0x1d4,0x1d4,0x1d4,
+0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x1da,0x1da,0x1da,0x1da,
+0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,
+#ifndef U_DARWIN
+0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x369,0x369,0x369,0x369,
+#else /* U_DARWIN */
+0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x36c,0x36c,0x36c,0x36c,
+#endif /* U_DARWIN */
+0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,
+0x1dd,0x1dd,0x1dd,0x1dd,0x1dd,0x1dd,0x1dd,0x1dd,0x1dd,0x1dd,0x1dd,0x1dd,0x1dd,0x1dd,0x1dd,0x1dd,
+#ifndef U_DARWIN
+0x36c,0x36c,0x1dd,0x1dd,0x1dd,0x1dd,0x9c9,0x9c9,0x9c9,0x9c9,0x9c9,0x9c9,0x9c9,0x9c9,0x9c9,0x9c9,
+0x1e0,0x1e0,0x36f,0x1e0,0x1e0,0x1e0,0x1e0,0x1e0,0x1e0,0x1e0,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,
+0x36f,0x36f,0x1e0,0x1e0,0x36f,0x36f,0x1e0,0x1e3,0x36f,0x36f,0x36f,0x36f,0x1e0,0x1e0,0x36f,0x36f,
+0x1e0,0x1e3,0x36f,0x36f,0x36f,0x36f,0x1e0,0x1e0,0x1e0,0x36f,0x36f,0x1e0,0x36f,0x36f,0x1e0,0x1e0,
+0x1e0,0x1e0,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,
+0x36f,0x36f,0x1e0,0x1e0,0x1e0,0x1e0,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x1e0,
+0x85b,0x85b,0x85b,0x85b,0x85b,0x85b,0x85b,0x85b,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,
+0x372,0x372,0x372,0x372,0x372,0x1e6,0x1e6,0x372,0x372,0x1e6,0x372,0x372,0x372,0x372,0x1e6,0x1e6,
+0x372,0x372,0x372,0x372,0xa74,0xa74,0x97e,0x97e,0xb97,0x85e,0x372,0x372,0x1e6,0x372,0x1e6,0x372,
+0x372,0x372,0x372,0x372,0x372,0x372,0x372,0x372,0x372,0x372,0x372,0x372,0x372,0x372,0x372,0x372,
+0x372,0x372,0x372,0x372,0x372,0x372,0x372,0x372,0x372,0x372,0x372,0x372,0x1e6,0x1e6,0x372,0x1e6,
+0x1e6,0x1e6,0x372,0x1e6,0x1e6,0x1e6,0x1e6,0x372,0x1e6,0x1e6,0x372,0x1e9,0x85e,0x85e,0x9cf,0x9cf,
+0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0xb97,0xb97,0x207,0x3b7,0x207,0x1fe,
+0x207,0x1fe,0x207,0x1fe,0x207,0x1fe,0x207,0x1fe,0x207,0x1fe,0x207,0x1fe,0x204,0x3b4,0x207,0x3b7,
+0x207,0x1fe,0x207,0x1fe,0x207,0x1fe,0x207,0x3b7,0x207,0x1fe,0x207,0x1fe,0x207,0x1fe,0x3bd,0x3b4,
+0x207,0x1fe,0x207,0x3b7,0x207,0x1fe,0x207,0x1fe,0x207,0x3b4,0x3c0,0x3ba,0x207,0x1fe,0x207,0x1fe,
+0x3b4,0x207,0x1fe,0x207,0x1fe,0x207,0x1fe,0x3c0,0x3ba,0x3bd,0x3b4,0x207,0x3b7,0x207,0x1fe,0x207,
+0x3b7,0x3ba,0x3bd,0x3b4,0x207,0x3b7,0x207,0x1fe,0x207,0x1fe,0x3bd,0x3b4,0x207,0x1fe,0x207,0x1fe,
+0x207,0x1fe,0x207,0x1fe,0x207,0x1fe,0x207,0x1fe,0x207,0x1fe,0x3bd,0x3b4,0x207,0x1fe,0x207,0x3b7,
+0x207,0x1fe,0x207,0x1fe,0x207,0x1fe,0x207,0x1fe,0x207,0x1fe,0x207,0x1fe,0x207,0x207,0x1fe,0x207,
+0x1fe,0x207,0x1fe,0x201,0x20a,0x216,0x216,0x20a,0x216,0x20a,0x216,0x216,0x20a,0x216,0x216,0x216,
+0x20a,0x20a,0x216,0x216,0x216,0x216,0x20a,0x216,0x216,0x20a,0x216,0x216,0x216,0x20a,0x20a,0x20a,
+0x216,0x216,0x20a,0x216,0x219,0x20d,0x216,0x20a,0x216,0x20a,0x216,0x216,0x20a,0x216,0x20a,0x20a,
+0x216,0x20a,0x216,0x219,0x20d,0x216,0x216,0x216,0x20a,0x216,0x20a,0x216,0x216,0x20a,0x20a,0x213,
+0x216,0x20a,0x20a,0x20a,0x213,0x213,0x213,0x213,0x21c,0x21c,0x210,0x21c,0x21c,0x210,0x21c,0x21c,
+0x210,0x219,0x3c3,0x219,0x3c3,0x219,0x3c3,0x219,0x3c3,0x219,0x3c3,0x219,0x3c3,0x219,0x3c3,0x219,
+0x3c3,0x20a,0x219,0x20d,0x219,0x20d,0x219,0x20d,0x216,0x20a,0x219,0x20d,0x219,0x20d,0x219,0x20d,
+0x219,0x20d,0x219,0x20d,0x20d,0x21c,0x21c,0x210,0x219,0x20d,0x7d4,0x7d4,0x7d7,0x7d1,0x219,0x20d,
+0x219,0x20d,0x219,0x20d,0x219,0x20d,0x219,0x20d,0x219,0x20d,0x219,0x20d,0x219,0x20d,0x219,0x20d,
+0x219,0x20d,0x219,0x20d,0x219,0x20d,0x219,0x20d,0x7d7,0x7d1,0x7d7,0x7d1,0x7d4,0x7ce,0x7d7,0x7d1,
+0xb61,0xb64,0xc8d,0xc90,0xc90,0xc90,0xc90,0xc8d,0xc90,0xc8d,0xc90,0xc8d,0xc90,0xc8d,0xc90,0xc8d,
+0x21f,0x3c6,0x21f,0x21f,0x21f,0x21f,0x21f,0x21f,0x21f,0x21f,0x21f,0x21f,0x21f,0x21f,0x21f,0x21f,
+0x21f,0x21f,0x21f,0x21f,0x21f,0x21f,0x21f,0x21f,0x21f,0x21f,0x21f,0x21f,0x21f,0x21f,0x21f,0x21f,
+0x222,0x21f,0x21f,0x21f,0x21f,0x21f,0x21f,0x21f,0x21f,0x21f,0x21f,0x21f,0x21f,0x7da,0x7da,0x7da,
+0x7da,0x7da,0xa7a,0xa7a,0x234,0x234,0x234,0x234,0x234,0x234,0x234,0x234,0x234,0x22e,0x22e,0x22e,
+0x22e,0x22e,0x22e,0x22e,0x234,0x234,0x234,0x234,0x234,0x225,0x225,0x225,0x225,0x225,0x7dd,0x7dd,
+0x7dd,0x7dd,0x7e0,0xa7d,0xa7d,0xa7d,0xa7d,0xa7d,0xa7d,0xa7d,0xa7d,0xa7d,0xa7d,0xa7d,0xa7d,0xa7d,
+0xa7d,0xa7d,0xa7d,0xa7d,0x255,0x7e3,0x23d,0x23a,0x23d,0x23a,0x23d,0x23a,0x23d,0x23a,0x23d,0x23a,
+0x23d,0x23a,0x23d,0x23a,0x25b,0x25b,0x252,0x24c,0x93c,0x939,0x987,0xa83,0xa80,0xa86,0xa83,0xa80,
+0xb67,0xb6a,0xb6a,0xb6a,0x3d2,0x3d2,0x3d2,0x3d2,0x3d2,0x3d2,0x3d2,0x3d2,0x3d2,0x3d2,0x3d2,0x3d2,
+0x3d2,0x3d2,0x3d2,0x3d2,0x7e9,0x3d5,0x264,0x267,0x264,0x264,0x264,0x267,0x264,0x264,0x264,0x264,
+0x267,0x7e9,0x267,0x264,0x26a,0x264,0x26a,0x264,0x26a,0x264,0x26a,0x264,0x26a,0x264,0x26a,0x264,
+0x26a,0x264,0x26a,0x264,0x26a,0x264,0x26a,0x264,0x26a,0x264,0x26d,0x267,0x26a,0x264,0x26a,0x264,
+0x26a,0x264,0x26a,0x264,0x26a,0x264,0x26a,0x264,0x26a,0x264,0x26a,0x264,0x26a,0x264,0x26a,0x264,
+0x26a,0x264,0x26a,0x264,0x26a,0x264,0x26a,0x264,0x26a,0x264,0x26a,0x264,0x26a,0x26d,0x267,0x26a,
+0x264,0x993,0x990,0x26a,0x264,0x993,0x990,0x26a,0x264,0x993,0x990,0xc96,0x26d,0x267,0x26d,0x267,
+0x26a,0x264,0x26d,0x267,0x26a,0x264,0x26d,0x267,0x26d,0x267,0x26d,0x267,0x26a,0x264,0x26d,0x267,
+0x7ef,0x7e9,0x26d,0x267,0x26d,0x267,0x26d,0x267,0x26d,0x267,0xb70,0xb6d,0x26d,0x267,0xc99,0xc96,
+0xc99,0xc96,0xc99,0xc96,0x7ef,0x3db,0x26a,0x26d,0x26a,0x26a,0x26a,0x26d,0x26a,0x26a,0x26a,0x26a,
+0x26d,0x7ef,0x26d,0x26a,0x3d8,0x3d8,0x3d8,0x3d8,0x3d8,0x3d8,0x3d8,0x3d8,0x3d8,0x3db,0x3d8,0x3d8,
+0x3d8,0x3d8,0x3d8,0x3d8,0x29d,0x29a,0x29d,0x29a,0x29a,0x29a,0x29a,0x29a,0x29a,0x29a,0x29a,0x29a,
+0x29a,0x29a,0x29a,0x7f5,0x29a,0x29a,0x29a,0x29d,0x558,0x29a,0x4aa,0x4aa,0x4aa,0x4aa,0x4aa,0x4aa,
+0x4aa,0x291,0x4a7,0x4ad,0x65d,0x65d,0x65d,0x65d,0x65d,0x65d,0x65d,0x65d,0x65d,0x65d,0x555,0x660,
+0x660,0x297,0x996,0x996,0x4a1,0x29a,0x29a,0x29a,0x29a,0x2a0,0x2a0,0x2a0,0x2a0,0x29a,0x29a,0x29a,
+0x29a,0x29a,0x29a,0x29a,0x4ad,0x4aa,0x4aa,0x4aa,0x4aa,0x2a3,0x2a3,0x4aa,0x4aa,0x297,0x4ad,0x4ad,
+0x4ad,0x4aa,0xa8f,0xa8f,0x663,0x663,0x663,0x663,0x663,0x663,0x663,0x663,0x663,0x663,0x7f5,0x7f5,
+0x7f5,0x7f2,0x7f2,0xa8f,0x29a,0x29a,0x29a,0x29a,0x29a,0x29a,0x29a,0x29a,0x29a,0x29a,0x29a,0x29a,
+0x29a,0x29a,0x29a,0x29a,0x29a,0x29a,0x29a,0x29a,0x29a,0x29a,0x29a,0x29a,0x29a,0x29a,0x29a,0x29a,
+0x29a,0x29a,0x29a,0x29a,0x7f5,0x7f5,0x29a,0x29a,0x29a,0x29a,0x29a,0x7f5,0x2e5,0x2e5,0x2e5,0x2e5,
+0x2e5,0x2e5,0x2e5,0x2e5,0x2e5,0x2e5,0x2e5,0x2e5,0x2e5,0x2e5,0x2e5,0x2e5,0x2e5,0x2e5,0x2e5,0x2e5,
+0x2e5,0x2e5,0x2e5,0x2e5,0x2e5,0x2e5,0x2e5,0x2e5,0x2e5,0x2e5,0x2e5,0x2e5,0x2ee,0x2e8,0x2ee,0x2e8,
+0x2ee,0x2e8,0x2ee,0x2e8,0x2ee,0x2e8,0x2ee,0x2e8,0x2ee,0x2e8,0x2ee,0x2e8,0x2ee,0x2e8,0x2ee,0x2e8,
+0x2ee,0x2e8,0x2ee,0x2e8,0x2ee,0x2e8,0x2ee,0x2e8,0x2ee,0x2e8,0x2ee,0x2e8,0x2f7,0x2f7,0x2f7,0x2f7,
+0x2f7,0x2f7,0x2f7,0x2f7,0x2fa,0x2fa,0x2fa,0x2fa,0x2fa,0x2fa,0x2fa,0x2fa,0x2f7,0x2f7,0x2f7,0x2f7,
+0x2f7,0x2f7,0x2f7,0x2f7,0x2fa,0x2fa,0x2fa,0x2fa,0x2fa,0x2fa,0x2fa,0x2fa,0x306,0x2fd,0x2fd,0x2fd,
+0x615,0x68a,0x456,0xa4a,0x8f4,0x8f4,0x846,0x846,0x846,0x846,0x9a2,0x9a2,0x9a2,0x9a2,0x9a8,0xaaa,
+0xaad,0xb88,0xbfa,0x9a5,0xbfa,0xbfa,0xbfa,0xbfa,0xb88,0xbfa,0xbfa,0x9fc,0x34e,0x348,0x348,0x34e,
+0x348,0x348,0x34e,0x348,0x348,0x348,0x348,0x348,0x348,0x348,0x351,0x348,0x348,0x348,0x348,0x348,
+0x348,0x348,0x348,0x348,0x3ea,0x3ea,0x348,0x348,0x348,0x348,0x348,0x348,0x348,0x348,0x348,0x3ea,
+0x348,0x348,0x348,0x852,0x852,0x852,0x852,0x852,0x852,0x852,0x852,0x852,0x9bd,0x9bd,0x9bd,0x9bd,
+0x9bd,0x9bd,0x9bd,0x9bd,0x9bd,0x9bd,0x9bd,0x9bd,0x354,0x354,0x354,0x354,0x354,0x354,0x354,0x354,
+0x354,0x354,0x354,0x354,0x354,0x354,0x354,0x354,0x354,0x354,0x354,0x354,0x354,0x354,0x354,0x354,
+0x354,0x354,0x354,0x354,0x354,0x354,0x354,0x354,0x357,0x357,0x357,0x357,0x354,0x354,0x354,0x354,
+0x354,0x354,0x357,0x357,0x357,0x357,0x354,0x354,0x354,0x354,0x9c0,0x9c0,0x9c0,0x9c0,0x9c0,0x9c0,
+0x9c0,0x9c0,0x9c0,0x9c0,0x9c0,0x9c0,0x9c0,0x9c0,0x360,0x360,0x35d,0x35d,0x35d,0x35d,0x35d,0x35d,
+0x35d,0x6a2,0x477,0x35d,0x35d,0x35d,0x35d,0x35d,0x35d,0x35d,0x35d,0x35d,0x35d,0x35d,0x35d,0x35d,
+0x35d,0x35d,0x35d,0x35d,0x35d,0x35d,0x35d,0x35d,0x35d,0x35d,0x35d,0x35d,0x35d,0x35d,0x35d,0x35d,
+0x35d,0x35d,0x35d,0x35d,0x35d,0x35d,0x35d,0x855,0x9c6,0x855,0x855,0x855,0x363,0x363,0x363,0x363,
+0x363,0x363,0x363,0x363,0x363,0x363,0x363,0x363,0x363,0x363,0x363,0x363,0x363,0x363,0x363,0x363,
+0x363,0x363,0x363,0x363,0x363,0x363,0x363,0x363,0x363,0x363,0x363,0x363,0x372,0x372,0x372,0x372,
+0x372,0x372,0x372,0x372,0x372,0x372,0x372,0x372,0x372,0x372,0x372,0x372,0x372,0x372,0x372,0x372,
+0x372,0x372,0x372,0x372,0x372,0x372,0x372,0x372,0x372,0x372,0x372,0x372,0x393,0x393,0x393,0x393,
+0x393,0x393,0x393,0x393,0x393,0x393,0x393,0x393,0x393,0x393,0x393,0x393,0x393,0x393,0x393,0x393,
+0x393,0x393,0x393,0x393,0x393,0x393,0x393,0x393,0x393,0x393,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,
+0x38d,0x38d,0x38d,0x38d,0x38d,0x38d,0x38d,0x38d,0x38d,0x38d,0x38d,0x38d,0x38d,0x38d,0x38d,0x38d,
+0x38d,0x38d,0x38d,0x38d,0x38d,0x38d,0x38d,0x38d,0x38d,0x38d,0x38d,0x38d,0x390,0x396,0x393,0x38d,
+0x390,0x396,0x393,0x38d,0x390,0x396,0x393,0x38d,0x390,0x396,0x393,0x38d,0x390,0x396,0x393,0x38d,
+0x390,0x396,0x393,0x38d,0x390,0x396,0x393,0x38d,0x390,0x396,0x393,0x38d,0x393,0x38d,0x393,0x38d,
+0x393,0x38d,0x393,0x38d,0x393,0x38d,0x393,0x38d,0x390,0x396,0x393,0x38d,0x390,0x396,0x393,0x38d,
+0x390,0x396,0x393,0x38d,0x390,0x396,0x393,0x38d,0x393,0x38d,0x393,0x38d,0x393,0x38d,0x390,0x396,
+0x390,0x396,0x393,0x38d,0x393,0x38d,0x393,0x38d,0x393,0x38d,0x393,0x38d,0x393,0x38d,0x393,0x38d,
+0x390,0x393,0x38d,0x390,0x393,0x38d,0x390,0x396,0x38d,0x38d,0x38d,0x38d,0x38d,0x38d,0x38d,0x38d,
+0x38d,0x38d,0x38d,0x38d,0x38d,0x38d,0x38d,0x38d,0x38d,0x38d,0x38d,0x38d,0x38d,0x38d,0x38d,0x390,
+0x390,0x390,0x390,0x390,0x390,0x390,0x390,0x390,0x393,0x393,0x393,0x393,0x393,0x393,0x393,0x393,
+0x393,0x393,0x393,0x393,0x393,0x393,0x393,0x393,0x393,0x38d,0x38d,0x38d,0x38d,0x38d,0x38d,0x38d,
+0x38d,0x38d,0x38d,0x38d,0x38d,0x38d,0x38d,0x38d,0x38d,0x390,0x390,0x390,0x390,0x390,0x390,0x390,
+0x396,0x396,0x396,0x396,0x396,0x396,0x396,0x396,0x38d,0x393,0x696,0x45f,0x390,0x390,0x38d,0x390,
+0x38d,0x390,0x38d,0x38d,0x390,0x38d,0x38d,0x390,0x38d,0x390,0x38d,0x38d,0x390,0x38d,0x390,0x390,
+0x38d,0x38d,0x38d,0x390,0x38d,0x38d,0x38d,0x38d,0x38d,0x390,0x38d,0x38d,0x38d,0x38d,0x38d,0x38d,
+0x38d,0x38d,0x38d,0x38d,0x38d,0x38d,0x38d,0x38d,0x38d,0x38d,0x38d,0x38d,0x38d,0x38d,0x38d,0x38d,
+0x390,0x390,0x38d,0x38d,0x390,0x38d,0x390,0x38d,0x38d,0x38d,0x38d,0x38d,0x390,0x390,0x390,0x390,
+0x390,0x390,0x390,0x390,0x390,0x390,0x390,0x390,0x390,0x390,0x390,0x390,0x390,0x390,0x390,0x390,
+0x390,0x390,0x390,0x390,0x390,0x390,0x390,0x390,0x390,0x390,0x390,0x390,0x390,0x390,0x390,0x396,
+0x393,0x393,0x393,0x393,0x393,0x393,0x393,0x393,0x393,0x393,0x393,0x393,0x393,0x393,0x393,0x393,
+0x393,0x393,0x393,0x393,0x393,0x393,0x393,0x393,0x393,0x393,0x393,0x393,0x393,0x393,0x393,0x393,
+#else /* U_DARWIN */
+0x36f,0x36f,0x1dd,0x1dd,0x1dd,0x1dd,0x9ff,0x9ff,0x9ff,0x9ff,0x9ff,0x9ff,0x9ff,0x9ff,0x9ff,0x9ff,
+0x1e0,0x1e0,0x372,0x1e0,0x1e0,0x1e0,0x1e0,0x1e0,0x1e0,0x1e0,0x372,0x372,0x372,0x372,0x372,0x372,
+0x372,0x372,0x1e0,0x1e0,0x372,0x372,0x1e0,0x1e3,0x372,0x372,0x372,0x372,0x1e0,0x1e0,0x372,0x372,
+0x1e0,0x1e3,0x372,0x372,0x372,0x372,0x1e0,0x1e0,0x1e0,0x372,0x372,0x1e0,0x372,0x372,0x1e0,0x1e0,
+0x1e0,0x1e0,0x372,0x372,0x372,0x372,0x372,0x372,0x372,0x372,0x372,0x372,0x372,0x372,0x372,0x372,
+0x372,0x372,0x1e0,0x1e0,0x1e0,0x1e0,0x372,0x372,0x372,0x372,0x372,0x372,0x372,0x372,0x372,0x1e0,
+0x891,0x891,0x891,0x891,0x891,0x891,0x891,0x891,0xa02,0xa02,0xa02,0xa02,0xa02,0xa02,0xa02,0xa02,
+0x375,0x375,0x375,0x375,0x375,0x1e6,0x1e6,0x375,0x375,0x1e6,0x375,0x375,0x375,0x375,0x1e6,0x1e6,
+0x375,0x375,0x375,0x375,0xaaa,0xaaa,0x9b4,0x9b4,0xbcd,0x894,0x375,0x375,0x1e6,0x375,0x1e6,0x375,
+0x375,0x375,0x375,0x375,0x375,0x375,0x375,0x375,0x375,0x375,0x375,0x375,0x375,0x375,0x375,0x375,
+0x375,0x375,0x375,0x375,0x375,0x375,0x375,0x375,0x375,0x375,0x375,0x375,0x1e6,0x1e6,0x375,0x1e6,
+0x1e6,0x1e6,0x375,0x1e6,0x1e6,0x1e6,0x1e6,0x375,0x1e6,0x1e6,0x375,0x1e9,0x894,0x894,0xa05,0xa05,
+0xa05,0xa05,0xa05,0xa05,0xa05,0xa05,0xa05,0xa05,0xa05,0xa05,0xbcd,0xbcd,0x720,0x42f,0x432,0x432,
+0x432,0x432,0x432,0x432,0x42f,0x42f,0x42f,0x42f,0x42f,0x42f,0x42f,0x42f,0x42f,0x42f,0x42f,0x42f,
+0x49e,0x49e,0x49e,0x59d,0x687,0x45c,0x684,0x1f2,0x5a0,0x636,0x6cc,0x480,0x20a,0x3c0,0x20a,0x201,
+0x20a,0x201,0x20a,0x201,0x20a,0x201,0x20a,0x201,0x20a,0x201,0x20a,0x201,0x207,0x3bd,0x20a,0x3c0,
+0x20a,0x201,0x20a,0x201,0x20a,0x201,0x20a,0x3c0,0x20a,0x201,0x20a,0x201,0x20a,0x201,0x3c6,0x3bd,
+0x20a,0x201,0x20a,0x3c0,0x20a,0x201,0x20a,0x201,0x20a,0x3bd,0x3c9,0x3c3,0x20a,0x201,0x20a,0x201,
+0x3bd,0x20a,0x201,0x20a,0x201,0x20a,0x201,0x3c9,0x3c3,0x3c6,0x3bd,0x20a,0x3c0,0x20a,0x201,0x20a,
+0x3c0,0x3c3,0x3c6,0x3bd,0x20a,0x3c0,0x20a,0x201,0x20a,0x201,0x3c6,0x3bd,0x20a,0x201,0x20a,0x201,
+0x20a,0x201,0x20a,0x201,0x20a,0x201,0x20a,0x201,0x20a,0x201,0x3c6,0x3bd,0x20a,0x201,0x20a,0x3c0,
+0x20a,0x201,0x20a,0x201,0x20a,0x201,0x20a,0x201,0x20a,0x201,0x20a,0x201,0x20a,0x20a,0x201,0x20a,
+0x201,0x20a,0x201,0x204,0x20d,0x219,0x219,0x20d,0x219,0x20d,0x219,0x219,0x20d,0x219,0x219,0x219,
+0x20d,0x20d,0x219,0x219,0x219,0x219,0x20d,0x219,0x219,0x20d,0x219,0x219,0x219,0x20d,0x20d,0x20d,
+0x219,0x219,0x20d,0x219,0x21c,0x210,0x219,0x20d,0x219,0x20d,0x219,0x219,0x20d,0x219,0x20d,0x20d,
+0x219,0x20d,0x219,0x21c,0x210,0x219,0x219,0x219,0x20d,0x219,0x20d,0x219,0x219,0x20d,0x20d,0x216,
+0x219,0x20d,0x20d,0x20d,0x216,0x216,0x216,0x216,0x21f,0x21f,0x213,0x21f,0x21f,0x213,0x21f,0x21f,
+0x213,0x21c,0x3cc,0x21c,0x3cc,0x21c,0x3cc,0x21c,0x3cc,0x21c,0x3cc,0x21c,0x3cc,0x21c,0x3cc,0x21c,
+0x3cc,0x20d,0x21c,0x210,0x21c,0x210,0x21c,0x210,0x219,0x20d,0x21c,0x210,0x21c,0x210,0x21c,0x210,
+0x21c,0x210,0x21c,0x210,0x210,0x21f,0x21f,0x213,0x21c,0x210,0x80a,0x80a,0x80d,0x807,0x21c,0x210,
+0x21c,0x210,0x21c,0x210,0x21c,0x210,0x21c,0x210,0x21c,0x210,0x21c,0x210,0x21c,0x210,0x21c,0x210,
+0x21c,0x210,0x21c,0x210,0x21c,0x210,0x21c,0x210,0x80d,0x807,0x80d,0x807,0x80a,0x804,0x80d,0x807,
+0xb97,0xb9a,0xcc3,0xcc6,0xcc6,0xcc6,0xcc6,0xcc3,0xcc6,0xcc3,0xcc6,0xcc3,0xcc6,0xcc3,0xcc6,0xcc3,
+0x222,0x3cf,0x222,0x222,0x222,0x222,0x222,0x222,0x222,0x222,0x222,0x222,0x222,0x222,0x222,0x222,
+0x222,0x222,0x222,0x222,0x222,0x222,0x222,0x222,0x222,0x222,0x222,0x222,0x222,0x222,0x222,0x222,
+0x225,0x222,0x222,0x222,0x222,0x222,0x222,0x222,0x222,0x222,0x222,0x222,0x222,0x810,0x810,0x810,
+0x810,0x810,0xab0,0xab0,0x237,0x237,0x237,0x237,0x237,0x237,0x237,0x237,0x237,0x231,0x231,0x231,
+0x231,0x231,0x231,0x231,0x237,0x237,0x237,0x237,0x237,0x228,0x228,0x228,0x228,0x228,0x813,0x813,
+0x813,0x813,0x816,0xab3,0xab3,0xab3,0xab3,0xab3,0xab3,0xab3,0xab3,0xab3,0xab3,0xab3,0xab3,0xab3,
+0xab3,0xab3,0xab3,0xab3,0x258,0x819,0x240,0x23d,0x240,0x23d,0x240,0x23d,0x240,0x23d,0x240,0x23d,
+0x240,0x23d,0x240,0x23d,0x25e,0x25e,0x255,0x24f,0x972,0x96f,0x9bd,0xab9,0xab6,0xabc,0xab9,0xab6,
+0xb9d,0xba0,0xba0,0xba0,0x3db,0x3db,0x3db,0x3db,0x3db,0x3db,0x3db,0x3db,0x3db,0x3db,0x3db,0x3db,
+0x3db,0x3db,0x3db,0x3db,0x81f,0x3de,0x267,0x26a,0x267,0x267,0x267,0x26a,0x267,0x267,0x267,0x267,
+0x26a,0x81f,0x26a,0x267,0x26d,0x267,0x26d,0x267,0x26d,0x267,0x26d,0x267,0x26d,0x267,0x26d,0x267,
+0x26d,0x267,0x26d,0x267,0x26d,0x267,0x26d,0x267,0x26d,0x267,0x270,0x26a,0x26d,0x267,0x26d,0x267,
+0x26d,0x267,0x26d,0x267,0x26d,0x267,0x26d,0x267,0x26d,0x267,0x26d,0x267,0x26d,0x267,0x26d,0x267,
+0x26d,0x267,0x26d,0x267,0x26d,0x267,0x26d,0x267,0x26d,0x267,0x26d,0x267,0x26d,0x270,0x26a,0x26d,
+0x267,0x9c9,0x9c6,0x26d,0x267,0x9c9,0x9c6,0x26d,0x267,0x9c9,0x9c6,0xccc,0x270,0x26a,0x270,0x26a,
+0x26d,0x267,0x270,0x26a,0x26d,0x267,0x270,0x26a,0x270,0x26a,0x270,0x26a,0x26d,0x267,0x270,0x26a,
+0x825,0x81f,0x270,0x26a,0x270,0x26a,0x270,0x26a,0x270,0x26a,0xba6,0xba3,0x270,0x26a,0xccf,0xccc,
+0xccf,0xccc,0xccf,0xccc,0x825,0x3e4,0x26d,0x270,0x26d,0x26d,0x26d,0x270,0x26d,0x26d,0x26d,0x26d,
+0x270,0x825,0x270,0x26d,0x3e1,0x3e1,0x3e1,0x3e1,0x3e1,0x3e1,0x3e1,0x3e1,0x3e1,0x3e4,0x3e1,0x3e1,
+0x3e1,0x3e1,0x3e1,0x3e1,0x2a0,0x29d,0x2a0,0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,
+0x29d,0x29d,0x29d,0x82b,0x29d,0x29d,0x29d,0x2a0,0x579,0x29d,0x4c5,0x4c5,0x4c5,0x4c5,0x4c5,0x4c5,
+0x4c5,0x294,0x4c2,0x4c8,0x68d,0x68d,0x68d,0x68d,0x68d,0x68d,0x68d,0x68d,0x68d,0x68d,0x576,0x690,
+0x690,0x29a,0x9cc,0x9cc,0x4bc,0x29d,0x29d,0x29d,0x29d,0x2a3,0x2a3,0x2a3,0x2a3,0x29d,0x29d,0x29d,
+0x29d,0x29d,0x29d,0x29d,0x4c8,0x4c5,0x4c5,0x4c5,0x4c5,0x2a6,0x2a6,0x4c5,0x4c5,0x29a,0x4c8,0x4c8,
+0x4c8,0x4c5,0xac5,0xac5,0x693,0x693,0x693,0x693,0x693,0x693,0x693,0x693,0x693,0x693,0x82b,0x82b,
+0x82b,0x828,0x828,0xac5,0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,
+0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,
+0x29d,0x29d,0x29d,0x29d,0x82b,0x82b,0x29d,0x29d,0x29d,0x29d,0x29d,0x82b,0x2e8,0x2e8,0x2e8,0x2e8,
+0x2e8,0x2e8,0x2e8,0x2e8,0x2e8,0x2e8,0x2e8,0x2e8,0x2e8,0x2e8,0x2e8,0x2e8,0x2e8,0x2e8,0x2e8,0x2e8,
+0x2e8,0x2e8,0x2e8,0x2e8,0x2e8,0x2e8,0x2e8,0x2e8,0x2e8,0x2e8,0x2e8,0x2e8,0x2f1,0x2eb,0x2f1,0x2eb,
+0x2f1,0x2eb,0x2f1,0x2eb,0x2f1,0x2eb,0x2f1,0x2eb,0x2f1,0x2eb,0x2f1,0x2eb,0x2f1,0x2eb,0x2f1,0x2eb,
+0x2f1,0x2eb,0x2f1,0x2eb,0x2f1,0x2eb,0x2f1,0x2eb,0x2f1,0x2eb,0x2f1,0x2eb,0x2fa,0x2fa,0x2fa,0x2fa,
+0x2fa,0x2fa,0x2fa,0x2fa,0x2fd,0x2fd,0x2fd,0x2fd,0x2fd,0x2fd,0x2fd,0x2fd,0x2fa,0x2fa,0x2fa,0x2fa,
+0x2fa,0x2fa,0x2fa,0x2fa,0x2fd,0x2fd,0x2fd,0x2fd,0x2fd,0x2fd,0x2fd,0x2fd,0x309,0x300,0x300,0x300,
+0x63f,0x6ba,0x46b,0xa80,0x92a,0x92a,0x87c,0x87c,0x87c,0x87c,0x9d8,0x9d8,0x9d8,0x9d8,0x9de,0xae0,
+0xae3,0xbbe,0xc30,0x9db,0xc30,0xc30,0xc30,0xc30,0xbbe,0xc30,0xc30,0xa32,0x351,0x34b,0x34b,0x351,
+0x34b,0x34b,0x351,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x354,0x34b,0x34b,0x34b,0x34b,0x34b,
+0x34b,0x34b,0x34b,0x34b,0x3f3,0x3f3,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x3f3,
+0x34b,0x34b,0x34b,0x888,0x888,0x888,0x888,0x888,0x888,0x888,0x888,0x888,0x9f3,0x9f3,0x9f3,0x9f3,
+0x9f3,0x9f3,0x9f3,0x9f3,0x9f3,0x9f3,0x9f3,0x9f3,0x357,0x357,0x357,0x357,0x357,0x357,0x357,0x357,
+0x357,0x357,0x357,0x357,0x357,0x357,0x357,0x357,0x357,0x357,0x357,0x357,0x357,0x357,0x357,0x357,
+0x357,0x357,0x357,0x357,0x357,0x357,0x357,0x357,0x35a,0x35a,0x35a,0x35a,0x357,0x357,0x357,0x357,
+0x357,0x357,0x35a,0x35a,0x35a,0x35a,0x357,0x357,0x357,0x357,0x9f6,0x9f6,0x9f6,0x9f6,0x9f6,0x9f6,
+0x9f6,0x9f6,0x9f6,0x9f6,0x9f6,0x9f6,0x9f6,0x9f6,0x363,0x363,0x360,0x360,0x360,0x360,0x360,0x360,
+0x360,0x6d5,0x48f,0x360,0x360,0x360,0x360,0x360,0x360,0x360,0x360,0x360,0x360,0x360,0x360,0x360,
+0x360,0x360,0x360,0x360,0x360,0x360,0x360,0x360,0x360,0x360,0x360,0x360,0x360,0x360,0x360,0x360,
+0x360,0x360,0x360,0x360,0x360,0x360,0x360,0x88b,0x9fc,0x88b,0x88b,0x88b,0x366,0x366,0x366,0x366,
+0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366,
+0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x375,0x375,0x375,0x375,
+0x375,0x375,0x375,0x375,0x375,0x375,0x375,0x375,0x375,0x375,0x375,0x375,0x375,0x375,0x375,0x375,
+0x375,0x375,0x375,0x375,0x375,0x375,0x375,0x375,0x375,0x375,0x375,0x375,0x37b,0x37b,0x37b,0x37b,
+0x37b,0x37b,0x37b,0x37b,0x37b,0x37b,0x37b,0x37b,0x37b,0x37b,0x37b,0x37b,0x37b,0x37b,0x37b,0x37b,
+0x37b,0x37b,0x37b,0x37b,0x37b,0x37b,0x37b,0x37b,0x37b,0x37b,0x37b,0x37b,0x3f9,0x3f9,0x3f9,0x3f9,
+0x3f9,0x3f9,0x3f9,0x3f9,0x3f9,0x3f9,0x3f9,0x3f9,0x3f9,0x3f9,0x3f9,0x3f9,0x42f,0x42f,0x37e,0x37b,
+0x54f,0x54f,0x54f,0x54f,0x54f,0x54f,0x54f,0x54f,0x54f,0x54f,0x54f,0x54f,0x54f,0x54f,0x54f,0x54f,
+0x54f,0x54f,0x54f,0x54f,0x54f,0x54f,0x37e,0x37e,0x37e,0x37e,0x37e,0x54f,0x5a0,0x687,0x687,0x687,
+0x687,0x687,0x687,0x687,0x687,0x687,0x687,0x687,0x687,0x687,0x687,0x687,0x687,0x687,0x687,0x687,
+0x687,0x687,0x687,0x37b,0x37b,0x37b,0x37b,0x37b,0x37b,0x37b,0x37b,0x37b,0x39c,0x39c,0x39c,0x39c,
+0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,
+0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x393,0x393,0x393,0x393,0x393,0x393,
+#endif /* U_DARWIN */
+0x396,0x396,0x396,0x396,0x396,0x396,0x396,0x396,0x396,0x396,0x396,0x396,0x396,0x396,0x396,0x396,
+#ifndef U_DARWIN
+0x396,0x396,0x396,0x396,0x396,0x393,0x393,0x393,0x393,0x393,0x393,0x393,0x393,0x393,0x393,0x393,
+0x3a2,0x3a2,0x39c,0x3a2,0x39c,0x3a2,0x39c,0x3a2,0x39c,0x3a2,0x39c,0x39f,0x3a5,0x3a2,0x39c,0x3a2,
+0x39c,0x39f,0x3a5,0x3a2,0x39c,0x3a2,0x39c,0x39f,0x3a5,0x3a2,0x39c,0x39f,0x3a5,0x3a2,0x39c,0x39f,
+0x3a5,0x3a2,0x39c,0x3a2,0x39c,0x3a2,0x39c,0x3a2,0x39c,0x3a2,0x39c,0x39f,0x3a5,0x3a2,0x39c,0x39f,
+0x3a5,0x3a2,0x39c,0x39f,0x3a5,0x3a2,0x39c,0x39f,0x3a5,0x3a2,0x39c,0x39f,0x3a5,0x3a2,0x39c,0x39f,
+0x3a5,0x3a2,0x39c,0x39f,0x3a5,0x3a2,0x39c,0x39f,0x3a5,0x3a2,0x39c,0x39f,0x3d8,0x3d8,0x3d8,0x3d8,
+0x3d8,0x3d8,0x3d8,0x3d8,0x3d8,0x3d8,0x3d8,0x3d8,0x3d8,0x3d8,0x3d8,0x3d8,0x3d2,0x3d2,0x3d2,0x3d2,
+0x3d2,0x3d2,0x3d2,0x3d2,0x3d2,0x3d5,0x3d2,0x3d2,0x3d2,0x3d2,0x3d2,0x3d2,0xa08,0x468,0x699,0x462,
+0x465,0x62a,0x3fc,0x633,0x633,0x633,0x633,0x633,0x633,0x633,0x633,0x633,0x630,0x3fc,0x3fc,0x3fc,
+0x3fc,0x3fc,0x3fc,0x3fc,0x3fc,0x3fc,0x3fc,0x3fc,0x3fc,0x3fc,0x3fc,0x3fc,0x3fc,0x3fc,0x3fc,0x3fc,
+0x3fc,0x3fc,0x3fc,0x3fc,0x3fc,0x3fc,0x3fc,0x3fc,0x3fc,0x3fc,0x3fc,0x3fc,0x3fc,0x3fc,0x62d,0x62d,
+0x78c,0x78c,0xc1b,0x78c,0x78c,0x78c,0x78c,0x78c,0x78c,0x78c,0x78c,0x78c,0x78c,0x78c,0x78c,0x78c,
+0x49e,0x49e,0x49e,0x49e,0x49e,0x49e,0x49e,0x49e,0x49e,0x49e,0xd0b,0x49e,0x49e,0x49e,0x429,0x49e,
+0x57c,0x59d,0x59d,0x59d,0x59d,0x59d,0x59d,0x597,0x597,0x597,0x597,0x597,0x597,0x597,0x597,0x597,
+0x597,0x597,0x597,0x597,0x597,0x597,0x597,0x597,0x597,0x597,0x597,0x69c,0x585,0x46b,0x58b,0x58e,
+0x588,0x59a,0x59a,0x59a,0x59a,0x59a,0x59a,0x594,0x594,0x594,0x594,0x594,0x594,0x594,0x594,0x594,
+0x594,0x594,0x594,0x594,0x594,0x594,0x594,0x594,0x594,0x594,0x594,0x69c,0x585,0x46b,0x585,0xa62,
+0x579,0x480,0x483,0x5a6,0x5a0,0x63c,0x5ac,0x5b2,0x6a5,0x47a,0x6a5,0x47a,0x6a8,0x47d,0x6a8,0x47d,
+0x6a5,0x47a,0x5a6,0x5a6,0x6a5,0x47a,0x6a5,0x47a,0x6a5,0x47a,0x6a5,0x47a,0x639,0x6a8,0x47d,0x47d,
+0x53a,0x53a,0x53a,0x53a,0x53a,0x53a,0x53a,0x53a,0x53a,0x53a,0x53a,0x53a,0x53a,0x53a,0x53a,0x53a,
+0x53a,0x53a,0x53a,0x53a,0x53a,0x53a,0x53a,0x53a,0x53a,0x53a,0x53a,0x53a,0x53a,0x53a,0x53a,0x53a,
+0x543,0x543,0x53a,0x53d,0x53d,0x540,0x8c4,0x8c4,0x8c4,0x8c4,0x8c4,0x8c4,0x8c4,0x8c4,0x8c4,0xa32,
+0xb31,0xb31,0xb31,0xb31,0xb31,0xb31,0xb31,0xb31,0xc4e,0xc4e,0xc4e,0xc4e,0xc5a,0xb3a,0xb3a,0xb3a,
+0x5a6,0x5b2,0x5b2,0x5b2,0x5b2,0x5b2,0x5b2,0x5b2,0x5b2,0x5b2,0x546,0x546,0x546,0x546,0x546,0x546,
+0x5a9,0x5af,0x5af,0x5af,0x5af,0x5af,0x5a3,0x5a0,0x8e2,0x8e2,0x8e2,0xa50,0xa4d,0xa35,0x8df,0x576,
+0x5b8,0x5b5,0x5b8,0x642,0x5b5,0x5b8,0x5b5,0x5b8,0x5b5,0x5b8,0x5b5,0x5b5,0x5b5,0x5b5,0x5b5,0x5b5,
+0x5b8,0x5b8,0x5b5,0x5b8,0x5b8,0x5b5,0x5b8,0x5b8,0x5b5,0x5b8,0x5b8,0x5b5,0x5b8,0x5b8,0x5b5,0x5b5,
+0xa56,0x651,0x5bb,0x651,0x5bb,0x651,0x5bb,0x651,0x5bb,0x651,0x5bb,0x5bb,0x5be,0x5bb,0x5be,0x5bb,
+0x5be,0x5bb,0x5be,0x5bb,0x5be,0x5bb,0x5be,0x5bb,0x5be,0x5bb,0x5be,0x5bb,0x5be,0x5bb,0x5be,0x5bb,
+0x5be,0x5bb,0x5be,0x651,0x5bb,0x5be,0x5bb,0x5be,0x5bb,0x5be,0x5bb,0x5bb,0x5bb,0x5bb,0x5bb,0x5bb,
+0x5be,0x5be,0x5bb,0x5be,0x5be,0x5bb,0x5be,0x5be,0x5bb,0x5be,0x5be,0x5bb,0x5be,0x5be,0x5bb,0x5bb,
+0x5bb,0x5bb,0x5bb,0x651,0x5bb,0x651,0x5bb,0x651,0x5bb,0x5bb,0x5bb,0x5bb,0x5bb,0x5bb,0x651,0x5bb,
+0x5bb,0x5bb,0x5bb,0x5bb,0x5be,0x651,0x651,0x5be,0x5be,0x5be,0x5be,0x64b,0x64e,0x654,0x657,0xa3b,
+0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,
+0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,
+0x5c7,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,
+0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5dc,0x5dc,0x5dc,0x5dc,
+0x5dc,0x5dc,0x5dc,0x5dc,0x5dc,0x5dc,0x5dc,0x5dc,0x5dc,0x5dc,0x5dc,0x5dc,0x5dc,0x5dc,0x5dc,0x5dc,
+0x5dc,0x5dc,0x5dc,0x5dc,0x5dc,0x5dc,0x5dc,0x5dc,0xb43,0xb43,0xc5d,0x5d0,0x5d3,0x5d3,0x5d3,0x5d3,
+0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,
+0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0xb3d,0xb3d,0xb3d,0xb3d,
+0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,
+0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,
+0x5d6,0xa3e,0xa3e,0xa3e,0xa3e,0xa3e,0xa3e,0xa3e,0xa3e,0xa3e,0xa3e,0xa3e,0xa3e,0xa3e,0xa3e,0xa3e,
+0x5e2,0x5e2,0x5e2,0x5e2,0x5e2,0x5e2,0x5e2,0x5e2,0x5e2,0x5e2,0x5e2,0x5e2,0x5e2,0x5e2,0x5e2,0x5e2,
+0x5e2,0x5e2,0x5e2,0x5e2,0x5e2,0x5e2,0x5e2,0x5e2,0x5df,0x5df,0x5df,0x5df,0x5df,0x5df,0x5df,0x5df,
+0x5df,0x5df,0x5df,0x5df,0x5df,0x5df,0x5df,0x5df,0x5df,0x5e2,0x5e2,0x5e2,0x5e2,0x5e2,0x5e2,0xb46,
+0xb46,0xb46,0xb46,0x5e2,0x5e2,0x5e2,0x5e2,0x5e2,0x5df,0x5df,0x5df,0x5df,0x5df,0x5df,0x5df,0x5df,
+0x5df,0x5df,0x5df,0x5df,0x5df,0x5df,0x5df,0x5df,0x5df,0x5df,0x5df,0x5df,0x5df,0x5df,0x5df,0x5df,
+0x5df,0x5df,0x5df,0x5df,0x5df,0x5df,0x5df,0xb46,0x5e2,0x5e2,0x5e2,0x5e2,0x5e2,0x5e2,0x5e2,0x5e2,
+0x5e2,0x5e2,0x5e2,0x5e2,0x5e2,0x5e2,0x5e2,0x5e2,0x5e2,0x5e2,0x5e2,0x5e2,0x5e2,0x5e2,0x5e2,0x5e2,
+0x5e2,0x5e2,0x5e2,0x5e2,0x5e2,0x5e2,0x5e2,0x5e2,0x5e2,0x5e2,0xb46,0xb46,0x5e5,0x5e5,0x5e5,0x5e5,
+0x5e5,0x5e5,0x5e5,0x5e5,0x5e5,0x5e5,0x5e5,0x5e5,0x5e5,0x5e5,0x5e5,0x5e5,0x5e5,0x5e5,0x5e5,0x5e5,
+0x5e5,0x5e5,0x5e5,0x5e5,0x5e5,0x5e5,0x5e5,0x5e5,0x5e5,0x5e5,0x5e5,0x5e5,0x5e8,0x5e8,0x5e8,0x5e8,
+0x5e8,0x5e8,0x5e8,0x5e8,0x5e8,0x5e8,0x5e8,0x5e8,0x5e8,0x5e8,0x5e8,0x5e8,0x5e8,0x5e8,0x5e8,0x5e8,
+0x5e8,0x5e8,0x5e8,0x5e8,0x5e8,0x5e8,0x5e8,0x5e8,0x5e8,0x5e8,0x5e8,0x5e8,0x5e8,0x5e8,0x5eb,0x5eb,
+0x5e8,0x5eb,0x5e8,0x5eb,0x5eb,0x5e8,0x5e8,0x5e8,0x5e8,0x5e8,0x5e8,0x5e8,0x5e8,0x5e8,0x5e8,0x5eb,
+0x756,0x756,0x756,0x756,0x756,0x756,0x756,0x756,0x756,0x756,0x756,0x756,0x756,0x756,0x756,0x756,
+0x756,0x756,0x756,0x756,0x756,0x756,0x756,0x756,0x756,0x756,0x756,0x756,0x756,0x756,0x756,0x756,
+0x75c,0x75c,0x75c,0x75c,0x75c,0x75c,0x75c,0x75c,0x75c,0x75c,0x75c,0x75c,0x75c,0x75c,0x75c,0x75c,
+0x75c,0x75c,0x75c,0x75c,0x75c,0x75c,0x75c,0x75c,0x75c,0x75c,0x75c,0x75c,0x75c,0x75c,0x75c,0x75c,
+0x762,0x75f,0x75f,0x75f,0x75f,0x75f,0x75f,0x75f,0x75f,0x75f,0x75f,0x75f,0x75f,0x75f,0x75f,0x75f,
+0x75f,0x75f,0x75f,0x75f,0x75f,0x75f,0x75f,0x75f,0x75f,0x75f,0x75f,0x75f,0x75f,0x75f,0x75f,0x75f,
+0x75f,0x75f,0x75f,0x75f,0x76e,0x76e,0x76e,0x76e,0x76e,0x76e,0x76e,0x76e,0x76e,0x76e,0x76e,0x76e,
+0x76e,0x76e,0x76e,0x76e,0x76e,0x76e,0x76e,0x76e,0x76e,0x76e,0x76e,0x76e,0x76e,0x76e,0x76e,0x76e,
+0x76e,0x76e,0x768,0x768,0x771,0x771,0x771,0x771,0x771,0x771,0x771,0x771,0x771,0x771,0x771,0x771,
+0x771,0x771,0x771,0x771,0x771,0x771,0x771,0x771,0x771,0x771,0x771,0x771,0x771,0x771,0x771,0x771,
+0x771,0x771,0x76b,0x76b,0x76e,0x76e,0x76e,0x76e,0x76e,0x76e,0x76e,0x76e,0x76e,0x76e,0x76e,0x76e,
+0x76e,0x76e,0x76e,0x76e,0x76e,0x76e,0x76e,0x76e,0x76e,0x76e,0x76e,0x76e,0x76e,0x76e,0x76e,0x76e,
+0x76e,0x76e,0x76e,0x76e,0x771,0x771,0x771,0x771,0x771,0x771,0x771,0x771,0x771,0x771,0x771,0x771,
+0x771,0x771,0x771,0x771,0x771,0x771,0x771,0x771,0x771,0x771,0x771,0x771,0x771,0x771,0x771,0x771,
+0x771,0x771,0x771,0x771,0x777,0x786,0x786,0x786,0x786,0x774,0x786,0x786,0x7ad,0x786,0x786,0x780,
+0x7aa,0x7a7,0x7a7,0x7a7,0x7a7,0x7a7,0x7ad,0x774,0x7a4,0x774,0x774,0x774,0x79b,0x79b,0x774,0x774,
+0x774,0x774,0x774,0x774,0x7b0,0x7b0,0x7b0,0x7b0,0x7b0,0x7b0,0x7b0,0x7b0,0x7b0,0x7b0,0x774,0x774,
+0x774,0x774,0x774,0x774,0x774,0x774,0x774,0x774,0x780,0x79b,0x774,0x79b,0x774,0x79b,0x7b3,0x789,
+0x7b3,0x789,0x7a1,0x7a1,0x7b9,0x7b9,0x7b9,0x7b9,0x7b9,0x7b9,0x7b9,0x7b9,0x7b9,0x7b9,0x7b9,0x7b9,
+0x7b9,0x7b9,0x7b9,0x7b9,0x7b9,0x7b9,0x7b9,0x7b9,0x7b9,0x7b9,0x7b9,0x7b9,0x7b9,0x7b9,0x7b9,0x7b9,
+0x7b9,0x7b9,0x7b9,0x7b9,0x7bc,0x7bc,0x7bc,0x7bc,0x7bc,0x7bc,0x7bc,0x7bc,0x7bc,0x7bc,0x7bc,0x7bc,
+0x7bc,0x7bc,0x7bc,0x7bc,0x7bc,0x7bc,0x7bc,0x7bc,0x7bc,0x7bc,0x7bc,0x7bc,0x7bc,0x7bc,0x7bc,0x7bc,
+0x7bc,0x7bc,0x7bc,0x7bc,0x7bf,0x7bf,0x7bf,0x7bf,0x7bf,0x7bf,0x7bf,0x7bf,0x7bf,0x7bf,0x7bf,0x7bf,
+0x7bf,0x7bf,0x7bf,0x7bf,0x7bf,0x7bf,0x7bf,0x7bf,0x7bf,0x7bf,0x7bf,0x7bf,0x7bf,0x7bf,0x7bf,0x7bf,
+0x7bf,0x7bf,0x7bf,0x7bf,0x7c2,0x7c5,0x7c5,0x7c5,0x7c5,0x7c5,0x7c5,0x7c5,0x7c5,0x7c5,0x7c5,0x7c5,
+0x7c5,0x7c5,0x7c5,0x7c5,0x7c5,0x7c5,0x7c5,0x7c5,0x7c5,0x7c5,0x7c5,0x7c5,0x7c5,0x7c5,0x7c5,0x7c5,
+0x7c2,0x7c5,0x7c5,0x7c5,0x7c5,0x7c5,0x7c5,0x7c5,0x7c5,0x7c5,0x7c5,0x7c5,0x7c5,0x7c5,0x7c5,0x7c5,
+0x7c5,0x7c5,0x7c5,0x7c5,0x7c5,0x7c5,0x7c5,0x7c5,0x7c5,0x7c5,0x7c5,0x7c5,0x984,0xa77,0x7d4,0x7ce,
+0x7d4,0x7ce,0x7d7,0x7d1,0x7d7,0x7d1,0x7d7,0x7d1,0x7d7,0x7d1,0x7d7,0x7d1,0x7d7,0x7d1,0x7d7,0x7d1,
+0xa77,0xa77,0xa77,0xb61,0xb61,0xb61,0xb64,0xb64,0xb61,0xb64,0xb64,0xb61,0x804,0x804,0x804,0x804,
+0x804,0x804,0x804,0x804,0x804,0x804,0x804,0x804,0x804,0xa92,0xa92,0xa92,0x8a0,0x8a0,0x8a0,0x8a0,
+0x8a0,0x8a0,0x8a0,0x8a0,0x8a0,0x8a0,0x8a0,0x8a0,0x8a0,0x8a0,0x8a0,0x8a0,0x807,0x807,0x807,0x807,
+0x807,0x807,0x807,0x807,0x807,0x807,0x807,0x807,0x807,0x807,0x807,0x807,0x807,0x807,0x807,0x807,
+0x807,0x807,0x807,0x807,0x807,0x807,0x807,0x807,0x807,0x807,0x807,0x807,0x825,0x825,0x825,0x825,
+0x825,0x825,0x825,0xb85,0x825,0x825,0x825,0x825,0x825,0x825,0x825,0x825,0x825,0x825,0x825,0x825,
+0x825,0x825,0x825,0x825,0x825,0x825,0x825,0x825,0x825,0x825,0x825,0x825,0x825,0x825,0x825,0x825,
+0x825,0x825,0x825,0x825,0x825,0x825,0x825,0xb85,0x825,0x825,0x825,0x825,0x825,0x825,0x825,0x825,
+0x825,0x825,0x825,0x825,0x825,0x825,0x825,0x825,0x828,0x828,0x828,0x828,0x828,0x828,0x828,0x828,
+0x828,0x828,0x828,0x828,0x828,0x828,0x828,0x828,0x828,0x828,0x828,0x828,0x828,0x828,0x828,0x828,
+0x828,0x828,0x828,0x828,0x828,0x828,0x828,0x828,0x831,0x831,0x831,0x831,0x831,0x831,0x831,0x831,
+0x831,0x831,0x831,0x831,0x831,0x831,0x831,0x831,0x831,0x831,0x831,0x831,0x831,0x831,0x831,0x831,
+0x831,0x831,0x831,0x831,0x831,0x831,0x831,0x831,0x837,0x837,0x837,0x837,0x837,0x837,0x837,0x837,
+0x837,0x837,0x837,0x837,0x837,0x837,0x837,0x837,0x837,0x837,0x837,0x837,0x837,0x837,0x837,0x837,
+0x837,0x837,0x837,0x837,0x837,0x837,0x837,0x837,0x840,0x840,0x840,0x840,0x840,0x840,0x840,0x840,
+0x840,0x840,0x840,0x840,0x840,0x840,0x840,0x840,0x840,0x840,0x840,0x840,0x840,0x840,0x840,0x840,
+0x840,0x840,0x840,0x840,0x840,0x840,0x840,0x840,0x840,0x840,0x840,0x843,0x840,0x840,0x840,0x840,
+0x840,0x840,0x840,0x840,0x840,0x840,0x840,0x840,0x840,0x840,0x840,0x840,0x840,0x840,0x840,0x840,
+0x840,0x840,0x840,0x840,0x840,0x840,0x840,0x840,0x855,0x855,0x855,0x855,0x855,0x855,0x855,0x855,
+0x855,0x855,0x855,0x855,0x855,0x855,0x855,0x855,0x855,0x855,0x855,0x855,0x855,0x855,0x855,0x855,
+0x855,0x855,0x855,0x9c6,0x9c6,0x9c6,0x9c6,0x9c6,0x861,0x861,0x861,0x861,0x861,0x861,0x861,0x861,
+0x861,0x861,0x861,0x861,0x861,0x861,0x861,0x861,0x861,0x861,0x861,0x861,0x861,0x861,0x861,0x861,
+0x861,0x861,0x861,0x861,0x861,0x861,0x861,0x861,0x8d0,0x8d0,0x8d0,0x8d0,0x8d0,0x8d0,0x8d0,0x8d0,
+0x8d0,0x8d0,0x8d0,0x8d0,0x8d0,0x8d0,0x8d0,0x8d0,0x8d0,0x8d0,0x8d0,0x8d0,0x8d0,0x8d0,0x8d0,0x8d0,
+0x8d0,0x8d0,0x8d0,0x8d0,0x8d0,0x8d0,0x8d0,0x8d0,0x8d6,0x8d6,0x8d6,0x8d6,0x8d6,0x8d6,0x8d6,0x8d6,
+0x8d6,0x8d6,0x8d6,0x8d6,0x8d6,0x8d6,0x8d6,0x8d6,0x8d6,0x8d6,0x8d6,0x8d6,0x8d6,0x8d6,0x8d6,0x8d6,
+0x8d6,0x8d6,0x8d6,0x8d6,0x8d6,0x8d6,0x8d6,0x8d6,0x8e8,0x8e8,0x8e8,0x8e8,0x8e8,0x8e8,0x8e8,0x8e8,
+0x8e8,0x8e8,0x8e8,0x8e8,0x8e8,0x8e8,0x8e8,0x8e8,0x8e8,0x8e8,0x8e8,0x8e8,0x8e8,0x8e8,0x8e8,0x8e8,
+0x8e8,0x8e8,0x8e8,0x8e8,0x8e8,0x8e8,0x8e8,0x8e8,0x8eb,0x8eb,0x8eb,0x8eb,0x8eb,0x8eb,0x8eb,0x8eb,
+0x8eb,0x8eb,0x8eb,0x8eb,0x8eb,0x8eb,0x8eb,0x8eb,0x8eb,0x8eb,0x8eb,0x8eb,0x8eb,0x8f7,0x8eb,0x8eb,
+0x8eb,0x8eb,0x8eb,0x8eb,0x8eb,0x8eb,0x8eb,0x8eb,0x8eb,0x8eb,0x8eb,0x8eb,0x8eb,0x8eb,0x8eb,0x8eb,
+0x8eb,0x8eb,0x8eb,0x8eb,0x8eb,0x8eb,0x8eb,0x8eb,0x8eb,0x8eb,0x8eb,0x8eb,0x8eb,0x8eb,0x8eb,0x8eb,
+0x8ee,0x8ee,0xa41,0xa41,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,
+0x8ee,0x8ee,0x8ee,0x8ee,0xa41,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,
+0x918,0x918,0x918,0x918,0x918,0x918,0x918,0x918,0x918,0x918,0x918,0x918,0x918,0x918,0x918,0x918,
+0x918,0x918,0x918,0x918,0x918,0x918,0x918,0x918,0x918,0x918,0x918,0x918,0x918,0x918,0x918,0x918,
+0x930,0x930,0x930,0x933,0x930,0x930,0x930,0x930,0x930,0x930,0x930,0x930,0x930,0x930,0x930,0x930,
+0x930,0x930,0x930,0x930,0x91e,0x91e,0x92d,0x921,0x921,0x921,0x921,0x921,0x921,0x921,0x92d,0x92d,
+0x930,0x930,0x930,0x930,0x930,0x930,0x930,0x930,0x930,0x930,0x930,0x930,0x930,0x930,0x930,0x930,
+0x930,0x930,0x930,0x930,0x930,0x930,0x930,0x930,0x930,0x930,0x930,0x930,0x930,0x930,0x930,0x930,
+0x94b,0x94b,0x94b,0x94b,0x94b,0x94b,0xac2,0xac2,0x948,0x948,0x948,0x948,0x948,0x948,0x948,0x948,
+0x948,0x948,0x948,0x948,0x948,0x948,0x948,0x948,0x948,0x948,0x948,0x948,0x948,0x948,0x948,0x948,
+0x948,0x948,0xabf,0xabf,0xafb,0xafb,0xafb,0xafb,0xafb,0xafb,0xafb,0xafb,0xafb,0xafb,0xafb,0xafb,
+0xafb,0xafb,0xafb,0xafb,0x94b,0x94b,0x94b,0x94b,0x94b,0x94b,0x94b,0x94b,0x94b,0x94b,0x94b,0x94b,
+0x94b,0x94b,0x94b,0x94b,0x94b,0x94b,0x94b,0x94b,0x94b,0x94b,0x94b,0x94b,0x94b,0x94b,0x94b,0x94b,
+0x94b,0x94b,0x94b,0x94b,0x94e,0x94e,0x94e,0x94e,0x94e,0x94e,0x94e,0x94e,0x94e,0x94e,0x94e,0x94e,
+#else /* U_DARWIN */
+0x396,0x396,0x396,0x396,0x396,0x396,0x396,0x396,0x396,0x396,0x396,0x396,0x399,0x39f,0x39c,0x396,
+0x399,0x39f,0x39c,0x396,0x399,0x39f,0x39c,0x396,0x399,0x39f,0x39c,0x396,0x399,0x39f,0x39c,0x396,
+0x399,0x39f,0x39c,0x396,0x399,0x39f,0x39c,0x396,0x399,0x39f,0x39c,0x396,0x39c,0x396,0x39c,0x396,
+0x39c,0x396,0x39c,0x396,0x39c,0x396,0x39c,0x396,0x399,0x39f,0x39c,0x396,0x399,0x39f,0x39c,0x396,
+0x399,0x39f,0x39c,0x396,0x399,0x39f,0x39c,0x396,0x39c,0x396,0x39c,0x396,0x39c,0x396,0x399,0x39f,
+0x399,0x39f,0x39c,0x396,0x39c,0x396,0x39c,0x396,0x39c,0x396,0x39c,0x396,0x39c,0x396,0x39c,0x396,
+0x399,0x39c,0x396,0x399,0x39c,0x396,0x399,0x39f,0x396,0x396,0x396,0x396,0x396,0x396,0x396,0x396,
+0x396,0x396,0x396,0x396,0x396,0x396,0x396,0x396,0x396,0x396,0x396,0x396,0x396,0x396,0x396,0x399,
+0x399,0x399,0x399,0x399,0x399,0x399,0x399,0x399,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,
+0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x396,0x396,0x396,0x396,0x396,0x396,0x396,
+0x396,0x396,0x396,0x396,0x396,0x396,0x396,0x396,0x396,0x399,0x399,0x399,0x399,0x399,0x399,0x399,
+0x39f,0x39f,0x39f,0x39f,0x39f,0x39f,0x39f,0x39f,0x396,0x39c,0x6c6,0x474,0x399,0x399,0x396,0x399,
+0x396,0x399,0x396,0x396,0x399,0x396,0x396,0x399,0x396,0x399,0x396,0x396,0x399,0x396,0x399,0x399,
+0x396,0x396,0x396,0x399,0x396,0x396,0x396,0x396,0x396,0x399,0x396,0x396,0x396,0x396,0x396,0x396,
+0x396,0x396,0x396,0x396,0x396,0x396,0x396,0x396,0x396,0x396,0x396,0x396,0x396,0x396,0x396,0x396,
+0x399,0x399,0x396,0x396,0x399,0x396,0x399,0x396,0x396,0x396,0x396,0x396,0x399,0x399,0x399,0x399,
+0x399,0x399,0x399,0x399,0x399,0x399,0x399,0x399,0x399,0x399,0x399,0x399,0x399,0x399,0x399,0x399,
+0x399,0x399,0x399,0x399,0x399,0x399,0x399,0x399,0x399,0x399,0x399,0x399,0x399,0x399,0x399,0x39f,
+0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,
+0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,
+0x39f,0x39f,0x39f,0x39f,0x39f,0x39f,0x39f,0x39f,0x39f,0x39f,0x39f,0x39f,0x39f,0x39f,0x39f,0x39f,
+0x39f,0x39f,0x39f,0x39f,0x39f,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,
+0x3ab,0x3ab,0x3a5,0x3ab,0x3a5,0x3ab,0x3a5,0x3ab,0x3a5,0x3ab,0x3a5,0x3a8,0x3ae,0x3ab,0x3a5,0x3ab,
+0x3a5,0x3a8,0x3ae,0x3ab,0x3a5,0x3ab,0x3a5,0x3a8,0x3ae,0x3ab,0x3a5,0x3a8,0x3ae,0x3ab,0x3a5,0x3a8,
+0x3ae,0x3ab,0x3a5,0x3ab,0x3a5,0x3ab,0x3a5,0x3ab,0x3a5,0x3ab,0x3a5,0x3a8,0x3ae,0x3ab,0x3a5,0x3a8,
+0x3ae,0x3ab,0x3a5,0x3a8,0x3ae,0x3ab,0x3a5,0x3a8,0x3ae,0x3ab,0x3a5,0x3a8,0x3ae,0x3ab,0x3a5,0x3a8,
+0x3ae,0x3ab,0x3a5,0x3a8,0x3ae,0x3ab,0x3a5,0x3a8,0x3ae,0x3ab,0x3a5,0x3a8,0x3e1,0x3e1,0x3e1,0x3e1,
+0x3e1,0x3e1,0x3e1,0x3e1,0x3e1,0x3e1,0x3e1,0x3e1,0x3e1,0x3e1,0x3e1,0x3e1,0x3db,0x3db,0x3db,0x3db,
+0x3db,0x3db,0x3db,0x3db,0x3db,0x3de,0x3db,0x3db,0x3db,0x3db,0x3db,0x3db,0x3f9,0x3f9,0x3f9,0x3f9,
+0x3f9,0x3f9,0x3f9,0x3f9,0x3f9,0x3f9,0x3f9,0x3f9,0x3f9,0x3f9,0x3f9,0x3f9,0x564,0x564,0x564,0x564,
+0x564,0x564,0x564,0x564,0x564,0x564,0x564,0x564,0x564,0x564,0x564,0x564,0xa3e,0x47d,0x6c9,0x477,
+0x47a,0x654,0x408,0x65d,0x65d,0x65d,0x65d,0x65d,0x65d,0x65d,0x65d,0x65d,0x65a,0x408,0x408,0x408,
+0x408,0x408,0x408,0x408,0x408,0x408,0x408,0x408,0x408,0x408,0x408,0x408,0x408,0x408,0x408,0x408,
+0x408,0x408,0x408,0x408,0x408,0x408,0x408,0x408,0x408,0x408,0x408,0x408,0x408,0x408,0x657,0x657,
+0x7c2,0x7c2,0xc51,0x7c2,0x7c2,0x7c2,0x7c2,0x7c2,0x7c2,0x7c2,0x7c2,0x7c2,0x7c2,0x7c2,0x7c2,0x7c2,
+0x4b9,0x4b9,0x4b9,0x4b9,0x4b9,0x4b9,0x4b9,0x4b9,0x4b9,0x4b9,0xd41,0x4b9,0x4b9,0x4b9,0x43b,0x4b9,
+0x5a3,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5be,0x5be,0x5be,0x5be,0x5be,0x5be,0x5be,0x5be,0x5be,
+0x5be,0x5be,0x5be,0x5be,0x5be,0x5be,0x5be,0x5be,0x5be,0x5be,0x5be,0x6cf,0x5ac,0x483,0x5b2,0x5b5,
+0x5af,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5bb,0x5bb,0x5bb,0x5bb,0x5bb,0x5bb,0x5bb,0x5bb,0x5bb,
+0x5bb,0x5bb,0x5bb,0x5bb,0x5bb,0x5bb,0x5bb,0x5bb,0x5bb,0x5bb,0x5bb,0x6cf,0x5ac,0x483,0x5ac,0xa98,
+0x59a,0x498,0x49b,0x5cd,0x5c7,0x666,0x5d3,0x5d9,0x6d8,0x492,0x6d8,0x492,0x6db,0x495,0x6db,0x495,
+0x6d8,0x492,0x5cd,0x5cd,0x6d8,0x492,0x6d8,0x492,0x6d8,0x492,0x6d8,0x492,0x663,0x6db,0x495,0x495,
+0x558,0x558,0x558,0x558,0x558,0x558,0x558,0x558,0x558,0x558,0x558,0x558,0x558,0x558,0x558,0x558,
+0x558,0x558,0x558,0x558,0x558,0x558,0x558,0x558,0x558,0x558,0x558,0x558,0x558,0x558,0x558,0x558,
+0x561,0x561,0x558,0x55b,0x55b,0x55e,0x8fa,0x8fa,0x8fa,0x8fa,0x8fa,0x8fa,0x8fa,0x8fa,0x8fa,0xa68,
+0xb67,0xb67,0xb67,0xb67,0xb67,0xb67,0xb67,0xb67,0xc84,0xc84,0xc84,0xc84,0xc90,0xb70,0xb70,0xb70,
+0x5cd,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x567,0x567,0x567,0x567,0x567,0x567,
+0x5d0,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5ca,0x5c7,0x918,0x918,0x918,0xa86,0xa83,0xa6b,0x915,0x597,
+0x5df,0x5dc,0x5df,0x66c,0x5dc,0x5df,0x5dc,0x5df,0x5dc,0x5df,0x5dc,0x5dc,0x5dc,0x5dc,0x5dc,0x5dc,
+0x5df,0x5df,0x5dc,0x5df,0x5df,0x5dc,0x5df,0x5df,0x5dc,0x5df,0x5df,0x5dc,0x5df,0x5df,0x5dc,0x5dc,
+0xa8c,0x67b,0x5e2,0x67b,0x5e2,0x67b,0x5e2,0x67b,0x5e2,0x67b,0x5e2,0x5e2,0x5e5,0x5e2,0x5e5,0x5e2,
+0x5e5,0x5e2,0x5e5,0x5e2,0x5e5,0x5e2,0x5e5,0x5e2,0x5e5,0x5e2,0x5e5,0x5e2,0x5e5,0x5e2,0x5e5,0x5e2,
+0x5e5,0x5e2,0x5e5,0x67b,0x5e2,0x5e5,0x5e2,0x5e5,0x5e2,0x5e5,0x5e2,0x5e2,0x5e2,0x5e2,0x5e2,0x5e2,
+0x5e5,0x5e5,0x5e2,0x5e5,0x5e5,0x5e2,0x5e5,0x5e5,0x5e2,0x5e5,0x5e5,0x5e2,0x5e5,0x5e5,0x5e2,0x5e2,
+0x5e2,0x5e2,0x5e2,0x67b,0x5e2,0x67b,0x5e2,0x67b,0x5e2,0x5e2,0x5e2,0x5e2,0x5e2,0x5e2,0x67b,0x5e2,
+0x5e2,0x5e2,0x5e2,0x5e2,0x5e5,0x67b,0x67b,0x5e5,0x5e5,0x5e5,0x5e5,0x675,0x678,0x67e,0x681,0xa71,
+0x5eb,0x5eb,0x5eb,0x5eb,0x5eb,0x5eb,0x5eb,0x5eb,0x5eb,0x5eb,0x5eb,0x5eb,0x5eb,0x5eb,0x5eb,0x5eb,
+0x5eb,0x5eb,0x5eb,0x5eb,0x5eb,0x5eb,0x5eb,0x5eb,0x5eb,0x5eb,0x5eb,0x5eb,0x5eb,0x5eb,0x5eb,0x5eb,
+0x5ee,0x5eb,0x5eb,0x5eb,0x5eb,0x5eb,0x5eb,0x5eb,0x5eb,0x5eb,0x5eb,0x5eb,0x5eb,0x5eb,0x5eb,0x5eb,
+0x5eb,0x5eb,0x5eb,0x5eb,0x5eb,0x5eb,0x5eb,0x5eb,0x5eb,0x5eb,0x5eb,0x5eb,0x603,0x603,0x603,0x603,
+0x603,0x603,0x603,0x603,0x603,0x603,0x603,0x603,0x603,0x603,0x603,0x603,0x603,0x603,0x603,0x603,
+0x603,0x603,0x603,0x603,0x603,0x603,0x603,0x603,0xb79,0xb79,0xc93,0x5f7,0x5fa,0x5fa,0x5fa,0x5fa,
+0x5fa,0x5fa,0x5fa,0x5fa,0x5fa,0x5fa,0x5fa,0x5fa,0x5fa,0x5fa,0x5fa,0x5fa,0x5fa,0x5fa,0x5fa,0x5fa,
+0x5fa,0x5fa,0x5fa,0x5fa,0x5fa,0x5fa,0x5fa,0x5fa,0x5fa,0x5fa,0x5fa,0x5fa,0xb73,0xb73,0xb73,0xb73,
+0x5fd,0x5fd,0x5fd,0x5fd,0x5fd,0x5fd,0x5fd,0x5fd,0x5fd,0x5fd,0x5fd,0x5fd,0x5fd,0x5fd,0x5fd,0x5fd,
+0x5fd,0x5fd,0x5fd,0x5fd,0x5fd,0x5fd,0x5fd,0x5fd,0x5fd,0x5fd,0x5fd,0x5fd,0x5fd,0x5fd,0x5fd,0x5fd,
+0x5fd,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,
+0x609,0x609,0x609,0x609,0x609,0x609,0x609,0x609,0x609,0x609,0x609,0x609,0x609,0x609,0x609,0x609,
+0x609,0x609,0x609,0x609,0x609,0x609,0x609,0x609,0x606,0x606,0x606,0x606,0x606,0x606,0x606,0x606,
+0x606,0x606,0x606,0x606,0x606,0x606,0x606,0x606,0x606,0x609,0x609,0x609,0x609,0x609,0x609,0xb7c,
+0xb7c,0xb7c,0xb7c,0x609,0x609,0x609,0x609,0x609,0x606,0x606,0x606,0x606,0x606,0x606,0x606,0x606,
+0x606,0x606,0x606,0x606,0x606,0x606,0x606,0x606,0x606,0x606,0x606,0x606,0x606,0x606,0x606,0x606,
+0x606,0x606,0x606,0x606,0x606,0x606,0x606,0xb7c,0x609,0x609,0x609,0x609,0x609,0x609,0x609,0x609,
+0x609,0x609,0x609,0x609,0x609,0x609,0x609,0x609,0x609,0x609,0x609,0x609,0x609,0x609,0x609,0x609,
+0x609,0x609,0x609,0x609,0x609,0x609,0x609,0x609,0x609,0x609,0xb7c,0xb7c,0x60c,0x60c,0x60c,0x60c,
+0x60c,0x60c,0x60c,0x60c,0x60c,0x60c,0x60c,0x60c,0x60c,0x60c,0x60c,0x60c,0x60c,0x60c,0x60c,0x60c,
+0x60c,0x60c,0x60c,0x60c,0x60c,0x60c,0x60c,0x60c,0x60c,0x60c,0x60c,0x60c,0x60f,0x60f,0x60f,0x60f,
+0x60f,0x60f,0x60f,0x60f,0x60f,0x60f,0x60f,0x60f,0x60f,0x60f,0x60f,0x60f,0x60f,0x60f,0x60f,0x60f,
+0x60f,0x60f,0x60f,0x60f,0x60f,0x60f,0x60f,0x60f,0x60f,0x60f,0x60f,0x60f,0x60f,0x60f,0x612,0x612,
+0x60f,0x612,0x60f,0x612,0x612,0x60f,0x60f,0x60f,0x60f,0x60f,0x60f,0x60f,0x60f,0x60f,0x60f,0x612,
+0x78c,0x78c,0x78c,0x78c,0x78c,0x78c,0x78c,0x78c,0x78c,0x78c,0x78c,0x78c,0x78c,0x78c,0x78c,0x78c,
+0x78c,0x78c,0x78c,0x78c,0x78c,0x78c,0x78c,0x78c,0x78c,0x78c,0x78c,0x78c,0x78c,0x78c,0x78c,0x78c,
+0x792,0x792,0x792,0x792,0x792,0x792,0x792,0x792,0x792,0x792,0x792,0x792,0x792,0x792,0x792,0x792,
+0x792,0x792,0x792,0x792,0x792,0x792,0x792,0x792,0x792,0x792,0x792,0x792,0x792,0x792,0x792,0x792,
+0x798,0x795,0x795,0x795,0x795,0x795,0x795,0x795,0x795,0x795,0x795,0x795,0x795,0x795,0x795,0x795,
+0x795,0x795,0x795,0x795,0x795,0x795,0x795,0x795,0x795,0x795,0x795,0x795,0x795,0x795,0x795,0x795,
+0x795,0x795,0x795,0x795,0x7a4,0x7a4,0x7a4,0x7a4,0x7a4,0x7a4,0x7a4,0x7a4,0x7a4,0x7a4,0x7a4,0x7a4,
+0x7a4,0x7a4,0x7a4,0x7a4,0x7a4,0x7a4,0x7a4,0x7a4,0x7a4,0x7a4,0x7a4,0x7a4,0x7a4,0x7a4,0x7a4,0x7a4,
+0x7a4,0x7a4,0x79e,0x79e,0x7a7,0x7a7,0x7a7,0x7a7,0x7a7,0x7a7,0x7a7,0x7a7,0x7a7,0x7a7,0x7a7,0x7a7,
+0x7a7,0x7a7,0x7a7,0x7a7,0x7a7,0x7a7,0x7a7,0x7a7,0x7a7,0x7a7,0x7a7,0x7a7,0x7a7,0x7a7,0x7a7,0x7a7,
+0x7a7,0x7a7,0x7a1,0x7a1,0x7a4,0x7a4,0x7a4,0x7a4,0x7a4,0x7a4,0x7a4,0x7a4,0x7a4,0x7a4,0x7a4,0x7a4,
+0x7a4,0x7a4,0x7a4,0x7a4,0x7a4,0x7a4,0x7a4,0x7a4,0x7a4,0x7a4,0x7a4,0x7a4,0x7a4,0x7a4,0x7a4,0x7a4,
+0x7a4,0x7a4,0x7a4,0x7a4,0x7a7,0x7a7,0x7a7,0x7a7,0x7a7,0x7a7,0x7a7,0x7a7,0x7a7,0x7a7,0x7a7,0x7a7,
+0x7a7,0x7a7,0x7a7,0x7a7,0x7a7,0x7a7,0x7a7,0x7a7,0x7a7,0x7a7,0x7a7,0x7a7,0x7a7,0x7a7,0x7a7,0x7a7,
+0x7a7,0x7a7,0x7a7,0x7a7,0x7ad,0x7bc,0x7bc,0x7bc,0x7bc,0x7aa,0x7bc,0x7bc,0x7e3,0x7bc,0x7bc,0x7b6,
+0x7e0,0x7dd,0x7dd,0x7dd,0x7dd,0x7dd,0x7e3,0x7aa,0x7da,0x7aa,0x7aa,0x7aa,0x7d1,0x7d1,0x7aa,0x7aa,
+0x7aa,0x7aa,0x7aa,0x7aa,0x7e6,0x7e6,0x7e6,0x7e6,0x7e6,0x7e6,0x7e6,0x7e6,0x7e6,0x7e6,0x7aa,0x7aa,
+0x7aa,0x7aa,0x7aa,0x7aa,0x7aa,0x7aa,0x7aa,0x7aa,0x7b6,0x7d1,0x7aa,0x7d1,0x7aa,0x7d1,0x7e9,0x7bf,
+0x7e9,0x7bf,0x7d7,0x7d7,0x7ef,0x7ef,0x7ef,0x7ef,0x7ef,0x7ef,0x7ef,0x7ef,0x7ef,0x7ef,0x7ef,0x7ef,
+0x7ef,0x7ef,0x7ef,0x7ef,0x7ef,0x7ef,0x7ef,0x7ef,0x7ef,0x7ef,0x7ef,0x7ef,0x7ef,0x7ef,0x7ef,0x7ef,
+0x7ef,0x7ef,0x7ef,0x7ef,0x7f2,0x7f2,0x7f2,0x7f2,0x7f2,0x7f2,0x7f2,0x7f2,0x7f2,0x7f2,0x7f2,0x7f2,
+0x7f2,0x7f2,0x7f2,0x7f2,0x7f2,0x7f2,0x7f2,0x7f2,0x7f2,0x7f2,0x7f2,0x7f2,0x7f2,0x7f2,0x7f2,0x7f2,
+0x7f2,0x7f2,0x7f2,0x7f2,0x7f5,0x7f5,0x7f5,0x7f5,0x7f5,0x7f5,0x7f5,0x7f5,0x7f5,0x7f5,0x7f5,0x7f5,
+0x7f5,0x7f5,0x7f5,0x7f5,0x7f5,0x7f5,0x7f5,0x7f5,0x7f5,0x7f5,0x7f5,0x7f5,0x7f5,0x7f5,0x7f5,0x7f5,
+0x7f5,0x7f5,0x7f5,0x7f5,0x7f8,0x7fb,0x7fb,0x7fb,0x7fb,0x7fb,0x7fb,0x7fb,0x7fb,0x7fb,0x7fb,0x7fb,
+0x7fb,0x7fb,0x7fb,0x7fb,0x7fb,0x7fb,0x7fb,0x7fb,0x7fb,0x7fb,0x7fb,0x7fb,0x7fb,0x7fb,0x7fb,0x7fb,
+0x7f8,0x7fb,0x7fb,0x7fb,0x7fb,0x7fb,0x7fb,0x7fb,0x7fb,0x7fb,0x7fb,0x7fb,0x7fb,0x7fb,0x7fb,0x7fb,
+0x7fb,0x7fb,0x7fb,0x7fb,0x7fb,0x7fb,0x7fb,0x7fb,0x7fb,0x7fb,0x7fb,0x7fb,0x9ba,0xaad,0x80a,0x804,
+0x80a,0x804,0x80d,0x807,0x80d,0x807,0x80d,0x807,0x80d,0x807,0x80d,0x807,0x80d,0x807,0x80d,0x807,
+0xaad,0xaad,0xaad,0xb97,0xb97,0xb97,0xb9a,0xb9a,0xb97,0xb9a,0xb9a,0xb97,0x83a,0x83a,0x83a,0x83a,
+0x83a,0x83a,0x83a,0x83a,0x83a,0x83a,0x83a,0x83a,0x83a,0xac8,0xac8,0xac8,0x8d6,0x8d6,0x8d6,0x8d6,
+0x8d6,0x8d6,0x8d6,0x8d6,0x8d6,0x8d6,0x8d6,0x8d6,0x8d6,0x8d6,0x8d6,0x8d6,0x83d,0x83d,0x83d,0x83d,
+0x83d,0x83d,0x83d,0x83d,0x83d,0x83d,0x83d,0x83d,0x83d,0x83d,0x83d,0x83d,0x83d,0x83d,0x83d,0x83d,
+0x83d,0x83d,0x83d,0x83d,0x83d,0x83d,0x83d,0x83d,0x83d,0x83d,0x83d,0x83d,0x85b,0x85b,0x85b,0x85b,
+0x85b,0x85b,0x85b,0xbbb,0x85b,0x85b,0x85b,0x85b,0x85b,0x85b,0x85b,0x85b,0x85b,0x85b,0x85b,0x85b,
+0x85b,0x85b,0x85b,0x85b,0x85b,0x85b,0x85b,0x85b,0x85b,0x85b,0x85b,0x85b,0x85b,0x85b,0x85b,0x85b,
+0x85b,0x85b,0x85b,0x85b,0x85b,0x85b,0x85b,0xbbb,0x85b,0x85b,0x85b,0x85b,0x85b,0x85b,0x85b,0x85b,
+0x85b,0x85b,0x85b,0x85b,0x85b,0x85b,0x85b,0x85b,0x85e,0x85e,0x85e,0x85e,0x85e,0x85e,0x85e,0x85e,
+0x85e,0x85e,0x85e,0x85e,0x85e,0x85e,0x85e,0x85e,0x85e,0x85e,0x85e,0x85e,0x85e,0x85e,0x85e,0x85e,
+0x85e,0x85e,0x85e,0x85e,0x85e,0x85e,0x85e,0x85e,0x867,0x867,0x867,0x867,0x867,0x867,0x867,0x867,
+0x867,0x867,0x867,0x867,0x867,0x867,0x867,0x867,0x867,0x867,0x867,0x867,0x867,0x867,0x867,0x867,
+0x867,0x867,0x867,0x867,0x867,0x867,0x867,0x867,0x86d,0x86d,0x86d,0x86d,0x86d,0x86d,0x86d,0x86d,
+0x86d,0x86d,0x86d,0x86d,0x86d,0x86d,0x86d,0x86d,0x86d,0x86d,0x86d,0x86d,0x86d,0x86d,0x86d,0x86d,
+0x86d,0x86d,0x86d,0x86d,0x86d,0x86d,0x86d,0x86d,0x876,0x876,0x876,0x876,0x876,0x876,0x876,0x876,
+0x876,0x876,0x876,0x876,0x876,0x876,0x876,0x876,0x876,0x876,0x876,0x876,0x876,0x876,0x876,0x876,
+0x876,0x876,0x876,0x876,0x876,0x876,0x876,0x876,0x876,0x876,0x876,0x879,0x876,0x876,0x876,0x876,
+0x876,0x876,0x876,0x876,0x876,0x876,0x876,0x876,0x876,0x876,0x876,0x876,0x876,0x876,0x876,0x876,
+0x876,0x876,0x876,0x876,0x876,0x876,0x876,0x876,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,
+0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,
+0x88b,0x88b,0x88b,0x9fc,0x9fc,0x9fc,0x9fc,0x9fc,0x897,0x897,0x897,0x897,0x897,0x897,0x897,0x897,
+0x897,0x897,0x897,0x897,0x897,0x897,0x897,0x897,0x897,0x897,0x897,0x897,0x897,0x897,0x897,0x897,
+0x897,0x897,0x897,0x897,0x897,0x897,0x897,0x897,0x906,0x906,0x906,0x906,0x906,0x906,0x906,0x906,
+0x906,0x906,0x906,0x906,0x906,0x906,0x906,0x906,0x906,0x906,0x906,0x906,0x906,0x906,0x906,0x906,
+0x906,0x906,0x906,0x906,0x906,0x906,0x906,0x906,0x90c,0x90c,0x90c,0x90c,0x90c,0x90c,0x90c,0x90c,
+0x90c,0x90c,0x90c,0x90c,0x90c,0x90c,0x90c,0x90c,0x90c,0x90c,0x90c,0x90c,0x90c,0x90c,0x90c,0x90c,
+0x90c,0x90c,0x90c,0x90c,0x90c,0x90c,0x90c,0x90c,0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,
+0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,
+0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0x921,0x921,0x921,0x921,0x921,0x921,0x921,0x921,
+0x921,0x921,0x921,0x921,0x921,0x921,0x921,0x921,0x921,0x921,0x921,0x921,0x921,0x92d,0x921,0x921,
+0x921,0x921,0x921,0x921,0x921,0x921,0x921,0x921,0x921,0x921,0x921,0x921,0x921,0x921,0x921,0x921,
+0x921,0x921,0x921,0x921,0x921,0x921,0x921,0x921,0x921,0x921,0x921,0x921,0x921,0x921,0x921,0x921,
+0x924,0x924,0xa77,0xa77,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924,
+0x924,0x924,0x924,0x924,0xa77,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924,
+#endif /* U_DARWIN */
+0x94e,0x94e,0x94e,0x94e,0x94e,0x94e,0x94e,0x94e,0x94e,0x94e,0x94e,0x94e,0x94e,0x94e,0x94e,0x94e,
+#ifndef U_DARWIN
+0x94e,0x94e,0x94e,0x94e,0x951,0x951,0x951,0x951,0x951,0x951,0x951,0x951,0x951,0x951,0x951,0x951,
+0x951,0x951,0x951,0x951,0x951,0x951,0x951,0x951,0x951,0x951,0x951,0x951,0x951,0x951,0x951,0x951,
+0x951,0x951,0x951,0x951,0x951,0x951,0x954,0x954,0x954,0x954,0x954,0x954,0x954,0x963,0x969,0x96f,
+0x96f,0x96f,0x951,0x951,0x951,0x96c,0x966,0x966,0x966,0x966,0x966,0x960,0x960,0x960,0x960,0x960,
+0x960,0x960,0x960,0x96f,0x96f,0x96f,0x96f,0x96f,0x96f,0x96f,0x96f,0x951,0x951,0x96f,0x96f,0x96f,
+0x96f,0x96f,0x96f,0x96f,0x951,0x951,0x951,0x951,0x951,0x951,0x951,0x951,0x951,0x951,0x951,0x951,
+0x951,0x951,0x951,0x951,0x951,0x951,0x951,0x951,0x951,0x951,0x96f,0x96f,0x96f,0x96f,0x951,0x951,
+0x951,0x951,0x951,0x951,0x951,0x951,0x951,0x951,0x951,0x951,0x951,0x954,0x954,0x954,0x954,0x954,
+0x95d,0x957,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,
+0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x957,0x95a,0x95a,0x95a,0x95a,
+0x95a,0x95a,0x95d,0x95d,0x95d,0x95d,0x95d,0x95d,0x95d,0x95d,0x95d,0x95d,0x95d,0x95d,0x95d,0x95d,
+0x95d,0x95d,0x95d,0x95d,0x95d,0x95d,0x95d,0x95d,0x95d,0x95d,0x95d,0x957,0x95a,0x95a,0x95a,0x95a,
+0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,
+0x95a,0x957,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95d,0x95d,0x95d,0x95d,0x95d,0x95d,0x95d,0x95d,
+0x95d,0x95d,0x95d,0x95d,0x95d,0x95d,0x95d,0x95d,0x95d,0x95d,0x95d,0x95d,0x95d,0x957,0x95a,0x95a,
+0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,
+0x95a,0x95a,0x95a,0x95a,0x95d,0x95d,0x95d,0x95d,0x95d,0x95d,0x95d,0x95d,0x95d,0x95d,0x95d,0x95d,
+0x95d,0x95d,0x95d,0x95d,0x95d,0x95d,0x95d,0x95d,0x95d,0x95d,0x95d,0x95d,0x95d,0x95d,0x95a,0x95a,
+0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,
+0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95d,0x95d,0x95d,0x95d,0x972,0x972,0x972,0x972,
+0x972,0x972,0x972,0x972,0x972,0x972,0x972,0x972,0x972,0x972,0x972,0x972,0x972,0x972,0x972,0x972,
+0x972,0x972,0x972,0x972,0x972,0x972,0x972,0x972,0x972,0x972,0x972,0x972,0x975,0x975,0x975,0x975,
+0x975,0x975,0x975,0x975,0x975,0x975,0x975,0x975,0x975,0x975,0x975,0x975,0x975,0x975,0x975,0x975,
+0x975,0x975,0x975,0x975,0x975,0x975,0x975,0x975,0x975,0x975,0x975,0x975,0x978,0x978,0x978,0x978,
+0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,
+0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x97b,0x97b,0x97b,0x97b,
+0x97b,0x97b,0x97b,0x97b,0x97b,0x97b,0x97b,0x97b,0x97b,0x97b,0x97b,0x97b,0x97b,0x97b,0x97b,0x97b,
+0x97b,0x97b,0x97b,0x97b,0x97b,0x97b,0x97b,0x97b,0x97b,0x97b,0x97b,0x97b,0x9c6,0x9c6,0x9c6,0x9c6,
+0x9c6,0x9c6,0x9c6,0x9c6,0x9c6,0x9c6,0x9c6,0x9c6,0x9c6,0x9c6,0x9c6,0x9c6,0x9c6,0x9c6,0x9c6,0x9c6,
+0x9c3,0x9c3,0x9c3,0x9c6,0x9c3,0x9c3,0x9c3,0x9c3,0x9c3,0x9c3,0x9c3,0x9c3,0x9c3,0x9c3,0x9c3,0x9c3,
+0x9c3,0x9c3,0x9c3,0xab3,0xab6,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,
+0xcae,0xcae,0xcae,0xcae,0x9ed,0x9ed,0x9ed,0x9ed,0x9ed,0x9ed,0x9ed,0x9ed,0x9ed,0x9ed,0x9ed,0x9ed,
+0x9ed,0x9ed,0x9ed,0x9ed,0x9ed,0x9ed,0x9ed,0x9ed,0x9ed,0x9ed,0x9ed,0x9ed,0x9ed,0x9ed,0x9ed,0x9ed,
+0x9ed,0x9ed,0x9ed,0x9ed,0x9f0,0x9f0,0x9f0,0xa5f,0xa05,0xa68,0xa0e,0xa5f,0xa05,0xa5f,0xa05,0xa5f,
+0xa05,0xa5f,0xa05,0xa5f,0xa05,0xa5f,0xa05,0xa5f,0xa05,0xa5f,0xa05,0xa5f,0xa05,0x9f0,0x9f0,0x9f0,
+0x9f0,0x9f0,0x9f0,0x9f0,0x9f0,0x9f0,0x9f0,0x9f0,0x9f0,0x9f0,0x9f0,0x9f0,0x9f0,0x9f0,0x9f0,0x9f0,
+0x9f0,0x9f0,0x9f0,0x9f0,0x9f0,0x9f0,0x9f0,0x9f0,0x9f0,0x9f0,0x9f0,0x9f0,0x9f0,0x9f0,0x9f0,0x9f0,
+0xa5f,0xa05,0xa5f,0xa05,0x9f0,0x9f0,0x9f0,0x9f0,0x9f0,0x9f0,0x9f0,0x9f0,0x9f0,0x9f0,0x9f0,0x9f0,
+0x9f0,0x9f0,0x9f0,0x9f0,0x9f0,0x9f0,0x9f0,0x9f0,0x9f0,0x9f0,0x9f0,0x9f0,0x9f0,0x9f0,0x9f0,0x9f0,
+0xa5f,0xa05,0x9f0,0x9f0,0x9f3,0x9f3,0x9f3,0x9f3,0x9f3,0x9f3,0x9f3,0x9f3,0x9f3,0x9f3,0x9f3,0x9f3,
+0x9f9,0x9f3,0x9f3,0x9f3,0x9f3,0x9f3,0x9f3,0x9f3,0x9f3,0x9f3,0x9f3,0x9f3,0x9f3,0x9f3,0x9f3,0x9f3,
+0x9f3,0x9f3,0x9f3,0x9f3,0x9f3,0x9f3,0x9f3,0x9f3,0x9f3,0x9f3,0x9f3,0x9f3,0x9f3,0x9f3,0x9f3,0x9f3,
+0x9f3,0x9f3,0x9f3,0x9f3,0x9f9,0x9f9,0x9f9,0x9f3,0x9f3,0x9f3,0x9f3,0x9f3,0x9f3,0x9f3,0x9f3,0x9f3,
+0x9f3,0x9f3,0x9f3,0x9f3,0x9f3,0x9f3,0x9f3,0x9f3,0x9f3,0x9f3,0x9f3,0x9f3,0x9f3,0x9f3,0x9f3,0x9f3,
+0x9f3,0x9f3,0x9f3,0x9f3,0x9f6,0x9f3,0x9f3,0x9f3,0xa44,0xa44,0xa44,0xa44,0xa44,0xa44,0xa44,0xa44,
+0xa44,0xa44,0xa44,0xa44,0xa44,0xa44,0xa44,0xa44,0xa44,0xa44,0xa44,0xa44,0xa44,0xa44,0xa44,0xa44,
+0xa44,0xa44,0xa44,0xa44,0xa44,0xa44,0xa44,0xa44,0xace,0xace,0xace,0xace,0xace,0xace,0xace,0xace,
+0xace,0xace,0xace,0xace,0xace,0xace,0xace,0xace,0xace,0xace,0xace,0xace,0xace,0xace,0xace,0xace,
+0xace,0xace,0xace,0xace,0xace,0xace,0xace,0xace,0xadd,0xadd,0xadd,0xadd,0xadd,0xadd,0xad4,0xad4,
+0xad4,0xad4,0xad4,0xad1,0xae6,0xae6,0xae6,0xae0,0xae6,0xae6,0xae6,0xae6,0xae6,0xae6,0xae6,0xae6,
+0xae6,0xae6,0xae6,0xae0,0xae6,0xae6,0xae6,0xae6,0xada,0xada,0xae3,0xae3,0xae3,0xae3,0xad7,0xad7,
+0xad7,0xad7,0xad7,0xadd,0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,
+0xba0,0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0xae6,0xae6,0xae6,0xae6,0xae6,0xae6,0xae6,0xae6,
+0xae6,0xae6,0xae6,0xae6,0xae6,0xae6,0xae0,0xae6,0xae6,0xae6,0xae6,0xae6,0xae6,0xae6,0xae6,0xae6,
+0xae6,0xae6,0xae6,0xae6,0xae6,0xada,0xada,0xada,0xadd,0xadd,0xadd,0xadd,0xadd,0xadd,0xadd,0xadd,
+0xadd,0xadd,0xadd,0xadd,0xadd,0xadd,0xadd,0xadd,0xadd,0xadd,0xadd,0xadd,0xadd,0xadd,0xadd,0xadd,
+0xadd,0xadd,0xadd,0xadd,0xadd,0xadd,0xadd,0xadd,0xaec,0xaec,0xaec,0xaec,0xaec,0xaec,0xaec,0xaec,
+0xaec,0xaec,0xaec,0xaec,0xaec,0xaec,0xaec,0xaec,0xaec,0xaec,0xaec,0xaec,0xaec,0xaec,0xaec,0xaec,
+0xaec,0xaec,0xaec,0xaec,0xaec,0xaec,0xaec,0xaec,0xaf2,0xaf2,0xaf2,0xaf2,0xaf2,0xaf2,0xaf2,0xaf2,
+0xaf2,0xaf2,0xaf2,0xaf2,0xaf2,0xaf2,0xaf2,0xaf2,0xaf2,0xaf2,0xaf2,0xaf2,0xaf2,0xaf2,0xaf2,0xaf2,
+0xaf2,0xaf2,0xaf2,0xaf2,0xaf2,0xaf2,0xaf2,0xaf2,0xafb,0xafb,0xafb,0xafb,0xafb,0xafb,0xafb,0xafb,
+0xafb,0xafb,0xafb,0xafb,0xafb,0xafb,0xafb,0xafb,0xafb,0xafb,0xafb,0xafb,0xafb,0xafb,0xafb,0xafb,
+0xafb,0xafb,0xafb,0xafb,0xafb,0xafb,0xafb,0xafb,0xb04,0xb04,0xb04,0xb04,0xb04,0xb04,0xb04,0xb04,
+#else /* U_DARWIN */
+0x94e,0x94e,0x94e,0x94e,0x94e,0x94e,0x94e,0x94e,0x94e,0x94e,0x94e,0x94e,0x94e,0x94e,0x94e,0x94e,
+0x966,0x966,0x966,0x969,0x966,0x966,0x966,0x966,0x966,0x966,0x966,0x966,0x966,0x966,0x966,0x966,
+0x966,0x966,0x966,0x966,0x954,0x954,0x963,0x957,0x957,0x957,0x957,0x957,0x957,0x957,0x963,0x963,
+0x966,0x966,0x966,0x966,0x966,0x966,0x966,0x966,0x966,0x966,0x966,0x966,0x966,0x966,0x966,0x966,
+0x966,0x966,0x966,0x966,0x966,0x966,0x966,0x966,0x966,0x966,0x966,0x966,0x966,0x966,0x966,0x966,
+0x981,0x981,0x981,0x981,0x981,0x981,0xaf8,0xaf8,0x97e,0x97e,0x97e,0x97e,0x97e,0x97e,0x97e,0x97e,
+0x97e,0x97e,0x97e,0x97e,0x97e,0x97e,0x97e,0x97e,0x97e,0x97e,0x97e,0x97e,0x97e,0x97e,0x97e,0x97e,
+0x97e,0x97e,0xaf5,0xaf5,0xb31,0xb31,0xb31,0xb31,0xb31,0xb31,0xb31,0xb31,0xb31,0xb31,0xb31,0xb31,
+0xb31,0xb31,0xb31,0xb31,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981,
+0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981,
+0x981,0x981,0x981,0x981,0x984,0x984,0x984,0x984,0x984,0x984,0x984,0x984,0x984,0x984,0x984,0x984,
+0x984,0x984,0x984,0x984,0x984,0x984,0x984,0x984,0x984,0x984,0x984,0x984,0x984,0x984,0x984,0x984,
+0x984,0x984,0x984,0x984,0x987,0x987,0x987,0x987,0x987,0x987,0x987,0x987,0x987,0x987,0x987,0x987,
+0x987,0x987,0x987,0x987,0x987,0x987,0x987,0x987,0x987,0x987,0x987,0x987,0x987,0x987,0x987,0x987,
+0x987,0x987,0x987,0x987,0x987,0x987,0x98a,0x98a,0x98a,0x98a,0x98a,0x98a,0x98a,0x999,0x99f,0x9a5,
+0x9a5,0x9a5,0x987,0x987,0x987,0x9a2,0x99c,0x99c,0x99c,0x99c,0x99c,0x996,0x996,0x996,0x996,0x996,
+0x996,0x996,0x996,0x9a5,0x9a5,0x9a5,0x9a5,0x9a5,0x9a5,0x9a5,0x9a5,0x987,0x987,0x9a5,0x9a5,0x9a5,
+0x9a5,0x9a5,0x9a5,0x9a5,0x987,0x987,0x987,0x987,0x987,0x987,0x987,0x987,0x987,0x987,0x987,0x987,
+0x987,0x987,0x987,0x987,0x987,0x987,0x987,0x987,0x987,0x987,0x9a5,0x9a5,0x9a5,0x9a5,0x987,0x987,
+0x987,0x987,0x987,0x987,0x987,0x987,0x987,0x987,0x987,0x987,0x987,0x98a,0x98a,0x98a,0x98a,0x98a,
+0x993,0x98d,0x990,0x990,0x990,0x990,0x990,0x990,0x990,0x990,0x990,0x990,0x990,0x990,0x990,0x990,
+0x990,0x990,0x990,0x990,0x990,0x990,0x990,0x990,0x990,0x990,0x990,0x98d,0x990,0x990,0x990,0x990,
+0x990,0x990,0x993,0x993,0x993,0x993,0x993,0x993,0x993,0x993,0x993,0x993,0x993,0x993,0x993,0x993,
+0x993,0x993,0x993,0x993,0x993,0x993,0x993,0x993,0x993,0x993,0x993,0x98d,0x990,0x990,0x990,0x990,
+0x990,0x990,0x990,0x990,0x990,0x990,0x990,0x990,0x990,0x990,0x990,0x990,0x990,0x990,0x990,0x990,
+0x990,0x98d,0x990,0x990,0x990,0x990,0x990,0x990,0x993,0x993,0x993,0x993,0x993,0x993,0x993,0x993,
+0x993,0x993,0x993,0x993,0x993,0x993,0x993,0x993,0x993,0x993,0x993,0x993,0x993,0x98d,0x990,0x990,
+0x990,0x990,0x990,0x990,0x990,0x990,0x990,0x990,0x990,0x990,0x990,0x990,0x990,0x990,0x990,0x990,
+0x990,0x990,0x990,0x990,0x993,0x993,0x993,0x993,0x993,0x993,0x993,0x993,0x993,0x993,0x993,0x993,
+0x993,0x993,0x993,0x993,0x993,0x993,0x993,0x993,0x993,0x993,0x993,0x993,0x993,0x993,0x990,0x990,
+0x990,0x990,0x990,0x990,0x990,0x990,0x990,0x990,0x990,0x990,0x990,0x990,0x990,0x990,0x990,0x990,
+0x990,0x990,0x990,0x990,0x990,0x990,0x990,0x990,0x993,0x993,0x993,0x993,0x9a8,0x9a8,0x9a8,0x9a8,
+0x9a8,0x9a8,0x9a8,0x9a8,0x9a8,0x9a8,0x9a8,0x9a8,0x9a8,0x9a8,0x9a8,0x9a8,0x9a8,0x9a8,0x9a8,0x9a8,
+0x9a8,0x9a8,0x9a8,0x9a8,0x9a8,0x9a8,0x9a8,0x9a8,0x9a8,0x9a8,0x9a8,0x9a8,0x9ab,0x9ab,0x9ab,0x9ab,
+0x9ab,0x9ab,0x9ab,0x9ab,0x9ab,0x9ab,0x9ab,0x9ab,0x9ab,0x9ab,0x9ab,0x9ab,0x9ab,0x9ab,0x9ab,0x9ab,
+0x9ab,0x9ab,0x9ab,0x9ab,0x9ab,0x9ab,0x9ab,0x9ab,0x9ab,0x9ab,0x9ab,0x9ab,0x9ae,0x9ae,0x9ae,0x9ae,
+0x9ae,0x9ae,0x9ae,0x9ae,0x9ae,0x9ae,0x9ae,0x9ae,0x9ae,0x9ae,0x9ae,0x9ae,0x9ae,0x9ae,0x9ae,0x9ae,
+0x9ae,0x9ae,0x9ae,0x9ae,0x9ae,0x9ae,0x9ae,0x9ae,0x9ae,0x9ae,0x9ae,0x9ae,0x9b1,0x9b1,0x9b1,0x9b1,
+0x9b1,0x9b1,0x9b1,0x9b1,0x9b1,0x9b1,0x9b1,0x9b1,0x9b1,0x9b1,0x9b1,0x9b1,0x9b1,0x9b1,0x9b1,0x9b1,
+0x9b1,0x9b1,0x9b1,0x9b1,0x9b1,0x9b1,0x9b1,0x9b1,0x9b1,0x9b1,0x9b1,0x9b1,0x9fc,0x9fc,0x9fc,0x9fc,
+0x9fc,0x9fc,0x9fc,0x9fc,0x9fc,0x9fc,0x9fc,0x9fc,0x9fc,0x9fc,0x9fc,0x9fc,0x9fc,0x9fc,0x9fc,0x9fc,
+0x9f9,0x9f9,0x9f9,0x9fc,0x9f9,0x9f9,0x9f9,0x9f9,0x9f9,0x9f9,0x9f9,0x9f9,0x9f9,0x9f9,0x9f9,0x9f9,
+0x9f9,0x9f9,0x9f9,0xae9,0xaec,0xbca,0xbca,0xbca,0xbca,0xbca,0xbca,0xbca,0xbca,0xbca,0xbca,0xbca,
+0xce4,0xce4,0xce4,0xce4,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,
+0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,
+0xa23,0xa23,0xa23,0xa23,0xa26,0xa26,0xa26,0xa95,0xa3b,0xa9e,0xa44,0xa95,0xa3b,0xa95,0xa3b,0xa95,
+0xa3b,0xa95,0xa3b,0xa95,0xa3b,0xa95,0xa3b,0xa95,0xa3b,0xa95,0xa3b,0xa95,0xa3b,0xa26,0xa26,0xa26,
+0xa26,0xa26,0xa26,0xa26,0xa26,0xa26,0xa26,0xa26,0xa26,0xa26,0xa26,0xa26,0xa26,0xa26,0xa26,0xa26,
+0xa26,0xa26,0xa26,0xa26,0xa26,0xa26,0xa26,0xa26,0xa26,0xa26,0xa26,0xa26,0xa26,0xa26,0xa26,0xa26,
+0xa95,0xa3b,0xa95,0xa3b,0xa26,0xa26,0xa26,0xa26,0xa26,0xa26,0xa26,0xa26,0xa26,0xa26,0xa26,0xa26,
+0xa26,0xa26,0xa26,0xa26,0xa26,0xa26,0xa26,0xa26,0xa26,0xa26,0xa26,0xa26,0xa26,0xa26,0xa26,0xa26,
+0xa95,0xa3b,0xa26,0xa26,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,
+0xa2f,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,
+0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,
+0xa29,0xa29,0xa29,0xa29,0xa2f,0xa2f,0xa2f,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,
+0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,
+0xa29,0xa29,0xa29,0xa29,0xa2c,0xa29,0xa29,0xa29,0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,
+0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,
+0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0xb04,0xb04,0xb04,0xb04,0xb04,0xb04,0xb04,0xb04,
+#endif /* U_DARWIN */
+0xb04,0xb04,0xb04,0xb04,0xb04,0xb04,0xb04,0xb04,0xb04,0xb04,0xb04,0xb04,0xb04,0xb04,0xb04,0xb04,
+#ifndef U_DARWIN
+0xb04,0xb04,0xb04,0xb04,0xb04,0xb04,0xb04,0xb04,0xb34,0xb34,0xb34,0xb34,0xb34,0xb34,0xb34,0xb34,
+0xb34,0xb34,0xb34,0xb34,0xb34,0xb34,0xb34,0xb34,0xb34,0xb34,0xb34,0xb34,0xb34,0xb34,0xb34,0xb34,
+0xb34,0xb34,0xb34,0xb34,0xb34,0xb34,0xb34,0xb34,0xba9,0xba9,0xba9,0xba9,0xba9,0xba9,0xba9,0xba9,
+0xba9,0xba9,0xba9,0xba9,0xba9,0xba9,0xba9,0xba9,0xba9,0xba9,0xba9,0xba9,0xba9,0xba9,0xba9,0xba9,
+0xba9,0xba9,0xba9,0xba9,0xba9,0xba9,0xba9,0xba9,0xbaf,0xbaf,0xbaf,0xbaf,0xbaf,0xbaf,0xbaf,0xbaf,
+0xbaf,0xbaf,0xbaf,0xbaf,0xbaf,0xbaf,0xbaf,0xbaf,0xbaf,0xbaf,0xbaf,0xbaf,0xbaf,0xbac,0xbac,0xbac,
+0xbac,0xbac,0xbac,0xbac,0xbac,0xbac,0xbac,0xbac,0xbaf,0xbaf,0xbaf,0xbaf,0xbaf,0xbaf,0xbaf,0xbaf,
+0xbaf,0xbaf,0xbaf,0xbaf,0xbaf,0xbaf,0xbaf,0xbaf,0xbaf,0xbaf,0xbaf,0xbaf,0xbaf,0xbaf,0xbaf,0xbaf,
+0xbaf,0xbaf,0xbaf,0xbaf,0xbaf,0xbaf,0xbaf,0xbaf,0xbc1,0xbbe,0xbc1,0xbbe,0xbc1,0xbbe,0xbc1,0xbbe,
+0xbc1,0xbbe,0xbc1,0xbbe,0xbc1,0xbbe,0xbc1,0xbbe,0xbc1,0xbbe,0xbc1,0xbbe,0xbc1,0xbbe,0xbc1,0xbbe,
+0xbc1,0xbbe,0xbc1,0xbbe,0xbc1,0xbbe,0xbc1,0xbbe,0xbcd,0xbcd,0xbcd,0xbcd,0xbcd,0xbcd,0xbcd,0xbcd,
+0xbcd,0xbcd,0xbcd,0xbcd,0xbcd,0xbcd,0xbcd,0xbcd,0xbcd,0xbcd,0xbcd,0xbcd,0xbcd,0xbcd,0xbcd,0xbcd,
+0xbcd,0xbcd,0xbcd,0xbcd,0xbcd,0xbcd,0xbcd,0xbcd,0xbd3,0xbd3,0xbd3,0xbd3,0xbd3,0xbd3,0xbd3,0xbd3,
+0xbd3,0xbd3,0xbd3,0xbd3,0xbd3,0xbd3,0xbd3,0xbd3,0xbd3,0xbd3,0xbd3,0xbd3,0xbd3,0xbd3,0xbd3,0xbd3,
+0xbd3,0xbd3,0xbd3,0xbd3,0xbd3,0xbd3,0xbd3,0xbd3,0xbdf,0xbdf,0xbdf,0xbdf,0xbdf,0xbdf,0xbdf,0xbdf,
+#else /* U_DARWIN */
+0xb04,0xb04,0xb04,0xb04,0xb04,0xb04,0xb04,0xb04,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb0a,0xb0a,
+0xb0a,0xb0a,0xb0a,0xb07,0xb1c,0xb1c,0xb1c,0xb16,0xb1c,0xb1c,0xb1c,0xb1c,0xb1c,0xb1c,0xb1c,0xb1c,
+0xb1c,0xb1c,0xb1c,0xb16,0xb1c,0xb1c,0xb1c,0xb1c,0xb10,0xb10,0xb19,0xb19,0xb19,0xb19,0xb0d,0xb0d,
+0xb0d,0xb0d,0xb0d,0xb13,0xbd9,0xbd9,0xbd9,0xbd9,0xbd9,0xbd9,0xbd9,0xbd9,0xbd9,0xbd9,0xbd9,0xbd9,
+0xbd6,0xbd9,0xbd9,0xbd9,0xbd9,0xbd9,0xbd9,0xbd9,0xb1c,0xb1c,0xb1c,0xb1c,0xb1c,0xb1c,0xb1c,0xb1c,
+0xb1c,0xb1c,0xb1c,0xb1c,0xb1c,0xb1c,0xb16,0xb1c,0xb1c,0xb1c,0xb1c,0xb1c,0xb1c,0xb1c,0xb1c,0xb1c,
+0xb1c,0xb1c,0xb1c,0xb1c,0xb1c,0xb10,0xb10,0xb10,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,
+0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,
+0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,
+0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,
+0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,
+0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,
+0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb31,0xb31,0xb31,0xb31,0xb31,0xb31,0xb31,0xb31,
+0xb31,0xb31,0xb31,0xb31,0xb31,0xb31,0xb31,0xb31,0xb31,0xb31,0xb31,0xb31,0xb31,0xb31,0xb31,0xb31,
+0xb31,0xb31,0xb31,0xb31,0xb31,0xb31,0xb31,0xb31,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,
+0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,
+0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb6a,0xb6a,0xb6a,0xb6a,0xb6a,0xb6a,0xb6a,0xb6a,
+0xb6a,0xb6a,0xb6a,0xb6a,0xb6a,0xb6a,0xb6a,0xb6a,0xb6a,0xb6a,0xb6a,0xb6a,0xb6a,0xb6a,0xb6a,0xb6a,
+0xb6a,0xb6a,0xb6a,0xb6a,0xb6a,0xb6a,0xb6a,0xb6a,0xbdf,0xbdf,0xbdf,0xbdf,0xbdf,0xbdf,0xbdf,0xbdf,
+#endif /* U_DARWIN */
+0xbdf,0xbdf,0xbdf,0xbdf,0xbdf,0xbdf,0xbdf,0xbdf,0xbdf,0xbdf,0xbdf,0xbdf,0xbdf,0xbdf,0xbdf,0xbdf,
+#ifndef U_DARWIN
+0xbdf,0xbdf,0xbdf,0xbdf,0xbdf,0xbdf,0xbdf,0xbdf,0xbe8,0xbe8,0xbe8,0xbe8,0xbe8,0xbe8,0xbe8,0xbe8,
+0xbe8,0xbe8,0xbe8,0xbe8,0xbe8,0xbe8,0xbe8,0xbe8,0xbe8,0xbe8,0xbe8,0xbe8,0xbe8,0xbe8,0xbe8,0xbe8,
+0xbe8,0xbe8,0xbe8,0xbe8,0xbe8,0xbe8,0xbe8,0xbe2,0xbe5,0xbe5,0xbe5,0xbe5,0xbe5,0xbe5,0xbe5,0xbe5,
+#else /* U_DARWIN */
+0xbdf,0xbdf,0xbdf,0xbdf,0xbdf,0xbdf,0xbdf,0xbdf,0xbe5,0xbe5,0xbe5,0xbe5,0xbe5,0xbe5,0xbe5,0xbe5,
+0xbe5,0xbe5,0xbe5,0xbe5,0xbe5,0xbe5,0xbe5,0xbe5,0xbe5,0xbe5,0xbe5,0xbe5,0xbe5,0xbe2,0xbe2,0xbe2,
+0xbe2,0xbe2,0xbe2,0xbe2,0xbe2,0xbe2,0xbe2,0xbe2,0xbe5,0xbe5,0xbe5,0xbe5,0xbe5,0xbe5,0xbe5,0xbe5,
+#endif /* U_DARWIN */
+0xbe5,0xbe5,0xbe5,0xbe5,0xbe5,0xbe5,0xbe5,0xbe5,0xbe5,0xbe5,0xbe5,0xbe5,0xbe5,0xbe5,0xbe5,0xbe5,
+#ifndef U_DARWIN
+0xbe5,0xbe5,0xbe5,0xbe8,0xbe8,0xbe8,0xbe8,0xbe8,0xbf1,0xbf1,0xc48,0xbf1,0xbf1,0xbf1,0xc45,0xbf1,
+0xbf1,0xbf1,0xbf1,0xc3f,0xbf1,0xbf1,0xbf1,0xbf1,0xbf1,0xbf1,0xbf1,0xbf1,0xbf1,0xbf1,0xbf1,0xbf1,
+0xbf1,0xbf1,0xbf1,0xbf1,0xbf1,0xbf1,0xbf1,0xbf1,0xbf4,0xbf4,0xbf4,0xbf4,0xbf4,0xbf4,0xbf4,0xbf4,
+0xbf4,0xbf4,0xbf4,0xbf4,0xbf4,0xbf4,0xbf4,0xbf4,0xbf4,0xbf4,0xbf4,0xbf4,0xbf4,0xbf4,0xbf4,0xbf4,
+0xbf4,0xbf4,0xbf4,0xbf4,0xbf4,0xbf4,0xbf4,0xbf4,0xc63,0xc63,0xc63,0xc63,0xc63,0xc63,0xc63,0xc63,
+0xc63,0xc63,0xc63,0xc63,0xc63,0xc63,0xc63,0xc63,0xc63,0xc63,0xc63,0xc63,0xc63,0xc63,0xc63,0xc63,
+0xc63,0xc63,0xc63,0xc63,0xc63,0xc63,0xc63,0xc63,0xc8a,0xc8a,0xc8a,0xc8a,0xc8a,0xc8a,0xc8a,0xc8a,
+0xc8a,0xc8a,0xc8a,0xc8a,0xc8a,0xc8a,0xc8a,0xc8a,0xc8a,0xc8a,0xc8a,0xc8a,0xc8a,0xc8a,0xc8a,0xc8a,
+0xc8a,0xc8a,0xc8a,0xc8a,0xc8a,0xc8a,0xc8a,0xc8a,0xd32,0xd32,0xd32,0xd32,0xd32,0xd32,0xd32,0xd32,
+0xd32,0xd32,0xccc,0xccc,0xccc,0xccc,0xccc,0xccc,0xccc,0xccc,0xccc,0xccc,0xccc,0xccc,0xccc,0xccc,
+0xccc,0xccc,0xccc,0xccc,0xccc,0xccc,0xccc,0xccc,0xd1a,0xd1a,0xd1a,0xd1a,0xd20,0xcd8,0xcdb,0xcd8,
+0xcdb,0xcd8,0xcdb,0xcd8,0xcdb,0xcd8,0xcdb,0xcd8,0xcd8,0xcd8,0xcdb,0xcd8,0xcd8,0xcd8,0xcd8,0xcd8,
+0xcd8,0xcd8,0xcd8,0xcd8,0xcd8,0xcd8,0xcd8,0xcd8,0xcd8,0xcd8,0xcd8,0xcd8,0xcd8,0xcd8,0xcd8,0xcd8,
+0xd1d,0xd20,0xd1a,0xd1a,0xd1a,0xd1a,0xd1a,0xd23,0xd1a,0xd23,0xd20,0xd20,0xce7,0xce7,0xce7,0xce7,
+0xce7,0xce7,0xce7,0xce7,0xce7,0xce7,0xce7,0xce7,0xce7,0xce7,0xce7,0xce7,0xce7,0xce7,0xce7,0xce7,
+0xce7,0xce7,0xce7,0xce7,0xce7,0xce7,0xce7,0xce7,0xce7,0xce7,0xce7,0xce7,0xcf0,0xcf0,0xcf0,0xcf0,
+0xcf0,0xcf0,0xcf0,0xcf0,0xcf0,0xcf0,0xcf0,0xcf0,0xcf0,0xcf0,0xcf0,0xcf0,0xcf0,0xcf0,0xcf0,0xcf0,
+0xcf0,0xcf0,0xcf0,0xcf0,0xcf0,0xcf0,0xcf0,0xcf0,0xcf0,0xcf0,0xcf0,0xcf0,0xcf3,0xcf3,0xcf3,0xcf3,
+0xcf3,0xcf3,0xcf3,0xcf3,0xcf3,0xcf3,0xcf3,0xcf3,0xcf3,0xcf3,0xcf3,0xcf3,0xcf3,0xcf3,0xcf3,0xcf3,
+0xcf3,0xcf3,0xcf3,0xcf3,0xcf3,0xcf3,0xcf3,0xcf3,0xcf3,0xcf3,0xcf3,0xcf3,0x820,0x840,0x860,0,
+#else /* U_DARWIN */
+0xbe5,0xbe5,0xbe5,0xbe5,0xbe5,0xbe5,0xbe5,0xbe5,0xbf7,0xbf4,0xbf7,0xbf4,0xbf7,0xbf4,0xbf7,0xbf4,
+0xbf7,0xbf4,0xbf7,0xbf4,0xbf7,0xbf4,0xbf7,0xbf4,0xbf7,0xbf4,0xbf7,0xbf4,0xbf7,0xbf4,0xbf7,0xbf4,
+0xbf7,0xbf4,0xbf7,0xbf4,0xbf7,0xbf4,0xbf7,0xbf4,0xc03,0xc03,0xc03,0xc03,0xc03,0xc03,0xc03,0xc03,
+0xc03,0xc03,0xc03,0xc03,0xc03,0xc03,0xc03,0xc03,0xc03,0xc03,0xc03,0xc03,0xc03,0xc03,0xc03,0xc03,
+0xc03,0xc03,0xc03,0xc03,0xc03,0xc03,0xc03,0xc03,0xc09,0xc09,0xc09,0xc09,0xc09,0xc09,0xc09,0xc09,
+0xc09,0xc09,0xc09,0xc09,0xc09,0xc09,0xc09,0xc09,0xc09,0xc09,0xc09,0xc09,0xc09,0xc09,0xc09,0xc09,
+0xc09,0xc09,0xc09,0xc09,0xc09,0xc09,0xc09,0xc09,0xc15,0xc15,0xc15,0xc15,0xc15,0xc15,0xc15,0xc15,
+0xc15,0xc15,0xc15,0xc15,0xc15,0xc15,0xc15,0xc15,0xc15,0xc15,0xc15,0xc15,0xc15,0xc15,0xc15,0xc15,
+0xc15,0xc15,0xc15,0xc15,0xc15,0xc15,0xc15,0xc15,0xc1e,0xc1e,0xc1e,0xc1e,0xc1e,0xc1e,0xc1e,0xc1e,
+0xc1e,0xc1e,0xc1e,0xc1e,0xc1e,0xc1e,0xc1e,0xc1e,0xc1e,0xc1e,0xc1e,0xc1e,0xc1e,0xc1e,0xc1e,0xc1e,
+0xc1e,0xc1e,0xc1e,0xc1e,0xc1e,0xc1e,0xc1e,0xc18,0xc1b,0xc1b,0xc1b,0xc1b,0xc1b,0xc1b,0xc1b,0xc1b,
+0xc1b,0xc1b,0xc1b,0xc1b,0xc1b,0xc1b,0xc1b,0xc1b,0xc1b,0xc1b,0xc1b,0xc1b,0xc1b,0xc1b,0xc1b,0xc1b,
+0xc1b,0xc1b,0xc1b,0xc1e,0xc1e,0xc1e,0xc1e,0xc1e,0xc27,0xc27,0xc7e,0xc27,0xc27,0xc27,0xc7b,0xc27,
+0xc27,0xc27,0xc27,0xc75,0xc27,0xc27,0xc27,0xc27,0xc27,0xc27,0xc27,0xc27,0xc27,0xc27,0xc27,0xc27,
+0xc27,0xc27,0xc27,0xc27,0xc27,0xc27,0xc27,0xc27,0xc2a,0xc2a,0xc2a,0xc2a,0xc2a,0xc2a,0xc2a,0xc2a,
+0xc2a,0xc2a,0xc2a,0xc2a,0xc2a,0xc2a,0xc2a,0xc2a,0xc2a,0xc2a,0xc2a,0xc2a,0xc2a,0xc2a,0xc2a,0xc2a,
+0xc2a,0xc2a,0xc2a,0xc2a,0xc2a,0xc2a,0xc2a,0xc2a,0xc99,0xc99,0xc99,0xc99,0xc99,0xc99,0xc99,0xc99,
+0xc99,0xc99,0xc99,0xc99,0xc99,0xc99,0xc99,0xc99,0xc99,0xc99,0xc99,0xc99,0xc99,0xc99,0xc99,0xc99,
+0xc99,0xc99,0xc99,0xc99,0xc99,0xc99,0xc99,0xc99,0xcc0,0xcc0,0xcc0,0xcc0,0xcc0,0xcc0,0xcc0,0xcc0,
+0xcc0,0xcc0,0xcc0,0xcc0,0xcc0,0xcc0,0xcc0,0xcc0,0xcc0,0xcc0,0xcc0,0xcc0,0xcc0,0xcc0,0xcc0,0xcc0,
+0xcc0,0xcc0,0xcc0,0xcc0,0xcc0,0xcc0,0xcc0,0xcc0,0xd68,0xd68,0xd68,0xd68,0xd68,0xd68,0xd68,0xd68,
+0xd68,0xd68,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,
+0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd50,0xd50,0xd50,0xd50,0xd56,0xd0e,0xd11,0xd0e,
+0xd11,0xd0e,0xd11,0xd0e,0xd11,0xd0e,0xd11,0xd0e,0xd0e,0xd0e,0xd11,0xd0e,0xd0e,0xd0e,0xd0e,0xd0e,
+0xd0e,0xd0e,0xd0e,0xd0e,0xd0e,0xd0e,0xd0e,0xd0e,0xd0e,0xd0e,0xd0e,0xd0e,0xd0e,0xd0e,0xd0e,0xd0e,
+0xd53,0xd56,0xd50,0xd50,0xd50,0xd50,0xd50,0xd59,0xd50,0xd59,0xd56,0xd56,0xd1d,0xd1d,0xd1d,0xd1d,
+0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,
+0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd26,0xd26,0xd26,0xd26,
+0xd26,0xd26,0xd26,0xd26,0xd26,0xd26,0xd26,0xd26,0xd26,0xd26,0xd26,0xd26,0xd26,0xd26,0xd26,0xd26,
+0xd26,0xd26,0xd26,0xd26,0xd26,0xd26,0xd26,0xd26,0xd26,0xd26,0xd26,0xd26,0xd29,0xd29,0xd29,0xd29,
+0xd29,0xd29,0xd29,0xd29,0xd29,0xd29,0xd29,0xd29,0xd29,0xd29,0xd29,0xd29,0xd29,0xd29,0xd29,0xd29,
+0xd29,0xd29,0xd29,0xd29,0xd29,0xd29,0xd29,0xd29,0xd29,0xd29,0xd29,0xd29,0x820,0x840,0x860,0,
+#endif /* U_DARWIN */
+0,0,0,0,0x880,0x8a0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0x8c0,0x8e0,0,0,
+0,0,0,0,0,0,0,0x900,0x920,0x920,0x920,0x920,0x920,0x920,0x920,0x920,
+0x920,0x920,0x920,0x920,0x920,0x920,0x920,0x920,0x920,0x920,0x920,0x920,0x920,0x920,0x920,0x920,
+0x920,0x920,0x920,0x920,0x920,0x920,0x920,0x920,0x920,0x940,0x960,0x960,0x960,0x960,0x960,0x960,
+0x960,0x960,0x960,0x960,0x960,0x960,0x960,0x960,0x960,0x960,0x960,0x960,0x960,0x960,0x980,0x9a0,
+0x960,0x960,0x960,0x960,0x960,0x960,0x960,0x960,0x960,0x960,0x960,0x960,0x960,0x960,0x960,0x960,
+0x960,0x960,0x960,0x960,0x960,0x960,0x960,0x960,0x960,0x960,0x960,0x960,0x960,0x960,0x960,0x960,
+0x960,0x960,0x960,0x9a0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0x900,0x9c0,0x9e0,0x9e0,0x9e0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0xa00,0xa00,0xa00,0xa00,0xa00,0xa00,0xa00,0xa00,0xa00,0xa00,0xa00,0xa00,
+0xa00,0xa00,0xa00,0xa00,0xa00,0xa00,0xa00,0xa00,0xa00,0xa00,0xa00,0xa00,0xa00,0xa00,0xa00,0xa00,
+0xa00,0xa00,0xa00,0xa00,0xa00,0xa00,0xa00,0xa20,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,
+0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,
+0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa60
+};
+
+static const UTrie propsVectorsTrie={
+ propsVectorsTrie_index,
+ NULL,
+ utrie_defaultGetFoldingOffset,
+ 2688,
+#ifndef U_DARWIN
+ 14236,
+#else /* U_DARWIN */
+ 14444,
+#endif /* U_DARWIN */
+ 0,
+ TRUE
+};
+
+#ifndef U_DARWIN
+static const uint32_t propsVectors[3384]={
+#else /* U_DARWIN */
+static const uint32_t propsVectors[3438]={
+#endif /* U_DARWIN */
+0x67,0,0,0x67,0x800000,0,0x467,0,0,0x4e7,0,0,0x567,0,0,0x5e7,
+0,0,0x667,0,0,0x6e7,0,0,0x767,0,0,0x7e7,0,0,0x867,0,
+0,0x8e7,0,0,0x967,0,0,0x9e7,0,0,0xa67,0,0,0xae7,0,0,
+0xb67,0,0,0xbe7,0,0,0xc67,0,0,0xce7,0,0,0xd67,0,0,0xde7,
+0,0,0xe67,0,0,0xee7,0,0,0xf67,0,0,0xfe7,0,0,0x1067,0,
+0,0x10e7,0,0,0x1167,0,0,0x11e7,0,0,0x1267,0,0,0x12e7,0,0,
+0x1367,0,0,0x13e7,0,0,0x1467,0x800000,0,0x14e7,0,0,0x1567,0,0,0x15e7,
+0,0,0x1667,0,0,0x16e7,0,0,0x1867,0,0x4000000,0x18e7,0,0x4000000,0x1967,0,
+0x4000000,0x1be7,0,0x4000000,0x1c67,0,0x4000000,0x1d67,0,0,0x1de7,0,0,0x1e67,0,0,
+0x1f67,0,0,0x2067,0,0,0x20e7,0,0,0x21e7,0,0,0x2267,0,0,0x2367,
+0,0,0x23e7,0,0,0x2467,0,0,0x24e7,0,0,0x2567,0,0,0x27e7,0,
+0,0x2867,0,0,0x28e7,0,0,0x2967,0,0,0x2a67,0,0,0x2ae7,0,0,
+0x2b67,0x800000,0,0x2be7,0,0,0x2c67,0,0,0x2ce7,0,0,0x2de7,0,0,0x2e67,
+0,0,0x2ee7,0,0,0x3067,0x800000,0,0x30e7,0,0,0x3167,0,0,0x31e7,0,
+0,0x3267,0,0,0x32e7,0,0,0x3367,0,0x4000000,0x37e7,0,0,0x3867,0,0,
+0x39e7,0,0x4000000,0x3ae7,0,0,0x3b67,0,0,0x3be7,0,0,0x3c67,0,0,0x3d67,
+0,0,0x3de7,0,0,0x3e67,0,0,0x3f67,0,0,0x3fe7,0,0,0x4067,0,
+0,0x40e7,0,0,0x4167,0,0,0x41e7,0,0,0x4267,0,0,0x42e7,0,0,
+0x4367,0,0,0x43e7,0,0,0x4467,0,0,0x44e7,0,0,0x4567,0,0,0x45e7,
+0,0,0x4667,0,0,0x4767,0,0x4000000,0x47e7,0,0,0x4867,0,0,0x48e7,0,
+0,0x4967,0,0,0x49e7,0,0,0x4a67,0,0,0x4ae7,0,0,0x4b67,0,0,
+0x4be7,0,0,0x4c67,0,0,0x4ce7,0,0,0x4d67,0,0,0x28067,0,0,0x2af67,
+0,0,0x2afe7,0,0,0x11002b67,0x810000,0,0x1100a767,0,0,0x11041680,0x80000000,6,0x11041980,0x80000000,
+3,0x11041a00,0x80000000,0x4000000,0x11041c00,0x80000000,0,0x11048100,0x80000000,6,0x11048100,0x80000000,0xf,0x11048100,0x80000000,0x4000000,
+0x11048100,0x80000080,0x4000000,0x11048100,0x80001000,2,0x11048100,0x90003000,0x1000,0x11048119,0xf8000400,0x1040f,0x11048300,0x80001000,2,0x11048300,
+0xf8001400,0x18400,0x11048300,0xf8003400,0x18400,0x11049400,0x80000000,0x4000000,0x11049400,0x80000008,0x4000000,0x11049400,0x80000080,0x4000000,0x11049480,0x80000000,
+0xe,0x11049480,0x80000000,0xf,0x11049499,0xf8000400,0x1040f,0x11049600,0x80000000,2,0x11049600,0x80000000,0xf,0x11049600,0xf8000480,0x10405,
+0x11049619,0xf8000400,0x28401,0x11049680,0x80000000,6,0x11049680,0xf8000400,0x10402,0x11049680,0xf8000400,0x28402,0x11049700,0x80000000,0x4000000,0x11049700,
+0x80000080,0x4000000,0x11049780,0x80000080,0x4000000,0x11049780,0x80000080,0x4000001,0x11049780,0x80000080,0x4000002,0x11049800,0x80000000,0x4000000,0x11049980,0x80000000,
+2,0x11049980,0x80000000,3,0x11049980,0x80000400,0x10403,0x11049980,0x80000400,0x28403,0x11049a00,0x80000000,0x4000000,0x11049a80,0x80000000,0x4000000,
+0x11049b00,0x80000000,0x4000000,0x11049b00,0x80000080,0x4000000,0x11049b80,0x80000000,0x4000000,0x11049b80,0x80000080,0x4000000,0x11049c00,0x80000000,0,0x1104ab00,
+#ifndef U_DARWIN
+0x80000000,0,0x11080100,0x80000000,0x4000000,0x11080100,0xf8000400,0x10402,0x11080119,0xf8000400,0x10401,0x11080119,0xf8000400,0x28401,0x11080199,0xf8000400,
+0x10401,0x11080199,0xf8000400,0x10402,0x11080199,0xf8000400,0x28400,0x11080199,0xf8000400,0x28401,0x11080219,0xf8000400,0x10400,0x11080219,0xf8000400,0x10401,
+0x11080219,0xf8000400,0x10402,0x11080219,0xf8000400,0x18400,0x11080219,0xf8000400,0x28400,0x11080219,0xf8000400,0x28401,0x11080219,0xf8000400,0x28402,0x11080299,
+0xf8000400,0x10400,0x11080299,0xf8000400,0x18400,0x11080300,0x80001000,0,0x11080300,0x80001000,2,0x11080300,0xf8001400,0x10400,0x11080300,0xf8001400,
+0x18400,0x11080300,0xf8003400,0x18400,0x11080319,0xf8001400,0x1040f,0x11080400,0x80000040,1,0x11080407,0xf8000400,0x10400,0x11080407,0xf8000400,0x28400,
+0x1108040e,0x80001000,0,0x1108040e,0x80001000,1,0x1108040e,0x80001000,2,0x1108040e,0xe0001400,0x10402,0x1108040e,0xf8000400,0x10400,0x1108040e,
+0xf8000400,0x10401,0x1108040e,0xf8000400,0x10402,0x1108040e,0xf8000400,0x28400,0x1108040e,0xf8000400,0x28401,0x1108040e,0xf8000480,0x10402,0x1108040e,0xf8000480,
+0x28402,0x11080488,0x80000000,0,0x11080488,0xf8000400,0x10400,0x11080488,0xf8000400,0x10401,0x11080488,0xf8000400,0x28400,0x11080488,0xf8000400,0x28401,
+0x11080503,0x80000000,0,0x11080503,0x80000000,0x1024000,0x11080503,0xf8000400,0x10400,0x11080503,0xf8000400,0x10402,0x11080503,0xf8000400,0x28400,0x11080503,
+0xf8001400,0x18400,0x11080593,0x80000000,0,0x11080593,0x80000000,0x1000,0x11080593,0x80000000,0x18400,0x11080593,0x80000040,0,0x11080593,0xf8000400,
+0x18400,0x11080600,0x800000,0xc820,0x11080600,0xf8002400,0x18400,0x11080602,0x80000000,0,0x11080602,0xf8000400,0x18400,0x11080602,0xf8000400,0x18401,
+0x11080602,0xf8000400,0x18402,0x11080602,0xf8001400,0x18400,0x11080780,0x80000000,0,0x1108078a,0xf8000400,0x18400,0x1108078a,0xf8000400,0x18401,0x11080804,
+0x80000000,0,0x11080804,0xf8000400,0x18400,0x11080804,0xf8000400,0x18401,0x11080890,0xf8000400,0x18400,0x11080890,0xf8000400,0x18401,0x1108090f,0xf8000400,
+0x18400,0x1108099f,0x80000000,0,0x1108099f,0xf8000400,0x18400,0x1108099f,0xf8000400,0x18401,0x11080a23,0x80000000,0,0x11080a23,0xf8000400,0x18400,
+0x11080a23,0xf8000400,0x18401,0x11080aa4,0xf8000400,0x18400,0x11080b15,0xf8000400,0x18400,0x11080b9a,0xf8000400,0x18400,0x11080ca6,0x80000000,0,0x11080e80,
+0x80000000,0,0x11080e8c,0xf8000400,0x18400,0x11080e8c,0xf8000400,0x28400,0x11081319,0xf8000400,0x10401,0x11081319,0xf8000400,0x10402,0x11081319,0xf8000400,
+0x28401,0x1108138e,0x80001000,1,0x1108138e,0x80001000,2,0x1108138e,0xf8000400,0x10401,0x1108138e,0xf8000400,0x28401,0x11081400,0x80000000,0x4000000,
+0x11081400,0x80000000,0x4000002,0x11081400,0xd0000000,0x1c00,0x11081400,0xd0000080,0x1c00,0x11081480,0x80000000,0xe,0x11081480,0x80000000,0xf,0x11081480,
+0x80000080,0xe,0x11081480,0x80000080,0xf,0x11081480,0x80000088,0xe,0x11081480,0x80000088,0xf,0x11081600,0x80000000,0,0x11081600,0x80000000,
+2,0x11081600,0x80000000,0xf,0x11081600,0x80000080,0,0x11081600,0xf8000000,0,0x11081600,0xf8000400,0x28402,0x11081600,0xf8000480,0x10405,
+0x11081600,0xf8000480,0x18402,0x11081600,0xf8000480,0x28405,0x11081619,0xf8000400,0x28400,0x11081619,0xf8000400,0x28401,0x11081680,0x80000000,6,0x11081680,
+0xf8000400,0x10402,0x11081680,0xf8000400,0x18400,0x11081680,0xf8000400,0x28402,0x11081700,0x80000000,0x4000000,0x11081700,0x80000000,0x4000001,0x11081700,0x80000080,
+0x4000000,0x11081700,0x80000080,0x4000001,0x11081780,0x80000080,0x4000000,0x11081780,0x80000080,0x4000001,0x11081780,0x80000080,0x4000002,0x11081800,0x80000000,0x4000000,
+0x11081800,0x80000080,0x4000000,0x11081880,0x80000000,0x4000000,0x11081900,0x80000000,0x4000000,0x11081a00,0x80000000,0x4000000,0x11081a80,0x80000000,0x4000000,0x11081b00,
+0x80000000,0x4000000,0x11081b80,0x80000000,0x4000000,0x11081c00,0x80000000,0x4000000,0x11082803,0xf8000400,0x10402,0x11082813,0x80000080,5,0x11082813,0xf8000400,
+0x18401,0x11082813,0xf8000400,0x18402,0x11082813,0xf8000400,0x18405,0x11082819,0xf8000400,0x10402,0x11082882,0xe0000400,0x18408,0x11082882,0xf8000400,0x18404,
+0x11082882,0xf8000400,0x18407,0x11082882,0xf8000400,0x18408,0x11082882,0xf8000400,0x18409,0x11082a82,0xe0000400,0x18408,0x11082a82,0xf8000400,0x18404,0x11082a82,
+0xf8000400,0x18407,0x11082a82,0xf8000400,0x18408,0x11082a82,0xf8000400,0x18409,0x11088100,0x80000000,0x4000000,0x11088119,0xf8000400,0x10400,0x11088119,0xf8000400,
+0x10401,0x11088119,0xf8000400,0x28400,0x11088199,0xf8000400,0x10400,0x11088199,0xf8000400,0x10401,0x11088199,0xf8000400,0x10402,0x11088199,0xf8000400,0x28400,
+0x11088199,0xf8000400,0x28402,0x11088219,0xf8000400,0x10401,0x11088299,0xf8000400,0x10400,0x11088300,0x80001000,0,0x1108840e,0xf8000400,0x10400,0x1108840e,
+0xf8000400,0x28400,0x11088488,0xf8000400,0x10400,0x11088488,0xf8000400,0x10401,0x11088488,0xf8000400,0x28400,0x11088488,0xf8000400,0x28401,0x11089400,0x80000000,
+0x4000000,0x11089400,0x80000000,0x4000002,0x1108960e,0xf8000400,0x28401,0x11089680,0x80000000,6,0x11089700,0x80000000,0x4000000,0x11089c00,0x80000000,0x4000000,
+0x11092b80,0x80000000,0xa,0x11092b80,0x80000080,0xa,0x11092b92,0xf8000400,0x1840a,0x11092b92,0xf8800400,0x1840a,0x11092b96,0xf8000400,0x18c0a,0x110a0080,
+0x80000000,0x4000000,0x110a0080,0x80000080,0x4000000,0x110a0080,0x80001000,0x4000000,0x110a0080,0x80001080,0x4000000,0x110a0080,0xd0000000,0x1c00,0x110a0099,0xf8000400,
+0x10400,0x110a0099,0xf8000400,0x28400,0x110a0099,0xf8000700,0x10400,0x110a0099,0xf8000700,0x28400,0x110a0100,0x80000000,0x4000000,0x110a0100,0x80000080,0x4000000,
+0x110a0100,0x80001000,2,0x110c9400,0x80000008,0x4000000,0x11100080,1,0x8020020,0x11100593,0x80000008,0,0x11100780,0x80000040,0x1024000,0x11100ca6,
+0x80000040,0,0x11101400,0x80000001,0x20001,0x11101400,0x80000001,0x20002,0x11101400,0x80000008,0x4000000,0x11108100,0x800010,0xc820,0x11109400,0x80000000,
+0x4001000,0x11109400,0x80000008,0x4000000,0x11109400,0x80000018,0x4000000,0x11120080,0x80000080,0x4000000,0x11140300,0xf8001400,0x18400,0x11148100,0x80001000,2,
+0x11180080,1,0x8020020,0x11181400,1,0x801c020,0x11201400,0x80000000,0x4008000,0x11201480,0x80000080,0x800e,0x11201480,0x80000080,0x800f,0x11202880,
+0x80000000,0x4008000,0x11212b80,0x80000020,0x800a,0x11212b80,0x80000040,0xa,0x11212b80,0x80000040,0x102400a,0x1121ab80,0x80000000,0x8011,0x1121ab80,0x80000040,
+0x11,0x1121ab80,0x80000040,0x1024011,0x11220080,0x80000000,0x4008000,0x11229800,0x80000000,0x4008001,0x11229e80,0x80000000,0x4008000,0x11229e80,0x80000020,0x4008000,
+0x11229e80,0x80000040,0x4000000,0x11229e80,0x80000040,0x5024000,0x1122a980,0x80000000,0x8010,0x1122a980,0x80000020,0x8010,0x1122aa00,0x80000000,0x800c,0x1122aa00,
+0x80000040,0xc,0x1122aa00,0x80000040,0x102400c,0x11240080,0x800000,0x20,0x11240100,0x800000,0x20,0x11240488,0x50021000,0x60,0x11240593,0x50021400,
+0x60,0x11240601,0x50020400,0x60,0x11240601,0x50021400,0x60,0x11240602,0x20000,0x60,0x11240602,0x50020400,0x60,0x11240602,0x50021000,0x60,
+0x1124078a,0x50020400,0x60,0x1124078a,0x50021000,0x60,0x1124078a,0x50061000,0x60,0x1124078a,0xd0000400,0x18400,0x11240804,0x50020400,0x60,0x11240804,
+0x50021000,0x60,0x11240804,0x50061000,0x60,0x11240804,0xd0000400,0x18400,0x11240804,0xd0000400,0x18401,0x11240890,0x50020400,0x60,0x11240890,0x50021000,
+0x60,0x11240890,0x50061000,0x60,0x11240890,0xd0000400,0x18400,0x1124090f,0x50020400,0x60,0x1124090f,0x50021000,0x60,0x1124090f,0x50061000,0x60,
+0x1124090f,0xd0000400,0x18400,0x1124099f,0x50020400,0x60,0x1124099f,0x50021000,0x60,0x1124099f,0x50061000,0x60,0x1124099f,0xd0000400,0x18400,0x1124099f,
+0xd0000400,0x18401,0x11240a23,0x50020400,0x60,0x11240a23,0x50061000,0x60,0x11240a23,0xd0000400,0x18400,0x11240a23,0xd0000400,0x18401,0x11240aa4,0x50020400,
+0x60,0x11240aa4,0x50020400,0x61,0x11240aa4,0x50061000,0x60,0x11240aa4,0xd0000400,0x18400,0x11240b15,0x50020400,0x60,0x11240b15,0x50061000,0x60,
+0x11240b15,0xd0000400,0x18400,0x11240b15,0xd0000400,0x18401,0x11240b9a,0x50020400,0x60,0x11240b9a,0x50061000,0x60,0x11240b9a,0xd0000400,0x18400,0x11240b9a,
+0xd0000400,0x18401,0x11241400,0x800000,0xc820,0x11241400,0x800000,0x800c820,0x11241400,0x1800000,0xc820,0x11241401,0x820000,0x60,0x11241581,0x20000,
+0x60,0x11241581,0x50020080,0x60,0x11242813,0x50021400,0x60,0x11242901,0x50021000,0x60,0x11248381,0x50021000,0x60,0x11248381,0x50021000,0x61,
+0x11248381,0x50021400,0x60,0x11248381,0x51021000,0x61,0x11269e81,0x50021000,0x60,0x11269f01,0x50021000,0x60,0x11280080,1,0x801c040,0x112c0600,
+0x80000040,0,0x112c0600,0x80000040,0x1024000,0x112c0602,0x80000000,0,0x112c0602,0x80000040,0x1024000,0x112c1c00,0x80000000,0x4000000,0x112dab80,0x80000040,
+0x1024011,0x112e0080,0x80000040,0x5024000,0x112eaa00,0x80000040,0x102400c,0x11300100,0x80000001,0x1800b,0x11301400,0x80000001,0x2000b,0x11301400,0x80000018,0x400000b,
+0x11308381,0x50021000,0x60,0x11360080,0x80000018,0x4000000,0x11381e80,0x80000000,0,0x11399e80,0x80000001,0x20011,0x1139ab80,0x80000000,0x11,0x1139ab80,
+0x80000018,0x11,0x1139ab80,0x80000020,0x11,0x1139ab80,0x80000080,0x11,0x1139ab80,0x80001000,0x11,0x1139ab80,0x80001080,0x11,0x1139ab80,0xd0000000,
+0x1c11,0x1139ab80,0xd0000100,0x11,0x1139ab99,0xf8000400,0x10411,0x1139ab99,0xf8000400,0x28411,0x1139ab99,0xf8000500,0x10411,0x1139ab99,0xf8000500,0x28411,
+0x113a9e80,0x80000000,0,0x113a9e80,0x80000000,2,0x113a9e80,0x80000000,0x4000000,0x113a9e80,0x80000008,0x4000000,0x113a9e80,0xf8000c00,0x18000,0x113a9e80,
+0xf8002400,0x18c00,0x113a9e91,0xf8000c00,0x18000,0x113a9f14,0xf8000400,0x18000,0x113a9f14,0xf8000400,0x18001,0x113a9f96,0xf8000400,0x18c00,0x113a9f96,0xf8000400,
+0x18c01,0x113aa005,0xf8000400,0x18400,0x113aa092,0xf8000400,0x18402,0x113aa092,0xf8800400,0x18402,0x113aa100,0x80000000,0,0x113aa100,0x80000000,0xf,
+0x113aa200,0x80000000,0,0x113aa200,0x80000000,2,0x113aa200,0x80000000,3,0x113aa212,0x80000000,2,0x113aa212,0x80000000,3,0x113aa280,
+0x80000000,2,0x113aa280,0x80000000,0xd,0x113aa391,0xf8400c00,0x18000,0x113aa791,0xf8000c00,0x18001,0x113aa791,0xf8400c00,0x18000,0x113aa980,0x80000000,
+2,0x113aa980,0x80000000,0x10,0x113aa980,0x80000008,0x10,0x113aa980,0xd0000000,0x1c02,0x113aa980,0xd0000000,0x1c10,0x113aaa00,0x80000000,0xc,
+0x113aaa00,0x80000008,0xc,0x113aaa00,0x80000040,0xc,0x113aaa00,0x80000080,0xc,0x113aaa00,0x80000098,0xc,0x113c9400,0x80000000,0x4000002,0x11400400,
+0x80000040,0x1401,0x11400500,0x80000040,0x1025400,0x11401400,0x80000080,0x4001400,0x11420080,0x80000040,0x4001000,0x11420080,0x80000040,0x4001400,0x11420080,0x80000040,
+0x5005400,0x11440080,1,0x801c0a0,0x11481400,0x80000040,0x5024000,0x11481400,0x80000040,0x5024002,0x11492b80,0x80000010,0xa,0x11492b80,0xf0001400,0x18c0a,
+0x11492b80,0xf8003400,0x18c0a,0x11492b96,0xf8000400,0x18c0a,0x1149ab80,0x80000040,0x11,0x114a9e80,0x80000008,0x4000000,0x114a9e91,0xf8002400,0x18400,0x114a9f00,
+0xe0001000,0xc02,0x114a9f14,0xf8000400,0x18000,0x114a9f14,0xf8002400,0x18000,0x114a9f14,0xf8002400,0x18001,0x114a9f80,0x80000010,0,0x114a9f80,0xf8003400,
+0x18c00,0x114a9f96,0xf8000400,0x18c00,0x114a9f96,0xf8002400,0x18c00,0x114a9f96,0xf8002400,0x18c01,0x114aaa00,0x80000040,0xc,0x114c0600,0xd0000000,0x15800,
+#else /* U_DARWIN */
+0x80000000,0,0x1106a700,0x80000000,0,0x11080100,0x80000000,0x4000000,0x11080100,0xf8000400,0x10402,0x11080119,0xf8000400,0x10401,0x11080119,0xf8000400,
+0x28401,0x11080199,0xf8000400,0x10401,0x11080199,0xf8000400,0x10402,0x11080199,0xf8000400,0x28400,0x11080199,0xf8000400,0x28401,0x11080219,0xf8000400,0x10400,
+0x11080219,0xf8000400,0x10401,0x11080219,0xf8000400,0x10402,0x11080219,0xf8000400,0x18400,0x11080219,0xf8000400,0x28400,0x11080219,0xf8000400,0x28401,0x11080219,
+0xf8000400,0x28402,0x11080299,0xf8000400,0x10400,0x11080299,0xf8000400,0x18400,0x11080300,0x80001000,0,0x11080300,0x80001000,2,0x11080300,0xf8001400,
+0x10400,0x11080300,0xf8001400,0x18400,0x11080300,0xf8003400,0x18400,0x11080319,0xf8001400,0x1040f,0x11080400,0x80000040,1,0x11080407,0xf8000400,0x10400,
+0x11080407,0xf8000400,0x28400,0x1108040e,0x80001000,0,0x1108040e,0x80001000,1,0x1108040e,0x80001000,2,0x1108040e,0xe0001400,0x10402,0x1108040e,
+0xf8000400,0x10400,0x1108040e,0xf8000400,0x10401,0x1108040e,0xf8000400,0x10402,0x1108040e,0xf8000400,0x28400,0x1108040e,0xf8000400,0x28401,0x1108040e,0xf8000480,
+0x10402,0x1108040e,0xf8000480,0x28402,0x11080488,0x80000000,0,0x11080488,0xf8000400,0x10400,0x11080488,0xf8000400,0x10401,0x11080488,0xf8000400,0x28400,
+0x11080488,0xf8000400,0x28401,0x11080503,0x80000000,0,0x11080503,0x80000000,0x1024000,0x11080503,0xf8000400,0x10400,0x11080503,0xf8000400,0x10402,0x11080503,
+0xf8000400,0x28400,0x11080503,0xf8001400,0x18400,0x11080593,0x80000000,0,0x11080593,0x80000000,0x1000,0x11080593,0x80000000,0x18400,0x11080593,0x80000040,
+0,0x11080593,0xf8000400,0x18400,0x11080600,0x800000,0xc820,0x11080600,0xf8002400,0x18400,0x11080602,0x80000000,0,0x11080602,0xf8000400,0x18400,
+0x11080602,0xf8000400,0x18401,0x11080602,0xf8000400,0x18402,0x11080602,0xf8001400,0x18400,0x11080780,0x80000000,0,0x1108078a,0xf8000400,0x18400,0x1108078a,
+0xf8000400,0x18401,0x11080804,0x80000000,0,0x11080804,0xf8000400,0x18400,0x11080804,0xf8000400,0x18401,0x11080890,0xf8000400,0x18400,0x11080890,0xf8000400,
+0x18401,0x1108090f,0xf8000400,0x18400,0x1108099f,0x80000000,0,0x1108099f,0xf8000400,0x18400,0x1108099f,0xf8000400,0x18401,0x11080a23,0x80000000,0,
+0x11080a23,0xf8000400,0x18400,0x11080a23,0xf8000400,0x18401,0x11080aa4,0xf8000400,0x18400,0x11080b15,0xf8000400,0x18400,0x11080b9a,0xf8000400,0x18400,0x11080ca6,
+0x80000000,0,0x11080e80,0x80000000,0,0x11080e8c,0xf8000400,0x18400,0x11080e8c,0xf8000400,0x28400,0x11081319,0xf8000400,0x10401,0x11081319,0xf8000400,
+0x10402,0x11081319,0xf8000400,0x28401,0x1108138e,0x80001000,1,0x1108138e,0x80001000,2,0x1108138e,0xf8000400,0x10401,0x1108138e,0xf8000400,0x28401,
+0x11081400,0x80000000,0x4000000,0x11081400,0x80000000,0x4000002,0x11081400,0xd0000000,0x1c00,0x11081400,0xd0000080,0x1c00,0x11081480,0x80000000,0xe,0x11081480,
+0x80000000,0xf,0x11081480,0x80000080,0xe,0x11081480,0x80000080,0xf,0x11081480,0x80000088,0xe,0x11081480,0x80000088,0xf,0x11081600,0x80000000,
+0,0x11081600,0x80000000,2,0x11081600,0x80000000,0xf,0x11081600,0x80000080,0,0x11081600,0xf8000000,0,0x11081600,0xf8000400,0x28402,
+0x11081600,0xf8000480,0x10405,0x11081600,0xf8000480,0x18402,0x11081600,0xf8000480,0x28405,0x11081619,0xf8000400,0x28400,0x11081619,0xf8000400,0x28401,0x11081680,
+0x80000000,6,0x11081680,0xf8000400,0x10402,0x11081680,0xf8000400,0x18400,0x11081680,0xf8000400,0x28402,0x11081700,0x80000000,0x4000000,0x11081700,0x80000000,
+0x4000001,0x11081700,0x80000080,0x4000000,0x11081700,0x80000080,0x4000001,0x11081780,0x80000080,0x4000000,0x11081780,0x80000080,0x4000001,0x11081780,0x80000080,0x4000002,
+0x11081800,0x80000000,0x4000000,0x11081800,0x80000080,0x4000000,0x11081880,0x80000000,0x4000000,0x11081900,0x80000000,0x4000000,0x11081a00,0x80000000,0x4000000,0x11081a80,
+0x80000000,0x4000000,0x11081b00,0x80000000,0x4000000,0x11081b80,0x80000000,0x4000000,0x11081c00,0x80000000,0x4000000,0x11082700,0x80000000,0,0x11082700,0x80000400,
+0,0x11082803,0xf8000400,0x10402,0x11082813,0x80000080,5,0x11082813,0xf8000400,0x18401,0x11082813,0xf8000400,0x18402,0x11082813,0xf8000400,0x18405,
+0x11082819,0xf8000400,0x10402,0x11082882,0xe0000400,0x18408,0x11082882,0xf8000400,0x18404,0x11082882,0xf8000400,0x18407,0x11082882,0xf8000400,0x18408,0x11082882,
+0xf8000400,0x18409,0x11082a82,0xe0000400,0x18408,0x11082a82,0xf8000400,0x18404,0x11082a82,0xf8000400,0x18407,0x11082a82,0xf8000400,0x18408,0x11082a82,0xf8000400,
+0x18409,0x11088100,0x80000000,0x4000000,0x11088119,0xf8000400,0x10400,0x11088119,0xf8000400,0x10401,0x11088119,0xf8000400,0x28400,0x11088199,0xf8000400,0x10400,
+0x11088199,0xf8000400,0x10401,0x11088199,0xf8000400,0x10402,0x11088199,0xf8000400,0x28400,0x11088199,0xf8000400,0x28402,0x11088219,0xf8000400,0x10401,0x11088299,
+0xf8000400,0x10400,0x11088300,0x80001000,0,0x1108840e,0xf8000400,0x10400,0x1108840e,0xf8000400,0x28400,0x11088488,0xf8000400,0x10400,0x11088488,0xf8000400,
+0x10401,0x11088488,0xf8000400,0x28400,0x11088488,0xf8000400,0x28401,0x11089400,0x80000000,0x4000000,0x11089400,0x80000000,0x4000002,0x1108960e,0xf8000400,0x28401,
+0x11089680,0x80000000,6,0x11089700,0x80000000,0x4000000,0x11089c00,0x80000000,0x4000000,0x1108a700,0,0,0x11092b80,0x80000000,0xa,0x11092b80,
+0x80000080,0xa,0x11092b92,0xf8000400,0x1840a,0x11092b92,0xf8800400,0x1840a,0x11092b96,0xf8000400,0x18c0a,0x110a0080,0x80000000,0x4000000,0x110a0080,0x80000080,
+0x4000000,0x110a0080,0x80001000,0x4000000,0x110a0080,0x80001080,0x4000000,0x110a0080,0xd0000000,0x1c00,0x110a0099,0xf8000400,0x10400,0x110a0099,0xf8000400,0x28400,
+0x110a0099,0xf8000700,0x10400,0x110a0099,0xf8000700,0x28400,0x110a0100,0x80000000,0x4000000,0x110a0100,0x80000080,0x4000000,0x110a0100,0x80001000,2,0x110aa700,
+0x80000000,0,0x110aa700,0x80000400,0,0x110c9400,0x80000008,0x4000000,0x11100080,1,0x8020020,0x11100593,0x80000008,0,0x11100780,0x80000040,
+0x1024000,0x11100ca6,0x80000040,0,0x11101400,0x80000001,0x20001,0x11101400,0x80000001,0x20002,0x11101400,0x80000008,0x4000000,0x11108100,0x800010,0xc820,
+0x11109400,0x80000000,0x4001000,0x11109400,0x80000008,0x4000000,0x11109400,0x80000018,0x4000000,0x11120080,0x80000080,0x4000000,0x1112a700,0x80000000,0,0x11140300,
+0xf8001400,0x18400,0x11148100,0x80001000,2,0x11180080,1,0x8020020,0x11181400,1,0x801c020,0x11201400,0x80000000,0x4008000,0x11201480,0x80000080,
+0x800e,0x11201480,0x80000080,0x800f,0x11202880,0x80000000,0x4008000,0x11212b80,0x80000020,0x800a,0x11212b80,0x80000040,0xa,0x11212b80,0x80000040,0x102400a,
+0x1121a700,0x80000000,0,0x1121ab80,0x80000000,0x8011,0x1121ab80,0x80000040,0x11,0x1121ab80,0x80000040,0x1024011,0x11220080,0x80000000,0x4008000,0x11229800,
+0x80000000,0x4008001,0x11229e80,0x80000000,0x4008000,0x11229e80,0x80000020,0x4008000,0x11229e80,0x80000040,0x4000000,0x11229e80,0x80000040,0x5024000,0x1122a700,0x80000000,
+0,0x1122a980,0x80000000,0x8010,0x1122a980,0x80000020,0x8010,0x1122aa00,0x80000000,0x800c,0x1122aa00,0x80000040,0xc,0x1122aa00,0x80000040,0x102400c,
+0x11240080,0x800000,0x20,0x11240100,0x800000,0x20,0x11240488,0x50021000,0x60,0x11240593,0x50021400,0x60,0x11240601,0x50020400,0x60,0x11240601,
+0x50021400,0x60,0x11240602,0x20000,0x60,0x11240602,0x50020400,0x60,0x11240602,0x50021000,0x60,0x1124078a,0x50020400,0x60,0x1124078a,0x50021000,
+0x60,0x1124078a,0x50061000,0x60,0x1124078a,0xd0000400,0x18400,0x11240804,0x50020400,0x60,0x11240804,0x50021000,0x60,0x11240804,0x50061000,0x60,
+0x11240804,0xd0000400,0x18400,0x11240804,0xd0000400,0x18401,0x11240890,0x50020400,0x60,0x11240890,0x50021000,0x60,0x11240890,0x50061000,0x60,0x11240890,
+0xd0000400,0x18400,0x1124090f,0x50020400,0x60,0x1124090f,0x50021000,0x60,0x1124090f,0x50061000,0x60,0x1124090f,0xd0000400,0x18400,0x1124099f,0x50020400,
+0x60,0x1124099f,0x50021000,0x60,0x1124099f,0x50061000,0x60,0x1124099f,0xd0000400,0x18400,0x1124099f,0xd0000400,0x18401,0x11240a23,0x50020400,0x60,
+0x11240a23,0x50061000,0x60,0x11240a23,0xd0000400,0x18400,0x11240a23,0xd0000400,0x18401,0x11240aa4,0x50020400,0x60,0x11240aa4,0x50020400,0x61,0x11240aa4,
+0x50061000,0x60,0x11240aa4,0xd0000400,0x18400,0x11240b15,0x50020400,0x60,0x11240b15,0x50061000,0x60,0x11240b15,0xd0000400,0x18400,0x11240b15,0xd0000400,
+0x18401,0x11240b9a,0x50020400,0x60,0x11240b9a,0x50061000,0x60,0x11240b9a,0xd0000400,0x18400,0x11240b9a,0xd0000400,0x18401,0x11241400,0x800000,0xc820,
+0x11241400,0x800000,0x800c820,0x11241400,0x1800000,0xc820,0x11241401,0x820000,0x60,0x11241581,0x20000,0x60,0x11241581,0x50020080,0x60,0x11242700,
+0x20000,0x60,0x11242813,0x50021400,0x60,0x11242901,0x50021000,0x60,0x11248381,0x50021000,0x60,0x11248381,0x50021000,0x61,0x11248381,0x50021400,
+0x60,0x11248381,0x51021000,0x61,0x1124a700,0x20000,0x60,0x11269e81,0x50021000,0x60,0x11269f01,0x50021000,0x60,0x11280080,1,0x801c040,
+0x112c0600,0x80000040,0,0x112c0600,0x80000040,0x1024000,0x112c0602,0x80000000,0,0x112c0602,0x80000040,0x1024000,0x112c1c00,0x80000000,0x4000000,0x112dab80,
+0x80000040,0x1024011,0x112e0080,0x80000040,0x5024000,0x112eaa00,0x80000040,0x102400c,0x11300100,0x80000001,0x1800b,0x11301400,0x80000001,0x2000b,0x11301400,0x80000018,
+0x400000b,0x11308381,0x50021000,0x60,0x11360080,0x80000018,0x4000000,0x11381e80,0x80000000,0,0x11399e80,0x80000001,0x20011,0x1139a700,0x80000000,0,
+0x1139a700,0x80000080,0,0x1139ab80,0x80000000,0x11,0x1139ab80,0x80000018,0x11,0x1139ab80,0x80000020,0x11,0x1139ab80,0x80000080,0x11,0x1139ab80,
+0x80001000,0x11,0x1139ab80,0x80001080,0x11,0x1139ab80,0xd0000000,0x1c11,0x1139ab80,0xd0000100,0x11,0x1139ab99,0xf8000400,0x10411,0x1139ab99,0xf8000400,
+0x28411,0x1139ab99,0xf8000500,0x10411,0x1139ab99,0xf8000500,0x28411,0x113a9e80,0x80000000,0,0x113a9e80,0x80000000,2,0x113a9e80,0x80000000,0x4000000,
+0x113a9e80,0x80000008,0x4000000,0x113a9e80,0xf8000c00,0x18000,0x113a9e80,0xf8002400,0x18c00,0x113a9e91,0xf8000c00,0x18000,0x113a9f14,0xf8000400,0x18000,0x113a9f14,
+0xf8000400,0x18001,0x113a9f96,0xf8000400,0x18c00,0x113a9f96,0xf8000400,0x18c01,0x113aa005,0xf8000400,0x18400,0x113aa092,0xf8000400,0x18402,0x113aa092,0xf8800400,
+0x18402,0x113aa100,0x80000000,0,0x113aa100,0x80000000,0xf,0x113aa200,0x80000000,0,0x113aa200,0x80000000,2,0x113aa200,0x80000000,3,
+0x113aa212,0x80000000,2,0x113aa212,0x80000000,3,0x113aa280,0x80000000,2,0x113aa280,0x80000000,0xd,0x113aa391,0xf8400c00,0x18000,0x113aa791,
+0xf8000c00,0x18001,0x113aa791,0xf8400c00,0x18000,0x113aa980,0x80000000,2,0x113aa980,0x80000000,0x10,0x113aa980,0x80000008,0x10,0x113aa980,0xd0000000,
+0x1c02,0x113aa980,0xd0000000,0x1c10,0x113aaa00,0x80000000,0xc,0x113aaa00,0x80000008,0xc,0x113aaa00,0x80000040,0xc,0x113aaa00,0x80000080,0xc,
+0x113aaa00,0x80000098,0xc,0x113c9400,0x80000000,0x4000002,0x113ea700,0x80000080,0,0x11400400,0x80000040,0x1401,0x11400500,0x80000040,0x1025400,0x11401400,
+0x80000080,0x4001400,0x11420080,0x80000040,0x4001000,0x11420080,0x80000040,0x4001400,0x11420080,0x80000040,0x5005400,0x11440080,1,0x801c0a0,0x11481400,0x80000040,
+0x5024000,0x11481400,0x80000040,0x5024002,0x11492b80,0x80000010,0xa,0x11492b80,0xf0001400,0x18c0a,0x11492b80,0xf8003400,0x18c0a,0x11492b96,0xf8000400,0x18c0a,
+0x1149ab80,0x80000040,0x11,0x114a9e80,0x80000008,0x4000000,0x114a9e91,0xf8002400,0x18400,0x114a9f00,0xe0001000,0xc02,0x114a9f14,0xf8000400,0x18000,0x114a9f14,
+0xf8002400,0x18000,0x114a9f14,0xf8002400,0x18001,0x114a9f80,0x80000010,0,0x114a9f80,0xf8003400,0x18c00,0x114a9f96,0xf8000400,0x18c00,0x114a9f96,0xf8002400,
+0x18c00,0x114a9f96,0xf8002400,0x18c01,0x114aa700,0x80000000,0,0x114aa700,0x80000400,0,0x114aaa00,0x80000040,0xc,0x114c0600,0xd0000000,0x15800,
+#endif /* U_DARWIN */
+0x114c0602,0x80000000,0x15800,0x114c0602,0xd0000000,0x15800,0x114c078a,0xd0000000,0x15800,0x114c0804,0xd0000000,0x15800,0x114c0890,0xd0000000,0x15800,0x114c090f,
+0xd0000000,0x15800,0x114c099f,0xd0000000,0x15800,0x114c0a23,0xd0000000,0x15800,0x114c0aa4,0xd0000000,0x15800,0x114c0b15,0xd0000000,0x15800,0x114c0b9a,0xd0000000,
+0x15800,0x114c0ca6,0xd0000000,0x15800,0x114c0d18,0xd0000000,0x15800,0x114e0080,0xd0000300,0x15800,0x11501400,0x80000000,0x4008000,0x11501400,0x80000020,0x4008000,
+#ifndef U_DARWIN
+0x11501480,0x80000080,0x800e,0x11501480,0x80000080,0x800f,0x11502880,0x80000000,0x4008000,0x11512b80,0x80000020,0x800a,0x1151ab80,0x80000000,0x8011,0x11520080,
+0x80000000,0x4008000,0x11529800,0x80000000,0x4008001,0x11529e80,0x80000000,0x4008000,0x11529e80,0x80000020,0x4008000,0x1152a980,0x80000000,0x8010,0x1152a980,0x80000020,
+0x8010,0x1152aa00,0x80000000,0x800c,0x11541400,0x80000000,0x4000000,0x11541400,0x80000000,0x4000002,0x11541400,0x80000080,0x4000002,0x11541500,0x80000000,0,
+0x11548100,0x80000000,0x4000000,0x11549400,0x80000000,0x4000000,0x11549400,0x80000080,0x4000000,0x11549400,0x80000080,0x4000002,0x11549600,0x80000000,2,0x1155ab80,
+0x80000000,0x11,0x11560080,0x80000000,0x4000000,0x11560100,0x80000000,0x4000000,0x1156aa00,0x80000000,0xc,0x11580804,0x80000000,0,0x11580c80,0x80000000,
+0,0x11581500,0x80000000,0,0x11581500,0x80000000,2,0x11581780,0x80000080,0x4000000,0x11581780,0x80000088,0x4000000,0x11588100,0x80000000,0x4000000,
+0x11588100,0x80000080,0x4000000,0x11589600,0x80000000,2,0x11591500,0x80000000,0,0x1159ab80,0x80000000,0x11,0x115a0080,0x80000000,0x4000000,0x115a0080,
+0x80000080,0x4000000,0x115a0100,0x80000000,0x4000000,0x115aaa00,0x80000000,0xc,0x115c0100,0x80000020,0x4008000,0x115c1400,0x80000020,0x4008000,0x115c1c00,0x80000000,
+0x4008000,0x115c9400,0x80000020,0x4008000,0x115c9400,0x80000020,0x4009000,0x115e0080,0x80000020,0x4008000,0x115e0080,0x80000020,0x4009000,0x11600ca6,0x50020400,0x60,
+0x11600ca6,0x50021000,0x60,0x11600ca6,0x50060400,0x60,0x11600ca6,0xf0000400,0x18002,0x11600ca6,0xf8000400,0x18000,0x11600ca6,0xf8002400,0x18000,0x11600ca6,
+0xfc000400,0x18000,0x11600d18,0x50020400,0x60,0x11600d18,0x50021000,0x60,0x11600d18,0xf0000400,0x18002,0x11600d18,0xf8000400,0x18000,0x11600d18,0xf8000400,
+0x18002,0x11600d18,0xf8002400,0x18000,0x11600d18,0xfc000400,0x18000,0x116a0080,0x80000001,0x8020000,0x116e0080,0x80000000,0x4000000,0x11701400,0x800000,0xc820,
+0x11740100,1,0x801c020,0x11782a80,0x800000,0xc820,0x11868f12,0xf8000400,0x18480,0x11868f12,0xf8800400,0x18480,0x11880f12,0xf8000400,0x18500,0x118c0f12,
+0xf8000400,0x18520,0x118c0f12,0xf8800400,0x18520,0x20000067,0x810000,0,0x200036e7,0x810000,0,0x20003767,0x810000,0,0x2000b6e7,0,
+0,0x2000b767,0,0,0x20080da7,0x80000000,0,0x20080da7,0xf8000400,0x18400,0x20080da7,0xf8000400,0x18401,0x20081319,0xf8000400,0x10401,
+0x20100da7,0x80000000,0,0x20100da7,0xd0000400,0x18400,0x20140da7,0x80000000,0,0x20200da7,0x80000000,0x8000,0x20240593,0x50021000,0x60,0x20240593,
+0x50021400,0x60,0x20240da7,0x50020400,0x60,0x20240da7,0x50020400,0x61,0x20240da7,0x50020400,0x62,0x20240da7,0x50021000,0x60,0x20240da7,0x50061000,
+0x60,0x20240da7,0xd0001000,0,0x202c0da7,0x80000000,0,0x202c0da7,0x80000040,0,0x20300da7,0x80000000,0xb,0x20300da7,0x80000040,0,
+0x204c0da7,0xd0000000,0x15800,0x20500da7,0x80000000,0x8000,0x20581500,0x80000000,0,0x206425e7,0x800000,0,0x20642667,0x800000,0,0x206426e7,
+0x800000,0,0x207ea512,0xf8000400,0x184c1,0x2082a512,0xf8000400,0x184e1,0x211c2b00,0x80000000,0,0x21589500,0x80000000,0,0x30080219,0xf8000400,
+0x10400,0x30080219,0xf8000400,0x10401,0x30080219,0xf8000400,0x28400,0x30080219,0xf8000400,0x28401,0x30080299,0xf8000400,0x10400,0x30080300,0x80001000,0,
+0x30080300,0xf8001400,0x18400,0x3008040e,0xf8000400,0x10400,0x30080488,0xf8000400,0x10400,0x30080488,0xf8000400,0x10401,0x30080488,0xf8000400,0x28400,0x30080488,
+0xf8000400,0x28401,0x30080602,0x80000000,0,0x30080602,0xf8000400,0x18400,0x300806a2,0x800000,0xc820,0x300806a2,0x80000000,0,0x300806a2,0x80000040,
+0,0x300806a2,0x80000040,0x1024000,0x300806a2,0xf8000400,0x18400,0x30080725,0xf8000400,0x18400,0x30080c21,0x80000000,0,0x30080c21,0xf8000400,0x18400,
+0x30080da7,0x80000000,0,0x30080da7,0xf8000400,0x18400,0x30080e1c,0x80000000,0,0x30080f8b,0x80000000,0,0x30080f8b,0x80000040,0,0x30080f8b,
+0x80000040,0x1024000,0x30080f8b,0xd0000000,0,0x30080f8b,0xf8000400,0x18400,0x30081006,0xf8000400,0x18400,0x300810a8,0x80000040,0,0x300810a8,0x80000040,
+0x1024000,0x300810a8,0xf8000400,0x18400,0x3008111d,0xf8000400,0x18400,0x300811a0,0xf8000400,0x18400,0x30081217,0x80000000,0,0x3008129b,0x80000000,0,
+0x3008129b,0xf8000400,0x18400,0x3008129b,0xf8002400,0x18400,0x30081400,0x80000000,0x4000000,0x30081600,0x80000000,0,0x30081600,0xf8000400,0x10405,0x30081680,
+0xf8000400,0x28400,0x30081700,0x80000000,0x4000000,0x30081800,0x80000000,0x4000000,0x30081880,0x80000000,0x4000000,0x30081b00,0x80000000,0x4000000,0x30081b80,0x80000000,
+0x4000000,0x30081cae,0x80000000,0x4000000,0x30082813,0xf8000400,0x18401,0x30088300,0x80001000,0,0x30100503,0x80000018,0,0x30100da7,0x80000000,0,
+0x30100e1c,0x80000040,0x1024000,0x30100f8b,0x80000040,0,0x3010111d,0x80000001,0x20000,0x30101180,0x80000040,0,0x30101217,0x80000000,0,0x30101217,
+0x80000040,0,0x30101280,0x80000040,0,0x30101280,0x80000040,0x1024000,0x3010129b,0x80000040,0,0x3010129b,0x80000040,0x1024000,0x3014129b,0x80000018,
+0,0x3020111d,0x80000000,0x8000,0x30240488,0x20000,0x60,0x30240601,0x50020400,0x60,0x302406a2,0x50020400,0x60,0x302406a2,0x50021000,0x60,
+0x302406a2,0x50021400,0x60,0x30240725,0x50021400,0x60,0x30240c21,0x50020400,0x60,0x30240c21,0x50061000,0x60,0x30240c21,0xd0000400,0x18400,0x30240c21,
+0xd0000400,0x18401,0x30240da7,0x50020400,0x60,0x30240da7,0x50021000,0x60,0x3024129b,0x50020400,0x60,0x3024129b,0x50820000,0x2000060,0x30241581,0x20000,
+0x60,0x30242b00,0,0xc820,0x30248381,0x50021000,0x60,0x3030129b,0x80000001,0x20000,0x30301400,0x80000001,0x2000b,0x30308381,0x50021000,0x60,
+0x303a9d11,0x80200000,0,0x303a9d11,0x80200000,2,0x303a9d91,0x80200000,2,0x303a9e00,0x80080000,0,0x303a9e00,0x80100000,0,0x303a9e80,
+0x80000000,0,0x303a9e91,0xf8000c00,0x18002,0x303aa185,0xf8000400,0x18400,0x303aa311,0xf8400c00,0x18000,0x303aa429,0xf8000400,0x18400,0x303aa4a9,0x80000000,
+0,0x30481217,0x80000040,0,0x30481400,0x80000040,0x5024002,0x304aa429,0xf8002400,0x18400,0x304c0e1c,0xd0000000,0x15800,0x304c1217,0xd0000000,0x15800,
+0x304c129b,0xd0000000,0x15800,0x3050111d,0x80000000,0x8000,0x30581217,0x80000000,0,0x30581500,0x80000000,0,0x30600e1c,0x50020400,0x60,0x30600e1c,
+0x50021000,0x60,0x30600e1c,0x50061000,0x60,0x30600e1c,0xd0000400,0x18000,0x30600e1c,0xf8000400,0x18000,0x30600e1c,0xf8000400,0x18001,0x30601217,0x800000,
+0xc820,0x30601217,0x50020400,0x60,0x30601217,0x50021000,0x60,0x30601217,0x50061000,0x60,0x30601217,0x51021000,0x60,0x30601217,0xd0000400,0x18000,
+0x30601217,0xf8000400,0x18000,0x30601217,0xf9000400,0x18000,0x310028e7,0x810000,0,0x3108040e,0xf8000480,0x10402,0x3108040e,0xf8000480,0x28402,0x31082c1e,
+0x80000000,0,0x31082c1e,0xf8000400,0x18400,0x31082c8d,0xf8000400,0x18400,0x31082d09,0xf8000400,0x10400,0x31082d09,0xf8000400,0x28400,0x31082d80,0x80000000,
+0,0x31082e00,0x80000000,0,0x31082e00,0x80000000,1,0x31082e80,0x80000080,5,0x31082e80,0xf8000480,0x10405,0x31082e80,0xf8000480,0x28405,
+0x31242e00,0x800000,0xc820,0x31242e00,0x50020000,0x60,0x31242e00,0x50021000,0x60,0x31242e00,0xd0000000,0,0x31242e00,0xd0001000,0,0x31242e01,
+0x50021000,0x60,0x31243000,0x800000,0xc820,0x313aaf11,0xf8400c00,0x18000,0x313aaf91,0xf8000c00,0x18001,0x314c2e80,0xd0000080,0x15805,0x32041b80,0x80000000,
+0x4000000,0x32049980,0x80000000,0,0x32080219,0xf8000400,0x28400,0x3208040e,0x80000080,0,0x3208040e,0xf8000400,0x10400,0x3208040e,0xf8000400,0x28400,
+0x32080488,0xf8000400,0x10400,0x32080488,0xf8000400,0x28400,0x32080602,0xf8000400,0x18400,0x32080725,0xf8000400,0x18400,0x32080e8c,0xf8000400,0x18400,0x32081400,
+0x800080,0xc820,0x32081400,0x80000000,0x4000000,0x32081400,0x80000000,0x4000002,0x32081400,0x80000080,0x4000000,0x32081499,0xf8000400,0x1040f,0x32081600,0x80000000,
+0,0x32081600,0x80000080,0,0x32081600,0x80000080,5,0x32081600,0xf8000480,0x10405,0x32081600,0xf8000480,0x28405,0x32081700,0x80000080,0x4000000,
+0x32081780,0x80000080,0x4000000,0x32081800,0x80000000,0x4000000,0x32081800,0x80000080,0x4000000,0x32081a80,0x80000000,0x4000000,0x32081b00,0x80000080,0x4000000,0x32081b80,
+0x80000000,0x4000000,0x32082a82,0xf8000400,0x18400,0x32083088,0xf8000400,0x10400,0x32083088,0xf8000400,0x28400,0x3208312a,0xf8000400,0x18400,0x320831ab,0xf8000400,
+0x18400,0x3208322c,0xf8000400,0x18400,0x320832ad,0xf8000400,0x18400,0x32083300,0x80000080,0x4000000,0x32083380,0x80000080,0x4000000,0x32083400,0x80000080,0x4000000,
+0x32083480,0x80000080,0x4000000,0x32083500,0x80000080,0x4000000,0x32083500,0x80000080,0x4000001,0x32083500,0x80000080,0x4000002,0x32101400,0x80000001,0x20002,0x32103180,
+0x80000000,0,0x32201c00,0x80000000,0x4008000,0x32203480,0x80000080,0x4008000,0x3221ab80,0x80000000,0x8011,0x32223300,0x80000080,0x4008000,0x32223480,0x80000080,
+0x4008000,0x32241581,0x20000,0x60,0x32241581,0x50020000,0x60,0x32241581,0x50020080,0x60,0x3224312a,0x50020400,0x60,0x3224312a,0x50060000,0x60,
+0x322431ab,0x50020400,0x60,0x322431ab,0x50060000,0x60,0x3224322c,0x50020400,0x60,0x322432ad,0x50020400,0x60,0x32248381,0x50020000,0x60,0x3224b601,
+0x50820000,0x2000060,0x32308381,0x50820000,0x60,0x323a9e80,0x80000000,0,0x323a9f14,0xf8000400,0x18010,0x323a9f96,0xf8000400,0x18c10,0x323aa200,0x80000000,
+3,0x323aa4a9,0x80000000,0,0x323aa791,0xf8000400,0x18401,0x323aa980,0x80000000,0x4000000,0x32481400,0x80000040,0x5024002,0x324a9e80,0xf8000400,0x18400,
+0x324a9e91,0xf8000400,0x18400,0x324a9f14,0xf8000400,0x18000,0x324a9f80,0x80000008,0xc00,0x324ab596,0xf8000400,0x18c00,0x32501c00,0x80000000,0x4008000,0x32503480,
+0x80000080,0x4008000,0x3251ab80,0x80000000,0x8011,0x32523300,0x80000080,0x4008000,0x32523480,0x80000080,0x4008000,0x32542882,0x80000000,8,0x32581500,0x80000000,
+0,0x32781400,0x800000,0xc820,0x40049b80,0x80000000,0x4000000,0x40080219,0xf8000400,0x10400,0x40080299,0xf8000400,0x10400,0x40080300,0x80001000,0,
+0x4008040e,0xf8000400,0x10400,0x4008040e,0xf8000400,0x28400,0x4008040e,0xf8000400,0x28402,0x40080600,0x800000,0xc820,0x40080602,0x80000000,0,0x40080602,
+0xf8000400,0x18400,0x400806a2,0xf8000400,0x18400,0x4008078a,0xf8000400,0x18400,0x40080804,0xf8000400,0x18400,0x4008090f,0xf8000400,0x18400,0x4008099f,0xf8000400,
+0x18400,0x40080a23,0x80000000,0,0x40080b15,0xf8000400,0x18400,0x40081217,0x80000000,0,0x40081400,0x80000008,0x4000000,0x40081400,0xd0000000,0x1c00,
+0x40081600,0x80000000,2,0x40081800,0x80000000,0x4000000,0x40081800,0x80000080,0x4000000,0x40081b80,0x80000000,0x4000000,0x40082880,0x80000000,0,0x40082d09,
+0xf8000400,0x10400,0x40082d09,0xf8000400,0x28400,0x40082e80,0xf8000480,0x10405,0x400837b0,0x80000000,0,0x400837b0,0xf8000400,0x18400,0x40083897,0x80000000,
+0,0x40083908,0xf8000400,0x10400,0x4008390e,0xf8000400,0x10400,0x4008390e,0xf8001400,0x1040e,0x4008390e,0xf8001400,0x1040f,0x40083919,0xf8000400,0x10400,
+0x40083919,0xf8001400,0x10400,0x40083919,0xf8001400,0x1040e,0x40083919,0xf8001400,0x1040f,0x40083980,0x80000000,0x4000000,0x40083a00,0x80000000,0,0x40083ab1,
+0xf8000400,0x18400,0x40083b31,0xf8000400,0x18400,0x40083b80,0x80000000,0,0x40083c35,0xf8000400,0x18400,0x40083cb3,0xf8000400,0x18400,0x40083d32,0xf8000400,
+0x18400,0x40083daf,0xf8000400,0x18400,0x40083e00,0x80000000,0,0x40089980,0x80000000,0,0x40103b80,0x80000000,0,0x40103c35,0x80000040,0,
+0x4022a980,0x80000000,0x8010,0x40240602,0x50020400,0x60,0x40240602,0x50021000,0x60,0x40240602,0x50021400,0x60,0x40240890,0x50020400,0x60,0x40240890,
+0xd0000400,0x18400,0x4024090f,0x50020400,0x60,0x40240b15,0x50021000,0x60,0x402437b0,0x50020400,0x60,0x402437b0,0x50021000,0x60,0x402437b0,0xd0000400,
+0x18400,0x40248381,0x50021000,0x60,0x4024be81,0x50820000,0x2000060,0x402c37b0,0x80000040,0x1024000,0x40308381,0x50021000,0x60,0x403aa200,0x80000000,0xd,
+0x403aa212,0x80000000,2,0x403aa212,0x80000000,3,0x403aa280,0x80000000,0xd,0x40400602,0x80000000,0x1400,0x404c37b0,0xd0000000,0x15800,0x404c3d32,
+0xd0000000,0x15800,0x4052a980,0x80000000,0x8010,0x4058090f,0x80000000,0,0x40580a23,0x80000000,0,0x40601217,0x50021000,0x60,0x40603834,0xf8000400,
+0x18000,0x41080219,0xf8000400,0x10400,0x41080219,0xf8000400,0x28400,0x4108040e,0xf8000400,0x10400,0x4108040e,0xf8000400,0x28400,0x41080488,0xf8000400,0x10400,
+0x41080488,0xf8000400,0x28400,0x4108078a,0xf8000400,0x18400,0x41080804,0xf8000400,0x18400,0x41080a23,0xf8000400,0x18400,0x41080e8c,0xf8000400,0x18400,0x41080e8c,
+0xf8000400,0x1840f,0x41080f8b,0x80000000,0,0x41080f8b,0xf8000400,0x18400,0x41081400,0x80000000,0x4000000,0x41081499,0xf8000400,0x1040e,0x41081600,0x80000000,
+0,0x41081600,0xf8000480,0x10405,0x41081800,0x80000000,0x4000000,0x41081b80,0x80000000,0x4000000,0x41082e80,0xf8000480,0x10405,0x41083300,0x80000080,0x4000000,
+0x41083908,0xf8000400,0x1040f,0x41083919,0xf8000400,0x10400,0x41083980,0x80000000,0x4000000,0x41083f0e,0x80000000,0,0x41083f8e,0x80000000,0,0x41083f8e,
+0xf8000400,0x18400,0x41084002,0xf8000400,0x18400,0x410840b7,0x80000000,0,0x410840b7,0xf8000400,0x18400,0x41084207,0x80000000,0,0x41084207,0xf8000400,
+0x10400,0x41084207,0xf8000400,0x28400,0x4108428b,0xf8000400,0x18400,0x4108430b,0x80000000,0,0x4108430b,0xf8000400,0x18400,0x4108438c,0xf8000400,0x10400,
+0x41084438,0xf8000400,0x10400,0x41084438,0xf8000400,0x28400,0x410844b9,0x80000000,0,0x410844b9,0xf8000400,0x18400,0x41084500,0x80000000,0,0x4108463d,
+0xf8000400,0x18400,0x4108468e,0xf8000400,0x1040f,0x41084699,0xf8000400,0x10400,0x41084699,0xf8000400,0x1040f,0x41084700,0x80000000,0x4000000,0x410847ba,0x80000000,
+0,0x410847ba,0xf8000400,0x18400,0x4108483c,0xf8000400,0x18400,0x4108483c,0xf8000400,0x1840f,0x41101400,0x80000000,0x4000000,0x411040b7,0x80000000,0,
+0x41104207,0x80000000,0,0x411044b9,0x80000000,0,0x4110463d,0x80000040,0,0x41104700,0x80000000,0x4000000,0x41104700,0x80000018,0x4000000,0x41140da7,
+0x80000000,0,0x41203300,0x80000080,0x4008000,0x4122c880,0x80000000,0x10,0x4122c880,0x80000000,0x8010,0x41240593,0x50020000,0x60,0x41240593,0x50020400,
+0x60,0x41240602,0x50020400,0x60,0x41240f8b,0x50020400,0x60,0x41241581,0x50020000,0x60,0x41243f0e,0x50020000,0x60,0x412440b7,0x50020400,0x60,
+0x412440b7,0xd0000400,0x18400,0x41244181,0x50020000,0x60,0x412444b9,0x50020000,0x60,0x412444b9,0x50020400,0x60,0x412444b9,0x50060000,0x60,0x412447ba,
+0x50020000,0x60,0x412447ba,0x50020400,0x60,0x412447ba,0x50060000,0x60,0x412447ba,0xd0000000,0,0x412447ba,0xd0000400,0x18400,0x41248381,0x50020000,
+0x60,0x412c0593,0x80000000,0,0x412c0602,0x80000000,0,0x412ec880,0x80000000,0x10,0x41308381,0x50020000,0x60,0x413aa200,0x80000000,3,
+0x413aa391,0xf8400c00,0x18000,0x413aa791,0xf8000c00,0x18001,0x413ac100,0x80000000,0,0x413ec880,0x80000000,0x10,0x4142c880,0x80000000,0x1410,0x414c0a23,
+0xd0000000,0x15800,0x414c45bb,0xd0000000,0x15800,0x41503300,0x80000080,0x4008000,0x4152c880,0x80000000,0x8010,0x41540602,0x80000000,0,0x41581500,0x80000000,
+0,0x415c4700,0x80000000,0x4008000,0x416045bb,0x80000000,0,0x416045bb,0xd0000400,0x18000,0x416045bb,0xf8000400,0x18000,0x50080219,0xf8000400,0x10400,
+0x50080219,0xf8000400,0x28400,0x5008040e,0xf8000400,0x10400,0x50080488,0xf8000400,0x10400,0x50080488,0xf8000400,0x28400,0x5008078a,0xf8000400,0x18400,0x50080b15,
+0x80000000,0,0x50081600,0x80000000,0,0x50081619,0xf8000400,0x10400,0x50081699,0xf8000400,0x10400,0x50081800,0x80000000,0x4000000,0x50081800,0x80000080,
+0x4000000,0x50081b80,0x80000000,0x4000000,0x50082e80,0xf8000480,0x10405,0x50082e80,0xf8000480,0x28405,0x50083088,0xf8000400,0x10400,0x50083088,0xf8000400,0x28400,
+0x50083300,0x80000080,0x4000000,0x50083980,0x80000000,0x4000000,0x50084500,0xf8001400,0x18400,0x50084957,0x80000000,0,0x50084957,0xf8000400,0x18400,0x50084957,
+0xf8001400,0x18400,0x50084957,0xf8002400,0x18400,0x500849be,0x80000000,0,0x500849be,0xf8000400,0x18400,0x500849be,0xf8000400,0x18401,0x50084a19,0xf8000400,
+0x10400,0x50084a19,0xf8000400,0x28400,0x50084a80,0x80001000,0,0x50084b5a,0xf8000400,0x18400,0x50084bdb,0x80000000,0,0x50084bdb,0xf8000400,0x18400,
+0x50084c65,0xf8000400,0x18400,0x50084ce5,0xf8000400,0x18400,0x50084d00,0x80000000,0,0x501049be,0x80000000,0,0x501049be,0x80000040,0,0x501049be,
+0x80000040,0x1024000,0x50104bdb,0x80000040,0,0x50104ce5,0x80000040,0,0x50144b5a,0x80000000,0,0x50240593,0x50021400,0x60,0x50240b15,0x50020400,
+0x60,0x50241581,0x50020080,0x60,0x50244181,0x50021000,0x60,0x50244957,0x50021000,0x60,0x502449be,0x50020400,0x60,0x502449be,0x50021000,0x60,
+0x502449be,0xd0000400,0x18400,0x502449be,0xd0000400,0x18401,0x502449be,0xd0041000,0,0x502c4957,0x80000040,0x1024000,0x502c4b5a,0x80000040,0x1024000,0x50404957,
+0x80000040,0x1400,0x504c4957,0xd0000000,0x15800,0x504c49be,0xd0000000,0x15800};
+#else /* U_DARWIN */
+0x11501480,0x80000080,0x800e,0x11501480,0x80000080,0x800f,0x11502880,0x80000000,0x4008000,0x11512b80,0x80000020,0x800a,0x1151a700,0x80000000,0,0x1151ab80,
+0x80000000,0x8011,0x11520080,0x80000000,0x4008000,0x11529800,0x80000000,0x4008001,0x11529e80,0x80000000,0x4008000,0x11529e80,0x80000020,0x4008000,0x1152a980,0x80000000,
+0x8010,0x1152a980,0x80000020,0x8010,0x1152aa00,0x80000000,0x800c,0x11541400,0x80000000,0x4000000,0x11541400,0x80000000,0x4000002,0x11541400,0x80000080,0x4000002,
+0x11541500,0x80000000,0,0x11548100,0x80000000,0x4000000,0x11549400,0x80000000,0x4000000,0x11549400,0x80000080,0x4000000,0x11549400,0x80000080,0x4000002,0x11549600,
+0x80000000,2,0x1155ab80,0x80000000,0x11,0x11560080,0x80000000,0x4000000,0x11560100,0x80000000,0x4000000,0x1156aa00,0x80000000,0xc,0x11580804,0x80000000,
+0,0x11580c80,0x80000000,0,0x11581500,0x80000000,0,0x11581500,0x80000000,2,0x11581780,0x80000080,0x4000000,0x11581780,0x80000088,0x4000000,
+0x11582700,0x80000000,0,0x11588100,0x80000000,0x4000000,0x11588100,0x80000080,0x4000000,0x11589600,0x80000000,2,0x11591500,0x80000000,0,0x1159ab80,
+0x80000000,0x11,0x115a0080,0x80000000,0x4000000,0x115a0080,0x80000080,0x4000000,0x115a0100,0x80000000,0x4000000,0x115aaa00,0x80000000,0xc,0x115c0100,0x80000020,
+0x4008000,0x115c1400,0x80000020,0x4008000,0x115c1c00,0x80000000,0x4008000,0x115c9400,0x80000020,0x4008000,0x115c9400,0x80000020,0x4009000,0x115e0080,0x80000020,0x4008000,
+0x115e0080,0x80000020,0x4009000,0x11600ca6,0x50020400,0x60,0x11600ca6,0x50021000,0x60,0x11600ca6,0x50060400,0x60,0x11600ca6,0xf0000400,0x18002,0x11600ca6,
+0xf8000400,0x18000,0x11600ca6,0xf8002400,0x18000,0x11600ca6,0xfc000400,0x18000,0x11600d18,0x50020400,0x60,0x11600d18,0x50021000,0x60,0x11600d18,0xf0000400,
+0x18002,0x11600d18,0xf8000400,0x18000,0x11600d18,0xf8000400,0x18002,0x11600d18,0xf8002400,0x18000,0x11600d18,0xfc000400,0x18000,0x116a0080,0x80000001,0x8020000,
+0x116e0080,0x80000000,0x4000000,0x11701400,0x800000,0xc820,0x11740100,1,0x801c020,0x11782a80,0x800000,0xc820,0x11868f12,0xf8000400,0x18480,0x11868f12,
+0xf8800400,0x18480,0x11880f12,0xf8000400,0x18500,0x118c0f12,0xf8000400,0x18520,0x118c0f12,0xf8800400,0x18520,0x20000067,0x810000,0,0x200036e7,0x810000,
+0,0x20003767,0x810000,0,0x2000b6e7,0,0,0x2000b767,0,0,0x20080da7,0x80000000,0,0x20080da7,0xf8000400,0x18400,
+0x20080da7,0xf8000400,0x18401,0x20081319,0xf8000400,0x10401,0x20100da7,0x80000000,0,0x20100da7,0xd0000400,0x18400,0x20140da7,0x80000000,0,0x20200da7,
+0x80000000,0x8000,0x20240593,0x50021000,0x60,0x20240593,0x50021400,0x60,0x20240da7,0x50020400,0x60,0x20240da7,0x50020400,0x61,0x20240da7,0x50020400,
+0x62,0x20240da7,0x50021000,0x60,0x20240da7,0x50061000,0x60,0x20240da7,0xd0001000,0,0x202c0da7,0x80000000,0,0x202c0da7,0x80000040,0,
+0x20300da7,0x80000000,0xb,0x20300da7,0x80000040,0,0x204c0da7,0xd0000000,0x15800,0x20500da7,0x80000000,0x8000,0x20581500,0x80000000,0,0x206425e7,
+0x800000,0,0x20642667,0x800000,0,0x206426e7,0x800000,0,0x207ea512,0xf8000400,0x184c1,0x2082a512,0xf8000400,0x184e1,0x211c2b00,0x80000000,
+0,0x21589500,0x80000000,0,0x30080219,0xf8000400,0x10400,0x30080219,0xf8000400,0x10401,0x30080219,0xf8000400,0x28400,0x30080219,0xf8000400,0x28401,
+0x30080299,0xf8000400,0x10400,0x30080300,0x80001000,0,0x30080300,0xf8001400,0x18400,0x3008040e,0xf8000400,0x10400,0x30080488,0xf8000400,0x10400,0x30080488,
+0xf8000400,0x10401,0x30080488,0xf8000400,0x28400,0x30080488,0xf8000400,0x28401,0x30080602,0x80000000,0,0x30080602,0xf8000400,0x18400,0x300806a2,0x800000,
+0xc820,0x300806a2,0x80000000,0,0x300806a2,0x80000040,0,0x300806a2,0x80000040,0x1024000,0x300806a2,0xf8000400,0x18400,0x30080725,0xf8000400,0x18400,
+0x30080c21,0x80000000,0,0x30080c21,0xf8000400,0x18400,0x30080da7,0x80000000,0,0x30080da7,0xf8000400,0x18400,0x30080e1c,0x80000000,0,0x30080f8b,
+0x80000000,0,0x30080f8b,0x80000040,0,0x30080f8b,0x80000040,0x1024000,0x30080f8b,0xd0000000,0,0x30080f8b,0xf8000400,0x18400,0x30081006,0xf8000400,
+0x18400,0x300810a8,0x80000040,0,0x300810a8,0x80000040,0x1024000,0x300810a8,0xf8000400,0x18400,0x3008111d,0xf8000400,0x18400,0x300811a0,0xf8000400,0x18400,
+0x30081217,0x80000000,0,0x3008129b,0x80000000,0,0x3008129b,0xf8000400,0x18400,0x3008129b,0xf8002400,0x18400,0x30081400,0x80000000,0x4000000,0x30081600,
+0x80000000,0,0x30081600,0xf8000400,0x10405,0x30081680,0xf8000400,0x28400,0x30081700,0x80000000,0x4000000,0x30081800,0x80000000,0x4000000,0x30081880,0x80000000,
+0x4000000,0x30081b00,0x80000000,0x4000000,0x30081b80,0x80000000,0x4000000,0x30081cae,0x80000000,0x4000000,0x30082813,0xf8000400,0x18401,0x30088300,0x80001000,0,
+0x30100503,0x80000018,0,0x30100da7,0x80000000,0,0x30100e1c,0x80000040,0x1024000,0x30100f8b,0x80000040,0,0x3010111d,0x80000001,0x20000,0x30101180,
+0x80000040,0,0x30101217,0x80000000,0,0x30101217,0x80000040,0,0x30101280,0x80000040,0,0x30101280,0x80000040,0x1024000,0x3010129b,0x80000040,
+0,0x3010129b,0x80000040,0x1024000,0x3014129b,0x80000018,0,0x3020111d,0x80000000,0x8000,0x30240488,0x20000,0x60,0x30240601,0x50020400,0x60,
+0x302406a2,0x50020400,0x60,0x302406a2,0x50021000,0x60,0x302406a2,0x50021400,0x60,0x30240725,0x50021400,0x60,0x30240c21,0x50020400,0x60,0x30240c21,
+0x50061000,0x60,0x30240c21,0xd0000400,0x18400,0x30240c21,0xd0000400,0x18401,0x30240da7,0x50020400,0x60,0x30240da7,0x50021000,0x60,0x3024129b,0x50020400,
+0x60,0x3024129b,0x50820000,0x2000060,0x30241581,0x20000,0x60,0x30242b00,0,0xc820,0x30248381,0x50021000,0x60,0x3030129b,0x80000001,0x20000,
+0x30301400,0x80000001,0x2000b,0x30308381,0x50021000,0x60,0x303a9d11,0x80200000,0,0x303a9d11,0x80200000,2,0x303a9d91,0x80200000,2,0x303a9e00,
+0x80080000,0,0x303a9e00,0x80100000,0,0x303a9e80,0x80000000,0,0x303a9e91,0xf8000c00,0x18002,0x303aa185,0xf8000400,0x18400,0x303aa311,0xf8400c00,
+0x18000,0x303aa429,0xf8000400,0x18400,0x303aa4a9,0x80000000,0,0x30481217,0x80000040,0,0x30481400,0x80000040,0x5024002,0x304aa429,0xf8002400,0x18400,
+0x304c0e1c,0xd0000000,0x15800,0x304c1217,0xd0000000,0x15800,0x304c129b,0xd0000000,0x15800,0x3050111d,0x80000000,0x8000,0x30581217,0x80000000,0,0x30581500,
+0x80000000,0,0x30600e1c,0x50020400,0x60,0x30600e1c,0x50021000,0x60,0x30600e1c,0x50061000,0x60,0x30600e1c,0xd0000400,0x18000,0x30600e1c,0xf8000400,
+0x18000,0x30600e1c,0xf8000400,0x18001,0x30601217,0x800000,0xc820,0x30601217,0x50020400,0x60,0x30601217,0x50021000,0x60,0x30601217,0x50061000,0x60,
+0x30601217,0x51021000,0x60,0x30601217,0xd0000400,0x18000,0x30601217,0xf8000400,0x18000,0x30601217,0xf9000400,0x18000,0x310028e7,0x810000,0,0x3108040e,
+0xf8000480,0x10402,0x3108040e,0xf8000480,0x28402,0x31082c1e,0x80000000,0,0x31082c1e,0xf8000400,0x18400,0x31082c8d,0xf8000400,0x18400,0x31082d09,0xf8000400,
+0x10400,0x31082d09,0xf8000400,0x28400,0x31082d80,0x80000000,0,0x31082e00,0x80000000,0,0x31082e00,0x80000000,1,0x31082e80,0x80000080,5,
+0x31082e80,0xf8000480,0x10405,0x31082e80,0xf8000480,0x28405,0x31242e00,0x800000,0xc820,0x31242e00,0x50020000,0x60,0x31242e00,0x50021000,0x60,0x31242e00,
+0xd0000000,0,0x31242e00,0xd0001000,0,0x31242e01,0x50021000,0x60,0x31243000,0x800000,0xc820,0x313aaf11,0xf8400c00,0x18000,0x313aaf91,0xf8000c00,
+0x18001,0x314c2e80,0xd0000080,0x15805,0x32041b80,0x80000000,0x4000000,0x32049980,0x80000000,0,0x32080219,0xf8000400,0x28400,0x3208040e,0x80000080,0,
+0x3208040e,0xf8000400,0x10400,0x3208040e,0xf8000400,0x28400,0x32080488,0xf8000400,0x10400,0x32080488,0xf8000400,0x28400,0x32080602,0xf8000400,0x18400,0x32080725,
+0xf8000400,0x18400,0x32080e8c,0xf8000400,0x18400,0x32081400,0x800080,0xc820,0x32081400,0x80000000,0x4000000,0x32081400,0x80000000,0x4000002,0x32081400,0x80000080,
+0x4000000,0x32081499,0xf8000400,0x1040f,0x32081600,0x80000000,0,0x32081600,0x80000080,0,0x32081600,0x80000080,5,0x32081600,0xf8000480,0x10405,
+0x32081600,0xf8000480,0x28405,0x32081700,0x80000080,0x4000000,0x32081780,0x80000080,0x4000000,0x32081800,0x80000000,0x4000000,0x32081800,0x80000080,0x4000000,0x32081a80,
+0x80000000,0x4000000,0x32081b00,0x80000080,0x4000000,0x32081b80,0x80000000,0x4000000,0x32082a82,0xf8000400,0x18400,0x32083088,0xf8000400,0x10400,0x32083088,0xf8000400,
+0x28400,0x3208312a,0xf8000400,0x18400,0x320831ab,0xf8000400,0x18400,0x3208322c,0xf8000400,0x18400,0x320832ad,0xf8000400,0x18400,0x32083300,0x80000080,0x4000000,
+0x32083380,0x80000080,0x4000000,0x32083400,0x80000080,0x4000000,0x32083480,0x80000080,0x4000000,0x32083500,0x80000080,0x4000000,0x32083500,0x80000080,0x4000001,0x32083500,
+0x80000080,0x4000002,0x32101400,0x80000001,0x20002,0x32103180,0x80000000,0,0x32201c00,0x80000000,0x4008000,0x32203480,0x80000080,0x4008000,0x3221ab80,0x80000000,
+0x8011,0x32223300,0x80000080,0x4008000,0x32223480,0x80000080,0x4008000,0x32241581,0x20000,0x60,0x32241581,0x50020000,0x60,0x32241581,0x50020080,0x60,
+0x3224312a,0x50020400,0x60,0x3224312a,0x50060000,0x60,0x322431ab,0x50020400,0x60,0x322431ab,0x50060000,0x60,0x3224322c,0x50020400,0x60,0x322432ad,
+0x50020400,0x60,0x32248381,0x50020000,0x60,0x3224b601,0x50820000,0x2000060,0x32308381,0x50820000,0x60,0x323a9e80,0x80000000,0,0x323a9f14,0xf8000400,
+0x18010,0x323a9f96,0xf8000400,0x18c10,0x323aa200,0x80000000,3,0x323aa4a9,0x80000000,0,0x323aa791,0xf8000400,0x18401,0x323aa980,0x80000000,0x4000000,
+0x32481400,0x80000040,0x5024002,0x324a9e80,0xf8000400,0x18400,0x324a9e91,0xf8000400,0x18400,0x324a9f14,0xf8000400,0x18000,0x324a9f80,0x80000008,0xc00,0x324ab596,
+0xf8000400,0x18c00,0x32501c00,0x80000000,0x4008000,0x32503480,0x80000080,0x4008000,0x3251ab80,0x80000000,0x8011,0x32523300,0x80000080,0x4008000,0x32523480,0x80000080,
+0x4008000,0x32542882,0x80000000,8,0x32581500,0x80000000,0,0x32781400,0x800000,0xc820,0x40049b80,0x80000000,0x4000000,0x40080219,0xf8000400,0x10400,
+0x40080299,0xf8000400,0x10400,0x40080300,0x80001000,0,0x4008040e,0xf8000400,0x10400,0x4008040e,0xf8000400,0x28400,0x4008040e,0xf8000400,0x28402,0x40080600,
+0x800000,0xc820,0x40080602,0x80000000,0,0x40080602,0xf8000400,0x18400,0x400806a2,0xf8000400,0x18400,0x4008078a,0xf8000400,0x18400,0x40080804,0xf8000400,
+0x18400,0x4008090f,0xf8000400,0x18400,0x4008099f,0xf8000400,0x18400,0x40080a23,0x80000000,0,0x40080b15,0xf8000400,0x18400,0x40081217,0x80000000,0,
+0x40081400,0x80000008,0x4000000,0x40081400,0xd0000000,0x1c00,0x40081600,0x80000000,2,0x40081800,0x80000000,0x4000000,0x40081800,0x80000080,0x4000000,0x40081b80,
+0x80000000,0x4000000,0x40082880,0x80000000,0,0x40082d09,0xf8000400,0x10400,0x40082d09,0xf8000400,0x28400,0x40082e80,0xf8000480,0x10405,0x400837b0,0x80000000,
+0,0x400837b0,0xf8000400,0x18400,0x40083897,0x80000000,0,0x40083908,0xf8000400,0x10400,0x4008390e,0xf8000400,0x10400,0x4008390e,0xf8001400,0x1040e,
+0x4008390e,0xf8001400,0x1040f,0x40083919,0xf8000400,0x10400,0x40083919,0xf8001400,0x10400,0x40083919,0xf8001400,0x1040e,0x40083919,0xf8001400,0x1040f,0x40083980,
+0x80000000,0x4000000,0x40083a00,0x80000000,0,0x40083ab1,0xf8000400,0x18400,0x40083b31,0xf8000400,0x18400,0x40083b80,0x80000000,0,0x40083c35,0xf8000400,
+0x18400,0x40083cb3,0xf8000400,0x18400,0x40083d32,0xf8000400,0x18400,0x40083daf,0xf8000400,0x18400,0x40083e00,0x80000000,0,0x40089980,0x80000000,0,
+0x40103b80,0x80000000,0,0x40103c35,0x80000040,0,0x4022a980,0x80000000,0x8010,0x40240602,0x50020400,0x60,0x40240602,0x50021000,0x60,0x40240602,
+0x50021400,0x60,0x40240890,0x50020400,0x60,0x40240890,0xd0000400,0x18400,0x4024090f,0x50020400,0x60,0x40240b15,0x50021000,0x60,0x402437b0,0x50020400,
+0x60,0x402437b0,0x50021000,0x60,0x402437b0,0xd0000400,0x18400,0x40248381,0x50021000,0x60,0x4024be81,0x50820000,0x2000060,0x402c37b0,0x80000040,0x1024000,
+0x40308381,0x50021000,0x60,0x403aa200,0x80000000,0xd,0x403aa212,0x80000000,2,0x403aa212,0x80000000,3,0x403aa280,0x80000000,0xd,0x40400602,
+0x80000000,0x1400,0x404c37b0,0xd0000000,0x15800,0x404c3d32,0xd0000000,0x15800,0x4052a980,0x80000000,0x8010,0x4058090f,0x80000000,0,0x40580a23,0x80000000,
+0,0x40601217,0x50021000,0x60,0x40603834,0xf8000400,0x18000,0x41080219,0xf8000400,0x10400,0x41080219,0xf8000400,0x28400,0x4108040e,0xf8000400,0x10400,
+0x4108040e,0xf8000400,0x28400,0x41080488,0xf8000400,0x10400,0x41080488,0xf8000400,0x28400,0x4108078a,0xf8000400,0x18400,0x41080804,0xf8000400,0x18400,0x41080a23,
+0xf8000400,0x18400,0x41080e8c,0xf8000400,0x18400,0x41080e8c,0xf8000400,0x1840f,0x41080f8b,0x80000000,0,0x41080f8b,0xf8000400,0x18400,0x41081400,0x80000000,
+0x4000000,0x41081499,0xf8000400,0x1040e,0x41081600,0x80000000,0,0x41081600,0xf8000480,0x10405,0x41081800,0x80000000,0x4000000,0x41081b80,0x80000000,0x4000000,
+0x41082e80,0xf8000480,0x10405,0x41083300,0x80000080,0x4000000,0x41083908,0xf8000400,0x1040f,0x41083919,0xf8000400,0x10400,0x41083980,0x80000000,0x4000000,0x41083f0e,
+0x80000000,0,0x41083f8e,0x80000000,0,0x41083f8e,0xf8000400,0x18400,0x41084002,0xf8000400,0x18400,0x410840b7,0x80000000,0,0x410840b7,0xf8000400,
+0x18400,0x41084207,0x80000000,0,0x41084207,0xf8000400,0x10400,0x41084207,0xf8000400,0x28400,0x4108428b,0xf8000400,0x18400,0x4108430b,0x80000000,0,
+0x4108430b,0xf8000400,0x18400,0x4108438c,0xf8000400,0x10400,0x41084438,0xf8000400,0x10400,0x41084438,0xf8000400,0x28400,0x410844b9,0x80000000,0,0x410844b9,
+0xf8000400,0x18400,0x41084500,0x80000000,0,0x4108463d,0xf8000400,0x18400,0x4108468e,0xf8000400,0x1040f,0x41084699,0xf8000400,0x10400,0x41084699,0xf8000400,
+0x1040f,0x41084700,0x80000000,0x4000000,0x410847ba,0x80000000,0,0x410847ba,0xf8000400,0x18400,0x4108483c,0xf8000400,0x18400,0x4108483c,0xf8000400,0x1840f,
+0x41101400,0x80000000,0x4000000,0x411040b7,0x80000000,0,0x41104207,0x80000000,0,0x411044b9,0x80000000,0,0x4110463d,0x80000040,0,0x41104700,
+0x80000000,0x4000000,0x41104700,0x80000018,0x4000000,0x41140da7,0x80000000,0,0x41203300,0x80000080,0x4008000,0x4122c880,0x80000000,0x10,0x4122c880,0x80000000,
+0x8010,0x41240593,0x50020000,0x60,0x41240593,0x50020400,0x60,0x41240602,0x50020400,0x60,0x41240f8b,0x50020400,0x60,0x41241581,0x50020000,0x60,
+0x41243f0e,0x50020000,0x60,0x412440b7,0x50020400,0x60,0x412440b7,0xd0000400,0x18400,0x41244181,0x50020000,0x60,0x412444b9,0x50020000,0x60,0x412444b9,
+0x50020400,0x60,0x412444b9,0x50060000,0x60,0x412447ba,0x50020000,0x60,0x412447ba,0x50020400,0x60,0x412447ba,0x50060000,0x60,0x412447ba,0xd0000000,
+0,0x412447ba,0xd0000400,0x18400,0x41248381,0x50020000,0x60,0x412c0593,0x80000000,0,0x412c0602,0x80000000,0,0x412ec880,0x80000000,0x10,
+0x41308381,0x50020000,0x60,0x413aa200,0x80000000,3,0x413aa391,0xf8400c00,0x18000,0x413aa791,0xf8000c00,0x18001,0x413ac100,0x80000000,0,0x413ec880,
+0x80000000,0x10,0x4142c880,0x80000000,0x1410,0x414c0a23,0xd0000000,0x15800,0x414c45bb,0xd0000000,0x15800,0x41503300,0x80000080,0x4008000,0x4152c880,0x80000000,
+0x8010,0x41540602,0x80000000,0,0x41581500,0x80000000,0,0x415c4700,0x80000000,0x4008000,0x416045bb,0x80000000,0,0x416045bb,0xd0000400,0x18000,
+0x416045bb,0xf8000400,0x18000,0x50080219,0xf8000400,0x10400,0x50080219,0xf8000400,0x28400,0x5008040e,0xf8000400,0x10400,0x50080488,0xf8000400,0x10400,0x50080488,
+0xf8000400,0x28400,0x5008078a,0xf8000400,0x18400,0x50080b15,0x80000000,0,0x50081600,0x80000000,0,0x50081619,0xf8000400,0x10400,0x50081699,0xf8000400,
+0x10400,0x50081800,0x80000000,0x4000000,0x50081800,0x80000080,0x4000000,0x50081b80,0x80000000,0x4000000,0x50082e80,0xf8000480,0x10405,0x50082e80,0xf8000480,0x28405,
+0x50083088,0xf8000400,0x10400,0x50083088,0xf8000400,0x28400,0x50083300,0x80000080,0x4000000,0x50083980,0x80000000,0x4000000,0x50084500,0xf8001400,0x18400,0x50084957,
+0x80000000,0,0x50084957,0xf8000400,0x18400,0x50084957,0xf8001400,0x18400,0x50084957,0xf8002400,0x18400,0x500849be,0x80000000,0,0x500849be,0xf8000400,
+0x18400,0x500849be,0xf8000400,0x18401,0x50084a19,0xf8000400,0x10400,0x50084a19,0xf8000400,0x28400,0x50084a80,0x80001000,0,0x50084b5a,0xf8000400,0x18400,
+0x50084bdb,0x80000000,0,0x50084bdb,0xf8000400,0x18400,0x50084c65,0xf8000400,0x18400,0x50084ce5,0xf8000400,0x18400,0x50084d00,0x80000000,0,0x501049be,
+0x80000000,0,0x501049be,0x80000040,0,0x501049be,0x80000040,0x1024000,0x50104bdb,0x80000040,0,0x50104ce5,0x80000040,0,0x50144b5a,0x80000000,
+0,0x50240593,0x50021400,0x60,0x50240b15,0x50020400,0x60,0x50241581,0x50020080,0x60,0x50244181,0x50021000,0x60,0x50244957,0x50021000,0x60,
+0x502449be,0x50020400,0x60,0x502449be,0x50021000,0x60,0x502449be,0xd0000400,0x18400,0x502449be,0xd0000400,0x18401,0x502449be,0xd0041000,0,0x502c4957,
+0x80000040,0x1024000,0x502c4b5a,0x80000040,0x1024000,0x50404957,0x80000040,0x1400,0x504c4957,0xd0000000,0x15800,0x504c49be,0xd0000000,0x15800};
+#endif /* U_DARWIN */
+
+#ifndef U_DARWIN
+static const int32_t countPropsVectors=3384;
+#else /* U_DARWIN */
+static const int32_t countPropsVectors=3438;
+#endif /* U_DARWIN */
+static const int32_t propsVectorsColumns=3;
+#ifndef U_DARWIN
+static const int32_t indexes[UPROPS_INDEX_COUNT]={0x1a54,0x1a54,0x1a54,0x1a54,0x3b66,3,0x489e,0,0,0,0x8ecd67,0x29d31,0,0,0,0};
+#else /* U_DARWIN */
+static const int32_t indexes[UPROPS_INDEX_COUNT]={0x1aaa,0x1aaa,0x1aaa,0x1aaa,0x3c24,3,0x4992,0,0,0,0x8ecd67,0x29d31,0,0,0,0};
+#endif /* U_DARWIN */
+
diff --git a/icuSources/common/ucln_cmn.c b/icuSources/common/ucln_cmn.c
index c14b3dbc..452e628b 100644
--- a/icuSources/common/ucln_cmn.c
+++ b/icuSources/common/ucln_cmn.c
@@ -1,7 +1,7 @@
/*
******************************************************************************
* *
-* Copyright (C) 2001-2004, International Business Machines *
+* Copyright (C) 2001-2006, International Business Machines *
* Corporation and others. All Rights Reserved. *
* *
******************************************************************************
@@ -26,9 +26,11 @@
#include "uassert.h"
static cleanupFunc *gCommonCleanupFunctions[UCLN_COMMON_COUNT];
+static cleanupFunc *gLibCleanupFunctions[UCLN_COMMON];
-void ucln_common_registerCleanup(ECleanupCommonType type,
- cleanupFunc *func)
+U_CFUNC void
+ucln_common_registerCleanup(ECleanupCommonType type,
+ cleanupFunc *func)
{
U_ASSERT(UCLN_COMMON_START < type && type < UCLN_COMMON_COUNT);
if (UCLN_COMMON_START < type && type < UCLN_COMMON_COUNT)
@@ -37,10 +39,30 @@ void ucln_common_registerCleanup(ECleanupCommonType type,
}
}
-U_CFUNC UBool ucln_common_lib_cleanup(void) {
- ECleanupCommonType commonFunc;
+U_CAPI void U_EXPORT2
+ucln_registerCleanup(ECleanupLibraryType type,
+ cleanupFunc *func)
+{
+ U_ASSERT(UCLN_START < type && type < UCLN_COMMON);
+ if (UCLN_START < type && type < UCLN_COMMON)
+ {
+ gLibCleanupFunctions[type] = func;
+ }
+}
+
+U_CFUNC UBool ucln_lib_cleanup(void) {
+ ECleanupLibraryType libType = UCLN_START;
+ ECleanupCommonType commonFunc = UCLN_COMMON_START;
+
+ for (libType++; libTypetoc;
if(toc!=NULL) {
- const char *base=(const char *)pData->toc;
+ const char *base=(const char *)toc;
uint32_t start, limit, number, lastNumber;
int32_t strResult;
const UDataOffsetTOCEntry *entry;
@@ -120,13 +120,11 @@ offsetTOCLookupFn(const UDataMemory *pData,
limit=toc->count; /* number of names in this table of contents */
lastNumber=limit;
entry=toc->entry;
- if (limit == 0) { /* Stub common data library used during build is empty. */
- return NULL;
- }
for (;;) {
number = (start+limit)/2;
if (lastNumber == number) { /* Have we moved? */
- break; /* We haven't moved, and it wasn't found. */
+ break; /* We haven't moved, and it wasn't found; */
+ /* or the empty stub common data library was used during build. */
}
lastNumber = number;
strResult = uprv_strcmp(tocEntryName, base+entry[number].nameOffset);
@@ -165,11 +163,7 @@ offsetTOCLookupFn(const UDataMemory *pData,
static uint32_t pointerTOCEntryCount(const UDataMemory *pData) {
const PointerTOC *toc = (PointerTOC *)pData->toc;
- if (toc != NULL) {
- return toc->count;
- } else {
- return 0;
- }
+ return (uint32_t)((toc != NULL) ? (toc->count) : 0);
}
@@ -194,14 +188,11 @@ static const DataHeader *pointerTOCLookupFn(const UDataMemory *pData,
limit=toc->count;
lastNumber=limit;
- if (limit == 0) { /* Stub common data library used during build is empty. */
- return NULL;
- }
-
for (;;) {
number = (start+limit)/2;
if (lastNumber == number) { /* Have we moved? */
- break; /* We haven't moved, and it wasn't found. */
+ break; /* We haven't moved, and it wasn't found, */
+ /* or the empty stub common data library was used during build. */
}
lastNumber = number;
strResult = uprv_strcmp(name, toc->entry[number].entryName);
diff --git a/icuSources/common/ucmp8.c b/icuSources/common/ucmp8.c
deleted file mode 100644
index f22c2e13..00000000
--- a/icuSources/common/ucmp8.c
+++ /dev/null
@@ -1,572 +0,0 @@
-/*
-********************************************************************
-* COPYRIGHT:
-* Copyright (c) 1997-2004, International Business Machines Corporation and
-* others. All Rights Reserved.
-********************************************************************
-*/
-
-#include "ucmp8.h"
-#include "cmemory.h"
-
-/* internal constants*/
-
-
-U_CAPI int32_t U_EXPORT2
-ucmp8_getkUnicodeCount() { return UCMP8_kUnicodeCount;}
-
-U_CAPI int32_t U_EXPORT2
-ucmp8_getkBlockCount() { return UCMP8_kBlockCount;}
-
-U_CAPI void U_EXPORT2
-ucmp8_initBogus(CompactByteArray* array)
-{
- CompactByteArray* this_obj = array;
-
- if (this_obj == NULL) return;
-
- this_obj->fStructSize = sizeof(CompactByteArray);
- this_obj->fArray = NULL;
- this_obj->fIndex = NULL;
- this_obj->fCount = UCMP8_kUnicodeCount;
- this_obj->fCompact = FALSE;
- this_obj->fBogus = TRUE;
- this_obj->fAlias = FALSE;
- this_obj->fIAmOwned = TRUE;
-}
-
-/* debug flags*/
-/*=======================================================*/
-U_CAPI void U_EXPORT2
-ucmp8_init(CompactByteArray* array, int8_t defaultValue)
-{
-/* set up the index array and the data array.
- * the index array always points into particular parts of the data array
- * it is initially set up to point at regular block boundaries
- * The following example uses blocks of 4 for simplicity
- * Example: Expanded
- * INDEX# 0 1 2 3 4
- * INDEX 0 4 8 12 16 ...
- * ARRAY abcdeababcedzyabcdea...
- * | | | | | |...
- * whenever you set an element in the array, it unpacks to this state
- * After compression, the index will point to various places in the data array
- * wherever there is a runs of the same elements as in the original
- * Example: Compressed
- * INDEX# 0 1 2 3 4
- * INDEX 0 4 1 8 2 ...
- * ARRAY abcdeabazyabc...
- * If you look at the example, index# 2 in the expanded version points
- * to data position number 8, which has elements "bced". In the compressed
- * version, index# 2 points to data position 1, which also has "bced"
- */
- CompactByteArray* this_obj = array;
- int32_t i;
-
- if (this_obj == NULL) return;
-
- this_obj->fStructSize = sizeof(CompactByteArray);
- this_obj->fArray = NULL;
- this_obj->fIndex = NULL;
- this_obj->fCount = UCMP8_kUnicodeCount;
- this_obj->fCompact = FALSE;
- this_obj->fBogus = FALSE;
- this_obj->fAlias = FALSE;
- this_obj->fIAmOwned = TRUE;
-
-
- this_obj->fArray = (int8_t*) uprv_malloc(sizeof(int8_t) * UCMP8_kUnicodeCount);
- if (!this_obj->fArray)
- {
- this_obj->fBogus = TRUE;
- return;
- }
- this_obj->fIndex = (uint16_t*) uprv_malloc(sizeof(uint16_t) * UCMP8_kIndexCount);
- if (!this_obj->fIndex)
- {
- uprv_free(this_obj->fArray);
- this_obj->fArray = NULL;
- this_obj->fBogus = TRUE;
- return;
- }
- for (i = 0; i < UCMP8_kUnicodeCount; ++i)
- {
- this_obj->fArray[i] = defaultValue;
- }
- for (i = 0; i < UCMP8_kIndexCount; ++i)
- {
- this_obj->fIndex[i] = (uint16_t)(i << UCMP8_kBlockShift);
- }
-}
-
-U_CAPI CompactByteArray* U_EXPORT2
-ucmp8_open(int8_t defaultValue)
-{
-/* set up the index array and the data array.
- * the index array always points into particular parts of the data array
- * it is initially set up to point at regular block boundaries
- * The following example uses blocks of 4 for simplicity
- * Example: Expanded
- * INDEX# 0 1 2 3 4
- * INDEX 0 4 8 12 16 ...
- * ARRAY abcdeababcedzyabcdea...
- * | | | | | |...
- * whenever you set an element in the array, it unpacks to this state
- * After compression, the index will point to various places in the data array
- * wherever there is a runs of the same elements as in the original
- * Example: Compressed
- * INDEX# 0 1 2 3 4
- * INDEX 0 4 1 8 2 ...
- * ARRAY abcdeabazyabc...
- * If you look at the example, index# 2 in the expanded version points
- * to data position number 8, which has elements "bced". In the compressed
- * version, index# 2 points to data position 1, which also has "bced"
- */
- CompactByteArray* this_obj = (CompactByteArray*) uprv_malloc(sizeof(CompactByteArray));
- int32_t i;
-
- if (this_obj == NULL) return NULL;
-
- this_obj->fStructSize = sizeof(CompactByteArray);
- this_obj->fArray = NULL;
- this_obj->fIndex = NULL;
- this_obj->fCount = UCMP8_kUnicodeCount;
- this_obj->fCompact = FALSE;
- this_obj->fBogus = FALSE;
- this_obj->fAlias = FALSE;
- this_obj->fIAmOwned = FALSE;
-
-
- this_obj->fArray = (int8_t*) uprv_malloc(sizeof(int8_t) * UCMP8_kUnicodeCount);
- if (!this_obj->fArray)
- {
- this_obj->fBogus = TRUE;
- return NULL;
- }
- this_obj->fIndex = (uint16_t*) uprv_malloc(sizeof(uint16_t) * UCMP8_kIndexCount);
- if (!this_obj->fIndex)
- {
- uprv_free(this_obj->fArray);
- this_obj->fArray = NULL;
- this_obj->fBogus = TRUE;
- return NULL;
- }
- for (i = 0; i < UCMP8_kUnicodeCount; ++i)
- {
- this_obj->fArray[i] = defaultValue;
- }
- for (i = 0; i < UCMP8_kIndexCount; ++i)
- {
- this_obj->fIndex[i] = (uint16_t)(i << UCMP8_kBlockShift);
- }
-
- return this_obj;
-}
-
-U_CAPI CompactByteArray* U_EXPORT2
-ucmp8_openAdopt(uint16_t *indexArray,
- int8_t *newValues,
- int32_t count)
-{
- CompactByteArray* this_obj = (CompactByteArray*) uprv_malloc(sizeof(CompactByteArray));
- /* test for NULL */
- if(this_obj == NULL)
- return NULL;
- ucmp8_initAdopt(this_obj, indexArray, newValues, count);
- this_obj->fIAmOwned = FALSE;
- return this_obj;
-}
-
-U_CAPI CompactByteArray* U_EXPORT2
-ucmp8_openAlias(uint16_t *indexArray,
- int8_t *newValues,
- int32_t count)
-{
- CompactByteArray* this_obj = (CompactByteArray*) uprv_malloc(sizeof(CompactByteArray));
- /* test for NULL */
- if(this_obj == NULL)
- return NULL;
- ucmp8_initAlias(this_obj, indexArray, newValues, count);
- this_obj->fIAmOwned = FALSE;
- return this_obj;
-}
-
-/*=======================================================*/
-
-U_CAPI CompactByteArray* U_EXPORT2
-ucmp8_initAdopt(CompactByteArray *this_obj,
- uint16_t *indexArray,
- int8_t *newValues,
- int32_t count)
-{
- if (this_obj) {
- this_obj->fCount = count;
- this_obj->fBogus = FALSE;
- this_obj->fStructSize = sizeof(CompactByteArray);
-
- this_obj->fArray = newValues;
- this_obj->fIndex = indexArray;
- this_obj->fCompact = (UBool)((count < UCMP8_kUnicodeCount) ? TRUE : FALSE);
- this_obj->fAlias = FALSE;
- this_obj->fIAmOwned = TRUE;
- }
-
- return this_obj;
-}
-
-U_CAPI CompactByteArray* U_EXPORT2
-ucmp8_initAlias(CompactByteArray *this_obj,
- uint16_t *indexArray,
- int8_t *newValues,
- int32_t count)
-{
- if (this_obj) {
- this_obj->fArray = NULL;
- this_obj->fIndex = NULL;
- this_obj->fCount = count;
- this_obj->fBogus = FALSE;
- this_obj->fStructSize = sizeof(CompactByteArray);
-
- this_obj->fArray = newValues;
- this_obj->fIndex = indexArray;
- this_obj->fCompact = (UBool)((count < UCMP8_kUnicodeCount) ? TRUE : FALSE);
- this_obj->fAlias = TRUE;
- this_obj->fIAmOwned = TRUE;
- }
-
- return this_obj;
-}
-
-/*=======================================================*/
-
-U_CAPI void U_EXPORT2
-ucmp8_close(CompactByteArray* this_obj)
-{
- if(this_obj != NULL) {
- if(!this_obj->fAlias) {
- if(this_obj->fArray != NULL) {
- uprv_free(this_obj->fArray);
- }
- if(this_obj->fIndex != NULL) {
- uprv_free(this_obj->fIndex);
- }
- }
- if(!this_obj->fIAmOwned) /* Called if 'init' was called instead of 'open'. */
- {
- uprv_free(this_obj);
- }
- }
-}
-
-
-/*=======================================================*/
-
-U_CAPI void U_EXPORT2
-ucmp8_expand(CompactByteArray* this_obj)
-{
- /* can optimize later.
- * if we have to expand, then walk through the blocks instead of using Get
- * this code unpacks the array by copying the blocks to the normalized position.
- * Example: Compressed
- * INDEX# 0 1 2 3 4
- * INDEX 0 4 1 8 2 ...
- * ARRAY abcdeabazyabc...
- * turns into
- * Example: Expanded
- * INDEX# 0 1 2 3 4
- * INDEX 0 4 8 12 16 ...
- * ARRAY abcdeababcedzyabcdea...
- */
- int32_t i;
- if (this_obj->fCompact)
- {
- int8_t* tempArray;
- tempArray = (int8_t*) uprv_malloc(sizeof(int8_t) * UCMP8_kUnicodeCount);
- if (!tempArray)
- {
- this_obj->fBogus = TRUE;
- return;
- }
- for (i = 0; i < UCMP8_kUnicodeCount; ++i)
- {
- tempArray[i] = ucmp8_get(this_obj,(UChar)i); /* HSYS : How expand?*/
- }
- for (i = 0; i < UCMP8_kIndexCount; ++i)
- {
- this_obj->fIndex[i] = (uint16_t)(i<< UCMP8_kBlockShift);
- }
- uprv_free(this_obj->fArray);
- this_obj->fArray = tempArray;
- this_obj->fCompact = FALSE;
- this_obj->fAlias = FALSE;
-
- }
-}
-
-
-/*=======================================================*/
-/* this_obj->fArray: an array to be overlapped
- * start and count: specify the block to be overlapped
- * tempIndex: the overlapped array (actually indices back into inputContents)
- * inputHash: an index of hashes for tempIndex, where
- * inputHash[i] = XOR of values from i-count+1 to i
- */
-static int32_t
-findOverlappingPosition(CompactByteArray* this_obj,
- uint32_t start,
- const UChar* tempIndex,
- int32_t tempIndexCount,
- uint32_t cycle)
-{
- /* this_obj is a utility routine for finding blocks that overlap.
- * IMPORTANT: the cycle number is very important. Small cycles take a lot
- * longer to work. In some cases, they may be able to get better compaction.
- */
-
- int32_t i;
- int32_t j;
- int32_t currentCount;
-
- for (i = 0; i < tempIndexCount; i += cycle)
- {
- currentCount = UCMP8_kBlockCount;
- if (i + UCMP8_kBlockCount > tempIndexCount)
- {
- currentCount = tempIndexCount - i;
- }
- for (j = 0; j < currentCount; ++j)
- {
- if (this_obj->fArray[start + j] != this_obj->fArray[tempIndex[i + j]])
- break;
- }
- if (j == currentCount)
- break;
- }
-
- return i;
-}
-
-U_CAPI UBool U_EXPORT2
-ucmp8_isBogus(const CompactByteArray* this_obj)
-{
- return (UBool)(this_obj == NULL || this_obj->fBogus);
-}
-
-U_CAPI const int8_t* U_EXPORT2
-ucmp8_getArray(const CompactByteArray* this_obj)
-{
- return this_obj->fArray;
-}
-
-U_CAPI const uint16_t* U_EXPORT2
-ucmp8_getIndex(const CompactByteArray* this_obj)
-{
- return this_obj->fIndex;
-}
-
-U_CAPI int32_t U_EXPORT2
-ucmp8_getCount(const CompactByteArray* this_obj)
-{
- return this_obj->fCount;
-}
-
-
-U_CAPI void U_EXPORT2
-ucmp8_set(CompactByteArray* this_obj,
- UChar c,
- int8_t value)
-{
- if (this_obj->fCompact == TRUE)
- {
- ucmp8_expand(this_obj);
- if (this_obj->fBogus) return;
- }
- this_obj->fArray[(int32_t)c] = value;
-}
-
-
-U_CAPI void U_EXPORT2
-ucmp8_setRange(CompactByteArray* this_obj,
- UChar start,
- UChar end,
- int8_t value)
-{
- int32_t i;
- if (this_obj->fCompact == TRUE)
- {
- ucmp8_expand(this_obj);
- if (this_obj->fBogus)
- return;
- }
- for (i = start; i <= end; ++i)
- {
- this_obj->fArray[i] = value;
- }
-}
-
-
-/*=======================================================*/
-
-U_CAPI void U_EXPORT2
-ucmp8_compact(CompactByteArray* this_obj,
- uint32_t cycle)
-{
- if (!this_obj->fCompact)
- {
- /* this_obj actually does the compaction.
- * it walks throught the contents of the expanded array, finding the
- * first block in the data that matches the contents of the current index.
- * As it works, it keeps an updated pointer to the last position,
- * so that it knows how big to make the final array
- * If the matching succeeds, then the index will point into the data
- * at some earlier position.
- * If the matching fails, then last position pointer will be bumped,
- * and the index will point to that last block of data.
- */
- UChar* tempIndex;
- int32_t tempIndexCount;
- int8_t* tempArray;
- int32_t iBlock, iIndex;
-
- /* fix cycle, must be 0 < cycle <= blockcount*/
- if (cycle <= 0)
- cycle = 1;
- else if (cycle > (uint32_t)UCMP8_kBlockCount)
- cycle = UCMP8_kBlockCount;
-
- /* make temp storage, larger than we need*/
- tempIndex = (UChar*) uprv_malloc(sizeof(UChar)* UCMP8_kUnicodeCount);
- if (!tempIndex)
- {
- this_obj->fBogus = TRUE;
- return;
- }
- /* set up first block.*/
- tempIndexCount = UCMP8_kBlockCount;
- for (iIndex = 0; iIndex < UCMP8_kBlockCount; ++iIndex)
- {
- tempIndex[iIndex] = (uint16_t)iIndex;
- } /* endfor (iIndex = 0; .....)*/
- this_obj->fIndex[0] = 0;
-
- /* for each successive block, find out its first position in the compacted array*/
- for (iBlock = 1; iBlock < UCMP8_kIndexCount; ++iBlock)
- {
- int32_t newCount, firstPosition, block;
- block = iBlock << UCMP8_kBlockShift;
- /* if (debugSmall) if (block > debugSmallLimit) break;*/
- firstPosition = findOverlappingPosition(this_obj,
- block,
- tempIndex,
- tempIndexCount,
- cycle);
-
- /* if not contained in the current list, copy the remainder
- * invariant; cumulativeHash[iBlock] = XOR of values from iBlock-kBlockCount+1 to iBlock
- * we do this_obj by XORing out cumulativeHash[iBlock-kBlockCount]
- */
- newCount = firstPosition + UCMP8_kBlockCount;
- if (newCount > tempIndexCount)
- {
- for (iIndex = tempIndexCount; iIndex < newCount; ++iIndex)
- {
- tempIndex[iIndex] = (uint16_t)(iIndex - firstPosition + block);
- } /* endfor (iIndex = tempIndexCount....)*/
- tempIndexCount = newCount;
- } /* endif (newCount > tempIndexCount)*/
- this_obj->fIndex[iBlock] = (uint16_t)firstPosition;
- } /* endfor (iBlock = 1.....)*/
-
- /* now allocate and copy the items into the array*/
- tempArray = (int8_t*) uprv_malloc(tempIndexCount * sizeof(int8_t));
- if (!tempArray)
- {
- this_obj->fBogus = TRUE;
- uprv_free(tempIndex);
- return;
- }
- for (iIndex = 0; iIndex < tempIndexCount; ++iIndex)
- {
- tempArray[iIndex] = this_obj->fArray[tempIndex[iIndex]];
- }
- uprv_free(this_obj->fArray);
- this_obj->fArray = tempArray;
- this_obj->fCount = tempIndexCount;
-
-
- /* free up temp storage*/
- uprv_free(tempIndex);
- this_obj->fCompact = TRUE;
- } /* endif (!this_obj->fCompact)*/
-}
-
-#define MEMORY_WRITE(destAddr, source, sizeSoFar, len) \
- if (destAddr) {\
- uprv_memcpy(destAddr+sizeSoFar, source, len);\
- }\
- sizeSoFar += (len)
-
-U_CAPI uint32_t U_EXPORT2 ucmp8_flattenMem (const CompactByteArray* array, uint8_t *MS)
-{
- int32_t size = 0;
- static const int32_t version = ICU_UCMP8_VERSION;
-
- MEMORY_WRITE(MS, &version, size, 4);
-
- MEMORY_WRITE(MS, &array->fCount, size, 4);
-
- MEMORY_WRITE(MS, array->fIndex, size, sizeof(array->fIndex[0])*UCMP8_kIndexCount);
-
- MEMORY_WRITE(MS, array->fArray, size, sizeof(array->fArray[0])*array->fCount);
-
- while(size%4) /* end padding */
- {
- uint8_t pad = 0;
- MEMORY_WRITE(MS, &pad, size, 1);
- }
-
- return size;
-}
-
-/* We use sizeof(*array), etc so that this code can be as portable as
- possible between the ucmpX_ family.
-*/
-
-U_CAPI void U_EXPORT2 ucmp8_initFromData(CompactByteArray *this_obj, const uint8_t **source, UErrorCode *status)
-{
- uint32_t i;
- const uint8_t *oldSource = *source;
-
- if(U_FAILURE(*status))
- return;
-
- this_obj->fArray = NULL;
- this_obj->fIndex = NULL;
- this_obj->fBogus = FALSE;
- this_obj->fStructSize = sizeof(CompactByteArray);
- this_obj->fCompact = TRUE;
- this_obj->fAlias = TRUE;
- this_obj->fIAmOwned = TRUE;
-
- i = * ((const uint32_t*) *source);
- (*source) += 4;
-
- if(i != ICU_UCMP8_VERSION)
- {
- *status = U_INVALID_FORMAT_ERROR;
- return;
- }
-
- this_obj->fCount = * ((const uint32_t*)*source);
- (*source) += 4;
-
- this_obj->fIndex = (uint16_t*) *source;
- (*source) += sizeof(this_obj->fIndex[0])*UCMP8_kIndexCount;
-
- this_obj->fArray = (int8_t*) *source;
- (*source) += sizeof(this_obj->fArray[0])*this_obj->fCount;
-
- /* eat up padding */
- while((*source-(oldSource))%4)
- (*source)++;
-}
diff --git a/icuSources/common/ucmp8.h b/icuSources/common/ucmp8.h
deleted file mode 100644
index b4951825..00000000
--- a/icuSources/common/ucmp8.h
+++ /dev/null
@@ -1,244 +0,0 @@
-/*
- ********************************************************************
- * COPYRIGHT:
- * Copyright (c) 1996-2004, International Business Machines Corporation and
- * others. All Rights Reserved.
- ********************************************************************
- */
-
-
-
-#ifndef UCMP8_H
-#define UCMP8_H
-
-/* 32-bits.
- Bump this whenever the internal structure changes.
-*/
-#define ICU_UCMP8_VERSION 0x01260000
-
-#include "unicode/utypes.h"
-
-/*====================================
- * class CompactByteArray
- * Provides a compact way to store information that is indexed by Unicode values,
- * such as character properties, types, keyboard values, etc.
- * The ATypes are used by value, so should be small, integers or pointers.
- *====================================
- */
-
-U_CAPI int32_t U_EXPORT2 ucmp8_getkUnicodeCount(void);
-U_CAPI int32_t U_EXPORT2 ucmp8_getkBlockCount(void);
-
-typedef struct CompactByteArray {
- uint32_t fStructSize;
- int8_t* fArray;
- uint16_t* fIndex;
- int32_t fCount;
- UBool fCompact;
- UBool fBogus;
- UBool fAlias;
- UBool fIAmOwned; /* don't free CBA on close */
-} CompactByteArray;
-
-#define UCMP8_kUnicodeCount 65536
-#define UCMP8_kBlockShift 7
-#define UCMP8_kBlockCount (1<fArray[(array->fIndex[index >> UCMP8_kBlockShift] & 0xFFFF) + (index & UCMP8_kBlockMask)])
-
-#define ucmp8_getu(array,index) (uint8_t)ucmp8_get(array,index)
-
-
-/**
- * Set a new value for a Unicode character.
- * Set automatically expands the array if it is compacted.
- *
- * @param array the CompactByteArray to be set
- * @param character the character to set the mapped value with
- * @param value the new mapped value
- */
-U_CAPI void U_EXPORT2 ucmp8_set(CompactByteArray* array,
- UChar character,
- int8_t value);
-
-/**
- * Set new values for a range of Unicode character.
- *
- * @param array the CompactByteArray to be set
- * @param start the starting offset of the range
- * @param end the ending offset of the range
- * @param value the new mapped value
- */
-U_CAPI void U_EXPORT2 ucmp8_setRange(CompactByteArray* array,
- UChar start,
- UChar end,
- int8_t value);
-
-U_CAPI int32_t U_EXPORT2 ucmp8_getCount(const CompactByteArray* array);
-U_CAPI const int8_t* U_EXPORT2 ucmp8_getArray(const CompactByteArray* array);
-U_CAPI const uint16_t* U_EXPORT2 ucmp8_getIndex(const CompactByteArray* array);
-
-/**
- * Compact the array.
- * The value of cycle determines how large the overlap can be.
- * A cycle of 1 is the most compacted, but takes the most time to do.
- * If values stored in the array tend to repeat in cycles of, say, 16,
- * then using that will be faster than cycle = 1, and get almost the
- * same compression.
- * @param array The CompactByteArray to be compacted
- * @param cycle The value determines how large the overlap can be.
- */
-U_CAPI void U_EXPORT2 ucmp8_compact(CompactByteArray* array,
- uint32_t cycle);
-
-/** Expanded takes the array back to a 65536 element array
- * @param array The CompactByteArray to be expanded
- */
-U_CAPI void U_EXPORT2 ucmp8_expand(CompactByteArray* array);
-
-/**
- * Flatten into a memory structure. Pass in NULL to pre-flight to get the required size.
- * @internal
- */
-U_CAPI uint32_t U_EXPORT2 ucmp8_flattenMem(const CompactByteArray* array, uint8_t *MS);
-
-/* initializes an existing CBA from memory. Will cause ucmp8_close() to not deallocate anything. */
-U_CAPI void U_EXPORT2 ucmp8_initFromData(CompactByteArray* array, const uint8_t **source, UErrorCode *status);
-
-#endif
-
diff --git a/icuSources/common/ucnv.c b/icuSources/common/ucnv.c
index 635c78fa..ff6eebaf 100644
--- a/icuSources/common/ucnv.c
+++ b/icuSources/common/ucnv.c
@@ -1,7 +1,7 @@
/*
******************************************************************************
*
-* Copyright (C) 1998-2004, International Business Machines
+* Copyright (C) 1998-2006, International Business Machines
* Corporation and others. All Rights Reserved.
*
******************************************************************************
@@ -34,7 +34,6 @@
#include "utracimp.h"
#include "ustr_imp.h"
#include "ucnv_imp.h"
-#include "ucnv_io.h"
#include "ucnv_cnv.h"
#include "ucnv_bld.h"
@@ -56,17 +55,6 @@ static const UAmbiguousConverter ambiguousConverters[]={
{ "ISO_2022,locale=ko,version=0", 0x20a9 }
};
-U_CAPI const char* U_EXPORT2
-ucnv_getDefaultName ()
-{
- return ucnv_io_getDefaultConverterName();
-}
-
-U_CAPI void U_EXPORT2
-ucnv_setDefaultName (const char *converterName)
-{
- ucnv_io_setDefaultConverterName(converterName);
-}
/*Calls through createConverter */
U_CAPI UConverter* U_EXPORT2
ucnv_open (const char *name,
@@ -107,6 +95,28 @@ ucnv_openU (const UChar * name,
return ucnv_open(u_austrcpy(asciiName, name), err);
}
+/* Copy the string that is represented by the UConverterPlatform enum
+ * @param platformString An output buffer
+ * @param platform An enum representing a platform
+ * @return the length of the copied string.
+ */
+static int32_t
+ucnv_copyPlatformString(char *platformString, UConverterPlatform pltfrm)
+{
+ switch (pltfrm)
+ {
+ case UCNV_IBM:
+ uprv_strcpy(platformString, "ibm-");
+ return 4;
+ case UCNV_UNKNOWN:
+ break;
+ }
+
+ /* default to empty string */
+ *platformString = 0;
+ return 0;
+}
+
/*Assumes a $platform-#codepage.$CONVERTER_FILE_EXTENSION scheme and calls
*through createConverter*/
U_CAPI UConverter* U_EXPORT2
@@ -239,6 +249,19 @@ ucnv_safeClone(const UConverter* cnv, void *stackBuffer, int32_t *pBufferSize, U
uprv_memcpy(localConverter, cnv, sizeof(UConverter));
localConverter->isCopyLocal = localConverter->isExtraLocal = FALSE;
+ /* copy the substitution string */
+ if (cnv->subChars == (uint8_t *)cnv->subUChars) {
+ localConverter->subChars = (uint8_t *)localConverter->subUChars;
+ } else {
+ localConverter->subChars = (uint8_t *)uprv_malloc(UCNV_ERROR_BUFFER_LENGTH * U_SIZEOF_UCHAR);
+ if (localConverter->subChars == NULL) {
+ uprv_free(allocatedConverter);
+ UTRACE_EXIT_STATUS(*status);
+ return NULL;
+ }
+ uprv_memcpy(localConverter->subChars, cnv->subChars, UCNV_ERROR_BUFFER_LENGTH * U_SIZEOF_UCHAR);
+ }
+
/* now either call the safeclone fcn or not */
if (cnv->sharedData->impl->safeClone != NULL) {
/* call the custom safeClone function */
@@ -246,6 +269,9 @@ ucnv_safeClone(const UConverter* cnv, void *stackBuffer, int32_t *pBufferSize, U
}
if(localConverter==NULL || U_FAILURE(*status)) {
+ if (allocatedConverter != NULL && allocatedConverter->subChars != (uint8_t *)allocatedConverter->subUChars) {
+ uprv_free(allocatedConverter->subChars);
+ }
uprv_free(allocatedConverter);
UTRACE_EXIT_STATUS(*status);
return NULL;
@@ -285,27 +311,6 @@ ucnv_safeClone(const UConverter* cnv, void *stackBuffer, int32_t *pBufferSize, U
U_CAPI void U_EXPORT2
ucnv_close (UConverter * converter)
{
- /* first, notify the callback functions that the converter is closed */
- UConverterToUnicodeArgs toUArgs = {
- sizeof(UConverterToUnicodeArgs),
- TRUE,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL
- };
- UConverterFromUnicodeArgs fromUArgs = {
- sizeof(UConverterFromUnicodeArgs),
- TRUE,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL
- };
UErrorCode errorCode = U_ZERO_ERROR;
UTRACE_ENTRY_OC(UTRACE_UCNV_CLOSE);
@@ -319,16 +324,50 @@ ucnv_close (UConverter * converter)
UTRACE_DATA3(UTRACE_OPEN_CLOSE, "close converter %s at %p, isCopyLocal=%b",
ucnv_getName(converter, &errorCode), converter, converter->isCopyLocal);
- toUArgs.converter = fromUArgs.converter = converter;
+ /* In order to speed up the close, only call the callbacks when they have been changed.
+ This performance check will only work when the callbacks are set within a shared library
+ or from user code that statically links this code. */
+ /* first, notify the callback functions that the converter is closed */
+ if (converter->fromCharErrorBehaviour != UCNV_TO_U_DEFAULT_CALLBACK) {
+ UConverterToUnicodeArgs toUArgs = {
+ sizeof(UConverterToUnicodeArgs),
+ TRUE,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ };
- converter->fromCharErrorBehaviour(converter->toUContext, &toUArgs, NULL, 0, UCNV_CLOSE, &errorCode);
- errorCode = U_ZERO_ERROR;
- converter->fromUCharErrorBehaviour(converter->fromUContext, &fromUArgs, NULL, 0, 0, UCNV_CLOSE, &errorCode);
+ toUArgs.converter = converter;
+ errorCode = U_ZERO_ERROR;
+ converter->fromCharErrorBehaviour(converter->toUContext, &toUArgs, NULL, 0, UCNV_CLOSE, &errorCode);
+ }
+ if (converter->fromUCharErrorBehaviour != UCNV_FROM_U_DEFAULT_CALLBACK) {
+ UConverterFromUnicodeArgs fromUArgs = {
+ sizeof(UConverterFromUnicodeArgs),
+ TRUE,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ };
+ fromUArgs.converter = converter;
+ errorCode = U_ZERO_ERROR;
+ converter->fromUCharErrorBehaviour(converter->fromUContext, &fromUArgs, NULL, 0, 0, UCNV_CLOSE, &errorCode);
+ }
if (converter->sharedData->impl->close != NULL) {
converter->sharedData->impl->close(converter);
}
+ if (converter->subChars != (uint8_t *)converter->subUChars) {
+ uprv_free(converter->subChars);
+ }
+
/*
Checking whether it's an algorithic converter is okay
in multithreaded applications because the value never changes.
@@ -339,7 +378,7 @@ ucnv_close (UConverter * converter)
}
if(!converter->isCopyLocal){
- uprv_free (converter);
+ uprv_free(converter);
}
UTRACE_EXIT();
@@ -350,47 +389,21 @@ ucnv_close (UConverter * converter)
U_CAPI const char* U_EXPORT2
ucnv_getAvailableName (int32_t n)
{
- if (0 <= n && n <= 0xffff) {
- UErrorCode err = U_ZERO_ERROR;
- const char *name = ucnv_io_getAvailableConverter((uint16_t)n, &err);
- if (U_SUCCESS(err)) {
- return name;
+ if (0 <= n && n <= 0xffff) {
+ UErrorCode err = U_ZERO_ERROR;
+ const char *name = ucnv_bld_getAvailableConverter((uint16_t)n, &err);
+ if (U_SUCCESS(err)) {
+ return name;
+ }
}
- }
- return NULL;
+ return NULL;
}
U_CAPI int32_t U_EXPORT2
ucnv_countAvailable ()
{
UErrorCode err = U_ZERO_ERROR;
- return ucnv_io_countAvailableConverters(&err);
-}
-
-U_CAPI uint16_t U_EXPORT2
-ucnv_countAliases(const char *alias, UErrorCode *pErrorCode)
-{
- return ucnv_io_countAliases(alias, pErrorCode);
-}
-
-
-U_CAPI const char* U_EXPORT2
-ucnv_getAlias(const char *alias, uint16_t n, UErrorCode *pErrorCode)
-{
- return ucnv_io_getAlias(alias, n, pErrorCode);
-}
-
-U_CAPI void U_EXPORT2
-ucnv_getAliases(const char *alias, const char **aliases, UErrorCode *pErrorCode)
-{
- ucnv_io_getAliases(alias, 0, aliases, pErrorCode);
-}
-
-U_CAPI uint16_t U_EXPORT2
-ucnv_countStandards(void)
-{
- UErrorCode err = U_ZERO_ERROR;
- return ucnv_io_countStandards(&err);
+ return ucnv_bld_countAvailableConverters(&err);
}
U_CAPI void U_EXPORT2
@@ -402,15 +415,19 @@ ucnv_getSubstChars (const UConverter * converter,
if (U_FAILURE (*err))
return;
+ if (converter->subCharLen <= 0) {
+ /* Unicode string or empty string from ucnv_setSubstString(). */
+ *len = 0;
+ return;
+ }
+
if (*len < converter->subCharLen) /*not enough space in subChars */
{
*err = U_INDEX_OUTOFBOUNDS_ERROR;
return;
}
- uprv_memcpy (mySubChar, converter->subChar, converter->subCharLen); /*fills in the subchars */
- *len = converter->subCharLen; /*store # of bytes copied to buffer */
- uprv_memcpy (mySubChar, converter->subChar, converter->subCharLen); /*fills in the subchars */
+ uprv_memcpy (mySubChar, converter->subChars, converter->subCharLen); /*fills in the subchars */
*len = converter->subCharLen; /*store # of bytes copied to buffer */
}
@@ -431,7 +448,7 @@ ucnv_setSubstChars (UConverter * converter,
return;
}
- uprv_memcpy (converter->subChar, mySubChar, len); /*copies the subchars */
+ uprv_memcpy (converter->subChars, mySubChar, len); /*copies the subchars */
converter->subCharLen = len; /*sets the new len */
/*
@@ -444,6 +461,93 @@ ucnv_setSubstChars (UConverter * converter,
return;
}
+U_DRAFT void U_EXPORT2
+ucnv_setSubstString(UConverter *cnv,
+ const UChar *s,
+ int32_t length,
+ UErrorCode *err) {
+ UAlignedMemory cloneBuffer[U_CNV_SAFECLONE_BUFFERSIZE / sizeof(UAlignedMemory) + 1];
+ char chars[UCNV_ERROR_BUFFER_LENGTH];
+
+ UConverter *clone;
+ uint8_t *subChars;
+ int32_t cloneSize, length8;
+
+ /* Let the following functions check all arguments. */
+ cloneSize = sizeof(cloneBuffer);
+ clone = ucnv_safeClone(cnv, cloneBuffer, &cloneSize, err);
+ ucnv_setFromUCallBack(clone, UCNV_FROM_U_CALLBACK_STOP, NULL, NULL, NULL, err);
+ length8 = ucnv_fromUChars(clone, chars, (int32_t)sizeof(chars), s, length, err);
+ ucnv_close(clone);
+ if (U_FAILURE(*err)) {
+ return;
+ }
+
+ if (cnv->sharedData->impl->writeSub == NULL
+#if !UCONFIG_NO_LEGACY_CONVERSION
+ || (cnv->sharedData->staticData->conversionType == UCNV_MBCS &&
+ ucnv_MBCSGetType(cnv) != UCNV_EBCDIC_STATEFUL)
+#endif
+ ) {
+ /* The converter is not stateful. Store the charset bytes as a fixed string. */
+ subChars = (uint8_t *)chars;
+ } else {
+ /*
+ * The converter has a non-default writeSub() function, indicating
+ * that it is stateful.
+ * Store the Unicode string for on-the-fly conversion for correct
+ * state handling.
+ */
+ if (length > UCNV_ERROR_BUFFER_LENGTH) {
+ /*
+ * Should not occur. The converter should output at least one byte
+ * per UChar, which means that ucnv_fromUChars() should catch all
+ * overflows.
+ */
+ *err = U_BUFFER_OVERFLOW_ERROR;
+ return;
+ }
+ subChars = (uint8_t *)s;
+ if (length < 0) {
+ length = u_strlen(s);
+ }
+ length8 = length * U_SIZEOF_UCHAR;
+ }
+
+ /*
+ * For storing the substitution string, select either the small buffer inside
+ * UConverter or allocate a subChars buffer.
+ */
+ if (length8 > UCNV_MAX_SUBCHAR_LEN) {
+ /* Use a separate buffer for the string. Outside UConverter to not make it too large. */
+ if (cnv->subChars == (uint8_t *)cnv->subUChars) {
+ /* Allocate a new buffer for the string. */
+ cnv->subChars = (uint8_t *)uprv_malloc(UCNV_ERROR_BUFFER_LENGTH * U_SIZEOF_UCHAR);
+ if (cnv->subChars == NULL) {
+ cnv->subChars = (uint8_t *)cnv->subUChars;
+ *err = U_MEMORY_ALLOCATION_ERROR;
+ return;
+ }
+ uprv_memset(cnv->subChars, 0, UCNV_ERROR_BUFFER_LENGTH * U_SIZEOF_UCHAR);
+ }
+ }
+
+ /* Copy the substitution string into the UConverter or its subChars buffer. */
+ if (length8 == 0) {
+ cnv->subCharLen = 0;
+ } else {
+ uprv_memcpy(cnv->subChars, subChars, length8);
+ if (subChars == (uint8_t *)chars) {
+ cnv->subCharLen = (int8_t)length8;
+ } else /* subChars == s */ {
+ cnv->subCharLen = (int8_t)-length;
+ }
+ }
+
+ /* See comment in ucnv_setSubstChars(). */
+ cnv->subChar1 = 0;
+}
+
/*resets the internal states of a converter
*goal : have the same behaviour than a freshly created converter
*/
@@ -1587,7 +1691,7 @@ ucnv_toUChars(UConverter *cnv,
ucnv_resetToUnicode(cnv);
originalDest=dest;
if(srcLength==-1) {
- srcLength=uprv_strlen(src);
+ srcLength=(int32_t)uprv_strlen(src);
}
if(srcLength>0) {
srcLimit=src+srcLength;
@@ -1855,6 +1959,12 @@ ucnv_convertEx(UConverter *targetCnv, UConverter *sourceCnv,
}
if(pivotStart==NULL) {
+ if(!flush) {
+ /* streaming conversion requires an explicit pivot buffer */
+ *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR;
+ return;
+ }
+
/* use the stack pivot buffer */
pivotStart=myPivotSource=myPivotTarget=pivotBuffer;
pivotSource=&myPivotSource;
@@ -1984,7 +2094,7 @@ ucnv_internalConvert(UConverter *outConverter, UConverter *inConverter,
FALSE,
TRUE,
pErrorCode);
- targetLength=myTarget-target;
+ targetLength=(int32_t)(myTarget-target);
}
/*
@@ -2007,7 +2117,7 @@ ucnv_internalConvert(UConverter *outConverter, UConverter *inConverter,
FALSE,
TRUE,
pErrorCode);
- targetLength+=(myTarget-targetBuffer);
+ targetLength+=(int32_t)(myTarget-targetBuffer);
} while(*pErrorCode==U_BUFFER_OVERFLOW_ERROR);
/* done with preflighting, set warnings and errors as appropriate */
@@ -2322,7 +2432,7 @@ ucnv_detectUnicodeSignature( const char* source,
}
if(sourceLength==-1){
- sourceLength=uprv_strlen(source);
+ sourceLength=(int32_t)uprv_strlen(source);
}
@@ -2384,6 +2494,50 @@ ucnv_detectUnicodeSignature( const char* source,
return NULL;
}
+ U_DRAFT int32_t U_EXPORT2
+ ucnv_fromUCountPending(const UConverter* cnv, UErrorCode* status){
+
+ if(status == NULL || U_FAILURE(*status)){
+ return -1;
+ }
+ if(cnv == NULL){
+ *status = U_ILLEGAL_ARGUMENT_ERROR;
+ return -1;
+ }
+
+ if(cnv->preFromULength > 0){
+ return U16_LENGTH(cnv->preFromUFirstCP)+cnv->preFromULength ;
+ }else if(cnv->preFromULength < 0){
+ return -cnv->preFromULength ;
+ }else if(cnv->fromUChar32 > 0){
+ return 1;
+ }else if(cnv->preFromUFirstCP >0){
+ return U16_LENGTH(cnv->preFromUFirstCP);
+ }
+ return 0;
+
+ }
+
+U_DRAFT int32_t U_EXPORT2
+ucnv_toUCountPending(const UConverter* cnv, UErrorCode* status){
+
+ if(status == NULL || U_FAILURE(*status)){
+ return -1;
+ }
+ if(cnv == NULL){
+ *status = U_ILLEGAL_ARGUMENT_ERROR;
+ return -1;
+ }
+
+ if(cnv->preToULength > 0){
+ return cnv->preToULength ;
+ }else if(cnv->preToULength < 0){
+ return -cnv->preToULength;
+ }else if(cnv->toULength > 0){
+ return cnv->toULength;
+ }
+ return 0;
+}
#endif
/*
diff --git a/icuSources/common/ucnv2022.c b/icuSources/common/ucnv2022.c
index cc8159a2..9dc1c283 100644
--- a/icuSources/common/ucnv2022.c
+++ b/icuSources/common/ucnv2022.c
@@ -1,6 +1,6 @@
/*
**********************************************************************
-* Copyright (C) 2000-2004, International Business Machines
+* Copyright (C) 2000-2006, International Business Machines
* Corporation and others. All Rights Reserved.
**********************************************************************
* file name: ucnv2022.c
@@ -84,6 +84,14 @@ static const char SHIFT_OUT_STR[] = "\x0E";
#define V_TAB 0x0B
#define SPACE 0x20
+/*
+ * ISO 2022 control codes must not be converted from Unicode
+ * because they would mess up the byte stream.
+ * The bit mask 0x0800c000 has bits set at bit positions 0xe, 0xf, 0x1b
+ * corresponding to SO, SI, and ESC.
+ */
+#define IS_2022_CONTROL(c) (((c)<0x20) && (((uint32_t)1<<(c))&0x0800c000)!=0)
+
/* for ISO-2022-JP and -CN implementations */
typedef enum {
/* shared values */
@@ -164,17 +172,17 @@ typedef struct ISO2022State {
#define UCNV_2022_MAX_CONVERTERS 10
typedef struct{
+ UConverterSharedData *myConverterArray[UCNV_2022_MAX_CONVERTERS];
UConverter *currentConverter;
-#ifdef U_ENABLE_GENERIC_ISO_2022
- UBool isFirstBuffer;
-#endif
Cnv2022Type currentType;
ISO2022State toU2022State, fromU2022State;
- UConverterSharedData *myConverterArray[UCNV_2022_MAX_CONVERTERS];
uint32_t key;
uint32_t version;
- char locale[3];
+#ifdef U_ENABLE_GENERIC_ISO_2022
+ UBool isFirstBuffer;
+#endif
char name[30];
+ char locale[3];
}UConverterDataISO2022;
/* Protos */
@@ -370,7 +378,23 @@ static const UConverterSharedData _ISO2022CNData;
/*************** Converter implementations ******************/
-static void
+/* The purpose of this function is to get around gcc compiler warnings. */
+static U_INLINE void
+fromUWriteUInt8(UConverter *cnv,
+ const char *bytes, int32_t length,
+ uint8_t **target, const char *targetLimit,
+ int32_t **offsets,
+ int32_t sourceIndex,
+ UErrorCode *pErrorCode)
+{
+ char *targetChars = (char *)*target;
+ ucnv_fromUWriteBytes(cnv, bytes, length, &targetChars, targetLimit,
+ offsets, sourceIndex, pErrorCode);
+ *target = (uint8_t*)targetChars;
+
+}
+
+static U_INLINE void
setInitialStateToUnicodeKR(UConverter* converter, UConverterDataISO2022 *myConverterData){
if(myConverterData->version == 1) {
UConverter *cnv = myConverterData->currentConverter;
@@ -381,7 +405,7 @@ setInitialStateToUnicodeKR(UConverter* converter, UConverterDataISO2022 *myConve
}
}
-static void
+static U_INLINE void
setInitialStateFromUnicodeKR(UConverter* converter,UConverterDataISO2022 *myConverterData){
/* in ISO-2022-KR the designator sequence appears only once
* in a file so we append it only once
@@ -413,21 +437,17 @@ _ISO2022Open(UConverter *cnv, const char *name, const char *locale,uint32_t opti
uint32_t version;
uprv_memset(myConverterData, 0, sizeof(UConverterDataISO2022));
- myConverterData->currentConverter = NULL;
myConverterData->currentType = ASCII1;
- myConverterData->key =0;
-#ifdef U_ENABLE_GENERIC_ISO_2022
- myConverterData->isFirstBuffer = TRUE;
-#endif
cnv->fromUnicodeStatus =FALSE;
if(locale){
uprv_strncpy(myLocale, locale, sizeof(myLocale));
}
- myConverterData->version= 0;
version = options & UCNV_OPTIONS_VERSION_MASK;
+ myConverterData->version = version;
if(myLocale[0]=='j' && (myLocale[1]=='a'|| myLocale[1]=='p') &&
- (myLocale[2]=='_' || myLocale[2]=='\0')){
- int len=0;
+ (myLocale[2]=='_' || myLocale[2]=='\0'))
+ {
+ size_t len=0;
/* open the required converters and cache them */
if(jpCharsetMasks[version]&CSM(ISO8859_7)) {
myConverterData->myConverterArray[ISO8859_7]= ucnv_loadSharedData("ISO8859_7", NULL, errorCode);
@@ -448,50 +468,49 @@ _ISO2022Open(UConverter *cnv, const char *name, const char *locale,uint32_t opti
cnv->sharedData=(UConverterSharedData*)(&_ISO2022JPData);
uprv_strcpy(myConverterData->locale,"ja");
- myConverterData->version = version;
uprv_strcpy(myConverterData->name,"ISO_2022,locale=ja,version=");
len = uprv_strlen(myConverterData->name);
myConverterData->name[len]=(char)(myConverterData->version+(int)'0');
myConverterData->name[len+1]='\0';
}
else if(myLocale[0]=='k' && (myLocale[1]=='o'|| myLocale[1]=='r') &&
- (myLocale[2]=='_' || myLocale[2]=='\0')){
-
- if ((options & UCNV_OPTIONS_VERSION_MASK)==1){
- myConverterData->version = 1;
- myConverterData->currentConverter=
- ucnv_open("icu-internal-25546",errorCode);
+ (myLocale[2]=='_' || myLocale[2]=='\0'))
+ {
+ if (version==1){
+ myConverterData->currentConverter=
+ ucnv_open("icu-internal-25546",errorCode);
- if (U_FAILURE(*errorCode)) {
- _ISO2022Close(cnv);
- return;
- }
+ if (U_FAILURE(*errorCode)) {
+ _ISO2022Close(cnv);
+ return;
+ }
- uprv_strcpy(myConverterData->name,"ISO_2022,locale=ko,version=1");
- uprv_memcpy(cnv->subChar, myConverterData->currentConverter->subChar, 4);
- cnv->subCharLen = myConverterData->currentConverter->subCharLen;
+ uprv_strcpy(myConverterData->name,"ISO_2022,locale=ko,version=1");
+ uprv_memcpy(cnv->subChars, myConverterData->currentConverter->subChars, 4);
+ cnv->subCharLen = myConverterData->currentConverter->subCharLen;
}else{
- myConverterData->currentConverter=ucnv_open("ibm-949",errorCode);
+ myConverterData->currentConverter=ucnv_open("ibm-949",errorCode);
- if (U_FAILURE(*errorCode)) {
- _ISO2022Close(cnv);
- return;
- }
+ if (U_FAILURE(*errorCode)) {
+ _ISO2022Close(cnv);
+ return;
+ }
- myConverterData->version = 0;
- uprv_strcpy(myConverterData->name,"ISO_2022,locale=ko,version=0");
+ myConverterData->version = 0;
+ uprv_strcpy(myConverterData->name,"ISO_2022,locale=ko,version=0");
}
/* initialize the state variables */
setInitialStateToUnicodeKR(cnv, myConverterData);
- setInitialStateFromUnicodeKR(cnv,myConverterData);
+ setInitialStateFromUnicodeKR(cnv, myConverterData);
/* set the function pointers to appropriate funtions */
cnv->sharedData=(UConverterSharedData*)&_ISO2022KRData;
uprv_strcpy(myConverterData->locale,"ko");
}
else if(((myLocale[0]=='z' && myLocale[1]=='h') || (myLocale[0]=='c'&& myLocale[1]=='n'))&&
- (myLocale[2]=='_' || myLocale[2]=='\0')){
+ (myLocale[2]=='_' || myLocale[2]=='\0'))
+ {
/* open the required converters and cache them */
myConverterData->myConverterArray[GB2312_1] = ucnv_loadSharedData("ibm-5478", NULL, errorCode);
@@ -505,16 +524,17 @@ _ISO2022Open(UConverter *cnv, const char *name, const char *locale,uint32_t opti
cnv->sharedData=(UConverterSharedData*)&_ISO2022CNData;
uprv_strcpy(myConverterData->locale,"cn");
- if ((options & UCNV_OPTIONS_VERSION_MASK)==1){
- myConverterData->version = 1;
+ if (version==1){
uprv_strcpy(myConverterData->name,"ISO_2022,locale=zh,version=1");
}else{
- uprv_strcpy(myConverterData->name,"ISO_2022,locale=zh,version=0");
myConverterData->version = 0;
+ uprv_strcpy(myConverterData->name,"ISO_2022,locale=zh,version=0");
}
}
else{
#ifdef U_ENABLE_GENERIC_ISO_2022
+ myConverterData->isFirstBuffer = TRUE;
+
/* append the UTF-8 escape sequence */
cnv->charErrorBufferLength = 3;
cnv->charErrorBuffer[0] = 0x1b;
@@ -712,7 +732,7 @@ changeState_2022(UConverter* _this,
UCNV_TableStates_2022 value;
UConverterDataISO2022* myData2022 = ((UConverterDataISO2022*)_this->extraInfo);
uint32_t key = myData2022->key;
- int32_t offset;
+ int32_t offset = 0;
char c;
value = VALID_NON_TERMINAL_2022;
@@ -861,7 +881,9 @@ DONE:
*err = U_UNSUPPORTED_ESCAPE_SEQUENCE;
break;
}
+ /*fall through*/
case GB2312_1:
+ /*fall through*/
case CNS_11643_1:
myData2022->toU2022State.cs[1]=(int8_t)tempState;
break;
@@ -1242,6 +1264,10 @@ static const StateEnum jpCharsetPref[]={
HWKANA_7BIT
};
+/*
+ * The escape sequences must be in order of the enum constants like JISX201 = 3,
+ * not in order of jpCharsetPref[]!
+ */
static const char escSeqChars[][6] ={
"\x1B\x28\x42", /* (B ASCII */
"\x1B\x2E\x41", /* .A ISO-8859-1 */
@@ -1297,7 +1323,7 @@ UConverter_fromUnicode_ISO_2022_JP_OFFSETS_LOGIC(UConverterFromUnicodeArgs* args
int32_t len, outLen;
int8_t choices[10];
int32_t choiceCount;
- uint32_t targetValue;
+ uint32_t targetValue = 0;
UBool useFallback;
int32_t i;
@@ -1320,7 +1346,7 @@ UConverter_fromUnicode_ISO_2022_JP_OFFSETS_LOGIC(UConverterFromUnicodeArgs* args
sourceChar = *(source++);
/*check if the char is a First surrogate*/
- if(UTF_IS_SURROGATE(sourceChar)) {
+ if(UTF_IS_SURROGATE(sourceChar)) {
if(UTF_IS_SURROGATE_FIRST(sourceChar)) {
getTrail:
/*look ahead to find the trail surrogate*/
@@ -1354,6 +1380,14 @@ getTrail:
}
}
+ /* do not convert SO/SI/ESC */
+ if(IS_2022_CONTROL(sourceChar)) {
+ /* callback(illegal) */
+ *err=U_ILLEGAL_CHAR_FOUND;
+ args->converter->fromUChar32=sourceChar;
+ break;
+ }
+
/* do the conversion */
if(choiceCount == 0) {
@@ -1535,7 +1569,7 @@ getTrail:
if(outLen == 1) {
*target++ = buffer[0];
if(offsets) {
- *offsets++ = source - args->source - 1; /* -1: known to be ASCII */
+ *offsets++ = (int32_t)(source - args->source - 1); /* -1: known to be ASCII */
}
} else if(outLen == 2 && (target + 2) <= targetLimit) {
*target++ = buffer[0];
@@ -1546,10 +1580,10 @@ getTrail:
*offsets++ = sourceIndex;
}
} else {
- ucnv_fromUWriteBytes(
+ fromUWriteUInt8(
args->converter,
buffer, outLen,
- (char **)&target, (const char *)targetLimit,
+ &target, (const char *)targetLimit,
&offsets, (int32_t)(source - args->source - U16_LENGTH(sourceChar)),
err);
if(U_FAILURE(*err)) {
@@ -1614,10 +1648,10 @@ getTrail:
sourceIndex=-1;
}
- ucnv_fromUWriteBytes(
+ fromUWriteUInt8(
args->converter,
buffer, outLen,
- (char **)&target, (const char *)targetLimit,
+ &target, (const char *)targetLimit,
&offsets, sourceIndex,
err);
}
@@ -1781,7 +1815,7 @@ getTrailByte:
}
if(targetUniChar < (missingCharMarker-1/*0xfffe*/)){
if(args->offsets){
- args->offsets[myTarget - args->target]= mySource - args->source - (mySourceChar <= 0xff ? 1 : 2);
+ args->offsets[myTarget - args->target] = (int32_t)(mySource - args->source - (mySourceChar <= 0xff ? 1 : 2));
}
*(myTarget++)=(UChar)targetUniChar;
}
@@ -1790,13 +1824,13 @@ getTrailByte:
targetUniChar-=0x0010000;
*myTarget = (UChar)(0xd800+(UChar)(targetUniChar>>10));
if(args->offsets){
- args->offsets[myTarget - args->target]= mySource - args->source - (mySourceChar <= 0xff ? 1 : 2);
+ args->offsets[myTarget - args->target] = (int32_t)(mySource - args->source - (mySourceChar <= 0xff ? 1 : 2));
}
++myTarget;
if(myTarget< args->targetLimit){
*myTarget = (UChar)(0xdc00+(UChar)(targetUniChar&0x3ff));
if(args->offsets){
- args->offsets[myTarget - args->target]= mySource - args->source - (mySourceChar <= 0xff ? 1 : 2);
+ args->offsets[myTarget - args->target] = (int32_t)(mySource - args->source - (mySourceChar <= 0xff ? 1 : 2));
}
++myTarget;
}else{
@@ -1897,6 +1931,15 @@ UConverter_fromUnicode_ISO_2022_KR_OFFSETS_LOGIC(UConverterFromUnicodeArgs* args
if(target < (unsigned char*) args->targetLimit){
sourceChar = *source++;
+
+ /* do not convert SO/SI/ESC */
+ if(IS_2022_CONTROL(sourceChar)) {
+ /* callback(illegal) */
+ *err=U_ILLEGAL_CHAR_FOUND;
+ args->converter->fromUChar32=sourceChar;
+ break;
+ }
+
/* length= ucnv_MBCSFromUChar32(converterData->currentConverter->sharedData,
sourceChar,&targetByteUnit,args->converter->useFallback);*/
MBCS_FROM_UCHAR32_ISO2022(sharedData,sourceChar,&targetByteUnit,useFallback,&length,MBCS_OUTPUT_2);
@@ -1917,14 +1960,14 @@ UConverter_fromUnicode_ISO_2022_KR_OFFSETS_LOGIC(UConverterFromUnicodeArgs* args
else
*target++ = UCNV_SI;
if(offsets)
- *(offsets++)= source - args->source-1;
+ *(offsets++) = (int32_t)(source - args->source-1);
}
/* write the targetUniChar to target */
if(targetByteUnit <= 0x00FF){
if( target < targetLimit){
*(target++) = (unsigned char) targetByteUnit;
if(offsets){
- *(offsets++) = source - args->source-1;
+ *(offsets++) = (int32_t)(source - args->source-1);
}
}else{
@@ -1935,12 +1978,12 @@ UConverter_fromUnicode_ISO_2022_KR_OFFSETS_LOGIC(UConverterFromUnicodeArgs* args
if(target < targetLimit){
*(target++) =(unsigned char) ((targetByteUnit>>8) -0x80);
if(offsets){
- *(offsets++) = source - args->source-1;
+ *(offsets++) = (int32_t)(source - args->source-1);
}
if(target < targetLimit){
*(target++) =(unsigned char) (targetByteUnit -0x80);
if(offsets){
- *(offsets++) = source - args->source-1;
+ *(offsets++) = (int32_t)(source - args->source-1);
}
}else{
args->converter->charErrorBuffer[args->converter->charErrorBufferLength++] = (unsigned char) (targetByteUnit -0x80);
@@ -1993,7 +2036,6 @@ getTrail:
}
args->converter->fromUChar32=sourceChar;
- args->converter->fromUnicodeStatus = (int32_t)isTargetByteDBCS;
break;
}
} /* end if(myTargetIndexconverter,
SHIFT_IN_STR, 1,
- (char **)&target, (const char *)targetLimit,
+ &target, (const char *)targetLimit,
&offsets, sourceIndex,
err);
}
@@ -2242,7 +2284,7 @@ getTrailByte:
}
if(targetUniChar < 0xfffe){
if(args->offsets) {
- args->offsets[myTarget - args->target]= mySource - args->source - (mySourceChar <= 0xff ? 1 : 2);
+ args->offsets[myTarget - args->target] = (int32_t)(mySource - args->source - (mySourceChar <= 0xff ? 1 : 2));
}
*(myTarget++)=(UChar)targetUniChar;
}
@@ -2382,7 +2424,7 @@ UConverter_fromUnicode_ISO_2022_CN_OFFSETS_LOGIC(UConverterFromUnicodeArgs* args
int32_t len;
int8_t choices[3];
int32_t choiceCount;
- uint32_t targetValue;
+ uint32_t targetValue = 0;
UBool useFallback;
/* set up the state */
@@ -2438,6 +2480,14 @@ getTrail:
/* do the conversion */
if(sourceChar <= 0x007f ){
+ /* do not convert SO/SI/ESC */
+ if(IS_2022_CONTROL(sourceChar)) {
+ /* callback(illegal) */
+ *err=U_ILLEGAL_CHAR_FOUND;
+ args->converter->fromUChar32=sourceChar;
+ break;
+ }
+
/* US-ASCII */
if(pFromU2022State->g == 0) {
buffer[0] = (char)sourceChar;
@@ -2591,7 +2641,7 @@ getTrail:
if(len == 1) {
*target++ = buffer[0];
if(offsets) {
- *offsets++ = source - args->source - 1; /* -1: known to be ASCII */
+ *offsets++ = (int32_t)(source - args->source - 1); /* -1: known to be ASCII */
}
} else if(len == 2 && (target + 2) <= targetLimit) {
*target++ = buffer[0];
@@ -2602,10 +2652,10 @@ getTrail:
*offsets++ = sourceIndex;
}
} else {
- ucnv_fromUWriteBytes(
+ fromUWriteUInt8(
args->converter,
buffer, len,
- (char **)&target, (const char *)targetLimit,
+ &target, (const char *)targetLimit,
&offsets, (int32_t)(source - args->source - U16_LENGTH(sourceChar)),
err);
if(U_FAILURE(*err)) {
@@ -2659,10 +2709,10 @@ getTrail:
sourceIndex=-1;
}
- ucnv_fromUWriteBytes(
+ fromUWriteUInt8(
args->converter,
SHIFT_IN_STR, 1,
- (char **)&target, (const char *)targetLimit,
+ &target, (const char *)targetLimit,
&offsets, sourceIndex,
err);
}
@@ -2786,7 +2836,7 @@ getTrailByte:
}
if(targetUniChar < (missingCharMarker-1/*0xfffe*/)){
if(args->offsets){
- args->offsets[myTarget - args->target]= mySource - args->source - (mySourceChar <= 0xff ? 1 : 2);
+ args->offsets[myTarget - args->target] = (int32_t)(mySource - args->source - (mySourceChar <= 0xff ? 1 : 2));
}
*(myTarget++)=(UChar)targetUniChar;
}
@@ -2795,13 +2845,13 @@ getTrailByte:
targetUniChar-=0x0010000;
*myTarget = (UChar)(0xd800+(UChar)(targetUniChar>>10));
if(args->offsets){
- args->offsets[myTarget - args->target]= mySource - args->source - (mySourceChar <= 0xff ? 1 : 2);
+ args->offsets[myTarget - args->target] = (int32_t)(mySource - args->source - (mySourceChar <= 0xff ? 1 : 2));
}
++myTarget;
if(myTarget< args->targetLimit){
*myTarget = (UChar)(0xdc00+(UChar)(targetUniChar&0x3ff));
if(args->offsets){
- args->offsets[myTarget - args->target]= mySource - args->source - (mySourceChar <= 0xff ? 1 : 2);
+ args->offsets[myTarget - args->target] = (int32_t)(mySource - args->source - (mySourceChar <= 0xff ? 1 : 2));
}
++myTarget;
}else{
@@ -2835,7 +2885,7 @@ _ISO_2022_WriteSub(UConverterFromUnicodeArgs *args, int32_t offsetIndex, UErrorC
char buffer[8];
int32_t length;
- subchar=(char *)cnv->subChar;
+ subchar=(char *)cnv->subChars;
length=cnv->subCharLen; /* assume length==1 for most variants */
p = buffer;
@@ -2890,14 +2940,24 @@ _ISO_2022_WriteSub(UConverterFromUnicodeArgs *args, int32_t offsetIndex, UErrorC
}
break;
} else {
- /* let the subconverter write the subchar */
- args->converter = myConverterData->currentConverter;
- uprv_memcpy(myConverterData->currentConverter->subChar, subchar, 4);
+ /* save the subconverter's substitution string */
+ uint8_t *currentSubChars = myConverterData->currentConverter->subChars;
+ int8_t currentSubCharLen = myConverterData->currentConverter->subCharLen;
+
+ /* set our substitution string into the subconverter */
+ myConverterData->currentConverter->subChars = (uint8_t *)subchar;
myConverterData->currentConverter->subCharLen = (int8_t)length;
+ /* let the subconverter write the subchar, set/retrieve fromUChar32 state */
+ args->converter = myConverterData->currentConverter;
myConverterData->currentConverter->fromUChar32 = cnv->fromUChar32;
ucnv_cbFromUWriteSub(args, 0, err);
cnv->fromUChar32 = myConverterData->currentConverter->fromUChar32;
+ args->converter = cnv;
+
+ /* restore the subconverter's substitution string */
+ myConverterData->currentConverter->subChars = currentSubChars;
+ myConverterData->currentConverter->subCharLen = currentSubCharLen;
if(*err == U_BUFFER_OVERFLOW_ERROR) {
if(myConverterData->currentConverter->charErrorBufferLength > 0) {
@@ -2909,7 +2969,6 @@ _ISO_2022_WriteSub(UConverterFromUnicodeArgs *args, int32_t offsetIndex, UErrorC
cnv->charErrorBufferLength = myConverterData->currentConverter->charErrorBufferLength;
myConverterData->currentConverter->charErrorBufferLength = 0;
}
- args->converter = cnv;
return;
}
default:
@@ -2921,12 +2980,23 @@ _ISO_2022_WriteSub(UConverterFromUnicodeArgs *args, int32_t offsetIndex, UErrorC
offsetIndex, err);
}
-/* structure for SafeClone calculations */
+/*
+ * Structure for cloning an ISO 2022 converter into a single memory block.
+ * ucnv_safeClone() of the converter will align the entire cloneStruct,
+ * and then ucnv_safeClone() of the sub-converter may additionally align
+ * currentConverter inside the cloneStruct, for which we need the deadSpace
+ * after currentConverter.
+ * This is because UAlignedMemory may be larger than the actually
+ * necessary alignment size for the platform.
+ * The other cloneStruct fields will not be moved around,
+ * and are aligned properly with cloneStruct's alignment.
+ */
struct cloneStruct
{
UConverter cnv;
- UConverterDataISO2022 mydata;
UConverter currentConverter;
+ UAlignedMemory deadSpace;
+ UConverterDataISO2022 mydata;
};
@@ -2952,11 +3022,13 @@ _ISO_2022_SafeClone(
/* ucnv.c/ucnv_safeClone() copied the main UConverter already */
uprv_memcpy(&localClone->mydata, cnvData, sizeof(UConverterDataISO2022));
+ localClone->cnv.extraInfo = &localClone->mydata; /* set pointer to extra data */
+ localClone->cnv.isExtraLocal = TRUE;
/* share the subconverters */
if(cnvData->currentConverter != NULL) {
- size = (int32_t)sizeof(UConverter);
+ size = (int32_t)(sizeof(UConverter) + sizeof(UAlignedMemory)); /* include size of padding */
localClone->mydata.currentConverter =
ucnv_safeClone(cnvData->currentConverter,
&localClone->currentConverter,
@@ -2972,14 +3044,12 @@ _ISO_2022_SafeClone(
}
}
- localClone->cnv.extraInfo = &localClone->mydata; /* set pointer to extra data */
- localClone->cnv.isExtraLocal = TRUE;
return &localClone->cnv;
}
static void
_ISO_2022_GetUnicodeSet(const UConverter *cnv,
- USetAdder *sa,
+ const USetAdder *sa,
UConverterUnicodeSet which,
UErrorCode *pErrorCode)
{
@@ -3024,17 +3094,18 @@ _ISO_2022_GetUnicodeSet(const UConverter *cnv,
/* there is only one converter for KR, and it is not in the myConverterArray[] */
cnvData->currentConverter->sharedData->impl->getUnicodeSet(
cnvData->currentConverter, sa, which, pErrorCode);
- return;
+ /* the loop over myConverterArray[] will simply not find another converter */
+ break;
default:
break;
}
/*
- * TODO: need to make this version-specific for CN.
+ * Version-specific for CN:
* CN version 0 does not map CNS planes 3..7 although
* they are all available in the CNS conversion table;
* CN version 1 does map them all.
- * The two versions need to create different Unicode sets.
+ * The two versions create different Unicode sets.
*/
for (i=0; imyConverterArray[i]!=NULL) {
@@ -3052,6 +3123,15 @@ _ISO_2022_GetUnicodeSet(const UConverter *cnv,
}
}
}
+
+ /*
+ * ISO 2022 converters must not convert SO/SI/ESC despite what
+ * sub-converters do by themselves.
+ * Remove these characters from the set.
+ */
+ sa->remove(sa->set, 0x0e);
+ sa->remove(sa->set, 0x0f);
+ sa->remove(sa->set, 0x1b);
}
static const UConverterImpl _ISO2022Impl={
@@ -3240,7 +3320,7 @@ static const UConverterStaticData _ISO2022CNStaticData={
0,
UCNV_IBM,
UCNV_ISO_2022,
- 2,
+ 1,
8, /* max 8 bytes per UChar: 4-byte CNS designator + 2 bytes for SS2/SS3 + DBCS */
{ 0x1a, 0, 0, 0 },
1,
diff --git a/icuSources/common/ucnv_bld.c b/icuSources/common/ucnv_bld.c
index f9f99c9b..62e1609f 100644
--- a/icuSources/common/ucnv_bld.c
+++ b/icuSources/common/ucnv_bld.c
@@ -1,7 +1,7 @@
/*
********************************************************************
* COPYRIGHT:
- * Copyright (c) 1996-2004, International Business Machines Corporation and
+ * Copyright (c) 1996-2006, International Business Machines Corporation and
* others. All Rights Reserved.
********************************************************************
*
@@ -23,6 +23,7 @@
#if !UCONFIG_NO_CONVERSION
+#include "unicode/putil.h"
#include "unicode/udata.h"
#include "unicode/ucnv.h"
#include "unicode/uloc.h"
@@ -154,6 +155,14 @@ static UMTX cnvCacheMutex = NULL; /* Mutex for synchronizing cnv cache a
/* Note: the global mutex is used for */
/* reference count updates. */
+static const char **gAvailableConverters = NULL;
+static uint16_t gAvailableConverterCount = 0;
+
+static char gDefaultConverterNameBuffer[UCNV_MAX_CONVERTER_NAME_LENGTH + 1]; /* +1 for NULL */
+static const char *gDefaultConverterName = NULL;
+static const UConverterSharedData *gDefaultAlgorithmicSharedData = NULL;
+static UBool gDefaultConverterContainsOption;
+
static const char DATA_TYPE[] = "cnv";
@@ -170,6 +179,14 @@ static UBool U_CALLCONV ucnv_cleanup(void) {
}
}
+ /* Called from ucnv_flushCache because it allocates the hashtable */
+ /*ucnv_flushAvailableConverterCache();*/
+
+ gDefaultConverterName = NULL;
+ gDefaultConverterNameBuffer[0] = 0;
+ gDefaultConverterContainsOption = FALSE;
+ gDefaultAlgorithmicSharedData = NULL;
+
umtx_destroy(&cnvCacheMutex); /* Don't worry about destroying the mutex even */
/* if the hash table still exists. The mutex */
/* will lazily re-init itself if needed. */
@@ -274,7 +291,7 @@ static UConverterSharedData *createConverterFromFile(UConverterLoadArgs *pArgs,
UTRACE_ENTRY_OC(UTRACE_UCNV_LOAD);
- if (err == NULL || U_FAILURE (*err)) {
+ if (U_FAILURE (*err)) {
UTRACE_EXIT_STATUS(*err);
return NULL;
}
@@ -307,23 +324,6 @@ static UConverterSharedData *createConverterFromFile(UConverterLoadArgs *pArgs,
return sharedData;
}
-int32_t
-ucnv_copyPlatformString(char *platformString, UConverterPlatform pltfrm)
-{
- switch (pltfrm)
- {
- case UCNV_IBM:
- uprv_strcpy(platformString, "ibm-");
- return 4;
- case UCNV_UNKNOWN:
- break;
- }
-
- /* default to empty string */
- *platformString = 0;
- return 0;
-}
-
/*returns a converter type from a string
*/
static const UConverterSharedData *
@@ -378,8 +378,8 @@ ucnv_shareConverterData(UConverterSharedData * data)
if (SHARED_DATA_HASHTABLE == NULL)
{
- SHARED_DATA_HASHTABLE = uhash_openSize(uhash_hashChars, uhash_compareChars,
- ucnv_io_countAvailableAliases(&err),
+ SHARED_DATA_HASHTABLE = uhash_openSize(uhash_hashChars, uhash_compareChars, NULL,
+ ucnv_io_countTotalAliases(&err),
&err);
ucln_common_registerCleanup(UCLN_COMMON_UCNV, ucnv_cleanup);
@@ -662,6 +662,8 @@ ucnv_loadSharedData(const char *converterName, UConverterLookupData *lookup, UEr
UConverterLookupData stackLookup;
UConverterSharedData *mySharedConverterData = NULL;
UErrorCode internalErrorCode = U_ZERO_ERROR;
+ UBool mayContainOption = TRUE;
+ UBool checkForAlgorithmic = TRUE;
if (U_FAILURE (*err)) {
return NULL;
@@ -676,13 +678,29 @@ ucnv_loadSharedData(const char *converterName, UConverterLookupData *lookup, UEr
/* In case "name" is NULL we want to open the default converter. */
if (converterName == NULL) {
- lookup->realName = ucnv_io_getDefaultConverterName();
+ /* Call ucnv_getDefaultName first to query the name from the OS. */
+ lookup->realName = ucnv_getDefaultName();
if (lookup->realName == NULL) {
*err = U_MISSING_RESOURCE_ERROR;
return NULL;
}
+ mySharedConverterData = (UConverterSharedData *)gDefaultAlgorithmicSharedData;
+ checkForAlgorithmic = FALSE;
+ mayContainOption = gDefaultConverterContainsOption;
/* the default converter name is already canonical */
- } else {
+ }
+ else if((converterName[0] == 'U' ?
+ ( converterName[1] == 'T' && converterName[2] == 'F') :
+ (converterName[0] == 'u' && converterName[1] == 't' && converterName[2] == 'f'))
+ &&
+ (converterName[3] == '-' ?
+ (converterName[4] == '8' && converterName[5] == 0) :
+ (converterName[3] == '8' && converterName[4] == 0)))
+ {
+ /* fastpath for UTF-8 */
+ return (UConverterSharedData *)converterData[UCNV_UTF8];
+ }
+ else {
/* separate the converter name from the options */
parseConverterOptions(converterName, lookup->cnvName, lookup->locale, &lookup->options, err);
if (U_FAILURE(*err)) {
@@ -691,7 +709,7 @@ ucnv_loadSharedData(const char *converterName, UConverterLookupData *lookup, UEr
}
/* get the canonical converter name */
- lookup->realName = ucnv_io_getConverterName(lookup->cnvName, &internalErrorCode);
+ lookup->realName = ucnv_io_getConverterName(lookup->cnvName, &mayContainOption, &internalErrorCode);
if (U_FAILURE(internalErrorCode) || lookup->realName == NULL) {
/*
* set the input name in case the converter was added
@@ -702,13 +720,15 @@ ucnv_loadSharedData(const char *converterName, UConverterLookupData *lookup, UEr
}
/* separate the converter name from the options */
- if(lookup->realName != lookup->cnvName) {
+ if(mayContainOption && lookup->realName != lookup->cnvName) {
parseConverterOptions(lookup->realName, lookup->cnvName, lookup->locale, &lookup->options, err);
lookup->realName = lookup->cnvName;
}
/* get the shared data for an algorithmic converter, if it is one */
- mySharedConverterData = (UConverterSharedData *)getAlgorithmicTypeFromName(lookup->realName);
+ if (checkForAlgorithmic) {
+ mySharedConverterData = (UConverterSharedData *)getAlgorithmicTypeFromName(lookup->realName);
+ }
if (mySharedConverterData == NULL)
{
/* it is a data-based converter, get its shared data. */
@@ -882,20 +902,21 @@ ucnv_createConverterFromSharedData(UConverter *myUConverter,
/* initialize the converter */
uprv_memset(myUConverter, 0, sizeof(UConverter));
myUConverter->isCopyLocal = isCopyLocal;
- myUConverter->isExtraLocal = FALSE;
+ /*myUConverter->isExtraLocal = FALSE;*/ /* Set by the memset call */
myUConverter->sharedData = mySharedConverterData;
myUConverter->options = options;
- myUConverter->fromCharErrorBehaviour = (UConverterToUCallback) UCNV_TO_U_CALLBACK_SUBSTITUTE;
- myUConverter->fromUCharErrorBehaviour = (UConverterFromUCallback) UCNV_FROM_U_CALLBACK_SUBSTITUTE;
- myUConverter->toUnicodeStatus = myUConverter->sharedData->toUnicodeStatus;
- myUConverter->maxBytesPerUChar = myUConverter->sharedData->staticData->maxBytesPerChar;
- myUConverter->subChar1 = myUConverter->sharedData->staticData->subChar1;
- myUConverter->subCharLen = myUConverter->sharedData->staticData->subCharLen;
- uprv_memcpy (myUConverter->subChar, myUConverter->sharedData->staticData->subChar, myUConverter->subCharLen);
myUConverter->preFromUFirstCP = U_SENTINEL;
-
- if(myUConverter != NULL && myUConverter->sharedData->impl->open != NULL) {
- myUConverter->sharedData->impl->open(myUConverter, realName, locale,options, err);
+ myUConverter->fromCharErrorBehaviour = UCNV_TO_U_DEFAULT_CALLBACK;
+ myUConverter->fromUCharErrorBehaviour = UCNV_FROM_U_DEFAULT_CALLBACK;
+ myUConverter->toUnicodeStatus = mySharedConverterData->toUnicodeStatus;
+ myUConverter->maxBytesPerUChar = mySharedConverterData->staticData->maxBytesPerChar;
+ myUConverter->subChar1 = mySharedConverterData->staticData->subChar1;
+ myUConverter->subCharLen = mySharedConverterData->staticData->subCharLen;
+ myUConverter->subChars = (uint8_t *)myUConverter->subUChars;
+ uprv_memcpy(myUConverter->subChars, mySharedConverterData->staticData->subChar, myUConverter->subCharLen);
+
+ if(mySharedConverterData->impl->open != NULL) {
+ mySharedConverterData->impl->open(myUConverter, realName, locale, options, err);
if(U_FAILURE(*err)) {
ucnv_close(myUConverter);
return NULL;
@@ -905,6 +926,17 @@ ucnv_createConverterFromSharedData(UConverter *myUConverter,
return myUConverter;
}
+static void
+ucnv_flushAvailableConverterCache() {
+ if (gAvailableConverters) {
+ umtx_lock(&cnvCacheMutex);
+ gAvailableConverterCount = 0;
+ uprv_free((char **)gAvailableConverters);
+ gAvailableConverters = NULL;
+ umtx_unlock(&cnvCacheMutex);
+ }
+}
+
/*Frees all shared immutable objects that aren't referred to (reference count = 0)
*/
U_CAPI int32_t U_EXPORT2
@@ -974,12 +1006,197 @@ ucnv_flushCache ()
UTRACE_DATA1(UTRACE_INFO, "ucnv_flushCache() exits with %d converters remaining", remaining);
- ucnv_io_flushAvailableConverterCache();
+ ucnv_flushAvailableConverterCache();
UTRACE_EXIT_VALUE(tableDeletedNum);
return tableDeletedNum;
}
+/* available converters list --------------------------------------------------- */
+
+static UBool haveAvailableConverterList(UErrorCode *pErrorCode) {
+ int needInit;
+ UMTX_CHECK(&cnvCacheMutex, (gAvailableConverters == NULL), needInit);
+ if (needInit) {
+ UConverter tempConverter;
+ UEnumeration *allConvEnum = NULL;
+ uint16_t idx;
+ uint16_t localConverterCount;
+ uint16_t allConverterCount;
+ UErrorCode localStatus;
+ const char *converterName;
+ const char **localConverterList;
+
+ allConvEnum = ucnv_openAllNames(pErrorCode);
+ allConverterCount = uenum_count(allConvEnum, pErrorCode);
+ if (U_FAILURE(*pErrorCode)) {
+ return FALSE;
+ }
+
+ /* We can't have more than "*converterTable" converters to open */
+ localConverterList = (const char **) uprv_malloc(allConverterCount * sizeof(char*));
+ if (!localConverterList) {
+ *pErrorCode = U_MEMORY_ALLOCATION_ERROR;
+ return FALSE;
+ }
+
+ localConverterCount = 0;
+
+ for (idx = 0; idx < allConverterCount; idx++) {
+ localStatus = U_ZERO_ERROR;
+ converterName = uenum_next(allConvEnum, NULL, &localStatus);
+ ucnv_close(ucnv_createConverter(&tempConverter, converterName, &localStatus));
+ if (U_SUCCESS(localStatus)) {
+ localConverterList[localConverterCount++] = converterName;
+ }
+ }
+ uenum_close(allConvEnum);
+
+ umtx_lock(&cnvCacheMutex);
+ if (gAvailableConverters == NULL) {
+ gAvailableConverters = localConverterList;
+ gAvailableConverterCount = localConverterCount;
+ ucln_common_registerCleanup(UCLN_COMMON_UCNV, ucnv_cleanup);
+ }
+ else {
+ uprv_free((char **)localConverterList);
+ }
+ umtx_unlock(&cnvCacheMutex);
+ }
+ return TRUE;
+}
+
+U_CFUNC uint16_t
+ucnv_bld_countAvailableConverters(UErrorCode *pErrorCode) {
+ if (haveAvailableConverterList(pErrorCode)) {
+ return gAvailableConverterCount;
+ }
+ return 0;
+}
+
+U_CFUNC const char *
+ucnv_bld_getAvailableConverter(uint16_t n, UErrorCode *pErrorCode) {
+ if (haveAvailableConverterList(pErrorCode)) {
+ if (n < gAvailableConverterCount) {
+ return gAvailableConverters[n];
+ }
+ *pErrorCode = U_INDEX_OUTOFBOUNDS_ERROR;
+ }
+ return NULL;
+}
+
+/* default converter name --------------------------------------------------- */
+
+/* Copy the canonical converter name. */
+static U_INLINE void
+internalSetName(const char *name, UErrorCode *status) {
+ UConverterLookupData lookup;
+ int32_t length=(int32_t)(uprv_strlen(name));
+ UBool containsOption = (UBool)(uprv_strchr(name, UCNV_OPTION_SEP_CHAR) != NULL);
+ const UConverterSharedData *algorithmicSharedData;
+
+ lookup.locale[0] = 0;
+ lookup.options = 0;
+ lookup.realName = name;
+ if(containsOption) {
+ parseConverterOptions(lookup.realName, lookup.cnvName, lookup.locale, &lookup.options, status);
+ lookup.realName = lookup.cnvName;
+ }
+ algorithmicSharedData = getAlgorithmicTypeFromName(lookup.realName);
+
+ umtx_lock(&cnvCacheMutex);
+
+ uprv_memcpy(gDefaultConverterNameBuffer, name, length);
+ gDefaultConverterNameBuffer[length]=0;
+ gDefaultConverterName = gDefaultConverterNameBuffer;
+ gDefaultConverterContainsOption = containsOption;
+ gDefaultAlgorithmicSharedData = algorithmicSharedData;
+
+ ucln_common_registerCleanup(UCLN_COMMON_UCNV, ucnv_cleanup);
+
+ umtx_unlock(&cnvCacheMutex);
+}
+
+/*
+ * In order to be really thread-safe, the get function would have to take
+ * a buffer parameter and copy the current string inside a mutex block.
+ * This implementation only tries to be really thread-safe while
+ * setting the name.
+ * It assumes that setting a pointer is atomic.
+ */
+
+U_CAPI const char* U_EXPORT2
+ucnv_getDefaultName() {
+ /* local variable to be thread-safe */
+ const char *name;
+
+ UMTX_CHECK(&cnvCacheMutex, gDefaultConverterName, name);
+ if(name==NULL) {
+ UErrorCode errorCode = U_ZERO_ERROR;
+ UConverter *cnv = NULL;
+
+ name = uprv_getDefaultCodepage();
+
+ /* if the name is there, test it out and get the canonical name with options */
+ if(name != NULL) {
+ cnv = ucnv_open(name, &errorCode);
+ if(U_SUCCESS(errorCode) && cnv != NULL) {
+ name = ucnv_getName(cnv, &errorCode);
+ }
+ }
+
+ if(name == NULL || name[0] == 0
+ || U_FAILURE(errorCode) || cnv == NULL
+ || uprv_strlen(name)>=sizeof(gDefaultConverterNameBuffer))
+ {
+ /* Panic time, let's use a fallback. */
+#if (U_CHARSET_FAMILY == U_ASCII_FAMILY)
+ name = "US-ASCII";
+ /* there is no 'algorithmic' converter for EBCDIC */
+#elif defined(OS390)
+ name = "ibm-1047_P100-1995" UCNV_SWAP_LFNL_OPTION_STRING;
+#else
+ name = "ibm-37_P100-1995";
+#endif
+ }
+
+ internalSetName(name, &errorCode);
+
+ /* The close may make the current name go away. */
+ ucnv_close(cnv);
+ }
+
+ return name;
+}
+
+U_CAPI void U_EXPORT2
+ucnv_setDefaultName(const char *converterName) {
+ if(converterName==NULL) {
+ /* reset to the default codepage */
+ umtx_lock(&cnvCacheMutex);
+ gDefaultConverterName=NULL;
+ umtx_unlock(&cnvCacheMutex);
+ } else {
+ UErrorCode errorCode = U_ZERO_ERROR;
+ UConverter *cnv = NULL;
+ const char *name = NULL;
+
+ /* if the name is there, test it out and get the canonical name with options */
+ cnv = ucnv_open(converterName, &errorCode);
+ if(U_SUCCESS(errorCode) && cnv != NULL) {
+ name = ucnv_getName(cnv, &errorCode);
+ }
+
+ if(U_SUCCESS(errorCode) && name!=NULL) {
+ internalSetName(name, &errorCode);
+ }
+ /* else this converter is bad to use. Don't change it to a bad value. */
+
+ /* The close may make the current name go away. */
+ ucnv_close(cnv);
+ }
+}
+
/* data swapping ------------------------------------------------------------ */
/* most of this might belong more properly into ucnvmbcs.c, but that is so large */
@@ -1066,11 +1283,10 @@ ucnv_swap(const UDataSwapper *ds,
ds->swapArray32(ds, &inStaticData->codepage, 4,
&outStaticData->codepage, pErrorCode);
- ds->swapInvChars(ds, inStaticData->name, uprv_strlen(inStaticData->name),
+ ds->swapInvChars(ds, inStaticData->name, (int32_t)uprv_strlen(inStaticData->name),
outStaticData->name, pErrorCode);
if(U_FAILURE(*pErrorCode)) {
- udata_printError(ds, "ucnv_swap(): error swapping converter name - %s\n",
- u_errorName(*pErrorCode));
+ udata_printError(ds, "ucnv_swap(): error swapping converter name\n");
return 0;
}
}
@@ -1087,7 +1303,13 @@ ucnv_swap(const UDataSwapper *ds,
inMBCSHeader=(const _MBCSHeader *)inBytes;
outMBCSHeader=(_MBCSHeader *)outBytes;
- if(!(inMBCSHeader->version[0]==4 || inMBCSHeader->version[1]>=1)) {
+ if(0<=length && lengthversion[0]==4 && inMBCSHeader->version[1]>=1)) {
udata_printError(ds, "ucnv_swap(): unsupported _MBCSHeader.version %d.%d\n",
inMBCSHeader->version[0], inMBCSHeader->version[1]);
*pErrorCode=U_UNSUPPORTED_ERROR;
@@ -1103,7 +1325,7 @@ ucnv_swap(const UDataSwapper *ds,
mbcsHeader.flags= ds->readUInt32(inMBCSHeader->flags);
mbcsHeader.fromUBytesLength= ds->readUInt32(inMBCSHeader->fromUBytesLength);
- extOffset=(int32_t)mbcsHeader.flags>>8;
+ extOffset=(int32_t)(mbcsHeader.flags>>8);
outputType=(uint8_t)mbcsHeader.flags;
/* make sure that the output type is known */
@@ -1168,7 +1390,7 @@ ucnv_swap(const UDataSwapper *ds,
*/
/* swap the base name, between the header and the extension data */
- ds->swapInvChars(ds, inMBCSHeader+1, uprv_strlen((const char *)(inMBCSHeader+1)),
+ ds->swapInvChars(ds, inMBCSHeader+1, (int32_t)uprv_strlen((const char *)(inMBCSHeader+1)),
outMBCSHeader+1, pErrorCode);
} else {
/* normal file with base table data */
diff --git a/icuSources/common/ucnv_bld.h b/icuSources/common/ucnv_bld.h
index e3983ec4..75aa4d18 100644
--- a/icuSources/common/ucnv_bld.h
+++ b/icuSources/common/ucnv_bld.h
@@ -1,6 +1,6 @@
/*
**********************************************************************
-* Copyright (C) 1999-2004, International Business Machines
+* Copyright (C) 1999-2006, International Business Machines
* Corporation and others. All Rights Reserved.
**********************************************************************
*
@@ -157,6 +157,17 @@ struct UConverter {
const void *fromUContext;
const void *toUContext;
+ /*
+ * Pointer to charset bytes for substitution string if subCharLen>0,
+ * or pointer to Unicode string (UChar *) if subCharLen<0.
+ * subCharLen==0 is equivalent to using a skip callback.
+ * If the pointer is !=subUChars then it is allocated with
+ * UCNV_ERROR_BUFFER_LENGTH * U_SIZEOF_UCHAR bytes.
+ * The subUChars field is declared as UChar[] not uint8_t[] to
+ * guarantee alignment for UChars.
+ */
+ uint8_t *subChars;
+
UConverterSharedData *sharedData; /* Pointer to the shared immutable part of the converter object */
uint32_t options; /* options flags from UConverterOpen, may contain additional bits */
@@ -200,9 +211,9 @@ struct UConverter {
uint8_t subChar1; /* single-byte substitution character if different from subChar */
UBool useSubChar1;
- uint8_t subChar[UCNV_MAX_SUBCHAR_LEN]; /* codepage specific character sequence */
char invalidCharBuffer[UCNV_MAX_CHAR_LEN]; /* bytes from last error/callback situation */
uint8_t charErrorBuffer[UCNV_ERROR_BUFFER_LENGTH]; /* codepage output from Error functions */
+ UChar subUChars[UCNV_MAX_SUBCHAR_LEN/U_SIZEOF_UCHAR]; /* see subChars documentation */
UChar invalidUCharBuffer[U16_MAX_LENGTH]; /* UChars from last error/callback situation */
UChar UCharErrorBuffer[UCNV_ERROR_BUFFER_LENGTH]; /* unicode output from Error functions */
@@ -221,6 +232,26 @@ U_CDECL_END /* end of UConverter */
#define CONVERTER_FILE_EXTENSION ".cnv"
+
+/**
+ * Return the number of all converter names.
+ * @param pErrorCode The error code
+ * @return the number of all converter names
+ */
+U_CFUNC uint16_t
+ucnv_bld_countAvailableConverters(UErrorCode *pErrorCode);
+
+/**
+ * Return the (n)th converter name in mixed case, or NULL
+ * if there is none (typically, if the data cannot be loaded).
+ * 0<=indextarget >= args->targetLimit)
-- S. Hrcek */
{
- /* Overflowed the target. Now, we'll write into the charErrorBuffer.
+ /* Overflowed the target. Now, we'll write into the charErrorBuffer.
It's a fixed size. If we overflow it... Hmm */
char *newTarget;
const char *newTargetLimit;
@@ -126,49 +126,48 @@ ucnv_cbFromUWriteUChars(UConverterFromUnicodeArgs *args,
return;
}
- /* We're going to tell the converter that the errbuff len is empty.
- This prevents the existing errbuff from being 'flushed' out onto
- itself. If the errbuff is needed by the converter this time,
- we're hosed - we're out of space! */
-
- args->converter->charErrorBufferLength = 0;
-
- ucnv_fromUnicode(args->converter,
- &newTarget,
- newTargetLimit,
- source,
- sourceLimit,
- NULL,
- FALSE,
- &err2);
-
- /* We can go ahead and overwrite the length here. We know just how
- to recalculate it. */
-
- args->converter->charErrorBufferLength = (int8_t)(
- newTarget - (char*)args->converter->charErrorBuffer);
-
- if((newTarget >= newTargetLimit) || (err2 == U_BUFFER_OVERFLOW_ERROR))
- {
- /* now we're REALLY in trouble.
- Internal program error - callback shouldn't have written this much
- data!
- */
- *err = U_INTERNAL_PROGRAM_ERROR;
- return;
- }
- else
- {
- /* sub errs could be invalid/truncated/illegal chars or w/e.
- These might want to be passed on up.. But the problem is, we already
- need to pass U_BUFFER_OVERFLOW_ERROR. That has to override these
- other errs.. */
-
- /*
- if(U_FAILURE(err2))
- ??
- */
- }
+ /* We're going to tell the converter that the errbuff len is empty.
+ This prevents the existing errbuff from being 'flushed' out onto
+ itself. If the errbuff is needed by the converter this time,
+ we're hosed - we're out of space! */
+
+ args->converter->charErrorBufferLength = 0;
+
+ ucnv_fromUnicode(args->converter,
+ &newTarget,
+ newTargetLimit,
+ source,
+ sourceLimit,
+ NULL,
+ FALSE,
+ &err2);
+
+ /* We can go ahead and overwrite the length here. We know just how
+ to recalculate it. */
+
+ args->converter->charErrorBufferLength = (int8_t)(
+ newTarget - (char*)args->converter->charErrorBuffer);
+
+ if((newTarget >= newTargetLimit) || (err2 == U_BUFFER_OVERFLOW_ERROR))
+ {
+ /* now we're REALLY in trouble.
+ Internal program error - callback shouldn't have written this much
+ data!
+ */
+ *err = U_INTERNAL_PROGRAM_ERROR;
+ return;
+ }
+ /*else {*/
+ /* sub errs could be invalid/truncated/illegal chars or w/e.
+ These might want to be passed on up.. But the problem is, we already
+ need to pass U_BUFFER_OVERFLOW_ERROR. That has to override these
+ other errs.. */
+
+ /*
+ if(U_FAILURE(err2))
+ ??
+ */
+ /*}*/
}
}
@@ -177,19 +176,48 @@ ucnv_cbFromUWriteSub (UConverterFromUnicodeArgs *args,
int32_t offsetIndex,
UErrorCode * err)
{
+ UConverter *converter;
+ int32_t length;
+
if(U_FAILURE(*err)) {
return;
}
+ converter = args->converter;
+ length = converter->subCharLen;
- if(args->converter->sharedData->impl->writeSub!=NULL) {
- args->converter->sharedData->impl->writeSub(args, offsetIndex, err);
- } else if(args->converter->subChar1!=0 && args->converter->invalidUCharBuffer[0]<=0xff) {
+ if(length == 0) {
+ return;
+ }
+
+ if(length < 0) {
+ /*
+ * Write/convert the substitution string. Its real length is -length.
+ * Unlike the escape callback, we need not change the converter's
+ * callback function because ucnv_setSubstString() verified that
+ * the string can be converted, so we will not get a conversion error
+ * and will not recurse.
+ * At worst we should get a U_BUFFER_OVERFLOW_ERROR.
+ */
+ const UChar *source = (const UChar *)converter->subChars;
+ ucnv_cbFromUWriteUChars(args, &source, source - length, offsetIndex, err);
+ return;
+ }
+
+ if(converter->sharedData->impl->writeSub!=NULL) {
+ converter->sharedData->impl->writeSub(args, offsetIndex, err);
+ }
+ else if(converter->subChar1!=0 && (uint16_t)converter->invalidUCharBuffer[0]<=(uint16_t)0xffu) {
+ /*
+ TODO: Is this untestable because the MBCS converter has a writeSub function to call
+ and the other converters don't use subChar1?
+ */
ucnv_cbFromUWriteBytes(args,
- (const char *)&args->converter->subChar1, 1,
+ (const char *)&converter->subChar1, 1,
offsetIndex, err);
- } else {
+ }
+ else {
ucnv_cbFromUWriteBytes(args,
- (const char *)args->converter->subChar, args->converter->subCharLen,
+ (const char *)converter->subChars, length,
offsetIndex, err);
}
}
diff --git a/icuSources/common/ucnv_cnv.c b/icuSources/common/ucnv_cnv.c
index 48c22010..f8e2f830 100644
--- a/icuSources/common/ucnv_cnv.c
+++ b/icuSources/common/ucnv_cnv.c
@@ -28,7 +28,7 @@
U_CFUNC void
ucnv_getCompleteUnicodeSet(const UConverter *cnv,
- USetAdder *sa,
+ const USetAdder *sa,
UConverterUnicodeSet which,
UErrorCode *pErrorCode) {
sa->addRange(sa->set, 0, 0x10ffff);
@@ -36,7 +36,7 @@ ucnv_getCompleteUnicodeSet(const UConverter *cnv,
U_CFUNC void
ucnv_getNonSurrogateUnicodeSet(const UConverter *cnv,
- USetAdder *sa,
+ const USetAdder *sa,
UConverterUnicodeSet which,
UErrorCode *pErrorCode) {
sa->addRange(sa->set, 0, 0xd7ff);
diff --git a/icuSources/common/ucnv_cnv.h b/icuSources/common/ucnv_cnv.h
index e0692a50..e3de1014 100644
--- a/icuSources/common/ucnv_cnv.h
+++ b/icuSources/common/ucnv_cnv.h
@@ -171,7 +171,7 @@ typedef UConverter * (*UConverterSafeClone) (const UConverter *cnv,
* For more documentation, see ucnv_getUnicodeSet() in ucnv.h.
*/
typedef void (*UConverterGetUnicodeSet) (const UConverter *cnv,
- USetAdder *sa,
+ const USetAdder *sa,
UConverterUnicodeSet which,
UErrorCode *pErrorCode);
@@ -246,13 +246,13 @@ U_CDECL_END
U_CFUNC void
ucnv_getCompleteUnicodeSet(const UConverter *cnv,
- USetAdder *sa,
+ const USetAdder *sa,
UConverterUnicodeSet which,
UErrorCode *pErrorCode);
U_CFUNC void
ucnv_getNonSurrogateUnicodeSet(const UConverter *cnv,
- USetAdder *sa,
+ const USetAdder *sa,
UConverterUnicodeSet which,
UErrorCode *pErrorCode);
diff --git a/icuSources/common/ucnv_ext.c b/icuSources/common/ucnv_ext.c
index ed1bc65d..18fe3f94 100644
--- a/icuSources/common/ucnv_ext.c
+++ b/icuSources/common/ucnv_ext.c
@@ -932,7 +932,7 @@ ucnv_extContinueMatchFromU(UConverter *cnv,
static void
ucnv_extGetUnicodeSetString(const UConverterSharedData *sharedData,
const int32_t *cx,
- USetAdder *sa,
+ const USetAdder *sa,
UConverterUnicodeSet which,
int32_t minLength,
UChar32 c,
@@ -989,7 +989,7 @@ ucnv_extGetUnicodeSetString(const UConverterSharedData *sharedData,
U_CFUNC void
ucnv_extGetUnicodeSet(const UConverterSharedData *sharedData,
- USetAdder *sa,
+ const USetAdder *sa,
UConverterUnicodeSet which,
UErrorCode *pErrorCode) {
const int32_t *cx;
diff --git a/icuSources/common/ucnv_ext.h b/icuSources/common/ucnv_ext.h
index 6fb43d96..6ccd7669 100644
--- a/icuSources/common/ucnv_ext.h
+++ b/icuSources/common/ucnv_ext.h
@@ -384,7 +384,7 @@ ucnv_extContinueMatchFromU(UConverter *cnv,
U_CFUNC void
ucnv_extGetUnicodeSet(const UConverterSharedData *sharedData,
- USetAdder *sa,
+ const USetAdder *sa,
UConverterUnicodeSet which,
UErrorCode *pErrorCode);
diff --git a/icuSources/common/ucnv_imp.h b/icuSources/common/ucnv_imp.h
index 0f06c1e2..c1f48c0e 100644
--- a/icuSources/common/ucnv_imp.h
+++ b/icuSources/common/ucnv_imp.h
@@ -1,6 +1,6 @@
/*
**********************************************************************
-* Copyright (C) 1999-2004, International Business Machines
+* Copyright (C) 1999-2006, International Business Machines
* Corporation and others. All Rights Reserved.
**********************************************************************
*
@@ -87,12 +87,8 @@ ucnv_unloadSharedDataIfReady(UConverterSharedData *sharedData);
void
ucnv_incrementRefCount(UConverterSharedData *sharedData);
-/* Copy the string that is represented by the UConverterPlatform enum
- * @param platformString An output buffer
- * @param platform An enum representing a platform
- * @return the length of the copied string.
- */
-int32_t ucnv_copyPlatformString(char *platformString, UConverterPlatform platform);
+#define UCNV_TO_U_DEFAULT_CALLBACK ((UConverterToUCallback) UCNV_TO_U_CALLBACK_SUBSTITUTE)
+#define UCNV_FROM_U_DEFAULT_CALLBACK ((UConverterFromUCallback) UCNV_FROM_U_CALLBACK_SUBSTITUTE)
#endif
diff --git a/icuSources/common/ucnv_io.c b/icuSources/common/ucnv_io.c
index a86af8f5..4e570e55 100644
--- a/icuSources/common/ucnv_io.c
+++ b/icuSources/common/ucnv_io.c
@@ -1,15 +1,15 @@
/*
******************************************************************************
*
-* Copyright (C) 1999-2004, International Business Machines
+* Copyright (C) 1999-2006, International Business Machines
* Corporation and others. All Rights Reserved.
*
******************************************************************************
*
*
* ucnv_io.c:
-* initializes global variables and defines functions pertaining to file
-* access, and name resolution aspect of the library.
+* initializes global variables and defines functions pertaining to converter
+* name resolution aspect of the conversion code.
*
* new implementation:
*
@@ -31,8 +31,7 @@
#if !UCONFIG_NO_CONVERSION
-#include "unicode/putil.h"
-#include "unicode/ucnv.h" /* This file implements ucnv_xXXX() APIs */
+#include "unicode/ucnv.h"
#include "unicode/udata.h"
#include "umutex.h"
@@ -74,6 +73,8 @@
* index of this list is also used by other sections, like the 4th section.
* The index for the 3rd and 4th section is used to get the
* alias -> converter name mapping. Section 3 and 4 form a two column table.
+ * Some of the most significant bits of each index may contain other
+ * information (see findConverter for details).
*
* 4) This section contains a list of mapped converter names. Consider this
* as a table that maps the 3rd section to the 1st section. This list contains
@@ -95,8 +96,10 @@
* the third dimension to the section 5. No other section should be referencing
* this section.
*
- * 7) Reserved at this time (There is no information). This _usually_ has a
- * size of 0. Future versions may add more information here.
+ * 7) Starting in ICU 3.6, this can be a UConverterAliasOptions struct. Its
+ * presence indicates that a section 9 exists. UConverterAliasOptions specifies
+ * what type of string normalization is used among other potential things in the
+ * future.
*
* 8) This is the string table. All strings are indexed on an even address.
* There are two reasons for this. First many chip architectures locate strings
@@ -104,6 +107,10 @@
* numbers, this string table can be 128KB in size instead of 64KB when we
* only have strings starting on an even address.
*
+ * 9) When present this is a set of prenormalized strings from section 8. This
+ * table contains normalized strings with the dashes and spaces stripped out,
+ * and all strings lowercased. In the future, the options in section 7 may state
+ * other types of normalization.
*
* Here is the concept of section 5 and 6. It's a 3D cube. Each tag
* has a unique alias among all converters. That same alias can
@@ -174,35 +181,21 @@ enum {
untaggedConvArrayIndex=4,
taggedAliasArrayIndex=5,
taggedAliasListsIndex=6,
- reservedIndex1=7,
+ tableOptionsIndex=7,
stringTableIndex=8,
- minTocLength=8, /* min. tocLength in the file, does not count the tocLengthIndex! */
- offsetsCount /* length of the swapper's temporary offsets[] */
+ normalizedStringTableIndex=9,
+ offsetsCount, /* length of the swapper's temporary offsets[] */
+ minTocLength=8 /* min. tocLength in the file, does not count the tocLengthIndex! */
};
-static const uint16_t *gConverterList = NULL;
-static const uint16_t *gTagList = NULL;
-static const uint16_t *gAliasList = NULL;
-static const uint16_t *gUntaggedConvArray = NULL;
-static const uint16_t *gTaggedAliasArray = NULL;
-static const uint16_t *gTaggedAliasLists = NULL;
-static const uint16_t *gStringTable = NULL;
-
-static uint32_t gConverterListSize;
-static uint32_t gTagListSize;
-static uint32_t gAliasListSize;
-static uint32_t gUntaggedConvArraySize;
-static uint32_t gTaggedAliasArraySize;
-static uint32_t gTaggedAliasListsSize;
-static uint32_t gStringTableSize;
-
-static const char **gAvailableConverters = NULL;
-static uint16_t gAvailableConverterCount = 0;
-
-static char gDefaultConverterNameBuffer[UCNV_MAX_CONVERTER_NAME_LENGTH + 1]; /* +1 for NULL */
-static const char *gDefaultConverterName = NULL;
+static const UConverterAliasOptions defaultTableOptions = {
+ UCNV_IO_UNNORMALIZED,
+ 0 /* containsCnvOptionInfo */
+};
+static UConverterAlias gMainTable;
-#define GET_STRING(idx) (const char *)(gStringTable + (idx))
+#define GET_STRING(idx) (const char *)(gMainTable.stringTable + (idx))
+#define GET_NORMALIZED_STRING(idx) (const char *)(gMainTable.normalizedStringTable + (idx))
static UBool U_CALLCONV
isAcceptable(void *context,
@@ -226,49 +219,27 @@ static UBool U_CALLCONV ucnv_io_cleanup(void)
gAliasData = NULL;
}
- ucnv_io_flushAvailableConverterCache();
-
- gConverterListSize = 0;
- gTagListSize = 0;
- gAliasListSize = 0;
- gUntaggedConvArraySize = 0;
- gTaggedAliasArraySize = 0;
- gTaggedAliasListsSize = 0;
- gStringTableSize = 0;
-
- gConverterList = NULL;
- gTagList = NULL;
- gAliasList = NULL;
- gUntaggedConvArray = NULL;
- gTaggedAliasArray = NULL;
- gTaggedAliasLists = NULL;
- gStringTable = NULL;
-
- gDefaultConverterName = NULL;
- gDefaultConverterNameBuffer[0] = 0;
+ uprv_memset(&gMainTable, 0, sizeof(gMainTable));
return TRUE; /* Everything was cleaned up */
}
static UBool
haveAliasData(UErrorCode *pErrorCode) {
- int haveData;
+ int needInit;
if(pErrorCode==NULL || U_FAILURE(*pErrorCode)) {
return FALSE;
}
- umtx_lock(NULL);
- haveData = (int)(gAliasData==NULL);
- umtx_unlock(NULL);
+ UMTX_CHECK(NULL, (gAliasData==NULL), needInit);
/* load converter alias data from file if necessary */
- if (haveData) {
+ if (needInit) {
UDataMemory *data = NULL;
const uint16_t *table = NULL;
uint32_t tableStart;
uint32_t currOffset;
- uint32_t reservedSize1;
data = udata_openChoice(NULL, DATA_TYPE, DATA_NAME, isAcceptable, NULL, pErrorCode);
if(U_FAILURE(*pErrorCode)) {
@@ -289,39 +260,57 @@ haveAliasData(UErrorCode *pErrorCode) {
gAliasData = data;
data=NULL;
- gConverterListSize = ((const uint32_t *)(table))[1];
- gTagListSize = ((const uint32_t *)(table))[2];
- gAliasListSize = ((const uint32_t *)(table))[3];
- gUntaggedConvArraySize = ((const uint32_t *)(table))[4];
- gTaggedAliasArraySize = ((const uint32_t *)(table))[5];
- gTaggedAliasListsSize = ((const uint32_t *)(table))[6];
- reservedSize1 = ((const uint32_t *)(table))[7]; /* reserved */
- gStringTableSize = ((const uint32_t *)(table))[8];
+ gMainTable.converterListSize = ((const uint32_t *)(table))[1];
+ gMainTable.tagListSize = ((const uint32_t *)(table))[2];
+ gMainTable.aliasListSize = ((const uint32_t *)(table))[3];
+ gMainTable.untaggedConvArraySize = ((const uint32_t *)(table))[4];
+ gMainTable.taggedAliasArraySize = ((const uint32_t *)(table))[5];
+ gMainTable.taggedAliasListsSize = ((const uint32_t *)(table))[6];
+ gMainTable.optionTableSize = ((const uint32_t *)(table))[7];
+ gMainTable.stringTableSize = ((const uint32_t *)(table))[8];
+
+ if (((const uint32_t *)(table))[0] > 8) {
+ gMainTable.normalizedStringTableSize = ((const uint32_t *)(table))[9];
+ }
currOffset = tableStart * (sizeof(uint32_t)/sizeof(uint16_t)) + (sizeof(uint32_t)/sizeof(uint16_t));
- gConverterList = table + currOffset;
+ gMainTable.converterList = table + currOffset;
- currOffset += gConverterListSize;
- gTagList = table + currOffset;
+ currOffset += gMainTable.converterListSize;
+ gMainTable.tagList = table + currOffset;
- currOffset += gTagListSize;
- gAliasList = table + currOffset;
+ currOffset += gMainTable.tagListSize;
+ gMainTable.aliasList = table + currOffset;
- currOffset += gAliasListSize;
- gUntaggedConvArray = table + currOffset;
+ currOffset += gMainTable.aliasListSize;
+ gMainTable.untaggedConvArray = table + currOffset;
- currOffset += gUntaggedConvArraySize;
- gTaggedAliasArray = table + currOffset;
+ currOffset += gMainTable.untaggedConvArraySize;
+ gMainTable.taggedAliasArray = table + currOffset;
/* aliasLists is a 1's based array, but it has a padding character */
- currOffset += gTaggedAliasArraySize;
- gTaggedAliasLists = table + currOffset;
+ currOffset += gMainTable.taggedAliasArraySize;
+ gMainTable.taggedAliasLists = table + currOffset;
- currOffset += gTaggedAliasListsSize;
- /* reserved */
+ currOffset += gMainTable.taggedAliasListsSize;
+ if (gMainTable.optionTableSize > 0
+ && ((const UConverterAliasOptions *)(table + currOffset))->stringNormalizationType < UCNV_IO_NORM_TYPE_COUNT)
+ {
+ /* Faster table */
+ gMainTable.optionTable = (const UConverterAliasOptions *)(table + currOffset);
+ }
+ else {
+ /* Smaller table, or I can't handle this normalization mode!
+ Use the original slower table lookup. */
+ gMainTable.optionTable = &defaultTableOptions;
+ }
- currOffset += reservedSize1;
- gStringTable = table + currOffset;
+ currOffset += gMainTable.optionTableSize;
+ gMainTable.stringTable = table + currOffset;
+
+ currOffset += gMainTable.stringTableSize;
+ gMainTable.normalizedStringTable = ((gMainTable.optionTable->stringNormalizationType == UCNV_IO_UNNORMALIZED)
+ ? gMainTable.stringTable : (table + currOffset));
ucln_common_registerCleanup(UCLN_COMMON_UCNV_IO, ucnv_io_cleanup);
}
@@ -341,18 +330,15 @@ isAlias(const char *alias, UErrorCode *pErrorCode) {
if(alias==NULL) {
*pErrorCode=U_ILLEGAL_ARGUMENT_ERROR;
return FALSE;
- } else if(*alias==0) {
- return FALSE;
- } else {
- return TRUE;
}
+ return (UBool)(*alias!=0);
}
static uint32_t getTagNumber(const char *tagname) {
- if (gTagList) {
+ if (gMainTable.tagList) {
uint32_t tagNum;
- for (tagNum = 0; tagNum < gTagListSize; tagNum++) {
- if (!uprv_stricmp(GET_STRING(gTagList[tagNum]), tagname)) {
+ for (tagNum = 0; tagNum < gMainTable.tagListSize; tagNum++) {
+ if (!uprv_stricmp(GET_STRING(gMainTable.tagList[tagNum]), tagname)) {
return tagNum;
}
}
@@ -361,48 +347,128 @@ static uint32_t getTagNumber(const char *tagname) {
return UINT32_MAX;
}
+/* character types relevant for ucnv_compareNames() */
+enum {
+ IGNORE,
+ ZERO,
+ NONZERO,
+ MINLETTER /* any values from here on are lowercase letter mappings */
+};
+
+/* character types for ASCII 00..7F */
+static const uint8_t asciiTypes[128] = {
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ ZERO, NONZERO, NONZERO, NONZERO, NONZERO, NONZERO, NONZERO, NONZERO, NONZERO, NONZERO, 0, 0, 0, 0, 0, 0,
+ 0, 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, 0, 0, 0, 0,
+ 0, 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, 0, 0, 0, 0
+};
+
+#define GET_ASCII_TYPE(c) ((int8_t)(c) >= 0 ? asciiTypes[(uint8_t)c] : (uint8_t)IGNORE)
+
+/* character types for EBCDIC 80..FF */
+static const uint8_t ebcdicTypes[128] = {
+ 0, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0, 0, 0, 0, 0, 0,
+ 0, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0, 0, 0, 0, 0, 0,
+ 0, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0, 0, 0, 0, 0, 0,
+ ZERO, NONZERO, NONZERO, NONZERO, NONZERO, NONZERO, NONZERO, NONZERO, NONZERO, NONZERO, 0, 0, 0, 0, 0, 0
+};
+
+#define GET_EBCDIC_TYPE(c) ((int8_t)(c) < 0 ? ebcdicTypes[(c)&0x7f] : (uint8_t)IGNORE)
+
+#if U_CHARSET_FAMILY==U_ASCII_FAMILY
+# define GET_CHAR_TYPE(c) GET_ASCII_TYPE(c)
+#elif U_CHARSET_FAMILY==U_EBCDIC_FAMILY
+# define GET_CHAR_TYPE(c) GET_EBCDIC_TYPE(c)
+#else
+# error U_CHARSET_FAMILY is not valid
+#endif
+
/* @see ucnv_compareNames */
U_CFUNC char * U_EXPORT2
ucnv_io_stripASCIIForCompare(char *dst, const char *name) {
- char c1 = *name;
char *dstItr = dst;
-
- while (c1) {
- /* Ignore delimiters '-', '_', and ' ' */
- while ((c1 = *name) == 0x2d || c1 == 0x5f || c1 == 0x20) {
- ++name;
+ uint8_t type, nextType;
+ char c1;
+ UBool afterDigit = FALSE;
+
+ while ((c1 = *name++) != 0) {
+ type = GET_ASCII_TYPE(c1);
+ switch (type) {
+ case IGNORE:
+ afterDigit = FALSE;
+ continue; /* ignore all but letters and digits */
+ case ZERO:
+ if (!afterDigit) {
+ nextType = GET_ASCII_TYPE(*name);
+ if (nextType == ZERO || nextType == NONZERO) {
+ continue; /* ignore leading zero before another digit */
+ }
+ }
+ break;
+ case NONZERO:
+ afterDigit = TRUE;
+ break;
+ default:
+ c1 = (char)type; /* lowercased letter */
+ afterDigit = FALSE;
+ break;
}
-
- /* lowercase for case-insensitive comparison */
- *(dstItr++) = uprv_asciitolower(c1);
- ++name;
+ *dstItr++ = c1;
}
+ *dstItr = 0;
return dst;
}
U_CFUNC char * U_EXPORT2
ucnv_io_stripEBCDICForCompare(char *dst, const char *name) {
- char c1 = *name;
char *dstItr = dst;
-
- while (c1) {
- /* Ignore delimiters '-', '_', and ' ' */
- while ((c1 = *name) == 0x60 || c1 == 0x6d || c1 == 0x40) {
- ++name;
+ uint8_t type, nextType;
+ char c1;
+ UBool afterDigit = FALSE;
+
+ while ((c1 = *name++) != 0) {
+ type = GET_EBCDIC_TYPE(c1);
+ switch (type) {
+ case IGNORE:
+ afterDigit = FALSE;
+ continue; /* ignore all but letters and digits */
+ case ZERO:
+ if (!afterDigit) {
+ nextType = GET_EBCDIC_TYPE(*name);
+ if (nextType == ZERO || nextType == NONZERO) {
+ continue; /* ignore leading zero before another digit */
+ }
+ }
+ break;
+ case NONZERO:
+ afterDigit = TRUE;
+ break;
+ default:
+ c1 = (char)type; /* lowercased letter */
+ afterDigit = FALSE;
+ break;
}
-
- /* lowercase for case-insensitive comparison */
- *(dstItr++) = uprv_ebcdictolower(c1);
- ++name;
+ *dstItr++ = c1;
}
+ *dstItr = 0;
return dst;
}
/**
- * Do a fuzzy compare of a two converter/alias names. The comparison
- * is case-insensitive. It also ignores the characters '-', '_', and
- * ' ' (dash, underscore, and space). Thus the strings "UTF-8",
- * "utf_8", and "Utf 8" are exactly equivalent.
+ * Do a fuzzy compare of two converter/alias names.
+ * The comparison is case-insensitive, ignores leading zeroes if they are not
+ * followed by further digits, and ignores all but letters and digits.
+ * Thus the strings "UTF-8", "utf_8", "u*T@f08" and "Utf 8" are exactly equivalent.
+ * See section 1.4, Charset Alias Matching in Unicode Technical Standard #22
+ * at http://www.unicode.org/reports/tr22/
*
* This is a symmetrical (commutative) operation; order of arguments
* is insignificant. This is an important property for sorting the
@@ -420,15 +486,58 @@ ucnv_io_stripEBCDICForCompare(char *dst, const char *name) {
U_CAPI int U_EXPORT2
ucnv_compareNames(const char *name1, const char *name2) {
int rc;
+ uint8_t type, nextType;
char c1, c2;
+ UBool afterDigit1 = FALSE, afterDigit2 = FALSE;
for (;;) {
- /* Ignore delimiters '-', '_', and ' ' */
- while ((c1 = *name1) == '-' || c1 == '_' || c1 == ' ') {
- ++name1;
+ while ((c1 = *name1++) != 0) {
+ type = GET_CHAR_TYPE(c1);
+ switch (type) {
+ case IGNORE:
+ afterDigit1 = FALSE;
+ continue; /* ignore all but letters and digits */
+ case ZERO:
+ if (!afterDigit1) {
+ nextType = GET_CHAR_TYPE(*name1);
+ if (nextType == ZERO || nextType == NONZERO) {
+ continue; /* ignore leading zero before another digit */
+ }
+ }
+ break;
+ case NONZERO:
+ afterDigit1 = TRUE;
+ break;
+ default:
+ c1 = (char)type; /* lowercased letter */
+ afterDigit1 = FALSE;
+ break;
+ }
+ break; /* deliver c1 */
}
- while ((c2 = *name2) == '-' || c2 == '_' || c2 == ' ') {
- ++name2;
+ while ((c2 = *name2++) != 0) {
+ type = GET_CHAR_TYPE(c2);
+ switch (type) {
+ case IGNORE:
+ afterDigit2 = FALSE;
+ continue; /* ignore all but letters and digits */
+ case ZERO:
+ if (!afterDigit2) {
+ nextType = GET_CHAR_TYPE(*name2);
+ if (nextType == ZERO || nextType == NONZERO) {
+ continue; /* ignore leading zero before another digit */
+ }
+ }
+ break;
+ case NONZERO:
+ afterDigit2 = TRUE;
+ break;
+ default:
+ c2 = (char)type; /* lowercased letter */
+ afterDigit2 = FALSE;
+ break;
+ }
+ break; /* deliver c2 */
}
/* If we reach the ends of both strings then they match */
@@ -437,13 +546,10 @@ ucnv_compareNames(const char *name1, const char *name2) {
}
/* Case-insensitive comparison */
- rc = (int)(unsigned char)uprv_tolower(c1) -
- (int)(unsigned char)uprv_tolower(c2);
+ rc = (int)(unsigned char)c1 - (int)(unsigned char)c2;
if (rc != 0) {
return rc;
}
- ++name1;
- ++name2;
}
}
@@ -452,14 +558,27 @@ ucnv_compareNames(const char *name1, const char *name2) {
* return the converter number index for gConverterList
*/
static U_INLINE uint32_t
-findConverter(const char *alias, UErrorCode *pErrorCode) {
+findConverter(const char *alias, UBool *containsOption, UErrorCode *pErrorCode) {
uint32_t mid, start, limit;
uint32_t lastMid;
int result;
+ int isUnnormalized = (gMainTable.optionTable->stringNormalizationType == UCNV_IO_UNNORMALIZED);
+ char strippedName[UCNV_MAX_CONVERTER_NAME_LENGTH];
+
+ if (!isUnnormalized) {
+ if (uprv_strlen(alias) >= UCNV_MAX_CONVERTER_NAME_LENGTH) {
+ *pErrorCode = U_BUFFER_OVERFLOW_ERROR;
+ return UINT32_MAX;
+ }
+
+ /* Lower case and remove ignoreable characters. */
+ ucnv_io_stripForCompare(strippedName, alias);
+ alias = strippedName;
+ }
/* do a binary search for the alias */
start = 0;
- limit = gUntaggedConvArraySize;
+ limit = gMainTable.untaggedConvArraySize;
mid = limit;
lastMid = UINT32_MAX;
@@ -469,7 +588,12 @@ findConverter(const char *alias, UErrorCode *pErrorCode) {
break; /* We haven't moved, and it wasn't found. */
}
lastMid = mid;
- result = ucnv_compareNames(alias, GET_STRING(gAliasList[mid]));
+ if (isUnnormalized) {
+ result = ucnv_compareNames(alias, GET_STRING(gMainTable.aliasList[mid]));
+ }
+ else {
+ result = uprv_strcmp(alias, GET_NORMALIZED_STRING(gMainTable.aliasList[mid]));
+ }
if (result < 0) {
limit = mid;
@@ -480,10 +604,18 @@ findConverter(const char *alias, UErrorCode *pErrorCode) {
* this alias in gAliasList is unique, but different standards
* may map an alias to different converters.
*/
- if (gUntaggedConvArray[mid] & UCNV_AMBIGUOUS_ALIAS_MAP_BIT) {
+ if (gMainTable.untaggedConvArray[mid] & UCNV_AMBIGUOUS_ALIAS_MAP_BIT) {
*pErrorCode = U_AMBIGUOUS_ALIAS_WARNING;
}
- return gUntaggedConvArray[mid] & UCNV_CONVERTER_INDEX_MASK;
+ /* State whether the canonical converter name contains an option.
+ This information is contained in this list in order to maintain backward & forward compatibility. */
+ if (containsOption) {
+ UBool containsCnvOptionInfo = (UBool)gMainTable.optionTable->containsCnvOptionInfo;
+ *containsOption = (UBool)((containsCnvOptionInfo
+ && ((gMainTable.untaggedConvArray[mid] & UCNV_CONTAINS_OPTION_BIT) != 0))
+ || !containsCnvOptionInfo);
+ }
+ return gMainTable.untaggedConvArray[mid] & UCNV_CONVERTER_INDEX_MASK;
}
}
@@ -498,9 +630,9 @@ static U_INLINE UBool
isAliasInList(const char *alias, uint32_t listOffset) {
if (listOffset) {
uint32_t currAlias;
- uint32_t listCount = gTaggedAliasLists[listOffset];
+ uint32_t listCount = gMainTable.taggedAliasLists[listOffset];
/* +1 to skip listCount */
- const uint16_t *currList = gTaggedAliasLists + listOffset + 1;
+ const uint16_t *currList = gMainTable.taggedAliasLists + listOffset + 1;
for (currAlias = 0; currAlias < listCount; currAlias++) {
if (currList[currAlias]
&& ucnv_compareNames(alias, GET_STRING(currList[currAlias]))==0)
@@ -527,14 +659,14 @@ findTaggedAliasListsOffset(const char *alias, const char *standard, UErrorCode *
uint32_t tagNum = getTagNumber(standard);
/* Make a quick guess. Hopefully they used a TR22 canonical alias. */
- convNum = findConverter(alias, &myErr);
+ convNum = findConverter(alias, NULL, &myErr);
if (myErr != U_ZERO_ERROR) {
*pErrorCode = myErr;
}
- if (tagNum < (gTagListSize - UCNV_NUM_HIDDEN_TAGS) && convNum < gConverterListSize) {
- listOffset = gTaggedAliasArray[tagNum*gConverterListSize + convNum];
- if (listOffset && gTaggedAliasLists[listOffset + 1]) {
+ if (tagNum < (gMainTable.tagListSize - UCNV_NUM_HIDDEN_TAGS) && convNum < gMainTable.converterListSize) {
+ listOffset = gMainTable.taggedAliasArray[tagNum*gMainTable.converterListSize + convNum];
+ if (listOffset && gMainTable.taggedAliasLists[listOffset + 1]) {
return listOffset;
}
if (myErr == U_AMBIGUOUS_ALIAS_WARNING) {
@@ -543,13 +675,13 @@ findTaggedAliasListsOffset(const char *alias, const char *standard, UErrorCode *
at the highest standard affinity.
This may take a while.
*/
- for (idx = 0; idx < gTaggedAliasArraySize; idx++) {
- listOffset = gTaggedAliasArray[idx];
+ for (idx = 0; idx < gMainTable.taggedAliasArraySize; idx++) {
+ listOffset = gMainTable.taggedAliasArray[idx];
if (listOffset && isAliasInList(alias, listOffset)) {
- uint32_t currTagNum = idx/gConverterListSize;
- uint32_t currConvNum = (idx - currTagNum*gConverterListSize);
- uint32_t tempListOffset = gTaggedAliasArray[tagNum*gConverterListSize + currConvNum];
- if (tempListOffset && gTaggedAliasLists[tempListOffset + 1]) {
+ uint32_t currTagNum = idx/gMainTable.converterListSize;
+ uint32_t currConvNum = (idx - currTagNum*gMainTable.converterListSize);
+ uint32_t tempListOffset = gMainTable.taggedAliasArray[tagNum*gMainTable.converterListSize + currConvNum];
+ if (tempListOffset && gMainTable.taggedAliasLists[tempListOffset + 1]) {
return tempListOffset;
}
/* else keep on looking */
@@ -578,13 +710,13 @@ findTaggedConverterNum(const char *alias, const char *standard, UErrorCode *pErr
uint32_t tagNum = getTagNumber(standard);
/* Make a quick guess. Hopefully they used a TR22 canonical alias. */
- convNum = findConverter(alias, &myErr);
+ convNum = findConverter(alias, NULL, &myErr);
if (myErr != U_ZERO_ERROR) {
*pErrorCode = myErr;
}
- if (tagNum < (gTagListSize - UCNV_NUM_HIDDEN_TAGS) && convNum < gConverterListSize) {
- listOffset = gTaggedAliasArray[tagNum*gConverterListSize + convNum];
+ if (tagNum < (gMainTable.tagListSize - UCNV_NUM_HIDDEN_TAGS) && convNum < gMainTable.converterListSize) {
+ listOffset = gMainTable.taggedAliasArray[tagNum*gMainTable.converterListSize + convNum];
if (listOffset && isAliasInList(alias, listOffset)) {
return convNum;
}
@@ -594,10 +726,10 @@ findTaggedConverterNum(const char *alias, const char *standard, UErrorCode *pErr
We search only in the requested tag, not the whole thing.
This may take a while.
*/
- uint32_t convStart = (tagNum)*gConverterListSize;
- uint32_t convLimit = (tagNum+1)*gConverterListSize;
+ uint32_t convStart = (tagNum)*gMainTable.converterListSize;
+ uint32_t convLimit = (tagNum+1)*gMainTable.converterListSize;
for (idx = convStart; idx < convLimit; idx++) {
- listOffset = gTaggedAliasArray[idx];
+ listOffset = gMainTable.taggedAliasArray[idx];
if (listOffset && isAliasInList(alias, listOffset)) {
return idx-convStart;
}
@@ -614,11 +746,11 @@ findTaggedConverterNum(const char *alias, const char *standard, UErrorCode *pErr
U_CFUNC const char *
-ucnv_io_getConverterName(const char *alias, UErrorCode *pErrorCode) {
+ucnv_io_getConverterName(const char *alias, UBool *containsOption, UErrorCode *pErrorCode) {
if(haveAliasData(pErrorCode) && isAlias(alias, pErrorCode)) {
- uint32_t convNum = findConverter(alias, pErrorCode);
- if (convNum < gConverterListSize) {
- return GET_STRING(gConverterList[convNum]);
+ uint32_t convNum = findConverter(alias, containsOption, pErrorCode);
+ if (convNum < gMainTable.converterListSize) {
+ return GET_STRING(gMainTable.converterList[convNum]);
}
/* else converter not found */
}
@@ -632,7 +764,7 @@ ucnv_io_countStandardAliases(UEnumeration *enumerator, UErrorCode *pErrorCode) {
uint32_t listOffset = myContext->listOffset;
if (listOffset) {
- value = gTaggedAliasLists[listOffset];
+ value = gMainTable.taggedAliasLists[listOffset];
}
return value;
}
@@ -646,8 +778,8 @@ ucnv_io_nextStandardAliases(UEnumeration *enumerator,
uint32_t listOffset = myContext->listOffset;
if (listOffset) {
- uint32_t listCount = gTaggedAliasLists[listOffset];
- const uint16_t *currList = gTaggedAliasLists + listOffset + 1;
+ uint32_t listCount = gMainTable.taggedAliasLists[listOffset];
+ const uint16_t *currList = gMainTable.taggedAliasLists + listOffset + 1;
if (myContext->listIdx < listCount) {
const char *myStr = GET_STRING(currList[myContext->listIdx++]);
@@ -658,7 +790,9 @@ ucnv_io_nextStandardAliases(UEnumeration *enumerator,
}
}
/* Either we accessed a zero length list, or we enumerated too far. */
- *pErrorCode = U_INDEX_OUTOFBOUNDS_ERROR;
+ if (resultLength) {
+ *resultLength = 0;
+ }
return NULL;
}
@@ -696,7 +830,7 @@ ucnv_openStandardNames(const char *convName,
/* When listOffset == 0, we want to acknowledge that the
converter name and standard are okay, but there
is nothing to enumerate. */
- if (listOffset < gTaggedAliasListsSize) {
+ if (listOffset < gMainTable.taggedAliasListsSize) {
UAliasContext *myContext;
myEnum = uprv_malloc(sizeof(UEnumeration));
@@ -720,16 +854,16 @@ ucnv_openStandardNames(const char *convName,
return myEnum;
}
-U_CFUNC uint16_t
+static uint16_t
ucnv_io_countAliases(const char *alias, UErrorCode *pErrorCode) {
if(haveAliasData(pErrorCode) && isAlias(alias, pErrorCode)) {
- uint32_t convNum = findConverter(alias, pErrorCode);
- if (convNum < gConverterListSize) {
+ uint32_t convNum = findConverter(alias, NULL, pErrorCode);
+ if (convNum < gMainTable.converterListSize) {
/* tagListNum - 1 is the ALL tag */
- int32_t listOffset = gTaggedAliasArray[(gTagListSize - 1)*gConverterListSize + convNum];
+ int32_t listOffset = gMainTable.taggedAliasArray[(gMainTable.tagListSize - 1)*gMainTable.converterListSize + convNum];
if (listOffset) {
- return gTaggedAliasLists[listOffset];
+ return gMainTable.taggedAliasLists[listOffset];
}
/* else this shouldn't happen. internal program error */
}
@@ -738,19 +872,19 @@ ucnv_io_countAliases(const char *alias, UErrorCode *pErrorCode) {
return 0;
}
-U_CFUNC uint16_t
+static uint16_t
ucnv_io_getAliases(const char *alias, uint16_t start, const char **aliases, UErrorCode *pErrorCode) {
if(haveAliasData(pErrorCode) && isAlias(alias, pErrorCode)) {
uint32_t currAlias;
- uint32_t convNum = findConverter(alias, pErrorCode);
- if (convNum < gConverterListSize) {
+ uint32_t convNum = findConverter(alias, NULL, pErrorCode);
+ if (convNum < gMainTable.converterListSize) {
/* tagListNum - 1 is the ALL tag */
- int32_t listOffset = gTaggedAliasArray[(gTagListSize - 1)*gConverterListSize + convNum];
+ int32_t listOffset = gMainTable.taggedAliasArray[(gMainTable.tagListSize - 1)*gMainTable.converterListSize + convNum];
if (listOffset) {
- uint32_t listCount = gTaggedAliasLists[listOffset];
+ uint32_t listCount = gMainTable.taggedAliasLists[listOffset];
/* +1 to skip listCount */
- const uint16_t *currList = gTaggedAliasLists + listOffset + 1;
+ const uint16_t *currList = gMainTable.taggedAliasLists + listOffset + 1;
for (currAlias = start; currAlias < listCount; currAlias++) {
aliases[currAlias] = GET_STRING(currList[currAlias]);
@@ -763,18 +897,18 @@ ucnv_io_getAliases(const char *alias, uint16_t start, const char **aliases, UErr
return 0;
}
-U_CFUNC const char *
+static const char *
ucnv_io_getAlias(const char *alias, uint16_t n, UErrorCode *pErrorCode) {
if(haveAliasData(pErrorCode) && isAlias(alias, pErrorCode)) {
- uint32_t convNum = findConverter(alias, pErrorCode);
- if (convNum < gConverterListSize) {
+ uint32_t convNum = findConverter(alias, NULL, pErrorCode);
+ if (convNum < gMainTable.converterListSize) {
/* tagListNum - 1 is the ALL tag */
- int32_t listOffset = gTaggedAliasArray[(gTagListSize - 1)*gConverterListSize + convNum];
+ int32_t listOffset = gMainTable.taggedAliasArray[(gMainTable.tagListSize - 1)*gMainTable.converterListSize + convNum];
if (listOffset) {
- uint32_t listCount = gTaggedAliasLists[listOffset];
+ uint32_t listCount = gMainTable.taggedAliasLists[listOffset];
/* +1 to skip listCount */
- const uint16_t *currList = gTaggedAliasLists + listOffset + 1;
+ const uint16_t *currList = gMainTable.taggedAliasLists + listOffset + 1;
if (n < listCount) {
return GET_STRING(currList[n]);
@@ -788,11 +922,11 @@ ucnv_io_getAlias(const char *alias, uint16_t n, UErrorCode *pErrorCode) {
return NULL;
}
-U_CFUNC uint16_t
+static uint16_t
ucnv_io_countStandards(UErrorCode *pErrorCode) {
if (haveAliasData(pErrorCode)) {
/* Don't include the empty list */
- return (uint16_t)(gTagListSize - UCNV_NUM_HIDDEN_TAGS);
+ return (uint16_t)(gMainTable.tagListSize - UCNV_NUM_HIDDEN_TAGS);
}
return 0;
@@ -801,8 +935,8 @@ ucnv_io_countStandards(UErrorCode *pErrorCode) {
U_CAPI const char * U_EXPORT2
ucnv_getStandard(uint16_t n, UErrorCode *pErrorCode) {
if (haveAliasData(pErrorCode)) {
- if (n < gTagListSize - UCNV_NUM_HIDDEN_TAGS) {
- return GET_STRING(gTagList[n]);
+ if (n < gMainTable.tagListSize - UCNV_NUM_HIDDEN_TAGS) {
+ return GET_STRING(gMainTable.tagList[n]);
}
*pErrorCode = U_INDEX_OUTOFBOUNDS_ERROR;
}
@@ -815,8 +949,8 @@ ucnv_getStandardName(const char *alias, const char *standard, UErrorCode *pError
if (haveAliasData(pErrorCode) && isAlias(alias, pErrorCode)) {
uint32_t listOffset = findTaggedAliasListsOffset(alias, standard, pErrorCode);
- if (0 < listOffset && listOffset < gTaggedAliasListsSize) {
- const uint16_t *currList = gTaggedAliasLists + listOffset + 1;
+ if (0 < listOffset && listOffset < gMainTable.taggedAliasListsSize) {
+ const uint16_t *currList = gMainTable.taggedAliasLists + listOffset + 1;
/* Get the preferred name from this list */
if (currList[0]) {
@@ -830,96 +964,48 @@ ucnv_getStandardName(const char *alias, const char *standard, UErrorCode *pError
return NULL;
}
-U_CAPI const char * U_EXPORT2
-ucnv_getCanonicalName(const char *alias, const char *standard, UErrorCode *pErrorCode) {
- if (haveAliasData(pErrorCode) && isAlias(alias, pErrorCode)) {
- uint32_t convNum = findTaggedConverterNum(alias, standard, pErrorCode);
+U_CAPI uint16_t U_EXPORT2
+ucnv_countAliases(const char *alias, UErrorCode *pErrorCode)
+{
+ return ucnv_io_countAliases(alias, pErrorCode);
+}
- if (convNum < gConverterListSize) {
- return GET_STRING(gConverterList[convNum]);
- }
- }
- return NULL;
+U_CAPI const char* U_EXPORT2
+ucnv_getAlias(const char *alias, uint16_t n, UErrorCode *pErrorCode)
+{
+ return ucnv_io_getAlias(alias, n, pErrorCode);
}
-void
-ucnv_io_flushAvailableConverterCache() {
- if (gAvailableConverters) {
- umtx_lock(NULL);
- gAvailableConverterCount = 0;
- uprv_free((char **)gAvailableConverters);
- gAvailableConverters = NULL;
- umtx_unlock(NULL);
- }
+U_CAPI void U_EXPORT2
+ucnv_getAliases(const char *alias, const char **aliases, UErrorCode *pErrorCode)
+{
+ ucnv_io_getAliases(alias, 0, aliases, pErrorCode);
}
-static UBool haveAvailableConverterList(UErrorCode *pErrorCode) {
- if (gAvailableConverters == NULL) {
- uint16_t idx;
- uint16_t localConverterCount;
- UErrorCode status;
- const char *converterName;
- const char **localConverterList;
-
- if (!haveAliasData(pErrorCode)) {
- return FALSE;
- }
-
- /* We can't have more than "*converterTable" converters to open */
- localConverterList = (const char **) uprv_malloc(gConverterListSize * sizeof(char*));
- if (!localConverterList) {
- *pErrorCode = U_MEMORY_ALLOCATION_ERROR;
- return FALSE;
- }
-
- localConverterCount = 0;
-
- for (idx = 0; idx < gConverterListSize; idx++) {
- status = U_ZERO_ERROR;
- converterName = GET_STRING(gConverterList[idx]);
- ucnv_close(ucnv_open(converterName, &status));
- if (U_SUCCESS(status)) {
- localConverterList[localConverterCount++] = converterName;
- }
- }
-
- umtx_lock(NULL);
- if (gAvailableConverters == NULL) {
- gAvailableConverters = localConverterList;
- gAvailableConverterCount = localConverterCount;
- /* haveData should have already registered the cleanup function */
- }
- else {
- uprv_free((char **)localConverterList);
- }
- umtx_unlock(NULL);
- }
- return TRUE;
+U_CAPI uint16_t U_EXPORT2
+ucnv_countStandards(void)
+{
+ UErrorCode err = U_ZERO_ERROR;
+ return ucnv_io_countStandards(&err);
}
-U_CFUNC uint16_t
-ucnv_io_countAvailableConverters(UErrorCode *pErrorCode) {
- if (haveAvailableConverterList(pErrorCode)) {
- return gAvailableConverterCount;
- }
- return 0;
-}
+U_CAPI const char * U_EXPORT2
+ucnv_getCanonicalName(const char *alias, const char *standard, UErrorCode *pErrorCode) {
+ if (haveAliasData(pErrorCode) && isAlias(alias, pErrorCode)) {
+ uint32_t convNum = findTaggedConverterNum(alias, standard, pErrorCode);
-U_CFUNC const char *
-ucnv_io_getAvailableConverter(uint16_t n, UErrorCode *pErrorCode) {
- if (haveAvailableConverterList(pErrorCode)) {
- if (n < gAvailableConverterCount) {
- return gAvailableConverters[n];
+ if (convNum < gMainTable.converterListSize) {
+ return GET_STRING(gMainTable.converterList[convNum]);
}
- *pErrorCode = U_INDEX_OUTOFBOUNDS_ERROR;
}
+
return NULL;
}
static int32_t U_CALLCONV
ucnv_io_countAllConverters(UEnumeration *enumerator, UErrorCode *pErrorCode) {
- return gConverterListSize;
+ return gMainTable.converterListSize;
}
static const char* U_CALLCONV
@@ -929,15 +1015,17 @@ ucnv_io_nextAllConverters(UEnumeration *enumerator,
{
uint16_t *myContext = (uint16_t *)(enumerator->context);
- if (*myContext < gConverterListSize) {
- const char *myStr = GET_STRING(gConverterList[(*myContext)++]);
+ if (*myContext < gMainTable.converterListSize) {
+ const char *myStr = GET_STRING(gMainTable.converterList[(*myContext)++]);
if (resultLength) {
*resultLength = (int32_t)uprv_strlen(myStr);
}
return myStr;
}
/* Either we accessed a zero length list, or we enumerated too far. */
- *pErrorCode = U_INDEX_OUTOFBOUNDS_ERROR;
+ if (resultLength) {
+ *resultLength = 0;
+ }
return NULL;
}
@@ -981,109 +1069,13 @@ ucnv_openAllNames(UErrorCode *pErrorCode) {
}
U_CFUNC uint16_t
-ucnv_io_countAvailableAliases(UErrorCode *pErrorCode) {
+ucnv_io_countTotalAliases(UErrorCode *pErrorCode) {
if (haveAliasData(pErrorCode)) {
- return (uint16_t)gAliasListSize;
+ return (uint16_t)gMainTable.aliasListSize;
}
return 0;
}
-/* default converter name --------------------------------------------------- */
-
-/*
- * In order to be really thread-safe, the get function would have to take
- * a buffer parameter and copy the current string inside a mutex block.
- * This implementation only tries to be really thread-safe while
- * setting the name.
- * It assumes that setting a pointer is atomic.
- */
-
-U_CFUNC const char *
-ucnv_io_getDefaultConverterName() {
- /* local variable to be thread-safe */
- const char *name;
-
- umtx_lock(NULL);
- name=gDefaultConverterName;
- umtx_unlock(NULL);
-
- if(name==NULL) {
- UErrorCode errorCode = U_ZERO_ERROR;
- UConverter *cnv = NULL;
- int32_t length = 0;
-
- name = uprv_getDefaultCodepage();
-
- /* if the name is there, test it out and get the canonical name with options */
- if(name != NULL) {
- cnv = ucnv_open(name, &errorCode);
- if(U_SUCCESS(errorCode) && cnv != NULL) {
- name = ucnv_getName(cnv, &errorCode);
- }
- }
-
- if(name == NULL || name[0] == 0
- || U_FAILURE(errorCode) || cnv == NULL
- || length>=sizeof(gDefaultConverterNameBuffer))
- {
- /* Panic time, let's use a fallback. */
-#if (U_CHARSET_FAMILY == U_ASCII_FAMILY)
- name = "US-ASCII";
- /* there is no 'algorithmic' converter for EBCDIC */
-#elif defined(OS390)
- name = "ibm-1047_P100-1995" UCNV_SWAP_LFNL_OPTION_STRING;
-#else
- name = "ibm-37_P100-1995";
-#endif
- }
-
- length=(int32_t)(uprv_strlen(name));
-
- /* Copy the name before we close the converter. */
- umtx_lock(NULL);
- uprv_memcpy(gDefaultConverterNameBuffer, name, length);
- gDefaultConverterNameBuffer[length]=0;
- gDefaultConverterName = gDefaultConverterNameBuffer;
- name = gDefaultConverterName;
- ucln_common_registerCleanup(UCLN_COMMON_UCNV_IO, ucnv_io_cleanup);
- umtx_unlock(NULL);
-
- /* The close may make the current name go away. */
- ucnv_close(cnv);
- }
-
- return name;
-}
-
-U_CFUNC void
-ucnv_io_setDefaultConverterName(const char *converterName) {
- if(converterName==NULL) {
- /* reset to the default codepage */
- umtx_lock(NULL);
- gDefaultConverterName=NULL;
- umtx_unlock(NULL);
- } else {
- UErrorCode errorCode=U_ZERO_ERROR;
- const char *name=ucnv_io_getConverterName(converterName, &errorCode);
-
- umtx_lock(NULL);
-
- if(U_SUCCESS(errorCode) && name!=NULL) {
- gDefaultConverterName=name;
- } else {
- /* do not set the name if the alias lookup failed and it is too long */
- int32_t length=(int32_t)(uprv_strlen(converterName));
- if(lengthreadUInt32(((const uint32_t *)inTable)[tocLengthIndex]);
- if(tocLengthreadUInt32(((const uint32_t *)inTable)[i]);
}
/* compute offsets */
- offsets[tocLengthIndex]=0;
+ uprv_memset(offsets, 0, sizeof(offsets));
offsets[converterListIndex]=2*(1+tocLength); /* count two 16-bit units per toc entry */
- for(i=tagListIndex; i<=stringTableIndex; ++i) {
+ for(i=tagListIndex; i<=tocLength; ++i) {
offsets[i]=offsets[i-1]+toc[i-1];
}
@@ -1210,12 +1203,11 @@ ucnv_swapAliases(const UDataSwapper *ds,
/* swap the entire table of contents */
ds->swapArray32(ds, inTable, 4*(1+tocLength), outTable, pErrorCode);
- /* swap strings */
- ds->swapInvChars(ds, inTable+offsets[stringTableIndex], 2*(int32_t)toc[stringTableIndex],
+ /* swap unormalized strings & normalized strings */
+ ds->swapInvChars(ds, inTable+offsets[stringTableIndex], 2*(int32_t)(toc[stringTableIndex]+toc[normalizedStringTableIndex]),
outTable+offsets[stringTableIndex], pErrorCode);
if(U_FAILURE(*pErrorCode)) {
- udata_printError(ds, "ucnv_swapAliases().swapInvChars(charset names) failed - %s\n",
- u_errorName(*pErrorCode));
+ udata_printError(ds, "ucnv_swapAliases().swapInvChars(charset names) failed\n");
return 0;
}
@@ -1311,8 +1303,8 @@ ucnv_swapAliases(const UDataSwapper *ds,
}
if(U_FAILURE(*pErrorCode)) {
- udata_printError(ds, "ucnv_swapAliases().uprv_sortArray(%u items) failed - %s\n",
- count, u_errorName(*pErrorCode));
+ udata_printError(ds, "ucnv_swapAliases().uprv_sortArray(%u items) failed\n",
+ count);
return 0;
}
diff --git a/icuSources/common/ucnv_io.h b/icuSources/common/ucnv_io.h
index 7ae6def4..91bc6e59 100644
--- a/icuSources/common/ucnv_io.h
+++ b/icuSources/common/ucnv_io.h
@@ -1,13 +1,13 @@
/*
**********************************************************************
- * Copyright (C) 1999-2004, International Business Machines
+ * Copyright (C) 1999-2006, International Business Machines
* Corporation and others. All Rights Reserved.
**********************************************************************
*
*
* ucnv_io.h:
- * defines variables and functions pertaining to file access, and name resolution
- * aspect of the library
+ * defines variables and functions pertaining to converter name resolution
+ * aspect of the conversion code
*/
#ifndef UCNV_IO_H
@@ -20,16 +20,51 @@
#include "udataswp.h"
#define UCNV_AMBIGUOUS_ALIAS_MAP_BIT 0x8000
+#define UCNV_CONTAINS_OPTION_BIT 0x4000
#define UCNV_CONVERTER_INDEX_MASK 0xFFF
#define UCNV_NUM_RESERVED_TAGS 2
#define UCNV_NUM_HIDDEN_TAGS 1
+enum {
+ UCNV_IO_UNNORMALIZED,
+ UCNV_IO_STD_NORMALIZED,
+ UCNV_IO_NORM_TYPE_COUNT
+};
+
+typedef struct {
+ uint16_t stringNormalizationType;
+ uint16_t containsCnvOptionInfo;
+} UConverterAliasOptions;
+
+typedef struct UConverterAlias {
+ const uint16_t *converterList;
+ const uint16_t *tagList;
+ const uint16_t *aliasList;
+ const uint16_t *untaggedConvArray;
+ const uint16_t *taggedAliasArray;
+ const uint16_t *taggedAliasLists;
+ const UConverterAliasOptions *optionTable;
+ const uint16_t *stringTable;
+ const uint16_t *normalizedStringTable;
+
+ uint32_t converterListSize;
+ uint32_t tagListSize;
+ uint32_t aliasListSize;
+ uint32_t untaggedConvArraySize;
+ uint32_t taggedAliasArraySize;
+ uint32_t taggedAliasListsSize;
+ uint32_t optionTableSize;
+ uint32_t stringTableSize;
+ uint32_t normalizedStringTableSize;
+} UConverterAlias;
+
/**
* \var ucnv_io_stripForCompare
* Remove the underscores, dashes and spaces from the name, and convert
* the name to lower case.
* @param dst The destination buffer, which is <= the buffer of name.
* @param dst The destination buffer, which is <= the buffer of name.
+ * @see ucnv_compareNames
* @return the destination buffer.
*/
#if U_CHARSET_FAMILY==U_ASCII_FAMILY
@@ -40,10 +75,10 @@
# error U_CHARSET_FAMILY is not valid
#endif
-U_CFUNC char * U_EXPORT2
+U_CAPI char * U_EXPORT2
ucnv_io_stripASCIIForCompare(char *dst, const char *name);
-U_CFUNC char * U_EXPORT2
+U_CAPI char * U_EXPORT2
ucnv_io_stripEBCDICForCompare(char *dst, const char *name);
/**
@@ -52,109 +87,24 @@ ucnv_io_stripEBCDICForCompare(char *dst, const char *name);
* is returned in mixed-case.
* Returns NULL if the alias is not found.
* @param alias The alias name to be searched.
+ * @param containsOption A return value stating whether the returned converter name contains an option (a comma)
* @param pErrorCode The error code
* @return the converter name in mixed-case, return NULL if the alias is not found.
*/
U_CFUNC const char *
-ucnv_io_getConverterName(const char *alias, UErrorCode *pErrorCode);
-
-/**
- * The count for ucnv_io_getAliases and ucnv_io_getAlias
- * @param alias The alias name to be counted
- * @param pErrorCode The error code
- * @return the alias count
- */
-U_CFUNC uint16_t
-ucnv_io_countAliases(const char *alias, UErrorCode *pErrorCode);
-
-/**
- * Search case-insensitively for a converter alias and set aliases to
- * a pointer to the list of aliases for the actual converter.
- * The first "alias" is the canonical converter name.
- * The aliases are stored consecutively, in mixed case, each NUL-terminated.
- * There are as many strings in this list as the return value specifies.
- * Returns the number of aliases including the canonical converter name,
- * or 0 if the alias is not found.
- * @param alias The canonical converter name
- * @param start
- * @param aliases A pointer to the list of aliases for the actual converter
- * @return the number of aliases including the canonical converter name, or 0 if the alias is not found.
- */
-U_CFUNC uint16_t
-ucnv_io_getAliases(const char *alias, uint16_t start, const char **aliases, UErrorCode *pErrorCode);
-
-/**
- * Search case-insensitively for a converter alias and return
- * the (n)th alias.
- * Returns NULL if the alias is not found.
- * @param alias The converter alias
- * @param n The number specifies which alias to get
- * @param pErrorCode The error code
- * @return the (n)th alias and return NULL if the alias is not found.
- */
-U_CFUNC const char *
-ucnv_io_getAlias(const char *alias, uint16_t n, UErrorCode *pErrorCode);
-
-/**
- * Return the number of all standard names.
- * @param pErrorCode The error code
- * @return the number of all standard names
- */
-U_CFUNC uint16_t
-ucnv_io_countStandards(UErrorCode *pErrorCode);
+ucnv_io_getConverterName(const char *alias, UBool *containsOption, UErrorCode *pErrorCode);
/**
- * Return the number of all converter names.
- * @param pErrorCode The error code
- * @return the number of all converter names
- */
-U_CFUNC uint16_t
-ucnv_io_countAvailableConverters(UErrorCode *pErrorCode);
-
-/**
- * Return the (n)th converter name in mixed case, or NULL
- * if there is none (typically, if the data cannot be loaded).
- * 0<=indexucnv_io_getConverterName().
- * @return the name of the default converter
- */
-U_CFUNC const char *
-ucnv_io_getDefaultConverterName(void);
-
-/**
- * Set the name of the default converter.
- * @param name The name set to the default converter
- */
-U_CFUNC void
-ucnv_io_setDefaultConverterName(const char *name);
+ucnv_io_countTotalAliases(UErrorCode *pErrorCode);
/**
- * Swap an ICU converter alias table. See ucnv_io.c.
+ * Swap an ICU converter alias table. See implementation for details.
* @internal
*/
U_CAPI int32_t U_EXPORT2
diff --git a/icuSources/common/ucnv_lmb.c b/icuSources/common/ucnv_lmb.c
index e9942a4b..79606af2 100644
--- a/icuSources/common/ucnv_lmb.c
+++ b/icuSources/common/ucnv_lmb.c
@@ -1,6 +1,6 @@
/*
**********************************************************************
-* Copyright (C) 2000-2004, International Business Machines
+* Copyright (C) 2000-2006, International Business Machines
* Corporation and others. All Rights Reserved.
**********************************************************************
* file name: ucnv_lmb.cpp
@@ -664,7 +664,7 @@ _LMBCSSafeClone(const UConverter *cnv,
static void
_LMBCSGetUnicodeSet(const UConverter *cnv,
- USetAdder *sa,
+ const USetAdder *sa,
UConverterUnicodeSet which,
UErrorCode *pErrorCode) {
/* all but U+F6xx, see LMBCS explanation above (search for F6xx) */
@@ -1016,9 +1016,8 @@ static UChar32
_LMBCSGetNextUCharWorker(UConverterToUnicodeArgs* args,
UErrorCode* err)
{
- UChar32 uniChar = 0; /* an output UNICODE char */
- ulmbcs_byte_t CurByte; /* A byte from the input stream */
- const char * saveSource;
+ UChar32 uniChar = 0; /* an output UNICODE char */
+ ulmbcs_byte_t CurByte; /* A byte from the input stream */
/* error check */
if (args->source >= args->sourceLimit)
@@ -1027,7 +1026,7 @@ _LMBCSGetNextUCharWorker(UConverterToUnicodeArgs* args,
return 0xffff;
}
/* Grab first byte & save address for error recovery */
- CurByte = *((ulmbcs_byte_t *) (saveSource = args->source++));
+ CurByte = *((ulmbcs_byte_t *) (args->source++));
/*
* at entry of each if clause:
@@ -1046,7 +1045,7 @@ _LMBCSGetNextUCharWorker(UConverterToUnicodeArgs* args,
|| CurByte == ULMBCS_HT || CurByte == ULMBCS_CR
|| CurByte == ULMBCS_LF || CurByte == ULMBCS_123SYSTEMRANGE)
{
- uniChar = CurByte;
+ uniChar = CurByte;
}
else
{
diff --git a/icuSources/common/ucnv_set.c b/icuSources/common/ucnv_set.c
index c192ea4f..772e7ed8 100644
--- a/icuSources/common/ucnv_set.c
+++ b/icuSources/common/ucnv_set.c
@@ -1,7 +1,7 @@
/*
*******************************************************************************
*
-* Copyright (C) 2003-2004, International Business Machines
+* Copyright (C) 2003-2005, International Business Machines
* Corporation and others. All Rights Reserved.
*
*******************************************************************************
@@ -51,7 +51,8 @@ ucnv_getUnicodeSet(const UConverter *cnv,
NULL,
uset_add,
uset_addRange,
- uset_addString
+ uset_addString,
+ uset_remove
};
sa.set=setFillIn;
diff --git a/icuSources/common/ucnv_u16.c b/icuSources/common/ucnv_u16.c
index 86fd1999..6fc9e2a4 100644
--- a/icuSources/common/ucnv_u16.c
+++ b/icuSources/common/ucnv_u16.c
@@ -1,6 +1,6 @@
/*
**********************************************************************
-* Copyright (C) 2002-2004, International Business Machines
+* Copyright (C) 2002-2006, International Business Machines
* Corporation and others. All Rights Reserved.
**********************************************************************
* file name: ucnv_u16.c
@@ -23,6 +23,10 @@
#include "ucnv_cnv.h"
#include "cmemory.h"
+enum {
+ UCNV_NEED_TO_WRITE_BOM=1
+};
+
/* UTF-16BE ----------------------------------------------------------------- */
#if U_IS_BIG_ENDIAN
@@ -31,33 +35,46 @@
# define _UTF16PEFromUnicodeWithOffsets _UTF16LEFromUnicodeWithOffsets
#endif
+
static void
_UTF16BEFromUnicodeWithOffsets(UConverterFromUnicodeArgs *pArgs,
UErrorCode *pErrorCode) {
UConverter *cnv;
const UChar *source;
- uint8_t *target;
+ char *target;
int32_t *offsets;
- int32_t targetCapacity, length, count, sourceIndex;
+ uint32_t targetCapacity, length, sourceIndex;
UChar c, trail;
char overflow[4];
source=pArgs->source;
- length=pArgs->sourceLimit-source;
+ length=(int32_t)(pArgs->sourceLimit-source);
if(length<=0) {
/* no input, nothing to do */
return;
}
- targetCapacity=pArgs->targetLimit-pArgs->target;
- if(targetCapacity<=0) {
+ cnv=pArgs->converter;
+
+ /* write the BOM if necessary */
+ if(cnv->fromUnicodeStatus==UCNV_NEED_TO_WRITE_BOM) {
+ static const char bom[]={ (char)0xfe, (char)0xff };
+ ucnv_fromUWriteBytes(cnv,
+ bom, 2,
+ &pArgs->target, pArgs->targetLimit,
+ &pArgs->offsets, -1,
+ pErrorCode);
+ cnv->fromUnicodeStatus=0;
+ }
+
+ target=pArgs->target;
+ if(target >= pArgs->targetLimit) {
*pErrorCode=U_BUFFER_OVERFLOW_ERROR;
return;
}
- cnv=pArgs->converter;
- target=(uint8_t *)pArgs->target;
+ targetCapacity=(uint32_t)(pArgs->targetLimit-target);
offsets=pArgs->offsets;
sourceIndex=0;
@@ -83,13 +100,13 @@ _UTF16BEFromUnicodeWithOffsets(UConverterFromUnicodeArgs *pArgs,
cnv->fromUChar32=c=0;
}
- /* copy an even number of bytes for complete UChars */
- count=2*length;
- if(count>targetCapacity) {
- count=targetCapacity&~1;
- }
- /* count is even */
if(c==0) {
+ /* copy an even number of bytes for complete UChars */
+ uint32_t count=2*length;
+ if(count>targetCapacity) {
+ count=targetCapacity&~1;
+ }
+ /* count is even */
targetCapacity-=count;
count>>=1;
length-=count;
@@ -210,7 +227,7 @@ _UTF16BEFromUnicodeWithOffsets(UConverterFromUnicodeArgs *pArgs,
(char **)&target, pArgs->targetLimit,
&offsets, sourceIndex,
pErrorCode);
- targetCapacity=pArgs->targetLimit-(char *)target;
+ targetCapacity=(uint32_t)(pArgs->targetLimit-(char *)target);
}
if(U_SUCCESS(*pErrorCode) && sourcesourceLimit && targetCapacity==0) {
@@ -231,24 +248,24 @@ _UTF16BEToUnicodeWithOffsets(UConverterToUnicodeArgs *pArgs,
UChar *target;
int32_t *offsets;
- int32_t targetCapacity, length, count, sourceIndex;
+ uint32_t targetCapacity, length, count, sourceIndex;
UChar c, trail;
cnv=pArgs->converter;
source=(const uint8_t *)pArgs->source;
- length=(const uint8_t *)pArgs->sourceLimit-source;
+ length=(int32_t)((const uint8_t *)pArgs->sourceLimit-source);
if(length<=0 && cnv->toUnicodeStatus==0) {
/* no input, nothing to do */
return;
}
- targetCapacity=pArgs->targetLimit-pArgs->target;
- if(targetCapacity<=0) {
+ target=pArgs->target;
+ if(target >= pArgs->targetLimit) {
*pErrorCode=U_BUFFER_OVERFLOW_ERROR;
return;
}
- target=pArgs->target;
+ targetCapacity=(uint32_t)(pArgs->targetLimit-target);
offsets=pArgs->offsets;
sourceIndex=0;
c=0;
@@ -551,7 +568,7 @@ static const UConverterImpl _UTF16BEImpl={
NULL,
NULL,
NULL,
- ucnv_getCompleteUnicodeSet
+ ucnv_getNonSurrogateUnicodeSet
};
static const UConverterStaticData _UTF16BEStaticData={
@@ -578,28 +595,40 @@ _UTF16LEFromUnicodeWithOffsets(UConverterFromUnicodeArgs *pArgs,
UErrorCode *pErrorCode) {
UConverter *cnv;
const UChar *source;
- uint8_t *target;
+ char *target;
int32_t *offsets;
- int32_t targetCapacity, length, count, sourceIndex;
+ uint32_t targetCapacity, length, sourceIndex;
UChar c, trail;
char overflow[4];
source=pArgs->source;
- length=pArgs->sourceLimit-source;
+ length=(int32_t)(pArgs->sourceLimit-source);
if(length<=0) {
/* no input, nothing to do */
return;
}
- targetCapacity=pArgs->targetLimit-pArgs->target;
- if(targetCapacity<=0) {
+ cnv=pArgs->converter;
+
+ /* write the BOM if necessary */
+ if(cnv->fromUnicodeStatus==UCNV_NEED_TO_WRITE_BOM) {
+ static const char bom[]={ (char)0xff, (char)0xfe };
+ ucnv_fromUWriteBytes(cnv,
+ bom, 2,
+ &pArgs->target, pArgs->targetLimit,
+ &pArgs->offsets, -1,
+ pErrorCode);
+ cnv->fromUnicodeStatus=0;
+ }
+
+ target=pArgs->target;
+ if(target >= pArgs->targetLimit) {
*pErrorCode=U_BUFFER_OVERFLOW_ERROR;
return;
}
- cnv=pArgs->converter;
- target=(uint8_t *)pArgs->target;
+ targetCapacity=(uint32_t)(pArgs->targetLimit-pArgs->target);
offsets=pArgs->offsets;
sourceIndex=0;
@@ -625,13 +654,13 @@ _UTF16LEFromUnicodeWithOffsets(UConverterFromUnicodeArgs *pArgs,
cnv->fromUChar32=c=0;
}
- /* copy an even number of bytes for complete UChars */
- count=2*length;
- if(count>targetCapacity) {
- count=targetCapacity&~1;
- }
- /* count is even */
if(c==0) {
+ /* copy an even number of bytes for complete UChars */
+ uint32_t count=2*length;
+ if(count>targetCapacity) {
+ count=targetCapacity&~1;
+ }
+ /* count is even */
targetCapacity-=count;
count>>=1;
length-=count;
@@ -749,10 +778,10 @@ _UTF16LEFromUnicodeWithOffsets(UConverterFromUnicodeArgs *pArgs,
/* output length bytes with overflow (length>targetCapacity>0) */
ucnv_fromUWriteBytes(cnv,
overflow, length,
- (char **)&target, pArgs->targetLimit,
+ &target, pArgs->targetLimit,
&offsets, sourceIndex,
pErrorCode);
- targetCapacity=pArgs->targetLimit-(char *)target;
+ targetCapacity=(uint32_t)(pArgs->targetLimit-(char *)target);
}
if(U_SUCCESS(*pErrorCode) && sourcesourceLimit && targetCapacity==0) {
@@ -761,7 +790,7 @@ _UTF16LEFromUnicodeWithOffsets(UConverterFromUnicodeArgs *pArgs,
/* write back the updated pointers */
pArgs->source=source;
- pArgs->target=(char *)target;
+ pArgs->target=target;
pArgs->offsets=offsets;
}
@@ -773,24 +802,24 @@ _UTF16LEToUnicodeWithOffsets(UConverterToUnicodeArgs *pArgs,
UChar *target;
int32_t *offsets;
- int32_t targetCapacity, length, count, sourceIndex;
+ uint32_t targetCapacity, length, count, sourceIndex;
UChar c, trail;
cnv=pArgs->converter;
source=(const uint8_t *)pArgs->source;
- length=(const uint8_t *)pArgs->sourceLimit-source;
+ length=(int32_t)((const uint8_t *)pArgs->sourceLimit-source);
if(length<=0 && cnv->toUnicodeStatus==0) {
/* no input, nothing to do */
return;
}
- targetCapacity=pArgs->targetLimit-pArgs->target;
- if(targetCapacity<=0) {
+ target=pArgs->target;
+ if(target >= pArgs->targetLimit) {
*pErrorCode=U_BUFFER_OVERFLOW_ERROR;
return;
}
- target=pArgs->target;
+ targetCapacity=(uint32_t)(pArgs->targetLimit-pArgs->target);
offsets=pArgs->offsets;
sourceIndex=0;
c=0;
@@ -1093,7 +1122,7 @@ static const UConverterImpl _UTF16LEImpl={
NULL,
NULL,
NULL,
- ucnv_getCompleteUnicodeSet
+ ucnv_getNonSurrogateUnicodeSet
};
@@ -1144,14 +1173,7 @@ _UTF16Reset(UConverter *cnv, UConverterResetChoice choice) {
}
if(choice!=UCNV_RESET_TO_UNICODE) {
/* reset fromUnicode: prepare to output the UTF-16PE BOM */
- cnv->charErrorBufferLength=2;
-#if U_IS_BIG_ENDIAN
- cnv->charErrorBuffer[0]=0xfe;
- cnv->charErrorBuffer[1]=0xff;
-#else
- cnv->charErrorBuffer[0]=0xff;
- cnv->charErrorBuffer[1]=0xfe;
-#endif
+ cnv->fromUnicodeStatus=UCNV_NEED_TO_WRITE_BOM;
}
}
@@ -1206,10 +1228,10 @@ _UTF16ToUnicodeWithOffsets(UConverterToUnicodeArgs *pArgs,
++source;
if(state==1) {
state=8; /* detect UTF-16BE */
- offsetDelta=source-pArgs->source;
+ offsetDelta=(int32_t)(source-pArgs->source);
} else if(state==5) {
state=9; /* detect UTF-16LE */
- offsetDelta=source-pArgs->source;
+ offsetDelta=(int32_t)(source-pArgs->source);
}
} else {
/* switch to UTF-16BE and pass the previous bytes */
@@ -1322,13 +1344,13 @@ static const UConverterImpl _UTF16Impl = {
NULL,
NULL,
NULL,
- ucnv_getCompleteUnicodeSet
+ ucnv_getNonSurrogateUnicodeSet
};
static const UConverterStaticData _UTF16StaticData = {
sizeof(UConverterStaticData),
"UTF-16",
- 0, /* ### TODO review correctness of all Unicode CCSIDs */
+ 1204, /* CCSID for BOM sensitive UTF-16 */
UCNV_IBM, UCNV_UTF16, 2, 2,
#if U_IS_BIG_ENDIAN
{ 0xff, 0xfd, 0, 0 }, 2,
diff --git a/icuSources/common/ucnv_u32.c b/icuSources/common/ucnv_u32.c
index 1a37e96f..034bf9bb 100644
--- a/icuSources/common/ucnv_u32.c
+++ b/icuSources/common/ucnv_u32.c
@@ -1,6 +1,6 @@
/*
**********************************************************************
-* Copyright (C) 2002-2004, International Business Machines
+* Copyright (C) 2002-2006, International Business Machines
* Corporation and others. All Rights Reserved.
**********************************************************************
* file name: ucnv_u32.c
@@ -34,6 +34,10 @@
/* -SURROGATE_LOW_START + HALF_BASE */
#define SURROGATE_LOW_BASE 9216
+enum {
+ UCNV_NEED_TO_WRITE_BOM=1
+};
+
/* UTF-32BE ----------------------------------------------------------------- */
static void
@@ -47,9 +51,10 @@ T_UConverter_toUnicode_UTF32_BE(UConverterToUnicodeArgs * args,
unsigned char *toUBytes = args->converter->toUBytes;
uint32_t ch, i;
- /* UTF-8 returns here for only non-offset, this needs to change.*/
+ /* Restore state of current sequence */
if (args->converter->toUnicodeStatus && myTarget < targetLimit) {
i = args->converter->toULength; /* restore # of bytes consumed */
+ args->converter->toULength = 0;
ch = args->converter->toUnicodeStatus - 1;/*Stores the previously calculated ch from a previous call*/
args->converter->toUnicodeStatus = 0;
@@ -127,8 +132,10 @@ T_UConverter_toUnicode_UTF32_BE_OFFSET_LOGIC(UConverterToUnicodeArgs * args,
uint32_t ch, i;
int32_t offsetNum = 0;
+ /* Restore state of current sequence */
if (args->converter->toUnicodeStatus && myTarget < targetLimit) {
i = args->converter->toULength; /* restore # of bytes consumed */
+ args->converter->toULength = 0;
ch = args->converter->toUnicodeStatus - 1;/*Stores the previously calculated ch from a previous call*/
args->converter->toUnicodeStatus = 0;
@@ -204,13 +211,30 @@ T_UConverter_fromUnicode_UTF32_BE(UConverterFromUnicodeArgs * args,
UErrorCode * err)
{
const UChar *mySource = args->source;
- unsigned char *myTarget = (unsigned char *) args->target;
+ unsigned char *myTarget;
const UChar *sourceLimit = args->sourceLimit;
const unsigned char *targetLimit = (unsigned char *) args->targetLimit;
UChar32 ch, ch2;
unsigned int indexToWrite;
unsigned char temp[sizeof(uint32_t)];
+ if(mySource >= sourceLimit) {
+ /* no input, nothing to do */
+ return;
+ }
+
+ /* write the BOM if necessary */
+ if(args->converter->fromUnicodeStatus==UCNV_NEED_TO_WRITE_BOM) {
+ static const char bom[]={ 0, 0, (char)0xfe, (char)0xff };
+ ucnv_fromUWriteBytes(args->converter,
+ bom, 4,
+ &args->target, args->targetLimit,
+ &args->offsets, -1,
+ err);
+ args->converter->fromUnicodeStatus=0;
+ }
+
+ myTarget = (unsigned char *) args->target;
temp[0] = 0;
if (args->converter->fromUChar32) {
@@ -288,8 +312,8 @@ T_UConverter_fromUnicode_UTF32_BE_OFFSET_LOGIC(UConverterFromUnicodeArgs * args,
UErrorCode * err)
{
const UChar *mySource = args->source;
- unsigned char *myTarget = (unsigned char *) args->target;
- int32_t *myOffsets = args->offsets;
+ unsigned char *myTarget;
+ int32_t *myOffsets;
const UChar *sourceLimit = args->sourceLimit;
const unsigned char *targetLimit = (unsigned char *) args->targetLimit;
UChar32 ch, ch2;
@@ -297,6 +321,24 @@ T_UConverter_fromUnicode_UTF32_BE_OFFSET_LOGIC(UConverterFromUnicodeArgs * args,
unsigned int indexToWrite;
unsigned char temp[sizeof(uint32_t)];
+ if(mySource >= sourceLimit) {
+ /* no input, nothing to do */
+ return;
+ }
+
+ /* write the BOM if necessary */
+ if(args->converter->fromUnicodeStatus==UCNV_NEED_TO_WRITE_BOM) {
+ static const char bom[]={ 0, 0, (char)0xfe, (char)0xff };
+ ucnv_fromUWriteBytes(args->converter,
+ bom, 4,
+ &args->target, args->targetLimit,
+ &args->offsets, -1,
+ err);
+ args->converter->fromUnicodeStatus=0;
+ }
+
+ myTarget = (unsigned char *) args->target;
+ myOffsets = args->offsets;
temp[0] = 0;
if (args->converter->fromUChar32) {
@@ -360,7 +402,7 @@ lowsurogate:
*err = U_BUFFER_OVERFLOW_ERROR;
}
}
- offsetNum++;
+ offsetNum = offsetNum + 1 + (temp[1] != 0);
}
if (mySource < sourceLimit && myTarget >= targetLimit && U_SUCCESS(*err)) {
@@ -437,7 +479,7 @@ static const UConverterImpl _UTF32BEImpl = {
NULL,
NULL,
NULL,
- ucnv_getCompleteUnicodeSet
+ ucnv_getNonSurrogateUnicodeSet
};
/* The 1232 CCSID refers to any version of Unicode with any endianess of UTF-32 */
@@ -471,10 +513,11 @@ T_UConverter_toUnicode_UTF32_LE(UConverterToUnicodeArgs * args,
unsigned char *toUBytes = args->converter->toUBytes;
uint32_t ch, i;
- /* UTF-8 returns here for only non-offset, this needs to change.*/
+ /* Restore state of current sequence */
if (args->converter->toUnicodeStatus && myTarget < targetLimit)
{
i = args->converter->toULength; /* restore # of bytes consumed */
+ args->converter->toULength = 0;
/* Stores the previously calculated ch from a previous call*/
ch = args->converter->toUnicodeStatus - 1;
@@ -557,10 +600,11 @@ T_UConverter_toUnicode_UTF32_LE_OFFSET_LOGIC(UConverterToUnicodeArgs * args,
uint32_t ch, i;
int32_t offsetNum = 0;
- /* UTF-8 returns here for only non-offset, this needs to change.*/
+ /* Restore state of current sequence */
if (args->converter->toUnicodeStatus && myTarget < targetLimit)
{
i = args->converter->toULength; /* restore # of bytes consumed */
+ args->converter->toULength = 0;
/* Stores the previously calculated ch from a previous call*/
ch = args->converter->toUnicodeStatus - 1;
@@ -645,13 +689,30 @@ T_UConverter_fromUnicode_UTF32_LE(UConverterFromUnicodeArgs * args,
UErrorCode * err)
{
const UChar *mySource = args->source;
- unsigned char *myTarget = (unsigned char *) args->target;
+ unsigned char *myTarget;
const UChar *sourceLimit = args->sourceLimit;
const unsigned char *targetLimit = (unsigned char *) args->targetLimit;
UChar32 ch, ch2;
unsigned int indexToWrite;
unsigned char temp[sizeof(uint32_t)];
+ if(mySource >= sourceLimit) {
+ /* no input, nothing to do */
+ return;
+ }
+
+ /* write the BOM if necessary */
+ if(args->converter->fromUnicodeStatus==UCNV_NEED_TO_WRITE_BOM) {
+ static const char bom[]={ (char)0xff, (char)0xfe, 0, 0 };
+ ucnv_fromUWriteBytes(args->converter,
+ bom, 4,
+ &args->target, args->targetLimit,
+ &args->offsets, -1,
+ err);
+ args->converter->fromUnicodeStatus=0;
+ }
+
+ myTarget = (unsigned char *) args->target;
temp[3] = 0;
if (args->converter->fromUChar32)
@@ -737,8 +798,8 @@ T_UConverter_fromUnicode_UTF32_LE_OFFSET_LOGIC(UConverterFromUnicodeArgs * args,
UErrorCode * err)
{
const UChar *mySource = args->source;
- unsigned char *myTarget = (unsigned char *) args->target;
- int32_t *myOffsets = args->offsets;
+ unsigned char *myTarget;
+ int32_t *myOffsets;
const UChar *sourceLimit = args->sourceLimit;
const unsigned char *targetLimit = (unsigned char *) args->targetLimit;
UChar32 ch, ch2;
@@ -746,6 +807,24 @@ T_UConverter_fromUnicode_UTF32_LE_OFFSET_LOGIC(UConverterFromUnicodeArgs * args,
unsigned char temp[sizeof(uint32_t)];
int32_t offsetNum = 0;
+ if(mySource >= sourceLimit) {
+ /* no input, nothing to do */
+ return;
+ }
+
+ /* write the BOM if necessary */
+ if(args->converter->fromUnicodeStatus==UCNV_NEED_TO_WRITE_BOM) {
+ static const char bom[]={ (char)0xff, (char)0xfe, 0, 0 };
+ ucnv_fromUWriteBytes(args->converter,
+ bom, 4,
+ &args->target, args->targetLimit,
+ &args->offsets, -1,
+ err);
+ args->converter->fromUnicodeStatus=0;
+ }
+
+ myTarget = (unsigned char *) args->target;
+ myOffsets = args->offsets;
temp[3] = 0;
if (args->converter->fromUChar32)
@@ -817,7 +896,7 @@ lowsurogate:
*err = U_BUFFER_OVERFLOW_ERROR;
}
}
- offsetNum++;
+ offsetNum = offsetNum + 1 + (temp[2] != 0);
}
if (mySource < sourceLimit && myTarget >= targetLimit && U_SUCCESS(*err))
@@ -895,7 +974,7 @@ static const UConverterImpl _UTF32LEImpl = {
NULL,
NULL,
NULL,
- ucnv_getCompleteUnicodeSet
+ ucnv_getNonSurrogateUnicodeSet
};
/* The 1232 CCSID refers to any version of Unicode with any endianess of UTF-32 */
@@ -948,18 +1027,7 @@ _UTF32Reset(UConverter *cnv, UConverterResetChoice choice) {
}
if(choice!=UCNV_RESET_TO_UNICODE) {
/* reset fromUnicode: prepare to output the UTF-32PE BOM */
- cnv->charErrorBufferLength=4;
-#if U_IS_BIG_ENDIAN
- cnv->charErrorBuffer[0]=0;
- cnv->charErrorBuffer[1]=0;
- cnv->charErrorBuffer[2]=0xfe;
- cnv->charErrorBuffer[3]=0xff;
-#else
- cnv->charErrorBuffer[0]=0xff;
- cnv->charErrorBuffer[1]=0xfe;
- cnv->charErrorBuffer[2]=0;
- cnv->charErrorBuffer[3]=0;
-#endif
+ cnv->fromUnicodeStatus=UCNV_NEED_TO_WRITE_BOM;
}
}
@@ -1019,14 +1087,14 @@ _UTF32ToUnicodeWithOffsets(UConverterToUnicodeArgs *pArgs,
++source;
if(state==4) {
state=8; /* detect UTF-32BE */
- offsetDelta=source-pArgs->source;
+ offsetDelta=(int32_t)(source-pArgs->source);
} else if(state==8) {
state=9; /* detect UTF-32LE */
- offsetDelta=source-pArgs->source;
+ offsetDelta=(int32_t)(source-pArgs->source);
}
} else {
/* switch to UTF-32BE and pass the previous bytes */
- int32_t count=source-pArgs->source; /* number of bytes from this buffer */
+ int32_t count=(int32_t)(source-pArgs->source); /* number of bytes from this buffer */
/* reset the source */
source=pArgs->source;
@@ -1153,13 +1221,14 @@ static const UConverterImpl _UTF32Impl = {
NULL,
NULL,
NULL,
- ucnv_getCompleteUnicodeSet
+ ucnv_getNonSurrogateUnicodeSet
};
+/* The 1236 CCSID refers to any version of Unicode with a BOM sensitive endianess of UTF-32 */
static const UConverterStaticData _UTF32StaticData = {
sizeof(UConverterStaticData),
"UTF-32",
- 0, /* ### TODO review correctness of all Unicode CCSIDs */
+ 1236,
UCNV_IBM, UCNV_UTF32, 4, 4,
#if U_IS_BIG_ENDIAN
{ 0, 0, 0xff, 0xfd }, 4,
diff --git a/icuSources/common/ucnv_u7.c b/icuSources/common/ucnv_u7.c
index f15da503..62e27929 100644
--- a/icuSources/common/ucnv_u7.c
+++ b/icuSources/common/ucnv_u7.c
@@ -259,8 +259,8 @@ directMode:
* In Direct Mode, only the sourceIndex is used.
*/
byteIndex=0;
- length=sourceLimit-source;
- targetCapacity=targetLimit-target;
+ length=(int32_t)(sourceLimit-source);
+ targetCapacity=(int32_t)(targetLimit-target);
if(length>targetCapacity) {
length=targetCapacity;
}
@@ -482,8 +482,8 @@ _UTF7FromUnicodeWithOffsets(UConverterFromUnicodeArgs *pArgs,
if(inDirectMode) {
directMode:
- length=sourceLimit-source;
- targetCapacity=targetLimit-target;
+ length=(int32_t)(sourceLimit-source);
+ targetCapacity=(int32_t)(targetLimit-target);
if(length>targetCapacity) {
length=targetCapacity;
}
@@ -917,8 +917,8 @@ directMode:
* In Direct Mode, only the sourceIndex is used.
*/
byteIndex=0;
- length=sourceLimit-source;
- targetCapacity=targetLimit-target;
+ length=(int32_t)(sourceLimit-source);
+ targetCapacity=(int32_t)(targetLimit-target);
if(length>targetCapacity) {
length=targetCapacity;
}
@@ -1167,8 +1167,8 @@ _IMAPFromUnicodeWithOffsets(UConverterFromUnicodeArgs *pArgs,
if(inDirectMode) {
directMode:
- length=sourceLimit-source;
- targetCapacity=targetLimit-target;
+ length=(int32_t)(sourceLimit-source);
+ targetCapacity=(int32_t)(targetLimit-target);
if(length>targetCapacity) {
length=targetCapacity;
}
diff --git a/icuSources/common/ucnv_u8.c b/icuSources/common/ucnv_u8.c
index a8635783..7b977019 100644
--- a/icuSources/common/ucnv_u8.c
+++ b/icuSources/common/ucnv_u8.c
@@ -1,6 +1,6 @@
/*
**********************************************************************
-* Copyright (C) 2002-2004, International Business Machines
+* Copyright (C) 2002-2006, International Business Machines
* Corporation and others. All Rights Reserved.
**********************************************************************
* file name: ucnv_u8.c
@@ -101,6 +101,7 @@ static void ucnv_toUnicode_UTF8 (UConverterToUnicodeArgs * args,
{
inBytes = args->converter->mode; /* restore # of bytes to consume */
i = args->converter->toULength; /* restore # of bytes consumed */
+ args->converter->toULength = 0;
ch = args->converter->toUnicodeStatus;/*Stores the previously calculated ch from a previous call*/
args->converter->toUnicodeStatus = 0;
@@ -165,7 +166,6 @@ morebytes:
(isCESU8 ? i <= 3 : !UTF_IS_SURROGATE(ch)))
{
/* Normal valid byte when the loop has not prematurely terminated (i < inBytes) */
- args->converter->toULength = 0;
if (ch <= MAXIMUM_UCS2)
{
/* fits in 16 bits */
@@ -230,6 +230,7 @@ static void ucnv_toUnicode_UTF8_OFFSETS_LOGIC (UConverterToUnicodeArgs * args,
{
inBytes = args->converter->mode; /* restore # of bytes to consume */
i = args->converter->toULength; /* restore # of bytes consumed */
+ args->converter->toULength = 0;
ch = args->converter->toUnicodeStatus;/*Stores the previously calculated ch from a previous call*/
args->converter->toUnicodeStatus = 0;
@@ -292,7 +293,6 @@ morebytes:
(isCESU8 ? i <= 3 : !UTF_IS_SURROGATE(ch)))
{
/* Normal valid byte when the loop has not prematurely terminated (i < inBytes) */
- args->converter->toULength = 0;
if (ch <= MAXIMUM_UCS2)
{
/* fits in 16 bits */
@@ -349,7 +349,7 @@ U_CFUNC void ucnv_fromUnicode_UTF8 (UConverterFromUnicodeArgs * args,
const UChar *sourceLimit = args->sourceLimit;
const unsigned char *targetLimit = (unsigned char *) args->targetLimit;
UBool isCESU8 = (UBool)(args->converter->sharedData == &_CESU8Data);
- UChar32 ch, ch2;
+ UChar32 ch;
int16_t indexToWrite;
char temp[4];
@@ -394,7 +394,6 @@ lowsurrogate:
if(UTF_IS_SECOND_SURROGATE(trail)) {
++mySource;
ch=UTF16_GET_PAIR_VALUE(ch, trail);
- ch2 = 0;
/* convert this supplementary code point */
/* exit this condition tree */
} else {
@@ -466,7 +465,7 @@ U_CFUNC void ucnv_fromUnicode_UTF8_OFFSETS_LOGIC (UConverterFromUnicodeArgs * ar
const UChar *sourceLimit = args->sourceLimit;
const unsigned char *targetLimit = (unsigned char *) args->targetLimit;
UBool isCESU8 = (UBool)(args->converter->sharedData == &_CESU8Data);
- UChar32 ch, ch2;
+ UChar32 ch;
int32_t offsetNum, nextSourceIndex;
int16_t indexToWrite;
char temp[4];
@@ -522,7 +521,6 @@ lowsurrogate:
++mySource;
++nextSourceIndex;
ch=UTF16_GET_PAIR_VALUE(ch, trail);
- ch2 = 0;
/* convert this supplementary code point */
/* exit this condition tree */
} else {
@@ -798,7 +796,8 @@ static const UConverterImpl _CESU8Impl={
static const UConverterStaticData _CESU8StaticData={
sizeof(UConverterStaticData),
"CESU-8",
- 0, UCNV_UNKNOWN, UCNV_CESU8, 1, 3,
+ 9400, /* CCSID for CESU-8 */
+ UCNV_UNKNOWN, UCNV_CESU8, 1, 3,
{ 0xef, 0xbf, 0xbd, 0 },3,FALSE,FALSE,
0,
0,
diff --git a/icuSources/common/ucnvbocu.c b/icuSources/common/ucnvbocu.c
index dacd6c16..8623b114 100644
--- a/icuSources/common/ucnvbocu.c
+++ b/icuSources/common/ucnvbocu.c
@@ -1,7 +1,7 @@
/*
******************************************************************************
*
-* Copyright (C) 2002-2004, International Business Machines
+* Copyright (C) 2002-2005, International Business Machines
* Corporation and others. All Rights Reserved.
*
******************************************************************************
@@ -401,7 +401,7 @@ U_ALIGN_CODE(16)
source=pArgs->source;
sourceLimit=pArgs->sourceLimit;
target=(uint8_t *)pArgs->target;
- targetCapacity=pArgs->targetLimit-pArgs->target;
+ targetCapacity=(int32_t)(pArgs->targetLimit-pArgs->target);
offsets=pArgs->offsets;
/* get the converter state from UConverter */
@@ -423,7 +423,7 @@ U_ALIGN_CODE(16)
fastSingle:
/* fast loop for single-byte differences */
/* use only one loop counter variable, targetCapacity, not also source */
- diff=sourceLimit-source;
+ diff=(int32_t)(sourceLimit-source);
if(targetCapacity>diff) {
targetCapacity=diff;
}
@@ -450,7 +450,7 @@ fastSingle:
}
}
/* restore real values */
- targetCapacity=(const uint8_t *)pArgs->targetLimit-target;
+ targetCapacity=(int32_t)((const uint8_t *)pArgs->targetLimit-target);
sourceIndex=nextSourceIndex; /* wrong if offsets==NULL but does not matter */
/* regular loop for all cases */
@@ -650,7 +650,7 @@ _Bocu1FromUnicode(UConverterFromUnicodeArgs *pArgs,
source=pArgs->source;
sourceLimit=pArgs->sourceLimit;
target=(uint8_t *)pArgs->target;
- targetCapacity=pArgs->targetLimit-pArgs->target;
+ targetCapacity=(int32_t)(pArgs->targetLimit-pArgs->target);
/* get the converter state from UConverter */
c=cnv->fromUChar32;
@@ -667,7 +667,7 @@ _Bocu1FromUnicode(UConverterFromUnicodeArgs *pArgs,
fastSingle:
/* fast loop for single-byte differences */
/* use only one loop counter variable, targetCapacity, not also source */
- diff=sourceLimit-source;
+ diff=(int32_t)(sourceLimit-source);
if(targetCapacity>diff) {
targetCapacity=diff;
}
@@ -690,7 +690,7 @@ fastSingle:
--targetCapacity;
}
/* restore real values */
- targetCapacity=(const uint8_t *)pArgs->targetLimit-target;
+ targetCapacity=(int32_t)((const uint8_t *)pArgs->targetLimit-target);
/* regular loop for all cases */
while(sourcetargetLimit-target;
+ diff=(int32_t)(sourceLimit-source);
+ count=(int32_t)(pArgs->targetLimit-target);
if(count>diff) {
count=diff;
}
@@ -1195,8 +1195,8 @@ U_ALIGN_CODE(16)
fastSingle:
/* fast loop for single-byte differences */
/* use count as the only loop counter variable */
- diff=sourceLimit-source;
- count=pArgs->targetLimit-target;
+ diff=(int32_t)(sourceLimit-source);
+ count=(int32_t)(pArgs->targetLimit-target);
if(count>diff) {
count=diff;
}
@@ -1374,7 +1374,7 @@ static const UConverterImpl _Bocu1Impl={
static const UConverterStaticData _Bocu1StaticData={
sizeof(UConverterStaticData),
"BOCU-1",
- 0, /* CCSID for BOCU-1 */
+ 1214, /* CCSID for BOCU-1 */
UCNV_IBM, UCNV_BOCU1,
1, 4, /* one UChar generates at least 1 byte and at most 4 bytes */
{ 0x1a, 0, 0, 0 }, 1, /* BOCU-1 never needs to write a subchar */
diff --git a/icuSources/common/ucnvdisp.c b/icuSources/common/ucnvdisp.c
index 07196b3e..4075be66 100644
--- a/icuSources/common/ucnvdisp.c
+++ b/icuSources/common/ucnvdisp.c
@@ -38,6 +38,7 @@ ucnv_getDisplayName(const UConverter *cnv,
UResourceBundle *rb;
const UChar *name;
int32_t length;
+ UErrorCode localStatus = U_ZERO_ERROR;
/* check arguments */
if(pErrorCode==NULL || U_FAILURE(*pErrorCode)) {
@@ -56,15 +57,17 @@ ucnv_getDisplayName(const UConverter *cnv,
}
/* use the internal name as the key */
- name=ures_getStringByKey(rb, cnv->sharedData->staticData->name, &length, pErrorCode);
+ name=ures_getStringByKey(rb, cnv->sharedData->staticData->name, &length, &localStatus);
ures_close(rb);
- if(U_SUCCESS(*pErrorCode)) {
+ if(U_SUCCESS(localStatus)) {
/* copy the string */
+ if (*pErrorCode == U_ZERO_ERROR) {
+ *pErrorCode = localStatus;
+ }
u_memcpy(displayName, name, uprv_min(length, displayNameCapacity)*U_SIZEOF_UCHAR);
} else {
/* convert the internal name into a Unicode string */
- *pErrorCode=U_ZERO_ERROR;
length=(int32_t)uprv_strlen(cnv->sharedData->staticData->name);
u_charsToUChars(cnv->sharedData->staticData->name, displayName, uprv_min(length, displayNameCapacity));
}
diff --git a/icuSources/common/ucnvhz.c b/icuSources/common/ucnvhz.c
index 2178fa1e..b94811b8 100644
--- a/icuSources/common/ucnvhz.c
+++ b/icuSources/common/ucnvhz.c
@@ -1,6 +1,6 @@
/*
**********************************************************************
-* Copyright (C) 2000-2004, International Business Machines
+* Copyright (C) 2000-2006, International Business Machines
* Corporation and others. All Rights Reserved.
**********************************************************************
* file name: ucnvhz.c
@@ -53,10 +53,10 @@
typedef struct{
+ UConverter* gbConverter;
int32_t targetIndex;
int32_t sourceIndex;
UBool isEscapeAppended;
- UConverter* gbConverter;
UBool isStateDBCS;
UBool isTargetUCharDBCS;
}UConverterDataHZ;
@@ -69,16 +69,11 @@ _HZOpen(UConverter *cnv, const char *name,const char *locale,uint32_t options, U
cnv->fromUnicodeStatus= 0;
cnv->mode=0;
cnv->fromUChar32=0x0000;
- cnv->extraInfo = uprv_malloc (sizeof (UConverterDataHZ));
+ cnv->extraInfo = uprv_malloc(sizeof(UConverterDataHZ));
if(cnv->extraInfo != NULL){
+ uprv_memset(cnv->extraInfo, 0, sizeof(UConverterDataHZ));
((UConverterDataHZ*)cnv->extraInfo)->gbConverter = ucnv_open("ibm-1386",errorCode);
- ((UConverterDataHZ*)cnv->extraInfo)->isStateDBCS = FALSE;
- ((UConverterDataHZ*)cnv->extraInfo)->isEscapeAppended = FALSE;
- ((UConverterDataHZ*)cnv->extraInfo)->targetIndex = 0;
- ((UConverterDataHZ*)cnv->extraInfo)->sourceIndex = 0;
- ((UConverterDataHZ*)cnv->extraInfo)->isTargetUCharDBCS = FALSE;
}
- /* test for NULL */
else {
*errorCode = U_MEMORY_ALLOCATION_ERROR;
return;
@@ -148,7 +143,8 @@ UConverter_toUnicode_HZ_OFFSETS_LOGIC(UConverterToUnicodeArgs *args,
UChar32 targetUniChar = 0x0000;
UChar mySourceChar = 0x0000;
UConverterDataHZ* myData=(UConverterDataHZ*)(args->converter->extraInfo);
-
+ tempBuf[0]=0;
+ tempBuf[1]=0;
if ((args->converter == NULL) || (args->targetLimit < args->target) || (mySourceLimit < args->source)){
*err = U_ILLEGAL_ARGUMENT_ERROR;
return;
@@ -261,9 +257,17 @@ SAVE_STATE:
*err = U_ILLEGAL_CHAR_FOUND;
}
if(myData->isStateDBCS){
- args->converter->toUBytes[0] = (uint8_t)(tempBuf[0]-0x80);
- args->converter->toUBytes[1] = (uint8_t)(tempBuf[1]-0x80);
- args->converter->toULength=2;
+ /* this should never occur since isStateDBCS is set to true
+ * only after tempBuf[0] and tempBuf[1]
+ * are set to the input .. just to please BEAM
+ */
+ if(tempBuf[0]==0 || tempBuf[1]==0){
+ *err = U_INTERNAL_PROGRAM_ERROR;
+ }else{
+ args->converter->toUBytes[0] = (uint8_t)(tempBuf[0]-0x80);
+ args->converter->toUBytes[1] = (uint8_t)(tempBuf[1]-0x80);
+ args->converter->toULength=2;
+ }
}
else{
args->converter->toUBytes[0] = (uint8_t)mySourceChar;
@@ -295,11 +299,10 @@ UConverter_fromUnicode_HZ_OFFSETS_LOGIC (UConverterFromUnicodeArgs * args,
int32_t mySourceLength = (int32_t)(args->sourceLimit - args->source);
int32_t length=0;
uint32_t targetUniChar = 0x0000;
- UChar32 mySourceChar = 0x0000,c=0x0000;
+ UChar32 mySourceChar = 0x0000;
UConverterDataHZ *myConverterData=(UConverterDataHZ*)args->converter->extraInfo;
UBool isTargetUCharDBCS = (UBool) myConverterData->isTargetUCharDBCS;
UBool oldIsTargetUCharDBCS = isTargetUCharDBCS;
- UBool isEscapeAppended =FALSE;
int len =0;
const char* escSeq=NULL;
@@ -315,7 +318,7 @@ UConverter_fromUnicode_HZ_OFFSETS_LOGIC (UConverterFromUnicodeArgs * args,
targetUniChar = missingCharMarker;
if (myTargetIndex < targetLength){
- c=mySourceChar = (UChar) mySource[mySourceIndex++];
+ mySourceChar = (UChar) mySource[mySourceIndex++];
oldIsTargetUCharDBCS = isTargetUCharDBCS;
@@ -344,13 +347,13 @@ UConverter_fromUnicode_HZ_OFFSETS_LOGIC (UConverterFromUnicodeArgs * args,
len =ESC_LEN;
escSeq = SB_ESCAPE;
CONCAT_ESCAPE_MACRO(args, myTargetIndex, targetLength, escSeq,err,len,mySourceIndex);
- myConverterData->isEscapeAppended =isEscapeAppended =TRUE;
+ myConverterData->isEscapeAppended = TRUE;
}
else{ /* Shifting from a single byte to double byte mode*/
len =ESC_LEN;
escSeq = DB_ESCAPE;
CONCAT_ESCAPE_MACRO(args, myTargetIndex, targetLength, escSeq,err,len,mySourceIndex);
- myConverterData->isEscapeAppended =isEscapeAppended =TRUE;
+ myConverterData->isEscapeAppended = TRUE;
}
}
@@ -457,20 +460,28 @@ _HZ_WriteSub(UConverterFromUnicodeArgs *args, int32_t offsetIndex, UErrorCode *e
*p++= UCNV_CLOSE_BRACE;
convData->isTargetUCharDBCS=FALSE;
}
- *p++= cnv->subChar[0];
+ *p++= (char)cnv->subChars[0];
ucnv_cbFromUWriteBytes(args,
buffer, (int32_t)(p - buffer),
offsetIndex, err);
}
-/* structure for SafeClone calculations */
+/*
+ * Structure for cloning an HZ converter into a single memory block.
+ * ucnv_safeClone() of the HZ converter will align the entire cloneHZStruct,
+ * and then ucnv_safeClone() of the sub-converter may additionally align
+ * subCnv inside the cloneHZStruct, for which we need the deadSpace after
+ * subCnv. This is because UAlignedMemory may be larger than the actually
+ * necessary alignment size for the platform.
+ * The other cloneHZStruct fields will not be moved around,
+ * and are aligned properly with cloneHZStruct's alignment.
+ */
struct cloneHZStruct
{
UConverter cnv;
- UAlignedMemory deadSpace1;
UConverter subCnv;
- UAlignedMemory deadSpace2;
+ UAlignedMemory deadSpace;
UConverterDataHZ mydata;
};
@@ -494,14 +505,14 @@ _HZ_SafeClone(const UConverter *cnv,
}
localClone = (struct cloneHZStruct *)stackBuffer;
- uprv_memcpy(&localClone->cnv, cnv, sizeof(UConverter));
+ /* ucnv.c/ucnv_safeClone() copied the main UConverter already */
uprv_memcpy(&localClone->mydata, cnv->extraInfo, sizeof(UConverterDataHZ));
localClone->cnv.extraInfo = &localClone->mydata;
localClone->cnv.isExtraLocal = TRUE;
/* deep-clone the sub-converter */
- size = (int32_t)sizeof(UConverter);
+ size = (int32_t)(sizeof(UConverter) + sizeof(UAlignedMemory)); /* include size of padding */
((UConverterDataHZ*)localClone->cnv.extraInfo)->gbConverter =
ucnv_safeClone(((UConverterDataHZ*)cnv->extraInfo)->gbConverter, &localClone->subCnv, &size, status);
@@ -510,7 +521,7 @@ _HZ_SafeClone(const UConverter *cnv,
static void
_HZ_GetUnicodeSet(const UConverter *cnv,
- USetAdder *sa,
+ const USetAdder *sa,
UConverterUnicodeSet which,
UErrorCode *pErrorCode) {
/* the tilde '~' is hardcoded in the converter */
diff --git a/icuSources/common/ucnvisci.c b/icuSources/common/ucnvisci.c
index dd3a0a92..84a2740f 100644
--- a/icuSources/common/ucnvisci.c
+++ b/icuSources/common/ucnvisci.c
@@ -1,6 +1,6 @@
/*
**********************************************************************
-* Copyright (C) 2000-2004, International Business Machines
+* Copyright (C) 2000-2006, International Business Machines
* Corporation and others. All Rights Reserved.
**********************************************************************
* file name: ucnvisci.c
@@ -70,28 +70,28 @@ typedef enum {
/**
- * Enumeration for switching code pages if +
+ * Enumeration for switching code pages if +
* is encountered
*/
typedef enum {
- DEF =0x40,
- RMN =0x41,
- DEV =0x42,
- BNG =0x43,
- TML =0x44,
- TLG =0x45,
- ASM =0x46,
- ORI =0x47,
- KND =0x48,
- MLM =0x49,
- GJR =0x4A,
- PNJ =0x4B,
- ARB =0x71,
- PES =0x72,
- URD =0x73,
- SND =0x74,
- KSM =0x75,
- PST =0x76
+ DEF = 0x40,
+ RMN = 0x41,
+ DEV = 0x42,
+ BNG = 0x43,
+ TML = 0x44,
+ TLG = 0x45,
+ ASM = 0x46,
+ ORI = 0x47,
+ KND = 0x48,
+ MLM = 0x49,
+ GJR = 0x4A,
+ PNJ = 0x4B,
+ ARB = 0x71,
+ PES = 0x72,
+ URD = 0x73,
+ SND = 0x74,
+ KSM = 0x75,
+ PST = 0x76
}ISCIILang;
typedef enum{
@@ -116,10 +116,18 @@ typedef struct{
MaskEnum currentMaskToUnicode; /* mask for current state in toUnicode */
MaskEnum defMaskToUnicode; /* mask for default state in toUnicode */
UBool isFirstBuffer; /* boolean for fromUnicode to see if we need to announce the first script */
+ UBool resetToDefaultToUnicode; /* boolean for reseting to default delta and mask when a newline is encountered*/
char name[30];
}UConverterDataISCII;
-static const uint16_t lookupInitialData[][3]={
+typedef struct LookupDataStruct
+{
+ UniLang uniLang;
+ MaskEnum maskEnum;
+ ISCIILang isciiLang;
+} LookupDataStruct;
+
+static const LookupDataStruct lookupInitialData[]={
{ DEVANAGARI, DEV_MASK, DEV },
{ BENGALI, BNG_MASK, BNG },
{ GURMUKHI, PNJ_MASK, PNJ },
@@ -141,15 +149,16 @@ _ISCIIOpen(UConverter *cnv, const char *name,const char *locale,uint32_t options
converterData->contextCharToUnicode=NO_CHAR_MARKER;
cnv->toUnicodeStatus = missingCharMarker;
converterData->contextCharFromUnicode=0x0000;
+ converterData->resetToDefaultToUnicode=FALSE;
/* check if the version requested is supported */
if((options & UCNV_OPTIONS_VERSION_MASK) < 9){
/* initialize state variables */
converterData->currentDeltaFromUnicode=converterData->currentDeltaToUnicode=
converterData->defDeltaToUnicode=
- (uint16_t)(lookupInitialData[options & UCNV_OPTIONS_VERSION_MASK][0] * DELTA);
+ (uint16_t)(lookupInitialData[options & UCNV_OPTIONS_VERSION_MASK].uniLang * DELTA);
converterData->currentMaskFromUnicode = converterData->currentMaskToUnicode =
- converterData->defMaskToUnicode=lookupInitialData[options & UCNV_OPTIONS_VERSION_MASK][1];
+ converterData->defMaskToUnicode=lookupInitialData[options & UCNV_OPTIONS_VERSION_MASK].maskEnum;
converterData->isFirstBuffer=TRUE;
uprv_strcpy(converterData->name,"ISCII,version=");
@@ -198,9 +207,10 @@ _ISCIIReset(UConverter *cnv, UConverterResetChoice choice){
if(choice!=UCNV_RESET_TO_UNICODE) {
cnv->fromUChar32=0x0000;
data->contextCharFromUnicode=0x00;
- data->currentMaskFromUnicode=data->defDeltaToUnicode;
+ data->currentMaskFromUnicode=data->defMaskToUnicode;
data->currentDeltaFromUnicode=data->defDeltaToUnicode;
data->isFirstBuffer=TRUE;
+ data->resetToDefaultToUnicode=FALSE;
}
}
@@ -809,7 +819,6 @@ UConverter_fromUnicode_ISCII_OFFSETS_LOGIC (UConverterFromUnicodeArgs * args,
int32_t* offsets = args->offsets;
uint32_t targetByteUnit = 0x0000;
UChar32 sourceChar = 0x0000;
- UBool useFallback;
UConverterDataISCII *converterData;
uint16_t newDelta=0;
uint16_t range = 0;
@@ -821,7 +830,6 @@ UConverter_fromUnicode_ISCII_OFFSETS_LOGIC (UConverterFromUnicodeArgs * args,
}
/* initialize data */
converterData=(UConverterDataISCII*)args->converter->extraInfo;
- useFallback = args->converter->useFallback;
newDelta=converterData->currentDeltaFromUnicode;
range = (uint16_t)(newDelta/DELTA);
@@ -844,7 +852,7 @@ UConverter_fromUnicode_ISCII_OFFSETS_LOGIC (UConverterFromUnicodeArgs * args,
}
if(sourceChar == LF){
targetByteUnit = ATR<<8;
- targetByteUnit += (uint8_t) lookupInitialData[range][2];
+ targetByteUnit += (uint8_t) lookupInitialData[range].isciiLang;
args->converter->fromUnicodeStatus=sourceChar;
/* now append ATR and language code */
WRITE_TO_TARGET_FROM_U(args,offsets,source,target,targetLimit,targetByteUnit,err);
@@ -890,7 +898,7 @@ UConverter_fromUnicode_ISCII_OFFSETS_LOGIC (UConverterFromUnicodeArgs * args,
/* Now are we in the same block as the previous? */
if(newDelta!= converterData->currentDeltaFromUnicode || converterData->isFirstBuffer){
converterData->currentDeltaFromUnicode = newDelta;
- converterData->currentMaskFromUnicode = lookupInitialData[range][1];
+ converterData->currentMaskFromUnicode = lookupInitialData[range].maskEnum;
deltaChanged =TRUE;
converterData->isFirstBuffer=FALSE;
}
@@ -916,7 +924,7 @@ UConverter_fromUnicode_ISCII_OFFSETS_LOGIC (UConverterFromUnicodeArgs * args,
*/
uint16_t temp=0;
temp =(uint16_t)(ATR<<8);
- temp += (uint16_t)((uint8_t) lookupInitialData[range][2]);
+ temp += (uint16_t)((uint8_t) lookupInitialData[range].isciiLang);
/* reset */
deltaChanged=FALSE;
/* now append ATR and language code */
@@ -997,8 +1005,10 @@ static const int32_t lookupTable[][2]={
{ BENGALI, BNG_MASK },
{ ORIYA, ORI_MASK },
{ KANNADA, KND_MASK },
+ { MALAYALAM, MLM_MASK },
{ GUJARATI, GJR_MASK },
- { GURMUKHI, PNJ_MASK },
+ { GURMUKHI, PNJ_MASK }
+
};
#define WRITE_TO_TARGET_TO_U(args,source,target,offsets,offset,targetUniChar,delta, err){\
@@ -1099,7 +1109,7 @@ UConverter_toUnicode_ISCII_OFFSETS_LOGIC(UConverterToUnicodeArgs *args,
data->currentDeltaToUnicode =
(uint16_t)(lookupTable[sourceChar & 0x0F][0] * DELTA);
data->currentMaskToUnicode =
- lookupTable[sourceChar & 0x0F][1] ;
+ (MaskEnum)lookupTable[sourceChar & 0x0F][1] ;
}
else if(sourceChar==DEF){
/* switch back to default */
@@ -1200,6 +1210,14 @@ UConverter_toUnicode_ISCII_OFFSETS_LOGIC(UConverterToUnicodeArgs *args,
*contextCharToUnicode = sourceChar;
}
break;
+ case 0x0A:
+ /* fall through */
+ case 0x0D:
+ data->resetToDefaultToUnicode = TRUE;
+ GET_MAPPING(sourceChar,targetUniChar,data);
+ *contextCharToUnicode = sourceChar;
+ break;
+
case ISCII_NUKTA:
/* handle soft halant */
if(*contextCharToUnicode == ISCII_HALANT){
@@ -1221,7 +1239,7 @@ UConverter_toUnicode_ISCII_OFFSETS_LOGIC(UConverterToUnicodeArgs *args,
if(found){
/* find out if the mapping is valid in this state */
if(validityTable[(uint8_t)targetUniChar] & data->currentMaskToUnicode){
- targetUniChar += data->currentDeltaToUnicode ;
+ /*targetUniChar += data->currentDeltaToUnicode ;*/
*contextCharToUnicode= NO_CHAR_MARKER;
*toUnicodeStatus = missingCharMarker;
break;
@@ -1248,6 +1266,11 @@ UConverter_toUnicode_ISCII_OFFSETS_LOGIC(UConverterToUnicodeArgs *args,
if(targetUniChar != missingCharMarker ){
/* now save the targetUniChar for delayed write */
*toUnicodeStatus = (UChar) targetUniChar;
+ if(data->resetToDefaultToUnicode==TRUE){
+ data->currentDeltaToUnicode = data->defDeltaToUnicode;
+ data->currentMaskToUnicode = data->defMaskToUnicode;
+ data->resetToDefaultToUnicode=FALSE;
+ }
}else{
/* we reach here only if targetUniChar == missingCharMarker
@@ -1321,7 +1344,7 @@ _ISCII_SafeClone(const UConverter *cnv,
}
localClone = (struct cloneISCIIStruct *)stackBuffer;
- uprv_memcpy(&localClone->cnv, cnv, sizeof(UConverter));
+ /* ucnv.c/ucnv_safeClone() copied the main UConverter already */
uprv_memcpy(&localClone->mydata, cnv->extraInfo, sizeof(UConverterDataISCII));
localClone->cnv.extraInfo = &localClone->mydata;
@@ -1332,7 +1355,7 @@ _ISCII_SafeClone(const UConverter *cnv,
static void
_ISCIIGetUnicodeSet(const UConverter *cnv,
- USetAdder *sa,
+ const USetAdder *sa,
UConverterUnicodeSet which,
UErrorCode *pErrorCode)
{
@@ -1343,7 +1366,7 @@ _ISCIIGetUnicodeSet(const UConverter *cnv,
scripts, we add all roundtrippable characters to this set. */
sa->addRange(sa->set, 0, ASCII_END);
for (script = DEVANAGARI; script <= MALAYALAM; script++) {
- mask = (uint8_t)(lookupInitialData[script][1]);
+ mask = (uint8_t)(lookupInitialData[script].maskEnum);
for (idx = 0; idx < DELTA; idx++) {
if (validityTable[idx] & mask) {
sa->add(sa->set, idx + (script * DELTA) + INDIC_BLOCK_BEGIN);
diff --git a/icuSources/common/ucnvlat1.c b/icuSources/common/ucnvlat1.c
index edb753e1..bbaece60 100644
--- a/icuSources/common/ucnvlat1.c
+++ b/icuSources/common/ucnvlat1.c
@@ -42,7 +42,7 @@ _Latin1ToUnicodeWithOffsets(UConverterToUnicodeArgs *pArgs,
/* set up the local pointers */
source=(const uint8_t *)pArgs->source;
target=pArgs->target;
- targetCapacity=pArgs->targetLimit-pArgs->target;
+ targetCapacity=(int32_t)(pArgs->targetLimit-pArgs->target);
offsets=pArgs->offsets;
sourceIndex=0;
@@ -51,7 +51,7 @@ _Latin1ToUnicodeWithOffsets(UConverterToUnicodeArgs *pArgs,
* since the conversion here is 1:1 UChar:uint8_t, we need only one counter
* for the minimum of the sourceLength and targetCapacity
*/
- length=(const uint8_t *)pArgs->sourceLimit-source;
+ length=(int32_t)((const uint8_t *)pArgs->sourceLimit-source);
if(length<=targetCapacity) {
targetCapacity=length;
} else {
@@ -163,7 +163,7 @@ _Latin1FromUnicodeWithOffsets(UConverterFromUnicodeArgs *pArgs,
source=pArgs->source;
sourceLimit=pArgs->sourceLimit;
target=oldTarget=(uint8_t *)pArgs->target;
- targetCapacity=pArgs->targetLimit-pArgs->target;
+ targetCapacity=(int32_t)(pArgs->targetLimit-pArgs->target);
offsets=pArgs->offsets;
if(cnv->sharedData==&_Latin1Data) {
@@ -182,7 +182,7 @@ _Latin1FromUnicodeWithOffsets(UConverterFromUnicodeArgs *pArgs,
* since the conversion here is 1:1 UChar:uint8_t, we need only one counter
* for the minimum of the sourceLength and targetCapacity
*/
- length=sourceLimit-source;
+ length=(int32_t)(sourceLimit-source);
if(lengthaddRange(sa->set, 0, 0xff);
@@ -396,7 +396,7 @@ _ASCIIToUnicodeWithOffsets(UConverterToUnicodeArgs *pArgs,
source=(const uint8_t *)pArgs->source;
sourceLimit=(const uint8_t *)pArgs->sourceLimit;
target=oldTarget=pArgs->target;
- targetCapacity=pArgs->targetLimit-pArgs->target;
+ targetCapacity=(int32_t)(pArgs->targetLimit-pArgs->target);
offsets=pArgs->offsets;
/* sourceIndex=-1 if the current character began in the previous buffer */
@@ -406,7 +406,7 @@ _ASCIIToUnicodeWithOffsets(UConverterToUnicodeArgs *pArgs,
* since the conversion here is 1:1 UChar:uint8_t, we need only one counter
* for the minimum of the sourceLength and targetCapacity
*/
- length=sourceLimit-source;
+ length=(int32_t)(sourceLimit-source);
if(lengthaddRange(sa->set, 0, 0x7f);
diff --git a/icuSources/common/ucnvmbcs.c b/icuSources/common/ucnvmbcs.c
index 9f9c6f32..84bae8a9 100644
--- a/icuSources/common/ucnvmbcs.c
+++ b/icuSources/common/ucnvmbcs.c
@@ -1,7 +1,7 @@
/*
******************************************************************************
*
-* Copyright (C) 2000-2004, International Business Machines
+* Copyright (C) 2000-2006, International Business Machines
* Corporation and others. All Rights Reserved.
*
******************************************************************************
@@ -344,7 +344,7 @@ gb18030Ranges[13][4]={
static void
_getUnicodeSetForBytes(const UConverterSharedData *sharedData,
const int32_t (*stateTable)[256], const uint16_t *unicodeCodeUnits,
- USetAdder *sa,
+ const USetAdder *sa,
UConverterUnicodeSet which,
uint8_t state, uint32_t offset, int32_t lowByte, int32_t highByte,
@@ -421,7 +421,7 @@ _getUnicodeSetForBytes(const UConverterSharedData *sharedData,
*/
U_CFUNC void
ucnv_MBCSGetUnicodeSetForBytes(const UConverterSharedData *sharedData,
- USetAdder *sa,
+ const USetAdder *sa,
UConverterUnicodeSet which,
uint8_t state, int32_t lowByte, int32_t highByte,
UErrorCode *pErrorCode) {
@@ -434,7 +434,7 @@ ucnv_MBCSGetUnicodeSetForBytes(const UConverterSharedData *sharedData,
U_CFUNC void
ucnv_MBCSGetUnicodeSetForUnicode(const UConverterSharedData *sharedData,
- USetAdder *sa,
+ const USetAdder *sa,
UConverterUnicodeSet which,
UErrorCode *pErrorCode) {
const UConverterMBCSTable *mbcsTable;
@@ -571,7 +571,7 @@ ucnv_MBCSGetUnicodeSetForUnicode(const UConverterSharedData *sharedData,
static void
ucnv_MBCSGetUnicodeSet(const UConverter *cnv,
- USetAdder *sa,
+ const USetAdder *sa,
UConverterUnicodeSet which,
UErrorCode *pErrorCode) {
if(cnv->options&_MBCS_OPTION_GB18030) {
@@ -589,7 +589,7 @@ ucnv_MBCSGetUnicodeSet(const UConverter *cnv,
* Definition of LINEAR macros and gb18030Ranges see near the beginning of the file.
*
* In the future, conversion extensions may handle m:n mappings and delta tables,
- * see http://oss.software.ibm.com/cvs/icu/~checkout~/icuhtml/design/conversion/conversion_extensions.html
+ * see http://dev.icu-project.org/cgi-bin/viewcvs.cgi/~checkout~/icuhtml/design/conversion/conversion_extensions.html
*
* If an input character cannot be mapped, then these functions set an error
* code. The framework will then call the callback function.
@@ -1411,7 +1411,7 @@ ucnv_MBCSSingleToBMPWithOffsets(UConverterToUnicodeArgs *pArgs,
source=(const uint8_t *)pArgs->source;
sourceLimit=(const uint8_t *)pArgs->sourceLimit;
target=pArgs->target;
- targetCapacity=pArgs->targetLimit-pArgs->target;
+ targetCapacity=(int32_t)(pArgs->targetLimit-pArgs->target);
offsets=pArgs->offsets;
if((cnv->options&UCNV_OPTION_SWAP_LFNL)!=0) {
@@ -1428,7 +1428,7 @@ ucnv_MBCSSingleToBMPWithOffsets(UConverterToUnicodeArgs *pArgs,
* since the conversion here is 1:1 UChar:uint8_t, we need only one counter
* for the minimum of the sourceLength and targetCapacity
*/
- length=sourceLimit-source;
+ length=(int32_t)(sourceLimit-source);
if(lengthtargetLimit-target;
- length=sourceLimit-source;
+ targetCapacity=(int32_t)(pArgs->targetLimit-target);
+ length=(int32_t)(sourceLimit-source);
if(lengthsource;
sourceLimit=pArgs->sourceLimit;
target=(uint8_t *)pArgs->target;
- targetCapacity=pArgs->targetLimit-pArgs->target;
+ targetCapacity=(int32_t)(pArgs->targetLimit-pArgs->target);
offsets=pArgs->offsets;
table=cnv->sharedData->mbcs.fromUnicodeTable;
@@ -2650,7 +2650,7 @@ unassigned:
/* a mapping was written to the target, continue */
/* recalculate the targetCapacity after an extension mapping */
- targetCapacity=pArgs->targetLimit-(char *)target;
+ targetCapacity=(int32_t)(pArgs->targetLimit-(char *)target);
/* normal end of conversion: prepare for a new character */
sourceIndex=nextSourceIndex;
@@ -2736,7 +2736,7 @@ ucnv_MBCSSingleFromUnicodeWithOffsets(UConverterFromUnicodeArgs *pArgs,
source=pArgs->source;
sourceLimit=pArgs->sourceLimit;
target=(uint8_t *)pArgs->target;
- targetCapacity=pArgs->targetLimit-pArgs->target;
+ targetCapacity=(int32_t)(pArgs->targetLimit-pArgs->target);
offsets=pArgs->offsets;
table=cnv->sharedData->mbcs.fromUnicodeTable;
@@ -2855,7 +2855,7 @@ unassigned:
/* a mapping was written to the target, continue */
/* recalculate the targetCapacity after an extension mapping */
- targetCapacity=pArgs->targetLimit-(char *)target;
+ targetCapacity=(int32_t)(pArgs->targetLimit-(char *)target);
/* normal end of conversion: prepare for a new character */
sourceIndex=nextSourceIndex;
@@ -2906,7 +2906,7 @@ ucnv_MBCSSingleFromBMPWithOffsets(UConverterFromUnicodeArgs *pArgs,
source=pArgs->source;
sourceLimit=pArgs->sourceLimit;
target=(uint8_t *)pArgs->target;
- targetCapacity=pArgs->targetLimit-pArgs->target;
+ targetCapacity=(int32_t)(pArgs->targetLimit-pArgs->target);
offsets=pArgs->offsets;
table=cnv->sharedData->mbcs.fromUnicodeTable;
@@ -2935,7 +2935,7 @@ ucnv_MBCSSingleFromBMPWithOffsets(UConverterFromUnicodeArgs *pArgs,
* since the conversion here is 1:1 UChar:uint8_t, we need only one counter
* for the minimum of the sourceLength and targetCapacity
*/
- length=sourceLimit-source;
+ length=(int32_t)(sourceLimit-source);
if(lengthtargetLimit-(char *)target;
- length=sourceLimit-source;
+ targetCapacity=(int32_t)(pArgs->targetLimit-(char *)target);
+ length=(int32_t)(sourceLimit-source);
if(lengthsource;
sourceLimit=pArgs->sourceLimit;
target=(uint8_t *)pArgs->target;
- targetCapacity=pArgs->targetLimit-pArgs->target;
+ targetCapacity=(int32_t)(pArgs->targetLimit-pArgs->target);
offsets=pArgs->offsets;
table=cnv->sharedData->mbcs.fromUnicodeTable;
@@ -3475,7 +3475,7 @@ unassigned:
/* a mapping was written to the target, continue */
/* recalculate the targetCapacity after an extension mapping */
- targetCapacity=pArgs->targetLimit-(char *)target;
+ targetCapacity=(int32_t)(pArgs->targetLimit-(char *)target);
/* normal end of conversion: prepare for a new character */
if(offsets!=NULL) {
@@ -3877,7 +3877,7 @@ ucnv_MBCSWriteSub(UConverterFromUnicodeArgs *pArgs,
length=1;
} else {
/* select subChar in all other cases */
- subchar=(char *)cnv->subChar;
+ subchar=(char *)cnv->subChars;
length=cnv->subCharLen;
}
diff --git a/icuSources/common/ucnvmbcs.h b/icuSources/common/ucnvmbcs.h
index 4ac4358a..7a118311 100644
--- a/icuSources/common/ucnvmbcs.h
+++ b/icuSources/common/ucnvmbcs.h
@@ -373,7 +373,7 @@ ucnv_MBCSToUnicodeWithOffsets(UConverterToUnicodeArgs *pArgs,
*/
U_CFUNC void
ucnv_MBCSGetUnicodeSetForBytes(const UConverterSharedData *sharedData,
- USetAdder *sa,
+ const USetAdder *sa,
UConverterUnicodeSet which,
uint8_t state, int32_t lowByte, int32_t highByte,
UErrorCode *pErrorCode);
@@ -388,7 +388,7 @@ ucnv_MBCSGetUnicodeSetForBytes(const UConverterSharedData *sharedData,
*/
U_CFUNC void
ucnv_MBCSGetUnicodeSetForUnicode(const UConverterSharedData *sharedData,
- USetAdder *sa,
+ const USetAdder *sa,
UConverterUnicodeSet which,
UErrorCode *pErrorCode);
diff --git a/icuSources/common/ucnvscsu.c b/icuSources/common/ucnvscsu.c
index 1211da7a..910a4920 100644
--- a/icuSources/common/ucnvscsu.c
+++ b/icuSources/common/ucnvscsu.c
@@ -1,7 +1,7 @@
/*
******************************************************************************
*
-* Copyright (C) 2000-2004, International Business Machines
+* Copyright (C) 2000-2006, International Business Machines
* Corporation and others. All Rights Reserved.
*
******************************************************************************
@@ -205,6 +205,10 @@ _SCSUOpen(UConverter *cnv,
} else {
*pErrorCode=U_MEMORY_ALLOCATION_ERROR;
}
+
+ /* Set the substitution character U+fffd as a Unicode string. */
+ cnv->subUChars[0]=0xfffd;
+ cnv->subCharLen=-1;
}
static void
@@ -1433,11 +1437,14 @@ outputBytes:
* first to the overflow buffer what does not fit into the
* regular target.
*/
- /* we know that 1<=targetCapacitycharErrorBuffer;
switch(length) {
/* each branch falls through to the next one */
+ case 4:
+ *p++=(uint8_t)(c>>24);
case 3:
*p++=(uint8_t)(c>>16);
case 2:
@@ -1470,7 +1477,6 @@ outputBytes:
*offsets++=sourceIndex;
}
default:
- /* will never occur */
break;
}
@@ -1868,11 +1874,14 @@ outputBytes:
* first to the overflow buffer what does not fit into the
* regular target.
*/
- /* we know that 1<=targetCapacitycharErrorBuffer;
switch(length) {
/* each branch falls through to the next one */
+ case 4:
+ *p++=(uint8_t)(c>>24);
case 3:
*p++=(uint8_t)(c>>16);
case 2:
@@ -1896,7 +1905,6 @@ outputBytes:
case 1:
*target++=(uint8_t)c;
default:
- /* will never occur */
break;
}
@@ -1922,30 +1930,6 @@ _SCSUGetName(const UConverter *cnv) {
}
}
-static void
-_SCSUWriteSub(UConverterFromUnicodeArgs *pArgs,
- int32_t offsetIndex,
- UErrorCode *pErrorCode) {
- static const char squ_fffd[]={ (char)SQU, (char)0xffu, (char)0xfdu };
-
- /*
- * The substitution character is U+fffd={ ff, fd }.
- * If the SCSU converter is in Unicode mode, then these two bytes just need to
- * be written. Otherwise, this character is quoted.
- */
- if(((SCSUData *)pArgs->converter->extraInfo)->fromUIsSingleByteMode) {
- /* single-byte mode: quote Unicode */
- ucnv_cbFromUWriteBytes(pArgs,
- squ_fffd, 3,
- offsetIndex, pErrorCode);
- } else {
- /* Unicode mode: just write U+fffd */
- ucnv_cbFromUWriteBytes(pArgs,
- squ_fffd+1, 2,
- offsetIndex, pErrorCode);
- }
-}
-
/* structure for SafeClone calculations */
struct cloneSCSUStruct
{
@@ -2000,7 +1984,7 @@ static const UConverterImpl _SCSUImpl={
NULL,
_SCSUGetName,
- _SCSUWriteSub,
+ NULL,
_SCSUSafeClone,
ucnv_getCompleteUnicodeSet
};
@@ -2008,14 +1992,12 @@ static const UConverterImpl _SCSUImpl={
static const UConverterStaticData _SCSUStaticData={
sizeof(UConverterStaticData),
"SCSU",
- 0, /* CCSID for SCSU */
+ 1212, /* CCSID for SCSU */
UCNV_IBM, UCNV_SCSU,
1, 3, /* one UChar generates at least 1 byte and at most 3 bytes */
/*
- * ### TODO the subchar really must be written by an SCSU function
- * however, currently SCSU's fromUnicode() never causes errors, therefore
- * no callbacks will be called and no subchars written
- * See Jitterbug 2837 - RFE: forbid converting surrogate code points in all charsets
+ * The subchar here is ignored because _SCSUOpen() sets U+fffd as a Unicode
+ * substitution string.
*/
{ 0x0e, 0xff, 0xfd, 0 }, 3,
FALSE, FALSE,
diff --git a/icuSources/common/ucol_swp.c b/icuSources/common/ucol_swp.c
index 18e2c2ca..3b8ac14c 100644
--- a/icuSources/common/ucol_swp.c
+++ b/icuSources/common/ucol_swp.c
@@ -1,7 +1,7 @@
/*
*******************************************************************************
*
-* Copyright (C) 2003, International Business Machines
+* Copyright (C) 2003-2006, International Business Machines
* Corporation and others. All Rights Reserved.
*
*******************************************************************************
@@ -16,17 +16,92 @@
* Swap collation binaries.
*/
-#include "unicode/utypes.h"
-
-#if !UCONFIG_NO_COLLATION
-
#include "unicode/udata.h" /* UDataInfo */
-#include "cmemory.h"
#include "utrie.h"
#include "udataswp.h"
+#include "cmemory.h"
#include "ucol_imp.h"
#include "ucol_swp.h"
+/* swapping ----------------------------------------------------------------- */
+
+/*
+ * This performs data swapping for a folded trie (see utrie.c for details).
+ */
+
+U_CAPI int32_t U_EXPORT2
+utrie_swap(const UDataSwapper *ds,
+ const void *inData, int32_t length, void *outData,
+ UErrorCode *pErrorCode) {
+ const UTrieHeader *inTrie;
+ UTrieHeader trie;
+ int32_t size;
+ UBool dataIs32;
+
+ if(pErrorCode==NULL || U_FAILURE(*pErrorCode)) {
+ return 0;
+ }
+ if(ds==NULL || inData==NULL || (length>=0 && outData==NULL)) {
+ *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR;
+ return 0;
+ }
+
+ /* setup and swapping */
+ if(length>=0 && lengthreadUInt32(inTrie->signature);
+ trie.options=ds->readUInt32(inTrie->options);
+ trie.indexLength=udata_readInt32(ds, inTrie->indexLength);
+ trie.dataLength=udata_readInt32(ds, inTrie->dataLength);
+
+ if( trie.signature!=0x54726965 ||
+ (trie.options&UTRIE_OPTIONS_SHIFT_MASK)!=UTRIE_SHIFT ||
+ ((trie.options>>UTRIE_OPTIONS_INDEX_SHIFT)&UTRIE_OPTIONS_SHIFT_MASK)!=UTRIE_INDEX_SHIFT ||
+ trie.indexLength=0) {
+ UTrieHeader *outTrie;
+
+ if(lengthswapArray32(ds, inTrie, sizeof(UTrieHeader), outTrie, pErrorCode);
+
+ /* swap the index and the data */
+ if(dataIs32) {
+ ds->swapArray16(ds, inTrie+1, trie.indexLength*2, outTrie+1, pErrorCode);
+ ds->swapArray32(ds, (const uint16_t *)(inTrie+1)+trie.indexLength, trie.dataLength*4,
+ (uint16_t *)(outTrie+1)+trie.indexLength, pErrorCode);
+ } else {
+ ds->swapArray16(ds, inTrie+1, (trie.indexLength+trie.dataLength)*2, outTrie+1, pErrorCode);
+ }
+ }
+
+ return size;
+}
+
+#if !UCONFIG_NO_COLLATION
+
/* swap a header-less collation binary, inside a resource bundle or ucadata.icu */
U_CAPI int32_t U_EXPORT2
ucol_swapBinary(const UDataSwapper *ds,
diff --git a/icuSources/common/udata.c b/icuSources/common/udata.c
index 35936500..5ffd8507 100644
--- a/icuSources/common/udata.c
+++ b/icuSources/common/udata.c
@@ -1,7 +1,7 @@
/*
******************************************************************************
*
-* Copyright (C) 1999-2004, International Business Machines
+* Copyright (C) 1999-2006, International Business Machines
* Corporation and others. All Rights Reserved.
*
******************************************************************************
@@ -78,6 +78,7 @@ static UDataMemory *gStubICUData = NULL; /* If gCommonICUData does get upda
static UHashtable *gCommonDataCache = NULL; /* Global hash table of opened ICU data files. */
+static UDataFileAccess gDataFileAccess = UDATA_DEFAULT_ACCESS;
static UBool U_CALLCONV
udata_cleanup(void)
@@ -138,7 +139,6 @@ setCommonICUData(UDataMemory *pData, /* The new common data. Belongs to ca
uprv_free(newCommonData);
}
umtx_unlock(NULL);
- return;
}
static const char *
@@ -193,7 +193,7 @@ typedef struct DataCacheElement {
* udata cleanup function closes the hash table; hash table in turn calls back to
* here for each entry.
*/
-static void U_EXPORT2 U_CALLCONV DataCacheElement_deleter(void *pDCEl) {
+static void U_CALLCONV DataCacheElement_deleter(void *pDCEl) {
DataCacheElement *p = (DataCacheElement *)pDCEl;
udata_close(p->item); /* unmaps storage */
uprv_free(p->name); /* delete the hash key string. */
@@ -217,7 +217,7 @@ static UHashtable *udata_getHashTable() {
return gCommonDataCache;
}
- tHT = uhash_open(uhash_hashChars, uhash_compareChars, &err);
+ tHT = uhash_open(uhash_hashChars, uhash_compareChars, NULL, &err);
uhash_setValueDeleter(tHT, DataCacheElement_deleter);
umtx_lock(NULL);
@@ -283,6 +283,7 @@ static UDataMemory *udata_cacheDataItem(const char *path, UDataMemory *item, UEr
}
newElement->item = UDataMemory_createNewInstance(pErr);
if (U_FAILURE(*pErr)) {
+ uprv_free(newElement);
return NULL;
}
UDatamemory_assign(newElement->item, item);
@@ -292,6 +293,8 @@ static UDataMemory *udata_cacheDataItem(const char *path, UDataMemory *item, UEr
newElement->name = uprv_malloc(nameLen+1);
if (newElement->name == NULL) {
*pErr = U_MEMORY_ALLOCATION_ERROR;
+ uprv_free(newElement->item);
+ uprv_free(newElement);
return NULL;
}
uprv_strcpy(newElement->name, baseName);
@@ -492,11 +495,6 @@ static void udata_pathiter_init(UDataPathIterator *iter, const char *path, const
iter->basename = findBasename(item);
iter->basenameLen = (int32_t)uprv_strlen(iter->basename);
- if(iter->basename == NULL) {
- iter->nextPath = NULL;
- return;
- }
-
/** Item path **/
iter->itemPath = iter->itemPathBuf;
if(iter->basename == item) {
@@ -534,7 +532,7 @@ static void udata_pathiter_init(UDataPathIterator *iter, const char *path, const
* Get an upper bound of possible string size, and make sure that the buffer
* is big enough (sum of length of each piece, 2 extra delimiters, + trailing NULL) */
{
- int32_t maxPathLen = (int32_t)uprv_strlen(iter->path) + uprv_strlen(item) + uprv_strlen(iter->suffix) + iter->packageStubLen + 3;
+ int32_t maxPathLen = (int32_t)(uprv_strlen(iter->path) + uprv_strlen(item) + uprv_strlen(iter->suffix) + iter->packageStubLen + 3);
iter->pathBuffer = iter->pathBufferA;
if (maxPathLen >= U_DATA_PATHITER_BUFSIZ) {
iter->pathBuffer = (char *)uprv_malloc(maxPathLen);
@@ -566,20 +564,16 @@ static void udata_pathiter_init(UDataPathIterator *iter, const char *path, const
* @param len If set, pointer to the length of the returned path, for convenience.
* @return Pointer to the next path segment, or NULL if there are no more.
*/
-static const char *udata_pathiter_next(UDataPathIterator *iter, int32_t *outPathLen)
+static const char *udata_pathiter_next(UDataPathIterator *iter)
{
const char *path = NULL;
uint32_t pathLen = 0;
const char *pathBasename;
- if(outPathLen != NULL) {
- *outPathLen = 0;
- }
-
do
{
if( iter->nextPath == NULL ) {
- return NULL;
+ break;
}
path = iter->nextPath;
@@ -676,11 +670,6 @@ static const char *udata_pathiter_next(UDataPathIterator *iter, int32_t *outPath
}
- /* return value of path size */
- if( outPathLen ) {
- *outPathLen = pathLen;
- }
-
#ifdef UDATA_DEBUG
fprintf(stderr, " --> %s\n", iter->pathBuffer);
#endif
@@ -706,6 +695,10 @@ static void udata_pathiter_dt(UDataPathIterator *iter) {
uprv_free(iter->pathBuffer);
iter->pathBuffer = NULL;
}
+ if (iter->packageStub != iter->packageStubBuf) {
+ uprv_free(iter->packageStub);
+ iter->packageStub = NULL;
+ }
}
/* ==================================================================================*/
@@ -732,7 +725,7 @@ extern const DataHeader U_DATA_API U_ICUDATA_ENTRY_POINT;
* *
*----------------------------------------------------------------------*/
static UDataMemory *
-openCommonData(const char *path, /* Path from OpenCHoice? */
+openCommonData(const char *path, /* Path from OpenChoice? */
UBool isICUData, /* ICU Data true if path == NULL */
UErrorCode *pErrorCode)
{
@@ -797,7 +790,7 @@ openCommonData(const char *path, /* Path from OpenCHoice? */
udata_pathiter_init(&iter, u_getDataDirectory(), inBasename, path, ".dat", TRUE);
while((UDataMemory_isLoaded(&tData)==FALSE) &&
- (pathBuffer = udata_pathiter_next(&iter, NULL)) != NULL)
+ (pathBuffer = udata_pathiter_next(&iter)) != NULL)
{
#ifdef UDATA_DEBUG
fprintf(stderr, "ocd: trying path %s - ", pathBuffer);
@@ -1017,8 +1010,133 @@ checkDataItem
return rDataMem;
}
+/**
+ * @return 0 if not loaded, 1 if loaded or err
+ */
+static UDataMemory *doLoadFromIndividualFiles(const char *pkgName,
+ const char *dataPath, const char *tocEntryPathSuffix,
+ /* following arguments are the same as doOpenChoice itself */
+ const char *path, const char *type, const char *name,
+ UDataMemoryIsAcceptable *isAcceptable, void *context,
+ UErrorCode *subErrorCode,
+ UErrorCode *pErrorCode)
+{
+ UDataMemory *retVal = NULL;
+ const char *pathBuffer;
+ UDataMemory dataMemory;
+ UDataMemory *pEntryData;
+
+ UDataPathIterator iter;
+ /* look in ind. files: package\nam.typ ========================= */
+ /* init path iterator for individual files */
+ udata_pathiter_init(&iter, dataPath, pkgName, path, tocEntryPathSuffix, FALSE);
+
+ while((pathBuffer = udata_pathiter_next(&iter)))
+ {
+#ifdef UDATA_DEBUG
+ fprintf(stderr, "UDATA: trying individual file %s\n", pathBuffer);
+#endif
+ if(uprv_mapFile(&dataMemory, pathBuffer))
+ {
+ pEntryData = checkDataItem(dataMemory.pHeader, isAcceptable, context, type, name, subErrorCode, pErrorCode);
+ if (pEntryData != NULL) {
+ /* Data is good.
+ * Hand off ownership of the backing memory to the user's UDataMemory.
+ * and return it. */
+ pEntryData->mapAddr = dataMemory.mapAddr;
+ pEntryData->map = dataMemory.map;
+
+#ifdef UDATA_DEBUG
+ fprintf(stderr, "** Mapped file: %s\n", pathBuffer);
+#endif
+ retVal = pEntryData;
+ goto commonReturn;
+ }
+
+ /* the data is not acceptable, or some error occured. Either way, unmap the memory */
+ udata_close(&dataMemory);
+
+ /* If we had a nasty error, bail out completely. */
+ if (U_FAILURE(*pErrorCode)) {
+ retVal = NULL;
+ goto commonReturn;
+ }
+
+ /* Otherwise remember that we found data but didn't like it for some reason */
+ *subErrorCode=U_INVALID_FORMAT_ERROR;
+ }
+#ifdef UDATA_DEBUG
+ fprintf(stderr, "%s\n", UDataMemory_isLoaded(&dataMemory)?"LOADED":"not loaded");
+#endif
+ }
+commonReturn:
+ udata_pathiter_dt(&iter);
+ return retVal;
+}
+
+/**
+ * @return 0 if not loaded, 1 if loaded or err
+ */
+static UDataMemory *doLoadFromCommonData(UBool isICUData, const char *pkgName,
+ const char *dataPath, const char *tocEntryPathSuffix, const char *tocEntryName,
+ /* following arguments are the same as doOpenChoice itself */
+ const char *path, const char *type, const char *name,
+ UDataMemoryIsAcceptable *isAcceptable, void *context,
+ UErrorCode *subErrorCode,
+ UErrorCode *pErrorCode)
+{
+ UDataMemory *retVal = NULL;
+ UDataMemory *pEntryData;
+ const DataHeader *pHeader;
+ UDataMemory *pCommonData;
+ /* try to get common data. The loop is for platforms such as the 390 that do
+ * not initially load the full set of ICU data. If the lookup of an ICU data item
+ * fails, the full (but slower to load) set is loaded, the and the loop repeats,
+ * trying the lookup again. Once the full set of ICU data is loaded, the loop wont
+ * repeat because the full set will be checked the first time through.
+ *
+ * The loop also handles the fallback to a .dat file if the application linked
+ * to the stub data library rather than a real library.
+ */
+ for (;;) {
+ pCommonData=openCommonData(path, isICUData, subErrorCode); /** search for pkg **/
+
+ if(U_SUCCESS(*subErrorCode)) {
+ int32_t length;
+
+ /* look up the data piece in the common data */
+ pHeader=pCommonData->vFuncs->Lookup(pCommonData, tocEntryName, &length, subErrorCode);
+#ifdef UDATA_DEBUG
+ fprintf(stderr, "%s: pHeader=%p - %s\n", tocEntryName, pHeader, u_errorName(*subErrorCode));
+#endif
+ if(pHeader!=NULL) {
+ pEntryData = checkDataItem(pHeader, isAcceptable, context, type, name, subErrorCode, pErrorCode);
+#ifdef UDATA_DEBUG
+ fprintf(stderr, "pEntryData=%p\n", pEntryData);
+#endif
+ if (U_FAILURE(*pErrorCode)) {
+ retVal = NULL;
+ goto commonReturn;
+ }
+ if (pEntryData != NULL) {
+ pEntryData->length = length;
+ retVal = pEntryData;
+ goto commonReturn;
+ }
+ }
+ }
+ /* Data wasn't found. If we were looking for an ICUData item and there is
+ * more data available, load it and try again,
+ * otherwise break out of this loop. */
+ if (!(isICUData && pCommonData && extendICUData(pCommonData, subErrorCode))) {
+ break;
+ }
+ }
+commonReturn:
+ return retVal;
+}
/*
* A note on the ownership of Mapped Memory
@@ -1058,46 +1176,37 @@ doOpenChoice(const char *path, const char *type, const char *name,
UErrorCode *pErrorCode)
{
UDataMemory *retVal = NULL;
-
- const char *pathBuffer;
-
+
TinyString tocEntryName; /* entry name in tree format. ex: 'icudt28b/coll/ar.res' */
TinyString tocEntryPath; /* entry name in path format. ex: 'icudt28b\\coll\\ar.res' */
- TinyString oldIndFileName; /* ex: icudt28b_ar.res */
- TinyString oldStylePath;
- TinyString oldStylePathBasename;
TinyString pkgName;
TinyString treeName;
-#if (U_FILE_SEP_CHAR != U_FILE_ALT_SEP_CHAR)
+#if (U_FILE_SEP_CHAR != U_FILE_ALT_SEP_CHAR) /* '/' vs '\' */
TinyString altSepPath;
#endif
const char *dataPath;
- const char *tocEntrySuffix;
int32_t tocEntrySuffixIndex;
const char *tocEntryPathSuffix;
- UDataMemory dataMemory;
- UDataMemory *pCommonData;
- UDataMemory *pEntryData;
- const DataHeader *pHeader;
- const char *inBasename;
- UErrorCode errorCode=U_ZERO_ERROR;
+ UErrorCode subErrorCode=U_ZERO_ERROR;
const char *treeChar;
UBool isICUData = FALSE;
+
+ /* Is this path ICU data? */
if(path == NULL ||
- !strcmp(path, U_ICUDATA_ALIAS) ||
- !uprv_strncmp(path, U_ICUDATA_NAME U_TREE_SEPARATOR_STRING,
- uprv_strlen(U_ICUDATA_NAME U_TREE_SEPARATOR_STRING)) ||
- !uprv_strncmp(path, U_ICUDATA_ALIAS U_TREE_SEPARATOR_STRING,
+ !strcmp(path, U_ICUDATA_ALIAS) || /* "ICUDATA" */
+ !uprv_strncmp(path, U_ICUDATA_NAME U_TREE_SEPARATOR_STRING, /* "icudt26e-" */
+ uprv_strlen(U_ICUDATA_NAME U_TREE_SEPARATOR_STRING)) ||
+ !uprv_strncmp(path, U_ICUDATA_ALIAS U_TREE_SEPARATOR_STRING, /* "ICUDATA-" */
uprv_strlen(U_ICUDATA_ALIAS U_TREE_SEPARATOR_STRING))) {
isICUData = TRUE;
}
-#if (U_FILE_SEP_CHAR != U_FILE_ALT_SEP_CHAR)
+#if (U_FILE_SEP_CHAR != U_FILE_ALT_SEP_CHAR) /* Windows: try "foo\bar" and "foo/bar" */
/* remap from alternate path char to the main one */
TinyString_init(&altSepPath);
if(path) {
@@ -1115,16 +1224,13 @@ doOpenChoice(const char *path, const char *type, const char *name,
}
#endif
- TinyString_init(&oldIndFileName);
TinyString_init(&tocEntryName);
TinyString_init(&tocEntryPath);
- TinyString_init(&oldStylePath);
- TinyString_init(&oldStylePathBasename);
TinyString_init(&pkgName);
TinyString_init(&treeName);
-
+ /* ======= Set up strings */
if(path==NULL) {
TinyString_append(&pkgName, U_ICUDATA_NAME);
} else {
@@ -1143,16 +1249,23 @@ doOpenChoice(const char *path, const char *type, const char *name,
treeChar = uprv_strchr(path, U_TREE_SEPARATOR);
if(treeChar) {
TinyString_append(&treeName, treeChar+1); /* following '-' */
- if(!isICUData) {
- TinyString_appendn(&pkgName, path, (int32_t)(treeChar-path));
- } else {
+ if(isICUData) {
TinyString_append(&pkgName, U_ICUDATA_NAME);
+ } else {
+ TinyString_appendn(&pkgName, path, (int32_t)(treeChar-path));
+ if (first == NULL) {
+ /*
+ This user data has no path, but there is a tree name.
+ Look up the correct path from the data cache later.
+ */
+ path = pkgName.s;
+ }
}
} else {
- if(!isICUData) {
- TinyString_append(&pkgName, path);
- } else {
+ if(isICUData) {
TinyString_append(&pkgName, U_ICUDATA_NAME);
+ } else {
+ TinyString_append(&pkgName, path);
}
}
}
@@ -1162,14 +1275,14 @@ doOpenChoice(const char *path, const char *type, const char *name,
fprintf(stderr, " P=%s T=%s\n", pkgName.s, treeName.s);
#endif
- /* Make up a full name by appending the type to the supplied
+ /* setting up the entry name and file name
+ * Make up a full name by appending the type to the supplied
* name, assuming that a type was supplied.
*/
/* prepend the package */
TinyString_append(&tocEntryName, pkgName.s);
TinyString_append(&tocEntryPath, pkgName.s);
- TinyString_append(&oldIndFileName, pkgName.s);
tocEntrySuffixIndex = tocEntryName.length;
if(treeName.s[0]) {
@@ -1180,10 +1293,8 @@ doOpenChoice(const char *path, const char *type, const char *name,
TinyString_append(&tocEntryPath, treeName.s);
}
- TinyString_append(&oldIndFileName, "_");
TinyString_append(&tocEntryName, U_TREE_ENTRY_SEP_STRING);
TinyString_append(&tocEntryPath, U_FILE_SEP_STRING);
- TinyString_append(&oldIndFileName, name);
TinyString_append(&tocEntryName, name);
TinyString_append(&tocEntryPath, name);
if(type!=NULL && *type!=0) {
@@ -1191,30 +1302,16 @@ doOpenChoice(const char *path, const char *type, const char *name,
TinyString_append(&tocEntryName, type);
TinyString_append(&tocEntryPath, ".");
TinyString_append(&tocEntryPath, type);
- TinyString_append(&oldIndFileName, ".");
- TinyString_append(&oldIndFileName, type);
}
- tocEntrySuffix = tocEntryName.s+tocEntrySuffixIndex; /* suffix starts here */
tocEntryPathSuffix = tocEntryPath.s+tocEntrySuffixIndex; /* suffix starts here */
#ifdef UDATA_DEBUG
fprintf(stderr, " tocEntryName = %s\n", tocEntryName.s);
fprintf(stderr, " tocEntryPath = %s\n", tocEntryName.s);
- fprintf(stderr, " oldIndFileName = %s\n", oldIndFileName.s);
#endif
-
- /* the data was not found in the common data, look further, */
- /* try to get an individual data file */
if(path == NULL) {
- path = COMMON_DATA_NAME;
- inBasename = COMMON_DATA_NAME;
- } else {
- if(isICUData) {
- inBasename=COMMON_DATA_NAME;
- } else {
- inBasename=findBasename(path);
- }
+ path = COMMON_DATA_NAME; /* "icudt26e" */
}
/************************ Begin loop looking for ind. files ***************/
@@ -1222,206 +1319,82 @@ doOpenChoice(const char *path, const char *type, const char *name,
fprintf(stderr, "IND: inBasename = %s, pkg=%s\n", inBasename, packageNameFromPath(path));
#endif
- /* Deal with a null basename */
- if( (*inBasename==0) && (uprv_strlen(path) > 3) ) {
- /* the purpose of this exercise is to turn /tmp/foo/bar/ into
- path= /tmp/foo/bar/bar and basename= bar
- (i.e. /tmp/foo/bar/bar.dat or /tmp/foo/bar/bar_en_US.res )
- */
-
- char *rightSlash;
- TinyString_append(&oldStylePath, path);
- /* chop off trailing slash */
- oldStylePath.length--;
- oldStylePath.s[oldStylePath.length] = 0;
-
- rightSlash = (char*)uprv_strrchr(oldStylePath.s, U_FILE_SEP_CHAR);
- if(rightSlash != NULL) {
- rightSlash++;
- TinyString_append(&oldStylePathBasename, rightSlash);
- inBasename = oldStylePathBasename.s;
- TinyString_append(&oldStylePath, U_FILE_SEP_STRING);
- TinyString_append(&oldStylePath, inBasename); /* one more time, for the base name */
- path = oldStylePath.s;
- } else {
- *pErrorCode = U_FILE_ACCESS_ERROR; /* hopelessly bad case */
- retVal = NULL;
- goto commonReturn;
- }
- }
/* End of dealing with a null basename */
-
dataPath = u_getDataDirectory();
- /* Check to make sure that there is a dataPath to iterate over */
- if ((dataPath && *dataPath) || !isICUData) {
- UDataPathIterator iter;
- /* #1a look in ind. files: package\nam.typ ========================= */
- /* init path iterator for individual files */
- udata_pathiter_init(&iter, dataPath, pkgName.s, path, tocEntryPathSuffix, FALSE);
-
- while((pathBuffer = udata_pathiter_next(&iter, NULL)))
- {
-#ifdef UDATA_DEBUG
- fprintf(stderr, "UDATA: trying individual file %s\n", pathBuffer);
-#endif
- if( uprv_mapFile(&dataMemory, pathBuffer) ||
- (inBasename!=pathBuffer && uprv_mapFile(&dataMemory, inBasename)))
- {
- pEntryData = checkDataItem(dataMemory.pHeader, isAcceptable, context, type, name, &errorCode, pErrorCode);
- if (pEntryData != NULL) {
- /* Data is good.
- * Hand off ownership of the backing memory to the user's UDataMemory.
- * and return it. */
- pEntryData->mapAddr = dataMemory.mapAddr;
- pEntryData->map = dataMemory.map;
-
-#ifdef UDATA_DEBUG
- fprintf(stderr, "** Mapped file: %s\n", pathBuffer);
-#endif
- udata_pathiter_dt(&iter);
- retVal = pEntryData;
- goto commonReturn;
- }
-
- /* the data is not acceptable, or some error occured. Either way, unmap the memory */
- udata_close(&dataMemory);
-
- /* If we had a nasty error, bail out completely. */
- if (U_FAILURE(*pErrorCode)) {
- udata_pathiter_dt(&iter);
- retVal = NULL;
- goto commonReturn;
- }
-
- /* Otherwise remember that we found data but didn't like it for some reason */
- errorCode=U_INVALID_FORMAT_ERROR;
- }
+ /**** COMMON PACKAGE - only if packages are first. */
+ if(gDataFileAccess == UDATA_PACKAGES_FIRST) {
#ifdef UDATA_DEBUG
- fprintf(stderr, "%s\n", UDataMemory_isLoaded(&dataMemory)?"LOADED":"not loaded");
+ fprintf(stderr, "Trying packages (UDATA_PACKAGES_FIRST)\n");
#endif
+ /* #2 */
+ retVal = doLoadFromCommonData(isICUData,
+ pkgName.s, dataPath, tocEntryPathSuffix, tocEntryName.s,
+ path, type, name, isAcceptable, context, &subErrorCode, pErrorCode);
+ if((retVal != NULL) || U_FAILURE(*pErrorCode)) {
+ goto commonReturn;
}
- udata_pathiter_dt(&iter);
-
- /* #1b look in ind. files - with old naming (package_nam.typ not package\nam.typ) ==================== */
- /* init path iterator for individual files */
- udata_pathiter_init(&iter, dataPath, "", path, oldIndFileName.s, FALSE);
-
- while((pathBuffer = udata_pathiter_next(&iter, NULL)))
- {
-#ifdef UDATA_DEBUG
- fprintf(stderr, "UDATA: trying individual file %s\n", pathBuffer);
-#endif
- if( uprv_mapFile(&dataMemory, pathBuffer) ||
- (inBasename!=pathBuffer && uprv_mapFile(&dataMemory, inBasename)))
- {
- pEntryData = checkDataItem(dataMemory.pHeader, isAcceptable, context, type, name, &errorCode, pErrorCode);
- if (pEntryData != NULL) {
- /* Data is good.
- * Hand off ownership of the backing memory to the user's UDataMemory.
- * and return it. */
- pEntryData->mapAddr = dataMemory.mapAddr;
- pEntryData->map = dataMemory.map;
-
+ }
+
+ /**** INDIVIDUAL FILES */
+ if((gDataFileAccess==UDATA_PACKAGES_FIRST) ||
+ (gDataFileAccess==UDATA_FILES_FIRST)) {
#ifdef UDATA_DEBUG
- fprintf(stderr, "** Mapped file: %s\n", pathBuffer);
+ fprintf(stderr, "Trying individual files\n");
#endif
- udata_pathiter_dt(&iter);
- retVal = pEntryData;
- goto commonReturn;
- }
-
- /* the data is not acceptable, or some error occured. Either way, unmap the memory */
- udata_close(&dataMemory);
-
- /* If we had a nasty error, bail out completely. */
- if (U_FAILURE(*pErrorCode)) {
- udata_pathiter_dt(&iter);
- retVal = NULL;
- goto commonReturn;
- }
-
- /* Otherwise remember that we found data but didn't like it for some reason */
- errorCode=U_INVALID_FORMAT_ERROR;
+ /* Check to make sure that there is a dataPath to iterate over */
+ if ((dataPath && *dataPath) || !isICUData) {
+ retVal = doLoadFromIndividualFiles(pkgName.s, dataPath, tocEntryPathSuffix,
+ path, type, name, isAcceptable, context, &subErrorCode, pErrorCode);
+ if((retVal != NULL) || U_FAILURE(*pErrorCode)) {
+ goto commonReturn;
}
-#ifdef UDATA_DEBUG
- fprintf(stderr, "%s\n", UDataMemory_isLoaded(&dataMemory)?"LOADED":"not loaded");
-#endif
}
- udata_pathiter_dt(&iter);
}
- /* #2 */
-
- /* try to get common data. The loop is for platforms such as the 390 that do
- * not initially load the full set of ICU data. If the lookup of an ICU data item
- * fails, the full (but slower to load) set is loaded, the and the loop repeats,
- * trying the lookup again. Once the full set of ICU data is loaded, the loop wont
- * repeat because the full set will be checked the first time through.
- *
- * The loop also handles the fallback to a .dat file if the application linked
- * to the stub data library rather than a real library.
- */
- for (;;) {
- pCommonData=openCommonData(path, isICUData, &errorCode); /** search for pkg **/
-
- if(U_SUCCESS(errorCode)) {
- int32_t length;
-
- /* look up the data piece in the common data */
- pHeader=pCommonData->vFuncs->Lookup(pCommonData, tocEntryName.s, &length, &errorCode);
+ /**** COMMON PACKAGE */
+ if((gDataFileAccess==UDATA_ONLY_PACKAGES) ||
+ (gDataFileAccess==UDATA_FILES_FIRST)) {
#ifdef UDATA_DEBUG
- fprintf(stderr, "%s: pHeader=%p - %s\n", tocEntryName.s, pHeader, u_errorName(errorCode));
+ fprintf(stderr, "Trying packages (UDATA_ONLY_PACKAGES || UDATA_FILES_FIRST)\n");
#endif
- if((pHeader == NULL) && !U_FAILURE(errorCode)) {
- pHeader=pCommonData->vFuncs->Lookup(pCommonData, oldIndFileName.s, /* oldIndFileName is preceded by a slash */
- &length, &errorCode);
-#ifdef UDATA_DEBUG
- fprintf(stderr, "[OLD name] %s: pHeader=%p - %s\n", oldIndFileName.s, pHeader, u_errorName(errorCode));
-#endif
- }
-
- if(pHeader!=NULL) {
- pEntryData = checkDataItem(pHeader, isAcceptable, context, type, name, &errorCode, pErrorCode);
+ retVal = doLoadFromCommonData(isICUData,
+ pkgName.s, dataPath, tocEntryPathSuffix, tocEntryName.s,
+ path, type, name, isAcceptable, context, &subErrorCode, pErrorCode);
+ if((retVal != NULL) || U_FAILURE(*pErrorCode)) {
+ goto commonReturn;
+ }
+ }
+
+ /* Load from DLL. If we haven't attempted package load, we also haven't had any chance to
+ try a DLL (static or setCommonData/etc) load.
+ If we ever have a "UDATA_ONLY_FILES", add it to the or list here. */
+ if(gDataFileAccess==UDATA_NO_FILES) {
#ifdef UDATA_DEBUG
- fprintf(stderr, "pEntryData=%p\n", pEntryData);
+ fprintf(stderr, "Trying common data (UDATA_NO_FILES)\n");
#endif
- if (U_FAILURE(*pErrorCode)) {
- retVal = NULL;
- goto commonReturn;
- }
- if (pEntryData != NULL) {
- pEntryData->length = length;
- retVal = pEntryData;
- goto commonReturn;
- }
- }
- }
- /* Data wasn't found. If we were looking for an ICUData item and there is
- * more data available, load it and try again,
- * otherwise break out of this loop. */
- if (!(isICUData && pCommonData && extendICUData(pCommonData, &errorCode))) {
- break;
+ retVal = doLoadFromCommonData(isICUData,
+ pkgName.s, "", tocEntryPathSuffix, tocEntryName.s,
+ path, type, name, isAcceptable, context, &subErrorCode, pErrorCode);
+ if((retVal != NULL) || U_FAILURE(*pErrorCode)) {
+ goto commonReturn;
}
}
/* data not found */
if(U_SUCCESS(*pErrorCode)) {
- if(U_SUCCESS(errorCode)) {
+ if(U_SUCCESS(subErrorCode)) {
/* file not found */
*pErrorCode=U_FILE_ACCESS_ERROR;
} else {
/* entry point not found or rejected */
- *pErrorCode=errorCode;
+ *pErrorCode=subErrorCode;
}
}
commonReturn:
TinyString_dt(&tocEntryName);
TinyString_dt(&tocEntryPath);
- TinyString_dt(&oldIndFileName);
- TinyString_dt(&oldStylePath);
- TinyString_dt(&oldStylePathBasename);
TinyString_dt(&pkgName);
TinyString_dt(&treeName);
#if (U_FILE_SEP_CHAR != U_FILE_ALT_SEP_CHAR)
@@ -1494,3 +1467,10 @@ udata_getInfo(UDataMemory *pData, UDataInfo *pInfo) {
}
}
}
+
+
+U_CAPI void U_EXPORT2 udata_setFileAccess(UDataFileAccess access, UErrorCode *status)
+{
+ gDataFileAccess = access;
+}
+
diff --git a/icuSources/common/udataswp.h b/icuSources/common/udataswp.h
index e62faec8..52b99aaa 100644
--- a/icuSources/common/udataswp.h
+++ b/icuSources/common/udataswp.h
@@ -1,7 +1,7 @@
/*
*******************************************************************************
*
-* Copyright (C) 2003, International Business Machines
+* Copyright (C) 2003-2005, International Business Machines
* Corporation and others. All Rights Reserved.
*
*******************************************************************************
@@ -82,7 +82,7 @@ typedef struct UDataSwapper UDataSwapper;
* @return The actual length of the data.
*
* @see UDataSwapper
- * @draft ICU 2.8
+ * @internal ICU 2.8
*/
typedef int32_t U_CALLCONV
UDataSwapFn(const UDataSwapper *ds,
@@ -91,28 +91,28 @@ UDataSwapFn(const UDataSwapper *ds,
/**
* Convert one uint16_t from input to platform endianness.
- * @draft ICU 2.8
+ * @internal ICU 2.8
*/
typedef uint16_t U_CALLCONV
UDataReadUInt16(uint16_t x);
/**
* Convert one uint32_t from input to platform endianness.
- * @draft ICU 2.8
+ * @internal ICU 2.8
*/
typedef uint32_t U_CALLCONV
UDataReadUInt32(uint32_t x);
/**
* Convert one uint16_t from platform to input endianness.
- * @draft ICU 2.8
+ * @internal ICU 2.8
*/
typedef void U_CALLCONV
UDataWriteUInt16(uint16_t *p, uint16_t x);
/**
* Convert one uint32_t from platform to input endianness.
- * @draft ICU 2.8
+ * @internal ICU 2.8
*/
typedef void U_CALLCONV
UDataWriteUInt32(uint32_t *p, uint32_t x);
@@ -125,7 +125,7 @@ UDataWriteUInt32(uint32_t *p, uint32_t x);
* according to the output charset.
* You can use -1 for the length parameters of NUL-terminated strings as usual.
* Returns Unicode code point order for invariant characters.
- * @draft ICU 2.8
+ * @internal ICU 2.8
*/
typedef int32_t U_CALLCONV
UDataCompareInvChars(const UDataSwapper *ds,
@@ -141,53 +141,53 @@ UDataCompareInvChars(const UDataSwapper *ds,
* @param fmt The format string.
* @param args The arguments for format string inserts.
*
- * @draft ICU 2.8
+ * @internal ICU 2.8
*/
typedef void U_CALLCONV
UDataPrintError(void *context, const char *fmt, va_list args);
struct UDataSwapper {
- /** Input endianness. @draft ICU 2.8 */
+ /** Input endianness. @internal ICU 2.8 */
UBool inIsBigEndian;
- /** Input charset family. @see U_CHARSET_FAMILY @draft ICU 2.8 */
+ /** Input charset family. @see U_CHARSET_FAMILY @internal ICU 2.8 */
uint8_t inCharset;
- /** Output endianness. @draft ICU 2.8 */
+ /** Output endianness. @internal ICU 2.8 */
UBool outIsBigEndian;
- /** Output charset family. @see U_CHARSET_FAMILY @draft ICU 2.8 */
+ /** Output charset family. @see U_CHARSET_FAMILY @internal ICU 2.8 */
uint8_t outCharset;
/* basic functions for reading data values */
- /** Convert one uint16_t from input to platform endianness. @draft ICU 2.8 */
+ /** Convert one uint16_t from input to platform endianness. @internal ICU 2.8 */
UDataReadUInt16 *readUInt16;
- /** Convert one uint32_t from input to platform endianness. @draft ICU 2.8 */
+ /** Convert one uint32_t from input to platform endianness. @internal ICU 2.8 */
UDataReadUInt32 *readUInt32;
- /** Compare an invariant-character output string with a local one. @draft ICU 2.8 */
+ /** Compare an invariant-character output string with a local one. @internal ICU 2.8 */
UDataCompareInvChars *compareInvChars;
/* basic functions for writing data values */
- /** Convert one uint16_t from platform to input endianness. @draft ICU 2.8 */
+ /** Convert one uint16_t from platform to input endianness. @internal ICU 2.8 */
UDataWriteUInt16 *writeUInt16;
- /** Convert one uint32_t from platform to input endianness. @draft ICU 2.8 */
+ /** Convert one uint32_t from platform to input endianness. @internal ICU 2.8 */
UDataWriteUInt32 *writeUInt32;
/* basic functions for data transformations */
- /** Transform an array of 16-bit integers. @draft ICU 2.8 */
+ /** Transform an array of 16-bit integers. @internal ICU 2.8 */
UDataSwapFn *swapArray16;
- /** Transform an array of 32-bit integers. @draft ICU 2.8 */
+ /** Transform an array of 32-bit integers. @internal ICU 2.8 */
UDataSwapFn *swapArray32;
- /** Transform an invariant-character string. @draft ICU 2.8 */
+ /** Transform an invariant-character string. @internal ICU 2.8 */
UDataSwapFn *swapInvChars;
/**
* Function for message output when an error occurs during data swapping.
* Can be NULL.
- * @draft ICU 2.8
+ * @internal ICU 2.8
*/
UDataPrintError *printError;
- /** Context pointer for printError. @draft ICU 2.8 */
+ /** Context pointer for printError. @internal ICU 2.8 */
void *printErrorContext;
};
@@ -205,7 +205,7 @@ udata_openSwapper(UBool inIsBigEndian, uint8_t inCharset,
* characteristics.
*
* @see udata_swap
- * @draft ICU 2.8
+ * @internal ICU 2.8
*/
U_CAPI UDataSwapper * U_EXPORT2
udata_openSwapperForInputData(const void *data, int32_t length,
@@ -222,7 +222,7 @@ udata_closeSwapper(UDataSwapper *ds);
*
* @return The size of the data header, in bytes.
*
- * @draft ICU 2.8
+ * @internal ICU 2.8
*/
U_CAPI int32_t U_EXPORT2
udata_swapDataHeader(const UDataSwapper *ds,
@@ -231,14 +231,14 @@ udata_swapDataHeader(const UDataSwapper *ds,
/**
* Convert one int16_t from input to platform endianness.
- * @draft ICU 2.8
+ * @internal ICU 2.8
*/
U_CAPI int16_t U_EXPORT2
udata_readInt16(const UDataSwapper *ds, int16_t x);
/**
* Convert one int32_t from input to platform endianness.
- * @draft ICU 2.8
+ * @internal ICU 2.8
*/
U_CAPI int32_t U_EXPORT2
udata_readInt32(const UDataSwapper *ds, int32_t x);
@@ -266,7 +266,7 @@ udata_printError(const UDataSwapper *ds,
* Swap invariant char * strings ASCII->EBCDIC.
* @internal
*/
-U_CFUNC int32_t
+U_CAPI int32_t U_EXPORT2
uprv_ebcdicFromAscii(const UDataSwapper *ds,
const void *inData, int32_t length, void *outData,
UErrorCode *pErrorCode);
@@ -335,7 +335,7 @@ uprv_compareInvEbcdic(const UDataSwapper *ds,
*
* @param isAcceptable Same as for udata_openChoice(). May be NULL.
*
- * @draft ICU 2.8
+ * @internal ICU 2.8
*/
U_CAPI UDataMemory * U_EXPORT2
udata_openSwap(const char *path, const char *type, const char *name,
diff --git a/icuSources/common/uenumimp.h b/icuSources/common/uenumimp.h
index 2c5cc3ac..664bc686 100644
--- a/icuSources/common/uenumimp.h
+++ b/icuSources/common/uenumimp.h
@@ -1,7 +1,7 @@
/*
*******************************************************************************
*
-* Copyright (C) 2002, International Business Machines
+* Copyright (C) 2002-2006, International Business Machines
* Corporation and others. All Rights Reserved.
*
*******************************************************************************
@@ -58,13 +58,14 @@ UEnumCount(UEnumeration *en, UErrorCode *status);
/**
* Function type declaration for uenum_unext().
*
- * This function should return the next element
- * as a UChar *
+ * This function returns the next element as a UChar *,
+ * or NULL after all elements haven been enumerated.
*
* @param en enumeration
* @param resultLength pointer to result length
* @param status pointer to UErrorCode variable
- * @return next element as UChar *
+ * @return next element as UChar *,
+ * or NULL after all elements haven been enumerated
*/
typedef const UChar* U_CALLCONV
UEnumUNext(UEnumeration* en,
@@ -74,13 +75,14 @@ UEnumUNext(UEnumeration* en,
/**
* Function type declaration for uenum_next().
*
- * This function should return the next element
- * as a char *
+ * This function returns the next element as a char *,
+ * or NULL after all elements haven been enumerated.
*
* @param en enumeration
* @param resultLength pointer to result length
* @param status pointer to UErrorCode variable
- * @return next element as char *
+ * @return next element as char *,
+ * or NULL after all elements haven been enumerated
*/
typedef const char* U_CALLCONV
UEnumNext(UEnumeration* en,
diff --git a/icuSources/common/uhash.c b/icuSources/common/uhash.c
index 7ba8b459..7907205d 100644
--- a/icuSources/common/uhash.c
+++ b/icuSources/common/uhash.c
@@ -1,6 +1,6 @@
/*
******************************************************************************
-* Copyright (C) 1997-2004, International Business Machines
+* Copyright (C) 1997-2006, International Business Machines
* Corporation and others. All Rights Reserved.
******************************************************************************
* Date Name Description
@@ -83,6 +83,7 @@ static const int32_t PRIMES[] = {
};
#define PRIMES_LENGTH (sizeof(PRIMES) / sizeof(PRIMES[0]))
+#define DEFAULT_PRIME_INDEX 3
/* These ratios are tuned to the PRIMES array such that a resize
* places the table back into the zone of non-resizing. That is,
@@ -132,805 +133,858 @@ static const float RESIZE_POLICY_RATIO_TABLE[6] = {
#define HINT_VALUE_POINTER (2)
/********************************************************************
- * Debugging
+ * PRIVATE Implementation
********************************************************************/
+static UHashTok
+_uhash_setElement(UHashtable *hash, UHashElement* e,
+ int32_t hashcode,
+ UHashTok key, UHashTok value, int8_t hint) {
-/********************************************************************
- * PRIVATE Prototypes
- ********************************************************************/
-
-static UHashtable* _uhash_create(UHashFunction *keyHash, UKeyComparator *keyComp,
- int32_t primeIndex, UErrorCode *status);
+ UHashTok oldValue = e->value;
+ if (hash->keyDeleter != NULL && e->key.pointer != NULL &&
+ e->key.pointer != key.pointer) { /* Avoid double deletion */
+ (*hash->keyDeleter)(e->key.pointer);
+ }
+ if (hash->valueDeleter != NULL) {
+ if (oldValue.pointer != NULL &&
+ oldValue.pointer != value.pointer) { /* Avoid double deletion */
+ (*hash->valueDeleter)(oldValue.pointer);
+ }
+ oldValue.pointer = NULL;
+ }
+ /* Compilers should copy the UHashTok union correctly, but even if
+ * they do, memory heap tools (e.g. BoundsChecker) can get
+ * confused when a pointer is cloaked in a union and then copied.
+ * TO ALLEVIATE THIS, we use hints (based on what API the user is
+ * calling) to copy pointers when we know the user thinks
+ * something is a pointer. */
+ if (hint & HINT_KEY_POINTER) {
+ e->key.pointer = key.pointer;
+ } else {
+ e->key = key;
+ }
+ if (hint & HINT_VALUE_POINTER) {
+ e->value.pointer = value.pointer;
+ } else {
+ e->value = value;
+ }
+ e->hashcode = hashcode;
+ return oldValue;
+}
-static void _uhash_allocate(UHashtable *hash, int32_t primeIndex,
- UErrorCode *status);
+/**
+ * Assumes that the given element is not empty or deleted.
+ */
+static UHashTok
+_uhash_internalRemoveElement(UHashtable *hash, UHashElement* e) {
+ UHashTok empty;
+ U_ASSERT(!IS_EMPTY_OR_DELETED(e->hashcode));
+ --hash->count;
+ empty.pointer = NULL; empty.integer = 0;
+ return _uhash_setElement(hash, e, HASH_DELETED, empty, empty, 0);
+}
-static void _uhash_rehash(UHashtable *hash);
+static void
+_uhash_internalSetResizePolicy(UHashtable *hash, enum UHashResizePolicy policy) {
+ U_ASSERT(hash != NULL);
+ U_ASSERT(((int32_t)policy) >= 0);
+ U_ASSERT(((int32_t)policy) < 3);
+ hash->lowWaterRatio = RESIZE_POLICY_RATIO_TABLE[policy * 2];
+ hash->highWaterRatio = RESIZE_POLICY_RATIO_TABLE[policy * 2 + 1];
+}
-static UHashElement* _uhash_find(const UHashtable *hash, UHashTok key,
- int32_t hashcode);
+/**
+ * Allocate internal data array of a size determined by the given
+ * prime index. If the index is out of range it is pinned into range.
+ * If the allocation fails the status is set to
+ * U_MEMORY_ALLOCATION_ERROR and all array storage is freed. In
+ * either case the previous array pointer is overwritten.
+ *
+ * Caller must ensure primeIndex is in range 0..PRIME_LENGTH-1.
+ */
+static void
+_uhash_allocate(UHashtable *hash,
+ int32_t primeIndex,
+ UErrorCode *status) {
-static UHashTok _uhash_put(UHashtable *hash,
- UHashTok key,
- UHashTok value,
- int8_t hint,
- UErrorCode *status);
+ UHashElement *p, *limit;
+ UHashTok emptytok;
-static UHashTok _uhash_remove(UHashtable *hash,
- UHashTok key);
+ if (U_FAILURE(*status)) return;
-static UHashTok _uhash_internalRemoveElement(UHashtable *hash, UHashElement* e);
+ U_ASSERT(primeIndex >= 0 && primeIndex < PRIMES_LENGTH);
-static UHashTok _uhash_setElement(UHashtable* hash, UHashElement* e,
- int32_t hashcode,
- UHashTok key, UHashTok value,
- int8_t hint);
+ hash->primeIndex = primeIndex;
+ hash->length = PRIMES[primeIndex];
-static void _uhash_internalSetResizePolicy(UHashtable *hash, enum UHashResizePolicy policy);
+ p = hash->elements = (UHashElement*)
+ uprv_malloc(sizeof(UHashElement) * hash->length);
-/********************************************************************
- * PUBLIC API
- ********************************************************************/
+ if (hash->elements == NULL) {
+ *status = U_MEMORY_ALLOCATION_ERROR;
+ return;
+ }
-U_CAPI UHashtable* U_EXPORT2
-uhash_open(UHashFunction *keyHash, UKeyComparator *keyComp,
- UErrorCode *status) {
+ emptytok.pointer = NULL; /* Only one of these two is needed */
+ emptytok.integer = 0; /* but we don't know which one. */
+
+ limit = p + hash->length;
+ while (p < limit) {
+ p->key = emptytok;
+ p->value = emptytok;
+ p->hashcode = HASH_EMPTY;
+ ++p;
+ }
- return _uhash_create(keyHash, keyComp, 3, status);
+ hash->count = 0;
+ hash->lowWaterMark = (int32_t)(hash->length * hash->lowWaterRatio);
+ hash->highWaterMark = (int32_t)(hash->length * hash->highWaterRatio);
}
-U_CAPI UHashtable* U_EXPORT2
-uhash_openSize(UHashFunction *keyHash, UKeyComparator *keyComp,
- int32_t size,
- UErrorCode *status) {
+static UHashtable*
+_uhash_init(UHashtable *result,
+ UHashFunction *keyHash,
+ UKeyComparator *keyComp,
+ UValueComparator *valueComp,
+ int32_t primeIndex,
+ UErrorCode *status)
+{
+ if (U_FAILURE(*status)) return NULL;
+ U_ASSERT(keyHash != NULL);
+ U_ASSERT(keyComp != NULL);
- /* Find the smallest index i for which PRIMES[i] >= size. */
- int32_t i = 0;
- while (i<(PRIMES_LENGTH-1) && PRIMES[i]keyHasher = keyHash;
+ result->keyComparator = keyComp;
+ result->valueComparator = valueComp;
+ result->keyDeleter = NULL;
+ result->valueDeleter = NULL;
+ result->allocated = FALSE;
+ _uhash_internalSetResizePolicy(result, U_GROW);
- return _uhash_create(keyHash, keyComp, i, status);
-}
+ _uhash_allocate(result, primeIndex, status);
-U_CAPI void U_EXPORT2
-uhash_close(UHashtable *hash) {
- U_ASSERT(hash != NULL);
- if (hash->elements != NULL) {
- if (hash->keyDeleter != NULL || hash->valueDeleter != NULL) {
- int32_t pos=-1;
- UHashElement *e;
- while ((e = (UHashElement*) uhash_nextElement(hash, &pos)) != NULL) {
- HASH_DELETE_KEY_VALUE(hash, e->key.pointer, e->value.pointer);
- }
- }
- uprv_free(hash->elements);
- hash->elements = NULL;
+ if (U_FAILURE(*status)) {
+ return NULL;
}
- uprv_free(hash);
-}
-U_CAPI UHashFunction *U_EXPORT2
-uhash_setKeyHasher(UHashtable *hash, UHashFunction *fn) {
- UHashFunction *result = hash->keyHasher;
- hash->keyHasher = fn;
return result;
}
-U_CAPI UKeyComparator *U_EXPORT2
-uhash_setKeyComparator(UHashtable *hash, UKeyComparator *fn) {
- UKeyComparator *result = hash->keyComparator;
- hash->keyComparator = fn;
- return result;
-}
+static UHashtable*
+_uhash_create(UHashFunction *keyHash,
+ UKeyComparator *keyComp,
+ UValueComparator *valueComp,
+ int32_t primeIndex,
+ UErrorCode *status) {
+ UHashtable *result;
-U_CAPI UObjectDeleter *U_EXPORT2
-uhash_setKeyDeleter(UHashtable *hash, UObjectDeleter *fn) {
- UObjectDeleter *result = hash->keyDeleter;
- hash->keyDeleter = fn;
- return result;
-}
+ if (U_FAILURE(*status)) return NULL;
-U_CAPI UObjectDeleter *U_EXPORT2
-uhash_setValueDeleter(UHashtable *hash, UObjectDeleter *fn) {
- UObjectDeleter *result = hash->valueDeleter;
- hash->valueDeleter = fn;
- return result;
-}
+ result = (UHashtable*) uprv_malloc(sizeof(UHashtable));
+ if (result == NULL) {
+ *status = U_MEMORY_ALLOCATION_ERROR;
+ return NULL;
+ }
-U_CAPI void U_EXPORT2
-uhash_setResizePolicy(UHashtable *hash, enum UHashResizePolicy policy) {
- _uhash_internalSetResizePolicy(hash, policy);
- hash->lowWaterMark = (int32_t)(hash->length * hash->lowWaterRatio);
- hash->highWaterMark = (int32_t)(hash->length * hash->highWaterRatio);
- _uhash_rehash(hash);
-}
+ _uhash_init(result, keyHash, keyComp, valueComp, primeIndex, status);
+ result->allocated = TRUE;
-U_CAPI int32_t U_EXPORT2
-uhash_count(const UHashtable *hash) {
- return hash->count;
-}
+ if (U_FAILURE(*status)) {
+ uprv_free(result);
+ return NULL;
+ }
-U_CAPI void* U_EXPORT2
-uhash_get(const UHashtable *hash,
- const void* key) {
- UHashTok keyholder;
- keyholder.pointer = (void*) key;
- return _uhash_find(hash, keyholder, hash->keyHasher(keyholder))->value.pointer;
+ return result;
}
-U_CAPI void* U_EXPORT2
-uhash_iget(const UHashtable *hash,
- int32_t key) {
- UHashTok keyholder;
- keyholder.integer = key;
- return _uhash_find(hash, keyholder, hash->keyHasher(keyholder))->value.pointer;
-}
+/**
+ * Look for a key in the table, or if no such key exists, the first
+ * empty slot matching the given hashcode. Keys are compared using
+ * the keyComparator function.
+ *
+ * First find the start position, which is the hashcode modulo
+ * the length. Test it to see if it is:
+ *
+ * a. identical: First check the hash values for a quick check,
+ * then compare keys for equality using keyComparator.
+ * b. deleted
+ * c. empty
+ *
+ * Stop if it is identical or empty, otherwise continue by adding a
+ * "jump" value (moduloing by the length again to keep it within
+ * range) and retesting. For efficiency, there need enough empty
+ * values so that the searchs stop within a reasonable amount of time.
+ * This can be changed by changing the high/low water marks.
+ *
+ * In theory, this function can return NULL, if it is full (no empty
+ * or deleted slots) and if no matching key is found. In practice, we
+ * prevent this elsewhere (in uhash_put) by making sure the last slot
+ * in the table is never filled.
+ *
+ * The size of the table should be prime for this algorithm to work;
+ * otherwise we are not guaranteed that the jump value (the secondary
+ * hash) is relatively prime to the table length.
+ */
+static UHashElement*
+_uhash_find(const UHashtable *hash, UHashTok key,
+ int32_t hashcode) {
-U_CAPI int32_t U_EXPORT2
-uhash_geti(const UHashtable *hash,
- const void* key) {
- UHashTok keyholder;
- keyholder.pointer = (void*) key;
- return _uhash_find(hash, keyholder, hash->keyHasher(keyholder))->value.integer;
-}
+ int32_t firstDeleted = -1; /* assume invalid index */
+ int32_t theIndex, startIndex;
+ int32_t jump = 0; /* lazy evaluate */
+ int32_t tableHash;
+ UHashElement *elements = hash->elements;
-U_CAPI int32_t U_EXPORT2
-uhash_igeti(const UHashtable *hash,
- int32_t key) {
- UHashTok keyholder;
- keyholder.integer = key;
- return _uhash_find(hash, keyholder, hash->keyHasher(keyholder))->value.integer;
-}
+ hashcode &= 0x7FFFFFFF; /* must be positive */
+ startIndex = theIndex = (hashcode ^ 0x4000000) % hash->length;
-U_CAPI void* U_EXPORT2
-uhash_put(UHashtable *hash,
- void* key,
- void* value,
- UErrorCode *status) {
- UHashTok keyholder, valueholder;
- keyholder.pointer = key;
- valueholder.pointer = value;
- return _uhash_put(hash, keyholder, valueholder,
- HINT_KEY_POINTER | HINT_VALUE_POINTER,
- status).pointer;
-}
+ do {
+ tableHash = elements[theIndex].hashcode;
+ if (tableHash == hashcode) { /* quick check */
+ if ((*hash->keyComparator)(key, elements[theIndex].key)) {
+ return &(elements[theIndex]);
+ }
+ } else if (!IS_EMPTY_OR_DELETED(tableHash)) {
+ /* We have hit a slot which contains a key-value pair,
+ * but for which the hash code does not match. Keep
+ * looking.
+ */
+ } else if (tableHash == HASH_EMPTY) { /* empty, end o' the line */
+ break;
+ } else if (firstDeleted < 0) { /* remember first deleted */
+ firstDeleted = theIndex;
+ }
+ if (jump == 0) { /* lazy compute jump */
+ /* The jump value must be relatively prime to the table
+ * length. As long as the length is prime, then any value
+ * 1..length-1 will be relatively prime to it.
+ */
+ jump = (hashcode % (hash->length - 1)) + 1;
+ }
+ theIndex = (theIndex + jump) % hash->length;
+ } while (theIndex != startIndex);
-U_CAPI void* U_EXPORT2
-uhash_iput(UHashtable *hash,
- int32_t key,
- void* value,
- UErrorCode *status) {
- UHashTok keyholder, valueholder;
- keyholder.integer = key;
- valueholder.pointer = value;
- return _uhash_put(hash, keyholder, valueholder,
- HINT_VALUE_POINTER,
- status).pointer;
+ if (firstDeleted >= 0) {
+ theIndex = firstDeleted; /* reset if had deleted slot */
+ } else if (tableHash != HASH_EMPTY) {
+ /* We get to this point if the hashtable is full (no empty or
+ * deleted slots), and we've failed to find a match. THIS
+ * WILL NEVER HAPPEN as long as uhash_put() makes sure that
+ * count is always < length.
+ */
+ U_ASSERT(FALSE);
+ return NULL; /* Never happens if uhash_put() behaves */
+ }
+ return &(elements[theIndex]);
}
-U_CAPI int32_t U_EXPORT2
-uhash_puti(UHashtable *hash,
- void* key,
- int32_t value,
- UErrorCode *status) {
- UHashTok keyholder, valueholder;
- keyholder.pointer = key;
- valueholder.integer = value;
- return _uhash_put(hash, keyholder, valueholder,
- HINT_KEY_POINTER,
- status).integer;
-}
+/**
+ * Attempt to grow or shrink the data arrays in order to make the
+ * count fit between the high and low water marks. hash_put() and
+ * hash_remove() call this method when the count exceeds the high or
+ * low water marks. This method may do nothing, if memory allocation
+ * fails, or if the count is already in range, or if the length is
+ * already at the low or high limit. In any case, upon return the
+ * arrays will be valid.
+ */
+static void
+_uhash_rehash(UHashtable *hash) {
+ UHashElement *old = hash->elements;
+ int32_t oldLength = hash->length;
+ int32_t newPrimeIndex = hash->primeIndex;
+ int32_t i;
+ UErrorCode status = U_ZERO_ERROR;
-U_CAPI int32_t U_EXPORT2
-uhash_iputi(UHashtable *hash,
- int32_t key,
- int32_t value,
- UErrorCode *status) {
- UHashTok keyholder, valueholder;
- keyholder.integer = key;
- valueholder.integer = value;
- return _uhash_put(hash, keyholder, valueholder,
- 0, /* neither is a ptr */
- status).integer;
-}
+ if (hash->count > hash->highWaterMark) {
+ if (++newPrimeIndex >= PRIMES_LENGTH) {
+ return;
+ }
+ } else if (hash->count < hash->lowWaterMark) {
+ if (--newPrimeIndex < 0) {
+ return;
+ }
+ } else {
+ return;
+ }
-U_CAPI void* U_EXPORT2
-uhash_remove(UHashtable *hash,
- const void* key) {
- UHashTok keyholder;
- keyholder.pointer = (void*) key;
- return _uhash_remove(hash, keyholder).pointer;
-}
+ _uhash_allocate(hash, newPrimeIndex, &status);
-U_CAPI void* U_EXPORT2
-uhash_iremove(UHashtable *hash,
- int32_t key) {
- UHashTok keyholder;
- keyholder.integer = key;
- return _uhash_remove(hash, keyholder).pointer;
-}
+ if (U_FAILURE(status)) {
+ hash->elements = old;
+ hash->length = oldLength;
+ return;
+ }
-U_CAPI int32_t U_EXPORT2
-uhash_removei(UHashtable *hash,
- const void* key) {
- UHashTok keyholder;
- keyholder.pointer = (void*) key;
- return _uhash_remove(hash, keyholder).integer;
-}
+ for (i = oldLength - 1; i >= 0; --i) {
+ if (!IS_EMPTY_OR_DELETED(old[i].hashcode)) {
+ UHashElement *e = _uhash_find(hash, old[i].key, old[i].hashcode);
+ U_ASSERT(e != NULL);
+ U_ASSERT(e->hashcode == HASH_EMPTY);
+ e->key = old[i].key;
+ e->value = old[i].value;
+ e->hashcode = old[i].hashcode;
+ ++hash->count;
+ }
+ }
-U_CAPI int32_t U_EXPORT2
-uhash_iremovei(UHashtable *hash,
- int32_t key) {
- UHashTok keyholder;
- keyholder.integer = key;
- return _uhash_remove(hash, keyholder).integer;
+ uprv_free(old);
}
-U_CAPI void U_EXPORT2
-uhash_removeAll(UHashtable *hash) {
- int32_t pos = -1;
- const UHashElement *e;
- U_ASSERT(hash != NULL);
- if (hash->count != 0) {
- while ((e = uhash_nextElement(hash, &pos)) != NULL) {
- uhash_removeElement(hash, e);
+static UHashTok
+_uhash_remove(UHashtable *hash,
+ UHashTok key) {
+ /* First find the position of the key in the table. If the object
+ * has not been removed already, remove it. If the user wanted
+ * keys deleted, then delete it also. We have to put a special
+ * hashcode in that position that means that something has been
+ * deleted, since when we do a find, we have to continue PAST any
+ * deleted values.
+ */
+ UHashTok result;
+ UHashElement* e = _uhash_find(hash, key, hash->keyHasher(key));
+ U_ASSERT(e != NULL);
+ result.pointer = NULL; result.integer = 0;
+ if (!IS_EMPTY_OR_DELETED(e->hashcode)) {
+ result = _uhash_internalRemoveElement(hash, e);
+ if (hash->count < hash->lowWaterMark) {
+ _uhash_rehash(hash);
}
}
- U_ASSERT(hash->count == 0);
+ return result;
}
-U_CAPI const UHashElement* U_EXPORT2
-uhash_find(const UHashtable *hash, const void* key) {
- UHashTok keyholder;
- const UHashElement *e;
- keyholder.pointer = (void*) key;
- e = _uhash_find(hash, keyholder, hash->keyHasher(keyholder));
- return IS_EMPTY_OR_DELETED(e->hashcode) ? NULL : e;
-}
+static UHashTok
+_uhash_put(UHashtable *hash,
+ UHashTok key,
+ UHashTok value,
+ int8_t hint,
+ UErrorCode *status) {
-U_CAPI const UHashElement* U_EXPORT2
-uhash_nextElement(const UHashtable *hash, int32_t *pos) {
- /* Walk through the array until we find an element that is not
- * EMPTY and not DELETED.
+ /* Put finds the position in the table for the new value. If the
+ * key is already in the table, it is deleted, if there is a
+ * non-NULL keyDeleter. Then the key, the hash and the value are
+ * all put at the position in their respective arrays.
*/
- int32_t i;
+ int32_t hashcode;
+ UHashElement* e;
+ UHashTok emptytok;
+
+ if (U_FAILURE(*status)) {
+ goto err;
+ }
U_ASSERT(hash != NULL);
- for (i = *pos + 1; i < hash->length; ++i) {
- if (!IS_EMPTY_OR_DELETED(hash->elements[i].hashcode)) {
- *pos = i;
- return &(hash->elements[i]);
- }
+ /* Cannot always check pointer here or iSeries sees NULL every time. */
+ if ((hint & HINT_VALUE_POINTER) && value.pointer == NULL) {
+ /* Disallow storage of NULL values, since NULL is returned by
+ * get() to indicate an absent key. Storing NULL == removing.
+ */
+ return _uhash_remove(hash, key);
+ }
+ if (hash->count > hash->highWaterMark) {
+ _uhash_rehash(hash);
}
- /* No more elements */
- return NULL;
-}
-
-U_CAPI void* U_EXPORT2
-uhash_removeElement(UHashtable *hash, const UHashElement* e) {
- U_ASSERT(hash != NULL);
+ hashcode = (*hash->keyHasher)(key);
+ e = _uhash_find(hash, key, hashcode);
U_ASSERT(e != NULL);
- if (!IS_EMPTY_OR_DELETED(e->hashcode)) {
- return _uhash_internalRemoveElement(hash, (UHashElement*) e).pointer;
+
+ if (IS_EMPTY_OR_DELETED(e->hashcode)) {
+ /* Important: We must never actually fill the table up. If we
+ * do so, then _uhash_find() will return NULL, and we'll have
+ * to check for NULL after every call to _uhash_find(). To
+ * avoid this we make sure there is always at least one empty
+ * or deleted slot in the table. This only is a problem if we
+ * are out of memory and rehash isn't working.
+ */
+ ++hash->count;
+ if (hash->count == hash->length) {
+ /* Don't allow count to reach length */
+ --hash->count;
+ *status = U_MEMORY_ALLOCATION_ERROR;
+ goto err;
+ }
}
- return NULL;
-}
-/********************************************************************
- * UHashTok convenience
- ********************************************************************/
+ /* We must in all cases handle storage properly. If there was an
+ * old key, then it must be deleted (if the deleter != NULL).
+ * Make hashcodes stored in table positive.
+ */
+ return _uhash_setElement(hash, e, hashcode & 0x7FFFFFFF, key, value, hint);
-/**
- * Return a UHashTok for an integer.
- */
-U_CAPI UHashTok U_EXPORT2
-uhash_toki(int32_t i) {
- UHashTok tok;
- tok.integer = i;
- return tok;
+ err:
+ /* If the deleters are non-NULL, this method adopts its key and/or
+ * value arguments, and we must be sure to delete the key and/or
+ * value in all cases, even upon failure.
+ */
+ HASH_DELETE_KEY_VALUE(hash, key.pointer, value.pointer);
+ emptytok.pointer = NULL; emptytok.integer = 0;
+ return emptytok;
}
-/**
- * Return a UHashTok for a pointer.
- */
-U_CAPI UHashTok U_EXPORT2
-uhash_tokp(void* p) {
- UHashTok tok;
- tok.pointer = p;
- return tok;
-}
/********************************************************************
- * PUBLIC Key Hash Functions
+ * PUBLIC API
********************************************************************/
-/*
- Compute the hash by iterating sparsely over about 32 (up to 63)
- characters spaced evenly through the string. For each character,
- multiply the previous hash value by a prime number and add the new
- character in, like a linear congruential random number generator,
- producing a pseudorandom deterministic value well distributed over
- the output range. [LIU]
-*/
-
-#define STRING_HASH(TYPE, STR, STRLEN, DEREF) \
- int32_t hash = 0; \
- const TYPE *p = (const TYPE*) STR; \
- if (p != NULL) { \
- int32_t len = (int32_t)(STRLEN); \
- int32_t inc = ((len - 32) / 32) + 1; \
- const TYPE *limit = p + len; \
- while (p= size. */
+ int32_t i = 0;
+ while (i<(PRIMES_LENGTH-1) && PRIMES[i]elements != NULL) {
+ if (hash->keyDeleter != NULL || hash->valueDeleter != NULL) {
+ int32_t pos=-1;
+ UHashElement *e;
+ while ((e = (UHashElement*) uhash_nextElement(hash, &pos)) != NULL) {
+ HASH_DELETE_KEY_VALUE(hash, e->key.pointer, e->value.pointer);
+ }
+ }
+ uprv_free(hash->elements);
+ hash->elements = NULL;
}
- if (p1 == NULL || p2 == NULL) {
- return FALSE;
+ if (hash->allocated) {
+ uprv_free(hash);
}
- while (*p1 != 0 && *p1 == *p2) {
- ++p1;
- ++p2;
- }
- return (UBool)(*p1 == *p2);
}
-U_CAPI UBool U_EXPORT2
-uhash_compareIChars(const UHashTok key1, const UHashTok key2) {
- const char *p1 = (const char*) key1.pointer;
- const char *p2 = (const char*) key2.pointer;
- if (p1 == p2) {
- return TRUE;
- }
- if (p1 == NULL || p2 == NULL) {
- return FALSE;
- }
- while (*p1 != 0 && uprv_tolower(*p1) == uprv_tolower(*p2)) {
- ++p1;
- ++p2;
- }
- return (UBool)(*p1 == *p2);
+U_CAPI UHashFunction *U_EXPORT2
+uhash_setKeyHasher(UHashtable *hash, UHashFunction *fn) {
+ UHashFunction *result = hash->keyHasher;
+ hash->keyHasher = fn;
+ return result;
}
-/********************************************************************
- * PUBLIC int32_t Support Functions
- ********************************************************************/
-
-U_CAPI int32_t U_EXPORT2
-uhash_hashLong(const UHashTok key) {
- return key.integer;
+U_CAPI UKeyComparator *U_EXPORT2
+uhash_setKeyComparator(UHashtable *hash, UKeyComparator *fn) {
+ UKeyComparator *result = hash->keyComparator;
+ hash->keyComparator = fn;
+ return result;
+}
+U_CAPI UValueComparator *U_EXPORT2
+uhash_setValueComparator(UHashtable *hash, UValueComparator *fn){
+ UValueComparator *result = hash->valueComparator;
+ hash->valueComparator = fn;
+ return result;
}
-U_CAPI UBool U_EXPORT2
-uhash_compareLong(const UHashTok key1, const UHashTok key2) {
- return (UBool)(key1.integer == key2.integer);
+U_CAPI UObjectDeleter *U_EXPORT2
+uhash_setKeyDeleter(UHashtable *hash, UObjectDeleter *fn) {
+ UObjectDeleter *result = hash->keyDeleter;
+ hash->keyDeleter = fn;
+ return result;
}
-/********************************************************************
- * PUBLIC Deleter Functions
- ********************************************************************/
+U_CAPI UObjectDeleter *U_EXPORT2
+uhash_setValueDeleter(UHashtable *hash, UObjectDeleter *fn) {
+ UObjectDeleter *result = hash->valueDeleter;
+ hash->valueDeleter = fn;
+ return result;
+}
U_CAPI void U_EXPORT2
-uhash_freeBlock(void *obj) {
- uprv_free(obj);
+uhash_setResizePolicy(UHashtable *hash, enum UHashResizePolicy policy) {
+ _uhash_internalSetResizePolicy(hash, policy);
+ hash->lowWaterMark = (int32_t)(hash->length * hash->lowWaterRatio);
+ hash->highWaterMark = (int32_t)(hash->length * hash->highWaterRatio);
+ _uhash_rehash(hash);
}
-/********************************************************************
- * PRIVATE Implementation
- ********************************************************************/
-
-static UHashtable*
-_uhash_create(UHashFunction *keyHash, UKeyComparator *keyComp,
- int32_t primeIndex,
- UErrorCode *status) {
- UHashtable *result;
+U_CAPI int32_t U_EXPORT2
+uhash_count(const UHashtable *hash) {
+ return hash->count;
+}
- if (U_FAILURE(*status)) return NULL;
- U_ASSERT(keyHash != NULL);
- U_ASSERT(keyComp != NULL);
+U_CAPI void* U_EXPORT2
+uhash_get(const UHashtable *hash,
+ const void* key) {
+ UHashTok keyholder;
+ keyholder.pointer = (void*) key;
+ return _uhash_find(hash, keyholder, hash->keyHasher(keyholder))->value.pointer;
+}
- result = (UHashtable*) uprv_malloc(sizeof(UHashtable));
- if (result == NULL) {
- *status = U_MEMORY_ALLOCATION_ERROR;
- return NULL;
- }
+U_CAPI void* U_EXPORT2
+uhash_iget(const UHashtable *hash,
+ int32_t key) {
+ UHashTok keyholder;
+ keyholder.integer = key;
+ return _uhash_find(hash, keyholder, hash->keyHasher(keyholder))->value.pointer;
+}
- result->keyHasher = keyHash;
- result->keyComparator = keyComp;
- result->keyDeleter = NULL;
- result->valueDeleter = NULL;
- _uhash_internalSetResizePolicy(result, U_GROW);
+U_CAPI int32_t U_EXPORT2
+uhash_geti(const UHashtable *hash,
+ const void* key) {
+ UHashTok keyholder;
+ keyholder.pointer = (void*) key;
+ return _uhash_find(hash, keyholder, hash->keyHasher(keyholder))->value.integer;
+}
- _uhash_allocate(result, primeIndex, status);
+U_CAPI int32_t U_EXPORT2
+uhash_igeti(const UHashtable *hash,
+ int32_t key) {
+ UHashTok keyholder;
+ keyholder.integer = key;
+ return _uhash_find(hash, keyholder, hash->keyHasher(keyholder))->value.integer;
+}
- if (U_FAILURE(*status)) {
- uprv_free(result);
- return NULL;
- }
+U_CAPI void* U_EXPORT2
+uhash_put(UHashtable *hash,
+ void* key,
+ void* value,
+ UErrorCode *status) {
+ UHashTok keyholder, valueholder;
+ keyholder.pointer = key;
+ valueholder.pointer = value;
+ return _uhash_put(hash, keyholder, valueholder,
+ HINT_KEY_POINTER | HINT_VALUE_POINTER,
+ status).pointer;
+}
- return result;
+U_CAPI void* U_EXPORT2
+uhash_iput(UHashtable *hash,
+ int32_t key,
+ void* value,
+ UErrorCode *status) {
+ UHashTok keyholder, valueholder;
+ keyholder.integer = key;
+ valueholder.pointer = value;
+ return _uhash_put(hash, keyholder, valueholder,
+ HINT_VALUE_POINTER,
+ status).pointer;
}
-/**
- * Allocate internal data array of a size determined by the given
- * prime index. If the index is out of range it is pinned into range.
- * If the allocation fails the status is set to
- * U_MEMORY_ALLOCATION_ERROR and all array storage is freed. In
- * either case the previous array pointer is overwritten.
- *
- * Caller must ensure primeIndex is in range 0..PRIME_LENGTH-1.
- */
-static void
-_uhash_allocate(UHashtable *hash,
- int32_t primeIndex,
- UErrorCode *status) {
+U_CAPI int32_t U_EXPORT2
+uhash_puti(UHashtable *hash,
+ void* key,
+ int32_t value,
+ UErrorCode *status) {
+ UHashTok keyholder, valueholder;
+ keyholder.pointer = key;
+ valueholder.integer = value;
+ return _uhash_put(hash, keyholder, valueholder,
+ HINT_KEY_POINTER,
+ status).integer;
+}
- UHashElement *p, *limit;
- UHashTok emptytok;
- if (U_FAILURE(*status)) return;
+U_CAPI int32_t U_EXPORT2
+uhash_iputi(UHashtable *hash,
+ int32_t key,
+ int32_t value,
+ UErrorCode *status) {
+ UHashTok keyholder, valueholder;
+ keyholder.integer = key;
+ valueholder.integer = value;
+ return _uhash_put(hash, keyholder, valueholder,
+ 0, /* neither is a ptr */
+ status).integer;
+}
- U_ASSERT(primeIndex >= 0 && primeIndex < PRIMES_LENGTH);
+U_CAPI void* U_EXPORT2
+uhash_remove(UHashtable *hash,
+ const void* key) {
+ UHashTok keyholder;
+ keyholder.pointer = (void*) key;
+ return _uhash_remove(hash, keyholder).pointer;
+}
- hash->primeIndex = primeIndex;
- hash->length = PRIMES[primeIndex];
+U_CAPI void* U_EXPORT2
+uhash_iremove(UHashtable *hash,
+ int32_t key) {
+ UHashTok keyholder;
+ keyholder.integer = key;
+ return _uhash_remove(hash, keyholder).pointer;
+}
- p = hash->elements = (UHashElement*)
- uprv_malloc(sizeof(UHashElement) * hash->length);
+U_CAPI int32_t U_EXPORT2
+uhash_removei(UHashtable *hash,
+ const void* key) {
+ UHashTok keyholder;
+ keyholder.pointer = (void*) key;
+ return _uhash_remove(hash, keyholder).integer;
+}
- if (hash->elements == NULL) {
- *status = U_MEMORY_ALLOCATION_ERROR;
- return;
- }
+U_CAPI int32_t U_EXPORT2
+uhash_iremovei(UHashtable *hash,
+ int32_t key) {
+ UHashTok keyholder;
+ keyholder.integer = key;
+ return _uhash_remove(hash, keyholder).integer;
+}
- emptytok.pointer = NULL; /* Only one of these two is needed */
- emptytok.integer = 0; /* but we don't know which one. */
-
- limit = p + hash->length;
- while (p < limit) {
- p->key = emptytok;
- p->value = emptytok;
- p->hashcode = HASH_EMPTY;
- ++p;
+U_CAPI void U_EXPORT2
+uhash_removeAll(UHashtable *hash) {
+ int32_t pos = -1;
+ const UHashElement *e;
+ U_ASSERT(hash != NULL);
+ if (hash->count != 0) {
+ while ((e = uhash_nextElement(hash, &pos)) != NULL) {
+ uhash_removeElement(hash, e);
+ }
}
-
- hash->count = 0;
- hash->lowWaterMark = (int32_t)(hash->length * hash->lowWaterRatio);
- hash->highWaterMark = (int32_t)(hash->length * hash->highWaterRatio);
+ U_ASSERT(hash->count == 0);
}
-/**
- * Attempt to grow or shrink the data arrays in order to make the
- * count fit between the high and low water marks. hash_put() and
- * hash_remove() call this method when the count exceeds the high or
- * low water marks. This method may do nothing, if memory allocation
- * fails, or if the count is already in range, or if the length is
- * already at the low or high limit. In any case, upon return the
- * arrays will be valid.
- */
-static void
-_uhash_rehash(UHashtable *hash) {
+U_CAPI const UHashElement* U_EXPORT2
+uhash_find(const UHashtable *hash, const void* key) {
+ UHashTok keyholder;
+ const UHashElement *e;
+ keyholder.pointer = (void*) key;
+ e = _uhash_find(hash, keyholder, hash->keyHasher(keyholder));
+ return IS_EMPTY_OR_DELETED(e->hashcode) ? NULL : e;
+}
- UHashElement *old = hash->elements;
- int32_t oldLength = hash->length;
- int32_t newPrimeIndex = hash->primeIndex;
+U_CAPI const UHashElement* U_EXPORT2
+uhash_nextElement(const UHashtable *hash, int32_t *pos) {
+ /* Walk through the array until we find an element that is not
+ * EMPTY and not DELETED.
+ */
int32_t i;
- UErrorCode status = U_ZERO_ERROR;
-
- if (hash->count > hash->highWaterMark) {
- if (++newPrimeIndex >= PRIMES_LENGTH) {
- return;
- }
- } else if (hash->count < hash->lowWaterMark) {
- if (--newPrimeIndex < 0) {
- return;
+ U_ASSERT(hash != NULL);
+ for (i = *pos + 1; i < hash->length; ++i) {
+ if (!IS_EMPTY_OR_DELETED(hash->elements[i].hashcode)) {
+ *pos = i;
+ return &(hash->elements[i]);
}
- } else {
- return;
}
- _uhash_allocate(hash, newPrimeIndex, &status);
+ /* No more elements */
+ return NULL;
+}
- if (U_FAILURE(status)) {
- hash->elements = old;
- hash->length = oldLength;
- return;
+U_CAPI void* U_EXPORT2
+uhash_removeElement(UHashtable *hash, const UHashElement* e) {
+ U_ASSERT(hash != NULL);
+ U_ASSERT(e != NULL);
+ if (!IS_EMPTY_OR_DELETED(e->hashcode)) {
+ return _uhash_internalRemoveElement(hash, (UHashElement*) e).pointer;
}
+ return NULL;
+}
- for (i = oldLength - 1; i >= 0; --i) {
- if (!IS_EMPTY_OR_DELETED(old[i].hashcode)) {
- UHashElement *e = _uhash_find(hash, old[i].key, old[i].hashcode);
- U_ASSERT(e != NULL);
- U_ASSERT(e->hashcode == HASH_EMPTY);
- e->key = old[i].key;
- e->value = old[i].value;
- e->hashcode = old[i].hashcode;
- ++hash->count;
- }
- }
+/********************************************************************
+ * UHashTok convenience
+ ********************************************************************/
- uprv_free(old);
-}
+/**
+ * Return a UHashTok for an integer.
+ */
+/*U_CAPI UHashTok U_EXPORT2
+uhash_toki(int32_t i) {
+ UHashTok tok;
+ tok.integer = i;
+ return tok;
+}*/
/**
- * Look for a key in the table, or if no such key exists, the first
- * empty slot matching the given hashcode. Keys are compared using
- * the keyComparator function.
- *
- * First find the start position, which is the hashcode modulo
- * the length. Test it to see if it is:
- *
- * a. identical: First check the hash values for a quick check,
- * then compare keys for equality using keyComparator.
- * b. deleted
- * c. empty
- *
- * Stop if it is identical or empty, otherwise continue by adding a
- * "jump" value (moduloing by the length again to keep it within
- * range) and retesting. For efficiency, there need enough empty
- * values so that the searchs stop within a reasonable amount of time.
- * This can be changed by changing the high/low water marks.
- *
- * In theory, this function can return NULL, if it is full (no empty
- * or deleted slots) and if no matching key is found. In practice, we
- * prevent this elsewhere (in uhash_put) by making sure the last slot
- * in the table is never filled.
- *
- * The size of the table should be prime for this algorithm to work;
- * otherwise we are not guaranteed that the jump value (the secondary
- * hash) is relatively prime to the table length.
+ * Return a UHashTok for a pointer.
*/
-static UHashElement*
-_uhash_find(const UHashtable *hash, UHashTok key,
- int32_t hashcode) {
+/*U_CAPI UHashTok U_EXPORT2
+uhash_tokp(void* p) {
+ UHashTok tok;
+ tok.pointer = p;
+ return tok;
+}*/
- int32_t firstDeleted = -1; /* assume invalid index */
- int32_t theIndex, startIndex;
- int32_t jump = 0; /* lazy evaluate */
- int32_t tableHash;
+/********************************************************************
+ * PUBLIC Key Hash Functions
+ ********************************************************************/
+
+/*
+ Compute the hash by iterating sparsely over about 32 (up to 63)
+ characters spaced evenly through the string. For each character,
+ multiply the previous hash value by a prime number and add the new
+ character in, like a linear congruential random number generator,
+ producing a pseudorandom deterministic value well distributed over
+ the output range. [LIU]
+*/
+
+#define STRING_HASH(TYPE, STR, STRLEN, DEREF) \
+ int32_t hash = 0; \
+ const TYPE *p = (const TYPE*) STR; \
+ if (p != NULL) { \
+ int32_t len = (int32_t)(STRLEN); \
+ int32_t inc = ((len - 32) / 32) + 1; \
+ const TYPE *limit = p + len; \
+ while (plength;
+U_CAPI int32_t U_EXPORT2
+uhash_hashUChars(const UHashTok key) {
+ STRING_HASH(UChar, key.pointer, u_strlen(p), *p);
+}
- do {
- tableHash = hash->elements[theIndex].hashcode;
- if (tableHash == hashcode) { /* quick check */
- if ((*hash->keyComparator)(key, hash->elements[theIndex].key)) {
- return &(hash->elements[theIndex]);
- }
- } else if (!IS_EMPTY_OR_DELETED(tableHash)) {
- /* We have hit a slot which contains a key-value pair,
- * but for which the hash code does not match. Keep
- * looking.
- */
- } else if (tableHash == HASH_EMPTY) { /* empty, end o' the line */
- break;
- } else if (firstDeleted < 0) { /* remember first deleted */
- firstDeleted = theIndex;
- }
- if (jump == 0) { /* lazy compute jump */
- /* The jump value must be relatively prime to the table
- * length. As long as the length is prime, then any value
- * 1..length-1 will be relatively prime to it.
- */
- jump = (hashcode % (hash->length - 1)) + 1;
- }
- theIndex = (theIndex + jump) % hash->length;
- } while (theIndex != startIndex);
+/* Used by UnicodeString to compute its hashcode - Not public API. */
+U_CAPI int32_t U_EXPORT2
+uhash_hashUCharsN(const UChar *str, int32_t length) {
+ STRING_HASH(UChar, str, length, *p);
+}
- if (firstDeleted >= 0) {
- theIndex = firstDeleted; /* reset if had deleted slot */
- } else if (tableHash != HASH_EMPTY) {
- /* We get to this point if the hashtable is full (no empty or
- * deleted slots), and we've failed to find a match. THIS
- * WILL NEVER HAPPEN as long as uhash_put() makes sure that
- * count is always < length.
- */
- U_ASSERT(FALSE);
- return NULL; /* Never happens if uhash_put() behaves */
- }
- return &(hash->elements[theIndex]);
+U_CAPI int32_t U_EXPORT2
+uhash_hashChars(const UHashTok key) {
+ STRING_HASH(uint8_t, key.pointer, uprv_strlen((char*)p), *p);
}
-static UHashTok
-_uhash_put(UHashtable *hash,
- UHashTok key,
- UHashTok value,
- int8_t hint,
- UErrorCode *status) {
+U_CAPI int32_t U_EXPORT2
+uhash_hashIChars(const UHashTok key) {
+ STRING_HASH(uint8_t, key.pointer, uprv_strlen((char*)p), uprv_tolower(*p));
+}
- /* Put finds the position in the table for the new value. If the
- * key is already in the table, it is deleted, if there is a
- * non-NULL keyDeleter. Then the key, the hash and the value are
- * all put at the position in their respective arrays.
- */
- int32_t hashcode;
- UHashElement* e;
- UHashTok emptytok;
+U_CAPI UBool U_EXPORT2
+uhash_equals(const UHashtable* hash1, const UHashtable* hash2){
+
+ int32_t count1, count2, pos, i;
- if (U_FAILURE(*status)) {
- goto err;
+ if(hash1==hash2){
+ return TRUE;
}
- U_ASSERT(hash != NULL);
- /* Cannot always check pointer here or iSeries sees NULL every time. */
- if ((hint & HINT_VALUE_POINTER) && value.pointer == NULL) {
- /* Disallow storage of NULL values, since NULL is returned by
- * get() to indicate an absent key. Storing NULL == removing.
- */
- return _uhash_remove(hash, key);
+
+ if(hash1==NULL || hash2==NULL){
+ return FALSE;
}
- if (hash->count > hash->highWaterMark) {
- _uhash_rehash(hash);
+ /* make sure that we are comparing 2 hashes of the same type */
+ if( hash1->keyComparator != hash2->keyComparator ||
+ hash2->valueComparator != hash2->valueComparator){
+ return FALSE;
}
- hashcode = (*hash->keyHasher)(key);
- e = _uhash_find(hash, key, hashcode);
- U_ASSERT(e != NULL);
-
- if (IS_EMPTY_OR_DELETED(e->hashcode)) {
- /* Important: We must never actually fill the table up. If we
- * do so, then _uhash_find() will return NULL, and we'll have
- * to check for NULL after every call to _uhash_find(). To
- * avoid this we make sure there is always at least one empty
- * or deleted slot in the table. This only is a problem if we
- * are out of memory and rehash isn't working.
+ count1 = uhash_count(hash1);
+ count2 = uhash_count(hash2);
+ if(count1!=count2){
+ return FALSE;
+ }
+
+ pos=-1;
+ for(i=0; ikey;
+ const UHashTok val1 = elem1->value;
+ /* here the keys are not compared, instead the key form hash1 is used to fetch
+ * value from hash2. If the hashes are equal then then both hashes should
+ * contain equal values for the same key!
*/
- ++hash->count;
- if (hash->count == hash->length) {
- /* Don't allow count to reach length */
- --hash->count;
- *status = U_MEMORY_ALLOCATION_ERROR;
- goto err;
+ const UHashElement* elem2 = _uhash_find(hash2, key1, hash2->keyHasher(key1));
+ const UHashTok val2 = elem2->value;
+ if(hash1->valueComparator(val1, val2)==FALSE){
+ return FALSE;
}
}
+ return TRUE;
+}
- /* We must in all cases handle storage properly. If there was an
- * old key, then it must be deleted (if the deleter != NULL).
- * Make hashcodes stored in table positive.
- */
- return _uhash_setElement(hash, e, hashcode & 0x7FFFFFFF, key, value, hint);
+/********************************************************************
+ * PUBLIC Comparator Functions
+ ********************************************************************/
- err:
- /* If the deleters are non-NULL, this method adopts its key and/or
- * value arguments, and we must be sure to delete the key and/or
- * value in all cases, even upon failure.
- */
- HASH_DELETE_KEY_VALUE(hash, key.pointer, value.pointer);
- emptytok.pointer = NULL; emptytok.integer = 0;
- return emptytok;
+U_CAPI UBool U_EXPORT2
+uhash_compareUChars(const UHashTok key1, const UHashTok key2) {
+ const UChar *p1 = (const UChar*) key1.pointer;
+ const UChar *p2 = (const UChar*) key2.pointer;
+ if (p1 == p2) {
+ return TRUE;
+ }
+ if (p1 == NULL || p2 == NULL) {
+ return FALSE;
+ }
+ while (*p1 != 0 && *p1 == *p2) {
+ ++p1;
+ ++p2;
+ }
+ return (UBool)(*p1 == *p2);
}
-static UHashTok
-_uhash_remove(UHashtable *hash,
- UHashTok key) {
- /* First find the position of the key in the table. If the object
- * has not been removed already, remove it. If the user wanted
- * keys deleted, then delete it also. We have to put a special
- * hashcode in that position that means that something has been
- * deleted, since when we do a find, we have to continue PAST any
- * deleted values.
- */
- UHashTok result;
- UHashElement* e = _uhash_find(hash, key, hash->keyHasher(key));
- U_ASSERT(e != NULL);
- result.pointer = NULL; result.integer = 0;
- if (!IS_EMPTY_OR_DELETED(e->hashcode)) {
- result = _uhash_internalRemoveElement(hash, e);
- if (hash->count < hash->lowWaterMark) {
- _uhash_rehash(hash);
- }
+U_CAPI UBool U_EXPORT2
+uhash_compareChars(const UHashTok key1, const UHashTok key2) {
+ const char *p1 = (const char*) key1.pointer;
+ const char *p2 = (const char*) key2.pointer;
+ if (p1 == p2) {
+ return TRUE;
}
- return result;
+ if (p1 == NULL || p2 == NULL) {
+ return FALSE;
+ }
+ while (*p1 != 0 && *p1 == *p2) {
+ ++p1;
+ ++p2;
+ }
+ return (UBool)(*p1 == *p2);
}
-static UHashTok
-_uhash_setElement(UHashtable *hash, UHashElement* e,
- int32_t hashcode,
- UHashTok key, UHashTok value, int8_t hint) {
-
- UHashTok oldValue = e->value;
- if (hash->keyDeleter != NULL && e->key.pointer != NULL &&
- e->key.pointer != key.pointer) { /* Avoid double deletion */
- (*hash->keyDeleter)(e->key.pointer);
- }
- if (hash->valueDeleter != NULL) {
- if (oldValue.pointer != NULL &&
- oldValue.pointer != value.pointer) { /* Avoid double deletion */
- (*hash->valueDeleter)(oldValue.pointer);
- }
- oldValue.pointer = NULL;
+U_CAPI UBool U_EXPORT2
+uhash_compareIChars(const UHashTok key1, const UHashTok key2) {
+ const char *p1 = (const char*) key1.pointer;
+ const char *p2 = (const char*) key2.pointer;
+ if (p1 == p2) {
+ return TRUE;
}
- /* Compilers should copy the UHashTok union correctly, but even if
- * they do, memory heap tools (e.g. BoundsChecker) can get
- * confused when a pointer is cloaked in a union and then copied.
- * TO ALLEVIATE THIS, we use hints (based on what API the user is
- * calling) to copy pointers when we know the user thinks
- * something is a pointer. */
- if (hint & HINT_KEY_POINTER) {
- e->key.pointer = key.pointer;
- } else {
- e->key = key;
+ if (p1 == NULL || p2 == NULL) {
+ return FALSE;
}
- if (hint & HINT_VALUE_POINTER) {
- e->value.pointer = value.pointer;
- } else {
- e->value = value;
+ while (*p1 != 0 && uprv_tolower(*p1) == uprv_tolower(*p2)) {
+ ++p1;
+ ++p2;
}
- e->hashcode = hashcode;
- return oldValue;
+ return (UBool)(*p1 == *p2);
}
-/**
- * Assumes that the given element is not empty or deleted.
- */
-static UHashTok
-_uhash_internalRemoveElement(UHashtable *hash, UHashElement* e) {
- UHashTok empty;
- U_ASSERT(!IS_EMPTY_OR_DELETED(e->hashcode));
- --hash->count;
- empty.pointer = NULL; empty.integer = 0;
- return _uhash_setElement(hash, e, HASH_DELETED, empty, empty, 0);
+/********************************************************************
+ * PUBLIC int32_t Support Functions
+ ********************************************************************/
+
+U_CAPI int32_t U_EXPORT2
+uhash_hashLong(const UHashTok key) {
+ return key.integer;
}
-static void
-_uhash_internalSetResizePolicy(UHashtable *hash, enum UHashResizePolicy policy) {
- U_ASSERT(hash != NULL);
- U_ASSERT(((int32_t)policy) >= 0);
- U_ASSERT(((int32_t)policy) < 3);
- hash->lowWaterRatio = RESIZE_POLICY_RATIO_TABLE[policy * 2];
- hash->highWaterRatio = RESIZE_POLICY_RATIO_TABLE[policy * 2 + 1];
+U_CAPI UBool U_EXPORT2
+uhash_compareLong(const UHashTok key1, const UHashTok key2) {
+ return (UBool)(key1.integer == key2.integer);
+}
+
+/********************************************************************
+ * PUBLIC Deleter Functions
+ ********************************************************************/
+
+U_CAPI void U_EXPORT2
+uhash_freeBlock(void *obj) {
+ uprv_free(obj);
}
+
diff --git a/icuSources/common/uhash.h b/icuSources/common/uhash.h
index e1b6b806..b5f3a67d 100644
--- a/icuSources/common/uhash.h
+++ b/icuSources/common/uhash.h
@@ -1,6 +1,6 @@
/*
******************************************************************************
-* Copyright (C) 1997-2004, International Business Machines
+* Copyright (C) 1997-2006, International Business Machines
* Corporation and others. All Rights Reserved.
******************************************************************************
* Date Name Description
@@ -117,7 +117,14 @@ typedef int32_t U_CALLCONV UHashFunction(const UHashTok key);
*/
typedef UBool U_CALLCONV UKeyComparator(const UHashTok key1,
const UHashTok key2);
-
+/**
+ * A key comparison function.
+ * @param val1 A key stored in a hashtable
+ * @param val2 A key stored in a hashtable
+ * @return TRUE if the two keys are equal.
+ */
+typedef UBool U_CALLCONV UValueComparator(const UHashTok val1,
+ const UHashTok val2);
/**
* A function called by uhash_remove,
* uhash_close, or uhash_put to delete
@@ -146,6 +153,19 @@ struct UHashtable {
UHashElement *elements;
+ /* Function pointers */
+
+ UHashFunction *keyHasher; /* Computes hash from key.
+ * Never null. */
+ UKeyComparator *keyComparator; /* Compares keys for equality.
+ * Never null. */
+ UValueComparator *valueComparator; /* Compares the values for equality */
+
+ UObjectDeleter *keyDeleter; /* Deletes keys when required.
+ * If NULL won't do anything */
+ UObjectDeleter *valueDeleter; /* Deletes values when required.
+ * If NULL won't do anything */
+
/* Size parameters */
int32_t count; /* The number of key-value pairs in this table.
@@ -163,16 +183,7 @@ struct UHashtable {
float highWaterRatio; /* 0..1; high water as a fraction of length */
float lowWaterRatio; /* 0..1; low water as a fraction of length */
- /* Function pointers */
-
- UHashFunction *keyHasher; /* Computes hash from key.
- * Never null. */
- UKeyComparator *keyComparator; /* Compares keys for equality.
- * Never null. */
- UObjectDeleter *keyDeleter; /* Deletes keys when required.
- * If NULL won't do anything */
- UObjectDeleter *valueDeleter; /* Deletes values when required.
- * If NULL won't do anything */
+ UBool allocated; /* Was this UHashtable allocated? */
};
typedef struct UHashtable UHashtable;
@@ -195,6 +206,7 @@ U_CDECL_END
U_CAPI UHashtable* U_EXPORT2
uhash_open(UHashFunction *keyHash,
UKeyComparator *keyComp,
+ UValueComparator *valueComp,
UErrorCode *status);
/**
@@ -211,9 +223,27 @@ uhash_open(UHashFunction *keyHash,
U_CAPI UHashtable* U_EXPORT2
uhash_openSize(UHashFunction *keyHash,
UKeyComparator *keyComp,
+ UValueComparator *valueComp,
int32_t size,
UErrorCode *status);
+/**
+ * Initialize an existing UHashtable.
+ * @param keyHash A pointer to the key hashing function. Must not be
+ * NULL.
+ * @param keyComp A pointer to the function that compares keys. Must
+ * not be NULL.
+ * @param status A pointer to an UErrorCode to receive any errors.
+ * @return A pointer to a UHashtable, or 0 if an error occurred.
+ * @see uhash_openSize
+ */
+U_CAPI UHashtable* U_EXPORT2
+uhash_init(UHashtable *hash,
+ UHashFunction *keyHash,
+ UKeyComparator *keyComp,
+ UValueComparator *valueComp,
+ UErrorCode *status);
+
/**
* Close a UHashtable, releasing the memory used.
* @param hash The UHashtable to close.
@@ -242,6 +272,16 @@ uhash_setKeyHasher(UHashtable *hash, UHashFunction *fn);
U_CAPI UKeyComparator *U_EXPORT2
uhash_setKeyComparator(UHashtable *hash, UKeyComparator *fn);
+/**
+ * Set the function used to compare values. The default comparison is a
+ * void* pointer comparison.
+ * @param hash The UHashtable to set
+ * @param fn the function to be used compare keys; must not be NULL
+ * @return the previous key comparator; non-NULL
+ */
+U_CAPI UValueComparator *U_EXPORT2
+uhash_setValueComparator(UHashtable *hash, UValueComparator *fn);
+
/**
* Set the function used to delete keys. If this function pointer is
* NULL, this hashtable does not delete keys. If it is non-NULL, this
@@ -503,16 +543,16 @@ uhash_removeElement(UHashtable *hash, const UHashElement* e);
* @param i The given integer
* @return a UHashTok for an integer.
*/
-U_CAPI UHashTok U_EXPORT2
-uhash_toki(int32_t i);
+/*U_CAPI UHashTok U_EXPORT2
+uhash_toki(int32_t i);*/
/**
* Return a UHashTok for a pointer.
* @param p The given pointer
* @return a UHashTok for a pointer.
*/
-U_CAPI UHashTok U_EXPORT2
-uhash_tokp(void* p);
+/*U_CAPI UHashTok U_EXPORT2
+uhash_tokp(void* p);*/
/********************************************************************
* UChar* and char* Support Functions
@@ -676,4 +716,13 @@ uhash_deleteUVector(void *obj);
U_CAPI void U_EXPORT2
uhash_freeBlock(void *obj);
+/**
+ * Checks if the given hash tables are equal or not.
+ * @param hash1
+ * @param hash2
+ * @return true if the hashtables are equal and false if not.
+ */
+U_CAPI UBool U_EXPORT2
+uhash_equals(const UHashtable* hash1, const UHashtable* hash2);
+
#endif
diff --git a/icuSources/common/uhash_us.cpp b/icuSources/common/uhash_us.cpp
index 3e12ffd0..0c6a3178 100644
--- a/icuSources/common/uhash_us.cpp
+++ b/icuSources/common/uhash_us.cpp
@@ -1,6 +1,6 @@
/*
******************************************************************************
-* Copyright (C) 1997-2001, International Business Machines
+* Copyright (C) 1997-2004, International Business Machines
* Corporation and others. All Rights Reserved.
******************************************************************************
* Date Name Description
@@ -27,19 +27,6 @@ uhash_hashUnicodeString(const UHashTok key) {
return (str == NULL) ? 0 : str->hashCode();
}
-U_CAPI int32_t U_EXPORT2
-uhash_hashCaselessUnicodeString(const UHashTok key) {
- U_NAMESPACE_USE
- const UnicodeString *str = (const UnicodeString*) key.pointer;
- if (str == NULL) {
- return 0;
- }
- // Inefficient; a better way would be to have a hash function in
- // UnicodeString that does case folding on the fly.
- UnicodeString copy(*str);
- return copy.foldCase().hashCode();
-}
-
U_CAPI void U_EXPORT2
uhash_deleteUnicodeString(void *obj) {
U_NAMESPACE_USE
@@ -60,20 +47,6 @@ uhash_compareUnicodeString(const UHashTok key1, const UHashTok key2) {
return *str1 == *str2;
}
-U_CAPI UBool U_EXPORT2
-uhash_compareCaselessUnicodeString(const UHashTok key1, const UHashTok key2) {
- U_NAMESPACE_USE
- const UnicodeString *str1 = (const UnicodeString*) key1.pointer;
- const UnicodeString *str2 = (const UnicodeString*) key2.pointer;
- if (str1 == str2) {
- return TRUE;
- }
- if (str1 == NULL || str2 == NULL) {
- return FALSE;
- }
- return str1->caseCompare(*str2, U_FOLD_CASE_DEFAULT) == 0;
-}
-
/**
* Deleter for Hashtable objects.
*/
diff --git a/icuSources/common/uidna.cpp b/icuSources/common/uidna.cpp
index 4fdb5521..5b030a0f 100644
--- a/icuSources/common/uidna.cpp
+++ b/icuSources/common/uidna.cpp
@@ -1,7 +1,7 @@
/*
*******************************************************************************
*
- * Copyright (C) 2003-2004, International Business Machines
+ * Copyright (C) 2003-2007, International Business Machines
* Corporation and others. All Rights Reserved.
*
*******************************************************************************
@@ -66,12 +66,6 @@ startsWithPrefix(const UChar* src , int32_t srcLength){
return startsWithPrefix;
}
-inline static void
-toASCIILower(UChar* src, int32_t srcLen){
- for(int32_t i=0; i b1Capacity){
+ b1 = (UChar*) uprv_malloc(srcLength * U_SIZEOF_UCHAR);
if(b1==NULL){
*status = U_MEMORY_ALLOCATION_ERROR;
goto CLEANUP;
}
+ b1Capacity = srcLength;
+ }
- *status = U_ZERO_ERROR; // reset error
+ // step 1
+ for( j=0;j 0x7F){
+ srcIsASCII = FALSE;
+ }
+ b1[b1Len++] = src[j];
+ }
+
+ // step 2 is performed only if the source contains non ASCII
+ if(srcIsASCII == FALSE){
- b1Len = usprep_prepare(nameprep, src, srcLength, b1, b1Len, namePrepOptions, parseError, status);
+ // step 2
+ b1Len = usprep_prepare(nameprep, src, srcLength, b1, b1Capacity, namePrepOptions, parseError, status);
+
+ if(*status == U_BUFFER_OVERFLOW_ERROR){
+ // redo processing of string
+ // we do not have enough room so grow the buffer
+ if(b1 != b1Stack){
+ uprv_free(b1);
+ }
+ b1 = (UChar*) uprv_malloc(b1Len * U_SIZEOF_UCHAR);
+ if(b1==NULL){
+ *status = U_MEMORY_ALLOCATION_ERROR;
+ goto CLEANUP;
+ }
+
+ *status = U_ZERO_ERROR; // reset error
+
+ b1Len = usprep_prepare(nameprep, src, srcLength, b1, b1Len, namePrepOptions, parseError, status);
+ }
}
// error bail out
if(U_FAILURE(*status)){
goto CLEANUP;
}
+ if(b1Len == 0){
+ *status = U_IDNA_ZERO_LENGTH_LABEL_ERROR;
+ goto CLEANUP;
+ }
- // step 3 & 4
+ // for step 3 & 4
+ srcIsASCII = TRUE;
for( j=0;j 0x7F){
srcIsASCII = FALSE;
}else if(isLDHChar(b1[j])==FALSE){ // if the char is in ASCII range verify that it is an LDH character
@@ -255,7 +283,6 @@ _internal_toASCII(const UChar* src, int32_t srcLength,
failPos = j;
}
}
-
if(useSTD3ASCIIRules == TRUE){
// verify 3a and 3b
// 3(a) Verify the absence of non-LDH ASCII code points; that is, the
@@ -282,6 +309,7 @@ _internal_toASCII(const UChar* src, int32_t srcLength,
goto CLEANUP;
}
}
+ // Step 4: if the source is ASCII then proceed to step 8
if(srcIsASCII){
if(b1Len <= destCapacity){
uprv_memmove(dest, b1, b1Len * U_SIZEOF_UCHAR);
@@ -341,7 +369,7 @@ _internal_toASCII(const UChar* src, int32_t srcLength,
goto CLEANUP;
}
}
-
+ // step 8: verify the length of lable
if(reqLength > MAX_LABEL_LENGTH){
*status = U_IDNA_LABEL_TOO_LONG_ERROR;
}
@@ -447,7 +475,7 @@ _internal_toUnicode(const UChar* src, int32_t srcLength,
//step 3: verify ACE Prefix
if(startsWithPrefix(src,srcLength)){
-
+
//step 4: Remove the ACE Prefix
b1Prime = b1 + ACE_PREFIX_LENGTH;
b1PrimeLen = b1Len - ACE_PREFIX_LENGTH;
@@ -470,10 +498,9 @@ _internal_toUnicode(const UChar* src, int32_t srcLength,
}
-
//step 6:Apply toASCII
b3Len = uidna_toASCII(b2, b2Len, b3, b3Capacity,options,parseError, status);
-
+
if(*status == U_BUFFER_OVERFLOW_ERROR){
// redo processing of string
/* we do not have enough room so grow the buffer*/
@@ -488,6 +515,7 @@ _internal_toUnicode(const UChar* src, int32_t srcLength,
b3Len = uidna_toASCII(b2,b2Len,b3,b3Len,options,parseError, status);
}
+
//bail out on error
if(U_FAILURE(*status)){
goto CLEANUP;
@@ -659,16 +687,19 @@ uidna_IDNToASCII( const UChar *src, int32_t srcLength,
for(;;){
labelLen = getNextSeparator(labelStart,remainingLen, &delimiter,&done);
+ labelReqLength = 0;
+ if(!(labelLen==0 && done)){// make sure this is not a root label separator.
- labelReqLength = _internal_toASCII( labelStart, labelLen,
- currentDest, remainingDestCapacity,
- options, nameprep,
- parseError, status);
-
- if(*status == U_BUFFER_OVERFLOW_ERROR){
-
- *status = U_ZERO_ERROR; // reset error
- remainingDestCapacity = 0;
+ labelReqLength = _internal_toASCII( labelStart, labelLen,
+ currentDest, remainingDestCapacity,
+ options, nameprep,
+ parseError, status);
+
+ if(*status == U_BUFFER_OVERFLOW_ERROR){
+
+ *status = U_ZERO_ERROR; // reset error
+ remainingDestCapacity = 0;
+ }
}
@@ -698,7 +729,7 @@ uidna_IDNToASCII( const UChar *src, int32_t srcLength,
labelStart = delimiter;
if(remainingLen >0 ){
- remainingLen = srcLength - (delimiter - src);
+ remainingLen = (int32_t)(srcLength - (delimiter - src));
}
}
@@ -745,6 +776,9 @@ uidna_IDNToUnicode( const UChar* src, int32_t srcLength,
labelLen = getNextSeparator(labelStart,remainingLen, &delimiter,&done);
+ if(labelLen==0 && done==FALSE){
+ *status = U_IDNA_ZERO_LENGTH_LABEL_ERROR;
+ }
labelReqLength = _internal_toUnicode(labelStart, labelLen,
currentDest, remainingDestCapacity,
options, nameprep,
@@ -784,7 +818,7 @@ uidna_IDNToUnicode( const UChar* src, int32_t srcLength,
labelStart = delimiter;
if(remainingLen >0 ){
- remainingLen = srcLength - (delimiter - src);
+ remainingLen = (int32_t)(srcLength - (delimiter - src));
}
}
diff --git a/icuSources/common/uinit.c b/icuSources/common/uinit.c
index 1f8fc089..a70e51d0 100644
--- a/icuSources/common/uinit.c
+++ b/icuSources/common/uinit.c
@@ -1,7 +1,7 @@
/*
******************************************************************************
* *
-* Copyright (C) 2001-2004, International Business Machines *
+* Copyright (C) 2001-2006, International Business Machines *
* Corporation and others. All Rights Reserved. *
* *
******************************************************************************
@@ -20,6 +20,7 @@
#include "ustr_imp.h"
#include "unormimp.h"
#include "ucln_cmn.h"
+#include "ucnv_io.h"
#include "umutex.h"
#include "ucln.h"
#include "cmemory.h"
@@ -29,19 +30,6 @@ static UBool gICUInitialized = FALSE;
static UMTX gICUInitMutex = NULL;
-static cleanupFunc *gLibCleanupFunctions[UCLN_COMMON];
-
-U_CAPI void U_EXPORT2
-ucln_registerCleanup(ECleanupLibraryType type,
- cleanupFunc *func)
-{
- U_ASSERT(UCLN_START < type && type < UCLN_COMMON);
- if (UCLN_START < type && type < UCLN_COMMON)
- {
- gLibCleanupFunctions[type] = func;
- }
-}
-
/************************************************
The cleanup order is important in this function.
Please be sure that you have read ucln.h
@@ -49,28 +37,20 @@ ucln_registerCleanup(ECleanupLibraryType type,
U_CAPI void U_EXPORT2
u_cleanup(void)
{
- ECleanupLibraryType libType;
-
UTRACE_ENTRY_OC(UTRACE_U_CLEANUP);
umtx_lock(NULL); /* Force a memory barrier, so that we are sure to see */
umtx_unlock(NULL); /* all state left around by any other threads. */
- for (libType = UCLN_START+1; libType0) {
c=(uint8_t)(*cs++);
-#if U_CHARSET_FAMILY==U_ASCII_FAMILY
- u=(UChar)c;
-#elif U_CHARSET_FAMILY==U_EBCDIC_FAMILY
- u=(UChar)asciiFromEbcdic[c];
-#else
-# error U_CHARSET_FAMILY is not valid
-#endif
- if(u==0 && c!=0) {
- onlyInvariantChars=FALSE;
- }
+ u=(UChar)CHAR_TO_UCHAR(c);
+ U_ASSERT((u!=0 || c==0)); /* only invariant chars converted? */
*us++=u;
--length;
}
- U_ASSERT(onlyInvariantChars); /* only invariant chars? */
}
U_CAPI void U_EXPORT2
u_UCharsToChars(const UChar *us, char *cs, int32_t length) {
UChar u;
- UBool onlyInvariantChars;
- onlyInvariantChars=TRUE;
while(length>0) {
u=*us++;
if(!UCHAR_IS_INVARIANT(u)) {
- onlyInvariantChars=FALSE;
+ U_ASSERT(FALSE); /* Variant characters were used. These are not portable in ICU. */
u=0;
}
-#if U_CHARSET_FAMILY==U_ASCII_FAMILY
- *cs++=(char)u;
-#elif U_CHARSET_FAMILY==U_EBCDIC_FAMILY
- *cs++=(char)ebcdicFromAscii[u];
-#else
-# error U_CHARSET_FAMILY is not valid
-#endif
+ *cs++=(char)UCHAR_TO_CHAR(u);
--length;
}
- U_ASSERT(onlyInvariantChars); /* only invariant chars? */
}
U_CAPI UBool U_EXPORT2
@@ -232,7 +223,7 @@ uprv_isInvariantString(const char *s, int32_t length) {
return FALSE; /* found a variant char */
}
#elif U_CHARSET_FAMILY==U_EBCDIC_FAMILY
- c=asciiFromEbcdic[c];
+ c=CHAR_TO_UCHAR(c);
if(c==0 || !UCHAR_IS_INVARIANT(c)) {
return FALSE; /* found a variant char */
}
@@ -277,7 +268,7 @@ uprv_isInvariantUString(const UChar *s, int32_t length) {
/* UDataSwapFn implementations used in udataswp.c ------- */
/* convert ASCII to EBCDIC and verify that all characters are invariant */
-U_CFUNC int32_t
+U_CAPI int32_t U_EXPORT2
uprv_ebcdicFromAscii(const UDataSwapper *ds,
const void *inData, int32_t length, void *outData,
UErrorCode *pErrorCode) {
diff --git a/icuSources/common/uiter.cpp b/icuSources/common/uiter.cpp
index 6ca97508..bfe92c6c 100644
--- a/icuSources/common/uiter.cpp
+++ b/icuSources/common/uiter.cpp
@@ -1,7 +1,7 @@
/*
*******************************************************************************
*
-* Copyright (C) 2002-2004, International Business Machines
+* Copyright (C) 2002-2006, International Business Machines
* Corporation and others. All Rights Reserved.
*
*******************************************************************************
@@ -50,11 +50,12 @@ noopCurrent(UCharIterator * /*iter*/) {
static uint32_t U_CALLCONV
noopGetState(const UCharIterator * /*iter*/) {
- return 0;
+ return UITER_NO_STATE;
}
static void U_CALLCONV
-noopSetState(UCharIterator * /*iter*/, uint32_t /*state*/, UErrorCode * /*pErrorCode*/) {
+noopSetState(UCharIterator * /*iter*/, uint32_t /*state*/, UErrorCode *pErrorCode) {
+ *pErrorCode=U_UNSUPPORTED_ERROR;
}
static const UCharIterator noopIterator={
diff --git a/icuSources/common/uloc.c b/icuSources/common/uloc.c
index ddb1b206..a11193cb 100644
--- a/icuSources/common/uloc.c
+++ b/icuSources/common/uloc.c
@@ -1,6 +1,6 @@
/*
**********************************************************************
-* Copyright (C) 1997-2004, International Business Machines
+* Copyright (C) 1997-2007, International Business Machines
* Corporation and others. All Rights Reserved.
**********************************************************************
*
@@ -31,6 +31,7 @@
#include "unicode/utypes.h"
#include "unicode/ustring.h"
#include "unicode/uloc.h"
+#include "unicode/ures.h"
#include "putilimp.h"
#include "ustr_imp.h"
@@ -113,32 +114,34 @@ static int32_t _installedLocalesCount = 0;
*/
static const char * const LANGUAGES[] = {
"aa", "ab", "ace", "ach", "ada", "ady", "ae", "af", "afa",
- "afh", "ak", "akk", "ale", "alg", "am", "an", "ang", "apa",
+ "afh", "ain", "ak", "akk", "ale", "alg", "alt", "am", "an",
+ "ang", "anp", "apa",
"ar", "arc", "arn", "arp", "art", "arw", "as", "ast",
"ath", "aus", "av", "awa", "ay", "az", "ba", "bad",
"bai", "bal", "ban", "bas", "bat", "be", "bej",
"bem", "ber", "bg", "bh", "bho", "bi", "bik", "bin",
"bla", "bm", "bn", "bnt", "bo", "br", "bra", "bs",
"btk", "bua", "bug", "byn", "ca", "cad", "cai", "car", "cau",
- "ce", "ceb", "cel", "ch", "chb", "chg", "chk", "chm",
+ "cch", "ce", "ceb", "cel", "ch", "chb", "chg", "chk", "chm",
"chn", "cho", "chp", "chr", "chy", "cmc", "co", "cop",
"cpe", "cpf", "cpp", "cr", "crh", "crp", "cs", "csb", "cu", "cus",
"cv", "cy", "da", "dak", "dar", "day", "de", "del", "den",
"dgr", "din", "doi", "dra", "dsb", "dua", "dum", "dv", "dyu",
"dz", "ee", "efi", "egy", "eka", "el", "elx", "en",
"enm", "eo", "es", "et", "eu", "ewo", "fa",
- "fan", "fat", "ff", "fi", "fiu", "fj", "fo", "fon",
- "fr", "frm", "fro", "fur", "fy", "ga", "gaa", "gay",
- "gba", "gd", "gem", "gez", "gil", "gl", "gmh", "gn",
- "goh", "gon", "gor", "got", "grb", "grc", "gu", "gv",
- "gwi", "ha", "hai", "haw", "he", "hi", "hil", "him",
+ "fan", "fat", "ff", "fi", "fil", "fiu", "fj", "fo", "fon",
+ "fr", "frm", "fro", "frr", "frs", "fur", "fy",
+ "ga", "gaa", "gay", "gba", "gd", "gem", "gez", "gil",
+ "gl", "gmh", "gn", "goh", "gon", "gor", "got", "grb",
+ "grc", "gsw", "gu", "gv", "gwi",
+ "ha", "hai", "haw", "he", "hi", "hil", "him",
"hit", "hmn", "ho", "hr", "hsb", "ht", "hu", "hup", "hy", "hz",
"ia", "iba", "id", "ie", "ig", "ii", "ijo", "ik",
"ilo", "inc", "ine", "inh", "io", "ira", "iro", "is", "it",
"iu", "ja", "jbo", "jpr", "jrb", "jv", "ka", "kaa", "kab",
- "kac", "kam", "kar", "kaw", "kbd", "kg", "kha", "khi",
+ "kac", "kaj", "kam", "kar", "kaw", "kbd", "kcg", "kfo", "kg", "kha", "khi",
"kho", "ki", "kj", "kk", "kl", "km", "kmb", "kn",
- "ko", "kok", "kos", "kpe", "kr", "krc", "kro", "kru", "ks",
+ "ko", "kok", "kos", "kpe", "kr", "krc", "krl", "kro", "kru", "ks",
"ku", "kum", "kut", "kv", "kw", "ky", "la", "lad",
"lah", "lam", "lb", "lez", "lg", "li", "ln", "lo", "lol",
"loz", "lt", "lu", "lua", "lui", "lun", "luo", "lus",
@@ -146,7 +149,7 @@ static const char * const LANGUAGES[] = {
"mdf", "mdr", "men", "mg", "mga", "mh", "mi", "mic", "min",
"mis", "mk", "mkh", "ml", "mn", "mnc", "mni", "mno",
"mo", "moh", "mos", "mr", "ms", "mt", "mul", "mun",
- "mus", "mwr", "my", "myn", "myv", "na", "nah", "nai", "nap",
+ "mus", "mwl", "mwr", "my", "myn", "myv", "na", "nah", "nai", "nap",
"nb", "nd", "nds", "ne", "new", "ng", "nia", "nic",
"niu", "nl", "nn", "no", "nog", "non", "nr", "nso", "nub",
"nv", "nwc", "ny", "nym", "nyn", "nyo", "nzi", "oc", "oj",
@@ -154,12 +157,12 @@ static const char * const LANGUAGES[] = {
"pag", "pal", "pam", "pap", "pau", "peo", "phi", "phn",
"pi", "pl", "pon", "pra", "pro", "ps", "pt", "qu",
"raj", "rap", "rar", "rm", "rn", "ro", "roa", "rom",
- "ru", "rw", "sa", "sad", "sah", "sai", "sal", "sam",
- "sas", "sat", "sc", "sco", "sd", "se", "sel", "sem",
+ "ru", "rup", "rw", "sa", "sad", "sah", "sai", "sal", "sam",
+ "sas", "sat", "sc", "scn", "sco", "sd", "se", "sel", "sem",
"sg", "sga", "sgn", "shn", "si", "sid", "sio", "sit",
"sk", "sl", "sla", "sm", "sma", "smi", "smj", "smn",
"sms", "sn", "snk", "so", "sog", "son", "sq", "sr",
- "srr", "ss", "ssa", "st", "su", "suk", "sus", "sux",
+ "srn", "srr", "ss", "ssa", "st", "su", "suk", "sus", "sux",
"sv", "sw", "syr", "ta", "tai", "te", "tem", "ter",
"tet", "tg", "th", "ti", "tig", "tiv", "tk", "tkl",
"tl", "tlh", "tli", "tmh", "tn", "to", "tog", "tpi", "tr",
@@ -168,11 +171,17 @@ static const char * const LANGUAGES[] = {
"uz", "vai", "ve", "vi", "vo", "vot", "wa", "wak",
"wal", "war", "was", "wen", "wo", "xal", "xh", "yao", "yap",
"yi", "yo", "ypk", "za", "zap", "zen", "zh", "znd",
- "zu", "zun",
+ "zu", "zun", "zxx",
NULL,
"in", "iw", "ji", "jw", "sh", /* obsolete language codes */
NULL
};
+static const char* const DEPRECATED_LANGUAGES[]={
+ "in", "iw", "ji", "jw", NULL, NULL
+};
+static const char* const REPLACEMENT_LANGUAGES[]={
+ "id", "he", "yi", "jv", NULL, NULL
+};
/**
* Table of 3-letter language codes.
@@ -193,8 +202,8 @@ NULL
static const char * const LANGUAGES_3[] = {
/* "aa", "ab", "ace", "ach", "ada", "ady", "ae", "af", "afa", */
"aar", "abk", "ace", "ach", "ada", "ady", "ave", "afr", "afa",
-/* "afh", "ak", "akk", "ale", "alg", "am", "an", "ang", "apa", */
- "afh", "aka", "akk", "ale", "alg", "amh", "arg", "ang", "apa",
+/* "afh", "ain", "ak", "akk", "ale", "alg", "alt", "am", "an", "ang", "anp", "apa", */
+ "afh", "ain", "aka", "akk", "ale", "alg", "alt", "amh", "arg", "ang", "anp", "apa",
/* "ar", "arc", "arn", "arp", "art", "arw", "as", "ast", */
"ara", "arc", "arn", "arp", "art", "arw", "asm", "ast",
/* "ath", "aus", "av", "awa", "ay", "az", "ba", "bad", */
@@ -207,8 +216,8 @@ static const char * const LANGUAGES_3[] = {
"bla", "bam", "ben", "bnt", "bod", "bre", "bra", "bos",
/* "btk", "bua", "bug", "byn", "ca", "cad", "cai", "car", "cau", */
"btk", "bua", "bug", "byn", "cat", "cad", "cai", "car", "cau",
-/* "ce", "ceb", "cel", "ch", "chb", "chg", "chk", "chm", */
- "che", "ceb", "cel", "cha", "chb", "chg", "chk", "chm",
+/* "cch", "ce", "ceb", "cel", "ch", "chb", "chg", "chk", "chm", */
+ "cch", "che", "ceb", "cel", "cha", "chb", "chg", "chk", "chm",
/* "chn", "cho", "chp", "chr", "chy", "cmc", "co", "cop", */
"chn", "cho", "chp", "chr", "chy", "cmc", "cos", "cop",
/* "cpe", "cpf", "cpp", "cr", "crh", "crp", "cs", "csb", "cu", "cus", */
@@ -221,14 +230,14 @@ static const char * const LANGUAGES_3[] = {
"dzo", "ewe", "efi", "egy", "eka", "ell", "elx", "eng",
/* "enm", "eo", "es", "et", "eu", "ewo", "fa", */
"enm", "epo", "spa", "est", "eus", "ewo", "fas",
-/* "fan", "fat", "ff", "fi", "fiu", "fj", "fo", "fon", */
- "fan", "fat", "ful", "fin", "fiu", "fij", "fao", "fon",
-/* "fr", "frm", "fro", "fur", "fy", "ga", "gaa", "gay", */
- "fra", "frm", "fro", "fur", "fry", "gle", "gaa", "gay",
+/* "fan", "fat", "ff", "fi", "fil", "fiu", "fj", "fo", "fon", */
+ "fan", "fat", "ful", "fin", "fil", "fiu", "fij", "fao", "fon",
+/* "fr", "frm", "fro", "fur", "frr", "frs", "fy", "ga", "gaa", "gay", */
+ "fra", "frm", "fro", "fur", "frr", "frs", "fry", "gle", "gaa", "gay",
/* "gba", "gd", "gem", "gez", "gil", "gl", "gmh", "gn", */
"gba", "gla", "gem", "gez", "gil", "glg", "gmh", "grn",
-/* "goh", "gon", "gor", "got", "grb", "grc", "gu", "gv", */
- "goh", "gon", "gor", "got", "grb", "grc", "guj", "glv",
+/* "goh", "gon", "gor", "got", "grb", "grc", "gsw", "gu", "gv", */
+ "goh", "gon", "gor", "got", "grb", "grc", "gsw", "guj", "glv",
/* "gwi", "ha", "hai", "haw", "he", "hi", "hil", "him", */
"gwi", "hau", "hai", "haw", "heb", "hin", "hil", "him",
/* "hit", "hmn", "ho", "hr", "hsb", "ht", "hu", "hup", "hy", "hz", */
@@ -239,12 +248,12 @@ static const char * const LANGUAGES_3[] = {
"ilo", "inc", "ine", "inh", "ido", "ira", "iro", "isl", "ita",
/* "iu", "ja", "jbo", "jpr", "jrb", "jv", "ka", "kaa", "kab", */
"iku", "jpn", "jbo", "jpr", "jrb", "jav", "kat", "kaa", "kab",
-/* "kac", "kam", "kar", "kaw", "kbd", "kg", "kha", "khi", */
- "kac", "kam", "kar", "kaw", "kbd", "kon", "kha", "khi",
+/* "kac", "kaj", "kam", "kar", "kaw", "kbd", "kcg", "kfo", "kg", "kha", "khi",*/
+ "kac", "kaj", "kam", "kar", "kaw", "kbd", "kcg", "kfo", "kg", "kha", "khi",
/* "kho", "ki", "kj", "kk", "kl", "km", "kmb", "kn", */
"kho", "kik", "kua", "kaz", "kal", "khm", "kmb", "kan",
-/* "ko", "kok", "kos", "kpe", "kr", "krc", "kro", "kru", "ks", */
- "kor", "kok", "kos", "kpe", "kau", "krc", "kro", "kru", "kas",
+/* "ko", "kok", "kos", "kpe", "kr", "krc", "krl", "kro", "kru", "ks", */
+ "kor", "kok", "kos", "kpe", "kau", "krc", "krl", "kro", "kru", "kas",
/* "ku", "kum", "kut", "kv", "kw", "ky", "la", "lad", */
"kur", "kum", "kut", "kom", "cor", "kir", "lat", "lad",
/* "lah", "lam", "lb", "lez", "lg", "li", "ln", "lo", "lol", */
@@ -259,8 +268,8 @@ static const char * const LANGUAGES_3[] = {
"mis", "mkd", "mkh", "mal", "mon", "mnc", "mni", "mno",
/* "mo", "moh", "mos", "mr", "ms", "mt", "mul", "mun", */
"mol", "moh", "mos", "mar", "msa", "mlt", "mul", "mun",
-/* "mus", "mwr", "my", "myn", "myv", "na", "nah", "nai", "nap", */
- "mus", "mwr", "mya", "myn", "myv", "nau", "nah", "nai", "nap",
+/* "mus", "mwl", "mwr", "my", "myn", "myv", "na", "nah", "nai", "nap", */
+ "mus", "mwl", "mwr", "mya", "myn", "myv", "nau", "nah", "nai", "nap",
/* "nb", "nd", "nds", "ne", "new", "ng", "nia", "nic", */
"nob", "nde", "nds", "nep", "new", "ndo", "nia", "nic",
/* "niu", "nl", "nn", "no", "nog", "non", "nr", "nso", "nub", */
@@ -275,18 +284,18 @@ static const char * const LANGUAGES_3[] = {
"pli", "pol", "pon", "pra", "pro", "pus", "por", "que",
/* "raj", "rap", "rar", "rm", "rn", "ro", "roa", "rom", */
"raj", "rap", "rar", "roh", "run", "ron", "roa", "rom",
-/* "ru", "rw", "sa", "sad", "sah", "sai", "sal", "sam", */
- "rus", "kin", "san", "sad", "sah", "sai", "sal", "sam",
-/* "sas", "sat", "sc", "sco", "sd", "se", "sel", "sem", */
- "sas", "sat", "srd", "sco", "snd", "sme", "sel", "sem",
+/* "ru", "rup", "rw", "sa", "sad", "sah", "sai", "sal", "sam", */
+ "rus", "rup", "kin", "san", "sad", "sah", "sai", "sal", "sam",
+/* "sas", "sat", "sc", "scn", "sco", "sd", "se", "sel", "sem", */
+ "sas", "sat", "srd", "scn", "sco", "snd", "sme", "sel", "sem",
/* "sg", "sga", "sgn", "shn", "si", "sid", "sio", "sit", */
"sag", "sga", "sgn", "shn", "sin", "sid", "sio", "sit",
/* "sk", "sl", "sla", "sm", "sma", "smi", "smj", "smn", */
"slk", "slv", "sla", "smo", "sma", "smi", "smj", "smn",
/* "sms", "sn", "snk", "so", "sog", "son", "sq", "sr", */
"sms", "sna", "snk", "som", "sog", "son", "sqi", "srp",
-/* "srr", "ss", "ssa", "st", "su", "suk", "sus", "sux", */
- "srr", "ssw", "ssa", "sot", "sun", "suk", "sus", "sux",
+/* "srn", "srr", "ss", "ssa", "st", "su", "suk", "sus", "sux", */
+ "srn", "srr", "ssw", "ssa", "sot", "sun", "suk", "sus", "sux",
/* "sv", "sw", "syr", "ta", "tai", "te", "tem", "ter", */
"swe", "swa", "syr", "tam", "tai", "tel", "tem", "ter",
/* "tet", "tg", "th", "ti", "tig", "tiv", "tk", "tkl", */
@@ -304,7 +313,7 @@ static const char * const LANGUAGES_3[] = {
/* "yi", "yo", "ypk", "za", "zap", "zen", "zh", "znd", */
"yid", "yor", "ypk", "zha", "zap", "zen", "zho", "znd",
/* "zu", "zun", */
- "zul", "zun",
+ "zul", "zun", "zxx",
NULL,
/* "in", "iw", "ji", "jw", "sh", */
"ind", "heb", "yid", "jaw", "srp",
@@ -337,7 +346,7 @@ NULL
*/
static const char * const COUNTRIES[] = {
"AD", "AE", "AF", "AG", "AI", "AL", "AM", "AN",
- "AO", "AQ", "AR", "AS", "AT", "AU", "AW", "AZ",
+ "AO", "AQ", "AR", "AS", "AT", "AU", "AW", "AX", "AZ",
"BA", "BB", "BD", "BE", "BF", "BG", "BH", "BI",
"BJ", "BM", "BN", "BO", "BR", "BS", "BT", "BV",
"BW", "BY", "BZ", "CA", "CC", "CD", "CF", "CG",
@@ -345,11 +354,11 @@ static const char * const COUNTRIES[] = {
"CU", "CV", "CX", "CY", "CZ", "DE", "DJ", "DK",
"DM", "DO", "DZ", "EC", "EE", "EG", "EH", "ER",
"ES", "ET", "FI", "FJ", "FK", "FM", "FO", "FR",
- "GA", "GB", "GD", "GE", "GF", "GH", "GI", "GL",
+ "GA", "GB", "GD", "GE", "GF", "GG", "GH", "GI", "GL",
"GM", "GN", "GP", "GQ", "GR", "GS", "GT", "GU",
"GW", "GY", "HK", "HM", "HN", "HR", "HT", "HU",
- "ID", "IE", "IL", "IN", "IO", "IQ", "IR", "IS",
- "IT", "JM", "JO", "JP", "KE", "KG", "KH", "KI",
+ "ID", "IE", "IL", "IM", "IN", "IO", "IQ", "IR", "IS",
+ "IT", "JE", "JM", "JO", "JP", "KE", "KG", "KH", "KI",
"KM", "KN", "KP", "KR", "KW", "KY", "KZ", "LA",
"LB", "LC", "LI", "LK", "LR", "LS", "LT", "LU",
"LV", "LY", "MA", "MC", "MD", "MG", "MH", "MK",
@@ -365,12 +374,20 @@ static const char * const COUNTRIES[] = {
"TK", "TL", "TM", "TN", "TO", "TR", "TT", "TV",
"TW", "TZ", "UA", "UG", "UM", "US", "UY", "UZ",
"VA", "VC", "VE", "VG", "VI", "VN", "VU", "WF",
- "WS", "YE", "YT", "YU", "ZA", "ZM", "ZW",
+ "WS", "YE", "YT", "YU", "ZA", "ZM", "ZW", "ZZ",
NULL,
"FX", "RO", "TP", "ZR", /* obsolete country codes */
NULL
};
+static const char* const DEPRECATED_COUNTRIES[] ={
+ "BU", "DY", "FX", "HV", "NH", "RH", "TP", "YU", "ZR", NULL, NULL /* deprecated country list */
+};
+static const char* const REPLACEMENT_COUNTRIES[] = {
+/* "BU", "DY", "FX", "HV", "NH", "RH", "TP", "YU", "ZR" */
+ "MM", "BJ", "FR", "BF", "VU", "ZW", "TL", "CS", "CD", NULL, NULL /* replacement country codes */
+};
+
/**
* Table of 3-letter country codes.
*
@@ -387,8 +404,8 @@ NULL
static const char * const COUNTRIES_3[] = {
/* "AD", "AE", "AF", "AG", "AI", "AL", "AM", "AN", */
"AND", "ARE", "AFG", "ATG", "AIA", "ALB", "ARM", "ANT",
-/* "AO", "AQ", "AR", "AS", "AT", "AU", "AW", "AZ", */
- "AGO", "ATA", "ARG", "ASM", "AUT", "AUS", "ABW", "AZE",
+/* "AO", "AQ", "AR", "AS", "AT", "AU", "AW", "AX", "AZ", */
+ "AGO", "ATA", "ARG", "ASM", "AUT", "AUS", "ABW", "ALA", "AZE",
/* "BA", "BB", "BD", "BE", "BF", "BG", "BH", "BI", */
"BIH", "BRB", "BGD", "BEL", "BFA", "BGR", "BHR", "BDI",
/* "BJ", "BM", "BN", "BO", "BR", "BS", "BT", "BV", */
@@ -403,16 +420,16 @@ static const char * const COUNTRIES_3[] = {
"DMA", "DOM", "DZA", "ECU", "EST", "EGY", "ESH", "ERI",
/* "ES", "ET", "FI", "FJ", "FK", "FM", "FO", "FR", */
"ESP", "ETH", "FIN", "FJI", "FLK", "FSM", "FRO", "FRA",
-/* "GA", "GB", "GD", "GE", "GF", "GH", "GI", "GL", */
- "GAB", "GBR", "GRD", "GEO", "GUF", "GHA", "GIB", "GRL",
+/* "GA", "GB", "GD", "GE", "GF", "GG", "GH", "GI", "GL", */
+ "GAB", "GBR", "GRD", "GEO", "GUF", "GGY", "GHA", "GIB", "GRL",
/* "GM", "GN", "GP", "GQ", "GR", "GS", "GT", "GU", */
"GMB", "GIN", "GLP", "GNQ", "GRC", "SGS", "GTM", "GUM",
/* "GW", "GY", "HK", "HM", "HN", "HR", "HT", "HU", */
"GNB", "GUY", "HKG", "HMD", "HND", "HRV", "HTI", "HUN",
-/* "ID", "IE", "IL", "IN", "IO", "IQ", "IR", "IS", */
- "IDN", "IRL", "ISR", "IND", "IOT", "IRQ", "IRN", "ISL",
-/* "IT", "JM", "JO", "JP", "KE", "KG", "KH", "KI", */
- "ITA", "JAM", "JOR", "JPN", "KEN", "KGZ", "KHM", "KIR",
+/* ID", "IE", "IL", "IM", "IN", "IO", "IQ", "IR", "IS" */
+ "IDN", "IRL", "ISR", "IMN", "IND", "IOT", "IRQ", "IRN", "ISL",
+/* "IT", "JE", "JM", "JO", "JP", "KE", "KG", "KH", "KI", */
+ "ITA", "JEY", "JAM", "JOR", "JPN", "KEN", "KGZ", "KHM", "KIR",
/* "KM", "KN", "KP", "KR", "KW", "KY", "KZ", "LA", */
"COM", "KNA", "PRK", "KOR", "KWT", "CYM", "KAZ", "LAO",
/* "LB", "LC", "LI", "LK", "LR", "LS", "LT", "LU", */
@@ -443,8 +460,8 @@ static const char * const COUNTRIES_3[] = {
"TWN", "TZA", "UKR", "UGA", "UMI", "USA", "URY", "UZB",
/* "VA", "VC", "VE", "VG", "VI", "VN", "VU", "WF", */
"VAT", "VCT", "VEN", "VGB", "VIR", "VNM", "VUT", "WLF",
-/* "WS", "YE", "YT", "YU", "ZA", "ZM", "ZW", */
- "WSM", "YEM", "MYT", "YUG", "ZAF", "ZMB", "ZWE",
+/* "WS", "YE", "YT", "YU", "ZA", "ZM", "ZW", "ZZZ" */
+ "WSM", "YEM", "MYT", "YUG", "ZAF", "ZMB", "ZWE", "ZZZ",
NULL,
/* "FX", "RO", "TP", "ZR", */
"FXX", "ROM", "TMP", "ZAR",
@@ -465,6 +482,7 @@ typedef struct CanonicalizationMap {
static const CanonicalizationMap CANONICALIZE_MAP[] = {
{ "", "en_US_POSIX", NULL, NULL }, /* .NET name */
{ "C", "en_US_POSIX", NULL, NULL }, /* POSIX name */
+ { "posix", "en_US_POSIX", NULL, NULL }, /* POSIX name (alias of C) */
{ "art_LOJBAN", "jbo", NULL, NULL }, /* registered name */
{ "az_AZ_CYRL", "az_Cyrl_AZ", NULL, NULL }, /* .NET name */
{ "az_AZ_LATN", "az_Latn_AZ", NULL, NULL }, /* .NET name */
@@ -498,12 +516,14 @@ static const CanonicalizationMap CANONICALIZE_MAP[] = {
{ "nl_NL_PREEURO", "nl_NL", "currency", "NLG" },
{ "pt_PT_PREEURO", "pt_PT", "currency", "PTE" },
{ "sl_ROZAJ", "sl__ROZAJ", NULL, NULL }, /* registered name */
- { "sr_SP_CYRL", "sr_Cyrl_SP", NULL, NULL }, /* .NET name */
- { "sr_SP_LATN", "sr_Latn_SP", NULL, NULL }, /* .NET name */
+ { "sr_SP_CYRL", "sr_Cyrl_CS", NULL, NULL }, /* .NET name */
+ { "sr_SP_LATN", "sr_Latn_CS", NULL, NULL }, /* .NET name */
+ { "sr_YU_CYRILLIC", "sr_Cyrl_CS", NULL, NULL }, /* Linux name */
+ { "uz_UZ_CYRILLIC", "uz_Cyrl_UZ", NULL, NULL }, /* Linux name */
{ "uz_UZ_CYRL", "uz_Cyrl_UZ", NULL, NULL }, /* .NET name */
{ "uz_UZ_LATN", "uz_Latn_UZ", NULL, NULL }, /* .NET name */
{ "zh_CHS", "zh_Hans", NULL, NULL }, /* .NET name */
- { "zh_CHT", "zh_TW", NULL, NULL }, /* .NET name TODO: This should be zh_Hant once the locale structure is fixed. */
+ { "zh_CHT", "zh_Hant", NULL, NULL }, /* .NET name TODO: This should be zh_Hant once the locale structure is fixed. */
{ "zh_GAN", "zh__GAN", NULL, NULL }, /* registered name */
{ "zh_GUOYU", "zh", NULL, NULL }, /* registered name */
{ "zh_HAKKA", "zh__HAKKA", NULL, NULL }, /* registered name */
@@ -513,7 +533,7 @@ static const CanonicalizationMap CANONICALIZE_MAP[] = {
{ "zh_XIANG", "zh__XIANG", NULL, NULL }, /* registered name */
{ "zh_YUE", "zh__YUE", NULL, NULL }, /* registered name */
{ "th_TH_TRADITIONAL", "th_TH", "calendar", "buddhist" },
- { "zh_TW_STROKE", "zh_TW", "collation", "stroke" },
+ { "zh_TW_STROKE", "zh_Hant_TW", "collation", "stroke" },
{ "zh__PINYIN", "zh", "collation", "pinyin" }
};
@@ -524,14 +544,16 @@ static const CanonicalizationMap CANONICALIZE_MAP[] = {
static const char *
locale_getKeywordsStart(const char *localeID) {
- /* TODO This seems odd. No matter what charset we're on, won't '@'
- be '@'? Or are we building on one EBCDIC machine and moving the
- library to another? */
const char *result = NULL;
- static const uint8_t ebcdicSigns[] = { 0x7C, 0x44, 0x66, 0x80, 0xAC, 0xAE, 0xAF, 0xB5, 0xEC, 0xEF, 0x00 };
if((result = uprv_strchr(localeID, '@')) != NULL) {
return result;
- } else if(U_CHARSET_FAMILY == U_EBCDIC_FAMILY) {
+ }
+#if (U_CHARSET_FAMILY == U_EBCDIC_FAMILY)
+ else {
+ /* We do this because the @ sign is variant, and the @ sign used on one
+ EBCDIC machine won't be compiled the same way on other EBCDIC based
+ machines. */
+ static const uint8_t ebcdicSigns[] = { 0x7C, 0x44, 0x66, 0x80, 0xAC, 0xAE, 0xAF, 0xB5, 0xEC, 0xEF, 0x00 };
const uint8_t *charToFind = ebcdicSigns;
while(*charToFind) {
if((result = uprv_strchr(localeID, *charToFind)) != NULL) {
@@ -540,6 +562,7 @@ locale_getKeywordsStart(const char *localeID) {
charToFind++;
}
}
+#endif
return NULL;
}
@@ -552,7 +575,7 @@ locale_getKeywordsStart(const char *localeID) {
static int32_t locale_canonKeywordName(char *buf, const char *keywordName, UErrorCode *status)
{
int32_t i;
- int32_t keywordNameLen = uprv_strlen(keywordName);
+ int32_t keywordNameLen = (int32_t)uprv_strlen(keywordName);
if(keywordNameLen >= ULOC_KEYWORD_BUFFER_LEN) {
/* keyword name too long for internal buffer */
@@ -660,10 +683,10 @@ _getKeywords(const char *localeID,
while(*(pos - i - 1) == ' ') {
i++;
}
- keywordList[numKeywords].valueLen = pos - equalSign - i;
+ keywordList[numKeywords].valueLen = (int32_t)(pos - equalSign - i);
pos++;
} else {
- i = uprv_strlen(equalSign);
+ i = (int32_t)uprv_strlen(equalSign);
while(equalSign[i-1] == ' ') {
i--;
}
@@ -699,9 +722,9 @@ _getKeywords(const char *localeID,
return 0;
}
uprv_strcpy(keywordList[numKeywords].keyword, addKeyword);
- keywordList[numKeywords].keywordLen = uprv_strlen(addKeyword);
+ keywordList[numKeywords].keywordLen = (int32_t)uprv_strlen(addKeyword);
keywordList[numKeywords].valueStart = addValue;
- keywordList[numKeywords].valueLen = uprv_strlen(addValue);
+ keywordList[numKeywords].valueLen = (int32_t)uprv_strlen(addValue);
++numKeywords;
}
} else {
@@ -775,7 +798,6 @@ uloc_getKeywordValue(const char* localeID,
UErrorCode* status)
{
const char* nextSeparator = NULL;
- int32_t keywordNameLen;
char keywordNameBuffer[ULOC_KEYWORD_BUFFER_LEN];
char localeKeywordNameBuffer[ULOC_KEYWORD_BUFFER_LEN];
int32_t i = 0;
@@ -789,7 +811,7 @@ uloc_getKeywordValue(const char* localeID,
return 0;
}
- keywordNameLen = locale_canonKeywordName(keywordNameBuffer, keywordName, status);
+ locale_canonKeywordName(keywordNameBuffer, keywordName, status);
if(U_FAILURE(*status)) {
return 0;
}
@@ -833,9 +855,9 @@ uloc_getKeywordValue(const char* localeID,
startSearchHere--;
}
uprv_strncpy(buffer, nextSeparator, startSearchHere - nextSeparator);
- result = u_terminateChars(buffer, bufferCapacity, startSearchHere - nextSeparator, status);
+ result = u_terminateChars(buffer, bufferCapacity, (int32_t)(startSearchHere - nextSeparator), status);
} else if(!startSearchHere && (int32_t)uprv_strlen(nextSeparator) < bufferCapacity) { /* last item in string */
- i = uprv_strlen(nextSeparator);
+ i = (int32_t)uprv_strlen(nextSeparator);
while(nextSeparator[i - 1] == ' ') {
i--;
}
@@ -845,9 +867,9 @@ uloc_getKeywordValue(const char* localeID,
/* give a bigger buffer, please */
*status = U_BUFFER_OVERFLOW_ERROR;
if(startSearchHere) {
- result = startSearchHere - nextSeparator;
+ result = (int32_t)(startSearchHere - nextSeparator);
} else {
- result = uprv_strlen(nextSeparator);
+ result = (int32_t)uprv_strlen(nextSeparator);
}
}
return result;
@@ -882,11 +904,22 @@ uloc_setKeywordValue(const char* keywordName,
if(U_FAILURE(*status)) {
return -1;
}
+ if(bufferCapacity>1) {
+ bufLen = (int32_t)uprv_strlen(buffer);
+ } else {
+ *status = U_ILLEGAL_ARGUMENT_ERROR;
+ return 0;
+ }
+ if(bufferCapacity1) {
- bufLen = uprv_strlen(buffer);
- } else {
- *status = U_ILLEGAL_ARGUMENT_ERROR;
- return 0;
- }
if(startSearchHere == NULL || (startSearchHere[1]==0)) {
if(!keywordValue) { /* no keywords = nothing to remove */
return bufLen;
@@ -965,10 +992,10 @@ uloc_setKeywordValue(const char* keywordName,
/* we actually found the keyword. Change the value */
if (nextSeparator) {
keywordAtEnd = 0;
- foundValueLen = nextSeparator - nextEqualsign;
+ foundValueLen = (int32_t)(nextSeparator - nextEqualsign);
} else {
keywordAtEnd = 1;
- foundValueLen = uprv_strlen(nextEqualsign);
+ foundValueLen = (int32_t)uprv_strlen(nextEqualsign);
}
if(keywordValue) { /* adding a value - not removing */
if(foundValueLen == keywordValueLen) {
@@ -1001,11 +1028,11 @@ uloc_setKeywordValue(const char* keywordName,
if(keywordAtEnd) {
/* zero out the ';' or '@' just before startSearchhere */
keywordStart[-1] = 0;
- return (keywordStart-buffer)-1; /* (string length without keyword) minus separator */
+ return (int32_t)((keywordStart-buffer)-1); /* (string length without keyword) minus separator */
} else {
uprv_memmove(keywordStart, nextSeparator+1, bufLen-((nextSeparator+1)-buffer));
keywordStart[bufLen-((nextSeparator+1)-buffer)]=0;
- return bufLen-((nextSeparator+1)-keywordStart);
+ return (int32_t)(bufLen-((nextSeparator+1)-keywordStart));
}
}
} else if(rc<0){ /* end match keyword */
@@ -1123,6 +1150,22 @@ _copyCount(char *dest, int32_t destCapacity, const char *src) {
}
}
+static const char*
+uloc_getCurrentCountryID(const char* oldID){
+ int32_t offset = _findIndex(DEPRECATED_COUNTRIES, oldID);
+ if (offset >= 0) {
+ return REPLACEMENT_COUNTRIES[offset];
+ }
+ return oldID;
+}
+static const char*
+uloc_getCurrentLanguageID(const char* oldID){
+ int32_t offset = _findIndex(DEPRECATED_LANGUAGES, oldID);
+ if (offset >= 0) {
+ return REPLACEMENT_LANGUAGES[offset];
+ }
+ return oldID;
+}
/*
* the internal functions _getLanguage(), _getCountry(), _getVariant()
* avoid duplicating code to handle the earlier locale ID pieces
@@ -1355,7 +1398,7 @@ _deleteVariant(char* variants, int32_t variantsLen,
return delta;
}
++p;
- variantsLen -= p - variants;
+ variantsLen -= (int32_t)(p - variants);
variants = p;
}
}
@@ -1393,7 +1436,7 @@ uloc_kw_nextKeyword(UEnumeration* en,
const char* result = ((UKeywordsContext *)en->context)->current;
int32_t len = 0;
if(*result) {
- len = uprv_strlen(((UKeywordsContext *)en->context)->current);
+ len = (int32_t)uprv_strlen(((UKeywordsContext *)en->context)->current);
((UKeywordsContext *)en->context)->current += len+1;
} else {
result = NULL;
@@ -1498,6 +1541,9 @@ uloc_openKeywords(const char* localeID,
#define OPTION_SET(options, mask) ((options & mask) != 0)
+static const char i_default[] = {'i', '-', 'd', 'e', 'f', 'a', 'u', 'l', 't'};
+#define I_DEFAULT_LENGTH (sizeof i_default / sizeof i_default[0])
+
/**
* Canonicalize the given localeID, to level 1 or to level 2,
* depending on the options. To specify level 1, pass in options=0.
@@ -1513,6 +1559,7 @@ _canonicalize(const char* localeID,
UErrorCode* err) {
int32_t j, len, fieldCount=0, scriptSize=0, variantSize=0, nameCapacity;
char localeBuffer[ULOC_FULLNAME_CAPACITY];
+ const char* origLocaleID = localeID;
const char* keywordAssign = NULL;
const char* separatorIndicator = NULL;
const char* addKeyword = NULL;
@@ -1542,7 +1589,16 @@ _canonicalize(const char* localeID,
/* get all pieces, one after another, and separate with '_' */
len=_getLanguage(localeID, name, nameCapacity, &localeID);
- if(_isIDSeparator(*localeID)) {
+
+ if(len == I_DEFAULT_LENGTH && uprv_strncmp(origLocaleID, i_default, len) == 0) {
+ const char *d = uloc_getDefault();
+
+ len = uprv_strlen(d);
+
+ if (name != NULL) {
+ uprv_strncpy(name, d, len);
+ }
+ } else if(_isIDSeparator(*localeID)) {
const char *scriptID;
++fieldCount;
@@ -1663,7 +1719,7 @@ _canonicalize(const char* localeID,
/* Look up the ID in the canonicalization map */
for (j=0; j<(int32_t)(sizeof(CANONICALIZE_MAP)/sizeof(CANONICALIZE_MAP[0])); j++) {
const char* id = CANONICALIZE_MAP[j].id;
- int32_t n = uprv_strlen(id);
+ int32_t n = (int32_t)uprv_strlen(id);
if (len == n && uprv_strncmp(name, id, n) == 0) {
if (n == 0 && localeID != NULL) {
break; /* Don't remap "" if keywords present */
@@ -1733,7 +1789,7 @@ uloc_getParent(const char* localeID,
i=0;
}
- if(i>0) {
+ if(i>0 && parent != localeID) {
uprv_memcpy(parent, localeID, uprv_min(i, parentCapacity));
}
return u_terminateChars(parent, parentCapacity, i, err);
@@ -1824,7 +1880,6 @@ uloc_getVariant(const char* localeID,
UErrorCode* err)
{
int32_t i=0;
- UBool haveVariant=FALSE;
if(err==NULL || U_FAILURE(*err)) {
return 0;
@@ -1848,7 +1903,6 @@ uloc_getVariant(const char* localeID,
if (_isIDSeparator(*localeID)) {
_getCountry(localeID+1, NULL, 0, &localeID);
if(_isIDSeparator(*localeID)) {
- haveVariant=TRUE;
i=_getVariant(localeID+1, *localeID, variant, variantCapacity);
}
}
@@ -1946,6 +2000,25 @@ uloc_getLCID(const char* localeID)
return uprv_convertToLCID(langID, localeID, &status);
}
+U_CAPI int32_t U_EXPORT2
+uloc_getLocaleForLCID(uint32_t hostid, char *locale, int32_t localeCapacity,
+ UErrorCode *status)
+{
+ int32_t length;
+ const char *posix = uprv_convertToPosix(hostid, status);
+ if (U_FAILURE(*status) || posix == NULL) {
+ return 0;
+ }
+ length = (int32_t)uprv_strlen(posix);
+ if (length+1 > localeCapacity) {
+ *status = U_BUFFER_OVERFLOW_ERROR;
+ }
+ else {
+ uprv_strcpy(locale, posix);
+ }
+ return length;
+}
+
/* ### Default locale **************************************************/
U_CAPI const char* U_EXPORT2
@@ -1988,153 +2061,107 @@ _res_getTableStringWithFallback(const char *path, const char *locale,
int32_t *pLength,
UErrorCode *pErrorCode)
{
- char localeBuffer[ULOC_FULLNAME_CAPACITY*4];
- UResourceBundle *rb, table;
- const UChar *item;
+/* char localeBuffer[ULOC_FULLNAME_CAPACITY*4];*/
+ UResourceBundle *rb=NULL, table, subTable;
+ const UChar *item=NULL;
UErrorCode errorCode;
char explicitFallbackName[ULOC_FULLNAME_CAPACITY] = {0};
- int32_t efnLen =0;
- const UChar* ef = NULL;
- UBool overrideExplicitFallback = FALSE;
- for(;;) {
- /*
- * open the bundle for the current locale
- * this falls back through the locale's chain to root
- */
- errorCode=U_ZERO_ERROR;
- rb=ures_open(path, locale, &errorCode);
- if(U_FAILURE(errorCode)) {
- /* total failure, not even root could be opened */
- *pErrorCode=errorCode;
- return NULL;
- } else if(errorCode==U_USING_DEFAULT_WARNING ||
- (errorCode==U_USING_FALLBACK_WARNING && *pErrorCode!=U_USING_DEFAULT_WARNING)
- ) {
- /* set the "strongest" error code (success->fallback->default->failure) */
- *pErrorCode=errorCode;
- }
-
- /*
- * try to open the requested table
- * this falls back through the locale's chain to root, but not through the default locale
- */
- errorCode=U_ZERO_ERROR;
+
+ /*
+ * open the bundle for the current locale
+ * this falls back through the locale's chain to root
+ */
+ errorCode=U_ZERO_ERROR;
+ rb=ures_open(path, locale, &errorCode);
+ if(U_FAILURE(errorCode)) {
+ /* total failure, not even root could be opened */
+ *pErrorCode=errorCode;
+ return NULL;
+ } else if(errorCode==U_USING_DEFAULT_WARNING ||
+ (errorCode==U_USING_FALLBACK_WARNING && *pErrorCode!=U_USING_DEFAULT_WARNING)
+ ) {
+ /* set the "strongest" error code (success->fallback->default->failure) */
+ *pErrorCode=errorCode;
+ }
+
+ for(;;){
ures_initStackObject(&table);
- ures_getByKey(rb, tableKey, &table, &errorCode);
- if(U_FAILURE(errorCode)) {
- /* no such table anywhere in this fallback chain */
- ures_close(rb);
- *pErrorCode=errorCode;
- return NULL;
- } else if(errorCode==U_USING_DEFAULT_WARNING ||
- (errorCode==U_USING_FALLBACK_WARNING && *pErrorCode!=U_USING_DEFAULT_WARNING)
- ) {
- /* set the "strongest" error code (success->fallback->default->failure) */
- *pErrorCode=errorCode;
+ ures_initStackObject(&subTable);
+ ures_getByKeyWithFallback(rb, tableKey, &table, &errorCode);
+ if (subTableKey != NULL) {
+ /*
+ ures_getByKeyWithFallback(&table,subTableKey, &subTable, &errorCode);
+ item = ures_getStringByKeyWithFallback(&subTable, itemKey, pLength, &errorCode);
+ if(U_FAILURE(errorCode)){
+ *pErrorCode = errorCode;
+ }
+
+ break;*/
+
+ ures_getByKeyWithFallback(&table,subTableKey, &table, &errorCode);
}
-
- /* check if the fallback token is set */
- ef = ures_getStringByKey(&table, "Fallback", &efnLen, &errorCode);
if(U_SUCCESS(errorCode)){
- /* set the fallback chain */
- u_UCharsToChars(ef, explicitFallbackName, efnLen);
- /* null terminate the buffer */
- explicitFallbackName[efnLen]=0;
- }else if(errorCode==U_USING_DEFAULT_WARNING ||
- (errorCode==U_USING_FALLBACK_WARNING && *pErrorCode!=U_USING_DEFAULT_WARNING)
- ) {
- /* set the "strongest" error code (success->fallback->default->failure) */
- *pErrorCode=errorCode;
- }
-
- /* try to open the requested item in the table */
- errorCode=U_ZERO_ERROR;
- if(subTableKey == NULL){
- item=ures_getStringByKey(&table, itemKey, pLength, &errorCode);
- }else{
- UResourceBundle subTable;
- ures_initStackObject(&subTable);
- ures_getByKey(&table, subTableKey, &subTable, &errorCode);
- item = ures_getStringByKey(&subTable, itemKey, pLength, &errorCode);
- ures_close(&subTable);
- }
- if(U_SUCCESS(errorCode)) {
- /* if the item for the key is empty ... override the explicit fall back set */
- if(item[0]==0 && efnLen > 0){
- overrideExplicitFallback = TRUE;
- }else{
- /* we got the requested item! */
- ures_close(&table);
- ures_close(rb);
-
- if(errorCode==U_USING_DEFAULT_WARNING ||
- (errorCode==U_USING_FALLBACK_WARNING && *pErrorCode!=U_USING_DEFAULT_WARNING)
- ) {
- /* set the "strongest" error code (success->fallback->default->failure) */
- *pErrorCode=errorCode;
+ item = ures_getStringByKeyWithFallback(&table, itemKey, pLength, &errorCode);
+ if(U_FAILURE(errorCode)){
+ const char* replacement = NULL;
+ *pErrorCode = errorCode; /*save the errorCode*/
+ errorCode = U_ZERO_ERROR;
+ /* may be a deprecated code */
+ if(uprv_strcmp(tableKey, "Countries")==0){
+ replacement = uloc_getCurrentCountryID(itemKey);
+ }else if(uprv_strcmp(tableKey, "Languages")==0){
+ replacement = uloc_getCurrentLanguageID(itemKey);
}
-
- /*
- * It is safe to close the bundle and still return the
- * string pointer because resource bundles are
- * cached until u_cleanup().
- */
- return item;
+ /*pointer comparison is ok since uloc_getCurrentCountryID & uloc_getCurrentLanguageID return the key itself is replacement is not found*/
+ if(replacement!=NULL && itemKey != replacement){
+ item = ures_getStringByKeyWithFallback(&table, replacement, pLength, &errorCode);
+ if(U_SUCCESS(errorCode)){
+ *pErrorCode = errorCode;
+ break;
+ }
+ }
+ }else{
+ break;
}
}
+
+ if(U_FAILURE(errorCode)){
- /*
- * We get here if the item was not found.
- * We will follow the chain to the parent locale bundle and look in
- * the table there.
- */
-
- /* get the real locale ID for this table */
- errorCode=U_ZERO_ERROR;
- locale=ures_getLocale(&table, &errorCode);
- /* keep table and rb open until we are done using the locale string owned by the table bundle */
- if(U_FAILURE(errorCode)) {
- /* error getting the locale ID for an open RB - should never happen */
- ures_close(&table);
- ures_close(rb);
- *pErrorCode=U_INTERNAL_PROGRAM_ERROR;
- return NULL;
- }
+ /* still can't figure out ?.. try the fallback mechanism */
+ int32_t len = 0;
+ const UChar* fallbackLocale = NULL;
+ *pErrorCode = errorCode;
+ errorCode = U_ZERO_ERROR;
- if(*locale==0 || 0==uprv_strcmp(locale, _kRootName) || 0==uprv_strcmp(locale,explicitFallbackName)) {
- /* end of fallback; even root does not have the requested item either */
- ures_close(&table);
+ fallbackLocale = ures_getStringByKeyWithFallback(&table, "Fallback", &len, &errorCode);
+ if(U_FAILURE(errorCode)){
+ *pErrorCode = errorCode;
+ break;
+ }
+
+ u_UCharsToChars(fallbackLocale, explicitFallbackName, len);
+
+ /* guard against recursive fallback */
+ if(uprv_strcmp(explicitFallbackName, locale)==0){
+ *pErrorCode = U_INTERNAL_PROGRAM_ERROR;
+ break;
+ }
ures_close(rb);
- *pErrorCode=U_MISSING_RESOURCE_ERROR;
- return NULL;
- }
-
- /* could not find the table, or its item, try to fall back to a different RB and table */
- errorCode=U_ZERO_ERROR;
- if(efnLen > 0 && overrideExplicitFallback == FALSE){
- /* continue the fallback lookup with the explicit fallback that is requested */
- locale = explicitFallbackName;
- }else{
- uloc_getParent(locale, localeBuffer, sizeof(localeBuffer), &errorCode);
- if(U_FAILURE(errorCode) || errorCode==U_STRING_NOT_TERMINATED_WARNING) {
- /* error getting the parent locale ID - should never happen */
- *pErrorCode=U_INTERNAL_PROGRAM_ERROR;
- return NULL;
+ rb = ures_open(NULL, explicitFallbackName, &errorCode);
+ if(U_FAILURE(errorCode)){
+ *pErrorCode = errorCode;
+ break;
}
-
- /* continue the fallback lookup with the parent locale ID */
- locale=localeBuffer;
-
- /* adjust error code as we fall back */
- if (uprv_strlen(locale) == 0) /* Falling back to root locale? */
- *pErrorCode = U_USING_DEFAULT_WARNING;
- else if (*pErrorCode != U_USING_DEFAULT_WARNING)
- *pErrorCode = U_USING_FALLBACK_WARNING;
+ /* succeeded in opening the fallback bundle .. continue and try to fetch the item */
+ }else{
+ break;
}
- /* done with the locale string - ready to close table and rb */
- ures_close(&table);
- ures_close(rb);
}
+ /* done with the locale string - ready to close table and rb */
+ ures_close(&subTable);
+ ures_close(&table);
+ ures_close(rb);
+ return item;
}
static int32_t
@@ -2146,7 +2173,7 @@ _getStringOrCopyKey(const char *path, const char *locale,
UChar *dest, int32_t destCapacity,
UErrorCode *pErrorCode) {
const UChar *s = NULL;
- int32_t length;
+ int32_t length = 0;
if(itemKey==NULL) {
/* top-level item: normal resource bundle access */
@@ -2796,7 +2823,7 @@ uloc_acceptLanguageFromHTTP(char *result, int32_t resultAvailable, UAcceptResult
const char *t;
int32_t res;
int32_t i;
- int32_t l = uprv_strlen(httpAcceptLanguage);
+ int32_t l = (int32_t)uprv_strlen(httpAcceptLanguage);
int32_t jSize;
j = smallBuffer;
@@ -2840,7 +2867,7 @@ uloc_acceptLanguageFromHTTP(char *result, int32_t resultAvailable, UAcceptResult
/* eat spaces prior to semi */
for(t=(paramEnd-1);(paramEnd>s)&&isspace(*t);t--)
;
- j[n].locale = uprv_strndup(s,(t+1)-s);
+ j[n].locale = uprv_strndup(s,(int32_t)((t+1)-s));
uloc_canonicalize(j[n].locale,tmp,sizeof(tmp)/sizeof(tmp[0]),status);
if(strcmp(j[n].locale,tmp)) {
uprv_free(j[n].locale);
@@ -2938,7 +2965,7 @@ uloc_acceptLanguage(char *result, int32_t resultAvailable,
#if defined(ULOC_DEBUG)
fprintf(stderr," %s\n", l);
#endif
- len = uprv_strlen(l);
+ len = (int32_t)uprv_strlen(l);
if(!uprv_strcmp(acceptList[i], l)) {
if(outResult) {
*outResult = ULOC_ACCEPT_VALID;
@@ -2978,7 +3005,7 @@ uloc_acceptLanguage(char *result, int32_t resultAvailable,
#if defined(ULOC_DEBUG)
fprintf(stderr," %s\n", l);
#endif
- len = uprv_strlen(l);
+ len = (int32_t)uprv_strlen(l);
if(!uprv_strcmp(fallbackList[i], l)) {
if(outResult) {
*outResult = ULOC_ACCEPT_FALLBACK;
@@ -2989,11 +3016,11 @@ uloc_acceptLanguage(char *result, int32_t resultAvailable,
if(len>0) {
uprv_strncpy(result, l, uprv_min(len, resultAvailable));
}
- for(i=0;i
+# include "cmemory.h"
typedef HANDLE MemoryMap;
@@ -46,7 +49,7 @@
# define MAP_IMPLEMENTATION MAP_WIN32
/* ### Todo: properly auto detect mmap(). Until then, just add your platform here. */
-#elif U_HAVE_MMAP || defined(U_AIX) || defined(U_HPUX) || defined(OS390) || defined(PTX)
+#elif U_HAVE_MMAP || defined(U_AIX) || defined(U_HPUX) || defined(OS390)
typedef size_t MemoryMap;
# define IS_MAP(map) ((map)!=0)
@@ -81,16 +84,16 @@
# define MAP_IMPLEMENTATION MAP_POSIX
# endif
-#else /* unknown platform, no memory map implementation: use FileStream/uprv_malloc() instead */
+#else /* unknown platform, no memory map implementation: use stdio.h and uprv_malloc() instead */
-# include "filestrm.h"
+# include
# include "cmemory.h"
typedef void *MemoryMap;
# define IS_MAP(map) ((map)!=NULL)
-# define MAP_IMPLEMENTATION MAP_FILE_STREAM
+# define MAP_IMPLEMENTATION MAP_STDIO
#endif
@@ -103,7 +106,17 @@
* functions used by the rest of the implementation.*
* *
*----------------------------------------------------------------------------*/
-#if MAP_IMPLEMENTATION==MAP_WIN32
+#if MAP_IMPLEMENTATION==MAP_NONE
+ UBool
+ uprv_mapFile(UDataMemory *pData, const char *path) {
+ UDataMemory_init(pData); /* Clear the output struct. */
+ return FALSE; /* no file access */
+ }
+
+ void uprv_unmapFile(UDataMemory *pData) {
+ /* nothing to do */
+ }
+#elif MAP_IMPLEMENTATION==MAP_WIN32
UBool
uprv_mapFile(
UDataMemory *pData, /* Fill in with info on the result doing the mapping. */
@@ -113,6 +126,9 @@
{
HANDLE map;
HANDLE file;
+ SECURITY_ATTRIBUTES mappingAttributes;
+ SECURITY_ATTRIBUTES *mappingAttributesPtr = NULL;
+ SECURITY_DESCRIPTOR securityDesc;
UDataMemory_init(pData); /* Clear the output struct. */
@@ -124,8 +140,24 @@
return FALSE;
}
+ /* Declare and initialize a security descriptor.
+ This is required for multiuser systems on Windows 2000 SP4 and beyond */
+ if (InitializeSecurityDescriptor(&securityDesc, SECURITY_DESCRIPTOR_REVISION)) {
+ /* give the security descriptor a Null Dacl done using the "TRUE, (PACL)NULL" here */
+ if (SetSecurityDescriptorDacl(&securityDesc, TRUE, (PACL)NULL, FALSE)) {
+ /* Make the security attributes point to the security descriptor */
+ uprv_memset(&mappingAttributes, 0, sizeof(mappingAttributes));
+ mappingAttributes.nLength = sizeof(mappingAttributes);
+ mappingAttributes.lpSecurityDescriptor = &securityDesc;
+ mappingAttributes.bInheritHandle = FALSE; /* object uninheritable */
+ mappingAttributesPtr = &mappingAttributes;
+ }
+ }
+ /* else creating security descriptors can fail when we are on Windows 98,
+ and mappingAttributesPtr == NULL for that case. */
+
/* create an unnamed Windows file-mapping object for the specified file */
- map=CreateFileMapping(file, NULL, PAGE_READONLY, 0, 0, NULL);
+ map=CreateFileMapping(file, mappingAttributesPtr, PAGE_READONLY, 0, 0, NULL);
CloseHandle(file);
if(map==NULL) {
return FALSE;
@@ -209,42 +241,56 @@
-#elif MAP_IMPLEMENTATION==MAP_FILE_STREAM
+#elif MAP_IMPLEMENTATION==MAP_STDIO
+ /* copy of the filestrm.c/T_FileStream_size() implementation */
+ static int32_t
+ umap_fsize(FILE *f) {
+ int32_t savedPos = ftell(f);
+ int32_t size = 0;
+
+ /*Changes by Bertrand A. D. doesn't affect the current position
+ goes to the end of the file before ftell*/
+ fseek(f, 0, SEEK_END);
+ size = (int32_t)ftell(f);
+ fseek(f, savedPos, SEEK_SET);
+ return size;
+ }
+
UBool
uprv_mapFile(UDataMemory *pData, const char *path) {
- FileStream *file;
+ FILE *file;
int32_t fileLength;
void *p;
UDataMemory_init(pData); /* Clear the output struct. */
/* open the input file */
- file=T_FileStream_open(path, "rb");
+ file=fopen(path, "rb");
if(file==NULL) {
return FALSE;
}
/* get the file length */
- fileLength=T_FileStream_size(file);
- if(T_FileStream_error(file) || fileLength<=20) {
- T_FileStream_close(file);
+ fileLength=umap_fsize(file);
+ if(ferror(file) || fileLength<=20) {
+ fclose(file);
return FALSE;
}
/* allocate the memory to hold the file data */
p=uprv_malloc(fileLength);
if(p==NULL) {
- T_FileStream_close(file);
+ fclose(file);
return FALSE;
}
/* read the file */
- if(fileLength!=T_FileStream_read(file, p, fileLength)) {
+ if(fileLength!=fread(p, 1, fileLength, file)) {
uprv_free(p);
- T_FileStream_close(file);
+ fclose(file);
return FALSE;
}
- T_FileStream_close(file);
+ fclose(file);
pData->map=p;
pData->pHeader=(const DataHeader *)p;
pData->mapAddr=p;
@@ -446,5 +492,3 @@
#else
# error MAP_IMPLEMENTATION is set incorrectly
#endif
-
-
diff --git a/icuSources/common/umath.c b/icuSources/common/umath.c
new file mode 100644
index 00000000..4a571143
--- /dev/null
+++ b/icuSources/common/umath.c
@@ -0,0 +1,24 @@
+/*
+******************************************************************************
+*
+* Copyright (C) 1997-2006, International Business Machines
+* Corporation and others. All Rights Reserved.
+*
+******************************************************************************
+* This file contains platform independent math.
+*/
+
+#include "putilimp.h"
+
+U_CAPI int32_t U_EXPORT2
+uprv_max(int32_t x, int32_t y)
+{
+ return (x > y ? x : y);
+}
+
+U_CAPI int32_t U_EXPORT2
+uprv_min(int32_t x, int32_t y)
+{
+ return (x > y ? y : x);
+}
+
diff --git a/icuSources/common/umutex.c b/icuSources/common/umutex.c
index 5cf9e4ff..22396f5e 100644
--- a/icuSources/common/umutex.c
+++ b/icuSources/common/umutex.c
@@ -1,7 +1,7 @@
/*
******************************************************************************
*
-* Copyright (C) 1997-2004, International Business Machines
+* Copyright (C) 1997-2006, International Business Machines
* Corporation and others. All Rights Reserved.
*
******************************************************************************
@@ -18,10 +18,22 @@
******************************************************************************
*/
+#include "unicode/utypes.h"
+#include "uassert.h"
+#include "ucln_cmn.h"
+
+#if defined(U_DARWIN)
+#include
+#if (ICU_USE_THREADS == 1) && defined(MAC_OS_X_VERSION_10_4) && defined(MAC_OS_X_VERSION_MIN_REQUIRED) && (MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_4)
+#include
+#define USE_MAC_OS_ATOMIC_INCREMENT 1
+#endif
+#endif
+
/* Assume POSIX, and modify as necessary below */
#define POSIX
-#if defined(_WIN32)
+#if defined(U_WINDOWS)
#undef POSIX
#endif
#if defined(macintosh)
@@ -31,18 +43,12 @@
#undef POSIX
#endif
-
-#include "unicode/utypes.h"
-#include "uassert.h"
-#include "ucln_cmn.h"
-
-
#if defined(POSIX) && (ICU_USE_THREADS==1)
# include /* must be first, so that we get the multithread versions of things. */
#endif /* POSIX && (ICU_USE_THREADS==1) */
-#ifdef WIN32
+#ifdef U_WINDOWS
# define WIN32_LEAN_AND_MEAN
# define VC_EXTRALEAN
# define NOUSER
@@ -91,7 +97,7 @@ static UMTX gIncDecMutex = NULL;
static UBool gMutexPoolInitialized = FALSE;
static char gMutexesInUse[MAX_MUTEXES];
-#if defined(WIN32)
+#if defined(U_WINDOWS)
/*-------------------------------------------------------------
*
* WINDOWS platform variable declarations
@@ -206,7 +212,7 @@ umtx_lock(UMTX *mutex)
} else {
#if (ICU_USE_THREADS == 1)
-#if defined(WIN32)
+#if defined(U_WINDOWS)
EnterCriticalSection((CRITICAL_SECTION*) *mutex);
#elif defined(POSIX)
pthread_mutex_lock((pthread_mutex_t*) *mutex);
@@ -214,14 +220,14 @@ umtx_lock(UMTX *mutex)
#endif /* ICU_USE_THREADS==1 */
}
-#if defined(WIN32) && defined(U_DEBUG) && (ICU_USE_THREADS==1)
+#if defined(U_WINDOWS) && defined(U_DEBUG) && (ICU_USE_THREADS==1)
if (mutex == &gGlobalMutex) { /* Detect Reentrant locking of the global mutex. */
gRecursionCount++; /* Recursion causes deadlocks on Unixes. */
U_ASSERT(gRecursionCount == 1); /* Detection works on Windows. Debug problems there. */
}
/* This handles gGlobalMutex too, but only if there is no pMutexLockFn */
else if (pMutexLockFn == NULL) { /* see comments above */
- int i = ((CRITICAL_SECTION*)*mutex) - &gMutexes[0];
+ size_t i = ((CRITICAL_SECTION*)*mutex) - &gMutexes[0];
U_ASSERT(i >= 0 && i < MAX_MUTEXES);
++gRecursionCountPool[i];
@@ -256,14 +262,14 @@ umtx_unlock(UMTX* mutex)
return;
}
-#if defined (WIN32) && defined (U_DEBUG) && (ICU_USE_THREADS==1)
+#if defined (U_WINDOWS) && defined (U_DEBUG) && (ICU_USE_THREADS==1)
if (mutex == &gGlobalMutex) {
gRecursionCount--;
U_ASSERT(gRecursionCount == 0); /* Detect unlock of an already unlocked mutex */
}
/* This handles gGlobalMutex too, but only if there is no pMutexLockFn */
else if (pMutexLockFn == NULL) { /* see comments above */
- int i = ((CRITICAL_SECTION*)*mutex) - &gMutexes[0];
+ size_t i = ((CRITICAL_SECTION*)*mutex) - &gMutexes[0];
U_ASSERT(i >= 0 && i < MAX_MUTEXES);
--gRecursionCountPool[i];
@@ -283,7 +289,7 @@ umtx_unlock(UMTX* mutex)
(*pMutexUnlockFn)(gMutexContext, mutex);
} else {
#if (ICU_USE_THREADS==1)
-#if defined (WIN32)
+#if defined (U_WINDOWS)
LeaveCriticalSection((CRITICAL_SECTION*)*mutex);
#elif defined (POSIX)
pthread_mutex_unlock((pthread_mutex_t*)*mutex);
@@ -326,7 +332,7 @@ static void initGlobalMutex() {
* for Windows, init the pool of critical sections that we
* will use as needed for ICU mutexes.
*/
-#if defined (WIN32)
+#if defined (U_WINDOWS)
if (gMutexPoolInitialized == FALSE) {
int i;
for (i=0; imaxISOCommentLength) {
- maxISOCommentLength=length;
- }
+ /*length=calcNameSetLength(tokens, tokenCount, tokenStrings, tokenLengths, gISOCommentSet, &line, lineLimit);*/
}
++group;
@@ -1397,7 +1386,6 @@ calcGroupNameSetsLengths(int32_t maxNameLength) {
}
/* set gMax... - name length last for threading */
- gMaxISOCommentLength=maxISOCommentLength;
gMaxNameLength=maxNameLength;
}
@@ -1696,29 +1684,13 @@ uprv_getMaxCharNameLength() {
}
}
-#if 0
-/*
-Currently not used but left for future use. Probably by UnicodeSet.
-urename.h and uprops.h changed accordingly.
-*/
-U_CAPI int32_t U_EXPORT2
-uprv_getMaxISOCommentLength() {
- UErrorCode errorCode=U_ZERO_ERROR;
- if(calcNameSetsLengths(&errorCode)) {
- return gMaxISOCommentLength;
- } else {
- return 0;
- }
-}
-#endif
-
/**
* Converts the char set cset into a Unicode set uset.
* @param cset Set of 256 bit flags corresponding to a set of chars.
* @param uset USet to receive characters. Existing contents are deleted.
*/
static void
-charSetToUSet(uint32_t cset[8], USetAdder *sa) {
+charSetToUSet(uint32_t cset[8], const USetAdder *sa) {
UChar us[256];
char cs[256];
@@ -1755,25 +1727,10 @@ charSetToUSet(uint32_t cset[8], USetAdder *sa) {
* @param set USet to receive characters.
*/
U_CAPI void U_EXPORT2
-uprv_getCharNameCharacters(USetAdder *sa) {
+uprv_getCharNameCharacters(const USetAdder *sa) {
charSetToUSet(gNameSet, sa);
}
-#if 0
-/*
-Currently not used but left for future use. Probably by UnicodeSet.
-urename.h and uprops.h changed accordingly.
-*/
-/**
- * Fills set with characters that are used in Unicode character names.
- * @param set USetAdder to receive characters.
- */
-U_CAPI void U_EXPORT2
-uprv_getISOCommentCharacters(USetAdder *sa) {
- charSetToUSet(gISOCommentSet, sa);
-}
-#endif
-
/* data swapping ------------------------------------------------------------ */
/*
@@ -1820,8 +1777,8 @@ makeTokenMap(const UDataSwapper *ds,
c1=(uint8_t)i;
ds->swapInvChars(ds, &c1, 1, &c2, pErrorCode);
if(U_FAILURE(*pErrorCode)) {
- udata_printError(ds, "unames/makeTokenMap() finds variant character 0x%02x used (input charset family %d) - %s\n",
- i, ds->inCharset, u_errorName(*pErrorCode));
+ udata_printError(ds, "unames/makeTokenMap() finds variant character 0x%02x used (input charset family %d)\n",
+ i, ds->inCharset);
return;
}
@@ -2000,8 +1957,7 @@ uchar_swapNames(const UDataSwapper *ds,
udata_swapInvStringBlock(ds, inBytes+tokenStringOffset, (int32_t)(groupsOffset-tokenStringOffset),
outBytes+tokenStringOffset, pErrorCode);
if(U_FAILURE(*pErrorCode)) {
- udata_printError(ds, "uchar_swapNames(token strings) failed - %s\n",
- u_errorName(*pErrorCode));
+ udata_printError(ds, "uchar_swapNames(token strings) failed\n");
return 0;
}
@@ -2080,31 +2036,19 @@ uchar_swapNames(const UDataSwapper *ds,
ds->swapInvChars(ds, inRange+1, (int32_t)uprv_strlen((const char *)(inRange+1)),
outRange+1, pErrorCode);
if(U_FAILURE(*pErrorCode)) {
- udata_printError(ds, "uchar_swapNames(prefix string of algorithmic range %u) failed - %s\n",
- i, u_errorName(*pErrorCode));
+ udata_printError(ds, "uchar_swapNames(prefix string of algorithmic range %u) failed\n",
+ i);
return 0;
}
break;
case 1:
{
/* swap factors and the prefix and factor strings */
- uint16_t factors[8];
- uint32_t j, factorsCount;
+ uint32_t factorsCount;
factorsCount=inRange->variant;
- if(factorsCount==0 || factorsCount>LENGTHOF(factors)) {
- udata_printError(ds, "uchar_swapNames(): too many factors (%u) in algorithmic range %u\n",
- factorsCount, i);
- *pErrorCode=U_INDEX_OUTOFBOUNDS_ERROR;
- return 0;
- }
-
- /* read and swap the factors */
p=(const uint16_t *)(inRange+1);
q=(uint16_t *)(outRange+1);
- for(j=0; jreadUInt16(p[j]);
- }
ds->swapArray16(ds, p, (int32_t)(factorsCount*2), q, pErrorCode);
/* swap the strings, up to the last terminating NUL */
diff --git a/icuSources/common/unicode/brkiter.h b/icuSources/common/unicode/brkiter.h
index 9e397128..ba65650b 100644
--- a/icuSources/common/unicode/brkiter.h
+++ b/icuSources/common/unicode/brkiter.h
@@ -1,6 +1,6 @@
/*
********************************************************************************
-* Copyright (C) 1997-2004, International Business Machines
+* Copyright (C) 1997-2006, International Business Machines
* Corporation and others. All Rights Reserved.
********************************************************************************
*
@@ -22,6 +22,11 @@
#include "unicode/utypes.h"
+/**
+ * \file
+ * \brief C++ API: Break Iterator.
+ */
+
#if UCONFIG_NO_BREAK_ITERATION
U_NAMESPACE_BEGIN
@@ -42,38 +47,32 @@ U_NAMESPACE_END
#include "unicode/locid.h"
#include "unicode/ubrk.h"
#include "unicode/strenum.h"
+#include "unicode/utext.h"
+#include "unicode/umisc.h"
U_NAMESPACE_BEGIN
-#if !UCONFIG_NO_SERVICE
-/**
- * Opaque type returned by registerInstance.
- * @stable
- */
-typedef const void* URegistryKey;
-#endif
-
/**
* The BreakIterator class implements methods for finding the location
* of boundaries in text. BreakIterator is an abstract base class.
* Instances of BreakIterator maintain a current position and scan over
* text returning the index of characters where boundaries occur.
- *
+ *
* Line boundary analysis determines where a text string can be broken
* when line-wrapping. The mechanism correctly handles punctuation and
* hyphenated words.
- *
+ *
* Sentence boundary analysis allows selection with correct
* interpretation of periods within numbers and abbreviations, and
* trailing punctuation marks such as quotation marks and parentheses.
- *
+ *
* Word boundary analysis is used by search and replace functions, as
* well as within text editing applications that allow the user to
* select words with a double click. Word selection provides correct
* interpretation of punctuation marks within and following
* words. Characters that are not part of a word, such as symbols or
* punctuation marks, have word-breaks on both sides.
- *
+ *
* Character boundary analysis allows users to interact with
* characters as they expect to, for example, when moving the cursor
* through a text string. Character boundary analysis provides correct
@@ -81,126 +80,22 @@ typedef const void* URegistryKey;
* character is stored. For example, an accented character might be
* stored as a base character and a diacritical mark. What users
* consider to be a character can differ between languages.
- *
- * This is the interface for all text boundaries.
- *
- * Examples:
- *
- * Helper function to output text
- *
- * \code
- * void printTextRange( BreakIterator& iterator, int32_t start, int32_t end )
- * {
- * UnicodeString textBuffer, temp;
- * CharacterIterator *strIter = iterator.createText();
- * strIter->getText(temp);
- * cout << " " << start << " " << end << " |"
- * << temp.extractBetween(start, end, textBuffer)
- * << "|" << endl;
- * delete strIter;
- * }
- * \endcode
- *
- * Print each element in order:
- *
- * \code
- * void printEachForward( BreakIterator& boundary)
- * {
- * int32_t start = boundary.first();
- * for (int32_t end = boundary.next();
- * end != BreakIterator::DONE;
- * start = end, end = boundary.next())
- * {
- * printTextRange( boundary, start, end );
- * }
- * }
- * \code
- *
- * Print each element in reverse order:
- *
- * \code
- * void printEachBackward( BreakIterator& boundary)
- * {
- * int32_t end = boundary.last();
- * for (int32_t start = boundary.previous();
- * start != BreakIterator::DONE;
- * end = start, start = boundary.previous())
- * {
- * printTextRange( boundary, start, end );
- * }
- * }
- * \endcode
- *
- * Print first element
- *
- * \code
- * void printFirst(BreakIterator& boundary)
- * {
- * int32_t start = boundary.first();
- * int32_t end = boundary.next();
- * printTextRange( boundary, start, end );
- * }
- * \endcode
- *
- * Print last element
- *
- * \code
- * void printLast(BreakIterator& boundary)
- * {
- * int32_t end = boundary.last();
- * int32_t start = boundary.previous();
- * printTextRange( boundary, start, end );
- * }
- * \endcode
- *
- * Print the element at a specified position
- *
- * \code
- * void printAt(BreakIterator &boundary, int32_t pos )
- * {
- * int32_t end = boundary.following(pos);
- * int32_t start = boundary.previous();
- * printTextRange( boundary, start, end );
- * }
- * \endcode
- *
- * Creating and using text boundaries
- *
- * \code
- * void BreakIterator_Example( void )
- * {
- * BreakIterator* boundary;
- * UnicodeString stringToExamine("Aaa bbb ccc. Ddd eee fff.");
- * cout << "Examining: " << stringToExamine << endl;
- *
- * //print each sentence in forward and reverse order
- * boundary = BreakIterator::createSentenceInstance( Locale::US );
- * boundary->setText(stringToExamine);
- * cout << "----- forward: -----------" << endl;
- * printEachForward(*boundary);
- * cout << "----- backward: ----------" << endl;
- * printEachBackward(*boundary);
- * delete boundary;
- *
- * //print each word in order
- * boundary = BreakIterator::createWordInstance();
- * boundary->setText(stringToExamine);
- * cout << "----- forward: -----------" << endl;
- * printEachForward(*boundary);
- * //print first element
- * cout << "----- first: -------------" << endl;
- * printFirst(*boundary);
- * //print last element
- * cout << "----- last: --------------" << endl;
- * printLast(*boundary);
- * //print word at charpos 10
- * cout << "----- at pos 10: ---------" << endl;
- * printAt(*boundary, 10 );
+ *
+ * The text boundary positions are found according to the rules
+ * described in Unicode Standard Annex #29, Text Boundaries, and
+ * Unicode Standard Annex #14, Line Breaking Properties. These
+ * are available at http://www.unicode.org/reports/tr14/ and
+ * http://www.unicode.org/reports/tr29/.
+ *
+ * In addition to the C++ API defined in this header file, a
+ * plain C API with equivalent functionality is defined in the
+ * file ubrk.h
+ *
+ * Code snippits illustrating the use of the Break Iterator APIs
+ * are available in the ICU User Guide,
+ * http://icu.sourceforge.net/userguide/boundaryAnalysis.html
+ * and in the sample program icu/source/samples/break/break.cpp"
*
- * delete boundary;
- * }
- * \endcode
- *
*/
class U_COMMON_API BreakIterator : public UObject {
public:
@@ -249,11 +144,26 @@ public:
/**
* Return a CharacterIterator over the text being analyzed.
- * Changing the state of the returned iterator can have undefined consequences
- * on the operation of the break iterator. If you need to change it, clone it first.
* @stable ICU 2.0
*/
- virtual const CharacterIterator& getText(void) const = 0;
+ virtual CharacterIterator& getText(void) const = 0;
+
+
+ /**
+ * Get a UText for the text being analyzed.
+ * The returned UText is a shallow clone of the UText used internally
+ * by the break iterator implementation. It can safely be used to
+ * access the text without impacting any break iterator operations,
+ * but the underlying text itself must not be altered.
+ *
+ * @param fillIn A UText to be filled in. If NULL, a new UText will be
+ * allocated to hold the result.
+ * @param status receives any error codes.
+ * @return The current UText for this break iterator. If an input
+ * UText was provided, it will always be returned.
+ * @draft ICU 3.4
+ */
+ virtual UText *getUText(UText *fillIn, UErrorCode &status) const = 0;
/**
* Change the text over which this operates. The text boundary is
@@ -263,24 +173,39 @@ public:
*/
virtual void setText(const UnicodeString &text) = 0;
+ /**
+ * Reset the break iterator to operate over the text represented by
+ * the UText. The iterator position is reset to the start.
+ *
+ * This function makes a shallow clone of the supplied UText. This means
+ * that the caller is free to immediately close or otherwise reuse the
+ * Utext that was passed as a parameter, but that the underlying text itself
+ * must not be altered while being referenced by the break iterator.
+ *
+ * @param text The UText used to change the text.
+ * @param status receives any error codes.
+ * @draft ICU 3.4
+ */
+ virtual void setText(UText *text, UErrorCode &status) = 0;
+
/**
* Change the text over which this operates. The text boundary is
* reset to the start.
+ * Note that setText(UText *) provides similar functionality to this function,
+ * and is more efficient.
* @param it The CharacterIterator used to change the text.
* @stable ICU 2.0
*/
virtual void adoptText(CharacterIterator* it) = 0;
- /**
- * DONE is returned by previous() and next() after all valid
- * boundaries have been returned.
- * @stable ICU 2.0
- */
-#ifdef U_CYGWIN
- static U_COMMON_API const int32_t DONE;
-#else
- static const int32_t DONE;
-#endif
+ enum {
+ /**
+ * DONE is returned by previous() and next() after all valid
+ * boundaries have been returned.
+ * @stable ICU 2.0
+ */
+ DONE = (int32_t)-1
+ };
/**
* Return the index of the first character in the text being scanned.
@@ -577,7 +502,7 @@ public:
/**
* Returns the locale for this break iterator. Two flavors are available: valid and
* actual locale.
- * @draft ICU 2.8 likely to change in ICU 3.0, based on feedback
+ * @stable ICU 2.8
*/
Locale getLocale(ULocDataLocaleType type, UErrorCode& status) const;
@@ -590,8 +515,8 @@ public:
const char *getLocaleID(ULocDataLocaleType type, UErrorCode& status) const;
private:
- static BreakIterator* buildInstance(const Locale& loc, const char *type, UBool dict, UErrorCode& status);
- static BreakIterator* createInstance(const Locale& loc, UBreakIteratorType kind, UErrorCode& status);
+ static BreakIterator* buildInstance(const Locale& loc, const char *type, int32_t kind, UErrorCode& status);
+ static BreakIterator* createInstance(const Locale& loc, int32_t kind, UErrorCode& status);
static BreakIterator* makeInstance(const Locale& loc, int32_t kind, UErrorCode& status);
friend class ICUBreakIteratorFactory;
@@ -615,7 +540,7 @@ private:
* The assignment operator has no real implementation.
* It's provided to make the compiler happy. Do not call.
*/
- BreakIterator& operator=(const BreakIterator&) { return *this; }
+ BreakIterator& operator=(const BreakIterator&);
};
inline UBool BreakIterator::isBufferClone()
diff --git a/icuSources/common/unicode/caniter.h b/icuSources/common/unicode/caniter.h
index 1deb3be6..84a65958 100644
--- a/icuSources/common/unicode/caniter.h
+++ b/icuSources/common/unicode/caniter.h
@@ -1,6 +1,6 @@
/*
*******************************************************************************
- * Copyright (C) 1996-2004, International Business Machines Corporation and *
+ * Copyright (C) 1996-2006, International Business Machines Corporation and *
* others. All Rights Reserved. *
*******************************************************************************
*/
@@ -15,6 +15,11 @@
#include "unicode/uobject.h"
#include "unicode/unistr.h"
+/**
+ * \file
+ * \brief C++ API: Canonical Iterator
+ */
+
/** Should permutation skip characters with combining class zero
* Should be either TRUE or FALSE. This is a compile time option
* @stable ICU 2.4
@@ -173,7 +178,7 @@ private:
UnicodeString *getEquivalents(const UnicodeString &segment, int32_t &result_len, UErrorCode &status); //private String[] getEquivalents(String segment)
//Set getEquivalents2(String segment);
- Hashtable *getEquivalents2(const UChar *segment, int32_t segLen, UErrorCode &status);
+ Hashtable *getEquivalents2(Hashtable *fillinResult, const UChar *segment, int32_t segLen, UErrorCode &status);
//Hashtable *getEquivalents2(const UnicodeString &segment, int32_t segLen, UErrorCode &status);
/**
@@ -182,7 +187,7 @@ private:
* If so, take the remainder, and return the equivalents
*/
//Set extract(int comp, String segment, int segmentPos, StringBuffer buffer);
- Hashtable *extract(UChar32 comp, const UChar *segment, int32_t segLen, int32_t segmentPos, UErrorCode &status);
+ Hashtable *extract(Hashtable *fillinResult, UChar32 comp, const UChar *segment, int32_t segLen, int32_t segmentPos, UErrorCode &status);
//Hashtable *extract(UChar32 comp, const UnicodeString &segment, int32_t segLen, int32_t segmentPos, UErrorCode &status);
void cleanPieces();
diff --git a/icuSources/common/unicode/chariter.h b/icuSources/common/unicode/chariter.h
index 94ce9a8d..12fc9248 100644
--- a/icuSources/common/unicode/chariter.h
+++ b/icuSources/common/unicode/chariter.h
@@ -1,7 +1,7 @@
/*
********************************************************************
*
-* Copyright (C) 1997-2004, International Business Machines
+* Copyright (C) 1997-2005, International Business Machines
* Corporation and others. All Rights Reserved.
*
********************************************************************
@@ -13,7 +13,11 @@
#include "unicode/utypes.h"
#include "unicode/uobject.h"
#include "unicode/unistr.h"
-
+/**
+ * \file
+ * \brief C++ API: Character Iterator
+ */
+
U_NAMESPACE_BEGIN
/**
* Abstract class that defines an API for forward-only iteration
diff --git a/icuSources/common/unicode/dbbi.h b/icuSources/common/unicode/dbbi.h
index 9c6278a9..c7984ef8 100644
--- a/icuSources/common/unicode/dbbi.h
+++ b/icuSources/common/unicode/dbbi.h
@@ -1,6 +1,6 @@
/*
**********************************************************************
-* Copyright (C) 1999-2004 IBM Corp. All rights reserved.
+* Copyright (C) 1999-2006 IBM Corp. All rights reserved.
**********************************************************************
* Date Name Description
* 12/1/99 rgillam Complete port from Java.
@@ -15,255 +15,24 @@
#if !UCONFIG_NO_BREAK_ITERATION
+/**
+ * \file
+ * \brief C++ API: Dictionary Based Break Iterator
+ */
+
U_NAMESPACE_BEGIN
-/* forward declaration */
-class DictionaryBasedBreakIteratorTables;
-
/**
- * A subclass of RuleBasedBreakIterator that adds the ability to use a dictionary
- * to further subdivide ranges of text beyond what is possible using just the
- * state-table-based algorithm. This is necessary, for example, to handle
- * word and line breaking in Thai, which doesn't use spaces between words. The
- * state-table-based algorithm used by RuleBasedBreakIterator is used to divide
- * up text as far as possible, and then contiguous ranges of letters are
- * repeatedly compared against a list of known words (i.e., the dictionary)
- * to divide them up into words.
- *
- * Applications do not normally need to include this header.
- *
- * This class will probably be deprecated in a future release of ICU, and replaced
- * with a more flexible and capable dictionary based break iterator. This change
- * should be invisible to applications, because creation and use of instances of
- * DictionaryBasedBreakIterator is through the factories and abstract
- * API on class BreakIterator, which will remain stable.
- *
- * This class is not intended to be subclassed.
- *
- *
- * DictionaryBasedBreakIterator uses the same rule language as RuleBasedBreakIterator,
- * but adds one more special substitution name: <dictionary>. This substitution
- * name is used to identify characters in words in the dictionary. The idea is that
- * if the iterator passes over a chunk of text that includes two or more characters
- * in a row that are included in <dictionary>, it goes back through that range and
- * derives additional break positions (if possible) using the dictionary.
- *
- * DictionaryBasedBreakIterator is also constructed with the filename of a dictionary
- * file. It follows a prescribed search path to locate the dictionary (right now,
- * it looks for it in /com/ibm/text/resources in each directory in the classpath,
- * and won't find it in JAR files, but this location is likely to change). The
- * dictionary file is in a serialized binary format. We have a very primitive (and
- * slow) BuildDictionaryFile utility for creating dictionary files, but aren't
- * currently making it public. Contact us for help.
- *
- * NOTE The DictionaryBasedIterator class is still under development. The
- * APIs are not in stable condition yet.
+ * An obsolete subclass of RuleBasedBreakIterator. Handling of dictionary-
+ * based break iteration has been folded into the base class. This class
+ * is deprecated as of ICU 3.6.
*/
-class U_COMMON_API DictionaryBasedBreakIterator : public RuleBasedBreakIterator {
-
-private:
-
- /**
- * when a range of characters is divided up using the dictionary, the break
- * positions that are discovered are stored here, preventing us from having
- * to use either the dictionary or the state table again until the iterator
- * leaves this range of text
- */
- int32_t* cachedBreakPositions;
-
- /**
- * The number of elements in cachedBreakPositions
- */
- int32_t numCachedBreakPositions;
-
- /**
- * if cachedBreakPositions is not null, this indicates which item in the
- * cache the current iteration position refers to
- */
- int32_t positionInCache;
-
- DictionaryBasedBreakIteratorTables *fTables;
-
- /**=======================================================================
- * Create a dictionary based break boundary detection iterator.
- * @param tablesImage The location for the dictionary to be loaded into memory
- * @param dictionaryFilename The name of the dictionary file
- * @param status the error code status
- * @return A dictionary based break detection iterator. The UErrorCode& status
- * parameter is used to return status information to the user.
- * To check whether the construction succeeded or not, you should check
- * the value of U_SUCCESS(err). If you wish more detailed information, you
- * can check for informational error results which still indicate success. For example,
- * U_FILE_ACCESS_ERROR will be returned if the file does not exist.
- * The caller owns the returned object and is responsible for deleting it.
- ======================================================================= */
- DictionaryBasedBreakIterator(UDataMemory* tablesImage, const char* dictionaryFilename, UErrorCode& status);
-
-public:
- //=======================================================================
- // boilerplate
- //=======================================================================
-
- /**
- * Destructor
- * @stable ICU 2.0
- */
- virtual ~DictionaryBasedBreakIterator();
-
- /**
- * Default constructor. Creates an "empty" break iterator.
- * Such an iterator can subsequently be assigned to.
- * @return the newly created DictionaryBaseBreakIterator.
- * @stable ICU 2.0
- */
- DictionaryBasedBreakIterator();
-
- /**
- * Copy constructor.
- * @param other The DictionaryBasedBreakIterator to be copied.
- * @return the newly created DictionaryBasedBreakIterator.
- * @stable ICU 2.0
- */
- DictionaryBasedBreakIterator(const DictionaryBasedBreakIterator &other);
-
- /**
- * Assignment operator.
- * @param that The object to be copied.
- * @return the newly set DictionaryBasedBreakIterator.
- * @stable ICU 2.0
- */
- DictionaryBasedBreakIterator& operator=(const DictionaryBasedBreakIterator& that);
+
+#ifndef U_HIDE_DEPRECATED_API
- /**
- * Returns a newly-constructed RuleBasedBreakIterator with the same
- * behavior, and iterating over the same text, as this one.
- * @return Returns a newly-constructed RuleBasedBreakIterator.
- * @stable ICU 2.0
- */
- virtual BreakIterator* clone(void) const;
+typedef RuleBasedBreakIterator DictionaryBasedBreakIterator;
- //=======================================================================
- // BreakIterator overrides
- //=======================================================================
- /**
- * Advances the iterator backwards, to the last boundary preceding this one.
- * @return The position of the last boundary position preceding this one.
- * @stable ICU 2.0
- */
- virtual int32_t previous(void);
-
- /**
- * Sets the iterator to refer to the first boundary position following
- * the specified position.
- * @param offset The position from which to begin searching for a break position.
- * @return The position of the first break after the current position.
- * @stable ICU 2.0
- */
- virtual int32_t following(int32_t offset);
-
- /**
- * Sets the iterator to refer to the last boundary position before the
- * specified position.
- * @param offset The position to begin searching for a break from.
- * @return The position of the last boundary before the starting position.
- * @stable ICU 2.0
- */
- virtual int32_t preceding(int32_t offset);
-
- /**
- * Returns the class ID for this class. This is useful only for
- * comparing to a return value from getDynamicClassID(). For example:
- *
- * Base* polymorphic_pointer = createPolymorphicObject();
- * if (polymorphic_pointer->getDynamicClassID() ==
- * Derived::getStaticClassID()) ...
- *
- * @return The class ID for all objects of this class.
- * @stable ICU 2.0
- */
- static UClassID U_EXPORT2 getStaticClassID(void);
-
- /**
- * Returns a unique class ID POLYMORPHICALLY. Pure virtual override.
- * This method is to implement a simple version of RTTI, since not all
- * C++ compilers support genuine RTTI. Polymorphic operator==() and
- * clone() methods call this method.
- *
- * @return The class ID for this object. All objects of a
- * given class have the same class ID. Objects of
- * other classes have different class IDs.
- * @stable ICU 2.0
- */
- virtual UClassID getDynamicClassID(void) const;
-
-protected:
- //=======================================================================
- // implementation
- //=======================================================================
- /**
- * This method is the actual implementation of the next() method. All iteration
- * vectors through here. This method initializes the state machine to state 1
- * and advances through the text character by character until we reach the end
- * of the text or the state machine transitions to state 0. We update our return
- * value every time the state machine passes through a possible end state.
- * @internal
- */
- virtual int32_t handleNext(void);
-
- /**
- * removes the cache of break positions (usually in response to a change in
- * position of some sort)
- * @internal
- */
- virtual void reset(void);
-
- /**
- * init Initialize a dbbi. Common routine for use by constructors.
- * @internal
- */
- void init();
-
- /**
- * @param stackBuffer user allocated space for the new clone. If NULL new memory will be allocated.
- * If buffer is not large enough, new memory will be allocated.
- * @param BufferSize reference to size of allocated space.
- * If BufferSize == 0, a sufficient size for use in cloning will
- * be returned ('pre-flighting')
- * If BufferSize is not enough for a stack-based safe clone,
- * new memory will be allocated.
- * @param status to indicate whether the operation went on smoothly or there were errors
- * An informational status value, U_SAFECLONE_ALLOCATED_ERROR, is used if any allocations were
- * necessary.
- * @return pointer to the new clone
- * @internal
- */
- virtual BreakIterator * createBufferClone(void *stackBuffer,
- int32_t &BufferSize,
- UErrorCode &status);
-
-
-private:
- /**
- * This is the function that actually implements the dictionary-based
- * algorithm. Given the endpoints of a range of text, it uses the
- * dictionary to determine the positions of any boundaries in this
- * range. It stores all the boundary positions it discovers in
- * cachedBreakPositions so that we only have to do this work once
- * for each time we enter the range.
- * @param startPos The start position of a range of text
- * @param endPos The end position of a range of text
- * @param status The error code status
- */
- void divideUpDictionaryRange(int32_t startPos, int32_t endPos, UErrorCode &status);
-
-
- /*
- * HSYS : Please revisit with Rich, the ctors of the DBBI class is currently
- * marked as private.
- */
- friend class DictionaryBasedBreakIteratorTables;
- friend class BreakIterator;
-};
+#endif
U_NAMESPACE_END
diff --git a/icuSources/common/unicode/docmain.h b/icuSources/common/unicode/docmain.h
index 94ac7301..649eb2a7 100644
--- a/icuSources/common/unicode/docmain.h
+++ b/icuSources/common/unicode/docmain.h
@@ -1,6 +1,6 @@
/********************************************************************
* COPYRIGHT:
- * Copyright (c) 1997-2004, International Business Machines Corporation and
+ * Copyright (c) 1997-2005, International Business Machines Corporation and
* others. All Rights Reserved.
*
* FILE NAME: DOCMAIN.h
@@ -39,21 +39,20 @@
*
*
*
API References for Previous Releases
- * The API References for the previous release are available
- * online.
- * For each release there are also .zip and .tgz files for the API References
- * on the download page of the release.
+ * The API References for each release of ICU are also available as
+ * a zip file from the ICU
+ * download page.
*
*
*
* Architecture (User's Guide)
*
*
*
@@ -184,5 +183,20 @@
* utmscale.h |
* utmscale.h C API |
*
+ *
+ * Basic Layout Engine Types and Constants |
+ * (no C API) |
+ * LETypes.h |
+ *
+ *
+ * Complex Text Layout |
+ * (no C API) |
+ * LayoutEngine, ParagraphLayout |
+ *
+ *
+ * ICU I/O |
+ * ustdio.h |
+ * ustream.h |
+ *
*
*/
diff --git a/icuSources/common/unicode/locid.h b/icuSources/common/unicode/locid.h
index fea77201..a3cc23b3 100644
--- a/icuSources/common/unicode/locid.h
+++ b/icuSources/common/unicode/locid.h
@@ -1,7 +1,7 @@
/*
******************************************************************************
*
-* Copyright (C) 1996-2004, International Business Machines
+* Copyright (C) 1996-2006, International Business Machines
* Corporation and others. All Rights Reserved.
*
******************************************************************************
@@ -57,9 +57,9 @@
* this class:
* \htmlonly\endhtmlonly
*
- * . Locale( const char* language,
- * . const char* country,
- * . const char* variant);
+ * Locale( const char* language,
+ * const char* country,
+ * const char* variant);
*
* \htmlonly
\endhtmlonly
* The first argument to the constructors is a valid ISO
@@ -74,17 +74,17 @@
* 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.iso.ch/iso/en/prods-services/iso3166ma/index.html
+ *
+ * http://www.iso.org/iso/en/prods-services/iso3166ma/index.html
*
*
* The third 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.
+ * For example, use REVISED for a langauge's revised script orthography, 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".
+ * "ES", "ES", "Traditional_POSIX".
*
*
* Because a Locale
object is just an identifier for a region,
@@ -315,7 +315,7 @@ public:
* @return a clone of this object
*
* @see getDynamicClassID
- * @draft ICU 2.8
+ * @stable ICU 2.8
*/
Locale *clone() const;
@@ -367,7 +367,7 @@ public:
* the string by calling uloc_canonicalize().
* @param name the locale ID to create from. Must not be NULL.
* @return a new locale object corresponding to the given name
- * @draft ICU 3.0
+ * @stable ICU 3.0
* @see uloc_canonicalize
*/
static Locale U_EXPORT2 createCanonical(const char* name);
@@ -384,7 +384,7 @@ public:
* @return An alias to the code
* @see uscript_getShortName
* @see uscript_getCode
- * @draft ICU 2.8
+ * @stable ICU 2.8
*/
inline const char * getScript( ) const;
@@ -417,7 +417,7 @@ public:
* but without keywords.
* @return A pointer to "name".
* @see getName
- * @draft ICU 2.8
+ * @stable ICU 2.8
*/
const char * getBaseName() const;
@@ -427,7 +427,7 @@ public:
*
* @return pointer to StringEnumeration class. Client must dispose of it by calling delete.
* @param status Returns any error information while performing this operation.
- * @draft ICU 2.8
+ * @stable ICU 2.8
*/
StringEnumeration * createKeywords(UErrorCode &status) const;
@@ -440,13 +440,13 @@ public:
* @param bufferCapacity The capacity of receiving buffer
* @return the length of keyword value
*
- * @draft ICU 2.8
+ * @stable ICU 2.8
*/
int32_t getKeywordValue(const char* keywordName, char *buffer, int32_t bufferCapacity, UErrorCode &status) const;
/**
* returns the locale's three-letter language code, as specified
- * in ISO draft standard ISO-639-2..
+ * in ISO draft standard ISO-639-2.
* @return An alias to the code, or NULL
* @stable ICU 2.0
*/
@@ -502,7 +502,7 @@ public:
* dispScript to "Latin".
* @param dispScript Receives the scripts's display name.
* @return A reference to "dispScript".
- * @draft ICU 2.8
+ * @stable ICU 2.8
*/
UnicodeString& getDisplayScript( UnicodeString& dispScript) const;
@@ -518,7 +518,7 @@ public:
* "".
* @param dispScript Receives the scripts's display name.
* @return A reference to "dispScript".
- * @draft ICU 2.8
+ * @stable ICU 2.8
*/
UnicodeString& getDisplayScript( const Locale& displayLocale,
UnicodeString& dispScript) const;
@@ -538,10 +538,10 @@ public:
* Fills in "dispCountry" with the name of this locale's country in a format suitable
* for user display in the locale specified by "displayLocale". For example, if the locale's
* country code is "US" and displayLocale's language code is "fr", this function would set
- * dispCountry to "Etats-Unis".
+ * dispCountry to "États-Unis".
* @param displayLocale Specifies the locale to be used to display the name. In other
* words, if the locale's country code is "US", passing
- * Locale::getFrench() for displayLocale would result in "États-Unis", while
+ * Locale::getFrench() for displayLocale would result in "États-Unis", while
* passing Locale::getGerman() for displayLocale would result in
* "Vereinigte Staaten".
* @param dispCountry Receives the country's display name.
@@ -589,8 +589,8 @@ public:
* in the locale specfied by "displayLocale". This function uses getDisplayLanguage(),
* getDisplayCountry(), and getDisplayVariant() to do its work, and outputs the display
* name in the format "language (country[,variant])". For example, if displayLocale is
- * fr_FR, then en_US's display name would be "Anglais (États-Unis)", and no_NO_NY's
- * display name would be "norvégien (Norvège,NY)".
+ * fr_FR, then en_US's display name would be "Anglais (États-Unis)", and no_NO_NY's
+ * display name would be "norvégien (Norvège,NY)".
* @param displayLocale Specifies the locale to be used to display the name.
* @param name Receives the locale's display name.
* @return A reference to "name".
diff --git a/icuSources/common/unicode/normlzr.h b/icuSources/common/unicode/normlzr.h
index 447f0469..7974f1ac 100644
--- a/icuSources/common/unicode/normlzr.h
+++ b/icuSources/common/unicode/normlzr.h
@@ -1,7 +1,7 @@
/*
********************************************************************
* COPYRIGHT:
- * Copyright (c) 1996-2004, International Business Machines Corporation and
+ * Copyright (c) 1996-2006, International Business Machines Corporation and
* others. All Rights Reserved.
********************************************************************
*/
@@ -11,6 +11,11 @@
#include "unicode/utypes.h"
+/**
+ * \file
+ * \brief C++ API: Unicode Normalization
+ */
+
#if !UCONFIG_NO_NORMALIZATION
#include "unicode/uobject.h"
@@ -18,12 +23,15 @@
#include "unicode/chariter.h"
#include "unicode/unorm.h"
+
struct UCharIterator;
typedef struct UCharIterator UCharIterator; /**< C typedef for struct UCharIterator. @stable ICU 2.1 */
U_NAMESPACE_BEGIN
/**
- * \brief C++ API: Unicode Normalization
+ * The Normalizer class supports the standard normalization forms described in
+ *
+ * Unicode Standard Annex #15: Unicode Normalization Forms.
*
* The Normalizer class consists of two parts:
* - static functions that normalize strings or test if strings are normalized
diff --git a/icuSources/common/unicode/parseerr.h b/icuSources/common/unicode/parseerr.h
index d1ba3948..44ff0081 100644
--- a/icuSources/common/unicode/parseerr.h
+++ b/icuSources/common/unicode/parseerr.h
@@ -1,6 +1,6 @@
/*
**********************************************************************
-* Copyright (C) 1999-2004, International Business Machines
+* Copyright (C) 1999-2005, International Business Machines
* Corporation and others. All Rights Reserved.
**********************************************************************
* Date Name Description
@@ -14,6 +14,10 @@
#include "unicode/utypes.h"
+/**
+ * \file
+ * \brief C API: Parse Error Information
+ */
/**
* The capacity of the context strings in UParseError.
* @stable ICU 2.0
diff --git a/icuSources/common/unicode/parsepos.h b/icuSources/common/unicode/parsepos.h
index 0a46ea52..cdf49e04 100644
--- a/icuSources/common/unicode/parsepos.h
+++ b/icuSources/common/unicode/parsepos.h
@@ -1,5 +1,5 @@
/*
-* Copyright (C) 1997-2004, International Business Machines Corporation and others. All Rights Reserved.
+* Copyright (C) 1997-2005, International Business Machines Corporation and others. All Rights Reserved.
*******************************************************************************
*
* File PARSEPOS.H
@@ -19,9 +19,14 @@
#include "unicode/utypes.h"
#include "unicode/uobject.h"
+
U_NAMESPACE_BEGIN
/**
+ * \file
+ * \brief C++ API: Canonical Iterator
+ */
+/**
* ParsePosition
is a simple class used by Format
* and its subclasses to keep track of the current position during parsing.
* The parseObject
method in the various Format
@@ -108,7 +113,7 @@ public:
* @return a clone of this object
*
* @see getDynamicClassID
- * @draft ICU 2.8
+ * @stable ICU 2.8
*/
ParsePosition *clone() const;
diff --git a/icuSources/common/unicode/platform.h.in b/icuSources/common/unicode/platform.h.in
index e1dcfdc1..80766a25 100644
--- a/icuSources/common/unicode/platform.h.in
+++ b/icuSources/common/unicode/platform.h.in
@@ -1,7 +1,7 @@
/*
******************************************************************************
*
-* Copyright (C) 1997-2004, International Business Machines
+* Copyright (C) 1997-2006, International Business Machines
* Corporation and others. All Rights Reserved.
*
******************************************************************************
@@ -16,6 +16,11 @@
******************************************************************************
*/
+/**
+ * \file
+ * \brief Basic types for the platform
+ */
+
/* Define the platform we're on. */
#ifndef @platform@
#define @platform@
@@ -192,6 +197,11 @@ typedef unsigned int uint32_t;
#define U_ENABLE_TRACING @U_ENABLE_TRACING@
#endif
+/* Do we allow ICU users to use the draft APIs by default? */
+#ifndef U_DEFAULT_SHOW_DRAFT
+#define U_DEFAULT_SHOW_DRAFT @U_DEFAULT_SHOW_DRAFT@
+#endif
+
/* Define the library suffix in a C syntax. */
#define U_HAVE_LIB_SUFFIX @U_HAVE_LIB_SUFFIX@
#define U_LIB_SUFFIX_C_NAME @ICULIBSUFFIXCNAME@
@@ -201,7 +211,7 @@ typedef unsigned int uint32_t;
/* Character data types */
/*===========================================================================*/
-#if defined(OS390) || defined(OS400)
+#if ((defined(OS390) && (!defined(__CHARSET_LIB) || !__CHARSET_LIB))) || defined(OS400)
# define U_CHARSET_FAMILY 1
#endif
@@ -239,7 +249,16 @@ typedef unsigned int uint32_t;
/* Symbol import-export control */
/*===========================================================================*/
+#if defined(U_DARWIN) && defined(__GNUC__) && (__GNUC__ >= 4)
+#define USE_GCC_VISIBILITY_ATTRIBUTE 1
+#endif
+
+#ifdef USE_GCC_VISIBILITY_ATTRIBUTE
+#define U_EXPORT __attribute__((visibility("default")))
+#else
#define U_EXPORT
+#endif
+
/* U_CALLCONV is releated to U_EXPORT2 */
#define U_EXPORT2
@@ -255,7 +274,11 @@ typedef unsigned int uint32_t;
/*===========================================================================*/
#ifndef U_INLINE
-#define U_INLINE @U_INLINE@
+# ifdef __cplusplus
+# define U_INLINE inline
+# else
+# define U_INLINE @U_INLINE@
+# endif
#endif
#define U_ALIGN_CODE(n)
diff --git a/icuSources/common/unicode/ppalmos.h b/icuSources/common/unicode/ppalmos.h
new file mode 100644
index 00000000..c15b2cea
--- /dev/null
+++ b/icuSources/common/unicode/ppalmos.h
@@ -0,0 +1,273 @@
+/*
+******************************************************************************
+*
+* Copyright (C) 1997-2006, International Business Machines
+* Corporation and others. All Rights Reserved.
+*
+******************************************************************************
+*
+* FILE NAME : ppalmos.h
+*
+* Date Name Description
+* 05/10/04 Ken Krugler Creation (copied from pwin32.h & modified).
+******************************************************************************
+*/
+
+#ifndef U_PPALMOS_H
+#define U_PPALMOS_H
+
+ /**
+ * \file
+ * \brief Configuration constants for the Palm OS platform
+ */
+
+/* Define the platform we're on. */
+#ifndef U_PALMOS
+#define U_PALMOS
+#endif
+
+/* _MSC_VER is used to detect the Microsoft compiler. */
+#if defined(_MSC_VER)
+#define U_INT64_IS_LONG_LONG 0
+#else
+#define U_INT64_IS_LONG_LONG 1
+#endif
+
+/* Define whether inttypes.h is available */
+#ifndef U_HAVE_INTTYPES_H
+#define U_HAVE_INTTYPES_H 1
+#endif
+
+/*
+ * Define what support for C++ streams is available.
+ * If U_IOSTREAM_SOURCE is set to 199711, then is available
+ * (1997711 is the date the ISO/IEC C++ FDIS was published), and then
+ * one should qualify streams using the std namespace in ICU header
+ * files.
+ * If U_IOSTREAM_SOURCE is set to 198506, then is
+ * available instead (198506 is the date when Stroustrup published
+ * "An Extensible I/O Facility for C++" at the summer USENIX conference).
+ * If U_IOSTREAM_SOURCE is 0, then C++ streams are not available and
+ * support for them will be silently suppressed in ICU.
+ *
+ */
+
+#ifndef U_IOSTREAM_SOURCE
+#define U_IOSTREAM_SOURCE 199711
+#endif
+
+/* Determines whether specific types are available */
+#ifndef U_HAVE_INT8_T
+#define U_HAVE_INT8_T U_HAVE_INTTYPES_H
+#endif
+
+#ifndef U_HAVE_UINT8_T
+#define U_HAVE_UINT8_T U_HAVE_INTTYPES_H
+#endif
+
+#ifndef U_HAVE_INT16_T
+#define U_HAVE_INT16_T U_HAVE_INTTYPES_H
+#endif
+
+#ifndef U_HAVE_UINT16_T
+#define U_HAVE_UINT16_T U_HAVE_INTTYPES_H
+#endif
+
+#ifndef U_HAVE_INT32_T
+#define U_HAVE_INT32_T U_HAVE_INTTYPES_H
+#endif
+
+#ifndef U_HAVE_UINT32_T
+#define U_HAVE_UINT32_T U_HAVE_INTTYPES_H
+#endif
+
+#ifndef U_HAVE_INT64_T
+#define U_HAVE_INT64_T U_HAVE_INTTYPES_H
+#endif
+
+#ifndef U_HAVE_UINT64_T
+#define U_HAVE_UINT64_T U_HAVE_INTTYPES_H
+#endif
+
+
+/*===========================================================================*/
+/* Generic data types */
+/*===========================================================================*/
+
+/* If your platform does not have the header, you may
+ need to edit the typedefs below. */
+#if U_HAVE_INTTYPES_H
+#include
+#else /* U_HAVE_INTTYPES_H */
+
+#if ! U_HAVE_INT8_T
+typedef signed char int8_t;
+#endif
+
+#if ! U_HAVE_UINT8_T
+typedef unsigned char uint8_t;
+#endif
+
+#if ! U_HAVE_INT16_T
+typedef signed short int16_t;
+#endif
+
+#if ! U_HAVE_UINT16_T
+typedef unsigned short uint16_t;
+#endif
+
+#if ! U_HAVE_INT32_T
+typedef signed int int32_t;
+#endif
+
+#if ! U_HAVE_UINT32_T
+typedef unsigned int uint32_t;
+#endif
+
+#if ! U_HAVE_INT64_T
+#if U_INT64_IS_LONG_LONG
+ typedef signed long long int64_t;
+#else
+ typedef signed __int64 int64_t;
+#endif
+#endif
+
+#if ! U_HAVE_UINT64_T
+#if U_INT64_IS_LONG_LONG
+ typedef unsigned long long uint64_t;
+#else
+ typedef unsigned __int64 uint64_t;
+#endif
+#endif
+#endif
+
+/*===========================================================================*/
+/* Compiler and environment features */
+/*===========================================================================*/
+
+/* Define whether namespace is supported */
+#ifndef U_HAVE_NAMESPACE
+#define U_HAVE_NAMESPACE 1
+#endif
+
+/* Determines the endianness of the platform */
+#define U_IS_BIG_ENDIAN 0
+
+/* 1 or 0 to enable or disable threads. If undefined, default is: enable threads. */
+#define ICU_USE_THREADS 1
+
+#ifndef U_DEBUG
+#ifdef _DEBUG
+#define U_DEBUG 1
+#else
+#define U_DEBUG 0
+#endif
+#endif
+
+#ifndef U_RELEASE
+#ifdef NDEBUG
+#define U_RELEASE 1
+#else
+#define U_RELEASE 0
+#endif
+#endif
+
+/* Determine whether to disable renaming or not. This overrides the
+ setting in umachine.h which is for all platforms. */
+#ifndef U_DISABLE_RENAMING
+#define U_DISABLE_RENAMING 0
+#endif
+
+/* Determine whether to override new and delete. */
+#ifndef U_OVERRIDE_CXX_ALLOCATION
+#define U_OVERRIDE_CXX_ALLOCATION 1
+#endif
+/* Determine whether to override placement new and delete for STL. */
+#ifndef U_HAVE_PLACEMENT_NEW
+#define U_HAVE_PLACEMENT_NEW 0
+#endif
+/* Determine whether to override new and delete for MFC. */
+#if !defined(U_HAVE_DEBUG_LOCATION_NEW) && defined(_MSC_VER)
+#define U_HAVE_DEBUG_LOCATION_NEW 0
+#endif
+
+/* Determine whether to enable tracing. */
+#ifndef U_ENABLE_TRACING
+#define U_ENABLE_TRACING 1
+#endif
+
+/* Do we allow ICU users to use the draft APIs by default? */
+#ifndef U_DEFAULT_SHOW_DRAFT
+#define U_DEFAULT_SHOW_DRAFT 1
+#endif
+
+/* Define the library suffix in a C syntax. */
+#define U_HAVE_LIB_SUFFIX 0
+#define U_LIB_SUFFIX_C_NAME
+#define U_LIB_SUFFIX_C_NAME_STRING ""
+
+/*===========================================================================*/
+/* Information about wchar support */
+/*===========================================================================*/
+
+#define U_HAVE_WCHAR_H 1
+#define U_SIZEOF_WCHAR_T 2
+
+#define U_HAVE_WCSCPY 0
+
+/*===========================================================================*/
+/* Information about POSIX support */
+/*===========================================================================*/
+
+
+/* TODO: Fix Palm OS's determination of a timezone */
+#if 0
+#define U_TZSET _tzset
+#endif
+#if 0
+#define U_TIMEZONE _timezone
+#endif
+#if 0
+#define U_TZNAME _tzname
+#endif
+
+#define U_HAVE_MMAP 0
+#define U_HAVE_POPEN 0
+
+/*===========================================================================*/
+/* Symbol import-export control */
+/*===========================================================================*/
+
+#define U_EXPORT
+#define U_EXPORT2
+#define U_IMPORT
+
+/*===========================================================================*/
+/* Code alignment and C function inlining */
+/*===========================================================================*/
+
+#ifndef U_INLINE
+# ifdef __cplusplus
+# define U_INLINE inline
+# else
+# define U_INLINE __inline
+# endif
+#endif
+
+#if defined(_MSC_VER) && defined(_M_IX86)
+#define U_ALIGN_CODE(val) __asm align val
+#else
+#define U_ALIGN_CODE(val)
+#endif
+
+
+/*===========================================================================*/
+/* Programs used by ICU code */
+/*===========================================================================*/
+
+#ifndef U_MAKE
+#define U_MAKE "nmake"
+#define U_MAKE_IS_NMAKE 1
+#endif
+
+#endif
diff --git a/icuSources/common/unicode/putil.h b/icuSources/common/unicode/putil.h
index 685df530..bdb385c7 100644
--- a/icuSources/common/unicode/putil.h
+++ b/icuSources/common/unicode/putil.h
@@ -1,7 +1,7 @@
/*
******************************************************************************
*
-* Copyright (C) 1997-2004, International Business Machines
+* Copyright (C) 1997-2005, International Business Machines
* Corporation and others. All Rights Reserved.
*
******************************************************************************
@@ -25,7 +25,11 @@
#define PUTIL_H
#include "unicode/utypes.h"
-
+ /**
+ * \file
+ * \brief C API: Platform Utilities
+ */
+
/* Define this to 1 if your platform supports IEEE 754 floating point,
to 0 if it does not. */
#ifndef IEEE_754
@@ -118,7 +122,7 @@ U_INTERNAL const char* U_EXPORT2 uprv_getDefaultLocaleID(void);
# define U_FILE_SEP_STRING ":"
# define U_FILE_ALT_SEP_STRING ":"
# define U_PATH_SEP_STRING ";"
-#elif defined(WIN32) || defined(OS2)
+#elif defined(U_WINDOWS)
# define U_FILE_SEP_CHAR '\\'
# define U_FILE_ALT_SEP_CHAR '/'
# define U_PATH_SEP_CHAR ';'
diff --git a/icuSources/common/unicode/pwin32.h b/icuSources/common/unicode/pwin32.h
index 5d500326..198ce8e3 100644
--- a/icuSources/common/unicode/pwin32.h
+++ b/icuSources/common/unicode/pwin32.h
@@ -1,7 +1,7 @@
/*
******************************************************************************
*
-* Copyright (C) 1997-2004, International Business Machines
+* Copyright (C) 1997-2006, International Business Machines
* Corporation and others. All Rights Reserved.
*
******************************************************************************
@@ -16,9 +16,14 @@
******************************************************************************
*/
+ /**
+ * \file
+ * \brief Configuration constants for the Windows platform
+ */
+
/* Define the platform we're on. */
-#ifndef WIN32
-#define WIN32
+#ifndef U_WINDOWS
+#define U_WINDOWS
#endif
#if defined(__BORLANDC__)
@@ -27,6 +32,13 @@
#define __STDC_CONSTANT_MACROS
#endif
+/* _MSC_VER is used to detect the Microsoft compiler. */
+#if defined(_MSC_VER)
+#define U_INT64_IS_LONG_LONG 0
+#else
+#define U_INT64_IS_LONG_LONG 1
+#endif
+
/* Define whether inttypes.h is available */
#ifndef U_HAVE_INTTYPES_H
#define U_HAVE_INTTYPES_H 0
@@ -84,8 +96,15 @@
#endif
/* Define 64 bit limits */
-#define INT64_C(x) ((int64_t)x)
-#define UINT64_C(x) ((uint64_t)x)
+#if !U_INT64_IS_LONG_LONG
+# ifndef INT64_C
+# define INT64_C(x) ((int64_t)x)
+# endif
+# ifndef UINT64_C
+# define UINT64_C(x) ((uint64_t)x)
+# endif
+/* else use the umachine.h definition */
+#endif
/*===========================================================================*/
/* Generic data types */
@@ -122,20 +141,18 @@ typedef unsigned int uint32_t;
#endif
#if ! U_HAVE_INT64_T
-/* _MSC_VER is used to detect the Microsoft compiler. */
-#ifdef _MSC_VER
- typedef signed __int64 int64_t;
-#else
+#if U_INT64_IS_LONG_LONG
typedef signed long long int64_t;
+#else
+ typedef signed __int64 int64_t;
#endif
#endif
#if ! U_HAVE_UINT64_T
-/* _MSC_VER is used to detect the Microsoft compiler. */
-#ifdef _MSC_VER
- typedef unsigned __int64 uint64_t;
-#else
+#if U_INT64_IS_LONG_LONG
typedef unsigned long long uint64_t;
+#else
+ typedef unsigned __int64 uint64_t;
#endif
#endif
#endif
@@ -155,8 +172,14 @@ typedef unsigned int uint32_t;
/* 1 or 0 to enable or disable threads. If undefined, default is: enable threads. */
#define ICU_USE_THREADS 1
-/* Windows currently only runs on x86 CPUs which currently all have strong memory models. */
+/* On strong memory model CPUs (e.g. x86 CPUs), we use a safe & quick double check mutex lock. */
+/*
+Microsoft can define _M_IX86, _M_AMD64 (before Visual Studio 8) or _M_X64 (starting in Visual Studio 8).
+Intel can define _M_IX86 or _M_X64
+*/
+#if defined(_M_IX86) || defined(_M_AMD64) || defined(_M_X64) || (defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__)))
#define UMTX_STRONG_MEMORY_MODEL 1
+#endif
#ifndef U_DEBUG
#ifdef _DEBUG
@@ -173,6 +196,7 @@ typedef unsigned int uint32_t;
#define U_RELEASE 0
#endif
#endif
+
/* Determine whether to disable renaming or not. This overrides the
setting in umachine.h which is for all platforms. */
#ifndef U_DISABLE_RENAMING
@@ -187,12 +211,21 @@ typedef unsigned int uint32_t;
#ifndef U_HAVE_PLACEMENT_NEW
#define U_HAVE_PLACEMENT_NEW 1
#endif
+/* Determine whether to override new and delete for MFC. */
+#if !defined(U_HAVE_DEBUG_LOCATION_NEW) && defined(_MSC_VER)
+#define U_HAVE_DEBUG_LOCATION_NEW 1
+#endif
/* Determine whether to enable tracing. */
#ifndef U_ENABLE_TRACING
#define U_ENABLE_TRACING 1
#endif
+/* Do we allow ICU users to use the draft APIs by default? */
+#ifndef U_DEFAULT_SHOW_DRAFT
+#define U_DEFAULT_SHOW_DRAFT 1
+#endif
+
/* Define the library suffix in a C syntax. */
#define U_HAVE_LIB_SUFFIX 0
#define U_LIB_SUFFIX_C_NAME
@@ -211,12 +244,15 @@ typedef unsigned int uint32_t;
/* Information about POSIX support */
/*===========================================================================*/
+#if 1
#define U_TZSET _tzset
-#define U_HAVE_TIMEZONE 1
-#if U_HAVE_TIMEZONE
-# define U_TIMEZONE _timezone
#endif
+#if 1
+#define U_TIMEZONE _timezone
+#endif
+#if 1
#define U_TZNAME _tzname
+#endif
#define U_HAVE_MMAP 0
#define U_HAVE_POPEN 0
@@ -238,15 +274,19 @@ typedef unsigned int uint32_t;
/*===========================================================================*/
#ifndef U_INLINE
-#define U_INLINE __inline
+# ifdef __cplusplus
+# define U_INLINE inline
+# else
+# define U_INLINE __inline
+# endif
#endif
-#if defined(_MSC_VER) && defined(_M_IX86)
+#if defined(_MSC_VER) && defined(_M_IX86) && !defined(_MANAGED)
#define U_ALIGN_CODE(val) __asm align val
#else
#define U_ALIGN_CODE(val)
#endif
-
+
/*===========================================================================*/
/* Programs used by ICU code */
diff --git a/icuSources/common/unicode/rbbi.h b/icuSources/common/unicode/rbbi.h
index 9af38301..51bab4b1 100644
--- a/icuSources/common/unicode/rbbi.h
+++ b/icuSources/common/unicode/rbbi.h
@@ -1,6 +1,6 @@
/*
***************************************************************************
-* Copyright (C) 1999-2004 International Business Machines Corporation *
+* Copyright (C) 1999-2006 International Business Machines Corporation *
* and others. All rights reserved. *
***************************************************************************
@@ -16,11 +16,19 @@
#include "unicode/utypes.h"
+/**
+ * \file
+ * \brief C++ API: Rule Based Break Iterator
+ */
+
#if !UCONFIG_NO_BREAK_ITERATION
#include "unicode/brkiter.h"
#include "unicode/udata.h"
#include "unicode/parseerr.h"
+#include "unicode/schriter.h"
+#include "unicode/uchriter.h"
+
struct UTrie;
@@ -31,11 +39,16 @@ struct RBBIDataHeader;
class RuleBasedBreakIteratorTables;
class BreakIterator;
class RBBIDataWrapper;
+class UStack;
+class LanguageBreakEngine;
+class UnhandledEngine;
struct RBBIStateTable;
+
/**
+ *
* A subclass of BreakIterator whose behavior is specified using a list of rules.
* Instances of this class are most commonly created by the factory methods of
* BreakIterator::createWordInstance(), BreakIterator::createLineInstance(), etc.,
@@ -53,10 +66,31 @@ class U_COMMON_API RuleBasedBreakIterator : public BreakIterator {
protected:
/**
- * The character iterator through which this BreakIterator accesses the text
+ * The UText through which this BreakIterator accesses the text
* @internal
*/
- CharacterIterator* fText;
+ UText *fText;
+
+ /**
+ * A character iterator that refers to the same text as the UText, above.
+ * Only included for compatibility with old API, which was based on CharacterIterators.
+ * Value may be adopted from outside, or one of fSCharIter or fDCharIter, below.
+ */
+ CharacterIterator *fCharIter;
+
+ /**
+ * When the input text is provided by a UnicodeString, this will point to
+ * a characterIterator that wraps that data. Needed only for the
+ * implementation of getText(), a backwards compatibility issue.
+ */
+ StringCharacterIterator *fSCharIter;
+
+ /**
+ * When the input text is provided by a UText, this
+ * dummy CharacterIterator over an empty string will
+ * be returned from getText()
+ */
+ UCharCharacterIterator *fDCharIter;
/**
* The rule data for this BreakIterator instance
@@ -79,20 +113,58 @@ protected:
/**
* Counter for the number of characters encountered with the "dictionary"
- * flag set. Normal RBBI iterators don't use it, although the code
- * for updating it is live. Dictionary Based break iterators (a subclass
- * of us) access this field directly.
+ * flag set.
* @internal
*/
- uint32_t fDictionaryCharCount;
+ uint32_t fDictionaryCharCount;
/**
- * Debugging flag. Trace operation of state machine when true.
+ * When a range of characters is divided up using the dictionary, the break
+ * positions that are discovered are stored here, preventing us from having
+ * to use either the dictionary or the state table again until the iterator
+ * leaves this range of text. Has the most impact for line breaking.
* @internal
*/
- static UBool fTrace;
+ int32_t* fCachedBreakPositions;
+ /**
+ * The number of elements in fCachedBreakPositions
+ * @internal
+ */
+ int32_t fNumCachedBreakPositions;
+ /**
+ * if fCachedBreakPositions is not null, this indicates which item in the
+ * cache the current iteration position refers to
+ * @internal
+ */
+ int32_t fPositionInCache;
+
+ /**
+ *
+ * If present, UStack of LanguageBreakEngine objects that might handle
+ * dictionary characters. Searched from top to bottom to find an object to
+ * handle a given character.
+ * @internal
+ */
+ UStack *fLanguageBreakEngines;
+
+ /**
+ *
+ * If present, the special LanguageBreakEngine used for handling
+ * characters that are in the dictionary set, but not handled by any
+ * LangugageBreakEngine.
+ * @internal
+ */
+ UnhandledEngine *fUnhandledBreakEngine;
+
+ /**
+ *
+ * The type of the break iterator, or -1 if it has not been set.
+ * @internal
+ */
+ int32_t fBreakType;
+
protected:
//=======================================================================
// constructors
@@ -110,7 +182,9 @@ protected:
*/
RuleBasedBreakIterator(RBBIDataHeader* data, UErrorCode &status);
- friend class RBBIRuleBuilder; /** @internal */
+
+ friend class RBBIRuleBuilder;
+ /** @internal */
friend class BreakIterator;
@@ -154,7 +228,7 @@ public:
* @param status Information on any errors encountered.
* @see udata_open
* @see #getBinaryRules
- * @draft ICU 2.8
+ * @stable ICU 2.8
*/
RuleBasedBreakIterator(UDataMemory* image, UErrorCode &status);
@@ -223,15 +297,48 @@ public:
//=======================================================================
/**
- * Return a CharacterIterator over the text being analyzed. This version
- * of this method returns the actual CharacterIterator we're using internally.
- * Changing the state of this iterator can have undefined consequences. If
- * you need to change it, clone it first.
+ *
+ * Return a CharacterIterator over the text being analyzed.
+ * The returned character iterator is owned by the break iterator, and must
+ * not be deleted by the caller. Repeated calls to this function may
+ * return the same CharacterIterator.
+ *
+ *
+ * The returned character iterator must not be used concurrently with
+ * the break iterator. If concurrent operation is needed, clone the
+ * returned character iterator first and operate on the clone.
+ *
+ *
+ * When the break iterator is operating on text supplied via a UText,
+ * this function will fail. Lacking any way to signal failures, it
+ * returns an CharacterIterator containing no text.
+ * The function getUText() provides similar functionality,
+ * is reliable, and is more efficient.
+ *
+ *
+ * TODO: deprecate this function?
+ *
* @return An iterator over the text being analyzed.
- * @stable ICU 2.0
+ * @stable ICU 2.0
*/
- virtual const CharacterIterator& getText(void) const;
+ virtual CharacterIterator& getText(void) const;
+
+ /**
+ * Get a UText for the text being analyzed.
+ * The returned UText is a shallow clone of the UText used internally
+ * by the break iterator implementation. It can safely be used to
+ * access the text without impacting any break iterator operations,
+ * but the underlying text itself must not be altered.
+ *
+ * @param fillIn A UText to be filled in. If NULL, a new UText will be
+ * allocated to hold the result.
+ * @param status receives any error codes.
+ * @return The current UText for this break iterator. If an input
+ * UText was provided, it will always be returned.
+ * @draft ICU 3.4
+ */
+ virtual UText *getUText(UText *fillIn, UErrorCode &status) const;
/**
* Set the iterator to analyze a new piece of text. This function resets
@@ -250,9 +357,23 @@ public:
*/
virtual void setText(const UnicodeString& newText);
+ /**
+ * Reset the break iterator to operate over the text represented by
+ * the UText. The iterator position is reset to the start.
+ *
+ * This function makes a shallow clone of the supplied UText. This means
+ * that the caller is free to immediately close or otherwise reuse the
+ * Utext that was passed as a parameter, but that the underlying text itself
+ * must not be altered while being referenced by the break iterator.
+ *
+ * @param text The UText used to change the text.
+ * @param status Receives any error codes.
+ * @draft ICU 3.4
+ */
+ virtual void setText(UText *text, UErrorCode &status);
+
/**
* Sets the current iteration position to the beginning of the text.
- * (i.e., the CharacterIterator's starting offset).
* @return The offset of the beginning of the text.
* @stable ICU 2.0
*/
@@ -260,7 +381,6 @@ public:
/**
* Sets the current iteration position to the end of the text.
- * (i.e., the CharacterIterator's ending offset).
* @return The text's past-the-end offset.
* @stable ICU 2.0
*/
@@ -383,7 +503,7 @@ public:
* is the total number of status values that were available,
* not the reduced number that were actually returned.
* @see getRuleStatus
- * @draft ICU 3.0
+ * @stable ICU 3.0
*/
virtual int32_t getRuleStatusVec(int32_t *fillInVec, int32_t capacity, UErrorCode &status);
@@ -466,34 +586,14 @@ protected:
//=======================================================================
// implementation
//=======================================================================
- /**
- * This method is the actual implementation of the next() method. All iteration
- * vectors through here. This method initializes the state machine to state 1
- * and advances through the text character by character until we reach the end
- * of the text or the state machine transitions to state 0. We update our return
- * value every time the state machine passes through a possible end state.
- * @internal
- */
- virtual int32_t handleNext(void);
-
- /**
- * This method backs the iterator back up to a "safe position" in the text.
- * This is a position that we know, without any context, must be a break position.
- * The various calling methods then iterate forward from this safe position to
- * the appropriate position to return. (For more information, see the description
- * of buildBackwardsStateTable() in RuleBasedBreakIterator.Builder.)
- * @internal
- */
- virtual int32_t handlePrevious(void);
-
/**
* Dumps caches and performs other actions associated with a complete change
- * in text or iteration position. This function is a no-op in RuleBasedBreakIterator,
- * but subclasses can and do override it.
+ * in text or iteration position.
* @internal
*/
virtual void reset(void);
+#if 0
/**
* Return true if the category lookup for this char
* indicates that it is in the set of dictionary lookup chars.
@@ -504,6 +604,19 @@ protected:
*/
virtual UBool isDictionaryChar(UChar32);
+ /**
+ * Get the type of the break iterator.
+ * @internal
+ */
+ virtual int32_t getBreakType() const;
+#endif
+
+ /**
+ * Set the type of the break iterator.
+ * @internal
+ */
+ virtual void setBreakType(int32_t type);
+
/**
* Common initialization function, used by constructors and bufferClone.
* (Also used by DictionaryBasedBreakIterator::createBufferClone().)
@@ -535,6 +648,34 @@ private:
*/
int32_t handleNext(const RBBIStateTable *statetable);
+protected:
+
+ /**
+ * This is the function that actually implements dictionary-based
+ * breaking. Covering at least the range from startPos to endPos,
+ * it checks for dictionary characters, and if it finds them determines
+ * the appropriate object to deal with them. It may cache found breaks in
+ * fCachedBreakPositions as it goes. It may well also look at text outside
+ * the range startPos to endPos.
+ * If going forward, endPos is the normal Unicode break result, and
+ * if goind in reverse, startPos is the normal Unicode break result
+ * @param startPos The start position of a range of text
+ * @param endPos The end position of a range of text
+ * @param reverse The call is for the reverse direction
+ * @internal
+ */
+ int32_t checkDictionary(int32_t startPos, int32_t endPos, UBool reverse);
+
+private:
+
+ /**
+ * This function returns the appropriate LanguageBreakEngine for a
+ * given character c.
+ * @param c A character in the dictionary set
+ * @internal
+ */
+ const LanguageBreakEngine *getLanguageBreakEngine(UChar32 c);
+
/**
* @internal
*/
diff --git a/icuSources/common/unicode/rep.h b/icuSources/common/unicode/rep.h
index efe3eadb..3fab6fa1 100644
--- a/icuSources/common/unicode/rep.h
+++ b/icuSources/common/unicode/rep.h
@@ -1,6 +1,6 @@
/*
**************************************************************************
-* Copyright (C) 1999-2004, International Business Machines Corporation and
+* Copyright (C) 1999-2005, International Business Machines Corporation and
* others. All Rights Reserved.
**************************************************************************
* Date Name Description
@@ -16,6 +16,11 @@
#include "unicode/uobject.h"
+/**
+ * \file
+ * \brief C++ API: Replaceable String
+ */
+
U_NAMESPACE_BEGIN
class UnicodeString;
diff --git a/icuSources/common/unicode/resbund.h b/icuSources/common/unicode/resbund.h
index 3d566e8f..ec0e620b 100644
--- a/icuSources/common/unicode/resbund.h
+++ b/icuSources/common/unicode/resbund.h
@@ -1,8 +1,8 @@
/*
******************************************************************************
*
-* Copyright (C) 1996-2004, International Business Machines
-* Corporation and others. All Rights Reserved.
+* Copyright (C) 1996-2005, International Business Machines Corporation
+* and others. All Rights Reserved.
*
******************************************************************************
*
@@ -52,6 +52,11 @@
#include "unicode/unistr.h"
#include "unicode/locid.h"
+/**
+ * \file
+ * \brief C++ API: Resource Bundle
+ */
+
U_NAMESPACE_BEGIN
/**
@@ -61,9 +66,9 @@ U_NAMESPACE_BEGIN
* locale and then ask it for individual resources.
*
* Resource bundles in ICU4C are currently defined using text files which conform to the following
- * BNF definition.
+ * BNF definition.
* More on resource bundle concepts and syntax can be found in the
- * Users Guide.
+ * Users Guide.
*
*
* The ResourceBundle class is not suitable for subclassing.
@@ -75,13 +80,11 @@ public:
/**
* Constructor
*
- * @param path This is a full pathname in the platform-specific format for the
- * directory containing the resource data files we want to load
- * resources from. We use locale IDs to generate filenames, and the
- * filenames have this string prepended to them before being passed
- * to the C++ I/O functions. Therefore, this string must always end
- * with a directory delimiter (whatever that is for the target OS)
- * for this class to work correctly.
+ * @param packageName The packageName and locale together point to an ICU udata object,
+ * as defined by udata_open( packageName, "res", locale, err)
+ * or equivalent. Typically, packageName will refer to a (.dat) file, or to
+ * a package registered with udata_setAppData(). Using a full file or directory
+ * pathname for packageName is deprecated.
* @param locale This is the locale this resource bundle is for. To get resources
* for the French locale, for example, you would create a
* ResourceBundle passing Locale::FRENCH for the "locale" parameter,
@@ -100,22 +103,26 @@ public:
* fall back locales could be found.
* @stable ICU 2.0
*/
- ResourceBundle(const UnicodeString& path,
+ ResourceBundle(const UnicodeString& packageName,
const Locale& locale,
UErrorCode& err);
/**
- * Construct a resource bundle for the root bundle in the specified path.
+ * Construct a resource bundle for the default bundle in the specified package.
*
- * @param path A path/basename for the data file(s) containing the bundle.
+ * @param packageName The packageName and locale together point to an ICU udata object,
+ * as defined by udata_open( packageName, "res", locale, err)
+ * or equivalent. Typically, packageName will refer to a (.dat) file, or to
+ * a package registered with udata_setAppData(). Using a full file or directory
+ * pathname for packageName is deprecated.
* @param err A UErrorCode value
* @stable ICU 2.0
*/
- ResourceBundle(const UnicodeString& path,
+ ResourceBundle(const UnicodeString& packageName,
UErrorCode& err);
/**
- * Construct a resource bundle for the ICU root bundle.
+ * Construct a resource bundle for the ICU default bundle.
*
* @param err A UErrorCode value
* @stable ICU 2.0
@@ -124,15 +131,19 @@ public:
/**
* Standard constructor, onstructs a resource bundle for the locale-specific
- * bundle in the specified path.
- *
- * @param path A path/basename for the data file(s) containing the bundle.
- * NULL is used for ICU data.
+ * bundle in the specified package.
+ *
+ * @param packageName The packageName and locale together point to an ICU udata object,
+ * as defined by udata_open( packageName, "res", locale, err)
+ * or equivalent. Typically, packageName will refer to a (.dat) file, or to
+ * a package registered with udata_setAppData(). Using a full file or directory
+ * pathname for packageName is deprecated.
+ * NULL is used to refer to ICU data.
* @param locale The locale for which to open a resource bundle.
* @param err A UErrorCode value
* @stable ICU 2.0
*/
- ResourceBundle(const char* path,
+ ResourceBundle(const char* packageName,
const Locale& locale,
UErrorCode& err);
@@ -179,7 +190,7 @@ public:
* @return a clone of this object
*
* @see getDynamicClassID
- * @draft ICU 2.8
+ * @stable ICU 2.8
*/
ResourceBundle *clone() const;
@@ -437,7 +448,7 @@ public:
* @param status just for catching illegal arguments
*
* @return a Locale object
- * @draft ICU 2.8
+ * @stable ICU 2.8
*/
const Locale
getLocale(ULocDataLocaleType type, UErrorCode &status) const;
diff --git a/icuSources/common/unicode/schriter.h b/icuSources/common/unicode/schriter.h
index df8cd300..d0b5e225 100644
--- a/icuSources/common/unicode/schriter.h
+++ b/icuSources/common/unicode/schriter.h
@@ -1,7 +1,7 @@
/*
******************************************************************************
*
-* Copyright (C) 1998-2004, International Business Machines
+* Copyright (C) 1998-2005, International Business Machines
* Corporation and others. All Rights Reserved.
*
******************************************************************************
@@ -22,6 +22,11 @@
#include "unicode/chariter.h"
#include "unicode/uchriter.h"
+/**
+ * \file
+ * \brief C++ API: String Character Iterator
+ */
+
U_NAMESPACE_BEGIN
/**
* A concrete subclass of CharacterIterator that iterates over the
diff --git a/icuSources/common/unicode/strenum.h b/icuSources/common/unicode/strenum.h
index 4f6ce02d..5e956430 100644
--- a/icuSources/common/unicode/strenum.h
+++ b/icuSources/common/unicode/strenum.h
@@ -1,7 +1,7 @@
/*
*******************************************************************************
*
-* Copyright (C) 2002-2004, International Business Machines
+* Copyright (C) 2002-2006, International Business Machines
* Corporation and others. All Rights Reserved.
*
*******************************************************************************
@@ -13,6 +13,11 @@
#include "unicode/uobject.h"
#include "unicode/unistr.h"
+/**
+ * \file
+ * \brief C++ API: String Enumeration
+ */
+
U_NAMESPACE_BEGIN
/**
@@ -68,7 +73,7 @@ public:
* @return a clone of this object
*
* @see getDynamicClassID
- * @draft ICU 2.8
+ * @stable ICU 2.8
*/
virtual StringEnumeration *clone() const;
@@ -179,32 +184,49 @@ public:
*/
virtual void reset(UErrorCode& status) = 0;
+ /**
+ * Compares this enumeration to other to check if both are equal
+ *
+ * @param that The other string enumeration to compare this object to
+ * @return TRUE if the enumerations are equal. FALSE if not.
+ * @draft ICU 3.6
+ */
+ virtual UBool operator==(const StringEnumeration& that)const;
+ /**
+ * Compares this enumeration to other to check if both are not equal
+ *
+ * @param that The other string enumeration to compare this object to
+ * @return TRUE if the enumerations are equal. FALSE if not.
+ * @draft ICU 3.6
+ */
+ virtual UBool operator!=(const StringEnumeration& that)const;
+
protected:
/**
* UnicodeString field for use with default implementations and subclasses.
- * @draft ICU 2.8
+ * @stable ICU 2.8
*/
UnicodeString unistr;
/**
* char * default buffer for use with default implementations and subclasses.
- * @draft ICU 2.8
+ * @stable ICU 2.8
*/
char charsBuffer[32];
/**
* char * buffer for use with default implementations and subclasses.
* Allocated in constructor and in ensureCharsCapacity().
- * @draft ICU 2.8
+ * @stable ICU 2.8
*/
char *chars;
/**
* Capacity of chars, for use with default implementations and subclasses.
- * @draft ICU 2.8
+ * @stable ICU 2.8
*/
int32_t charsCapacity;
/**
* Default constructor for use with default implementations and subclasses.
- * @draft ICU 2.8
+ * @stable ICU 2.8
*/
StringEnumeration();
@@ -214,7 +236,7 @@ protected:
*
* @param capacity Requested capacity.
* @param status ICU in/out error code.
- * @draft ICU 2.8
+ * @stable ICU 2.8
*/
void ensureCharsCapacity(int32_t capacity, UErrorCode &status);
@@ -238,7 +260,7 @@ protected:
* @param length Length of the string.
* @param status ICU in/out error code.
* @return A pointer to unistr.
- * @draft ICU 2.8
+ * @stable ICU 2.8
*/
UnicodeString *setChars(const char *s, int32_t length, UErrorCode &status);
};
diff --git a/icuSources/common/unicode/symtable.h b/icuSources/common/unicode/symtable.h
index 27094030..428f8bff 100644
--- a/icuSources/common/unicode/symtable.h
+++ b/icuSources/common/unicode/symtable.h
@@ -1,6 +1,6 @@
/*
**********************************************************************
-* Copyright (c) 2000-2004, International Business Machines
+* Copyright (c) 2000-2005, International Business Machines
* Corporation and others. All Rights Reserved.
**********************************************************************
* Date Name Description
@@ -13,6 +13,12 @@
#include "unicode/utypes.h"
#include "unicode/uobject.h"
+/**
+ * \file
+ * \brief C++ API: An interface that defines both lookup protocol and parsing of
+ * symbolic names.
+ */
+
U_NAMESPACE_BEGIN
class ParsePosition;
@@ -43,20 +49,20 @@ class UnicodeString;
* with the position immediately following the SYMBOL_REF. The symbol
* table parses the name, if there is one, and returns it.
*
- * @draft ICU 2.8
+ * @stable ICU 2.8
*/
class U_COMMON_API SymbolTable /* not : public UObject because this is an interface/mixin class */ {
public:
/**
* The character preceding a symbol reference name.
- * @draft ICU 2.8
+ * @stable ICU 2.8
*/
enum { SYMBOL_REF = 0x0024 /*$*/ };
/**
* Destructor.
- * @draft ICU 2.8
+ * @stable ICU 2.8
*/
virtual ~SymbolTable();
@@ -67,7 +73,7 @@ public:
* @param s the symbolic name to lookup
* @return a string containing the name's value, or NULL if
* there is no mapping for s.
- * @draft ICU 2.8
+ * @stable ICU 2.8
*/
virtual const UnicodeString* lookup(const UnicodeString& s) const = 0;
@@ -77,7 +83,7 @@ public:
* @param ch a 32-bit code point from 0 to 0x10FFFF inclusive.
* @return the UnicodeMatcher object represented by the given
* character, or NULL if there is no mapping for ch.
- * @draft ICU 2.8
+ * @stable ICU 2.8
*/
virtual const UnicodeFunctor* lookupMatcher(UChar32 ch) const = 0;
@@ -96,7 +102,7 @@ public:
* @param limit the index after the last character to be parsed.
* @return the parsed name, or an empty string if there is no
* valid symbolic name at the given position.
- * @draft ICU 2.8
+ * @stable ICU 2.8
*/
virtual UnicodeString parseReference(const UnicodeString& text,
ParsePosition& pos, int32_t limit) const = 0;
diff --git a/icuSources/common/unicode/ubidi.h b/icuSources/common/unicode/ubidi.h
index a0528d21..71d181ca 100644
--- a/icuSources/common/unicode/ubidi.h
+++ b/icuSources/common/unicode/ubidi.h
@@ -1,7 +1,7 @@
/*
******************************************************************************
*
-* Copyright (C) 1999-2004, International Business Machines
+* Copyright (C) 1999-2006, International Business Machines
* Corporation and others. All Rights Reserved.
*
******************************************************************************
@@ -20,20 +20,6 @@
#include "unicode/utypes.h"
#include "unicode/uchar.h"
-/*
- * javadoc-style comments are intended to be transformed into HTML
- * using DOC++ - see
- * http://www.zib.de/Visual/software/doc++/index.html .
- *
- * The HTML documentation is created with
- * doc++ -H ubidi.h
- *
- * The following #define trick allows us to do it all in one file
- * and still be able to compile it.
- */
-/*#define DOCXX_TAG*/
-/*#define BIDI_SAMPLE_CODE*/
-
/**
*\file
* \brief C API: BIDI algorithm
@@ -368,6 +354,21 @@ typedef uint8_t UBiDiLevel;
*/
#define UBIDI_LEVEL_OVERRIDE 0x80
+/**
+ * Special value which can be returned by the mapping functions when a logical
+ * index has no corresponding visual index or vice-versa. This may happen
+ * for the logical-to-visual mapping of a BiDi control when option
+ * #UBIDI_OPTION_REMOVE_CONTROLS
is specified. This can also happen
+ * for the visual-to-logical mapping of a BiDi mark (LRM or RLM) inserted
+ * by option #UBIDI_OPTION_INSERT_MARKS
.
+ * @see ubidi_getVisualIndex
+ * @see ubidi_getVisualMap
+ * @see ubidi_getLogicalIndex
+ * @see ubidi_getLogicalMap
+ * @draft ICU 3.6
+ */
+#define UBIDI_MAP_NOWHERE (-1)
+
/**
* UBiDiDirection
values indicate the text direction.
* @stable ICU 2.0
@@ -387,11 +388,11 @@ typedef enum UBiDiDirection UBiDiDirection;
/**
* Forward declaration of the UBiDi
structure for the declaration of
* the API functions. Its fields are implementation-specific.
- * This structure holds information about a paragraph of text
- * with BiDi-algorithm-related details, or about one line of
+ * This structure holds information about a paragraph (or multiple paragraphs)
+ * of text with BiDi-algorithm-related details, or about one line of
* such a paragraph.
- * Reordering can be done on a line, or on a paragraph which is
- * then interpreted as one single line.
+ * Reordering can be done on a line, or on one or more paragraphs which are
+ * then interpreted each as one single line.
* @stable ICU 2.0
*/
struct UBiDi;
@@ -402,13 +403,14 @@ typedef struct UBiDi UBiDi;
/**
* Allocate a UBiDi
structure.
* Such an object is initially empty. It is assigned
- * the BiDi properties of a paragraph by ubidi_setPara()
- * or the BiDi properties of a line of a paragraph by
+ * the BiDi properties of a piece of text containing one or more paragraphs
+ * by ubidi_setPara()
+ * or the BiDi properties of a line within a paragraph by
* ubidi_setLine()
.
* This object can be reused for as long as it is not deallocated
* by calling ubidi_close()
.
- * ubidi_set()
will allocate additional memory for
- * internal structures as necessary.
+ * ubidi_setPara()
and ubidi_setLine()
will allocate
+ * additional memory for internal structures as necessary.
*
* @return An empty UBiDi
object.
* @stable ICU 2.0
@@ -432,7 +434,7 @@ ubidi_open(void);
* and the internal structures that are associated with it will be allocated
* on demand, just like with ubidi_open()
.
*
- * @param maxLength is the maximum paragraph or line length that internal memory
+ * @param maxLength is the maximum text or line length that internal memory
* will be preallocated for. An attempt to associate this object with a
* longer text will fail, unless this value is 0, which leaves the allocation
* up to the implementation.
@@ -441,12 +443,11 @@ ubidi_open(void);
* that internal memory will be preallocated for. An attempt to access
* visual runs on an object that was not preallocated for as many runs
* as the text was actually resolved to will fail,
- * unless this value is 0, which leaves the allocation up to the implementation.
+ * unless this value is 0, which leaves the allocation up to the implementation.
* The number of runs depends on the actual text and maybe anywhere between
- * 1 and maxLength
. It is typically small.
+ * 1 and maxLength
. It is typically small.
*
- * @param pErrorCode must be a valid pointer to an error code value,
- * which must not indicate a failure before the function call.
+ * @param pErrorCode must be a valid pointer to an error code value.
*
* @return An empty UBiDi
object with preallocated memory.
* @stable ICU 2.0
@@ -461,8 +462,8 @@ ubidi_openSized(int32_t maxLength, int32_t maxRunCount, UErrorCode *pErrorCode);
* Important:
* A parent UBiDi
object must not be destroyed or reused if
* it still has children.
- * If a UBiDi
object is the child
- * of another one (its parent), after calling
+ * If a UBiDi
object has become the child
+ * of another one (its parent) by calling
* ubidi_setLine()
, then the child object must
* be destroyed (closed) or reused (by calling
* ubidi_setPara()
or ubidi_setLine()
)
@@ -505,12 +506,24 @@ ubidi_close(UBiDi *pBiDi);
* ubidi_getVisualRun()
gets the reordered runs, these are actually
* the runs of the logically ordered output.
*
+ * Calling this function with argument isInverse
set to
+ * TRUE
is equivalent to calling
+ * ubidi_setReorderingMode
with argument
+ * reorderingMode
+ * set to #UBIDI_REORDER_INVERSE_NUMBERS_AS_L
.
+ * Calling this function with argument isInverse
set to
+ * FALSE
is equivalent to calling
+ * ubidi_setReorderingMode
with argument
+ * reorderingMode
+ * set to #UBIDI_REORDER_DEFAULT
.
+ *
* @param pBiDi is a UBiDi
object.
*
- * @param isInverse specifies "forward" or "inverse" BiDi operation
+ * @param isInverse specifies "forward" or "inverse" BiDi operation.
*
* @see ubidi_setPara
* @see ubidi_writeReordered
+ * @see ubidi_setReorderingMode
* @stable ICU 2.0
*/
U_STABLE void U_EXPORT2
@@ -518,27 +531,438 @@ ubidi_setInverse(UBiDi *pBiDi, UBool isInverse);
/**
* Is this BiDi object set to perform the inverse BiDi algorithm?
+ *
Note: calling this function after setting the reordering mode with
+ * ubidi_setReorderingMode
will return TRUE
if the
+ * reordering mode was set to #UBIDI_REORDER_INVERSE_NUMBERS_AS_L
,
+ * FALSE
for all other values.
*
* @param pBiDi is a UBiDi
object.
- * @return TRUE if the BiDi object set to perform the inverse BiDi algorithm
+ * @return TRUE if the BiDi object is set to perform the inverse BiDi algorithm
+ * by handling numbers as L.
*
* @see ubidi_setInverse
+ * @see ubidi_setReorderingMode
* @stable ICU 2.0
*/
+
U_STABLE UBool U_EXPORT2
ubidi_isInverse(UBiDi *pBiDi);
+/**
+ * Specify whether block separators must be allocated level zero,
+ * so that successive paragraphs will progress from left to right.
+ * This function must be called before ubidi_setPara()
.
+ * Paragraph separators (B) may appear in the text. Setting them to level zero
+ * means that all paragraph separators (including one possibly appearing
+ * in the last text position) are kept in the reordered text after the text
+ * that they follow in the source text.
+ * When this feature is not enabled, a paragraph separator at the last
+ * position of the text before reordering will go to the first position
+ * of the reordered text when the paragraph level is odd.
+ *
+ * @param pBiDi is a UBiDi
object.
+ *
+ * @param orderParagraphsLTR specifies whether paragraph separators (B) must
+ * receive level 0, so that successive paragraphs progress from left to right.
+ *
+ * @see ubidi_setPara
+ * @stable ICU 3.4
+ */
+U_STABLE void U_EXPORT2
+ubidi_orderParagraphsLTR(UBiDi *pBiDi, UBool orderParagraphsLTR);
+
+/**
+ * Is this BiDi object set to allocate level 0 to block separators so that
+ * successive paragraphs progress from left to right?
+ *
+ * @param pBiDi is a UBiDi
object.
+ * @return TRUE if the BiDi object is set to allocate level 0 to block
+ * separators.
+ *
+ * @see ubidi_orderParagraphsLTR
+ * @stable ICU 3.4
+ */
+U_STABLE UBool U_EXPORT2
+ubidi_isOrderParagraphsLTR(UBiDi *pBiDi);
+
+/**
+ * UBiDiReorderingMode
values indicate which variant of the BiDi
+ * algorithm to use.
+ *
+ * @see ubidi_setReorderingMode
+ * @draft ICU 3.6
+ */
+typedef enum UBiDiReorderingMode {
+ /** Regular Logical to Visual BiDi algorithm according to Unicode.
+ * This is a 0 value. @draft ICU 3.6 */
+ UBIDI_REORDER_DEFAULT = 0,
+ /** Logical to Visual algorithm which handles numbers in a way which
+ * mimicks the behavior of Windows XP.
+ * @draft ICU 3.6 */
+ UBIDI_REORDER_NUMBERS_SPECIAL,
+ /** Logical to Visual algorithm grouping numbers with adjacent R characters
+ * (reversible algorithm).
+ * @draft ICU 3.6 */
+ UBIDI_REORDER_GROUP_NUMBERS_WITH_R,
+ /** Reorder runs only to transform a Logical LTR string to the Logical RTL
+ * string with the same display, or vice-versa.
+ * If this mode is set together with option
+ * #UBIDI_OPTION_INSERT_MARKS
, some BiDi controls in the source
+ * text may be removed and other controls may be added to produce the
+ * minimum combination which has the required display.
+ * @draft ICU 3.6 */
+ UBIDI_REORDER_RUNS_ONLY,
+ /** Visual to Logical algorithm which handles numbers like L
+ * (same algorithm as selected by ubidi_setInverse(TRUE)
.
+ * @see ubidi_setInverse
+ * @draft ICU 3.6 */
+ UBIDI_REORDER_INVERSE_NUMBERS_AS_L,
+ /** Visual to Logical algorithm equivalent to the regular Logical to Visual
+ * algorithm. @draft ICU 3.6 */
+ UBIDI_REORDER_INVERSE_LIKE_DIRECT,
+ /** Inverse BiDi (Visual to Logical) algorithm for the
+ * UBIDI_REORDER_NUMBERS_SPECIAL
BiDi algorithm.
+ * @draft ICU 3.6 */
+ UBIDI_REORDER_INVERSE_FOR_NUMBERS_SPECIAL,
+ /** Number of values for reordering mode.
+ * @draft ICU 3.6 */
+ UBIDI_REORDER_COUNT
+} UBiDiReorderingMode;
+
+/**
+ * Modify the operation of the BiDi algorithm such that it implements some
+ * variant to the basic BiDi algorithm or approximates an "inverse BiDi"
+ * algorithm, depending on different values of the "reordering mode".
+ * This function must be called before ubidi_setPara()
, and stays
+ * in effect until called again with a different argument.
+ *
+ * The normal operation of the BiDi algorithm as described
+ * in the Unicode Standard Annex #9 is to take text stored in logical
+ * (keyboard, typing) order and to determine how to reorder it for visual
+ * rendering.
+ *
+ * With the reordering mode set to a value other than
+ * #UBIDI_REORDER_DEFAULT
, this function changes the behavior of
+ * some of the subsequent functions in a way such that they implement an
+ * inverse BiDi algorithm or some other algorithm variants.
+ *
+ * Some legacy systems store text in visual order, and for operations
+ * with standard, Unicode-based algorithms, the text needs to be transformed
+ * into logical order. This is effectively the inverse algorithm of the
+ * described BiDi algorithm. Note that there is no standard algorithm for
+ * this "inverse BiDi", so a number of variants are implemented here.
+ *
+ * In other cases, it may be desirable to emulate some variant of the
+ * Logical to Visual algorithm (e.g. one used in MS Windows), or perform a
+ * Logical to Logical transformation.
+ *
+ *
+ * - When the reordering mode is set to
#UBIDI_REORDER_DEFAULT
,
+ * the standard BiDi Logical to Visual algorithm is applied.
+ *
+ * - When the reordering mode is set to
+ *
#UBIDI_REORDER_NUMBERS_SPECIAL
,
+ * the algorithm used to perform BiDi transformations when calling
+ * ubidi_setPara
should approximate the algorithm used in
+ * Microsoft Windows XP rather than strictly conform to the Unicode BiDi
+ * algorithm.
+ *
+ * The differences between the basic algorithm and the algorithm addressed
+ * by this option are as follows:
+ *
+ * - Within text at an even embedding level, the sequence "123AB"
+ * (where AB represent R or AL letters) is transformed to "123BA" by the
+ * Unicode algorithm and to "BA123" by the Windows algorithm.
+ * - Arabic-Indic numbers (AN) are handled by the Windows algorithm just
+ * like regular numbers (EN).
+ *
+ *
+ * - When the reordering mode is set to
+ *
#UBIDI_REORDER_GROUP_NUMBERS_WITH_R
,
+ * numbers located between LTR text and RTL text are associated with the RTL
+ * text. For instance, an LTR paragraph with content "abc 123 DEF" (where
+ * upper case letters represent RTL characters) will be transformed to
+ * "abc FED 123" (and not "abc 123 FED"), "DEF 123 abc" will be transformed
+ * to "123 FED abc" and "123 FED abc" will be transformed to "DEF 123 abc".
+ * This makes the algorithm reversible and makes it useful when round trip
+ * (from visual to logical and back to visual) must be achieved without
+ * adding LRM characters. However, this is a variation from the standard
+ * Unicode Bidi algorithm.
+ * The source text should not contain BiDi control characters other than LRM
+ * or RLM.
+ *
+ * - When the reordering mode is set to
+ *
#UBIDI_REORDER_RUNS_ONLY
,
+ * a "Logical to Logical" transformation must be performed:
+ *
+ * - If the default text level of the source text (argument
paraLevel
+ * in ubidi_setPara
) is even, the source text will be handled as
+ * LTR logical text and will be transformed to the RTL logical text which has
+ * the same LTR visual display.
+ * - If the default level of the source text is odd, the source text
+ * will be handled as RTL logical text and will be transformed to the
+ * LTR logical text which has the same LTR visual display.
+ *
+ * This mode may be needed when logical text which is basically Arabic or
+ * Hebrew, with possible included numbers or phrases in English, has to be
+ * displayed as if it had an even embedding level (this can happen if the
+ * displaying application treats all text as if it was basically LTR.
+ *
+ * This mode may also be needed in the reverse case, when logical text which is
+ * basically English, with possible included phrases in Arabic or Hebrew, has to
+ * be displayed as if it had an odd embedding level.
+ *
+ * Both cases could be handled by adding LRE or RLE at the head of the text,
+ * if the display subsystem supports these formatting controls. If it does not,
+ * the problem may be handled by transforming the source text in this mode
+ * before displaying it, so that it will be displayed properly.
+ * The source text should not contain BiDi control characters other than LRM
+ * or RLM.
+ *
+ * - When the reordering mode is set to
+ *
#UBIDI_REORDER_INVERSE_NUMBERS_AS_L
, an "inverse BiDi" algorithm
+ * is applied.
+ * Runs of text with numeric characters will be treated like LTR letters and
+ * may need to be surrounded with LRM characters when they are written in
+ * reordered sequence (the option #UBIDI_INSERT_LRM_FOR_NUMERIC
can
+ * be used with function ubidi_writeReordered
to this end. This
+ * mode is equivalent to calling ubidi_setInverse()
with
+ * argument isInverse
set to TRUE
.
+ *
+ * - When the reordering mode is set to
+ *
#UBIDI_REORDER_INVERSE_LIKE_DIRECT
, the "direct" Logical to Visual
+ * BiDi algorithm is used as an approximation of an "inverse BiDi" algorithm.
+ * This mode is similar to mode #UBIDI_REORDER_INVERSE_NUMBERS_AS_L
+ * but is closer to the regular BiDi algorithm.
+ *
+ * For example, an LTR paragraph with the content "FED 123 456 CBA" (where
+ * upper case represents RTL characters) will be transformed to
+ * "ABC 456 123 DEF", as opposed to "DEF 123 456 ABC"
+ * with mode UBIDI_REORDER_INVERSE_NUMBERS_AS_L
.
+ * When used in conjunction with option
+ * #UBIDI_OPTION_INSERT_MARKS
, this mode generally
+ * adds BiDi marks to the output significantly more sparingly than mode
+ * #UBIDI_REORDER_INVERSE_NUMBERS_AS_L
with option
+ * #UBIDI_INSERT_LRM_FOR_NUMERIC
in calls to
+ * ubidi_writeReordered
.
+ *
+ * - When the reordering mode is set to
+ *
#UBIDI_REORDER_INVERSE_FOR_NUMBERS_SPECIAL
, the Logical to Visual
+ * BiDi algorithm used in Windows XP is used as an approximation of an
+ * "inverse BiDi" algorithm.
+ *
+ * For example, an LTR paragraph with the content "abc FED123" (where
+ * upper case represents RTL characters) will be transformed to
+ * "abc 123DEF.
+ *
+ *
+ * In all the reordering modes specifying an "inverse BiDi" algorithm
+ * (i.e. those with a name starting with UBIDI_REORDER_INVERSE
),
+ * output runs should be retrieved using
+ * ubidi_getVisualRun()
, and the output text with
+ * ubidi_writeReordered()
. The caller should keep in mind that in
+ * "inverse BiDi" modes the input is actually visually ordered text and
+ * reordered output returned by ubidi_getVisualRun()
or
+ * ubidi_writeReordered()
are actually runs or character string
+ * of logically ordered output.
+ * For all the "inverse BiDi" modes, the source text should not contain
+ * BiDi control characters other than LRM or RLM.
+ *
+ * Note that option #UBIDI_OUTPUT_REVERSE
of
+ * ubidi_writeReordered
has no useful meaning and should not be
+ * used in conjunction with any value of the reordering mode specifying
+ * "inverse BiDi" or with value UBIDI_REORDER_RUNS_ONLY
.
+ *
+ * @param pBiDi is a UBiDi
object.
+ * @param reorderingMode specifies the required variant of the BiDi algorithm.
+ *
+ * @see UBiDiReorderingMode
+ * @see ubidi_setInverse
+ * @see ubidi_setPara
+ * @see ubidi_writeReordered
+ * @draft ICU 3.6
+ */
+U_DRAFT void U_EXPORT2
+ubidi_setReorderingMode(UBiDi *pBiDi, UBiDiReorderingMode reorderingMode);
+
+/**
+ * What is the requested reordering mode for a given BiDi object?
+ *
+ * @param pBiDi is a UBiDi
object.
+ * @return the current reordering mode of the BiDi object
+ * @see ubidi_setReorderingMode
+ * @draft ICU 3.6
+ */
+U_DRAFT UBiDiReorderingMode U_EXPORT2
+ubidi_getReorderingMode(UBiDi *pBiDi);
+
+/**
+ * UBiDiReorderingOption
values indicate which options are
+ * specified to affect the BiDi algorithm.
+ *
+ * @see ubidi_setReorderingOptions
+ * @draft ICU 3.6
+ */
+typedef enum UBiDiReorderingOption {
+ /**
+ * option value for ubidi_setReorderingOptions
:
+ * disable all the options which can be set with this function
+ * @see ubidi_setReorderingOptions
+ * @draft ICU 3.6
+ */
+ UBIDI_OPTION_DEFAULT = 0,
+
+ /**
+ * option bit for ubidi_setReorderingOptions
:
+ * insert BiDi marks (LRM or RLM) when needed to ensure correct result of
+ * a reordering to a Logical order
+ *
+ *
This option must be set or reset before calling
+ * ubidi_setPara
.
+ *
+ * This option is significant only with reordering modes which generate
+ * a result with Logical order, specifically:
+ *
+ * #UBIDI_REORDER_RUNS_ONLY
+ * #UBIDI_REORDER_INVERSE_NUMBERS_AS_L
+ * #UBIDI_REORDER_INVERSE_LIKE_DIRECT
+ * #UBIDI_REORDER_INVERSE_FOR_NUMBERS_SPECIAL
+ *
+ *
+ * If this option is set in conjunction with reordering mode
+ * #UBIDI_REORDER_INVERSE_NUMBERS_AS_L
or with calling
+ * ubidi_setInverse(TRUE)
, it implies
+ * option #UBIDI_INSERT_LRM_FOR_NUMERIC
+ * in calls to function ubidi_writeReordered()
.
+ *
+ * For other reordering modes, a minimum number of LRM or RLM characters
+ * will be added to the source text after reordering it so as to ensure
+ * round trip, i.e. when applying the inverse reordering mode on the
+ * resulting logical text with removal of BiDi marks
+ * (option #UBIDI_OPTION_REMOVE_CONTROLS
set before calling
+ * ubidi_setPara()
or option #UBIDI_REMOVE_BIDI_CONTROLS
+ * in ubidi_writeReordered
), the result will be identical to the
+ * source text in the first transformation.
+ *
+ *
This option will be ignored if specified together with option
+ * #UBIDI_OPTION_REMOVE_CONTROLS
. It inhibits option
+ * UBIDI_REMOVE_BIDI_CONTROLS
in calls to function
+ * ubidi_writeReordered()
and it implies option
+ * #UBIDI_INSERT_LRM_FOR_NUMERIC
in calls to function
+ * ubidi_writeReordered()
if the reordering mode is
+ * #UBIDI_REORDER_INVERSE_NUMBERS_AS_L
.
+ *
+ * @see ubidi_setReorderingMode
+ * @see ubidi_setReorderingOptions
+ * @draft ICU 3.6
+ */
+ UBIDI_OPTION_INSERT_MARKS = 1,
+
+ /**
+ * option bit for ubidi_setReorderingOptions
:
+ * remove BiDi control characters
+ *
+ * This option must be set or reset before calling
+ * ubidi_setPara
.
+ *
+ * This option nullifies option #UBIDI_OPTION_INSERT_MARKS
.
+ * It inhibits option #UBIDI_INSERT_LRM_FOR_NUMERIC
in calls
+ * to function ubidi_writeReordered()
and it implies option
+ * #UBIDI_REMOVE_BIDI_CONTROLS
in calls to that function.
+ *
+ * @see ubidi_setReorderingMode
+ * @see ubidi_setReorderingOptions
+ * @draft ICU 3.6
+ */
+ UBIDI_OPTION_REMOVE_CONTROLS = 2,
+
+ /**
+ * option bit for ubidi_setReorderingOptions
:
+ * process the output as part of a stream to be continued
+ *
+ * This option must be set or reset before calling
+ * ubidi_setPara
.
+ *
+ * This option specifies that the caller is interested in processing large
+ * text object in parts.
+ * The results of the successive calls are expected to be concatenated by the
+ * caller. Only the call for the last part will have this option bit off.
+ *
+ * When this option bit is on, ubidi_setPara()
may process
+ * less than the full source text in order to truncate the text at a meaningful
+ * boundary. The caller should call ubidi_getProcessedLength()
+ * immediately after calling ubidi_setPara()
in order to
+ * determine how much of the source text has been processed.
+ * Source text beyond that length should be resubmitted in following calls to
+ * ubidi_setPara
. The processed length may be less than
+ * the length of the source text if a character preceding the last character of
+ * the source text constitutes a reasonable boundary (like a block separator)
+ * for text to be continued.
+ * If the last character of the source text constitutes a reasonable
+ * boundary, the whole text will be processed at once.
+ * If nowhere in the source text there exists
+ * such a reasonable boundary, the processed length will be zero.
+ * The caller should check for such an occurrence and do one of the following:
+ *
- submit a larger amount of text with a better chance to include
+ * a reasonable boundary.
+ * - resubmit the same text after turning off option
+ *
UBIDI_OPTION_STREAMING
.
+ * In all cases, this option should be turned off before processing the last
+ * part of the text.
+ *
+ * When the UBIDI_OPTION_STREAMING
option is used,
+ * it is recommended to call ubidi_orderParagraphsLTR()
with
+ * argument orderParagraphsLTR
set to TRUE
before
+ * calling ubidi_setPara
so that later paragraphs may be
+ * concatenated to previous paragraphs on the right.
+ *
+ * @see ubidi_setReorderingMode
+ * @see ubidi_setReorderingOptions
+ * @see ubidi_getProcessedLength
+ * @see ubidi_orderParagraphsLTR
+ * @draft ICU 3.6
+ */
+ UBIDI_OPTION_STREAMING = 4
+} UBiDiReorderingOption;
+
+/**
+ * Specify which of the reordering options
+ * should be applied during BiDi transformations.
+ *
+ * @param pBiDi is a UBiDi
object.
+ * @param reorderingOptions is a combination of zero or more of the following
+ * options:
+ * #UBIDI_OPTION_DEFAULT
, #UBIDI_OPTION_INSERT_MARKS
,
+ * #UBIDI_OPTION_REMOVE_CONTROLS
, #UBIDI_OPTION_STREAMING
.
+ *
+ * @see ubidi_getReorderingOptions
+ * @draft ICU 3.6
+ */
+U_DRAFT void U_EXPORT2
+ubidi_setReorderingOptions(UBiDi *pBiDi, uint32_t reorderingOptions);
+
+/**
+ * What are the reordering options applied to a given BiDi object?
+ *
+ * @param pBiDi is a UBiDi
object.
+ * @return the current reordering options of the BiDi object
+ * @see ubidi_setReorderingOptions
+ * @draft ICU 3.6
+ */
+U_DRAFT uint32_t U_EXPORT2
+ubidi_getReorderingOptions(UBiDi *pBiDi);
+
/**
* Perform the Unicode BiDi algorithm. It is defined in the
* Unicode Standard Anned #9,
* version 13,
* also described in The Unicode Standard, Version 4.0 .
*
- * This function takes a single plain text paragraph with or without
- * externally specified embedding levels from styled text
- * and computes the left-right-directionality of each character.
+ * This function takes a piece of plain text containing one or more paragraphs,
+ * with or without externally specified embedding levels from styled
+ * text and computes the left-right-directionality of each character.
*
- * If the entire paragraph consists of text of only one direction, then
+ * If the entire text is all of the same directionality, then
* the function may not perform all the steps described by the algorithm,
* i.e., some levels may not be the same as if all steps were performed.
* This is not relevant for unidirectional text.
@@ -547,41 +971,48 @@ ubidi_isInverse(UBiDi *pBiDi);
* the algorithm. This implementation may set all resolved levels to
* the same value in such a case.
*
- * The text must be externally split into separate paragraphs (rule P1).
- * Paragraph separators (B) should appear at most at the very end.
+ * The text can be composed of multiple paragraphs. Occurrence of a block
+ * separator in the text terminates a paragraph, and whatever comes next starts
+ * a new paragraph. The exception to this rule is when a Carriage Return (CR)
+ * is followed by a Line Feed (LF). Both CR and LF are block separators, but
+ * in that case, the pair of characters is considered as terminating the
+ * preceding paragraph, and a new paragraph will be started by a character
+ * coming after the LF.
*
* @param pBiDi A UBiDi
object allocated with ubidi_open()
* which will be set to contain the reordering information,
* especially the resolved levels for all the characters in text
.
*
- * @param text is a pointer to the single-paragraph text that the
- * BiDi algorithm will be performed on
- * (step (P1) of the algorithm is performed externally).
- * The text must be (at least) length
long.
+ * @param text is a pointer to the text that the BiDi algorithm will be performed on.
* This pointer is stored in the UBiDi object and can be retrieved
- * with ubidi_getText()
.
+ * with ubidi_getText()
.
+ * Note: the text must be (at least) length
long.
*
* @param length is the length of the text; if length==-1
then
* the text must be zero-terminated.
*
- * @param paraLevel specifies the default level for the paragraph;
+ * @param paraLevel specifies the default level for the text;
* it is typically 0 (LTR) or 1 (RTL).
* If the function shall determine the paragraph level from the text,
* then paraLevel
can be set to
- * either UBIDI_DEFAULT_LTR
- * or UBIDI_DEFAULT_RTL
;
- * if there is no strongly typed character, then
- * the desired default is used (0 for LTR or 1 for RTL).
- * Any other value between 0 and UBIDI_MAX_EXPLICIT_LEVEL
is also valid,
- * with odd levels indicating RTL.
+ * either #UBIDI_DEFAULT_LTR
+ * or #UBIDI_DEFAULT_RTL
; if the text contains multiple
+ * paragraphs, the paragraph level shall be determined separately for
+ * each paragraph; if a paragraph does not include any strongly typed
+ * character, then the desired default is used (0 for LTR or 1 for RTL).
+ * Any other value between 0 and #UBIDI_MAX_EXPLICIT_LEVEL
+ * is also valid, with odd levels indicating RTL.
*
* @param embeddingLevels (in) may be used to preset the embedding and override levels,
* ignoring characters like LRE and PDF in the text.
* A level overrides the directional property of its corresponding
* (same index) character if the level has the
- * UBIDI_LEVEL_OVERRIDE
bit set.
+ * #UBIDI_LEVEL_OVERRIDE
bit set.
* Except for that bit, it must be
- * paraLevel<=embeddingLevels[]<=UBIDI_MAX_EXPLICIT_LEVEL
.
+ * paraLevel<=embeddingLevels[]<=UBIDI_MAX_EXPLICIT_LEVEL
,
+ * with one exception: a level of zero may be specified for a paragraph
+ * separator even if paraLevel>0
when multiple paragraphs
+ * are submitted in the same call to ubidi_setPara()
.
* Caution: A copy of this pointer, not of the levels,
* will be stored in the UBiDi
object;
* the embeddingLevels
array must not be
@@ -589,14 +1020,13 @@ ubidi_isInverse(UBiDi *pBiDi);
* and the embeddingLevels
* should not be modified to avoid unexpected results on subsequent BiDi operations.
* However, the ubidi_setPara()
and
- * ubidi_setLine()
functions may modify some or all of the levels.
+ * ubidi_setLine()
functions may modify some or all of the levels.
* After the UBiDi
object is reused or destroyed, the caller
- * must take care of the deallocation of the embeddingLevels
array.
- * The embeddingLevels
array must be
- * at least length
long.
+ * must take care of the deallocation of the embeddingLevels
array.
+ * Note: the embeddingLevels
array must be
+ * at least length
long.
*
- * @param pErrorCode must be a valid pointer to an error code value,
- * which must not indicate a failure before the function call.
+ * @param pErrorCode must be a valid pointer to an error code value.
* @stable ICU 2.0
*/
U_STABLE void U_EXPORT2
@@ -609,13 +1039,13 @@ ubidi_setPara(UBiDi *pBiDi, const UChar *text, int32_t length,
* contain the reordering information, especially the resolved levels,
* for all the characters in a line of text. This line of text is
* specified by referring to a UBiDi
object representing
- * this information for a paragraph of text, and by specifying
- * a range of indexes in this paragraph.
+ * this information for a piece of text containing one or more paragraphs,
+ * and by specifying a range of indexes in this text.
* In the new line object, the indexes will range from 0 to limit-start-1
.
*
* This is used after calling ubidi_setPara()
- * for a paragraph, and after line-breaking on that paragraph.
- * It is not necessary if the paragraph is treated as a single line.
+ * for a piece of text, and after line-breaking on that text.
+ * It is not necessary if each paragraph is treated as a single line.
*
* After line-breaking, rules (L1) and (L2) for the treatment of
* trailing WS and for reordering are performed on
@@ -631,20 +1061,23 @@ ubidi_setPara(UBiDi *pBiDi, const UChar *text, int32_t length,
* and start
is added to it so that it points to the beginning of the
* line for this object.
*
- * @param pParaBiDi is the parent paragraph object.
+ * @param pParaBiDi is the parent paragraph object. It must have been set
+ * by a successful call to ubidi_setPara.
*
- * @param start is the line's first index into the paragraph text.
+ * @param start is the line's first index into the text.
*
- * @param limit is just behind the line's last index into the paragraph text
+ * @param limit is just behind the line's last index into the text
* (its last index +1).
- * It must be 0<=start<=limit<=
paragraph length.
+ * It must be 0<=start<=limit<=
containing paragraph limit.
+ * If the specified line crosses a paragraph boundary, the function
+ * will terminate with error code U_ILLEGAL_ARGUMENT_ERROR.
*
- * @param pLineBiDi is the object that will now represent a line of the paragraph.
+ * @param pLineBiDi is the object that will now represent a line of the text.
*
- * @param pErrorCode must be a valid pointer to an error code value,
- * which must not indicate a failure before the function call.
+ * @param pErrorCode must be a valid pointer to an error code value.
*
* @see ubidi_setPara
+ * @see ubidi_getProcessedLength
* @stable ICU 2.0
*/
U_STABLE void U_EXPORT2
@@ -698,14 +1131,99 @@ ubidi_getLength(const UBiDi *pBiDi);
*
* @param pBiDi is the paragraph or line UBiDi
object.
*
- * @return The paragraph level.
+ * @return The paragraph level. If there are multiple paragraphs, their
+ * level may vary if the required paraLevel is UBIDI_DEFAULT_LTR or
+ * UBIDI_DEFAULT_RTL. In that case, the level of the first paragraph
+ * is returned.
*
* @see UBiDiLevel
+ * @see ubidi_getParagraph
+ * @see ubidi_getParagraphByIndex
* @stable ICU 2.0
*/
U_STABLE UBiDiLevel U_EXPORT2
ubidi_getParaLevel(const UBiDi *pBiDi);
+/**
+ * Get the number of paragraphs.
+ *
+ * @param pBiDi is the paragraph or line UBiDi
object.
+ *
+ * @return The number of paragraphs.
+ * @stable ICU 3.4
+ */
+U_STABLE int32_t U_EXPORT2
+ubidi_countParagraphs(UBiDi *pBiDi);
+
+/**
+ * Get a paragraph, given a position within the text.
+ * This function returns information about a paragraph.
+ *
+ * @param pBiDi is the paragraph or line UBiDi
object.
+ *
+ * @param charIndex is the index of a character within the text, in the
+ * range [0..ubidi_getProcessedLength(pBiDi)-1]
.
+ *
+ * @param pParaStart will receive the index of the first character of the
+ * paragraph in the text.
+ * This pointer can be NULL
if this
+ * value is not necessary.
+ *
+ * @param pParaLimit will receive the limit of the paragraph.
+ * The l-value that you point to here may be the
+ * same expression (variable) as the one for
+ * charIndex
.
+ * This pointer can be NULL
if this
+ * value is not necessary.
+ *
+ * @param pParaLevel will receive the level of the paragraph.
+ * This pointer can be NULL
if this
+ * value is not necessary.
+ *
+ * @param pErrorCode must be a valid pointer to an error code value.
+ *
+ * @return The index of the paragraph containing the specified position.
+ *
+ * @see ubidi_getProcessedLength
+ * @stable ICU 3.4
+ */
+U_STABLE int32_t U_EXPORT2
+ubidi_getParagraph(const UBiDi *pBiDi, int32_t charIndex, int32_t *pParaStart,
+ int32_t *pParaLimit, UBiDiLevel *pParaLevel,
+ UErrorCode *pErrorCode);
+
+/**
+ * Get a paragraph, given the index of this paragraph.
+ *
+ * This function returns information about a paragraph.
+ *
+ * @param pBiDi is the paragraph UBiDi
object.
+ *
+ * @param paraIndex is the number of the paragraph, in the
+ * range [0..ubidi_countParagraphs(pBiDi)-1]
.
+ *
+ * @param pParaStart will receive the index of the first character of the
+ * paragraph in the text.
+ * This pointer can be NULL
if this
+ * value is not necessary.
+ *
+ * @param pParaLimit will receive the limit of the paragraph.
+ * This pointer can be NULL
if this
+ * value is not necessary.
+ *
+ * @param pParaLevel will receive the level of the paragraph.
+ * This pointer can be NULL
if this
+ * value is not necessary.
+ *
+ * @param pErrorCode must be a valid pointer to an error code value.
+ *
+ * @stable ICU 3.4
+ */
+U_STABLE void U_EXPORT2
+ubidi_getParagraphByIndex(const UBiDi *pBiDi, int32_t paraIndex,
+ int32_t *pParaStart, int32_t *pParaLimit,
+ UBiDiLevel *pParaLevel, UErrorCode *pErrorCode);
+
/**
* Get the level for one character.
*
@@ -716,6 +1234,7 @@ ubidi_getParaLevel(const UBiDi *pBiDi);
* @return The level for the character at charIndex.
*
* @see UBiDiLevel
+ * @see ubidi_getProcessedLength
* @stable ICU 2.0
*/
U_STABLE UBiDiLevel U_EXPORT2
@@ -727,15 +1246,16 @@ ubidi_getLevelAt(const UBiDi *pBiDi, int32_t charIndex);
* Note that this function may allocate memory under some
* circumstances, unlike ubidi_getLevelAt()
.
*
- * @param pBiDi is the paragraph or line UBiDi
object.
+ * @param pBiDi is the paragraph or line UBiDi
object, whose
+ * text length must be strictly positive.
*
- * @param pErrorCode must be a valid pointer to an error code value,
- * which must not indicate a failure before the function call.
+ * @param pErrorCode must be a valid pointer to an error code value.
*
* @return The levels array for the text,
* or NULL
if an error occurs.
*
* @see UBiDiLevel
+ * @see ubidi_getProcessedLength
* @stable ICU 2.0
*/
U_STABLE const UBiDiLevel * U_EXPORT2
@@ -761,6 +1281,8 @@ ubidi_getLevels(UBiDi *pBiDi, UErrorCode *pErrorCode);
* @param pLevel will receive the level of the run.
* This pointer can be NULL
if this
* value is not necessary.
+ *
+ * @see ubidi_getProcessedLength
* @stable ICU 2.0
*/
U_STABLE void U_EXPORT2
@@ -777,8 +1299,7 @@ ubidi_getLogicalRun(const UBiDi *pBiDi, int32_t logicalStart,
*
* @param pBiDi is the paragraph or line UBiDi
object.
*
- * @param pErrorCode must be a valid pointer to an error code value,
- * which must not indicate a failure before the function call.
+ * @param pErrorCode must be a valid pointer to an error code value.
*
* @return The number of runs.
* @stable ICU 2.0
@@ -847,6 +1368,10 @@ ubidi_getVisualRun(UBiDi *pBiDi, int32_t runIndex,
* UBiDi
object, then calling
* ubidi_getLogicalMap()
is more efficient.
*
+ * The value returned may be #UBIDI_MAP_NOWHERE
if there is no
+ * visual position because the corresponding text character is a BiDi control
+ * removed from output by the option #UBIDI_OPTION_REMOVE_CONTROLS
.
+ *
* Note that in right-to-left runs, this mapping places
* modifier letters before base characters and second surrogates
* before first ones.
@@ -855,13 +1380,13 @@ ubidi_getVisualRun(UBiDi *pBiDi, int32_t runIndex,
*
* @param logicalIndex is the index of a character in the text.
*
- * @param pErrorCode must be a valid pointer to an error code value,
- * which must not indicate a failure before the function call.
+ * @param pErrorCode must be a valid pointer to an error code value.
*
* @return The visual position of this character.
*
* @see ubidi_getLogicalMap
* @see ubidi_getLogicalIndex
+ * @see ubidi_getProcessedLength
* @stable ICU 2.0
*/
U_STABLE int32_t U_EXPORT2
@@ -873,19 +1398,23 @@ ubidi_getVisualIndex(UBiDi *pBiDi, int32_t logicalIndex, UErrorCode *pErrorCode)
* UBiDi
object, then calling
* ubidi_getVisualMap()
is more efficient.
*
+ * The value returned may be #UBIDI_MAP_NOWHERE
if there is no
+ * logical position because the corresponding text character is a BiDi mark
+ * inserted in the output by option #UBIDI_OPTION_INSERT_MARKS
.
+ *
* This is the inverse function to ubidi_getVisualIndex()
.
*
* @param pBiDi is the paragraph or line UBiDi
object.
*
* @param visualIndex is the visual position of a character.
*
- * @param pErrorCode must be a valid pointer to an error code value,
- * which must not indicate a failure before the function call.
+ * @param pErrorCode must be a valid pointer to an error code value.
*
* @return The index of this character in the text.
*
* @see ubidi_getVisualMap
* @see ubidi_getVisualIndex
+ * @see ubidi_getResultLength
* @stable ICU 2.0
*/
U_STABLE int32_t U_EXPORT2
@@ -894,19 +1423,27 @@ ubidi_getLogicalIndex(UBiDi *pBiDi, int32_t visualIndex, UErrorCode *pErrorCode)
/**
* Get a logical-to-visual index map (array) for the characters in the UBiDi
* (paragraph or line) object.
+ *
+ * Some values in the map may be #UBIDI_MAP_NOWHERE
if the
+ * corresponding text characters are BiDi controls removed from the visual
+ * output by the option #UBIDI_OPTION_REMOVE_CONTROLS
.
*
* @param pBiDi is the paragraph or line UBiDi
object.
*
- * @param indexMap is a pointer to an array of ubidi_getLength()
+ * @param indexMap is a pointer to an array of ubidi_getProcessedLength()
* indexes which will reflect the reordering of the characters.
- * The array does not need to be initialized.
- * The index map will result in indexMap[logicalIndex]==visualIndex
.
+ * If option #UBIDI_OPTION_INSERT_MARKS
is set, the number
+ * of elements allocated in indexMap
must be no less than
+ * ubidi_getResultLength()
.
+ * The array does not need to be initialized.
+ * The index map will result in indexMap[logicalIndex]==visualIndex
.
*
- * @param pErrorCode must be a valid pointer to an error code value,
- * which must not indicate a failure before the function call.
+ * @param pErrorCode must be a valid pointer to an error code value.
*
* @see ubidi_getVisualMap
* @see ubidi_getVisualIndex
+ * @see ubidi_getProcessedLength
+ * @see ubidi_getResultLength
* @stable ICU 2.0
*/
U_STABLE void U_EXPORT2
@@ -915,19 +1452,27 @@ ubidi_getLogicalMap(UBiDi *pBiDi, int32_t *indexMap, UErrorCode *pErrorCode);
/**
* Get a visual-to-logical index map (array) for the characters in the UBiDi
* (paragraph or line) object.
+ *
+ * Some values in the map may be #UBIDI_MAP_NOWHERE
if the
+ * corresponding text characters are BiDi marks inserted in the visual output
+ * by the option #UBIDI_OPTION_INSERT_MARKS
.
*
* @param pBiDi is the paragraph or line UBiDi
object.
*
- * @param indexMap is a pointer to an array of ubidi_getLength()
+ * @param indexMap is a pointer to an array of ubidi_getResultLength()
* indexes which will reflect the reordering of the characters.
- * The array does not need to be initialized.
- * The index map will result in indexMap[visualIndex]==logicalIndex
.
+ * If option #UBIDI_OPTION_REMOVE_CONTROLS
is set, the number
+ * of elements allocated in indexMap
must be no less than
+ * ubidi_getProcessedLength()
.
+ * The array does not need to be initialized.
+ * The index map will result in indexMap[visualIndex]==logicalIndex
.
*
- * @param pErrorCode must be a valid pointer to an error code value,
- * which must not indicate a failure before the function call.
+ * @param pErrorCode must be a valid pointer to an error code value.
*
* @see ubidi_getLogicalMap
* @see ubidi_getLogicalIndex
+ * @see ubidi_getProcessedLength
+ * @see ubidi_getResultLength
* @stable ICU 2.0
*/
U_STABLE void U_EXPORT2
@@ -937,7 +1482,7 @@ ubidi_getVisualMap(UBiDi *pBiDi, int32_t *indexMap, UErrorCode *pErrorCode);
* This is a convenience function that does not use a UBiDi object.
* It is intended to be used for when an application has determined the levels
* of objects (character sequences) and just needs to have them reordered (L2).
- * This is equivalent to using ubidi_getLogicalMap
on a
+ * This is equivalent to using ubidi_getLogicalMap()
on a
* UBiDi
object.
*
* @param levels is an array with length
levels that have been determined by
@@ -960,7 +1505,7 @@ ubidi_reorderLogical(const UBiDiLevel *levels, int32_t length, int32_t *indexMap
* This is a convenience function that does not use a UBiDi object.
* It is intended to be used for when an application has determined the levels
* of objects (character sequences) and just needs to have them reordered (L2).
- * This is equivalent to using ubidi_getVisualMap
on a
+ * This is equivalent to using ubidi_getVisualMap()
on a
* UBiDi
object.
*
* @param levels is an array with length
levels that have been determined by
@@ -981,16 +1526,29 @@ ubidi_reorderVisual(const UBiDiLevel *levels, int32_t length, int32_t *indexMap)
/**
* Invert an index map.
- * The one-to-one index mapping of the first map is inverted and written to
+ * The index mapping of the first map is inverted and written to
* the second one.
*
* @param srcMap is an array with length
indexes
- * which define the original mapping.
- *
- * @param destMap is an array with length
indexes
- * which will be filled with the inverse mapping.
+ * which defines the original mapping from a source array containing
+ * length
elements to a destination array.
+ * All indexes must be >=0 or equal to UBIDI_MAP_NOWHERE
.
+ * This special value means that the corresponding elements in the source
+ * array have no matching element in the destination array.
+ * Some indexes may have a value >= length
, if the
+ * destination array has more elements than the source array.
+ * There must be no duplicate indexes (two or more indexes with the
+ * same value except UBIDI_MAP_NOWHERE
).
+ *
+ * @param destMap is an array with a number of indexes equal to 1 + the highest
+ * value in srcMap
.
+ * destMap
will be filled with the inverse mapping.
+ * Elements of destMap
which have no matching elements in
+ * srcMap
will receive an index equal to
+ * UBIDI_MAP_NOWHERE
*
* @param length is the length of each array.
+ * @See UBIDI_MAP_NOWHERE
* @stable ICU 2.0
*/
U_STABLE void U_EXPORT2
@@ -1022,6 +1580,9 @@ ubidi_invertMap(const int32_t *srcMap, int32_t *destMap, int32_t length);
* surround the run with LRMs if necessary;
* this is part of the approximate "inverse BiDi" algorithm
*
+ *
This option does not imply corresponding adjustment of the index
+ * mappings.
+ *
* @see ubidi_setInverse
* @see ubidi_writeReordered
* @stable ICU 2.0
@@ -1031,7 +1592,10 @@ ubidi_invertMap(const int32_t *srcMap, int32_t *destMap, int32_t length);
/**
* option bit for ubidi_writeReordered():
* remove BiDi control characters
- * (this does not affect UBIDI_INSERT_LRM_FOR_NUMERIC)
+ * (this does not affect #UBIDI_INSERT_LRM_FOR_NUMERIC)
+ *
+ * This option does not imply corresponding adjustment of the index
+ * mappings.
*
* @see ubidi_writeReordered
* @stable ICU 2.0
@@ -1054,11 +1618,182 @@ ubidi_invertMap(const int32_t *srcMap, int32_t *destMap, int32_t length);
*/
#define UBIDI_OUTPUT_REVERSE 16
+/**
+ * Get the length of the source text processed by the last call to
+ * ubidi_setPara()
. This length may be different from the length
+ * of the source text if option #UBIDI_OPTION_STREAMING
+ * has been set.
+ *
+ * Note that whenever the length of the text affects the execution or the
+ * result of a function, it is the processed length which must be considered,
+ * except for ubidi_setPara
(which receives unprocessed source
+ * text) and ubidi_getLength
(which returns the original length
+ * of the source text).
+ * In particular, the processed length is the one to consider in the following
+ * cases:
+ *
+ * - maximum value of the
limit
argument of
+ * ubidi_setLine
+ * - maximum value of the
charIndex
argument of
+ * ubidi_getParagraph
+ * - maximum value of the
charIndex
argument of
+ * ubidi_getLevelAt
+ * - number of elements in the array returned by
ubidi_getLevels
+ * - maximum value of the
logicalStart
argument of
+ * ubidi_getLogicalRun
+ * - maximum value of the
logicalIndex
argument of
+ * ubidi_getVisualIndex
+ * - number of elements filled in the
*indexMap
argument of
+ * ubidi_getLogicalMap
+ * - length of text processed by
ubidi_writeReordered
+ *
+ *
+ * @param pBiDi is the paragraph UBiDi
object.
+ *
+ * @return The length of the part of the source text processed by
+ * the last call to ubidi_setPara
.
+ * @see ubidi_setPara
+ * @see UBIDI_OPTION_STREAMING
+ * @draft ICU 3.6
+ */
+U_DRAFT int32_t U_EXPORT2
+ubidi_getProcessedLength(const UBiDi *pBiDi);
+
+/**
+ * Get the length of the reordered text resulting from the last call to
+ * ubidi_setPara()
. This length may be different from the length
+ * of the source text if option #UBIDI_OPTION_INSERT_MARKS
+ * or option #UBIDI_OPTION_REMOVE_CONTROLS
has been set.
+ *
+ * This resulting length is the one to consider in the following cases:
+ *
+ * - maximum value of the
visualIndex
argument of
+ * ubidi_getLogicalIndex
+ * - number of elements of the
*indexMap
argument of
+ * ubidi_getVisualMap
+ *
+ * Note that this length stays identical to the source text length if
+ * BiDi marks are inserted or removed using option bits of
+ * ubidi_writeReordered
, or if option
+ * #UBIDI_REORDER_INVERSE_NUMBERS_AS_L
has been set.
+ *
+ * @param pBiDi is the paragraph UBiDi
object.
+ *
+ * @return The length of the reordered text resulting from
+ * the last call to ubidi_setPara
.
+ * @see ubidi_setPara
+ * @see UBIDI_OPTION_INSERT_MARKS
+ * @see UBIDI_OPTION_REMOVE_CONTROLS
+ * @draft ICU 3.6
+ */
+U_DRAFT int32_t U_EXPORT2
+ubidi_getResultLength(const UBiDi *pBiDi);
+
+U_CDECL_BEGIN
+/**
+ * value returned by UBiDiClassCallback
callbacks when
+ * there is no need to override the standard BiDi class for a given code point.
+ * @see UBiDiClassCallback
+ * @draft ICU 3.6
+ */
+#define U_BIDI_CLASS_DEFAULT U_CHAR_DIRECTION_COUNT
+
+/**
+ * Callback type declaration for overriding default BiDi class values with
+ * custom ones.
+ * Usually, the function pointer will be propagated to a UBiDi
+ * object by calling the ubidi_setClassCallback()
function;
+ * then the callback will be invoked by the UBA implementation any time the
+ * class of a character is to be determined.
+ *
+ * @param context is a pointer to the callback private data.
+ *
+ * @param c is the code point to get a BiDi class for.
+ *
+ * @return The directional property / BiDi class for the given code point
+ * c
if the default class has been overridden, or
+ * #U_BIDI_CLASS_DEFAULT
if the standard BiDi class value
+ * for c
is to be used.
+ * @see ubidi_setClassCallback
+ * @see ubidi_getClassCallback
+ * @draft ICU 3.6
+ */
+typedef UCharDirection U_CALLCONV
+UBiDiClassCallback(const void *context, UChar32 c);
+
+U_CDECL_END
+
+/**
+ * Retrieve the BiDi class for a given code point.
+ * If a #UBiDiClassCallback
callback is defined and returns a
+ * value other than #U_BIDI_CLASS_DEFAULT
, that value is used;
+ * otherwise the default class determination mechanism is invoked.
+ *
+ * @param pBiDi is the paragraph UBiDi
object.
+ *
+ * @param c is the code point whose BiDi class must be retrieved.
+ *
+ * @return The BiDi class for character c
based
+ * on the given pBiDi
instance.
+ * @see UBiDiClassCallback
+ * @draft ICU 3.6
+ */
+U_DRAFT UCharDirection U_EXPORT2
+ubidi_getCustomizedClass(UBiDi *pBiDi, UChar32 c);
+
+/**
+ * Set the callback function and callback data used by the UBA
+ * implementation for BiDi class determination.
+ * This may be useful for assigning BiDi classes to PUA characters, or
+ * for special application needs. For instance, an application may want to
+ * handle all spaces like L or R characters (according to the base direction)
+ * when creating the visual ordering of logical lines which are part of a report
+ * organized in columns: there should not be interaction between adjacent
+ * cells.
+ *
+ * @param pBiDi is the paragraph UBiDi
object.
+ *
+ * @param newFn is the new callback function pointer.
+ *
+ * @param newContext is the new callback context pointer. This can be NULL.
+ *
+ * @param oldFn fillin: Returns the old callback function pointer. This can be
+ * NULL.
+ *
+ * @param oldContext fillin: Returns the old callback's context. This can be
+ * NULL.
+ *
+ * @param pErrorCode must be a valid pointer to an error code value.
+ *
+ * @see ubidi_getClassCallback
+ * @draft ICU 3.6
+ */
+U_DRAFT void U_EXPORT2
+ubidi_setClassCallback(UBiDi *pBiDi, UBiDiClassCallback *newFn,
+ const void *newContext, UBiDiClassCallback **oldFn,
+ const void **oldContext, UErrorCode *pErrorCode);
+
+/**
+ * Get the current callback function used for BiDi class determination.
+ *
+ * @param pBiDi is the paragraph UBiDi
object.
+ *
+ * @param fn fillin: Returns the callback function pointer.
+ *
+ * @param context fillin: Returns the callback's private context.
+ *
+ * @see ubidi_setClassCallback
+ * @draft ICU 3.6
+ */
+U_DRAFT void U_EXPORT2
+ubidi_getClassCallback(UBiDi *pBiDi, UBiDiClassCallback **fn, const void **context);
+
/**
* Take a UBiDi
object containing the reordering
- * information for one paragraph or line of text as set by
- * ubidi_setPara()
or ubidi_setLine()
and
- * write a reordered string to the destination buffer.
+ * information for a piece of text (one or more paragraphs) set by
+ * ubidi_setPara()
or for a line of text set by
+ * ubidi_setLine()
and write a reordered string to the
+ * destination buffer.
*
* This function preserves the integrity of characters with multiple
* code units and (optionally) modifier letters.
@@ -1071,20 +1806,14 @@ ubidi_invertMap(const int32_t *srcMap, int32_t *destMap, int32_t length);
* characters; see the description of the destSize
* and options
parameters and of the option bit flags.
*
- * @see UBIDI_DO_MIRRORING
- * @see UBIDI_INSERT_LRM_FOR_NUMERIC
- * @see UBIDI_KEEP_BASE_COMBINING
- * @see UBIDI_OUTPUT_REVERSE
- * @see UBIDI_REMOVE_BIDI_CONTROLS
- *
* @param pBiDi A pointer to a UBiDi
object that
* is set by ubidi_setPara()
or
* ubidi_setLine()
and contains the reordering
* information for the text that it was defined for,
- * as well as a pointer to that text.
- *
The text was aliased (only the pointer was stored
+ * as well as a pointer to that text.
+ * The text was aliased (only the pointer was stored
* without copying the contents) and must not have been modified
- * since the ubidi_setPara()
call.
+ * since the ubidi_setPara()
call.
*
* @param dest A pointer to where the reordered text is to be copied.
* The source text and dest[destSize]
@@ -1117,10 +1846,11 @@ ubidi_invertMap(const int32_t *srcMap, int32_t *destMap, int32_t length);
* #UBIDI_OUTPUT_REVERSE
,
* #UBIDI_REMOVE_BIDI_CONTROLS
*
- * @param pErrorCode must be a valid pointer to an error code value,
- * which must not indicate a failure before the function call.
+ * @param pErrorCode must be a valid pointer to an error code value.
*
* @return The length of the output string.
+ *
+ * @see ubidi_getProcessedLength
* @stable ICU 2.0
*/
U_STABLE int32_t U_EXPORT2
@@ -1170,8 +1900,7 @@ ubidi_writeReordered(UBiDi *pBiDi,
* how the reordered text is written.
* See the options
parameter in ubidi_writeReordered()
.
*
- * @param pErrorCode must be a valid pointer to an error code value,
- * which must not indicate a failure before the function call.
+ * @param pErrorCode must be a valid pointer to an error code value.
*
* @return The length of the output string.
* @stable ICU 2.0
diff --git a/icuSources/common/unicode/ubrk.h b/icuSources/common/unicode/ubrk.h
index 81e12c00..39f25cf8 100644
--- a/icuSources/common/unicode/ubrk.h
+++ b/icuSources/common/unicode/ubrk.h
@@ -1,6 +1,8 @@
/*
-* Copyright (C) 1996-2004, International Business Machines Corporation and others. All Rights Reserved.
-*****************************************************************************************
+******************************************************************************
+* Copyright (C) 1996-2006, International Business Machines Corporation and others.
+* All Rights Reserved.
+******************************************************************************
*/
#ifndef UBRK_H
@@ -8,6 +10,7 @@
#include "unicode/utypes.h"
#include "unicode/uloc.h"
+#include "unicode/utext.h"
/**
* A text-break iterator.
@@ -36,22 +39,22 @@
* of boundaries in text. Pointer to a UBreakIterator maintain a
* current position and scan over text returning the index of characters
* where boundaries occur.
- *
+ *
* Line boundary analysis determines where a text string can be broken
* when line-wrapping. The mechanism correctly handles punctuation and
* hyphenated words.
- *
+ *
* Sentence boundary analysis allows selection with correct
* interpretation of periods within numbers and abbreviations, and
* trailing punctuation marks such as quotation marks and parentheses.
- *
+ *
* Word boundary analysis is used by search and replace functions, as
* well as within text editing applications that allow the user to
* select words with a double click. Word selection provides correct
* interpretation of punctuation marks within and following
* words. Characters that are not part of a word, such as symbols or
* punctuation marks, have word-breaks on both sides.
- *
+ *
* Character boundary analysis allows users to interact with
* characters as they expect to, for example, when moving the cursor
* through a text string. Character boundary analysis provides correct
@@ -59,140 +62,37 @@
* character is stored. For example, an accented character might be
* stored as a base character and a diacritical mark. What users
* consider to be a character can differ between languages.
- *
+ *
* Title boundary analysis locates all positions,
* typically starts of words, that should be set to Title Case
* when title casing the text.
- *
- *
- * This is the interface for all text boundaries.
- *
- * Examples:
- *
- * Helper function to output text
- *
- * \code
- * void printTextRange(UChar* str, int32_t start, int32_t end ) {
- * UChar* result;
- * UChar* temp;
- * const char* res;
- * temp=(UChar*)malloc(sizeof(UChar) * ((u_strlen(str)-start)+1));
- * result=(UChar*)malloc(sizeof(UChar) * ((end-start)+1));
- * u_strcpy(temp, &str[start]);
- * u_strncpy(result, temp, end-start);
- * res=(char*)malloc(sizeof(char) * (u_strlen(result)+1));
- * u_austrcpy(res, result);
- * printf("%s\n", res);
- * }
- * \endcode
- *
- * Print each element in order:
- *
- * \code
- * void printEachForward( UBreakIterator* boundary, UChar* str) {
- * int32_t end;
- * int32_t start = ubrk_first(boundary);
- * for (end = ubrk_next(boundary)); end != UBRK_DONE; start = end, end = ubrk_next(boundary)) {
- * printTextRange(str, start, end );
- * }
- * }
- * \endcode
- *
- * Print each element in reverse order:
- *
- * \code
- * void printEachBackward( UBreakIterator* boundary, UChar* str) {
- * int32_t start;
- * int32_t end = ubrk_last(boundary);
- * for (start = ubrk_previous(boundary); start != UBRK_DONE; end = start, start =ubrk_previous(boundary)) {
- * printTextRange( str, start, end );
- * }
- * }
- * \endcode
- *
- * Print first element
- *
- * \code
- * void printFirst(UBreakIterator* boundary, UChar* str) {
- * int32_t end;
- * int32_t start = ubrk_first(boundary);
- * end = ubrk_next(boundary);
- * printTextRange( str, start, end );
- * }
- * \endcode
- *
- * Print last element
- *
- * \code
- * void printLast(UBreakIterator* boundary, UChar* str) {
- * int32_t start;
- * int32_t end = ubrk_last(boundary);
- * start = ubrk_previous(boundary);
- * printTextRange(str, start, end );
- * }
- * \endcode
- *
- * Print the element at a specified position
- *
- * \code
- * void printAt(UBreakIterator* boundary, int32_t pos , UChar* str) {
- * int32_t start;
- * int32_t end = ubrk_following(boundary, pos);
- * start = ubrk_previous(boundary);
- * printTextRange(str, start, end );
- * }
- * \endcode
- *
- * Creating and using text boundaries
- *
- * \code
- * void BreakIterator_Example( void ) {
- * UBreakIterator* boundary;
- * UChar *stringToExamine;
- * stringToExamine=(UChar*)malloc(sizeof(UChar) * (strlen("Aaa bbb ccc. Ddd eee fff.")+1) );
- * u_uastrcpy(stringToExamine, "Aaa bbb ccc. Ddd eee fff.");
- * printf("Examining: "Aaa bbb ccc. Ddd eee fff.");
- *
- * //print each sentence in forward and reverse order
- * boundary = ubrk_open(UBRK_SENTENCE, "en_us", stringToExamine, u_strlen(stringToExamine), &status);
- * printf("----- forward: -----------\n");
- * printEachForward(boundary, stringToExamine);
- * printf("----- backward: ----------\n");
- * printEachBackward(boundary, stringToExamine);
- * ubrk_close(boundary);
- *
- * //print each word in order
- * boundary = ubrk_open(UBRK_WORD, "en_us", stringToExamine, u_strlen(stringToExamine), &status);
- * printf("----- forward: -----------\n");
- * printEachForward(boundary, stringToExamine);
- * printf("----- backward: ----------\n");
- * printEachBackward(boundary, stringToExamine);
- * //print first element
- * printf("----- first: -------------\n");
- * printFirst(boundary, stringToExamine);
- * //print last element
- * printf("----- last: --------------\n");
- * printLast(boundary, stringToExamine);
- * //print word at charpos 10
- * printf("----- at pos 10: ---------\n");
- * printAt(boundary, 10 , stringToExamine);
- *
- * ubrk_close(boundary);
- * }
- * \endcode
- *
+ *
+ * The text boundary positions are found according to the rules
+ * described in Unicode Standard Annex #29, Text Boundaries, and
+ * Unicode Standard Annex #14, Line Breaking Properties. These
+ * are available at http://www.unicode.org/reports/tr14/ and
+ * http://www.unicode.org/reports/tr29/.
+ *
+ * In addition to the plain C API defined in this header file, an
+ * object oriented C++ API with equivalent functionality is defined in the
+ * file brkiter.h.
+ *
+ * Code snippits illustrating the use of the Break Iterator APIs
+ * are available in the ICU User Guide,
+ * http://icu.sourceforge.net/userguide/boundaryAnalysis.html
+ * and in the sample program icu/source/samples/break/break.cpp"
*/
/** The possible types of text boundaries. @stable ICU 2.0 */
typedef enum UBreakIteratorType {
/** Character breaks @stable ICU 2.0 */
- UBRK_CHARACTER,
+ UBRK_CHARACTER = 0,
/** Word breaks @stable ICU 2.0 */
- UBRK_WORD,
+ UBRK_WORD = 1,
/** Line breaks @stable ICU 2.0 */
- UBRK_LINE,
+ UBRK_LINE = 2,
/** Sentence breaks @stable ICU 2.0 */
- UBRK_SENTENCE,
+ UBRK_SENTENCE = 3,
#ifndef U_HIDE_DEPRECATED_API
/**
@@ -203,9 +103,9 @@ typedef enum UBreakIteratorType {
*
* @deprecated ICU 2.8 Use the word break iterator for titlecasing for Unicode 4 and later.
*/
- UBRK_TITLE
+ UBRK_TITLE = 4,
#endif /* U_HIDE_DEPRECATED_API */
-
+ UBRK_COUNT = 5
} UBreakIteratorType;
/** Value indicating all text boundaries have been returned.
@@ -253,7 +153,7 @@ typedef enum UWordBreak {
* word, to allow for further subdivisions of a category in future releases.
* Applications should check for tag values falling within the range, rather
* than for single individual values.
- * @draft ICU 2.8
+ * @stable ICU 2.8
*/
typedef enum ULineBreakTag {
/** Tag value for soft line breaks, positions at which a line break
@@ -275,7 +175,7 @@ typedef enum ULineBreakTag {
* sentence, to allow for further subdivisions of a category in future releases.
* Applications should check for tag values falling within the range, rather
* than for single individual values.
- * @draft ICU 2.8
+ * @stable ICU 2.8
*/
typedef enum USentenceBreakTag {
/** Tag value for for sentences ending with a sentence terminator
@@ -392,6 +292,21 @@ ubrk_setText(UBreakIterator* bi,
int32_t textLength,
UErrorCode* status);
+
+/**
+ * Sets an existing iterator to point to a new piece of text
+ * @param bi The iterator to use
+ * @param text The text to be set
+ * @param status The error code
+ * @draft ICU 3.4
+ */
+U_DRAFT void U_EXPORT2
+ubrk_setUText(UBreakIterator* bi,
+ UText* text,
+ UErrorCode* status);
+
+
+
/**
* Determine the most recently-returned text boundary.
*
@@ -540,9 +455,9 @@ ubrk_getRuleStatus(UBreakIterator *bi);
* @param status receives error codes.
* @return The number of rule status values from rules that determined
* the most recent boundary returned by the break iterator.
- * @draft ICU 3.0
+ * @stable ICU 3.0
*/
-U_DRAFT int32_t U_EXPORT2
+U_STABLE int32_t U_EXPORT2
ubrk_getRuleStatusVec(UBreakIterator *bi, int32_t *fillInVec, int32_t capacity, UErrorCode *status);
/**
@@ -552,9 +467,9 @@ ubrk_getRuleStatusVec(UBreakIterator *bi, int32_t *fillInVec, int32_t capacity,
* @param type locale type (valid or actual)
* @param status error code
* @return locale string
- * @draft ICU 2.8 likely to change in ICU 3.0, based on feedback
+ * @stable ICU 2.8
*/
-U_DRAFT const char* U_EXPORT2
+U_STABLE const char* U_EXPORT2
ubrk_getLocaleByType(const UBreakIterator *bi, ULocDataLocaleType type, UErrorCode* status);
diff --git a/icuSources/common/unicode/ucasemap.h b/icuSources/common/unicode/ucasemap.h
new file mode 100644
index 00000000..17c8f601
--- /dev/null
+++ b/icuSources/common/unicode/ucasemap.h
@@ -0,0 +1,180 @@
+/*
+*******************************************************************************
+*
+* Copyright (C) 2005, International Business Machines
+* Corporation and others. All Rights Reserved.
+*
+*******************************************************************************
+* file name: ucasemap.h
+* encoding: US-ASCII
+* tab size: 8 (not used)
+* indentation:4
+*
+* created on: 2005may06
+* created by: Markus W. Scherer
+*
+* Case mapping service object and functions using it.
+*/
+
+#ifndef __UCASEMAP_H__
+#define __UCASEMAP_H__
+
+#include "unicode/utypes.h"
+#include "unicode/ustring.h"
+
+/**
+ * \file
+ * \brief C API: Unicode case mapping functions using a UCaseMap service object.
+ *
+ * The service object takes care of memory allocations, data loading, and setup
+ * for the attributes, as usual.
+ *
+ * Currently, the functionality provided here does not overlap with uchar.h
+ * and ustring.h.
+ *
+ * ucasemap_utf8ToLower() and ucasemap_utf8ToUpper() operate directly on
+ * UTF-8 strings.
+ */
+
+/**
+ * UCaseMap is an opaque service object for newer ICU case mapping functions.
+ * Older functions did not use a service object.
+ * @draft ICU 3.4
+ */
+struct UCaseMap;
+typedef struct UCaseMap UCaseMap; /**< C typedef for struct UCaseMap. @draft ICU 3.4 */
+
+/**
+ * Open a UCaseMap service object for a locale and a set of options.
+ * The locale ID and options are preprocessed so that functions using the
+ * service object need not process them in each call.
+ *
+ * @param locale ICU locale ID, used for language-dependent
+ * upper-/lower-/title-casing according to the Unicode standard.
+ * Usual semantics: ""=root, NULL=default locale, etc.
+ * @param options Options bit set, used for case folding and string comparisons.
+ * Same flags as for u_foldCase(), u_strFoldCase(),
+ * u_strCaseCompare(), etc.
+ * Use 0 or U_FOLD_CASE_DEFAULT for default behavior.
+ * @param pErrorCode Must be a valid pointer to an error code value,
+ * which must not indicate a failure before the function call.
+ * @return Pointer to a UCaseMap service object, if successful.
+ *
+ * @draft ICU 3.4
+ */
+U_DRAFT UCaseMap * U_EXPORT2
+ucasemap_open(const char *locale, uint32_t options, UErrorCode *pErrorCode);
+
+/**
+ * Close a UCaseMap service object.
+ * @param csm Object to be closed.
+ * @draft ICU 3.4
+ */
+U_DRAFT void U_EXPORT2
+ucasemap_close(UCaseMap *csm);
+
+/**
+ * Get the locale ID that is used for language-dependent case mappings.
+ * @param csm UCaseMap service object.
+ * @return locale ID
+ * @draft ICU 3.4
+ */
+U_DRAFT const char * U_EXPORT2
+ucasemap_getLocale(const UCaseMap *csm);
+
+/**
+ * Get the options bit set that is used for case folding and string comparisons.
+ * @param csm UCaseMap service object.
+ * @return options bit set
+ * @draft ICU 3.4
+ */
+U_DRAFT uint32_t U_EXPORT2
+ucasemap_getOptions(const UCaseMap *csm);
+
+/**
+ * Set the locale ID that is used for language-dependent case mappings.
+ *
+ * @param csm UCaseMap service object.
+ * @param locale Locale ID, see ucasemap_open().
+ * @param pErrorCode Must be a valid pointer to an error code value,
+ * which must not indicate a failure before the function call.
+ *
+ * @see ucasemap_open
+ * @draft ICU 3.4
+ */
+U_DRAFT void U_EXPORT2
+ucasemap_setLocale(UCaseMap *csm, const char *locale, UErrorCode *pErrorCode);
+
+/**
+ * Set the options bit set that is used for case folding and string comparisons.
+ *
+ * @param csm UCaseMap service object.
+ * @param options Options bit set, see ucasemap_open().
+ * @param pErrorCode Must be a valid pointer to an error code value,
+ * which must not indicate a failure before the function call.
+ *
+ * @see ucasemap_open
+ * @draft ICU 3.4
+ */
+U_DRAFT void U_EXPORT2
+ucasemap_setOptions(UCaseMap *csm, uint32_t options, UErrorCode *pErrorCode);
+
+/**
+ * Lowercase the characters in a UTF-8 string.
+ * Casing is locale-dependent and context-sensitive.
+ * The result may be longer or shorter than the original.
+ * The source string and the destination buffer must not overlap.
+ *
+ * @param csm UCaseMap service object.
+ * @param dest A buffer for the result string. The result will be NUL-terminated if
+ * the buffer is large enough.
+ * The contents is undefined in case of failure.
+ * @param destCapacity The size of the buffer (number of bytes). If it is 0, then
+ * dest may be NULL and the function will only return the length of the result
+ * without writing any of the result string.
+ * @param src The original string
+ * @param srcLength The length of the original string. If -1, then src must be NUL-terminated.
+ * @param pErrorCode Must be a valid pointer to an error code value,
+ * which must not indicate a failure before the function call.
+ * @return The length of the result string, if successful - or in case of a buffer overflow,
+ * in which case it will be greater than destCapacity.
+ *
+ * @see u_strToLower
+ * @draft ICU 3.4
+ */
+U_DRAFT int32_t U_EXPORT2
+ucasemap_utf8ToLower(const UCaseMap *csm,
+ char *dest, int32_t destCapacity,
+ const char *src, int32_t srcLength,
+ UErrorCode *pErrorCode);
+
+/**
+ * Uppercase the characters in a UTF-8 string.
+ * Casing is locale-dependent and context-sensitive.
+ * The result may be longer or shorter than the original.
+ * The source string and the destination buffer must not overlap.
+ *
+ * @param csm UCaseMap service object.
+ * @param dest A buffer for the result string. The result will be NUL-terminated if
+ * the buffer is large enough.
+ * The contents is undefined in case of failure.
+ * @param destCapacity The size of the buffer (number of bytes). If it is 0, then
+ * dest may be NULL and the function will only return the length of the result
+ * without writing any of the result string.
+ * @param src The original string
+ * @param srcLength The length of the original string. If -1, then src must be NUL-terminated.
+ * @param pErrorCode Must be a valid pointer to an error code value,
+ * which must not indicate a failure before the function call.
+ * @return The length of the result string, if successful - or in case of a buffer overflow,
+ * in which case it will be greater than destCapacity.
+ *
+ * @see u_strToUpper
+ * @draft ICU 3.4
+ */
+U_DRAFT int32_t U_EXPORT2
+ucasemap_utf8ToUpper(const UCaseMap *csm,
+ char *dest, int32_t destCapacity,
+ const char *src, int32_t srcLength,
+ UErrorCode *pErrorCode);
+
+#endif
diff --git a/icuSources/common/unicode/uchar.h b/icuSources/common/unicode/uchar.h
index 7fd490c8..ce5fc4f4 100644
--- a/icuSources/common/unicode/uchar.h
+++ b/icuSources/common/unicode/uchar.h
@@ -1,6 +1,6 @@
/*
**********************************************************************
-* Copyright (C) 1997-2004, International Business Machines
+* Copyright (C) 1997-2006, International Business Machines
* Corporation and others. All Rights Reserved.
**********************************************************************
*
@@ -39,7 +39,7 @@ U_CDECL_BEGIN
* @see u_getUnicodeVersion
* @stable ICU 2.0
*/
-#define U_UNICODE_VERSION "4.0.1"
+#define U_UNICODE_VERSION "5.0"
/**
* \file
@@ -56,12 +56,12 @@ U_CDECL_BEGIN
*
* For more information see
* "About the Unicode Character Database" (http://www.unicode.org/ucd/)
- * and the ICU User Guide chapter on Properties (http://oss.software.ibm.com/icu/userguide/properties.html).
+ * and the ICU User Guide chapter on Properties (http://icu.sourceforge.net/userguide/properties.html).
*
* Many functions are designed to match java.lang.Character functions.
* See the individual function documentation,
- * and see the JDK 1.4.1 java.lang.Character documentation
- * at http://java.sun.com/j2se/1.4.1/docs/api/java/lang/Character.html
+ * and see the JDK 1.4 java.lang.Character documentation
+ * at http://java.sun.com/j2se/1.4/docs/api/java/lang/Character.html
*
* There are also functions that provide easy migration from C/POSIX functions
* like isblank(). Their use is generally discouraged because the C/POSIX
@@ -77,12 +77,33 @@ U_CDECL_BEGIN
* (In ICU, BreakIterator is the most sophisticated API for word boundaries.)
* Another example: There is no "istitle()" class for titlecase characters.
*
- * A summary of the behavior of some C/POSIX character classification implementations
- * for Unicode is available at http://oss.software.ibm.com/cvs/icu/~checkout~/icuhtml/design/posix_classes.html
- *
- * Important:
- * The behavior of the ICU C/POSIX-style character classification
- * functions is subject to change according to discussion of the above summary.
+ * ICU 3.4 and later provides API access for all twelve C/POSIX character classes.
+ * ICU implements them according to the Standard Recommendations in
+ * Annex C: Compatibility Properties of UTS #18 Unicode Regular Expressions
+ * (http://www.unicode.org/reports/tr18/#Compatibility_Properties).
+ *
+ * API access for C/POSIX character classes is as follows:
+ * - alpha: u_isUAlphabetic(c) or u_hasBinaryProperty(c, UCHAR_ALPHABETIC)
+ * - lower: u_isULowercase(c) or u_hasBinaryProperty(c, UCHAR_LOWERCASE)
+ * - upper: u_isUUppercase(c) or u_hasBinaryProperty(c, UCHAR_UPPERCASE)
+ * - punct: u_ispunct(c)
+ * - digit: u_isdigit(c) or u_charType(c)==U_DECIMAL_DIGIT_NUMBER
+ * - xdigit: u_isxdigit(c) or u_hasBinaryProperty(c, UCHAR_POSIX_XDIGIT)
+ * - alnum: u_hasBinaryProperty(c, UCHAR_POSIX_ALNUM)
+ * - space: u_isUWhiteSpace(c) or u_hasBinaryProperty(c, UCHAR_WHITE_SPACE)
+ * - blank: u_isblank(c) or u_hasBinaryProperty(c, UCHAR_POSIX_BLANK)
+ * - cntrl: u_charType(c)==U_CONTROL_CHAR
+ * - graph: u_hasBinaryProperty(c, UCHAR_POSIX_GRAPH)
+ * - print: u_hasBinaryProperty(c, UCHAR_POSIX_PRINT)
+ *
+ * Note: Some of the u_isxyz() functions in uchar.h predate, and do not match,
+ * the Standard Recommendations in UTS #18. Instead, they match Java
+ * functions according to their API documentation.
+ *
+ * \htmlonly
+ * The C/POSIX character classes are also available in UnicodeSet patterns,
+ * using patterns like [:graph:] or \p{graph}.
+ * \endhtmlonly
*
* Note: There are several ICU whitespace functions.
* Comparison:
@@ -166,137 +187,137 @@ typedef enum UProperty {
/** First constant for binary Unicode properties. @stable ICU 2.1 */
UCHAR_BINARY_START=UCHAR_ALPHABETIC,
/** Binary property ASCII_Hex_Digit. 0-9 A-F a-f @stable ICU 2.1 */
- UCHAR_ASCII_HEX_DIGIT,
+ UCHAR_ASCII_HEX_DIGIT=1,
/** Binary property Bidi_Control.
Format controls which have specific functions
in the Bidi Algorithm. @stable ICU 2.1 */
- UCHAR_BIDI_CONTROL,
+ UCHAR_BIDI_CONTROL=2,
/** Binary property Bidi_Mirrored.
Characters that may change display in RTL text.
Same as u_isMirrored.
See Bidi Algorithm, UTR 9. @stable ICU 2.1 */
- UCHAR_BIDI_MIRRORED,
+ UCHAR_BIDI_MIRRORED=3,
/** Binary property Dash. Variations of dashes. @stable ICU 2.1 */
- UCHAR_DASH,
+ UCHAR_DASH=4,
/** Binary property Default_Ignorable_Code_Point (new in Unicode 3.2).
Ignorable in most processing.
<2060..206F, FFF0..FFFB, E0000..E0FFF>+Other_Default_Ignorable_Code_Point+(Cf+Cc+Cs-White_Space) @stable ICU 2.1 */
- UCHAR_DEFAULT_IGNORABLE_CODE_POINT,
+ UCHAR_DEFAULT_IGNORABLE_CODE_POINT=5,
/** Binary property Deprecated (new in Unicode 3.2).
The usage of deprecated characters is strongly discouraged. @stable ICU 2.1 */
- UCHAR_DEPRECATED,
+ UCHAR_DEPRECATED=6,
/** Binary property Diacritic. Characters that linguistically modify
the meaning of another character to which they apply. @stable ICU 2.1 */
- UCHAR_DIACRITIC,
+ UCHAR_DIACRITIC=7,
/** Binary property Extender.
Extend the value or shape of a preceding alphabetic character,
e.g., length and iteration marks. @stable ICU 2.1 */
- UCHAR_EXTENDER,
+ UCHAR_EXTENDER=8,
/** Binary property Full_Composition_Exclusion.
CompositionExclusions.txt+Singleton Decompositions+
Non-Starter Decompositions. @stable ICU 2.1 */
- UCHAR_FULL_COMPOSITION_EXCLUSION,
+ UCHAR_FULL_COMPOSITION_EXCLUSION=9,
/** Binary property Grapheme_Base (new in Unicode 3.2).
For programmatic determination of grapheme cluster boundaries.
[0..10FFFF]-Cc-Cf-Cs-Co-Cn-Zl-Zp-Grapheme_Link-Grapheme_Extend-CGJ @stable ICU 2.1 */
- UCHAR_GRAPHEME_BASE,
+ UCHAR_GRAPHEME_BASE=10,
/** Binary property Grapheme_Extend (new in Unicode 3.2).
For programmatic determination of grapheme cluster boundaries.
Me+Mn+Mc+Other_Grapheme_Extend-Grapheme_Link-CGJ @stable ICU 2.1 */
- UCHAR_GRAPHEME_EXTEND,
+ UCHAR_GRAPHEME_EXTEND=11,
/** Binary property Grapheme_Link (new in Unicode 3.2).
For programmatic determination of grapheme cluster boundaries. @stable ICU 2.1 */
- UCHAR_GRAPHEME_LINK,
+ UCHAR_GRAPHEME_LINK=12,
/** Binary property Hex_Digit.
Characters commonly used for hexadecimal numbers. @stable ICU 2.1 */
- UCHAR_HEX_DIGIT,
+ UCHAR_HEX_DIGIT=13,
/** Binary property Hyphen. Dashes used to mark connections
between pieces of words, plus the Katakana middle dot. @stable ICU 2.1 */
- UCHAR_HYPHEN,
+ UCHAR_HYPHEN=14,
/** Binary property ID_Continue.
Characters that can continue an identifier.
DerivedCoreProperties.txt also says "NOTE: Cf characters should be filtered out."
ID_Start+Mn+Mc+Nd+Pc @stable ICU 2.1 */
- UCHAR_ID_CONTINUE,
+ UCHAR_ID_CONTINUE=15,
/** Binary property ID_Start.
Characters that can start an identifier.
Lu+Ll+Lt+Lm+Lo+Nl @stable ICU 2.1 */
- UCHAR_ID_START,
+ UCHAR_ID_START=16,
/** Binary property Ideographic.
CJKV ideographs. @stable ICU 2.1 */
- UCHAR_IDEOGRAPHIC,
+ UCHAR_IDEOGRAPHIC=17,
/** Binary property IDS_Binary_Operator (new in Unicode 3.2).
For programmatic determination of
Ideographic Description Sequences. @stable ICU 2.1 */
- UCHAR_IDS_BINARY_OPERATOR,
+ UCHAR_IDS_BINARY_OPERATOR=18,
/** Binary property IDS_Trinary_Operator (new in Unicode 3.2).
For programmatic determination of
Ideographic Description Sequences. @stable ICU 2.1 */
- UCHAR_IDS_TRINARY_OPERATOR,
+ UCHAR_IDS_TRINARY_OPERATOR=19,
/** Binary property Join_Control.
Format controls for cursive joining and ligation. @stable ICU 2.1 */
- UCHAR_JOIN_CONTROL,
+ UCHAR_JOIN_CONTROL=20,
/** Binary property Logical_Order_Exception (new in Unicode 3.2).
Characters that do not use logical order and
require special handling in most processing. @stable ICU 2.1 */
- UCHAR_LOGICAL_ORDER_EXCEPTION,
+ UCHAR_LOGICAL_ORDER_EXCEPTION=21,
/** Binary property Lowercase. Same as u_isULowercase, different from u_islower.
Ll+Other_Lowercase @stable ICU 2.1 */
- UCHAR_LOWERCASE,
+ UCHAR_LOWERCASE=22,
/** Binary property Math. Sm+Other_Math @stable ICU 2.1 */
- UCHAR_MATH,
+ UCHAR_MATH=23,
/** Binary property Noncharacter_Code_Point.
Code points that are explicitly defined as illegal
for the encoding of characters. @stable ICU 2.1 */
- UCHAR_NONCHARACTER_CODE_POINT,
+ UCHAR_NONCHARACTER_CODE_POINT=24,
/** Binary property Quotation_Mark. @stable ICU 2.1 */
- UCHAR_QUOTATION_MARK,
+ UCHAR_QUOTATION_MARK=25,
/** Binary property Radical (new in Unicode 3.2).
For programmatic determination of
Ideographic Description Sequences. @stable ICU 2.1 */
- UCHAR_RADICAL,
+ UCHAR_RADICAL=26,
/** Binary property Soft_Dotted (new in Unicode 3.2).
Characters with a "soft dot", like i or j.
An accent placed on these characters causes
the dot to disappear. @stable ICU 2.1 */
- UCHAR_SOFT_DOTTED,
+ UCHAR_SOFT_DOTTED=27,
/** Binary property Terminal_Punctuation.
Punctuation characters that generally mark
the end of textual units. @stable ICU 2.1 */
- UCHAR_TERMINAL_PUNCTUATION,
+ UCHAR_TERMINAL_PUNCTUATION=28,
/** Binary property Unified_Ideograph (new in Unicode 3.2).
For programmatic determination of
Ideographic Description Sequences. @stable ICU 2.1 */
- UCHAR_UNIFIED_IDEOGRAPH,
+ UCHAR_UNIFIED_IDEOGRAPH=29,
/** Binary property Uppercase. Same as u_isUUppercase, different from u_isupper.
Lu+Other_Uppercase @stable ICU 2.1 */
- UCHAR_UPPERCASE,
+ UCHAR_UPPERCASE=30,
/** Binary property White_Space.
Same as u_isUWhiteSpace, different from u_isspace and u_isWhitespace.
Space characters+TAB+CR+LF-ZWSP-ZWNBSP @stable ICU 2.1 */
- UCHAR_WHITE_SPACE,
+ UCHAR_WHITE_SPACE=31,
/** Binary property XID_Continue.
ID_Continue modified to allow closure under
normalization forms NFKC and NFKD. @stable ICU 2.1 */
- UCHAR_XID_CONTINUE,
+ UCHAR_XID_CONTINUE=32,
/** Binary property XID_Start. ID_Start modified to allow
closure under normalization forms NFKC and NFKD. @stable ICU 2.1 */
- UCHAR_XID_START,
+ UCHAR_XID_START=33,
/** Binary property Case_Sensitive. Either the source of a case
mapping or _in_ the target of a case mapping. Not the same as
the general category Cased_Letter. @stable ICU 2.6 */
- UCHAR_CASE_SENSITIVE,
+ UCHAR_CASE_SENSITIVE=34,
/** Binary property STerm (new in Unicode 4.0.1).
Sentence Terminal. Used in UAX #29: Text Boundaries
(http://www.unicode.org/reports/tr29/)
- @draft ICU 3.0 */
- UCHAR_S_TERM,
+ @stable ICU 3.0 */
+ UCHAR_S_TERM=35,
/** Binary property Variation_Selector (new in Unicode 4.0.1).
Indicates all those characters that qualify as Variation Selectors.
For details on the behavior of these characters,
see StandardizedVariants.html and 15.6 Variation Selectors.
- @draft ICU 3.0 */
- UCHAR_VARIATION_SELECTOR,
+ @stable ICU 3.0 */
+ UCHAR_VARIATION_SELECTOR=36,
/** Binary property NFD_Inert.
ICU-specific property for characters that are inert under NFD,
i.e., they do not interact with adjacent characters.
@@ -318,8 +339,8 @@ typedef enum UProperty {
See also com.ibm.text.UCD.NFSkippable in the ICU4J repository,
and icu/source/common/unormimp.h .
- @draft ICU 3.0 */
- UCHAR_NFD_INERT,
+ @stable ICU 3.0 */
+ UCHAR_NFD_INERT=37,
/** Binary property NFKD_Inert.
ICU-specific property for characters that are inert under NFKD,
i.e., they do not interact with adjacent characters.
@@ -327,8 +348,8 @@ typedef enum UProperty {
to find the boundary of safely normalizable text despite possible
text additions.
@see UCHAR_NFD_INERT
- @draft ICU 3.0 */
- UCHAR_NFKD_INERT,
+ @stable ICU 3.0 */
+ UCHAR_NFKD_INERT=38,
/** Binary property NFC_Inert.
ICU-specific property for characters that are inert under NFC,
i.e., they do not interact with adjacent characters.
@@ -336,8 +357,8 @@ typedef enum UProperty {
to find the boundary of safely normalizable text despite possible
text additions.
@see UCHAR_NFD_INERT
- @draft ICU 3.0 */
- UCHAR_NFC_INERT,
+ @stable ICU 3.0 */
+ UCHAR_NFC_INERT=39,
/** Binary property NFKC_Inert.
ICU-specific property for characters that are inert under NFKC,
i.e., they do not interact with adjacent characters.
@@ -345,8 +366,8 @@ typedef enum UProperty {
to find the boundary of safely normalizable text despite possible
text additions.
@see UCHAR_NFD_INERT
- @draft ICU 3.0 */
- UCHAR_NFKC_INERT,
+ @stable ICU 3.0 */
+ UCHAR_NFKC_INERT=40,
/** Binary Property Segment_Starter.
ICU-specific property for characters that are starters in terms of
Unicode normalization and combining character sequences.
@@ -356,10 +377,47 @@ typedef enum UProperty {
ICU uses this property for segmenting a string for generating a set of
canonically equivalent strings, e.g. for canonical closure while
processing collation tailoring rules.
- @draft ICU 3.0 */
- UCHAR_SEGMENT_STARTER,
+ @stable ICU 3.0 */
+ UCHAR_SEGMENT_STARTER=41,
+#ifndef U_HIDE_DRAFT_API
+ /** Binary property Pattern_Syntax (new in Unicode 4.1).
+ See UAX #31 Identifier and Pattern Syntax
+ (http://www.unicode.org/reports/tr31/)
+ @draft ICU 3.4 */
+ UCHAR_PATTERN_SYNTAX=42,
+ /** Binary property Pattern_White_Space (new in Unicode 4.1).
+ See UAX #31 Identifier and Pattern Syntax
+ (http://www.unicode.org/reports/tr31/)
+ @draft ICU 3.4 */
+ UCHAR_PATTERN_WHITE_SPACE=43,
+ /** Binary property alnum (a C/POSIX character class).
+ Implemented according to the UTS #18 Annex C Standard Recommendation.
+ See the uchar.h file documentation.
+ @draft ICU 3.4 */
+ UCHAR_POSIX_ALNUM=44,
+ /** Binary property blank (a C/POSIX character class).
+ Implemented according to the UTS #18 Annex C Standard Recommendation.
+ See the uchar.h file documentation.
+ @draft ICU 3.4 */
+ UCHAR_POSIX_BLANK=45,
+ /** Binary property graph (a C/POSIX character class).
+ Implemented according to the UTS #18 Annex C Standard Recommendation.
+ See the uchar.h file documentation.
+ @draft ICU 3.4 */
+ UCHAR_POSIX_GRAPH=46,
+ /** Binary property print (a C/POSIX character class).
+ Implemented according to the UTS #18 Annex C Standard Recommendation.
+ See the uchar.h file documentation.
+ @draft ICU 3.4 */
+ UCHAR_POSIX_PRINT=47,
+ /** Binary property xdigit (a C/POSIX character class).
+ Implemented according to the UTS #18 Annex C Standard Recommendation.
+ See the uchar.h file documentation.
+ @draft ICU 3.4 */
+ UCHAR_POSIX_XDIGIT=48,
+#endif /* U_HIDE_DRAFT_API */
/** One more than the last constant for binary Unicode properties. @stable ICU 2.1 */
- UCHAR_BINARY_LIMIT,
+ UCHAR_BINARY_LIMIT=49,
/** Enumerated property Bidi_Class.
Same as u_charDirection, returns UCharDirection values. @stable ICU 2.2 */
@@ -368,66 +426,83 @@ typedef enum UProperty {
UCHAR_INT_START=UCHAR_BIDI_CLASS,
/** Enumerated property Block.
Same as ublock_getCode, returns UBlockCode values. @stable ICU 2.2 */
- UCHAR_BLOCK,
+ UCHAR_BLOCK=0x1001,
/** Enumerated property Canonical_Combining_Class.
Same as u_getCombiningClass, returns 8-bit numeric values. @stable ICU 2.2 */
- UCHAR_CANONICAL_COMBINING_CLASS,
+ UCHAR_CANONICAL_COMBINING_CLASS=0x1002,
/** Enumerated property Decomposition_Type.
Returns UDecompositionType values. @stable ICU 2.2 */
- UCHAR_DECOMPOSITION_TYPE,
+ UCHAR_DECOMPOSITION_TYPE=0x1003,
/** Enumerated property East_Asian_Width.
See http://www.unicode.org/reports/tr11/
Returns UEastAsianWidth values. @stable ICU 2.2 */
- UCHAR_EAST_ASIAN_WIDTH,
+ UCHAR_EAST_ASIAN_WIDTH=0x1004,
/** Enumerated property General_Category.
Same as u_charType, returns UCharCategory values. @stable ICU 2.2 */
- UCHAR_GENERAL_CATEGORY,
+ UCHAR_GENERAL_CATEGORY=0x1005,
/** Enumerated property Joining_Group.
Returns UJoiningGroup values. @stable ICU 2.2 */
- UCHAR_JOINING_GROUP,
+ UCHAR_JOINING_GROUP=0x1006,
/** Enumerated property Joining_Type.
Returns UJoiningType values. @stable ICU 2.2 */
- UCHAR_JOINING_TYPE,
+ UCHAR_JOINING_TYPE=0x1007,
/** Enumerated property Line_Break.
Returns ULineBreak values. @stable ICU 2.2 */
- UCHAR_LINE_BREAK,
+ UCHAR_LINE_BREAK=0x1008,
/** Enumerated property Numeric_Type.
Returns UNumericType values. @stable ICU 2.2 */
- UCHAR_NUMERIC_TYPE,
+ UCHAR_NUMERIC_TYPE=0x1009,
/** Enumerated property Script.
Same as uscript_getScript, returns UScriptCode values. @stable ICU 2.2 */
- UCHAR_SCRIPT,
+ UCHAR_SCRIPT=0x100A,
/** Enumerated property Hangul_Syllable_Type, new in Unicode 4.
Returns UHangulSyllableType values. @stable ICU 2.6 */
- UCHAR_HANGUL_SYLLABLE_TYPE,
+ UCHAR_HANGUL_SYLLABLE_TYPE=0x100B,
/** Enumerated property NFD_Quick_Check.
- Returns UNormalizationCheckResult values. @draft ICU 3.0 */
- UCHAR_NFD_QUICK_CHECK,
+ Returns UNormalizationCheckResult values. @stable ICU 3.0 */
+ UCHAR_NFD_QUICK_CHECK=0x100C,
/** Enumerated property NFKD_Quick_Check.
- Returns UNormalizationCheckResult values. @draft ICU 3.0 */
- UCHAR_NFKD_QUICK_CHECK,
+ Returns UNormalizationCheckResult values. @stable ICU 3.0 */
+ UCHAR_NFKD_QUICK_CHECK=0x100D,
/** Enumerated property NFC_Quick_Check.
- Returns UNormalizationCheckResult values. @draft ICU 3.0 */
- UCHAR_NFC_QUICK_CHECK,
+ Returns UNormalizationCheckResult values. @stable ICU 3.0 */
+ UCHAR_NFC_QUICK_CHECK=0x100E,
/** Enumerated property NFKC_Quick_Check.
- Returns UNormalizationCheckResult values. @draft ICU 3.0 */
- UCHAR_NFKC_QUICK_CHECK,
+ Returns UNormalizationCheckResult values. @stable ICU 3.0 */
+ UCHAR_NFKC_QUICK_CHECK=0x100F,
/** Enumerated property Lead_Canonical_Combining_Class.
ICU-specific property for the ccc of the first code point
of the decomposition, or lccc(c)=ccc(NFD(c)[0]).
Useful for checking for canonically ordered text;
see UNORM_FCD and http://www.unicode.org/notes/tn5/#FCD .
- Returns 8-bit numeric values like UCHAR_CANONICAL_COMBINING_CLASS. @draft ICU 3.0 */
- UCHAR_LEAD_CANONICAL_COMBINING_CLASS,
+ Returns 8-bit numeric values like UCHAR_CANONICAL_COMBINING_CLASS. @stable ICU 3.0 */
+ UCHAR_LEAD_CANONICAL_COMBINING_CLASS=0x1010,
/** Enumerated property Trail_Canonical_Combining_Class.
ICU-specific property for the ccc of the last code point
of the decomposition, or tccc(c)=ccc(NFD(c)[last]).
Useful for checking for canonically ordered text;
see UNORM_FCD and http://www.unicode.org/notes/tn5/#FCD .
- Returns 8-bit numeric values like UCHAR_CANONICAL_COMBINING_CLASS. @draft ICU 3.0 */
- UCHAR_TRAIL_CANONICAL_COMBINING_CLASS,
+ Returns 8-bit numeric values like UCHAR_CANONICAL_COMBINING_CLASS. @stable ICU 3.0 */
+ UCHAR_TRAIL_CANONICAL_COMBINING_CLASS=0x1011,
+#ifndef U_HIDE_DRAFT_API
+ /** Enumerated property Grapheme_Cluster_Break (new in Unicode 4.1).
+ Used in UAX #29: Text Boundaries
+ (http://www.unicode.org/reports/tr29/)
+ Returns UGraphemeClusterBreak values. @draft ICU 3.4 */
+ UCHAR_GRAPHEME_CLUSTER_BREAK=0x1012,
+ /** Enumerated property Sentence_Break (new in Unicode 4.1).
+ Used in UAX #29: Text Boundaries
+ (http://www.unicode.org/reports/tr29/)
+ Returns USentenceBreak values. @draft ICU 3.4 */
+ UCHAR_SENTENCE_BREAK=0x1013,
+ /** Enumerated property Word_Break (new in Unicode 4.1).
+ Used in UAX #29: Text Boundaries
+ (http://www.unicode.org/reports/tr29/)
+ Returns UWordBreakValues values. @draft ICU 3.4 */
+ UCHAR_WORD_BREAK=0x1014,
+#endif /*U_HIDE_DRAFT_API*/
/** One more than the last constant for enumerated/integer Unicode properties. @stable ICU 2.2 */
- UCHAR_INT_LIMIT,
+ UCHAR_INT_LIMIT=0x1015,
/** Bitmask property General_Category_Mask.
This is the General_Category property returned as a bit mask.
@@ -441,7 +516,7 @@ typedef enum UProperty {
/** First constant for bit-mask Unicode properties. @stable ICU 2.4 */
UCHAR_MASK_START=UCHAR_GENERAL_CATEGORY_MASK,
/** One more than the last constant for bit-mask Unicode properties. @stable ICU 2.4 */
- UCHAR_MASK_LIMIT,
+ UCHAR_MASK_LIMIT=0x2001,
/** Double property Numeric_Value.
Corresponds to u_getNumericValue. @stable ICU 2.4 */
@@ -449,7 +524,7 @@ typedef enum UProperty {
/** First constant for double Unicode properties. @stable ICU 2.4 */
UCHAR_DOUBLE_START=UCHAR_NUMERIC_VALUE,
/** One more than the last constant for double Unicode properties. @stable ICU 2.4 */
- UCHAR_DOUBLE_LIMIT,
+ UCHAR_DOUBLE_LIMIT=0x3001,
/** String property Age.
Corresponds to u_charAge. @stable ICU 2.4 */
@@ -458,42 +533,42 @@ typedef enum UProperty {
UCHAR_STRING_START=UCHAR_AGE,
/** String property Bidi_Mirroring_Glyph.
Corresponds to u_charMirror. @stable ICU 2.4 */
- UCHAR_BIDI_MIRRORING_GLYPH,
+ UCHAR_BIDI_MIRRORING_GLYPH=0x4001,
/** String property Case_Folding.
Corresponds to u_strFoldCase in ustring.h. @stable ICU 2.4 */
- UCHAR_CASE_FOLDING,
+ UCHAR_CASE_FOLDING=0x4002,
/** String property ISO_Comment.
Corresponds to u_getISOComment. @stable ICU 2.4 */
- UCHAR_ISO_COMMENT,
+ UCHAR_ISO_COMMENT=0x4003,
/** String property Lowercase_Mapping.
Corresponds to u_strToLower in ustring.h. @stable ICU 2.4 */
- UCHAR_LOWERCASE_MAPPING,
+ UCHAR_LOWERCASE_MAPPING=0x4004,
/** String property Name.
Corresponds to u_charName. @stable ICU 2.4 */
- UCHAR_NAME,
+ UCHAR_NAME=0x4005,
/** String property Simple_Case_Folding.
Corresponds to u_foldCase. @stable ICU 2.4 */
- UCHAR_SIMPLE_CASE_FOLDING,
+ UCHAR_SIMPLE_CASE_FOLDING=0x4006,
/** String property Simple_Lowercase_Mapping.
Corresponds to u_tolower. @stable ICU 2.4 */
- UCHAR_SIMPLE_LOWERCASE_MAPPING,
+ UCHAR_SIMPLE_LOWERCASE_MAPPING=0x4007,
/** String property Simple_Titlecase_Mapping.
Corresponds to u_totitle. @stable ICU 2.4 */
- UCHAR_SIMPLE_TITLECASE_MAPPING,
+ UCHAR_SIMPLE_TITLECASE_MAPPING=0x4008,
/** String property Simple_Uppercase_Mapping.
Corresponds to u_toupper. @stable ICU 2.4 */
- UCHAR_SIMPLE_UPPERCASE_MAPPING,
+ UCHAR_SIMPLE_UPPERCASE_MAPPING=0x4009,
/** String property Titlecase_Mapping.
Corresponds to u_strToTitle in ustring.h. @stable ICU 2.4 */
- UCHAR_TITLECASE_MAPPING,
+ UCHAR_TITLECASE_MAPPING=0x400A,
/** String property Unicode_1_Name.
Corresponds to u_charName. @stable ICU 2.4 */
- UCHAR_UNICODE_1_NAME,
+ UCHAR_UNICODE_1_NAME=0x400B,
/** String property Uppercase_Mapping.
Corresponds to u_strToUpper in ustring.h. @stable ICU 2.4 */
- UCHAR_UPPERCASE_MAPPING,
+ UCHAR_UPPERCASE_MAPPING=0x400C,
/** One more than the last constant for string Unicode properties. @stable ICU 2.4 */
- UCHAR_STRING_LIMIT,
+ UCHAR_STRING_LIMIT=0x400D,
/** Represents a nonexistent or invalid property or property value. @stable ICU 2.4 */
UCHAR_INVALID_CODE = -1
@@ -1057,7 +1132,7 @@ enum UBlockCode {
* @stable ICU 2.2
*/
UBLOCK_CYRILLIC_SUPPLEMENTARY = 97,
- /** @draft ICU 3.0 */
+ /** @stable ICU 3.0 */
UBLOCK_CYRILLIC_SUPPLEMENT = UBLOCK_CYRILLIC_SUPPLEMENTARY, /*[0500]*/
/** @stable ICU 2.2 */
UBLOCK_TAGALOG = 98, /*[1700]*/
@@ -1119,8 +1194,75 @@ enum UBlockCode {
/** @stable ICU 2.6 */
UBLOCK_VARIATION_SELECTORS_SUPPLEMENT = 125, /*[E0100]*/
- /** @stable ICU 2.0 */
- UBLOCK_COUNT,
+#ifndef U_HIDE_DRAFT_API
+ /* New blocks in Unicode 4.1 */
+
+ /** @draft ICU 3.4 */
+ UBLOCK_ANCIENT_GREEK_MUSICAL_NOTATION = 126, /*[1D200]*/
+ /** @draft ICU 3.4 */
+ UBLOCK_ANCIENT_GREEK_NUMBERS = 127, /*[10140]*/
+ /** @draft ICU 3.4 */
+ UBLOCK_ARABIC_SUPPLEMENT = 128, /*[0750]*/
+ /** @draft ICU 3.4 */
+ UBLOCK_BUGINESE = 129, /*[1A00]*/
+ /** @draft ICU 3.4 */
+ UBLOCK_CJK_STROKES = 130, /*[31C0]*/
+ /** @draft ICU 3.4 */
+ UBLOCK_COMBINING_DIACRITICAL_MARKS_SUPPLEMENT = 131, /*[1DC0]*/
+ /** @draft ICU 3.4 */
+ UBLOCK_COPTIC = 132, /*[2C80]*/
+ /** @draft ICU 3.4 */
+ UBLOCK_ETHIOPIC_EXTENDED = 133, /*[2D80]*/
+ /** @draft ICU 3.4 */
+ UBLOCK_ETHIOPIC_SUPPLEMENT = 134, /*[1380]*/
+ /** @draft ICU 3.4 */
+ UBLOCK_GEORGIAN_SUPPLEMENT = 135, /*[2D00]*/
+ /** @draft ICU 3.4 */
+ UBLOCK_GLAGOLITIC = 136, /*[2C00]*/
+ /** @draft ICU 3.4 */
+ UBLOCK_KHAROSHTHI = 137, /*[10A00]*/
+ /** @draft ICU 3.4 */
+ UBLOCK_MODIFIER_TONE_LETTERS = 138, /*[A700]*/
+ /** @draft ICU 3.4 */
+ UBLOCK_NEW_TAI_LUE = 139, /*[1980]*/
+ /** @draft ICU 3.4 */
+ UBLOCK_OLD_PERSIAN = 140, /*[103A0]*/
+ /** @draft ICU 3.4 */
+ UBLOCK_PHONETIC_EXTENSIONS_SUPPLEMENT = 141, /*[1D80]*/
+ /** @draft ICU 3.4 */
+ UBLOCK_SUPPLEMENTAL_PUNCTUATION = 142, /*[2E00]*/
+ /** @draft ICU 3.4 */
+ UBLOCK_SYLOTI_NAGRI = 143, /*[A800]*/
+ /** @draft ICU 3.4 */
+ UBLOCK_TIFINAGH = 144, /*[2D30]*/
+ /** @draft ICU 3.4 */
+ UBLOCK_VERTICAL_FORMS = 145, /*[FE10]*/
+
+ /* New blocks in Unicode 5.0 */
+
+ /** @draft ICU 3.6 */
+ UBLOCK_NKO = 146, /*[07C0]*/
+ /** @draft ICU 3.6 */
+ UBLOCK_BALINESE = 147, /*[1B00]*/
+ /** @draft ICU 3.6 */
+ UBLOCK_LATIN_EXTENDED_C = 148, /*[2C60]*/
+ /** @draft ICU 3.6 */
+ UBLOCK_LATIN_EXTENDED_D = 149, /*[A720]*/
+ /** @draft ICU 3.6 */
+ UBLOCK_PHAGS_PA = 150, /*[A840]*/
+ /** @draft ICU 3.6 */
+ UBLOCK_PHOENICIAN = 151, /*[10900]*/
+ /** @draft ICU 3.6 */
+ UBLOCK_CUNEIFORM = 152, /*[12000]*/
+ /** @draft ICU 3.6 */
+ UBLOCK_CUNEIFORM_NUMBERS_AND_PUNCTUATION = 153, /*[12400]*/
+ /** @draft ICU 3.6 */
+ UBLOCK_COUNTING_ROD_NUMERALS = 154, /*[1D360]*/
+
+#endif /*U_HIDE_DRAFT_API*/
+
+ /** @stable ICU 2.0 */
+ UBLOCK_COUNT = 155,
/** @stable ICU 2.0 */
UBLOCK_INVALID_CODE=-1
@@ -1295,6 +1437,72 @@ typedef enum UJoiningGroup {
U_JG_COUNT
} UJoiningGroup;
+/**
+ * Grapheme Cluster Break constants.
+ *
+ * @see UCHAR_GRAPHEME_CLUSTER_BREAK
+ * @draft ICU 3.4
+ */
+typedef enum UGraphemeClusterBreak {
+#ifndef U_HIDE_DRAFT_API
+ U_GCB_OTHER = 0, /*[XX]*/ /*See note !!*/
+ U_GCB_CONTROL = 1, /*[CN]*/
+ U_GCB_CR = 2, /*[CR]*/
+ U_GCB_EXTEND = 3, /*[EX]*/
+ U_GCB_L = 4, /*[L]*/
+ U_GCB_LF = 5, /*[LF]*/
+ U_GCB_LV = 6, /*[LV]*/
+ U_GCB_LVT = 7, /*[LVT]*/
+ U_GCB_T = 8, /*[T]*/
+ U_GCB_V = 9, /*[V]*/
+#endif /*U_HIDE_DRAFT_API*/
+ U_GCB_COUNT = 10
+} UGraphemeClusterBreak;
+
+/**
+ * Word Break constants.
+ * (UWordBreak is a pre-existing enum type in ubrk.h for word break status tags.)
+ *
+ * @see UCHAR_WORD_BREAK
+ * @draft ICU 3.4
+ */
+typedef enum UWordBreakValues {
+#ifndef U_HIDE_DRAFT_API
+ U_WB_OTHER = 0, /*[XX]*/ /*See note !!*/
+ U_WB_ALETTER = 1, /*[LE]*/
+ U_WB_FORMAT = 2, /*[FO]*/
+ U_WB_KATAKANA = 3, /*[KA]*/
+ U_WB_MIDLETTER = 4, /*[ML]*/
+ U_WB_MIDNUM = 5, /*[MN]*/
+ U_WB_NUMERIC = 6, /*[NU]*/
+ U_WB_EXTENDNUMLET = 7, /*[EX]*/
+#endif /*U_HIDE_DRAFT_API*/
+ U_WB_COUNT = 8
+} UWordBreakValues;
+
+/**
+ * Sentence Break constants.
+ *
+ * @see UCHAR_SENTENCE_BREAK
+ * @draft ICU 3.4
+ */
+typedef enum USentenceBreak {
+#ifndef U_HIDE_DRAFT_API
+ U_SB_OTHER = 0, /*[XX]*/ /*See note !!*/
+ U_SB_ATERM = 1, /*[AT]*/
+ U_SB_CLOSE = 2, /*[CL]*/
+ U_SB_FORMAT = 3, /*[FO]*/
+ U_SB_LOWER = 4, /*[LO]*/
+ U_SB_NUMERIC = 5, /*[NU]*/
+ U_SB_OLETTER = 6, /*[LE]*/
+ U_SB_SEP = 7, /*[SE]*/
+ U_SB_SP = 8, /*[SP]*/
+ U_SB_STERM = 9, /*[ST]*/
+ U_SB_UPPER = 10, /*[UP]*/
+#endif /*U_HIDE_DRAFT_API*/
+ U_SB_COUNT = 11
+} USentenceBreak;
+
/**
* Line Break constants.
*
@@ -1302,40 +1510,45 @@ typedef enum UJoiningGroup {
* @stable ICU 2.2
*/
typedef enum ULineBreak {
- U_LB_UNKNOWN, /*[XX]*/ /*See note !!*/
- U_LB_AMBIGUOUS, /*[AI]*/
- U_LB_ALPHABETIC, /*[AL]*/
- U_LB_BREAK_BOTH, /*[B2]*/
- U_LB_BREAK_AFTER, /*[BA]*/
- U_LB_BREAK_BEFORE, /*[BB]*/
- U_LB_MANDATORY_BREAK, /*[BK]*/
- U_LB_CONTINGENT_BREAK, /*[CB]*/
- U_LB_CLOSE_PUNCTUATION, /*[CL]*/
- U_LB_COMBINING_MARK, /*[CM]*/
- U_LB_CARRIAGE_RETURN, /*[CR]*/
- U_LB_EXCLAMATION, /*[EX]*/
- U_LB_GLUE, /*[GL]*/
- U_LB_HYPHEN, /*[HY]*/
- U_LB_IDEOGRAPHIC, /*[ID]*/
- U_LB_INSEPERABLE,
- /** Renamed from the misspelled "inseperable" in Unicode 4.0.1/ICU 3.0 @draft ICU 3.0 */
+ U_LB_UNKNOWN = 0, /*[XX]*/ /*See note !!*/
+ U_LB_AMBIGUOUS = 1, /*[AI]*/
+ U_LB_ALPHABETIC = 2, /*[AL]*/
+ U_LB_BREAK_BOTH = 3, /*[B2]*/
+ U_LB_BREAK_AFTER = 4, /*[BA]*/
+ U_LB_BREAK_BEFORE = 5, /*[BB]*/
+ U_LB_MANDATORY_BREAK = 6, /*[BK]*/
+ U_LB_CONTINGENT_BREAK = 7, /*[CB]*/
+ U_LB_CLOSE_PUNCTUATION = 8, /*[CL]*/
+ U_LB_COMBINING_MARK = 9, /*[CM]*/
+ U_LB_CARRIAGE_RETURN = 10, /*[CR]*/
+ U_LB_EXCLAMATION = 11, /*[EX]*/
+ U_LB_GLUE = 12, /*[GL]*/
+ U_LB_HYPHEN = 13, /*[HY]*/
+ U_LB_IDEOGRAPHIC = 14, /*[ID]*/
+ U_LB_INSEPERABLE = 15,
+ /** Renamed from the misspelled "inseperable" in Unicode 4.0.1/ICU 3.0 @stable ICU 3.0 */
U_LB_INSEPARABLE=U_LB_INSEPERABLE,/*[IN]*/
- U_LB_INFIX_NUMERIC, /*[IS]*/
- U_LB_LINE_FEED, /*[LF]*/
- U_LB_NONSTARTER, /*[NS]*/
- U_LB_NUMERIC, /*[NU]*/
- U_LB_OPEN_PUNCTUATION, /*[OP]*/
- U_LB_POSTFIX_NUMERIC, /*[PO]*/
- U_LB_PREFIX_NUMERIC, /*[PR]*/
- U_LB_QUOTATION, /*[QU]*/
- U_LB_COMPLEX_CONTEXT, /*[SA]*/
- U_LB_SURROGATE, /*[SG]*/
- U_LB_SPACE, /*[SP]*/
- U_LB_BREAK_SYMBOLS, /*[SY]*/
- U_LB_ZWSPACE, /*[ZW]*/
- U_LB_NEXT_LINE, /*[NL]*/ /* from here on: new in Unicode 4/ICU 2.6 */
- U_LB_WORD_JOINER, /*[WJ]*/
- U_LB_COUNT
+ U_LB_INFIX_NUMERIC = 16, /*[IS]*/
+ U_LB_LINE_FEED = 17, /*[LF]*/
+ U_LB_NONSTARTER = 18, /*[NS]*/
+ U_LB_NUMERIC = 19, /*[NU]*/
+ U_LB_OPEN_PUNCTUATION = 20, /*[OP]*/
+ U_LB_POSTFIX_NUMERIC = 21, /*[PO]*/
+ U_LB_PREFIX_NUMERIC = 22, /*[PR]*/
+ U_LB_QUOTATION = 23, /*[QU]*/
+ U_LB_COMPLEX_CONTEXT = 24, /*[SA]*/
+ U_LB_SURROGATE = 25, /*[SG]*/
+ U_LB_SPACE = 26, /*[SP]*/
+ U_LB_BREAK_SYMBOLS = 27, /*[SY]*/
+ U_LB_ZWSPACE = 28, /*[ZW]*/
+ U_LB_NEXT_LINE = 29, /*[NL]*/ /* from here on: new in Unicode 4/ICU 2.6 */
+ U_LB_WORD_JOINER = 30, /*[WJ]*/
+ U_LB_H2 = 31, /*[H2]*/ /* from here on: new in Unicode 4.1/ICU 3.4 */
+ U_LB_H3 = 32, /*[H3]*/
+ U_LB_JL = 33, /*[JL]*/
+ U_LB_JT = 34, /*[JT]*/
+ U_LB_JV = 35, /*[JV]*/
+ U_LB_COUNT = 36
} ULineBreak;
/**
@@ -1606,7 +1819,6 @@ u_getNumericValue(UChar32 c);
* @see UCHAR_LOWERCASE
* @see u_isupper
* @see u_istitle
- * @see u_islower
* @stable ICU 2.0
*/
U_STABLE UBool U_EXPORT2
@@ -2273,7 +2485,7 @@ u_charFromName(UCharNameChoice nameChoice,
* @see u_enumCharNames
* @stable ICU 1.7
*/
-typedef UBool UEnumCharNamesFn(void *context,
+typedef UBool U_CALLCONV UEnumCharNamesFn(void *context,
UChar32 code,
UCharNameChoice nameChoice,
const char *name,
@@ -2568,10 +2780,14 @@ u_isJavaIDPart(UChar32 c);
* Same as java.lang.Character.toLowerCase().
*
* This function only returns the simple, single-code point case mapping.
- * Full case mappings may result in zero, one or more code points and depend
- * on context or language etc.
+ * Full case mappings should be used whenever possible because they produce
+ * better results by working on whole strings.
+ * They take into account the string context and the language and can map
+ * to a result string with a different length as appropriate.
* Full case mappings are applied by the string case mapping functions,
* see ustring.h and the UnicodeString class.
+ * See also the User Guide chapter on C/POSIX migration:
+ * http://icu.sourceforge.net/userguide/posix.html#case_mappings
*
* @param c the code point to be mapped
* @return the Simple_Lowercase_Mapping of the code point, if any;
@@ -2589,10 +2805,14 @@ u_tolower(UChar32 c);
* Same as java.lang.Character.toUpperCase().
*
* This function only returns the simple, single-code point case mapping.
- * Full case mappings may result in zero, one or more code points and depend
- * on context or language etc.
+ * Full case mappings should be used whenever possible because they produce
+ * better results by working on whole strings.
+ * They take into account the string context and the language and can map
+ * to a result string with a different length as appropriate.
* Full case mappings are applied by the string case mapping functions,
* see ustring.h and the UnicodeString class.
+ * See also the User Guide chapter on C/POSIX migration:
+ * http://icu.sourceforge.net/userguide/posix.html#case_mappings
*
* @param c the code point to be mapped
* @return the Simple_Uppercase_Mapping of the code point, if any;
@@ -2610,10 +2830,14 @@ u_toupper(UChar32 c);
* Same as java.lang.Character.toTitleCase().
*
* This function only returns the simple, single-code point case mapping.
- * Full case mappings may result in zero, one or more code points and depend
- * on context or language etc.
+ * Full case mappings should be used whenever possible because they produce
+ * better results by working on whole strings.
+ * They take into account the string context and the language and can map
+ * to a result string with a different length as appropriate.
* Full case mappings are applied by the string case mapping functions,
* see ustring.h and the UnicodeString class.
+ * See also the User Guide chapter on C/POSIX migration:
+ * http://icu.sourceforge.net/userguide/posix.html#case_mappings
*
* @param c the code point to be mapped
* @return the Simple_Titlecase_Mapping of the code point, if any;
@@ -2651,10 +2875,14 @@ u_totitle(UChar32 c);
* itself is returned.
*
* This function only returns the simple, single-code point case mapping.
- * Full case mappings may result in zero, one or more code points and depend
- * on context or language etc.
+ * Full case mappings should be used whenever possible because they produce
+ * better results by working on whole strings.
+ * They take into account the string context and the language and can map
+ * to a result string with a different length as appropriate.
* Full case mappings are applied by the string case mapping functions,
* see ustring.h and the UnicodeString class.
+ * See also the User Guide chapter on C/POSIX migration:
+ * http://icu.sourceforge.net/userguide/posix.html#case_mappings
*
* @param c the code point to be mapped
* @param options Either U_FOLD_CASE_DEFAULT or U_FOLD_CASE_EXCLUDE_SPECIAL_I
diff --git a/icuSources/common/unicode/uchriter.h b/icuSources/common/unicode/uchriter.h
index f81a4bfd..6d5a990f 100644
--- a/icuSources/common/unicode/uchriter.h
+++ b/icuSources/common/unicode/uchriter.h
@@ -1,6 +1,6 @@
/*
**********************************************************************
-* Copyright (C) 1998-2004, International Business Machines
+* Copyright (C) 1998-2005, International Business Machines
* Corporation and others. All Rights Reserved.
**********************************************************************
*/
@@ -11,6 +11,11 @@
#include "unicode/utypes.h"
#include "unicode/chariter.h"
+/**
+ * \file
+ * \brief C++ API: UChar Character Iterator
+ */
+
U_NAMESPACE_BEGIN
/**
diff --git a/icuSources/common/unicode/uclean.h b/icuSources/common/unicode/uclean.h
index 82c6af49..a13924a0 100644
--- a/icuSources/common/unicode/uclean.h
+++ b/icuSources/common/unicode/uclean.h
@@ -1,7 +1,7 @@
/*
******************************************************************************
* *
-* Copyright (C) 2001-2004, International Business Machines *
+* Copyright (C) 2001-2005, International Business Machines *
* Corporation and others. All Rights Reserved. *
* *
******************************************************************************
@@ -18,9 +18,26 @@
#define __UCLEAN_H__
#include "unicode/utypes.h"
-
/**
- * Initialize ICU. This function loads and initializes data items
+ * \file
+ * \brief C API: Initialize and clean up ICU
+ */
+
+/**
+ * Initialize ICU. The description further below applies to ICU 2.6 to ICU 3.4.
+ * Starting with ICU 3.4, u_init() needs not be called any more for
+ * ensuring thread safety, but it can give an indication for whether ICU
+ * can load its data. In ICU 3.4, it will try to load the converter alias table
+ * (cnvalias.icu) and give an error code if that fails.
+ * This may change in the future.
+ *
+ * For ensuring the availability of necessary data, an application should
+ * open the service objects (converters, collators, etc.) that it will use
+ * and check for error codes there.
+ *
+ * Documentation for ICU 2.6 to ICU 3.4:
+ *
+ * This function loads and initializes data items
* that are required internally by various ICU functions. Use of this explicit
* initialization is required in multi-threaded applications; in
* single threaded apps, use is optional, but incurs little additional
@@ -106,7 +123,7 @@ u_cleanup(void);
* An opaque pointer type that represents an ICU mutex.
* For user-implemented mutexes, the value will typically point to a
* struct or object that implements the mutex.
- * @draft ICU 2.8
+ * @stable ICU 2.8
* @system
*/
typedef void *UMTX;
@@ -124,7 +141,7 @@ typedef void *UMTX;
* identify the mutex by the UMTX value.
* @param status Error status. Report errors back to ICU by setting this variable
* with an error code.
- * @draft ICU 2.8
+ * @stable ICU 2.8
* @system
*/
typedef void U_CALLCONV UMtxInitFn (const void *context, UMTX *mutex, UErrorCode* status);
@@ -136,7 +153,7 @@ typedef void U_CALLCONV UMtxInitFn (const void *context, UMTX *mutex, UErrorCod
* whenever ICU needs to lock, unlock, or destroy a mutex.
* @param context user supplied value, obtained from from u_setMutexFunctions().
* @param mutex specify the mutex on which to operate.
- * @draft ICU 2.8
+ * @stable ICU 2.8
* @system
*/
typedef void U_CALLCONV UMtxFn (const void *context, UMTX *mutex);
@@ -158,10 +175,10 @@ typedef void U_CALLCONV UMtxFn (const void *context, UMTX *mutex);
* @param lock pointer to the mutex lock function. Must be non-null.
* @param unlock Pointer to the mutex unlock function. Must be non-null.
* @param status Receives error values.
- * @draft ICU 2.8
+ * @stable ICU 2.8
* @system
*/
-U_DRAFT void U_EXPORT2
+U_STABLE void U_EXPORT2
u_setMutexFunctions(const void *context, UMtxInitFn *init, UMtxFn *destroy, UMtxFn *lock, UMtxFn *unlock,
UErrorCode *status);
@@ -171,7 +188,7 @@ u_setMutexFunctions(const void *context, UMtxInitFn *init, UMtxFn *destroy, UMtx
* @param context user supplied value, obtained from from u_setAtomicIncDecFunctions().
* @param p Pointer to a 32 bit int to be incremented or decremented
* @return The value of the variable after the inc or dec operation.
- * @draft ICU 2.8
+ * @stable ICU 2.8
* @system
*/
typedef int32_t U_CALLCONV UMtxAtomicFn(const void *context, int32_t *p);
@@ -188,10 +205,10 @@ typedef int32_t U_CALLCONV UMtxAtomicFn(const void *context, int32_t *p);
* @param inc Pointer to a function to do an atomic increment operation. Must be non-null.
* @param dec Pointer to a function to do an atomic decrement operation. Must be non-null.
* @param status Receives error values.
- * @draft ICU 2.8
+ * @stable ICU 2.8
* @system
*/
-U_DRAFT void U_EXPORT2
+U_STABLE void U_EXPORT2
u_setAtomicIncDecFunctions(const void *context, UMtxAtomicFn *inc, UMtxAtomicFn *dec,
UErrorCode *status);
@@ -202,7 +219,7 @@ u_setAtomicIncDecFunctions(const void *context, UMtxAtomicFn *inc, UMtxAtomicFn
* @param context user supplied value, obtained from from u_setMemoryFunctions().
* @param size The number of bytes to be allocated
* @return Pointer to the newly allocated memory, or NULL if the allocation failed.
- * @draft ICU 2.8
+ * @stable ICU 2.8
* @system
*/
typedef void *U_CALLCONV UMemAllocFn(const void *context, size_t size);
@@ -211,7 +228,7 @@ typedef void *U_CALLCONV UMemAllocFn(const void *context, size_t size);
* @param context user supplied value, obtained from from u_setMemoryFunctions().
* @param size The number of bytes to be allocated
* @return Pointer to the newly allocated memory, or NULL if the allocation failed.
- * @draft ICU 2.8
+ * @stable ICU 2.8
* @system
*/
typedef void *U_CALLCONV UMemReallocFn(const void *context, void *mem, size_t size);
@@ -222,7 +239,7 @@ typedef void *U_CALLCONV UMemReallocFn(const void *context, void *mem, size_t si
* @param mem Pointer to the memory block to be resized
* @param size The new size for the block
* @return Pointer to the resized memory block, or NULL if the resizing failed.
- * @draft ICU 2.8
+ * @stable ICU 2.8
* @system
*/
typedef void U_CALLCONV UMemFreeFn (const void *context, void *mem);
@@ -240,10 +257,10 @@ typedef void U_CALLCONV UMemFreeFn (const void *context, void *mem);
* @param r Pointer to a user-supplied realloc function.
* @param f Pointer to a user-supplied free function.
* @param status Receives error values.
- * @draft ICU 2.8
+ * @stable ICU 2.8
* @system
*/
-U_DRAFT void U_EXPORT2
+U_STABLE void U_EXPORT2
u_setMemoryFunctions(const void *context, UMemAllocFn *a, UMemReallocFn *r, UMemFreeFn *f,
UErrorCode *status);
diff --git a/icuSources/common/unicode/ucnv.h b/icuSources/common/unicode/ucnv.h
index a042f7ab..f8fce55b 100644
--- a/icuSources/common/unicode/ucnv.h
+++ b/icuSources/common/unicode/ucnv.h
@@ -1,6 +1,6 @@
/*
**********************************************************************
-* Copyright (C) 1999-2004, International Business Machines
+* Copyright (C) 1999-2006, International Business Machines
* Corporation and others. All Rights Reserved.
**********************************************************************
* ucnv.h:
@@ -35,12 +35,12 @@
*
*
When a converter encounters an illegal, irregular, invalid or unmappable character
* its default behavior is to use a substitution character to replace the
- * bad byte sequence. This behavior can be changed by using {@link ucnv_getFromUCallBack() }
- * or {@link ucnv_getToUCallBack() } on the converter. The header ucnv_err.h defines
+ * bad byte sequence. This behavior can be changed by using {@link ucnv_setFromUCallBack() }
+ * or {@link ucnv_setToUCallBack() } on the converter. The header ucnv_err.h defines
* many other callback actions that can be used instead of a character substitution.
*
* More information about this API can be found in our
- * User's
+ * User's
* Guide.
*/
@@ -151,6 +151,9 @@ typedef enum {
* @param codeUnits Points to 'length' bytes of the concerned codepage sequence
* @param length Size (in bytes) of the concerned codepage sequence
* @param reason Defines the reason the callback was invoked
+ * @param pErrorCode ICU error code in/out parameter.
+ * For converter callback functions, set to a conversion error
+ * before the call, and the callback may reset it to U_ZERO_ERROR.
* @see ucnv_setToUCallBack
* @see UConverterToUnicodeArgs
* @stable ICU 2.0
@@ -161,7 +164,7 @@ typedef void (U_EXPORT2 *UConverterToUCallback) (
const char *codeUnits,
int32_t length,
UConverterCallbackReason reason,
- UErrorCode *);
+ UErrorCode *pErrorCode);
/**
* Function pointer for error callback in the unicode to codepage direction.
@@ -172,6 +175,9 @@ typedef void (U_EXPORT2 *UConverterToUCallback) (
* @param length Size (in bytes) of the concerned codepage sequence
* @param codePoint Single UChar32 (UTF-32) containing the concerend Unicode codepoint.
* @param reason Defines the reason the callback was invoked
+ * @param pErrorCode ICU error code in/out parameter.
+ * For converter callback functions, set to a conversion error
+ * before the call, and the callback may reset it to U_ZERO_ERROR.
* @see ucnv_setFromUCallBack
* @stable ICU 2.0
*/
@@ -182,7 +188,7 @@ typedef void (U_EXPORT2 *UConverterFromUCallback) (
int32_t length,
UChar32 codePoint,
UConverterCallbackReason reason,
- UErrorCode *);
+ UErrorCode *pErrorCode);
U_CDECL_END
@@ -247,11 +253,13 @@ U_CDECL_END
#define UCNV_SWAP_LFNL_OPTION_STRING ",swaplfnl"
/**
- * Do a fuzzy compare of a two converter/alias names. The comparison
- * is case-insensitive. It also ignores the characters '-', '_', and
- * ' ' (dash, underscore, and space). Thus the strings "UTF-8",
- * "utf_8", and "Utf 8" are exactly equivalent.
- *
+ * Do a fuzzy compare of two converter/alias names.
+ * The comparison is case-insensitive, ignores leading zeroes if they are not
+ * followed by further digits, and ignores all but letters and digits.
+ * Thus the strings "UTF-8", "utf_8", "u*T@f08" and "Utf 8" are exactly equivalent.
+ * See section 1.4, Charset Alias Matching in Unicode Technical Standard #22
+ * at http://www.unicode.org/reports/tr22/
+ *
* @param name1 a converter name or alias, zero-terminated
* @param name2 a converter name or alias, zero-terminated
* @return 0 if the names match, or a negative value if the name1
@@ -264,11 +272,12 @@ ucnv_compareNames(const char *name1, const char *name2);
/**
- * Creates a UConverter object with the names specified as a C string.
+ * Creates a UConverter object with the name of a coded character set specified as a C string.
* The actual name will be resolved with the alias file
* using a case-insensitive string comparison that ignores
- * the delimiters '-', '_', and ' ' (dash, underscore, and space).
- * E.g., the names "UTF8", "utf-8", and "Utf 8" are all equivalent.
+ * leading zeroes and all non-alphanumeric characters.
+ * E.g., the names "UTF8", "utf-8", "u*T@f08" and "Utf 8" are all equivalent.
+ * (See also ucnv_compareNames().)
* If NULL
is passed for the converter name, it will create one with the
* getDefaultName return value.
*
@@ -287,15 +296,27 @@ ucnv_compareNames(const char *name1, const char *name2);
*
* The conversion behavior and names can vary between platforms. ICU may
* convert some characters differently from other platforms. Details on this topic
- * are in the User's
- * Guide.
- *
- * @param converterName Name of the uconv table, may have options appended
+ * are in the User's
+ * Guide. Aliases starting with a "cp" prefix have no specific meaning
+ * other than its an alias starting with the letters "cp". Please do not
+ * associate any meaning to these aliases.
+ *
+ * @param converterName Name of the coded character set table.
+ * This may have options appended to the string.
+ * IANA alias character set names, IBM CCSIDs starting with "ibm-",
+ * Windows codepage numbers starting with "windows-" are frequently
+ * used for this parameter. See ucnv_getAvailableName and
+ * ucnv_getAlias for a complete list that is available.
+ * If this parameter is NULL, the default converter will be used.
* @param err outgoing error status U_MEMORY_ALLOCATION_ERROR, U_FILE_ACCESS_ERROR
* @return the created Unicode converter object, or NULL if an error occured
* @see ucnv_openU
* @see ucnv_openCCSID
+ * @see ucnv_getAvailableName
+ * @see ucnv_getAlias
+ * @see ucnv_getDefaultName
* @see ucnv_close
+ * @ee ucnv_compareNames
* @stable ICU 2.0
*/
U_STABLE UConverter* U_EXPORT2
@@ -307,13 +328,16 @@ ucnv_open(const char *converterName, UErrorCode *err);
* The name should be limited to the ASCII-7 alphanumerics range.
* The actual name will be resolved with the alias file
* using a case-insensitive string comparison that ignores
- * the delimiters '-', '_', and ' ' (dash, underscore, and space).
- * E.g., the names "UTF8", "utf-8", and "Utf 8" are all equivalent.
+ * leading zeroes and all non-alphanumeric characters.
+ * E.g., the names "UTF8", "utf-8", "u*T@f08" and "Utf 8" are all equivalent.
+ * (See also ucnv_compareNames().)
* If NULL is passed for the converter name, it will create
* one with the ucnv_getDefaultName() return value.
* If the alias is ambiguous, then the preferred converter is used
* and the status is set to U_AMBIGUOUS_ALIAS_WARNING.
- * @param name : name of the uconv table in a zero terminated
+ *
+ * See ucnv_open for the complete details
+ * @param name Name of the UConverter table in a zero terminated
* Unicode string
* @param err outgoing error status U_MEMORY_ALLOCATION_ERROR,
* U_FILE_ACCESS_ERROR
@@ -322,7 +346,7 @@ ucnv_open(const char *converterName, UErrorCode *err);
* @see ucnv_open
* @see ucnv_openCCSID
* @see ucnv_close
- * @see ucnv_getDefaultName
+ * @ee ucnv_compareNames
* @stable ICU 2.0
*/
U_STABLE UConverter* U_EXPORT2
@@ -404,7 +428,7 @@ ucnv_openCCSID(int32_t codepage,
* The packageName and converterName must point to an ICU udata object, as defined by
* udata_open( packageName, "cnv", converterName, err)
or equivalent.
* Typically, packageName will refer to a (.dat) file, or to a package registered with
- * udata_setAppData().
+ * udata_setAppData(). Using a full file or directory pathname for packageName is deprecated.
*
* The name will NOT be looked up in the alias mechanism, nor will the converter be
* stored in the converter cache or the alias table. The only way to open further converters
@@ -432,18 +456,39 @@ U_STABLE UConverter* U_EXPORT2
ucnv_openPackage(const char *packageName, const char *converterName, UErrorCode *err);
/**
- * Thread safe cloning operation
+ * Thread safe converter cloning operation.
+ * For most efficient operation, pass in a stackBuffer (and a *pBufferSize)
+ * with at least U_CNV_SAFECLONE_BUFFERSIZE bytes of space.
+ * If the buffer size is sufficient, then the clone will use the stack buffer;
+ * otherwise, it will be allocated, and *pBufferSize will indicate
+ * the actual size. (This should not occur with U_CNV_SAFECLONE_BUFFERSIZE.)
+ *
+ * You must ucnv_close() the clone in any case.
+ *
+ * If *pBufferSize==0, (regardless of whether stackBuffer==NULL or not)
+ * then *pBufferSize will be changed to a sufficient size
+ * for cloning this converter,
+ * without actually cloning the converter ("pure pre-flighting").
+ *
+ * If *pBufferSize is greater than zero but not large enough for a stack-based
+ * clone, then the converter is cloned using newly allocated memory
+ * and *pBufferSize is changed to the necessary size.
+ *
+ * If the converter clone fits into the stack buffer but the stack buffer is not
+ * sufficiently aligned for the clone, then the clone will use an
+ * adjusted pointer and use an accordingly smaller buffer size.
+ *
* @param cnv converter to be cloned
* @param stackBuffer user allocated space for the new clone. If NULL new memory will be allocated.
* If buffer is not large enough, new memory will be allocated.
* Clients can use the U_CNV_SAFECLONE_BUFFERSIZE. This will probably be enough to avoid memory allocations.
- * @param pBufferSize pointer to size of allocated space.
- * If *pBufferSize == 0, a sufficient size for use in cloning will
- * be returned ('pre-flighting')
- * If *pBufferSize is not enough for a stack-based safe clone,
- * new memory will be allocated.
+ * @param pBufferSize pointer to size of allocated space. pBufferSize must not be NULL.
* @param status to indicate whether the operation went on smoothly or there were errors
- * An informational status value, U_SAFECLONE_ALLOCATED_ERROR, is used if any allocations were necessary.
+ * An informational status value, U_SAFECLONE_ALLOCATED_WARNING,
+ * is used if any allocations were necessary.
+ * However, it is better to check if *pBufferSize grew for checking for
+ * allocations because warning codes can be overridden by subsequent
+ * function calls.
* @return pointer to the new clone
* @stable ICU 2.0
*/
@@ -478,6 +523,8 @@ ucnv_close(UConverter * converter);
/**
* Fills in the output parameter, subChars, with the substitution characters
* as multiple bytes.
+ * If ucnv_setSubstString() set a Unicode string because the converter is
+ * stateful, then subChars will be an empty string.
*
* @param converter the Unicode converter
* @param subChars the subsitution characters
@@ -486,6 +533,7 @@ ucnv_close(UConverter * converter);
* @param err the outgoing error status code.
* If the substitution character array is too small, an
* U_INDEX_OUTOFBOUNDS_ERROR will be returned.
+ * @see ucnv_setSubstString
* @see ucnv_setSubstChars
* @stable ICU 2.0
*/
@@ -498,12 +546,19 @@ ucnv_getSubstChars(const UConverter *converter,
/**
* Sets the substitution chars when converting from unicode to a codepage. The
* substitution is specified as a string of 1-4 bytes, and may contain
- * NULL byte.
+ * NULL bytes.
+ * The subChars must represent a single character. The caller needs to know the
+ * byte sequence of a valid character in the converter's charset.
+ * For some converters, for example some ISO 2022 variants, only single-byte
+ * substitution characters may be supported.
+ * The newer ucnv_setSubstString() function relaxes these limitations.
+ *
* @param converter the Unicode converter
* @param subChars the substitution character byte sequence we want set
* @param len the number of bytes in subChars
* @param err the error status code. U_INDEX_OUTOFBOUNDS_ERROR if
* len is bigger than the maximum number of bytes allowed in subchars
+ * @see ucnv_setSubstString
* @see ucnv_getSubstChars
* @stable ICU 2.0
*/
@@ -513,6 +568,39 @@ ucnv_setSubstChars(UConverter *converter,
int8_t len,
UErrorCode *err);
+/**
+ * Set a substitution string for converting from Unicode to a charset.
+ * The caller need not know the charset byte sequence for each charset.
+ *
+ * Unlike ucnv_setSubstChars() which is designed to set a charset byte sequence
+ * for a single character, this function takes a Unicode string with
+ * zero, one or more characters, and immediately verifies that the string can be
+ * converted to the charset.
+ * If not, or if the result is too long (more than 32 bytes as of ICU 3.6),
+ * then the function returns with an error accordingly.
+ *
+ * Also unlike ucnv_setSubstChars(), this function works for stateful charsets
+ * by converting on the fly at the point of substitution rather than setting
+ * a fixed byte sequence.
+ *
+ * @param cnv The UConverter object.
+ * @param s The Unicode string.
+ * @param length The number of UChars in s, or -1 for a NUL-terminated string.
+ * @param err Pointer to a standard ICU error code. Its input value must
+ * pass the U_SUCCESS() test, or else the function returns
+ * immediately. Check for U_FAILURE() on output or use with
+ * function chaining. (See User Guide for details.)
+ *
+ * @see ucnv_setSubstChars
+ * @see ucnv_getSubstChars
+ * @draft ICU 3.6
+ */
+U_DRAFT void U_EXPORT2
+ucnv_setSubstString(UConverter *cnv,
+ const UChar *s,
+ int32_t length,
+ UErrorCode *err);
+
/**
* Fills in the output parameter, errBytes, with the error characters from the
* last failing conversion.
@@ -634,8 +722,6 @@ ucnv_resetFromUnicode(UConverter *converter);
U_STABLE int8_t U_EXPORT2
ucnv_getMaxCharSize(const UConverter *converter);
-#ifndef U_HIDE_DRAFT_API
-
/**
* Calculates the size of a buffer for conversion from Unicode to a charset.
* The calculated size is guaranteed to be sufficient for this conversion.
@@ -653,13 +739,11 @@ ucnv_getMaxCharSize(const UConverter *converter);
* converting length UChars with the converter that returned the maxCharSize.
*
* @see ucnv_getMaxCharSize
- * @draft ICU 2.8
+ * @stable ICU 2.8
*/
#define UCNV_GET_MAX_BYTES_FOR_STRING(length, maxCharSize) \
(((int32_t)(length)+10)*(int32_t)(maxCharSize))
-#endif /*U_HIDE_DRAFT_API*/
-
/**
* Returns the minimum byte length for characters in this codepage.
* This is usually either 1 or 2.
@@ -1192,6 +1276,12 @@ ucnv_getNextUChar(UConverter * converter,
* Internally, two conversions - ucnv_toUnicode() and ucnv_fromUnicode() -
* are used, "pivoting" through 16-bit Unicode.
*
+ * Important: For streaming conversion (multiple function calls for successive
+ * parts of a text stream), the caller must provide a pivot buffer explicitly,
+ * and must preserve the pivot buffer and associated pointers from one
+ * call to another. (The buffer may be moved if its contents and the relative
+ * pointer positions are preserved.)
+ *
* There is a similar function, ucnv_convert(),
* which has the following limitations:
* - it takes charset names, not converter objects, so that
@@ -1203,7 +1293,7 @@ ucnv_getNextUChar(UConverter * converter,
*
* By contrast, ucnv_convertEx()
* - takes UConverter parameters instead of charset names
- * - fully exposes the pivot buffer for complete error handling
+ * - fully exposes the pivot buffer for streaming conversion and complete error handling
*
* ucnv_convertEx() also provides further convenience:
* - an option to reset the converters at the beginning
@@ -1217,6 +1307,7 @@ ucnv_getNextUChar(UConverter * converter,
* or set U_STRING_NOT_TERMINATED_WARNING if the output exactly fills
* the target buffer
* - the pivot buffer can be provided internally;
+ * possible only for whole-string conversion, not streaming conversion;
* in this case, the caller will not be able to get details about where an
* error occurred
* (if pivotStart==NULL, see below)
@@ -1688,11 +1779,14 @@ U_STABLE const char * U_EXPORT2
ucnv_getDefaultName(void);
/**
- * sets the current default converter name. Caller must own the storage for 'name'
- * and preserve it indefinitely.
+ * This function sets the current default converter name.
+ * DO NOT call this function from multiple threads! This function is not
+ * thread safe. If this function needs to be called, it should be called
+ * during application initialization. Most of the time, the results from
+ * ucnv_getDefaultName() is sufficient for your application.
* @param name the converter name to be the default (must exist).
* @see ucnv_getDefaultName
- * @system SYSTEM API
+ * @system
* @stable ICU 2.0
*/
U_STABLE void U_EXPORT2
@@ -1769,7 +1863,7 @@ ucnv_usesFallback(const UConverter *cnv);
* UErrorCode err = U_ZERO_ERROR;
* char input[] = { '\xEF','\xBB', '\xBF','\x41','\x42','\x43' };
* int32_t signatureLength = 0;
- * char *encoding = ucnv_detectUnicodeSignatures(input,sizeof(input),&signatureLength,&err);
+ * char *encoding = ucnv_detectUnicodeSignature(input,sizeof(input),&signatureLength,&err);
* UConverter *conv = NULL;
* UChar output[100];
* UChar *target = output, *out;
@@ -1799,9 +1893,8 @@ ucnv_usesFallback(const UConverter *cnv);
* @param signatureLength A pointer to int32_t to receive the number of bytes that make up the signature
* of the detected UTF. 0 if not detected.
* Can be a NULL pointer.
- * @param pErrorCode A pointer to receive information about any errors that may occur during detection.
- * Must be a valid pointer to an error code value, which must not indicate a failure
- * before the function call.
+ * @param pErrorCode ICU error code in/out parameter.
+ * Must fulfill U_SUCCESS before the function call.
* @return The name of the encoding detected. NULL if encoding is not detected.
* @stable ICU 2.4
*/
@@ -1811,6 +1904,34 @@ ucnv_detectUnicodeSignature(const char* source,
int32_t *signatureLength,
UErrorCode *pErrorCode);
+/**
+ * Returns the number of UChars held in the converter's internal state
+ * because more input is needed for completing the conversion. This function is
+ * useful for mapping semantics of ICU's converter interface to those of iconv,
+ * and this information is not needed for normal conversion.
+ * @param cnv The converter in which the input is held
+ * @param status ICU error code in/out parameter.
+ * Must fulfill U_SUCCESS before the function call.
+ * @return The number of UChars in the state. -1 if an error is encountered.
+ * @draft ICU 3.4
+ */
+U_DRAFT int32_t U_EXPORT2
+ucnv_fromUCountPending(const UConverter* cnv, UErrorCode* status);
+
+/**
+ * Returns the number of chars held in the converter's internal state
+ * because more input is needed for completing the conversion. This function is
+ * useful for mapping semantics of ICU's converter interface to those of iconv,
+ * and this information is not needed for normal conversion.
+ * @param cnv The converter in which the input is held as internal state
+ * @param status ICU error code in/out parameter.
+ * Must fulfill U_SUCCESS before the function call.
+ * @return The number of chars in the state. -1 if an error is encountered.
+ * @draft ICU 3.4
+ */
+U_DRAFT int32_t U_EXPORT2
+ucnv_toUCountPending(const UConverter* cnv, UErrorCode* status);
+
#endif
#endif
diff --git a/icuSources/common/unicode/ucnv_err.h b/icuSources/common/unicode/ucnv_err.h
index 2a6104c7..b0db7bc1 100644
--- a/icuSources/common/unicode/ucnv_err.h
+++ b/icuSources/common/unicode/ucnv_err.h
@@ -1,6 +1,6 @@
/*
**********************************************************************
-* Copyright (C) 1999-2004, International Business Machines
+* Copyright (C) 1999-2005, International Business Machines
* Corporation and others. All Rights Reserved.
**********************************************************************
*
@@ -122,14 +122,14 @@ typedef struct UConverter UConverter;
*/
#define UCNV_ESCAPE_C "C"
/**
- * FROM_U_CALLBACK_ESCAPE context option to escape the code unit according to XML Decimal escape (&#DDDD;)
- * TO_U_CALLBACK_ESCAPE context option to escape the character value accoding to XML Decimal escape (&#DDDD;)
+ * FROM_U_CALLBACK_ESCAPE context option to escape the code unit according to XML Decimal escape \htmlonly(&#DDDD;)\endhtmlonly
+ * TO_U_CALLBACK_ESCAPE context option to escape the character value accoding to XML Decimal escape \htmlonly(&#DDDD;)\endhtmlonly
* @stable ICU 2.0
*/
#define UCNV_ESCAPE_XML_DEC "D"
/**
- * FROM_U_CALLBACK_ESCAPE context option to escape the code unit according to XML Hex escape (&#xXXXX;)
- * TO_U_CALLBACK_ESCAPE context option to escape the character value accoding to XML Hex escape (&#xXXXX;)
+ * FROM_U_CALLBACK_ESCAPE context option to escape the code unit according to XML Hex escape \htmlonly(&#xXXXX;)\endhtmlonly
+ * TO_U_CALLBACK_ESCAPE context option to escape the character value accoding to XML Hex escape \htmlonly(&#xXXXX;)\endhtmlonly
* @stable ICU 2.0
*/
#define UCNV_ESCAPE_XML_HEX "X"
@@ -340,17 +340,17 @@ U_STABLE void U_EXPORT2 UCNV_FROM_U_CALLBACK_SUBSTITUTE (
* Note that codeUnit(32bit int eg: unit of a surrogate pair) is represented as
* \\U00023456
*
UCNV_ESCAPE_XML_DEC: Substitues the ILLEGAL SEQUENCE with the decimal
- * representation in the format &#DDDDDDDD;, e.g. "¬죾").
+ * representation in the format \htmlonly&#DDDDDDDD;, e.g. "¬죾")\endhtmlonly.
* In the Event the converter doesn't support the characters {&,#}[0-9],
* it will substitute the illegal sequence with the substitution characters.
* Note that codeUnit(32bit int eg: unit of a surrogate pair) is represented as
* 𣑖 and Zero padding is ignored.
* UCNV_ESCAPE_XML_HEX:Substitues the ILLEGAL SEQUENCE with the decimal
- * representation in the format XXXX, e.g. "¬죾").
+ * representation in the format \htmlonly&#xXXXX; e.g. "¬죾")\endhtmlonly.
* In the Event the converter doesn't support the characters {&,#,x}[0-9],
* it will substitute the illegal sequence with the substitution characters.
* Note that codeUnit(32bit int eg: unit of a surrogate pair) is represented as
- * 𣑖
+ * \htmlonly𣑖\endhtmlonly
*
* @param fromUArgs Information about the conversion in progress
* @param codeUnits Points to 'length' UChars of the concerned Unicode sequence
diff --git a/icuSources/common/unicode/uconfig.h b/icuSources/common/unicode/uconfig.h
index 997cf686..8dea2ab8 100644
--- a/icuSources/common/unicode/uconfig.h
+++ b/icuSources/common/unicode/uconfig.h
@@ -1,6 +1,6 @@
/*
**********************************************************************
-* Copyright (C) 2002-2004, International Business Machines
+* Copyright (C) 2002-2006, International Business Machines
* Corporation and others. All Rights Reserved.
**********************************************************************
* file name: uconfig.h
@@ -24,6 +24,13 @@
* The switches are fairly coarse, controlling large modules.
* Basic services cannot be turned off.
*
+ * Building with any of these options does not guarantee that the
+ * ICU build process will completely work. It is recommended that
+ * the ICU libraries and data be built using the normal build.
+ * At that time you should remove the data used by those services.
+ * After building the ICU data library, you should rebuild the ICU
+ * libraries with these switches customized to your needs.
+ *
* @stable ICU 2.4
*/
@@ -34,7 +41,7 @@
* It does not turn off legacy conversion because that is necessary
* for ICU to work on EBCDIC platforms (for the default converter).
* If you want "only collation" and do not build for EBCDIC,
- * then you can #define UCONFIG_NO_LEGACY_CONVERSION 1 as well.
+ * then you can define UCONFIG_NO_LEGACY_CONVERSION 1 as well.
*
* @stable ICU 2.4
*/
@@ -58,12 +65,34 @@
/* common library switches -------------------------------------------------- */
+/**
+ * \def UCONFIG_NO_FILE_IO
+ * This switch turns off all file access in the common library
+ * where file access is only used for data loading.
+ * ICU data must then be provided in the form of a data DLL (or with an
+ * equivalent way to link to the data residing in an executable,
+ * as in building a combined library with both the common library's code and
+ * the data), or via udata_setCommonData().
+ * Application data must be provided via udata_setAppData() or by using
+ * "open" functions that take pointers to data, for example ucol_openBinary().
+ *
+ * File access is not used at all in the i18n library.
+ *
+ * File access cannot be turned off for the icuio library or for the ICU
+ * test suites and ICU tools.
+ *
+ * @draft ICU 3.6
+ */
+#ifndef UCONFIG_NO_FILE_IO
+# define UCONFIG_NO_FILE_IO 0
+#endif
+
/**
* \def UCONFIG_NO_CONVERSION
* ICU will not completely build with this switch turned on.
* This switch turns off all converters.
*
- * @draft ICU 3.2
+ * @stable ICU 3.2
*/
#ifndef UCONFIG_NO_CONVERSION
# define UCONFIG_NO_CONVERSION 0
@@ -177,7 +206,7 @@
* \def UCONFIG_NO_SERVICE
* This switch turns off service registration.
*
- * @draft ICU 3.2
+ * @stable ICU 3.2
*/
#ifndef UCONFIG_NO_SERVICE
# define UCONFIG_NO_SERVICE 0
diff --git a/icuSources/common/unicode/udata.h b/icuSources/common/unicode/udata.h
index ef81cc66..2a12c11f 100644
--- a/icuSources/common/unicode/udata.h
+++ b/icuSources/common/unicode/udata.h
@@ -1,7 +1,7 @@
/*
******************************************************************************
*
-* Copyright (C) 1999-2004, International Business Machines
+* Copyright (C) 1999-2006, International Business Machines
* Corporation and others. All Rights Reserved.
*
******************************************************************************
@@ -35,7 +35,8 @@ U_CDECL_BEGIN
*
* See the User Guide Data Management chapter.
*/
-
+
+#ifndef U_HIDE_INTERNAL_API
/**
* Character used to separate package names from tree names
* @internal ICU 3.0
@@ -66,6 +67,8 @@ U_CDECL_BEGIN
*/
#define U_ICUDATA_ALIAS "ICUDATA"
+#endif /* U_HIDE_INTERNAL_API */
+
/**
* UDataInfo contains the properties about the requested data.
* This is meta data.
@@ -217,7 +220,7 @@ udata_open(const char *path, const char *type, const char *name,
* logically prepended to the ICU data directory string.
*
* For details about ICU data loading see the User Guide
- * Data Management chapter. (http://oss.software.ibm.com/icu/userguide/icudata.html)
+ * Data Management chapter. (http://icu.sourceforge.net/userguide/icudata.html)
*
* @param path Specifies an absolute path and/or a basename for the
* finding of the data in the file system.
@@ -348,6 +351,39 @@ udata_setCommonData(const void *data, UErrorCode *err);
U_STABLE void U_EXPORT2
udata_setAppData(const char *packageName, const void *data, UErrorCode *err);
+/**
+ * Possible settings for udata_setFileAccess()
+ * @see udata_setFileAccess
+ * @draft ICU 3.4
+ */
+typedef enum UDataFileAccess {
+ /** ICU does not access the file system for data loading. */
+ UDATA_NO_FILES,
+ /** ICU only loads data from packages, not from single files. */
+ UDATA_ONLY_PACKAGES,
+ /** ICU loads data from packages first, and only from single files
+ if the data cannot be found in a package. */
+ UDATA_PACKAGES_FIRST,
+ /** ICU looks for data in single files first, then in packages. (default) */
+ UDATA_FILES_FIRST,
+ /** An alias for the default access mode. */
+ UDATA_DEFAULT_ACCESS = UDATA_FILES_FIRST,
+ UDATA_FILE_ACCESS_COUNT
+} UDataFileAccess;
+
+/**
+ * This function may be called to control how ICU loads data. It must be called
+ * before any ICU data is loaded, including application data loaded with ures/ResourceBundle or
+ * udata APIs. It should be called before u_init. This function is not multithread safe.
+ * The results of calling it while other threads are loading data are undefined.
+ * @param access The type of file access to be used
+ * @param status Error code.
+ * @see UDataFileAccess
+ * @draft ICU 3.4
+ */
+U_DRAFT void U_EXPORT2
+udata_setFileAccess(UDataFileAccess access, UErrorCode *status);
+
U_CDECL_END
#endif
diff --git a/icuSources/common/unicode/udeprctd.h b/icuSources/common/unicode/udeprctd.h
index 55301c87..8369eb4a 100644
--- a/icuSources/common/unicode/udeprctd.h
+++ b/icuSources/common/unicode/udeprctd.h
@@ -1,15 +1,15 @@
/*
*******************************************************************************
-* Copyright (C) 2004, International Business Machines
+* Copyright (C) 2004-2006, International Business Machines
* Corporation and others. All Rights Reserved.
*******************************************************************************
*
-* file name: udeprctd.h
+* file name:
* encoding: US-ASCII
* tab size: 8 (not used)
* indentation:4
*
-* Created by: gendraft.pl, a perl script written by Ram Viswanadha
+* Created by: genheaders.pl, a perl script written by Ram Viswanadha
*
* Contains data for commenting out APIs.
* Gets included by umachine.h
@@ -23,16 +23,27 @@
#ifdef U_HIDE_DEPRECATED_API
-#define UBRK_TITLE_3_2 UBRK_TITLE_DEPRECATED_API_DO_NOT_USE
-#define ucol_getLocale_3_2 ucol_getLocale_DEPRECATED_API_DO_NOT_USE
-#define ULOC_REQUESTED_LOCALE_3_2 ULOC_REQUESTED_LOCALE_DEPRECATED_API_DO_NOT_USE
-#define ures_countArrayItems_3_2 ures_countArrayItems_DEPRECATED_API_DO_NOT_USE
-#define ures_getVersionNumber_3_2 ures_getVersionNumber_DEPRECATED_API_DO_NOT_USE
-#define ures_getLocale_3_2 ures_getLocale_DEPRECATED_API_DO_NOT_USE
-#define utrans_open_3_2 utrans_open_DEPRECATED_API_DO_NOT_USE
-#define utrans_getID_3_2 utrans_getID_DEPRECATED_API_DO_NOT_USE
-#define utrans_unregister_3_2 utrans_unregister_DEPRECATED_API_DO_NOT_USE
-#define utrans_getAvailableID_3_2 utrans_getAvailableID_DEPRECATED_API_DO_NOT_USE
+# if U_DISABLE_RENAMING
+# define ucol_getContractions ucol_getContractions_DEPRECATED_API_DO_NOT_USE
+# define ucol_getLocale ucol_getLocale_DEPRECATED_API_DO_NOT_USE
+# define ures_countArrayItems ures_countArrayItems_DEPRECATED_API_DO_NOT_USE
+# define ures_getLocale ures_getLocale_DEPRECATED_API_DO_NOT_USE
+# define ures_getVersionNumber ures_getVersionNumber_DEPRECATED_API_DO_NOT_USE
+# define utrans_getAvailableID utrans_getAvailableID_DEPRECATED_API_DO_NOT_USE
+# define utrans_getID utrans_getID_DEPRECATED_API_DO_NOT_USE
+# define utrans_open utrans_open_DEPRECATED_API_DO_NOT_USE
+# define utrans_unregister utrans_unregister_DEPRECATED_API_DO_NOT_USE
+# else
+# define ucol_getContractions_3_6 ucol_getContractions_DEPRECATED_API_DO_NOT_USE
+# define ucol_getLocale_3_6 ucol_getLocale_DEPRECATED_API_DO_NOT_USE
+# define ures_countArrayItems_3_6 ures_countArrayItems_DEPRECATED_API_DO_NOT_USE
+# define ures_getLocale_3_6 ures_getLocale_DEPRECATED_API_DO_NOT_USE
+# define ures_getVersionNumber_3_6 ures_getVersionNumber_DEPRECATED_API_DO_NOT_USE
+# define utrans_getAvailableID_3_6 utrans_getAvailableID_DEPRECATED_API_DO_NOT_USE
+# define utrans_getID_3_6 utrans_getID_DEPRECATED_API_DO_NOT_USE
+# define utrans_open_3_6 utrans_open_DEPRECATED_API_DO_NOT_USE
+# define utrans_unregister_3_6 utrans_unregister_DEPRECATED_API_DO_NOT_USE
+# endif /* U_DISABLE_RENAMING */
#endif /* U_HIDE_DEPRECATED_API */
#endif /* UDEPRCTD_H */
diff --git a/icuSources/common/unicode/udraft.h b/icuSources/common/unicode/udraft.h
index bd92a60d..2c4150e1 100644
--- a/icuSources/common/unicode/udraft.h
+++ b/icuSources/common/unicode/udraft.h
@@ -1,15 +1,15 @@
/*
*******************************************************************************
-* Copyright (C) 2004, International Business Machines
+* Copyright (C) 2004-2006, International Business Machines
* Corporation and others. All Rights Reserved.
*******************************************************************************
*
-* file name: udraft.h
+* file name:
* encoding: US-ASCII
* tab size: 8 (not used)
* indentation:4
*
-* Created by: gendraft.pl, a perl script written by Ram Viswanadha
+* Created by: genheaders.pl, a perl script written by Ram Viswanadha
*
* Contains data for commenting out APIs.
* Gets included by umachine.h
@@ -23,223 +23,239 @@
#ifdef U_HIDE_DRAFT_API
-#define ULineBreakTag_3_2 ULineBreakTag_DRAFT_API_DO_NOT_USE
-#define USentenceBreakTag_3_2 USentenceBreakTag_DRAFT_API_DO_NOT_USE
-#define ULineBreakTag_3_2 ULineBreakTag_DRAFT_API_DO_NOT_USE
-#define USentenceBreakTag_3_2 USentenceBreakTag_DRAFT_API_DO_NOT_USE
-#define ubrk_getRuleStatusVec_3_2 ubrk_getRuleStatusVec_DRAFT_API_DO_NOT_USE
-#define ubrk_getLocaleByType_3_2 ubrk_getLocaleByType_DRAFT_API_DO_NOT_USE
-#define UCAL_EXTENDED_YEAR_3_2 UCAL_EXTENDED_YEAR_DRAFT_API_DO_NOT_USE
-#define UCAL_JULIAN_DAY_3_2 UCAL_JULIAN_DAY_DRAFT_API_DO_NOT_USE
-#define UCAL_MILLISECONDS_IN_DAY_3_2 UCAL_MILLISECONDS_IN_DAY_DRAFT_API_DO_NOT_USE
-#define UCAL_DAY_OF_MONTH_3_2 UCAL_DAY_OF_MONTH_DRAFT_API_DO_NOT_USE
-#define ucal_getLocaleByType_3_2 ucal_getLocaleByType_DRAFT_API_DO_NOT_USE
-#define UCHAR_S_TERM_3_2 UCHAR_S_TERM_DRAFT_API_DO_NOT_USE
-#define UCHAR_VARIATION_SELECTOR_3_2 UCHAR_VARIATION_SELECTOR_DRAFT_API_DO_NOT_USE
-#define UCHAR_NFD_INERT_3_2 UCHAR_NFD_INERT_DRAFT_API_DO_NOT_USE
-#define UCHAR_NFKD_INERT_3_2 UCHAR_NFKD_INERT_DRAFT_API_DO_NOT_USE
-#define UCHAR_NFC_INERT_3_2 UCHAR_NFC_INERT_DRAFT_API_DO_NOT_USE
-#define UCHAR_NFKC_INERT_3_2 UCHAR_NFKC_INERT_DRAFT_API_DO_NOT_USE
-#define UCHAR_SEGMENT_STARTER_3_2 UCHAR_SEGMENT_STARTER_DRAFT_API_DO_NOT_USE
-#define UCHAR_NFD_QUICK_CHECK_3_2 UCHAR_NFD_QUICK_CHECK_DRAFT_API_DO_NOT_USE
-#define UCHAR_NFKD_QUICK_CHECK_3_2 UCHAR_NFKD_QUICK_CHECK_DRAFT_API_DO_NOT_USE
-#define UCHAR_NFC_QUICK_CHECK_3_2 UCHAR_NFC_QUICK_CHECK_DRAFT_API_DO_NOT_USE
-#define UCHAR_NFKC_QUICK_CHECK_3_2 UCHAR_NFKC_QUICK_CHECK_DRAFT_API_DO_NOT_USE
-#define UCHAR_LEAD_CANONICAL_COMBINING_CLASS_3_2 UCHAR_LEAD_CANONICAL_COMBINING_CLASS_DRAFT_API_DO_NOT_USE
-#define UCHAR_TRAIL_CANONICAL_COMBINING_CLASS_3_2 UCHAR_TRAIL_CANONICAL_COMBINING_CLASS_DRAFT_API_DO_NOT_USE
-#define UBLOCK_CYRILLIC_SUPPLEMENT_3_2 UBLOCK_CYRILLIC_SUPPLEMENT_DRAFT_API_DO_NOT_USE
-#define U_LB_INSEPARABLE_3_2 U_LB_INSEPARABLE_DRAFT_API_DO_NOT_USE
-#define UCNV_GET_MAX_BYTES_FOR_STRING_3_2 UCNV_GET_MAX_BYTES_FOR_STRING_DRAFT_API_DO_NOT_USE
-#define ucol_openFromShortString_3_2 ucol_openFromShortString_DRAFT_API_DO_NOT_USE
-#define ucol_getContractions_3_2 ucol_getContractions_DRAFT_API_DO_NOT_USE
-#define ucol_openAvailableLocales_3_2 ucol_openAvailableLocales_DRAFT_API_DO_NOT_USE
-#define ucol_getKeywords_3_2 ucol_getKeywords_DRAFT_API_DO_NOT_USE
-#define ucol_getKeywordValues_3_2 ucol_getKeywordValues_DRAFT_API_DO_NOT_USE
-#define ucol_getFunctionalEquivalent_3_2 ucol_getFunctionalEquivalent_DRAFT_API_DO_NOT_USE
-#define ucol_getShortDefinitionString_3_2 ucol_getShortDefinitionString_DRAFT_API_DO_NOT_USE
-#define ucol_normalizeShortDefinitionString_3_2 ucol_normalizeShortDefinitionString_DRAFT_API_DO_NOT_USE
-#define ucol_getUCAVersion_3_2 ucol_getUCAVersion_DRAFT_API_DO_NOT_USE
-#define ucol_getLocaleByType_3_2 ucol_getLocaleByType_DRAFT_API_DO_NOT_USE
-#define ucol_cloneBinary_3_2 ucol_cloneBinary_DRAFT_API_DO_NOT_USE
-#define ucol_openBinary_3_2 ucol_openBinary_DRAFT_API_DO_NOT_USE
-#define UCONFIG_NO_CONVERSION_3_2 UCONFIG_NO_CONVERSION_DRAFT_API_DO_NOT_USE
-#define ucurr_forLocale_3_2 ucurr_forLocale_DRAFT_API_DO_NOT_USE
-#define ucurr_getDefaultFractionDigits_3_2 ucurr_getDefaultFractionDigits_DRAFT_API_DO_NOT_USE
-#define ucurr_getRoundingIncrement_3_2 ucurr_getRoundingIncrement_DRAFT_API_DO_NOT_USE
-#define UDateFormatField_3_2 UDateFormatField_DRAFT_API_DO_NOT_USE
-#define UDAT_ERA_FIELD_3_2 UDAT_ERA_FIELD_DRAFT_API_DO_NOT_USE
-#define UDAT_YEAR_FIELD_3_2 UDAT_YEAR_FIELD_DRAFT_API_DO_NOT_USE
-#define UDAT_MONTH_FIELD_3_2 UDAT_MONTH_FIELD_DRAFT_API_DO_NOT_USE
-#define UDAT_DATE_FIELD_3_2 UDAT_DATE_FIELD_DRAFT_API_DO_NOT_USE
-#define UDAT_HOUR_OF_DAY1_FIELD_3_2 UDAT_HOUR_OF_DAY1_FIELD_DRAFT_API_DO_NOT_USE
-#define UDAT_HOUR_OF_DAY0_FIELD_3_2 UDAT_HOUR_OF_DAY0_FIELD_DRAFT_API_DO_NOT_USE
-#define UDAT_MINUTE_FIELD_3_2 UDAT_MINUTE_FIELD_DRAFT_API_DO_NOT_USE
-#define UDAT_SECOND_FIELD_3_2 UDAT_SECOND_FIELD_DRAFT_API_DO_NOT_USE
-#define UDAT_FRACTIONAL_SECOND_FIELD_3_2 UDAT_FRACTIONAL_SECOND_FIELD_DRAFT_API_DO_NOT_USE
-#define UDAT_DAY_OF_WEEK_FIELD_3_2 UDAT_DAY_OF_WEEK_FIELD_DRAFT_API_DO_NOT_USE
-#define UDAT_DAY_OF_YEAR_FIELD_3_2 UDAT_DAY_OF_YEAR_FIELD_DRAFT_API_DO_NOT_USE
-#define UDAT_DAY_OF_WEEK_IN_MONTH_FIELD_3_2 UDAT_DAY_OF_WEEK_IN_MONTH_FIELD_DRAFT_API_DO_NOT_USE
-#define UDAT_WEEK_OF_YEAR_FIELD_3_2 UDAT_WEEK_OF_YEAR_FIELD_DRAFT_API_DO_NOT_USE
-#define UDAT_WEEK_OF_MONTH_FIELD_3_2 UDAT_WEEK_OF_MONTH_FIELD_DRAFT_API_DO_NOT_USE
-#define UDAT_AM_PM_FIELD_3_2 UDAT_AM_PM_FIELD_DRAFT_API_DO_NOT_USE
-#define UDAT_HOUR1_FIELD_3_2 UDAT_HOUR1_FIELD_DRAFT_API_DO_NOT_USE
-#define UDAT_HOUR0_FIELD_3_2 UDAT_HOUR0_FIELD_DRAFT_API_DO_NOT_USE
-#define UDAT_TIMEZONE_FIELD_3_2 UDAT_TIMEZONE_FIELD_DRAFT_API_DO_NOT_USE
-#define UDAT_YEAR_WOY_FIELD_3_2 UDAT_YEAR_WOY_FIELD_DRAFT_API_DO_NOT_USE
-#define UDAT_DOW_LOCAL_FIELD_3_2 UDAT_DOW_LOCAL_FIELD_DRAFT_API_DO_NOT_USE
-#define UDAT_EXTENDED_YEAR_FIELD_3_2 UDAT_EXTENDED_YEAR_FIELD_DRAFT_API_DO_NOT_USE
-#define UDAT_JULIAN_DAY_FIELD_3_2 UDAT_JULIAN_DAY_FIELD_DRAFT_API_DO_NOT_USE
-#define UDAT_MILLISECONDS_IN_DAY_FIELD_3_2 UDAT_MILLISECONDS_IN_DAY_FIELD_DRAFT_API_DO_NOT_USE
-#define UDAT_TIMEZONE_RFC_FIELD_3_2 UDAT_TIMEZONE_RFC_FIELD_DRAFT_API_DO_NOT_USE
-#define UDAT_FIELD_COUNT_3_2 UDAT_FIELD_COUNT_DRAFT_API_DO_NOT_USE
-#define UDateFormatField_3_2 UDateFormatField_DRAFT_API_DO_NOT_USE
-#define udat_getLocaleByType_3_2 udat_getLocaleByType_DRAFT_API_DO_NOT_USE
-#define ULOC_SCRIPT_CAPACITY_3_2 ULOC_SCRIPT_CAPACITY_DRAFT_API_DO_NOT_USE
-#define ULOC_KEYWORDS_CAPACITY_3_2 ULOC_KEYWORDS_CAPACITY_DRAFT_API_DO_NOT_USE
-#define ULOC_KEYWORD_AND_VALUES_CAPACITY_3_2 ULOC_KEYWORD_AND_VALUES_CAPACITY_DRAFT_API_DO_NOT_USE
-#define ULOC_KEYWORD_SEPARATOR_3_2 ULOC_KEYWORD_SEPARATOR_DRAFT_API_DO_NOT_USE
-#define ULOC_KEYWORD_ASSIGN_3_2 ULOC_KEYWORD_ASSIGN_DRAFT_API_DO_NOT_USE
-#define ULOC_KEYWORD_ITEM_SEPARATOR_3_2 ULOC_KEYWORD_ITEM_SEPARATOR_DRAFT_API_DO_NOT_USE
-#define UAcceptResult_3_2 UAcceptResult_DRAFT_API_DO_NOT_USE
-#define uloc_getScript_3_2 uloc_getScript_DRAFT_API_DO_NOT_USE
-#define uloc_canonicalize_3_2 uloc_canonicalize_DRAFT_API_DO_NOT_USE
-#define uloc_getDisplayScript_3_2 uloc_getDisplayScript_DRAFT_API_DO_NOT_USE
-#define uloc_getDisplayKeyword_3_2 uloc_getDisplayKeyword_DRAFT_API_DO_NOT_USE
-#define uloc_getDisplayKeywordValue_3_2 uloc_getDisplayKeywordValue_DRAFT_API_DO_NOT_USE
-#define uloc_getBaseName_3_2 uloc_getBaseName_DRAFT_API_DO_NOT_USE
-#define uloc_openKeywords_3_2 uloc_openKeywords_DRAFT_API_DO_NOT_USE
-#define uloc_getKeywordValue_3_2 uloc_getKeywordValue_DRAFT_API_DO_NOT_USE
-#define uloc_setKeywordValue_3_2 uloc_setKeywordValue_DRAFT_API_DO_NOT_USE
-#define uloc_acceptLanguageFromHTTP_3_2 uloc_acceptLanguageFromHTTP_DRAFT_API_DO_NOT_USE
-#define uloc_acceptLanguage_3_2 uloc_acceptLanguage_DRAFT_API_DO_NOT_USE
-#define UMeasurementSystem_3_2 UMeasurementSystem_DRAFT_API_DO_NOT_USE
-#define UMeasurementSystem_3_2 UMeasurementSystem_DRAFT_API_DO_NOT_USE
-#define ulocdata_getExemplarSet_3_2 ulocdata_getExemplarSet_DRAFT_API_DO_NOT_USE
-#define ulocdata_getMeasurementSystem_3_2 ulocdata_getMeasurementSystem_DRAFT_API_DO_NOT_USE
-#define ulocdata_getPaperSize_3_2 ulocdata_getPaperSize_DRAFT_API_DO_NOT_USE
-#define UINT64_C_3_2 UINT64_C_DRAFT_API_DO_NOT_USE
-#define umsg_getLocaleByType_3_2 umsg_getLocaleByType_DRAFT_API_DO_NOT_USE
-#define U_ETHER_3_2 U_ETHER_DRAFT_API_DO_NOT_USE
-#define US_INV_3_2 US_INV_DRAFT_API_DO_NOT_USE
-#define UNUM_PATTERN_DECIMAL_3_2 UNUM_PATTERN_DECIMAL_DRAFT_API_DO_NOT_USE
-#define UNUM_ORDINAL_3_2 UNUM_ORDINAL_DRAFT_API_DO_NOT_USE
-#define UNUM_DURATION_3_2 UNUM_DURATION_DRAFT_API_DO_NOT_USE
-#define UNUM_PATTERN_RULEBASED_3_2 UNUM_PATTERN_RULEBASED_DRAFT_API_DO_NOT_USE
-#define UNUM_SIGNIFICANT_DIGITS_USED_3_2 UNUM_SIGNIFICANT_DIGITS_USED_DRAFT_API_DO_NOT_USE
-#define UNUM_MIN_SIGNIFICANT_DIGITS_3_2 UNUM_MIN_SIGNIFICANT_DIGITS_DRAFT_API_DO_NOT_USE
-#define UNUM_MAX_SIGNIFICANT_DIGITS_3_2 UNUM_MAX_SIGNIFICANT_DIGITS_DRAFT_API_DO_NOT_USE
-#define UNUM_LENIENT_PARSE_3_2 UNUM_LENIENT_PARSE_DRAFT_API_DO_NOT_USE
-#define UNUM_DEFAULT_RULESET_3_2 UNUM_DEFAULT_RULESET_DRAFT_API_DO_NOT_USE
-#define UNUM_PUBLIC_RULESETS_3_2 UNUM_PUBLIC_RULESETS_DRAFT_API_DO_NOT_USE
-#define UNUM_SIGNIFICANT_DIGIT_SYMBOL_3_2 UNUM_SIGNIFICANT_DIGIT_SYMBOL_DRAFT_API_DO_NOT_USE
-#define unum_formatDoubleCurrency_3_2 unum_formatDoubleCurrency_DRAFT_API_DO_NOT_USE
-#define unum_parseInt64_3_2 unum_parseInt64_DRAFT_API_DO_NOT_USE
-#define unum_parseDoubleCurrency_3_2 unum_parseDoubleCurrency_DRAFT_API_DO_NOT_USE
-#define unum_getLocaleByType_3_2 unum_getLocaleByType_DRAFT_API_DO_NOT_USE
-#define URegularExpression_3_2 URegularExpression_DRAFT_API_DO_NOT_USE
-#define UREGEX_CANON_EQ_3_2 UREGEX_CANON_EQ_DRAFT_API_DO_NOT_USE
-#define UREGEX_UWORD_3_2 UREGEX_UWORD_DRAFT_API_DO_NOT_USE
-#define uregex_open_3_2 uregex_open_DRAFT_API_DO_NOT_USE
-#define uregex_openC_3_2 uregex_openC_DRAFT_API_DO_NOT_USE
-#define uregex_close_3_2 uregex_close_DRAFT_API_DO_NOT_USE
-#define uregex_clone_3_2 uregex_clone_DRAFT_API_DO_NOT_USE
-#define uregex_pattern_3_2 uregex_pattern_DRAFT_API_DO_NOT_USE
-#define uregex_flags_3_2 uregex_flags_DRAFT_API_DO_NOT_USE
-#define uregex_setText_3_2 uregex_setText_DRAFT_API_DO_NOT_USE
-#define uregex_getText_3_2 uregex_getText_DRAFT_API_DO_NOT_USE
-#define uregex_matches_3_2 uregex_matches_DRAFT_API_DO_NOT_USE
-#define uregex_lookingAt_3_2 uregex_lookingAt_DRAFT_API_DO_NOT_USE
-#define uregex_find_3_2 uregex_find_DRAFT_API_DO_NOT_USE
-#define uregex_findNext_3_2 uregex_findNext_DRAFT_API_DO_NOT_USE
-#define uregex_groupCount_3_2 uregex_groupCount_DRAFT_API_DO_NOT_USE
-#define uregex_group_3_2 uregex_group_DRAFT_API_DO_NOT_USE
-#define uregex_start_3_2 uregex_start_DRAFT_API_DO_NOT_USE
-#define uregex_end_3_2 uregex_end_DRAFT_API_DO_NOT_USE
-#define uregex_reset_3_2 uregex_reset_DRAFT_API_DO_NOT_USE
-#define uregex_replaceAll_3_2 uregex_replaceAll_DRAFT_API_DO_NOT_USE
-#define uregex_replaceFirst_3_2 uregex_replaceFirst_DRAFT_API_DO_NOT_USE
-#define uregex_appendReplacement_3_2 uregex_appendReplacement_DRAFT_API_DO_NOT_USE
-#define uregex_appendTail_3_2 uregex_appendTail_DRAFT_API_DO_NOT_USE
-#define uregex_split_3_2 uregex_split_DRAFT_API_DO_NOT_USE
-#define ures_getLocaleByType_3_2 ures_getLocaleByType_DRAFT_API_DO_NOT_USE
-#define ures_openAvailableLocales_3_2 ures_openAvailableLocales_DRAFT_API_DO_NOT_USE
-#define USCRIPT_KATAKANA_OR_HIRAGANA_3_2 USCRIPT_KATAKANA_OR_HIRAGANA_DRAFT_API_DO_NOT_USE
-#define USET_ADD_CASE_MAPPINGS_3_2 USET_ADD_CASE_MAPPINGS_DRAFT_API_DO_NOT_USE
-#define uset_set_3_2 uset_set_DRAFT_API_DO_NOT_USE
-#define uset_applyPattern_3_2 uset_applyPattern_DRAFT_API_DO_NOT_USE
-#define uset_applyIntPropertyValue_3_2 uset_applyIntPropertyValue_DRAFT_API_DO_NOT_USE
-#define uset_applyPropertyAlias_3_2 uset_applyPropertyAlias_DRAFT_API_DO_NOT_USE
-#define uset_resemblesPattern_3_2 uset_resemblesPattern_DRAFT_API_DO_NOT_USE
-#define uset_removeAll_3_2 uset_removeAll_DRAFT_API_DO_NOT_USE
-#define uset_retain_3_2 uset_retain_DRAFT_API_DO_NOT_USE
-#define uset_retainAll_3_2 uset_retainAll_DRAFT_API_DO_NOT_USE
-#define uset_compact_3_2 uset_compact_DRAFT_API_DO_NOT_USE
-#define uset_complementAll_3_2 uset_complementAll_DRAFT_API_DO_NOT_USE
-#define uset_indexOf_3_2 uset_indexOf_DRAFT_API_DO_NOT_USE
-#define uset_charAt_3_2 uset_charAt_DRAFT_API_DO_NOT_USE
-#define uset_containsAll_3_2 uset_containsAll_DRAFT_API_DO_NOT_USE
-#define uset_containsNone_3_2 uset_containsNone_DRAFT_API_DO_NOT_USE
-#define uset_containsSome_3_2 uset_containsSome_DRAFT_API_DO_NOT_USE
-#define uset_equals_3_2 uset_equals_DRAFT_API_DO_NOT_USE
-#define USPREP_DEFAULT_3_2 USPREP_DEFAULT_DRAFT_API_DO_NOT_USE
-#define USPREP_ALLOW_UNASSIGNED_3_2 USPREP_ALLOW_UNASSIGNED_DRAFT_API_DO_NOT_USE
-#define UStringPrepProfile_3_2 UStringPrepProfile_DRAFT_API_DO_NOT_USE
-#define usprep_open_3_2 usprep_open_DRAFT_API_DO_NOT_USE
-#define usprep_close_3_2 usprep_close_DRAFT_API_DO_NOT_USE
-#define usprep_prepare_3_2 usprep_prepare_DRAFT_API_DO_NOT_USE
-#define U_IS_BMP_3_2 U_IS_BMP_DRAFT_API_DO_NOT_USE
-#define U_IS_SUPPLEMENTARY_3_2 U_IS_SUPPLEMENTARY_DRAFT_API_DO_NOT_USE
-#define UDateTimeScale_3_2 UDateTimeScale_DRAFT_API_DO_NOT_USE
-#define UDTS_JAVA_TIME_3_2 UDTS_JAVA_TIME_DRAFT_API_DO_NOT_USE
-#define UDTS_UNIX_TIME_3_2 UDTS_UNIX_TIME_DRAFT_API_DO_NOT_USE
-#define UDTS_ICU4C_TIME_3_2 UDTS_ICU4C_TIME_DRAFT_API_DO_NOT_USE
-#define UDTS_WINDOWS_FILE_TIME_3_2 UDTS_WINDOWS_FILE_TIME_DRAFT_API_DO_NOT_USE
-#define UDTS_WINDOWS_DATE_TIME_3_2 UDTS_WINDOWS_DATE_TIME_DRAFT_API_DO_NOT_USE
-#define UDTS_MAC_OLD_TIME_3_2 UDTS_MAC_OLD_TIME_DRAFT_API_DO_NOT_USE
-#define UDTS_MAC_TIME_3_2 UDTS_MAC_TIME_DRAFT_API_DO_NOT_USE
-#define UDTS_EXCEL_TIME_3_2 UDTS_EXCEL_TIME_DRAFT_API_DO_NOT_USE
-#define UDTS_DB2_TIME_3_2 UDTS_DB2_TIME_DRAFT_API_DO_NOT_USE
-#define UDTS_MAX_SCALE_3_2 UDTS_MAX_SCALE_DRAFT_API_DO_NOT_USE
-#define UDateTimeScale_3_2 UDateTimeScale_DRAFT_API_DO_NOT_USE
-#define UTSV_UNITS_VALUE_3_2 UTSV_UNITS_VALUE_DRAFT_API_DO_NOT_USE
-#define UTSV_EPOCH_OFFSET_VALUE_3_2 UTSV_EPOCH_OFFSET_VALUE_DRAFT_API_DO_NOT_USE
-#define UTSV_FROM_MIN_VALUE_3_2 UTSV_FROM_MIN_VALUE_DRAFT_API_DO_NOT_USE
-#define UTSV_FROM_MAX_VALUE_3_2 UTSV_FROM_MAX_VALUE_DRAFT_API_DO_NOT_USE
-#define UTSV_TO_MIN_VALUE_3_2 UTSV_TO_MIN_VALUE_DRAFT_API_DO_NOT_USE
-#define UTSV_TO_MAX_VALUE_3_2 UTSV_TO_MAX_VALUE_DRAFT_API_DO_NOT_USE
-#define UTSV_EPOCH_OFFSET_PLUS_1_VALUE_3_2 UTSV_EPOCH_OFFSET_PLUS_1_VALUE_DRAFT_API_DO_NOT_USE
-#define UTSV_EPOCH_OFFSET_MINUS_1_VALUE_3_2 UTSV_EPOCH_OFFSET_MINUS_1_VALUE_DRAFT_API_DO_NOT_USE
-#define utmscale_getTimeScaleValue_3_2 utmscale_getTimeScaleValue_DRAFT_API_DO_NOT_USE
-#define utmscale_fromInt64_3_2 utmscale_fromInt64_DRAFT_API_DO_NOT_USE
-#define utmscale_toInt64_3_2 utmscale_toInt64_DRAFT_API_DO_NOT_USE
-#define UTraceLevel_3_2 UTraceLevel_DRAFT_API_DO_NOT_USE
-#define UTraceFunctionNumber_3_2 UTraceFunctionNumber_DRAFT_API_DO_NOT_USE
-#define UTraceEntry_3_2 UTraceEntry_DRAFT_API_DO_NOT_USE
-#define UTraceExit_3_2 UTraceExit_DRAFT_API_DO_NOT_USE
-#define UTraceData_3_2 UTraceData_DRAFT_API_DO_NOT_USE
-#define UTRACE_OFF_3_2 UTRACE_OFF_DRAFT_API_DO_NOT_USE
-#define UTRACE_ERROR_3_2 UTRACE_ERROR_DRAFT_API_DO_NOT_USE
-#define UTRACE_WARNING_3_2 UTRACE_WARNING_DRAFT_API_DO_NOT_USE
-#define UTRACE_OPEN_CLOSE_3_2 UTRACE_OPEN_CLOSE_DRAFT_API_DO_NOT_USE
-#define UTRACE_INFO_3_2 UTRACE_INFO_DRAFT_API_DO_NOT_USE
-#define UTRACE_VERBOSE_3_2 UTRACE_VERBOSE_DRAFT_API_DO_NOT_USE
-#define UTraceLevel_3_2 UTraceLevel_DRAFT_API_DO_NOT_USE
-#define UTraceFunctionNumber_3_2 UTraceFunctionNumber_DRAFT_API_DO_NOT_USE
-#define utrace_setLevel_3_2 utrace_setLevel_DRAFT_API_DO_NOT_USE
-#define utrace_getLevel_3_2 utrace_getLevel_DRAFT_API_DO_NOT_USE
-#define utrace_setFunctions_3_2 utrace_setFunctions_DRAFT_API_DO_NOT_USE
-#define utrace_getFunctions_3_2 utrace_getFunctions_DRAFT_API_DO_NOT_USE
-#define utrace_vformat_3_2 utrace_vformat_DRAFT_API_DO_NOT_USE
-#define utrace_format_3_2 utrace_format_DRAFT_API_DO_NOT_USE
-#define utrace_functionName_3_2 utrace_functionName_DRAFT_API_DO_NOT_USE
-#define utrans_openU_3_2 utrans_openU_DRAFT_API_DO_NOT_USE
-#define utrans_getUnicodeID_3_2 utrans_getUnicodeID_DRAFT_API_DO_NOT_USE
-#define utrans_unregisterID_3_2 utrans_unregisterID_DRAFT_API_DO_NOT_USE
-#define utrans_openIDs_3_2 utrans_openIDs_DRAFT_API_DO_NOT_USE
-#define U_DATA_API_3_2 U_DATA_API_DRAFT_API_DO_NOT_USE
-#define unistr_3_2 unistr_DRAFT_API_DO_NOT_USE
-#define UnicodeSet_3_2 UnicodeSet_DRAFT_API_DO_NOT_USE
-#define UnicodeString_3_2 UnicodeString_DRAFT_API_DO_NOT_USE
+# if U_DISABLE_RENAMING
+# define u_fclose u_fclose_DRAFT_API_DO_NOT_USE
+# define u_feof u_feof_DRAFT_API_DO_NOT_USE
+# define u_fflush u_fflush_DRAFT_API_DO_NOT_USE
+# define u_fgetConverter u_fgetConverter_DRAFT_API_DO_NOT_USE
+# define u_fgetc u_fgetc_DRAFT_API_DO_NOT_USE
+# define u_fgetcodepage u_fgetcodepage_DRAFT_API_DO_NOT_USE
+# define u_fgetcx u_fgetcx_DRAFT_API_DO_NOT_USE
+# define u_fgetfile u_fgetfile_DRAFT_API_DO_NOT_USE
+# define u_fgetlocale u_fgetlocale_DRAFT_API_DO_NOT_USE
+# define u_fgets u_fgets_DRAFT_API_DO_NOT_USE
+# define u_file_read u_file_read_DRAFT_API_DO_NOT_USE
+# define u_file_write u_file_write_DRAFT_API_DO_NOT_USE
+# define u_finit u_finit_DRAFT_API_DO_NOT_USE
+# define u_fopen u_fopen_DRAFT_API_DO_NOT_USE
+# define u_fprintf u_fprintf_DRAFT_API_DO_NOT_USE
+# define u_fprintf_u u_fprintf_u_DRAFT_API_DO_NOT_USE
+# define u_fputc u_fputc_DRAFT_API_DO_NOT_USE
+# define u_fputs u_fputs_DRAFT_API_DO_NOT_USE
+# define u_frewind u_frewind_DRAFT_API_DO_NOT_USE
+# define u_fscanf u_fscanf_DRAFT_API_DO_NOT_USE
+# define u_fscanf_u u_fscanf_u_DRAFT_API_DO_NOT_USE
+# define u_fsetcodepage u_fsetcodepage_DRAFT_API_DO_NOT_USE
+# define u_fsetlocale u_fsetlocale_DRAFT_API_DO_NOT_USE
+# define u_fsettransliterator u_fsettransliterator_DRAFT_API_DO_NOT_USE
+# define u_fstropen u_fstropen_DRAFT_API_DO_NOT_USE
+# define u_fungetc u_fungetc_DRAFT_API_DO_NOT_USE
+# define u_snprintf u_snprintf_DRAFT_API_DO_NOT_USE
+# define u_snprintf_u u_snprintf_u_DRAFT_API_DO_NOT_USE
+# define u_sprintf u_sprintf_DRAFT_API_DO_NOT_USE
+# define u_sprintf_u u_sprintf_u_DRAFT_API_DO_NOT_USE
+# define u_sscanf u_sscanf_DRAFT_API_DO_NOT_USE
+# define u_sscanf_u u_sscanf_u_DRAFT_API_DO_NOT_USE
+# define u_strFromUTF8Lenient u_strFromUTF8Lenient_DRAFT_API_DO_NOT_USE
+# define u_strFromUTF8WithSub u_strFromUTF8WithSub_DRAFT_API_DO_NOT_USE
+# define u_strToUTF8WithSub u_strToUTF8WithSub_DRAFT_API_DO_NOT_USE
+# define u_vfprintf u_vfprintf_DRAFT_API_DO_NOT_USE
+# define u_vfprintf_u u_vfprintf_u_DRAFT_API_DO_NOT_USE
+# define u_vfscanf u_vfscanf_DRAFT_API_DO_NOT_USE
+# define u_vfscanf_u u_vfscanf_u_DRAFT_API_DO_NOT_USE
+# define u_vsnprintf u_vsnprintf_DRAFT_API_DO_NOT_USE
+# define u_vsnprintf_u u_vsnprintf_u_DRAFT_API_DO_NOT_USE
+# define u_vsprintf u_vsprintf_DRAFT_API_DO_NOT_USE
+# define u_vsprintf_u u_vsprintf_u_DRAFT_API_DO_NOT_USE
+# define u_vsscanf u_vsscanf_DRAFT_API_DO_NOT_USE
+# define u_vsscanf_u u_vsscanf_u_DRAFT_API_DO_NOT_USE
+# define ubidi_getProcessedLength ubidi_getProcessedLength_DRAFT_API_DO_NOT_USE
+# define ubidi_getReorderingMode ubidi_getReorderingMode_DRAFT_API_DO_NOT_USE
+# define ubidi_getReorderingOptions ubidi_getReorderingOptions_DRAFT_API_DO_NOT_USE
+# define ubidi_getResultLength ubidi_getResultLength_DRAFT_API_DO_NOT_USE
+# define ubidi_setReorderingMode ubidi_setReorderingMode_DRAFT_API_DO_NOT_USE
+# define ubidi_setReorderingOptions ubidi_setReorderingOptions_DRAFT_API_DO_NOT_USE
+# define ubrk_setUText ubrk_setUText_DRAFT_API_DO_NOT_USE
+# define ucal_getGregorianChange ucal_getGregorianChange_DRAFT_API_DO_NOT_USE
+# define ucal_setGregorianChange ucal_setGregorianChange_DRAFT_API_DO_NOT_USE
+# define ucasemap_close ucasemap_close_DRAFT_API_DO_NOT_USE
+# define ucasemap_getLocale ucasemap_getLocale_DRAFT_API_DO_NOT_USE
+# define ucasemap_getOptions ucasemap_getOptions_DRAFT_API_DO_NOT_USE
+# define ucasemap_open ucasemap_open_DRAFT_API_DO_NOT_USE
+# define ucasemap_setLocale ucasemap_setLocale_DRAFT_API_DO_NOT_USE
+# define ucasemap_setOptions ucasemap_setOptions_DRAFT_API_DO_NOT_USE
+# define ucasemap_utf8ToLower ucasemap_utf8ToLower_DRAFT_API_DO_NOT_USE
+# define ucasemap_utf8ToUpper ucasemap_utf8ToUpper_DRAFT_API_DO_NOT_USE
+# define ucnv_fromUCountPending ucnv_fromUCountPending_DRAFT_API_DO_NOT_USE
+# define ucnv_setSubstString ucnv_setSubstString_DRAFT_API_DO_NOT_USE
+# define ucnv_toUCountPending ucnv_toUCountPending_DRAFT_API_DO_NOT_USE
+# define ucol_getContractionsAndExpansions ucol_getContractionsAndExpansions_DRAFT_API_DO_NOT_USE
+# define ucsdet_close ucsdet_close_DRAFT_API_DO_NOT_USE
+# define ucsdet_detect ucsdet_detect_DRAFT_API_DO_NOT_USE
+# define ucsdet_detectAll ucsdet_detectAll_DRAFT_API_DO_NOT_USE
+# define ucsdet_enableInputFilter ucsdet_enableInputFilter_DRAFT_API_DO_NOT_USE
+# define ucsdet_getAllDetectableCharsets ucsdet_getAllDetectableCharsets_DRAFT_API_DO_NOT_USE
+# define ucsdet_getConfidence ucsdet_getConfidence_DRAFT_API_DO_NOT_USE
+# define ucsdet_getLanguage ucsdet_getLanguage_DRAFT_API_DO_NOT_USE
+# define ucsdet_getName ucsdet_getName_DRAFT_API_DO_NOT_USE
+# define ucsdet_getUChars ucsdet_getUChars_DRAFT_API_DO_NOT_USE
+# define ucsdet_isInputFilterEnabled ucsdet_isInputFilterEnabled_DRAFT_API_DO_NOT_USE
+# define ucsdet_open ucsdet_open_DRAFT_API_DO_NOT_USE
+# define ucsdet_setDeclaredEncoding ucsdet_setDeclaredEncoding_DRAFT_API_DO_NOT_USE
+# define ucsdet_setText ucsdet_setText_DRAFT_API_DO_NOT_USE
+# define udata_setFileAccess udata_setFileAccess_DRAFT_API_DO_NOT_USE
+# define ulocdata_close ulocdata_close_DRAFT_API_DO_NOT_USE
+# define ulocdata_getDelimiter ulocdata_getDelimiter_DRAFT_API_DO_NOT_USE
+# define ulocdata_getExemplarSet ulocdata_getExemplarSet_DRAFT_API_DO_NOT_USE
+# define ulocdata_getNoSubstitute ulocdata_getNoSubstitute_DRAFT_API_DO_NOT_USE
+# define ulocdata_open ulocdata_open_DRAFT_API_DO_NOT_USE
+# define ulocdata_setNoSubstitute ulocdata_setNoSubstitute_DRAFT_API_DO_NOT_USE
+# define ures_getUTF8String ures_getUTF8String_DRAFT_API_DO_NOT_USE
+# define ures_getUTF8StringByIndex ures_getUTF8StringByIndex_DRAFT_API_DO_NOT_USE
+# define ures_getUTF8StringByKey ures_getUTF8StringByKey_DRAFT_API_DO_NOT_USE
+# define uset_addAllCodePoints uset_addAllCodePoints_DRAFT_API_DO_NOT_USE
+# define uset_containsAllCodePoints uset_containsAllCodePoints_DRAFT_API_DO_NOT_USE
+# define utext_char32At utext_char32At_DRAFT_API_DO_NOT_USE
+# define utext_clone utext_clone_DRAFT_API_DO_NOT_USE
+# define utext_close utext_close_DRAFT_API_DO_NOT_USE
+# define utext_copy utext_copy_DRAFT_API_DO_NOT_USE
+# define utext_current32 utext_current32_DRAFT_API_DO_NOT_USE
+# define utext_equals utext_equals_DRAFT_API_DO_NOT_USE
+# define utext_extract utext_extract_DRAFT_API_DO_NOT_USE
+# define utext_freeze utext_freeze_DRAFT_API_DO_NOT_USE
+# define utext_getNativeIndex utext_getNativeIndex_DRAFT_API_DO_NOT_USE
+# define utext_getPreviousNativeIndex utext_getPreviousNativeIndex_DRAFT_API_DO_NOT_USE
+# define utext_hasMetaData utext_hasMetaData_DRAFT_API_DO_NOT_USE
+# define utext_isLengthExpensive utext_isLengthExpensive_DRAFT_API_DO_NOT_USE
+# define utext_isWritable utext_isWritable_DRAFT_API_DO_NOT_USE
+# define utext_moveIndex32 utext_moveIndex32_DRAFT_API_DO_NOT_USE
+# define utext_nativeLength utext_nativeLength_DRAFT_API_DO_NOT_USE
+# define utext_next32 utext_next32_DRAFT_API_DO_NOT_USE
+# define utext_next32From utext_next32From_DRAFT_API_DO_NOT_USE
+# define utext_openUChars utext_openUChars_DRAFT_API_DO_NOT_USE
+# define utext_openUTF8 utext_openUTF8_DRAFT_API_DO_NOT_USE
+# define utext_previous32 utext_previous32_DRAFT_API_DO_NOT_USE
+# define utext_previous32From utext_previous32From_DRAFT_API_DO_NOT_USE
+# define utext_replace utext_replace_DRAFT_API_DO_NOT_USE
+# define utext_setNativeIndex utext_setNativeIndex_DRAFT_API_DO_NOT_USE
+# define utext_setup utext_setup_DRAFT_API_DO_NOT_USE
+# else
+# define u_fclose_3_6 u_fclose_DRAFT_API_DO_NOT_USE
+# define u_feof_3_6 u_feof_DRAFT_API_DO_NOT_USE
+# define u_fflush_3_6 u_fflush_DRAFT_API_DO_NOT_USE
+# define u_fgetConverter_3_6 u_fgetConverter_DRAFT_API_DO_NOT_USE
+# define u_fgetc_3_6 u_fgetc_DRAFT_API_DO_NOT_USE
+# define u_fgetcodepage_3_6 u_fgetcodepage_DRAFT_API_DO_NOT_USE
+# define u_fgetcx_3_6 u_fgetcx_DRAFT_API_DO_NOT_USE
+# define u_fgetfile_3_6 u_fgetfile_DRAFT_API_DO_NOT_USE
+# define u_fgetlocale_3_6 u_fgetlocale_DRAFT_API_DO_NOT_USE
+# define u_fgets_3_6 u_fgets_DRAFT_API_DO_NOT_USE
+# define u_file_read_3_6 u_file_read_DRAFT_API_DO_NOT_USE
+# define u_file_write_3_6 u_file_write_DRAFT_API_DO_NOT_USE
+# define u_finit_3_6 u_finit_DRAFT_API_DO_NOT_USE
+# define u_fopen_3_6 u_fopen_DRAFT_API_DO_NOT_USE
+# define u_fprintf_3_6 u_fprintf_DRAFT_API_DO_NOT_USE
+# define u_fprintf_u_3_6 u_fprintf_u_DRAFT_API_DO_NOT_USE
+# define u_fputc_3_6 u_fputc_DRAFT_API_DO_NOT_USE
+# define u_fputs_3_6 u_fputs_DRAFT_API_DO_NOT_USE
+# define u_frewind_3_6 u_frewind_DRAFT_API_DO_NOT_USE
+# define u_fscanf_3_6 u_fscanf_DRAFT_API_DO_NOT_USE
+# define u_fscanf_u_3_6 u_fscanf_u_DRAFT_API_DO_NOT_USE
+# define u_fsetcodepage_3_6 u_fsetcodepage_DRAFT_API_DO_NOT_USE
+# define u_fsetlocale_3_6 u_fsetlocale_DRAFT_API_DO_NOT_USE
+# define u_fsettransliterator_3_6 u_fsettransliterator_DRAFT_API_DO_NOT_USE
+# define u_fstropen_3_6 u_fstropen_DRAFT_API_DO_NOT_USE
+# define u_fungetc_3_6 u_fungetc_DRAFT_API_DO_NOT_USE
+# define u_snprintf_3_6 u_snprintf_DRAFT_API_DO_NOT_USE
+# define u_snprintf_u_3_6 u_snprintf_u_DRAFT_API_DO_NOT_USE
+# define u_sprintf_3_6 u_sprintf_DRAFT_API_DO_NOT_USE
+# define u_sprintf_u_3_6 u_sprintf_u_DRAFT_API_DO_NOT_USE
+# define u_sscanf_3_6 u_sscanf_DRAFT_API_DO_NOT_USE
+# define u_sscanf_u_3_6 u_sscanf_u_DRAFT_API_DO_NOT_USE
+# define u_strFromUTF8Lenient_3_6 u_strFromUTF8Lenient_DRAFT_API_DO_NOT_USE
+# define u_strFromUTF8WithSub_3_6 u_strFromUTF8WithSub_DRAFT_API_DO_NOT_USE
+# define u_strToUTF8WithSub_3_6 u_strToUTF8WithSub_DRAFT_API_DO_NOT_USE
+# define u_vfprintf_3_6 u_vfprintf_DRAFT_API_DO_NOT_USE
+# define u_vfprintf_u_3_6 u_vfprintf_u_DRAFT_API_DO_NOT_USE
+# define u_vfscanf_3_6 u_vfscanf_DRAFT_API_DO_NOT_USE
+# define u_vfscanf_u_3_6 u_vfscanf_u_DRAFT_API_DO_NOT_USE
+# define u_vsnprintf_3_6 u_vsnprintf_DRAFT_API_DO_NOT_USE
+# define u_vsnprintf_u_3_6 u_vsnprintf_u_DRAFT_API_DO_NOT_USE
+# define u_vsprintf_3_6 u_vsprintf_DRAFT_API_DO_NOT_USE
+# define u_vsprintf_u_3_6 u_vsprintf_u_DRAFT_API_DO_NOT_USE
+# define u_vsscanf_3_6 u_vsscanf_DRAFT_API_DO_NOT_USE
+# define u_vsscanf_u_3_6 u_vsscanf_u_DRAFT_API_DO_NOT_USE
+# define ubidi_getProcessedLength_3_6 ubidi_getProcessedLength_DRAFT_API_DO_NOT_USE
+# define ubidi_getReorderingMode_3_6 ubidi_getReorderingMode_DRAFT_API_DO_NOT_USE
+# define ubidi_getReorderingOptions_3_6 ubidi_getReorderingOptions_DRAFT_API_DO_NOT_USE
+# define ubidi_getResultLength_3_6 ubidi_getResultLength_DRAFT_API_DO_NOT_USE
+# define ubidi_setReorderingMode_3_6 ubidi_setReorderingMode_DRAFT_API_DO_NOT_USE
+# define ubidi_setReorderingOptions_3_6 ubidi_setReorderingOptions_DRAFT_API_DO_NOT_USE
+# define ubrk_setUText_3_6 ubrk_setUText_DRAFT_API_DO_NOT_USE
+# define ucal_getGregorianChange_3_6 ucal_getGregorianChange_DRAFT_API_DO_NOT_USE
+# define ucal_setGregorianChange_3_6 ucal_setGregorianChange_DRAFT_API_DO_NOT_USE
+# define ucasemap_close_3_6 ucasemap_close_DRAFT_API_DO_NOT_USE
+# define ucasemap_getLocale_3_6 ucasemap_getLocale_DRAFT_API_DO_NOT_USE
+# define ucasemap_getOptions_3_6 ucasemap_getOptions_DRAFT_API_DO_NOT_USE
+# define ucasemap_open_3_6 ucasemap_open_DRAFT_API_DO_NOT_USE
+# define ucasemap_setLocale_3_6 ucasemap_setLocale_DRAFT_API_DO_NOT_USE
+# define ucasemap_setOptions_3_6 ucasemap_setOptions_DRAFT_API_DO_NOT_USE
+# define ucasemap_utf8ToLower_3_6 ucasemap_utf8ToLower_DRAFT_API_DO_NOT_USE
+# define ucasemap_utf8ToUpper_3_6 ucasemap_utf8ToUpper_DRAFT_API_DO_NOT_USE
+# define ucnv_fromUCountPending_3_6 ucnv_fromUCountPending_DRAFT_API_DO_NOT_USE
+# define ucnv_setSubstString_3_6 ucnv_setSubstString_DRAFT_API_DO_NOT_USE
+# define ucnv_toUCountPending_3_6 ucnv_toUCountPending_DRAFT_API_DO_NOT_USE
+# define ucol_getContractionsAndExpansions_3_6 ucol_getContractionsAndExpansions_DRAFT_API_DO_NOT_USE
+# define ucsdet_close_3_6 ucsdet_close_DRAFT_API_DO_NOT_USE
+# define ucsdet_detectAll_3_6 ucsdet_detectAll_DRAFT_API_DO_NOT_USE
+# define ucsdet_detect_3_6 ucsdet_detect_DRAFT_API_DO_NOT_USE
+# define ucsdet_enableInputFilter_3_6 ucsdet_enableInputFilter_DRAFT_API_DO_NOT_USE
+# define ucsdet_getAllDetectableCharsets_3_6 ucsdet_getAllDetectableCharsets_DRAFT_API_DO_NOT_USE
+# define ucsdet_getConfidence_3_6 ucsdet_getConfidence_DRAFT_API_DO_NOT_USE
+# define ucsdet_getLanguage_3_6 ucsdet_getLanguage_DRAFT_API_DO_NOT_USE
+# define ucsdet_getName_3_6 ucsdet_getName_DRAFT_API_DO_NOT_USE
+# define ucsdet_getUChars_3_6 ucsdet_getUChars_DRAFT_API_DO_NOT_USE
+# define ucsdet_isInputFilterEnabled_3_6 ucsdet_isInputFilterEnabled_DRAFT_API_DO_NOT_USE
+# define ucsdet_open_3_6 ucsdet_open_DRAFT_API_DO_NOT_USE
+# define ucsdet_setDeclaredEncoding_3_6 ucsdet_setDeclaredEncoding_DRAFT_API_DO_NOT_USE
+# define ucsdet_setText_3_6 ucsdet_setText_DRAFT_API_DO_NOT_USE
+# define udata_setFileAccess_3_6 udata_setFileAccess_DRAFT_API_DO_NOT_USE
+# define ulocdata_close_3_6 ulocdata_close_DRAFT_API_DO_NOT_USE
+# define ulocdata_getDelimiter_3_6 ulocdata_getDelimiter_DRAFT_API_DO_NOT_USE
+# define ulocdata_getExemplarSet_3_6 ulocdata_getExemplarSet_DRAFT_API_DO_NOT_USE
+# define ulocdata_getNoSubstitute_3_6 ulocdata_getNoSubstitute_DRAFT_API_DO_NOT_USE
+# define ulocdata_open_3_6 ulocdata_open_DRAFT_API_DO_NOT_USE
+# define ulocdata_setNoSubstitute_3_6 ulocdata_setNoSubstitute_DRAFT_API_DO_NOT_USE
+# define ures_getUTF8StringByIndex_3_6 ures_getUTF8StringByIndex_DRAFT_API_DO_NOT_USE
+# define ures_getUTF8StringByKey_3_6 ures_getUTF8StringByKey_DRAFT_API_DO_NOT_USE
+# define ures_getUTF8String_3_6 ures_getUTF8String_DRAFT_API_DO_NOT_USE
+# define uset_addAllCodePoints_3_6 uset_addAllCodePoints_DRAFT_API_DO_NOT_USE
+# define uset_containsAllCodePoints_3_6 uset_containsAllCodePoints_DRAFT_API_DO_NOT_USE
+# define utext_char32At_3_6 utext_char32At_DRAFT_API_DO_NOT_USE
+# define utext_clone_3_6 utext_clone_DRAFT_API_DO_NOT_USE
+# define utext_close_3_6 utext_close_DRAFT_API_DO_NOT_USE
+# define utext_copy_3_6 utext_copy_DRAFT_API_DO_NOT_USE
+# define utext_current32_3_6 utext_current32_DRAFT_API_DO_NOT_USE
+# define utext_equals_3_6 utext_equals_DRAFT_API_DO_NOT_USE
+# define utext_extract_3_6 utext_extract_DRAFT_API_DO_NOT_USE
+# define utext_freeze_3_6 utext_freeze_DRAFT_API_DO_NOT_USE
+# define utext_getNativeIndex_3_6 utext_getNativeIndex_DRAFT_API_DO_NOT_USE
+# define utext_getPreviousNativeIndex_3_6 utext_getPreviousNativeIndex_DRAFT_API_DO_NOT_USE
+# define utext_hasMetaData_3_6 utext_hasMetaData_DRAFT_API_DO_NOT_USE
+# define utext_isLengthExpensive_3_6 utext_isLengthExpensive_DRAFT_API_DO_NOT_USE
+# define utext_isWritable_3_6 utext_isWritable_DRAFT_API_DO_NOT_USE
+# define utext_moveIndex32_3_6 utext_moveIndex32_DRAFT_API_DO_NOT_USE
+# define utext_nativeLength_3_6 utext_nativeLength_DRAFT_API_DO_NOT_USE
+# define utext_next32From_3_6 utext_next32From_DRAFT_API_DO_NOT_USE
+# define utext_next32_3_6 utext_next32_DRAFT_API_DO_NOT_USE
+# define utext_openUChars_3_6 utext_openUChars_DRAFT_API_DO_NOT_USE
+# define utext_openUTF8_3_6 utext_openUTF8_DRAFT_API_DO_NOT_USE
+# define utext_previous32From_3_6 utext_previous32From_DRAFT_API_DO_NOT_USE
+# define utext_previous32_3_6 utext_previous32_DRAFT_API_DO_NOT_USE
+# define utext_replace_3_6 utext_replace_DRAFT_API_DO_NOT_USE
+# define utext_setNativeIndex_3_6 utext_setNativeIndex_DRAFT_API_DO_NOT_USE
+# define utext_setup_3_6 utext_setup_DRAFT_API_DO_NOT_USE
+# endif /* U_DISABLE_RENAMING */
#endif /* U_HIDE_DRAFT_API */
#endif /* UDRAFT_H */
diff --git a/icuSources/common/unicode/uenum.h b/icuSources/common/unicode/uenum.h
index 63690f8b..ff9b2999 100644
--- a/icuSources/common/unicode/uenum.h
+++ b/icuSources/common/unicode/uenum.h
@@ -1,7 +1,7 @@
/*
*******************************************************************************
*
-* Copyright (C) 2002-2004, International Business Machines
+* Copyright (C) 2002-2005, International Business Machines
* Corporation and others. All Rights Reserved.
*
*******************************************************************************
@@ -19,6 +19,11 @@
#include "unicode/utypes.h"
+/**
+ * \file
+ * \brief C API: String Enumeration
+ */
+
/**
* An enumeration object.
* For usage in C programs.
diff --git a/icuSources/common/unicode/uidna.h b/icuSources/common/unicode/uidna.h
index 7b1dd0b3..1371b9ed 100644
--- a/icuSources/common/unicode/uidna.h
+++ b/icuSources/common/unicode/uidna.h
@@ -1,7 +1,7 @@
/*
*******************************************************************************
*
- * Copyright (C) 2003-2004, International Business Machines
+ * Copyright (C) 2003-2006, International Business Machines
* Corporation and others. All Rights Reserved.
*
*******************************************************************************
@@ -24,7 +24,9 @@
#include "unicode/parseerr.h"
/**
- *\file
+ * \file
+ * \brief C API: Internationalized Domain Names in Applications Tranformation
+ *
* UIDNA API implements the IDNA protocol as defined in the IDNA RFC
* (http://www.ietf.org/rfc/rfc3490.txt).
* The RFC defines 2 operations: ToASCII and ToUnicode. Domain labels
@@ -47,8 +49,6 @@
*
*/
-#ifndef U_HIDE_DRAFT_API
-
/**
* Option to prohibit processing of unassigned codepoints in the input and
* do not check if the input conforms to STD-3 ASCII rules.
@@ -72,8 +72,6 @@
*/
#define UIDNA_USE_STD3_RULES 0x0002
-#endif /*U_HIDE_DRAFT_API*/
-
/**
* This function implements the ToASCII operation as defined in the IDNA RFC.
* This operation is done on single labels before sending it to something that expects
diff --git a/icuSources/common/unicode/uintrnal.h b/icuSources/common/unicode/uintrnal.h
new file mode 100644
index 00000000..79630d1d
--- /dev/null
+++ b/icuSources/common/unicode/uintrnal.h
@@ -0,0 +1,68 @@
+/*
+*******************************************************************************
+* Copyright (C) 2004-2006, International Business Machines
+* Corporation and others. All Rights Reserved.
+*******************************************************************************
+*
+* file name:
+* encoding: US-ASCII
+* tab size: 8 (not used)
+* indentation:4
+*
+* Created by: genheaders.pl, a perl script written by Ram Viswanadha
+*
+* Contains data for commenting out APIs.
+* Gets included by umachine.h
+*
+* THIS FILE IS MACHINE-GENERATED, DON'T PLAY WITH IT IF YOU DON'T KNOW WHAT
+* YOU ARE DOING, OTHERWISE VERY BAD THINGS WILL HAPPEN!
+*/
+
+#ifndef UINTRNAL_H
+#define UINTRNAL_H
+
+#ifdef U_HIDE_INTERNAL_API
+
+# if U_DISABLE_RENAMING
+# define RegexPatternDump RegexPatternDump_INTERNAL_API_DO_NOT_USE
+# define ucol_collatorToIdentifier ucol_collatorToIdentifier_INTERNAL_API_DO_NOT_USE
+# define ucol_equals ucol_equals_INTERNAL_API_DO_NOT_USE
+# define ucol_forgetUCA ucol_forgetUCA_INTERNAL_API_DO_NOT_USE
+# define ucol_getAttributeOrDefault ucol_getAttributeOrDefault_INTERNAL_API_DO_NOT_USE
+# define ucol_getUnsafeSet ucol_getUnsafeSet_INTERNAL_API_DO_NOT_USE
+# define ucol_identifierToShortString ucol_identifierToShortString_INTERNAL_API_DO_NOT_USE
+# define ucol_openFromIdentifier ucol_openFromIdentifier_INTERNAL_API_DO_NOT_USE
+# define ucol_prepareShortStringOpen ucol_prepareShortStringOpen_INTERNAL_API_DO_NOT_USE
+# define ucol_shortStringToIdentifier ucol_shortStringToIdentifier_INTERNAL_API_DO_NOT_USE
+# define uprv_getDefaultCodepage uprv_getDefaultCodepage_INTERNAL_API_DO_NOT_USE
+# define uprv_getDefaultLocaleID uprv_getDefaultLocaleID_INTERNAL_API_DO_NOT_USE
+# define ures_openFillIn ures_openFillIn_INTERNAL_API_DO_NOT_USE
+# define utf8_appendCharSafeBody utf8_appendCharSafeBody_INTERNAL_API_DO_NOT_USE
+# define utf8_back1SafeBody utf8_back1SafeBody_INTERNAL_API_DO_NOT_USE
+# define utf8_countTrailBytes utf8_countTrailBytes_INTERNAL_API_DO_NOT_USE
+# define utf8_nextCharSafeBody utf8_nextCharSafeBody_INTERNAL_API_DO_NOT_USE
+# define utf8_prevCharSafeBody utf8_prevCharSafeBody_INTERNAL_API_DO_NOT_USE
+# else
+# define RegexPatternDump_3_6 RegexPatternDump_INTERNAL_API_DO_NOT_USE
+# define ucol_collatorToIdentifier_3_6 ucol_collatorToIdentifier_INTERNAL_API_DO_NOT_USE
+# define ucol_equals_3_6 ucol_equals_INTERNAL_API_DO_NOT_USE
+# define ucol_forgetUCA_3_6 ucol_forgetUCA_INTERNAL_API_DO_NOT_USE
+# define ucol_getAttributeOrDefault_3_6 ucol_getAttributeOrDefault_INTERNAL_API_DO_NOT_USE
+# define ucol_getUnsafeSet_3_6 ucol_getUnsafeSet_INTERNAL_API_DO_NOT_USE
+# define ucol_identifierToShortString_3_6 ucol_identifierToShortString_INTERNAL_API_DO_NOT_USE
+# define ucol_openFromIdentifier_3_6 ucol_openFromIdentifier_INTERNAL_API_DO_NOT_USE
+# define ucol_prepareShortStringOpen_3_6 ucol_prepareShortStringOpen_INTERNAL_API_DO_NOT_USE
+# define ucol_shortStringToIdentifier_3_6 ucol_shortStringToIdentifier_INTERNAL_API_DO_NOT_USE
+# define uprv_getDefaultCodepage_3_6 uprv_getDefaultCodepage_INTERNAL_API_DO_NOT_USE
+# define uprv_getDefaultLocaleID_3_6 uprv_getDefaultLocaleID_INTERNAL_API_DO_NOT_USE
+# define ures_openFillIn_3_6 ures_openFillIn_INTERNAL_API_DO_NOT_USE
+# define utf8_appendCharSafeBody_3_6 utf8_appendCharSafeBody_INTERNAL_API_DO_NOT_USE
+# define utf8_back1SafeBody_3_6 utf8_back1SafeBody_INTERNAL_API_DO_NOT_USE
+# define utf8_countTrailBytes_3_6 utf8_countTrailBytes_INTERNAL_API_DO_NOT_USE
+# define utf8_nextCharSafeBody_3_6 utf8_nextCharSafeBody_INTERNAL_API_DO_NOT_USE
+# define utf8_prevCharSafeBody_3_6 utf8_prevCharSafeBody_INTERNAL_API_DO_NOT_USE
+# endif /* U_DISABLE_RENAMING */
+
+#endif /* U_HIDE_INTERNAL_API */
+#endif /* UINTRNAL_H */
+
diff --git a/icuSources/common/unicode/uiter.h b/icuSources/common/unicode/uiter.h
index 963df5cf..42c76677 100644
--- a/icuSources/common/unicode/uiter.h
+++ b/icuSources/common/unicode/uiter.h
@@ -1,7 +1,7 @@
/*
*******************************************************************************
*
-* Copyright (C) 2002-2004, International Business Machines
+* Copyright (C) 2002-2005, International Business Machines
* Corporation and others. All Rights Reserved.
*
*******************************************************************************
diff --git a/icuSources/common/unicode/uloc.h b/icuSources/common/unicode/uloc.h
index f584ec1c..2912f677 100644
--- a/icuSources/common/unicode/uloc.h
+++ b/icuSources/common/unicode/uloc.h
@@ -1,6 +1,6 @@
/*
**********************************************************************
-* Copyright (C) 1997-2004, International Business Machines
+* Copyright (C) 1997-2007, International Business Machines
* Corporation and others. All Rights Reserved.
**********************************************************************
*
@@ -261,47 +261,42 @@
*/
#define ULOC_FULLNAME_CAPACITY 56
-
-#ifndef U_HIDE_DRAFT_API
-
/**
* Useful constant for the maximum size of the script part of a locale ID
* (including the terminating NULL).
- * @draft ICU 2.8
+ * @stable ICU 2.8
*/
#define ULOC_SCRIPT_CAPACITY 6
/**
* Useful constant for the maximum size of keywords in a locale
- * @draft ICU 2.8
+ * @stable ICU 2.8
*/
#define ULOC_KEYWORDS_CAPACITY 50
/**
- * Useful constant for the maximum size of keywords in a locale
- * @draft ICU 2.8
+ * Useful constant for the maximum SIZE of keywords in a locale
+ * @stable ICU 2.8
*/
#define ULOC_KEYWORD_AND_VALUES_CAPACITY 100
/**
* Character separating keywords from the locale string
* different for EBCDIC - TODO
- * @draft ICU 2.8
+ * @stable ICU 2.8
*/
#define ULOC_KEYWORD_SEPARATOR '@'
/**
* Character for assigning value to a keyword
- * @draft ICU 2.8
+ * @stable ICU 2.8
*/
#define ULOC_KEYWORD_ASSIGN '='
/**
* Character separating keywords
- * @draft ICU 2.8
+ * @stable ICU 2.8
*/
#define ULOC_KEYWORD_ITEM_SEPARATOR ';'
-#endif /*U_HIDE_DRAFT_API*/
-
/**
* Constants for *_getLocale()
* Allow user to select whether she wants information on
@@ -333,7 +328,7 @@ typedef enum {
ULOC_REQUESTED_LOCALE = 2,
#endif /* U_HIDE_DEPRECATED_API */
- ULOC_DATA_LOCALE_TYPE_LIMIT
+ ULOC_DATA_LOCALE_TYPE_LIMIT = 3
} ULocDataLocaleType ;
@@ -400,9 +395,9 @@ uloc_getLanguage(const char* localeID,
* @param err error information if retrieving the language code failed
* @return the actual buffer size needed for the language code. If it's greater
* than scriptCapacity, the returned language code will be truncated.
- * @draft ICU 2.8
+ * @stable ICU 2.8
*/
-U_DRAFT int32_t U_EXPORT2
+U_STABLE int32_t U_EXPORT2
uloc_getScript(const char* localeID,
char* script,
int32_t scriptCapacity,
@@ -420,7 +415,7 @@ uloc_getScript(const char* localeID,
* than countryCapacity, the returned country code will be truncated.
* @stable ICU 2.0
*/
-U_DRAFT int32_t U_EXPORT2
+U_STABLE int32_t U_EXPORT2
uloc_getCountry(const char* localeID,
char* country,
int32_t countryCapacity,
@@ -482,9 +477,9 @@ uloc_getName(const char* localeID,
* @param err error information if retrieving the full name failed
* @return the actual buffer size needed for the full name. If it's greater
* than nameCapacity, the returned full name will be truncated.
- * @draft ICU 2.8
+ * @stable ICU 2.8
*/
-U_DRAFT int32_t U_EXPORT2
+U_STABLE int32_t U_EXPORT2
uloc_canonicalize(const char* localeID,
char* name,
int32_t nameCapacity,
@@ -559,9 +554,9 @@ uloc_getDisplayLanguage(const char* locale,
* @param status error information if retrieving the displayable script code failed
* @return the actual buffer size needed for the displayable script code. If it's greater
* than scriptCapacity, the returned displayable script code will be truncated.
- * @draft ICU 2.8
+ * @stable ICU 2.8
*/
-U_DRAFT int32_t U_EXPORT2
+U_STABLE int32_t U_EXPORT2
uloc_getDisplayScript(const char* locale,
const char* displayLocale,
UChar* script,
@@ -653,9 +648,9 @@ uloc_getDisplayVariant(const char* locale,
* Should not be NULL and should not indicate failure on entry.
* @return the actual buffer size needed for the displayable variant code.
* @see #uloc_openKeywords
- * @draft ICU 2.8
+ * @stable ICU 2.8
*/
-U_DRAFT int32_t U_EXPORT2
+U_STABLE int32_t U_EXPORT2
uloc_getDisplayKeyword(const char* keyword,
const char* displayLocale,
UChar* dest,
@@ -679,9 +674,9 @@ uloc_getDisplayKeyword(const char* keyword,
* @param status error information if retrieving the displayable string failed.
* Should not be NULL and must not indicate failure on entry.
* @return the actual buffer size needed for the displayable variant code.
- * @draft ICU 2.8
+ * @stable ICU 2.8
*/
-U_DRAFT int32_t U_EXPORT2
+U_STABLE int32_t U_EXPORT2
uloc_getDisplayKeywordValue( const char* locale,
const char* keyword,
const char* displayLocale,
@@ -796,9 +791,9 @@ uloc_getParent(const char* localeID,
* @param err error information if retrieving the full name failed
* @return the actual buffer size needed for the full name. If it's greater
* than nameCapacity, the returned full name will be truncated.
- * @draft ICU 2.8
+ * @stable ICU 2.8
*/
-U_DRAFT int32_t U_EXPORT2
+U_STABLE int32_t U_EXPORT2
uloc_getBaseName(const char* localeID,
char* name,
int32_t nameCapacity,
@@ -811,9 +806,9 @@ uloc_getBaseName(const char* localeID,
* @param localeID the locale to get the variant code with
* @param status error information if retrieving the keywords failed
* @return enumeration of keywords or NULL if there are no keywords.
- * @draft ICU 2.8
+ * @stable ICU 2.8
*/
-U_DRAFT UEnumeration* U_EXPORT2
+U_STABLE UEnumeration* U_EXPORT2
uloc_openKeywords(const char* localeID,
UErrorCode* status);
@@ -826,9 +821,9 @@ uloc_openKeywords(const char* localeID,
* @param bufferCapacity capacity of receiving buffer
* @param status containing error code - buffer not big enough.
* @return the length of keyword value
- * @draft ICU 2.8
+ * @stable ICU 2.8
*/
-U_DRAFT int32_t U_EXPORT2
+U_STABLE int32_t U_EXPORT2
uloc_getKeywordValue(const char* localeID,
const char* keywordName,
char* buffer, int32_t bufferCapacity,
@@ -852,9 +847,9 @@ uloc_getKeywordValue(const char* localeID,
* @param status containing error code - buffer not big enough.
* @return the length needed for the buffer
* @see uloc_getKeywordValue
- * @draft ICU 3.2
+ * @stable ICU 3.2
*/
-U_DRAFT int32_t U_EXPORT2
+U_STABLE int32_t U_EXPORT2
uloc_setKeywordValue(const char* keywordName,
const char* keywordValue,
char* buffer, int32_t bufferCapacity,
@@ -864,7 +859,7 @@ uloc_setKeywordValue(const char* keywordName,
* enums for the 'outResult' parameter return value
* @see uloc_acceptLanguageFromHTTP
* @see uloc_acceptLanguage
- * @draft ICU 3.2
+ * @stable ICU 3.2
*/
typedef enum {
ULOC_ACCEPT_FAILED = 0, /* No exact match was found. */
@@ -876,15 +871,18 @@ typedef enum {
/**
- * @param httpAcceptLanguage - "Accept-Language:" header as per HTTP.
+ * Based on a HTTP header from a web browser and a list of available locales,
+ * determine an acceptable locale for the user.
* @param result - buffer to accept the result locale
* @param resultAvailable the size of the result buffer.
+ * @param outResult - An out parameter that contains the fallback status
+ * @param httpAcceptLanguage - "Accept-Language:" header as per HTTP.
* @param availableLocales - list of available locales to match
* @param status Error status, may be BUFFER_OVERFLOW_ERROR
* @return length needed for the locale.
- * @draft ICU 3.2
+ * @stable ICU 3.2
*/
-U_DRAFT int32_t U_EXPORT2
+U_STABLE int32_t U_EXPORT2
uloc_acceptLanguageFromHTTP(char *result, int32_t resultAvailable,
UAcceptResult *outResult,
const char *httpAcceptLanguage,
@@ -892,26 +890,42 @@ uloc_acceptLanguageFromHTTP(char *result, int32_t resultAvailable,
UErrorCode *status);
/**
- * @param acceptList -list of acceptable languages
- * @param acceptListCount - count of acceptList items
+ * Based on a list of available locales,
+ * determine an acceptable locale for the user.
* @param result - buffer to accept the result locale
* @param resultAvailable the size of the result buffer.
+ * @param outResult - An out parameter that contains the fallback status
+ * @param acceptList - list of acceptable languages
+ * @param acceptListCount - count of acceptList items
* @param availableLocales - list of available locales to match
* @param status Error status, may be BUFFER_OVERFLOW_ERROR
* @return length needed for the locale.
- * @draft ICU 3.2
+ * @stable ICU 3.2
*/
-U_DRAFT int32_t U_EXPORT2
+U_STABLE int32_t U_EXPORT2
uloc_acceptLanguage(char *result, int32_t resultAvailable,
UAcceptResult *outResult, const char **acceptList,
int32_t acceptListCount,
UEnumeration* availableLocales,
UErrorCode *status);
-/*eof*/
+/**
+ * Gets the ICU locale ID for the specified Win32 LCID value.
+ *
+ * @param hostID the Win32 LCID to translate
+ * @param locale the output buffer for the ICU locale ID, which will be NUL-terminated
+ * if there is room.
+ * @param localeCapacity the size of the output buffer
+ * @param status an error is returned if the LCID is unrecognized or the output buffer
+ * is too small
+ * @return actual the actual size of the locale ID, not including NUL-termination
+ * @draft ICU 3.8
+ */
+U_DRAFT int32_t U_EXPORT2
+uloc_getLocaleForLCID(uint32_t hostid, char *locale, int32_t localeCapacity,
+ UErrorCode *status);
#endif /*_ULOC*/
-
diff --git a/icuSources/common/unicode/umachine.h b/icuSources/common/unicode/umachine.h
index d841f534..60419cda 100644
--- a/icuSources/common/unicode/umachine.h
+++ b/icuSources/common/unicode/umachine.h
@@ -1,7 +1,7 @@
/*
******************************************************************************
*
-* Copyright (C) 1999-2004, International Business Machines
+* Copyright (C) 1999-2006, International Business Machines
* Corporation and others. All Rights Reserved.
*
******************************************************************************
@@ -41,7 +41,9 @@
/* which are contained in the platform-specific file platform.h */
/*==========================================================================*/
-#if defined(WIN32) || defined(_WIN32) || defined(WIN64) || defined(_WIN64)
+#if defined(U_PALMOS)
+# include "unicode/ppalmos.h"
+#elif defined(WIN32) || defined(_WIN32) || defined(WIN64) || defined(_WIN64)
# include "unicode/pwin32.h"
#else
# include "unicode/platform.h"
@@ -201,7 +203,7 @@
/**
* Provides a platform independent way to specify a signed 64-bit integer constant.
* note: may be wrong for some 64 bit platforms - ensure your compiler provides INT64_C
- * @draft ICU 2.8
+ * @stable ICU 2.8
*/
# define INT64_C(c) c ## LL
# endif
@@ -209,7 +211,7 @@
/**
* Provides a platform independent way to specify an unsigned 64-bit integer constant.
* note: may be wrong for some 64 bit platforms - ensure your compiler provides UINT64_C
- * @draft ICU 2.8
+ * @stable ICU 2.8
*/
# define UINT64_C(c) c ## ULL
# endif
@@ -298,7 +300,7 @@ typedef int8_t UBool;
# if (U_SIZEOF_WCHAR_T==4)
# define U_WCHAR_IS_UTF32
# endif
-# elif defined(WIN32) || defined(_WIN32) || defined(WIN64) || defined(_WIN64)
+# elif defined(U_WINDOWS)
# define U_WCHAR_IS_UTF16
# endif
#endif
@@ -352,6 +354,8 @@ typedef int32_t UChar32;
/* the OS in use. */
/*==========================================================================*/
+#ifndef U_HIDE_INTERNAL_API
+
/**
* \def U_ALIGN_CODE
* This is used to align code fragments to a specific byte boundary.
@@ -362,8 +366,14 @@ typedef int32_t UChar32;
# define U_ALIGN_CODE(n)
#endif
+#endif /* U_HIDE_INTERNAL_API */
+
#ifndef U_INLINE
-# define U_INLINE
+# ifdef XP_CPLUSPLUS
+# define U_INLINE inline
+# else
+# define U_INLINE
+# endif
#endif
#include "unicode/urename.h"
diff --git a/icuSources/common/unicode/umisc.h b/icuSources/common/unicode/umisc.h
index d47fa383..d85451fc 100644
--- a/icuSources/common/unicode/umisc.h
+++ b/icuSources/common/unicode/umisc.h
@@ -1,6 +1,6 @@
/*
**********************************************************************
-* Copyright (C) 1999-2003, International Business Machines
+* Copyright (C) 1999-2006, International Business Machines
* Corporation and others. All Rights Reserved.
**********************************************************************
* file name: umisc.h
@@ -23,7 +23,9 @@
*
* This file contains miscellaneous definitions for the C APIs.
*/
-
+
+U_CDECL_BEGIN
+
/** A struct representing a range of text containing a specific field
* @stable ICU 2.0
*/
@@ -45,4 +47,14 @@ typedef struct UFieldPosition {
int32_t endIndex;
} UFieldPosition;
+#if !UCONFIG_NO_SERVICE
+/**
+ * Opaque type returned by registerInstance, registerFactory and unregister for service registration.
+ * @stable ICU 2.6
+ */
+typedef const void* URegistryKey;
+#endif
+
+U_CDECL_END
+
#endif
diff --git a/icuSources/common/unicode/unifilt.h b/icuSources/common/unicode/unifilt.h
index 694a7bd0..5bf1ba4e 100644
--- a/icuSources/common/unicode/unifilt.h
+++ b/icuSources/common/unicode/unifilt.h
@@ -1,5 +1,6 @@
/*
-* Copyright (C) 1999-2004, International Business Machines Corporation and others.
+**********************************************************************
+* Copyright (C) 1999-2006, International Business Machines Corporation and others.
* All Rights Reserved.
**********************************************************************
* Date Name Description
@@ -12,6 +13,11 @@
#include "unicode/unifunct.h"
#include "unicode/unimatch.h"
+/**
+ * \file
+ * \brief C++ API: Unicode Filter
+ */
+
U_NAMESPACE_BEGIN
/**
@@ -20,11 +26,12 @@ U_NAMESPACE_BEGIN
* characters outside the range contextStart..contextLimit-1. This
* allows explicit matching by rules and UnicodeSets of text outside a
* defined range.
- * @draft ICU 3.0
+ * @stable ICU 3.0
*/
#define U_ETHER ((UChar)0xFFFF)
/**
+ *
* UnicodeFilter
defines a protocol for selecting a
* subset of the full range (U+0000 to U+10FFFF) of Unicode characters.
* Currently, filters are used in conjunction with classes like {@link
diff --git a/icuSources/common/unicode/unifunct.h b/icuSources/common/unicode/unifunct.h
index 36898e9e..3aa7b035 100644
--- a/icuSources/common/unicode/unifunct.h
+++ b/icuSources/common/unicode/unifunct.h
@@ -1,6 +1,6 @@
/*
**********************************************************************
-* Copyright (c) 2002-2004, International Business Machines Corporation
+* Copyright (c) 2002-2005, International Business Machines Corporation
* and others. All Rights Reserved.
**********************************************************************
* Date Name Description
@@ -13,6 +13,11 @@
#include "unicode/utypes.h"
#include "unicode/uobject.h"
+/**
+ * \file
+ * \brief C++ API: Unicode Functor
+ */
+
U_NAMESPACE_BEGIN
class UnicodeMatcher;
diff --git a/icuSources/common/unicode/unimatch.h b/icuSources/common/unicode/unimatch.h
index f23bfd01..0dbb14ef 100644
--- a/icuSources/common/unicode/unimatch.h
+++ b/icuSources/common/unicode/unimatch.h
@@ -1,5 +1,5 @@
/*
-* Copyright (C) 2001-2004, International Business Machines Corporation and others. All Rights Reserved.
+* Copyright (C) 2001-2005, International Business Machines Corporation and others. All Rights Reserved.
**********************************************************************
* Date Name Description
* 07/18/01 aliu Creation.
@@ -10,6 +10,12 @@
#include "unicode/utypes.h"
+/**
+ * \file
+ * \brief C++ API: Unicode Matcher
+ */
+
+
U_NAMESPACE_BEGIN
class Replaceable;
diff --git a/icuSources/common/unicode/uniset.h b/icuSources/common/unicode/uniset.h
index 48464cfd..1e48aa83 100644
--- a/icuSources/common/unicode/uniset.h
+++ b/icuSources/common/unicode/uniset.h
@@ -1,10 +1,11 @@
/*
-**********************************************************************
-* Copyright (C) 1999-2004, International Business Machines Corporation and others. All Rights Reserved.
-**********************************************************************
+***************************************************************************
+* Copyright (C) 1999-2006, International Business Machines Corporation
+* and others. All Rights Reserved.
+***************************************************************************
* Date Name Description
* 10/20/99 alan Creation.
-**********************************************************************
+***************************************************************************
*/
#ifndef UNICODESET_H
@@ -14,12 +15,16 @@
#include "unicode/unistr.h"
#include "unicode/uset.h"
+/**
+ * \file
+ * \brief C++ API: Unicode Set
+ */
+
U_NAMESPACE_BEGIN
class ParsePosition;
class SymbolTable;
class UVector;
-class CaseEquivClass;
class RuleCharacterIterator;
/**
@@ -108,8 +113,8 @@ class RuleCharacterIterator;
* "[:Lu:]" and the Perl-like syntax "\\p{Lu}" are recognized. For a
* complete list of supported property patterns, see the User's Guide
* for UnicodeSet at
- *
- * http://oss.software.ibm.com/icu/userguide/unicodeSet.html.
+ *
+ * http://icu.sourceforge.net/userguide/unicodeSet.html.
* Actual determination of property data is defined by the underlying
* Unicode database as implemented by UCharacter.
*
@@ -276,25 +281,19 @@ class U_COMMON_API UnicodeSet : public UnicodeFilter {
public:
- /**
- * Minimum value that can be stored in a UnicodeSet.
- * @stable ICU 2.4
- */
-#ifdef U_CYGWIN
- static U_COMMON_API const UChar32 MIN_VALUE;
-#else
- static const UChar32 MIN_VALUE;
-#endif
+ enum {
+ /**
+ * Minimum value that can be stored in a UnicodeSet.
+ * @stable ICU 2.4
+ */
+ MIN_VALUE = 0,
- /**
- * Maximum value that can be stored in a UnicodeSet.
- * @stable ICU 2.4
- */
-#ifdef U_CYGWIN
- static U_COMMON_API const UChar32 MAX_VALUE;
-#else
- static const UChar32 MAX_VALUE;
-#endif
+ /**
+ * Maximum value that can be stored in a UnicodeSet.
+ * @stable ICU 2.4
+ */
+ MAX_VALUE = 0x10ffff
+ };
//----------------------------------------------------------------
// Constructors &c
@@ -357,23 +356,13 @@ public:
* @param symbols a symbol table mapping variable names to values
* and stand-in characters to UnicodeSets; may be NULL
* @param status input-output error code
- * @draft ICU 2.8
+ * @stable ICU 2.8
*/
UnicodeSet(const UnicodeString& pattern, ParsePosition& pos,
uint32_t options,
const SymbolTable* symbols,
UErrorCode& status);
-#ifdef U_USE_UNICODESET_DEPRECATES
- /**
- * Obsolete: Constructs a set from the given Unicode character category.
- * @param category an integer indicating the character category as
- * defined in uchar.h.
- * @obsolete ICU 2.6. Use a pattern with the category instead since this API will be removed in that release.
- */
- UnicodeSet(int8_t category, UErrorCode& status);
-#endif
-
/**
* Constructs a set that is identical to the given UnicodeSet.
* @stable ICU 2.0
@@ -514,7 +503,7 @@ public:
* @param status returns U_ILLEGAL_ARGUMENT_ERROR
if the pattern
* contains a syntax error.
* @return a reference to this
- * @draft ICU 2.8
+ * @stable ICU 2.8
*/
UnicodeSet& applyPattern(const UnicodeString& pattern,
ParsePosition& pos,
@@ -575,7 +564,8 @@ public:
* correspond to the following sets:
*
* "ANY" = [\\u0000-\\U0010FFFF],
- * "ASCII" = [\\u0000-\\u007F].
+ * "ASCII" = [\\u0000-\\u007F],
+ * "Assigned" = [:^Cn:].
*
* @param value a value alias, either short or long. The name is matched
* loosely. See PropertyValueAliases.txt for names and a description of
@@ -1258,7 +1248,7 @@ private:
*
* The original design document is out of date, but still useful.
* Ignore the property and value names:
- * http://oss.software.ibm.com/cvs/icu/~checkout~/icuhtml/design/unicodeset_properties.html
+ * http://dev.icu-project.org/cgi-bin/viewcvs.cgi/~checkout~/icuhtml/design/unicodeset_properties.html
*
* Recognized syntax:
*
@@ -1324,20 +1314,6 @@ private:
static const UnicodeSet* getInclusions(int32_t src, UErrorCode &errorCode);
friend class UnicodeSetIterator;
-
- //----------------------------------------------------------------
- // Implementation: closeOver
- //----------------------------------------------------------------
-
- void caseCloseOne(const UnicodeString& folded);
-
- void caseCloseOne(const CaseEquivClass& c);
-
- void caseCloseOne(UChar folded);
-
- static const CaseEquivClass* getCaseMapOf(const UnicodeString& folded);
-
- static const CaseEquivClass* getCaseMapOf(UChar folded);
};
inline UBool UnicodeSet::operator!=(const UnicodeSet& o) const {
diff --git a/icuSources/common/unicode/unistr.h b/icuSources/common/unicode/unistr.h
index 3827458b..fe1722bd 100644
--- a/icuSources/common/unicode/unistr.h
+++ b/icuSources/common/unicode/unistr.h
@@ -1,6 +1,6 @@
/*
**********************************************************************
-* Copyright (C) 1998-2004, International Business Machines
+* Copyright (C) 1998-2006, International Business Machines
* Corporation and others. All Rights Reserved.
**********************************************************************
*
@@ -21,6 +21,11 @@
#ifndef UNISTR_H
#define UNISTR_H
+/**
+ * \file
+ * \brief C++ API: Unicode String
+ */
+
#include "unicode/rep.h"
struct UConverter; // unicode/ucnv.h
@@ -37,7 +42,9 @@ class StringThreadTest;
#endif
#ifndef USTRING_H
-/* see ustring.h */
+/**
+ * \ingroup ustring_ustrlen
+ */
U_STABLE int32_t U_EXPORT2
u_strlen(const UChar *s);
#endif
@@ -58,7 +65,7 @@ class BreakIterator; // unicode/brkiter.h
* therefore recommended over ones taking a charset name string
* (where the empty string "" indicates invariant-character conversion).
*
- * @draft ICU 3.2
+ * @stable ICU 3.2
*/
#define US_INV UnicodeString::kInvariant
@@ -79,7 +86,7 @@ class BreakIterator; // unicode/brkiter.h
* such string variable before it is used.
* @stable ICU 2.0
*/
-#if U_SIZEOF_WCHAR_T==U_SIZEOF_UCHAR && U_CHARSET_FAMILY==U_ASCII_FAMILY
+#if U_SIZEOF_WCHAR_T==U_SIZEOF_UCHAR && (U_CHARSET_FAMILY==U_ASCII_FAMILY || (U_SIZEOF_UCHAR == 2 && defined(U_WCHAR_IS_UTF16)))
# define UNICODE_STRING(cs, _length) UnicodeString(TRUE, (const UChar *)L ## cs, _length)
#elif U_SIZEOF_UCHAR==1 && U_CHARSET_FAMILY==U_ASCII_FAMILY
# define UNICODE_STRING(cs, _length) UnicodeString(TRUE, (const UChar *)cs, _length)
@@ -100,7 +107,7 @@ class BreakIterator; // unicode/brkiter.h
* The string parameter must be a C string literal.
* @stable ICU 2.0
*/
-#if U_SIZEOF_WCHAR_T==U_SIZEOF_UCHAR && U_CHARSET_FAMILY==U_ASCII_FAMILY
+#if U_SIZEOF_WCHAR_T==U_SIZEOF_UCHAR && (U_CHARSET_FAMILY==U_ASCII_FAMILY || (U_SIZEOF_UCHAR == 2 && defined(U_WCHAR_IS_UTF16)))
# define UNICODE_STRING_SIMPLE(cs) UnicodeString(TRUE, (const UChar *)L ## cs, -1)
#elif U_SIZEOF_UCHAR==1 && U_CHARSET_FAMILY==U_ASCII_FAMILY
# define UNICODE_STRING_SIMPLE(cs) UnicodeString(TRUE, (const UChar *)cs, -1)
@@ -116,13 +123,12 @@ class BreakIterator; // unicode/brkiter.h
* The UnicodeString class is not suitable for subclassing.
*
* For an overview of Unicode strings in C and C++ see the
- * User Guide Strings chapter.
+ * User Guide Strings chapter.
*
* In ICU, a Unicode string consists of 16-bit Unicode code units.
- * A Unicode character may be stored with either
- * one code unit — which is the most common case — or with a matched pair of
- * special code units ("surrogates").
- * The data type for code units is UChar.
+ * A Unicode character may be stored with either one code unit
+ * (the most common case) or with a matched pair of special code units
+ * ("surrogates"). The data type for code units is UChar.
* For single-character handling, a Unicode character code point is a value
* in the range 0..0x10ffff. ICU uses the UChar32 type for code points.
*
@@ -172,7 +178,7 @@ class BreakIterator; // unicode/brkiter.h
* significant performance improvements.
* Also, the internal buffer is accessible via special functions.
* For details see the
- * User Guide Strings chapter.
+ * User Guide Strings chapter.
*
* @see utf.h
* @see CharacterIterator
@@ -188,12 +194,12 @@ public:
* Use the macro US_INV instead of the full qualification for this value.
*
* @see US_INV
- * @draft ICU 3.2
+ * @stable ICU 3.2
*/
enum EInvariant {
/**
* @see EInvariant
- * @draft ICU 3.2
+ * @stable ICU 3.2
*/
kInvariant
};
@@ -1434,7 +1440,7 @@ public:
* @param targetCapacity the length of the target buffer
* @param inv Signature-distinguishing paramater, use US_INV.
* @return the output string length, not including the terminating NUL
- * @draft ICU 3.2
+ * @stable ICU 3.2
*/
int32_t extract(int32_t start,
int32_t startLength,
@@ -2813,7 +2819,7 @@ public:
* @param inv Signature-distinguishing paramater, use US_INV.
*
* @see US_INV
- * @draft ICU 3.2
+ * @stable ICU 3.2
*/
UnicodeString(const char *src, int32_t length, enum EInvariant inv);
@@ -3192,37 +3198,11 @@ private:
* @param s1 The first string to be copied to the new one.
* @param s2 The second string to be copied to the new one, after s1.
* @return UnicodeString(s1).append(s2)
- * @draft ICU 2.8
+ * @stable ICU 2.8
*/
U_COMMON_API UnicodeString U_EXPORT2
operator+ (const UnicodeString &s1, const UnicodeString &s2);
-U_NAMESPACE_END
-
-// inline implementations -------------------------------------------------- ***
-
-//========================================
-// Array copying
-//========================================
-/**
- * Copy an array of UnicodeString OBJECTS (not pointers).
- * @internal
- */
-inline void
-uprv_arrayCopy(const U_NAMESPACE_QUALIFIER UnicodeString *src, U_NAMESPACE_QUALIFIER UnicodeString *dst, int32_t count)
-{ while(count-- > 0) *dst++ = *src++; }
-
-/**
- * Copy an array of UnicodeString OBJECTS (not pointers).
- * @internal
- */
-inline void
-uprv_arrayCopy(const U_NAMESPACE_QUALIFIER UnicodeString *src, int32_t srcStart,
- U_NAMESPACE_QUALIFIER UnicodeString *dst, int32_t dstStart, int32_t count)
-{ uprv_arrayCopy(src+srcStart, dst+dstStart, count); }
-
-U_NAMESPACE_BEGIN
-
//========================================
// Inline members
//========================================
@@ -4000,23 +3980,6 @@ UnicodeString::setTo(UChar32 srcChar)
return replace(0, fLength, srcChar);
}
-inline UnicodeString&
-UnicodeString::operator+= (UChar ch)
-{ return doReplace(fLength, 0, &ch, 0, 1); }
-
-inline UnicodeString&
-UnicodeString::operator+= (UChar32 ch) {
- UChar buffer[U16_MAX_LENGTH];
- int32_t _length = 0;
- UBool isError = FALSE;
- U16_APPEND(buffer, _length, U16_MAX_LENGTH, ch, isError);
- return doReplace(fLength, 0, buffer, 0, _length);
-}
-
-inline UnicodeString&
-UnicodeString::operator+= (const UnicodeString& srcText)
-{ return doReplace(fLength, 0, srcText, 0, srcText.fLength); }
-
inline UnicodeString&
UnicodeString::append(const UnicodeString& srcText,
int32_t srcStart,
@@ -4051,6 +4014,19 @@ UnicodeString::append(UChar32 srcChar) {
return doReplace(fLength, 0, buffer, 0, _length);
}
+inline UnicodeString&
+UnicodeString::operator+= (UChar ch)
+{ return doReplace(fLength, 0, &ch, 0, 1); }
+
+inline UnicodeString&
+UnicodeString::operator+= (UChar32 ch) {
+ return append(ch);
+}
+
+inline UnicodeString&
+UnicodeString::operator+= (const UnicodeString& srcText)
+{ return doReplace(fLength, 0, srcText, 0, srcText.fLength); }
+
inline UnicodeString&
UnicodeString::insert(int32_t start,
const UnicodeString& srcText,
@@ -4103,12 +4079,11 @@ inline UnicodeString&
UnicodeString::remove(int32_t start,
int32_t _length)
{
- if(start <= 0 && _length == INT32_MAX) {
- // remove(guaranteed everything) of a bogus string makes the string empty and non-bogus
- return remove();
- } else {
+ if(start <= 0 && _length == INT32_MAX) {
+ // remove(guaranteed everything) of a bogus string makes the string empty and non-bogus
+ return remove();
+ }
return doReplace(start, _length, NULL, 0, 0);
- }
}
inline UnicodeString&
diff --git a/icuSources/common/unicode/unorm.h b/icuSources/common/unicode/unorm.h
index 8bdbee7c..31c52245 100644
--- a/icuSources/common/unicode/unorm.h
+++ b/icuSources/common/unicode/unorm.h
@@ -1,6 +1,6 @@
/*
*******************************************************************************
-* Copyright (c) 1996-2004, International Business Machines Corporation
+* Copyright (c) 1996-2005, International Business Machines Corporation
* and others. All Rights Reserved.
*******************************************************************************
* File unorm.h
@@ -31,7 +31,7 @@
* decomposed form, allowing for easier sorting and searching of text.
* unorm_normalize
supports the standard normalization forms described in
*
- * Unicode Standard Annex #15 — Unicode Normalization Forms.
+ * Unicode Standard Annex #15: Unicode Normalization Forms.
*
* Characters with accents or other adornments can be encoded in
* several different ways in Unicode. For example, take the character A-acute.
@@ -106,7 +106,7 @@
* unorm_normalize(UNORM_FCD) may be implemented with UNORM_NFD.
*
* For more details on FCD see the collation design document:
- * http://oss.software.ibm.com/cvs/icu/~checkout~/icuhtml/design/collation/ICU_collation_design.htm
+ * http://dev.icu-project.org/cgi-bin/viewcvs.cgi/~checkout~/icuhtml/design/collation/ICU_collation_design.htm
*
* ICU collation performs either NFD or FCD normalization automatically if normalization
* is turned on for the collator object.
diff --git a/icuSources/common/unicode/uobject.h b/icuSources/common/unicode/uobject.h
index 49f6ed0c..87735994 100644
--- a/icuSources/common/unicode/uobject.h
+++ b/icuSources/common/unicode/uobject.h
@@ -1,7 +1,7 @@
/*
******************************************************************************
*
-* Copyright (C) 2002-2004, International Business Machines
+* Copyright (C) 2002-2006, International Business Machines
* Corporation and others. All Rights Reserved.
*
******************************************************************************
@@ -49,6 +49,18 @@ U_NAMESPACE_BEGIN
#define U_HAVE_PLACEMENT_NEW 1
#endif
+
+#ifndef U_HIDE_DRAFT_API
+/** U_HAVE_DEBUG_LOCATION_NEW - Define this to define the MFC debug
+ * version of the operator new.
+ *
+ * @draft ICU 3.4
+ */
+#ifndef U_HAVE_DEBUG_LOCATION_NEW
+#define U_HAVE_DEBUG_LOCATION_NEW 0
+#endif
+#endif /*U_HIDE_DRAFT_API*/
+
/**
* UMemory is the common ICU base class.
* All other ICU C++ classes are derived from UMemory (starting with ICU 2.4).
@@ -117,6 +129,24 @@ public:
*/
static inline void U_EXPORT2 operator delete(void *, void *) {}
#endif /* U_HAVE_PLACEMENT_NEW */
+#if U_HAVE_DEBUG_LOCATION_NEW
+ /**
+ * This method overrides the MFC debug version of the operator new
+ *
+ * @param size The requested memory size
+ * @param file The file where the allocation was requested
+ * @param line The line where the allocation was requested
+ */
+ static void * U_EXPORT2 operator new(size_t size, const char* file, int line);
+ /**
+ * This method provides a matching delete for the MFC debug new
+ *
+ * @param p The pointer to the allocated memory
+ * @param file The file where the allocation was requested
+ * @param line The line where the allocation was requested
+ */
+ static void U_EXPORT2 operator delete(void* p, const char* file, int line);
+#endif /* U_HAVE_DEBUG_LOCATION_NEW */
#endif /* U_OVERRIDE_CXX_ALLOCATION */
/*
@@ -237,7 +267,7 @@ protected:
*/
#define UOBJECT_DEFINE_RTTI_IMPLEMENTATION(myClass) \
UClassID U_EXPORT2 myClass::getStaticClassID() { \
- static const char classID = 0; \
+ static char classID = 0; \
return (UClassID)&classID; \
} \
UClassID myClass::getDynamicClassID() const \
@@ -254,7 +284,7 @@ protected:
*/
#define UOBJECT_DEFINE_ABSTRACT_RTTI_IMPLEMENTATION(myClass) \
UClassID U_EXPORT2 myClass::getStaticClassID() { \
- static const char classID = 0; \
+ static char classID = 0; \
return (UClassID)&classID; \
}
diff --git a/icuSources/common/unicode/uobslete.h b/icuSources/common/unicode/uobslete.h
index 763da02e..e4f160f4 100644
--- a/icuSources/common/unicode/uobslete.h
+++ b/icuSources/common/unicode/uobslete.h
@@ -1,15 +1,15 @@
/*
*******************************************************************************
-* Copyright (C) 2004, International Business Machines
+* Copyright (C) 2004-2006, International Business Machines
* Corporation and others. All Rights Reserved.
*******************************************************************************
*
-* file name: uobslete.h
+* file name:
* encoding: US-ASCII
* tab size: 8 (not used)
* indentation:4
*
-* Created by: gendraft.pl, a perl script written by Ram Viswanadha
+* Created by: genheaders.pl, a perl script written by Ram Viswanadha
*
* Contains data for commenting out APIs.
* Gets included by umachine.h
@@ -23,6 +23,9 @@
#ifdef U_HIDE_OBSOLETE_API
+# if U_DISABLE_RENAMING
+# else
+# endif /* U_DISABLE_RENAMING */
#endif /* U_HIDE_OBSOLETE_API */
#endif /* UOBSLETE_H */
diff --git a/icuSources/common/unicode/urbtok.h b/icuSources/common/unicode/urbtok.h
new file mode 100644
index 00000000..5d70a07e
--- /dev/null
+++ b/icuSources/common/unicode/urbtok.h
@@ -0,0 +1,106 @@
+/*
+******************************************************************************
+* Copyright (C) 2006, Apple Computer, Inc.
+* All Rights Reserved.
+******************************************************************************
+*/
+
+#ifndef URBTOK_H
+#define URBTOK_H
+
+#include "unicode/utypes.h"
+
+#if !UCONFIG_NO_BREAK_ITERATION
+
+#include "unicode/utext.h"
+#include "unicode/ubrk.h"
+#include "unicode/parseerr.h"
+
+
+typedef struct RuleBasedTokenRange {
+ signed long location;
+ signed long length;
+} RuleBasedTokenRange;
+
+/**
+ * Open a new UBreakIterator for tokenizing text using specified breaking rules.
+ * The rule syntax is ... (TBD)
+ * @param rules A set of rules specifying the text breaking conventions.
+ * @param rulesLength The number of characters in rules, or -1 if null-terminated.
+ * @param parseErr Receives position and context information for any syntax errors
+ * detected while parsing the rules.
+ * @param status A UErrorCode to receive any errors.
+ * @return A UBreakIterator for the specified rules.
+ * @see ubrk_open
+ * @internal
+ */
+U_INTERNAL UBreakIterator* U_EXPORT2
+urbtok_openRules(const UChar *rules,
+ int32_t rulesLength,
+ UParseError *parseErr,
+ UErrorCode *status);
+
+/**
+ * Open a new UBreakIterator for tokenizing text using specified breaking rules.
+ * @param rules A set of rules specifying the text breaking conventions. The binary rules
+ * must be at least 32-bit aligned.
+ * @param status A UErrorCode to receive any errors.
+ * @return A UBreakIterator for the specified rules.
+ * @see ubrk_open
+ * @internal
+ */
+U_INTERNAL UBreakIterator* U_EXPORT2
+urbtok_openBinaryRules(const uint8_t *rules,
+ UErrorCode *status);
+
+/**
+ * Get the (native-endian) binary break rules for this tokenizer.
+ * @param bi The tokenizer to use.
+ * @param buffer The output buffer for the rules. You can pass 0 to get the required size.
+ * @param buffSize The size of the output buffer.
+ * @param status A UErrorCode to receive any errors.
+ * @return The actual size of the binary rules, whether they fit the buffer or not.
+ * @internal
+ */
+U_INTERNAL uint32_t U_EXPORT2
+urbtok_getBinaryRules(UBreakIterator *bi,
+ uint8_t *buffer,
+ uint32_t buffSize,
+ UErrorCode *status);
+
+/**
+ * Tokenize text using a rule-based tokenizer.
+ * @param bi The tokenizer to use.
+ * @param maxTokens The maximum number of tokens to return.
+ * @param outTokens An array of RuleBasedTokenRange to fill in with the tokens.
+ * @param outTokenFlags An (optional) array of uint32_t to fill in with token flags.
+ * @return The number of tokens returned, 0 if done.
+ * @internal
+ */
+U_INTERNAL int32_t U_EXPORT2
+urbtok_tokenize(UBreakIterator *bi,
+ int32_t maxTokens,
+ RuleBasedTokenRange *outTokens,
+ unsigned long *outTokenFlags);
+
+/**
+ * Swap the endianness of a set of binary break rules.
+ * @param rules A set of rules which need swapping.
+ * @param buffer The output buffer for the swapped rules, which must be the same
+ * size as the input rules buffer.
+ * @param inIsBigEndian UBool indicating whether the input is big-endian
+ * @param outIsBigEndian UBool indicating whether the output should be big-endian
+ * @param status A UErrorCode to receive any errors.
+ * @internal
+ */
+U_INTERNAL void U_EXPORT2
+urbtok_swapBinaryRules(const uint8_t *rules,
+ uint8_t *buffer,
+ UBool inIsBigEndian,
+ UBool outIsBigEndian,
+ UErrorCode *status);
+
+
+#endif /* #if !UCONFIG_NO_BREAK_ITERATION */
+
+#endif
diff --git a/icuSources/common/unicode/urename.h b/icuSources/common/unicode/urename.h
index 55625921..8c00aa5d 100644
--- a/icuSources/common/unicode/urename.h
+++ b/icuSources/common/unicode/urename.h
@@ -1,6 +1,6 @@
/*
*******************************************************************************
-* Copyright (C) 2002-2004, International Business Machines
+* Copyright (C) 2002-2006, International Business Machines
* Corporation and others. All Rights Reserved.
*******************************************************************************
*
@@ -29,1436 +29,1573 @@
/* C exports renaming data */
-#define T_CString_int64ToString T_CString_int64ToString_3_2
-#define T_CString_integerToString T_CString_integerToString_3_2
-#define T_CString_stricmp T_CString_stricmp_3_2
-#define T_CString_stringToInteger T_CString_stringToInteger_3_2
-#define T_CString_strnicmp T_CString_strnicmp_3_2
-#define T_CString_toLowerCase T_CString_toLowerCase_3_2
-#define T_CString_toUpperCase T_CString_toUpperCase_3_2
-#define T_FileStream_close T_FileStream_close_3_2
-#define T_FileStream_eof T_FileStream_eof_3_2
-#define T_FileStream_error T_FileStream_error_3_2
-#define T_FileStream_file_exists T_FileStream_file_exists_3_2
-#define T_FileStream_getc T_FileStream_getc_3_2
-#define T_FileStream_open T_FileStream_open_3_2
-#define T_FileStream_peek T_FileStream_peek_3_2
-#define T_FileStream_putc T_FileStream_putc_3_2
-#define T_FileStream_read T_FileStream_read_3_2
-#define T_FileStream_readLine T_FileStream_readLine_3_2
-#define T_FileStream_remove T_FileStream_remove_3_2
-#define T_FileStream_rewind T_FileStream_rewind_3_2
-#define T_FileStream_size T_FileStream_size_3_2
-#define T_FileStream_stderr T_FileStream_stderr_3_2
-#define T_FileStream_stdin T_FileStream_stdin_3_2
-#define T_FileStream_stdout T_FileStream_stdout_3_2
-#define T_FileStream_ungetc T_FileStream_ungetc_3_2
-#define T_FileStream_write T_FileStream_write_3_2
-#define T_FileStream_writeLine T_FileStream_writeLine_3_2
-#define UCNV_FROM_U_CALLBACK_ESCAPE UCNV_FROM_U_CALLBACK_ESCAPE_3_2
-#define UCNV_FROM_U_CALLBACK_SKIP UCNV_FROM_U_CALLBACK_SKIP_3_2
-#define UCNV_FROM_U_CALLBACK_STOP UCNV_FROM_U_CALLBACK_STOP_3_2
-#define UCNV_FROM_U_CALLBACK_SUBSTITUTE UCNV_FROM_U_CALLBACK_SUBSTITUTE_3_2
-#define UCNV_TO_U_CALLBACK_ESCAPE UCNV_TO_U_CALLBACK_ESCAPE_3_2
-#define UCNV_TO_U_CALLBACK_SKIP UCNV_TO_U_CALLBACK_SKIP_3_2
-#define UCNV_TO_U_CALLBACK_STOP UCNV_TO_U_CALLBACK_STOP_3_2
-#define UCNV_TO_U_CALLBACK_SUBSTITUTE UCNV_TO_U_CALLBACK_SUBSTITUTE_3_2
-#define UDataMemory_createNewInstance UDataMemory_createNewInstance_3_2
-#define UDataMemory_init UDataMemory_init_3_2
-#define UDataMemory_isLoaded UDataMemory_isLoaded_3_2
-#define UDataMemory_normalizeDataPointer UDataMemory_normalizeDataPointer_3_2
-#define UDataMemory_setData UDataMemory_setData_3_2
-#define UDatamemory_assign UDatamemory_assign_3_2
-#define _ASCIIData _ASCIIData_3_2
-#define _Bocu1Data _Bocu1Data_3_2
-#define _CESU8Data _CESU8Data_3_2
-#define _HZData _HZData_3_2
-#define _IMAPData _IMAPData_3_2
-#define _ISCIIData _ISCIIData_3_2
-#define _ISO2022Data _ISO2022Data_3_2
-#define _LMBCSData1 _LMBCSData1_3_2
-#define _LMBCSData11 _LMBCSData11_3_2
-#define _LMBCSData16 _LMBCSData16_3_2
-#define _LMBCSData17 _LMBCSData17_3_2
-#define _LMBCSData18 _LMBCSData18_3_2
-#define _LMBCSData19 _LMBCSData19_3_2
-#define _LMBCSData2 _LMBCSData2_3_2
-#define _LMBCSData3 _LMBCSData3_3_2
-#define _LMBCSData4 _LMBCSData4_3_2
-#define _LMBCSData5 _LMBCSData5_3_2
-#define _LMBCSData6 _LMBCSData6_3_2
-#define _LMBCSData8 _LMBCSData8_3_2
-#define _Latin1Data _Latin1Data_3_2
-#define _MBCSData _MBCSData_3_2
-#define _SCSUData _SCSUData_3_2
-#define _UTF16BEData _UTF16BEData_3_2
-#define _UTF16Data _UTF16Data_3_2
-#define _UTF16LEData _UTF16LEData_3_2
-#define _UTF32BEData _UTF32BEData_3_2
-#define _UTF32Data _UTF32Data_3_2
-#define _UTF32LEData _UTF32LEData_3_2
-#define _UTF7Data _UTF7Data_3_2
-#define _UTF8Data _UTF8Data_3_2
-#define cmemory_cleanup cmemory_cleanup_3_2
-#define cmemory_inUse cmemory_inUse_3_2
-#define locale_getKeywords locale_getKeywords_3_2
-#define locale_get_default locale_get_default_3_2
-#define locale_set_default locale_set_default_3_2
-#define res_countArrayItems res_countArrayItems_3_2
-#define res_findResource res_findResource_3_2
-#define res_getAlias res_getAlias_3_2
-#define res_getArrayItem res_getArrayItem_3_2
-#define res_getBinary res_getBinary_3_2
-#define res_getIntVector res_getIntVector_3_2
-#define res_getResource res_getResource_3_2
-#define res_getString res_getString_3_2
-#define res_getTableItemByIndex res_getTableItemByIndex_3_2
-#define res_getTableItemByKey res_getTableItemByKey_3_2
-#define res_load res_load_3_2
-#define res_unload res_unload_3_2
-#define transliterator_cleanup transliterator_cleanup_3_2
-#define u_UCharsToChars u_UCharsToChars_3_2
-#define u_austrcpy u_austrcpy_3_2
-#define u_austrncpy u_austrncpy_3_2
-#define u_catclose u_catclose_3_2
-#define u_catgets u_catgets_3_2
-#define u_catopen u_catopen_3_2
-#define u_charAge u_charAge_3_2
-#define u_charDigitValue u_charDigitValue_3_2
-#define u_charDirection u_charDirection_3_2
-#define u_charFromName u_charFromName_3_2
-#define u_charMirror u_charMirror_3_2
-#define u_charName u_charName_3_2
-#define u_charType u_charType_3_2
-#define u_charsToUChars u_charsToUChars_3_2
-#define u_cleanup u_cleanup_3_2
-#define u_countChar32 u_countChar32_3_2
-#define u_digit u_digit_3_2
-#define u_enumCharNames u_enumCharNames_3_2
-#define u_enumCharTypes u_enumCharTypes_3_2
-#define u_errorName u_errorName_3_2
-#define u_fclose u_fclose_3_2
-#define u_feof u_feof_3_2
-#define u_fflush u_fflush_3_2
-#define u_fgetConverter u_fgetConverter_3_2
-#define u_fgetc u_fgetc_3_2
-#define u_fgetcodepage u_fgetcodepage_3_2
-#define u_fgetcx u_fgetcx_3_2
-#define u_fgetfile u_fgetfile_3_2
-#define u_fgetlocale u_fgetlocale_3_2
-#define u_fgets u_fgets_3_2
-#define u_file_read u_file_read_3_2
-#define u_file_write u_file_write_3_2
-#define u_file_write_flush u_file_write_flush_3_2
-#define u_finit u_finit_3_2
-#define u_foldCase u_foldCase_3_2
-#define u_fopen u_fopen_3_2
-#define u_forDigit u_forDigit_3_2
-#define u_formatMessage u_formatMessage_3_2
-#define u_formatMessageWithError u_formatMessageWithError_3_2
-#define u_fprintf u_fprintf_3_2
-#define u_fprintf_u u_fprintf_u_3_2
-#define u_fputc u_fputc_3_2
-#define u_fputs u_fputs_3_2
-#define u_frewind u_frewind_3_2
-#define u_fscanf u_fscanf_3_2
-#define u_fscanf_u u_fscanf_u_3_2
-#define u_fsetcodepage u_fsetcodepage_3_2
-#define u_fsetlocale u_fsetlocale_3_2
-#define u_fsettransliterator u_fsettransliterator_3_2
-#define u_fstropen u_fstropen_3_2
-#define u_fungetc u_fungetc_3_2
-#define u_getCombiningClass u_getCombiningClass_3_2
-#define u_getDataDirectory u_getDataDirectory_3_2
-#define u_getDefaultConverter u_getDefaultConverter_3_2
-#define u_getFC_NFKC_Closure u_getFC_NFKC_Closure_3_2
-#define u_getISOComment u_getISOComment_3_2
-#define u_getIntPropertyMaxValue u_getIntPropertyMaxValue_3_2
-#define u_getIntPropertyMinValue u_getIntPropertyMinValue_3_2
-#define u_getIntPropertyValue u_getIntPropertyValue_3_2
-#define u_getNumericValue u_getNumericValue_3_2
-#define u_getPropertyEnum u_getPropertyEnum_3_2
-#define u_getPropertyName u_getPropertyName_3_2
-#define u_getPropertyValueEnum u_getPropertyValueEnum_3_2
-#define u_getPropertyValueName u_getPropertyValueName_3_2
-#define u_getUnicodeProperties u_getUnicodeProperties_3_2
-#define u_getUnicodeVersion u_getUnicodeVersion_3_2
-#define u_getVersion u_getVersion_3_2
-#define u_growBufferFromStatic u_growBufferFromStatic_3_2
-#define u_hasBinaryProperty u_hasBinaryProperty_3_2
-#define u_init u_init_3_2
-#define u_isIDIgnorable u_isIDIgnorable_3_2
-#define u_isIDPart u_isIDPart_3_2
-#define u_isIDStart u_isIDStart_3_2
-#define u_isISOControl u_isISOControl_3_2
-#define u_isJavaIDPart u_isJavaIDPart_3_2
-#define u_isJavaIDStart u_isJavaIDStart_3_2
-#define u_isJavaSpaceChar u_isJavaSpaceChar_3_2
-#define u_isMirrored u_isMirrored_3_2
-#define u_isUAlphabetic u_isUAlphabetic_3_2
-#define u_isULowercase u_isULowercase_3_2
-#define u_isUUppercase u_isUUppercase_3_2
-#define u_isUWhiteSpace u_isUWhiteSpace_3_2
-#define u_isWhitespace u_isWhitespace_3_2
-#define u_isalnum u_isalnum_3_2
-#define u_isalpha u_isalpha_3_2
-#define u_isbase u_isbase_3_2
-#define u_isblank u_isblank_3_2
-#define u_iscntrl u_iscntrl_3_2
-#define u_isdefined u_isdefined_3_2
-#define u_isdigit u_isdigit_3_2
-#define u_isgraph u_isgraph_3_2
-#define u_islower u_islower_3_2
-#define u_isprint u_isprint_3_2
-#define u_ispunct u_ispunct_3_2
-#define u_isspace u_isspace_3_2
-#define u_istitle u_istitle_3_2
-#define u_isupper u_isupper_3_2
-#define u_isxdigit u_isxdigit_3_2
-#define u_lengthOfIdenticalLevelRun u_lengthOfIdenticalLevelRun_3_2
-#define u_locbund_close u_locbund_close_3_2
-#define u_locbund_getNumberFormat u_locbund_getNumberFormat_3_2
-#define u_locbund_init u_locbund_init_3_2
-#define u_memcasecmp u_memcasecmp_3_2
-#define u_memchr u_memchr_3_2
-#define u_memchr32 u_memchr32_3_2
-#define u_memcmp u_memcmp_3_2
-#define u_memcmpCodePointOrder u_memcmpCodePointOrder_3_2
-#define u_memcpy u_memcpy_3_2
-#define u_memmove u_memmove_3_2
-#define u_memrchr u_memrchr_3_2
-#define u_memrchr32 u_memrchr32_3_2
-#define u_memset u_memset_3_2
-#define u_parseMessage u_parseMessage_3_2
-#define u_parseMessageWithError u_parseMessageWithError_3_2
-#define u_printf_parse u_printf_parse_3_2
-#define u_releaseDefaultConverter u_releaseDefaultConverter_3_2
-#define u_scanf_parse u_scanf_parse_3_2
-#define u_setAtomicIncDecFunctions u_setAtomicIncDecFunctions_3_2
-#define u_setDataDirectory u_setDataDirectory_3_2
-#define u_setMemoryFunctions u_setMemoryFunctions_3_2
-#define u_setMutexFunctions u_setMutexFunctions_3_2
-#define u_shapeArabic u_shapeArabic_3_2
-#define u_snprintf u_snprintf_3_2
-#define u_snprintf_u u_snprintf_u_3_2
-#define u_sprintf u_sprintf_3_2
-#define u_sprintf_u u_sprintf_u_3_2
-#define u_sscanf u_sscanf_3_2
-#define u_sscanf_u u_sscanf_u_3_2
-#define u_strCaseCompare u_strCaseCompare_3_2
-#define u_strCompare u_strCompare_3_2
-#define u_strCompareIter u_strCompareIter_3_2
-#define u_strFindFirst u_strFindFirst_3_2
-#define u_strFindLast u_strFindLast_3_2
-#define u_strFoldCase u_strFoldCase_3_2
-#define u_strFromPunycode u_strFromPunycode_3_2
-#define u_strFromUTF32 u_strFromUTF32_3_2
-#define u_strFromUTF8 u_strFromUTF8_3_2
-#define u_strFromWCS u_strFromWCS_3_2
-#define u_strHasMoreChar32Than u_strHasMoreChar32Than_3_2
-#define u_strToLower u_strToLower_3_2
-#define u_strToPunycode u_strToPunycode_3_2
-#define u_strToTitle u_strToTitle_3_2
-#define u_strToUTF32 u_strToUTF32_3_2
-#define u_strToUTF8 u_strToUTF8_3_2
-#define u_strToUpper u_strToUpper_3_2
-#define u_strToWCS u_strToWCS_3_2
-#define u_strcasecmp u_strcasecmp_3_2
-#define u_strcat u_strcat_3_2
-#define u_strchr u_strchr_3_2
-#define u_strchr32 u_strchr32_3_2
-#define u_strcmp u_strcmp_3_2
-#define u_strcmpCodePointOrder u_strcmpCodePointOrder_3_2
-#define u_strcmpFold u_strcmpFold_3_2
-#define u_strcpy u_strcpy_3_2
-#define u_strcspn u_strcspn_3_2
-#define u_strlen u_strlen_3_2
-#define u_strncasecmp u_strncasecmp_3_2
-#define u_strncat u_strncat_3_2
-#define u_strncmp u_strncmp_3_2
-#define u_strncmpCodePointOrder u_strncmpCodePointOrder_3_2
-#define u_strncpy u_strncpy_3_2
-#define u_strpbrk u_strpbrk_3_2
-#define u_strrchr u_strrchr_3_2
-#define u_strrchr32 u_strrchr32_3_2
-#define u_strrstr u_strrstr_3_2
-#define u_strspn u_strspn_3_2
-#define u_strstr u_strstr_3_2
-#define u_strtok_r u_strtok_r_3_2
-#define u_terminateChars u_terminateChars_3_2
-#define u_terminateUChar32s u_terminateUChar32s_3_2
-#define u_terminateUChars u_terminateUChars_3_2
-#define u_terminateWChars u_terminateWChars_3_2
-#define u_tolower u_tolower_3_2
-#define u_totitle u_totitle_3_2
-#define u_toupper u_toupper_3_2
-#define u_uastrcpy u_uastrcpy_3_2
-#define u_uastrncpy u_uastrncpy_3_2
-#define u_unescape u_unescape_3_2
-#define u_unescapeAt u_unescapeAt_3_2
-#define u_versionFromString u_versionFromString_3_2
-#define u_versionToString u_versionToString_3_2
-#define u_vformatMessage u_vformatMessage_3_2
-#define u_vformatMessageWithError u_vformatMessageWithError_3_2
-#define u_vfprintf u_vfprintf_3_2
-#define u_vfprintf_u u_vfprintf_u_3_2
-#define u_vfscanf u_vfscanf_3_2
-#define u_vfscanf_u u_vfscanf_u_3_2
-#define u_vparseMessage u_vparseMessage_3_2
-#define u_vparseMessageWithError u_vparseMessageWithError_3_2
-#define u_vsnprintf u_vsnprintf_3_2
-#define u_vsnprintf_u u_vsnprintf_u_3_2
-#define u_vsprintf u_vsprintf_3_2
-#define u_vsprintf_u u_vsprintf_u_3_2
-#define u_vsscanf u_vsscanf_3_2
-#define u_vsscanf_u u_vsscanf_u_3_2
-#define u_writeDiff u_writeDiff_3_2
-#define u_writeIdenticalLevelRun u_writeIdenticalLevelRun_3_2
-#define u_writeIdenticalLevelRunTwoChars u_writeIdenticalLevelRunTwoChars_3_2
-#define ubidi_close ubidi_close_3_2
-#define ubidi_countRuns ubidi_countRuns_3_2
-#define ubidi_getDirection ubidi_getDirection_3_2
-#define ubidi_getLength ubidi_getLength_3_2
-#define ubidi_getLevelAt ubidi_getLevelAt_3_2
-#define ubidi_getLevels ubidi_getLevels_3_2
-#define ubidi_getLogicalIndex ubidi_getLogicalIndex_3_2
-#define ubidi_getLogicalMap ubidi_getLogicalMap_3_2
-#define ubidi_getLogicalRun ubidi_getLogicalRun_3_2
-#define ubidi_getMemory ubidi_getMemory_3_2
-#define ubidi_getParaLevel ubidi_getParaLevel_3_2
-#define ubidi_getRuns ubidi_getRuns_3_2
-#define ubidi_getText ubidi_getText_3_2
-#define ubidi_getVisualIndex ubidi_getVisualIndex_3_2
-#define ubidi_getVisualMap ubidi_getVisualMap_3_2
-#define ubidi_getVisualRun ubidi_getVisualRun_3_2
-#define ubidi_invertMap ubidi_invertMap_3_2
-#define ubidi_isInverse ubidi_isInverse_3_2
-#define ubidi_open ubidi_open_3_2
-#define ubidi_openSized ubidi_openSized_3_2
-#define ubidi_reorderLogical ubidi_reorderLogical_3_2
-#define ubidi_reorderVisual ubidi_reorderVisual_3_2
-#define ubidi_setInverse ubidi_setInverse_3_2
-#define ubidi_setLine ubidi_setLine_3_2
-#define ubidi_setPara ubidi_setPara_3_2
-#define ubidi_writeReordered ubidi_writeReordered_3_2
-#define ubidi_writeReverse ubidi_writeReverse_3_2
-#define ublock_getCode ublock_getCode_3_2
-#define ubrk_close ubrk_close_3_2
-#define ubrk_countAvailable ubrk_countAvailable_3_2
-#define ubrk_current ubrk_current_3_2
-#define ubrk_first ubrk_first_3_2
-#define ubrk_following ubrk_following_3_2
-#define ubrk_getAvailable ubrk_getAvailable_3_2
-#define ubrk_getLocaleByType ubrk_getLocaleByType_3_2
-#define ubrk_getRuleStatus ubrk_getRuleStatus_3_2
-#define ubrk_getRuleStatusVec ubrk_getRuleStatusVec_3_2
-#define ubrk_isBoundary ubrk_isBoundary_3_2
-#define ubrk_last ubrk_last_3_2
-#define ubrk_next ubrk_next_3_2
-#define ubrk_open ubrk_open_3_2
-#define ubrk_openRules ubrk_openRules_3_2
-#define ubrk_preceding ubrk_preceding_3_2
-#define ubrk_previous ubrk_previous_3_2
-#define ubrk_safeClone ubrk_safeClone_3_2
-#define ubrk_setText ubrk_setText_3_2
-#define ubrk_swap ubrk_swap_3_2
-#define ucal_add ucal_add_3_2
-#define ucal_clear ucal_clear_3_2
-#define ucal_clearField ucal_clearField_3_2
-#define ucal_close ucal_close_3_2
-#define ucal_countAvailable ucal_countAvailable_3_2
-#define ucal_equivalentTo ucal_equivalentTo_3_2
-#define ucal_get ucal_get_3_2
-#define ucal_getAttribute ucal_getAttribute_3_2
-#define ucal_getAvailable ucal_getAvailable_3_2
-#define ucal_getDSTSavings ucal_getDSTSavings_3_2
-#define ucal_getDefaultTimeZone ucal_getDefaultTimeZone_3_2
-#define ucal_getLimit ucal_getLimit_3_2
-#define ucal_getLocaleByType ucal_getLocaleByType_3_2
-#define ucal_getMillis ucal_getMillis_3_2
-#define ucal_getNow ucal_getNow_3_2
-#define ucal_getTimeZoneDisplayName ucal_getTimeZoneDisplayName_3_2
-#define ucal_inDaylightTime ucal_inDaylightTime_3_2
-#define ucal_isSet ucal_isSet_3_2
-#define ucal_open ucal_open_3_2
-#define ucal_openCountryTimeZones ucal_openCountryTimeZones_3_2
-#define ucal_openTimeZones ucal_openTimeZones_3_2
-#define ucal_roll ucal_roll_3_2
-#define ucal_set ucal_set_3_2
-#define ucal_setAttribute ucal_setAttribute_3_2
-#define ucal_setDate ucal_setDate_3_2
-#define ucal_setDateTime ucal_setDateTime_3_2
-#define ucal_setDefaultTimeZone ucal_setDefaultTimeZone_3_2
-#define ucal_setMillis ucal_setMillis_3_2
-#define ucal_setTimeZone ucal_setTimeZone_3_2
-#define ucase_addPropertyStarts ucase_addPropertyStarts_3_2
-#define ucase_close ucase_close_3_2
-#define ucase_fold ucase_fold_3_2
-#define ucase_getSingleton ucase_getSingleton_3_2
-#define ucase_getType ucase_getType_3_2
-#define ucase_getTypeOrIgnorable ucase_getTypeOrIgnorable_3_2
-#define ucase_isCaseSensitive ucase_isCaseSensitive_3_2
-#define ucase_isSoftDotted ucase_isSoftDotted_3_2
-#define ucase_open ucase_open_3_2
-#define ucase_openBinary ucase_openBinary_3_2
-#define ucase_swap ucase_swap_3_2
-#define ucase_toFullFolding ucase_toFullFolding_3_2
-#define ucase_toFullLower ucase_toFullLower_3_2
-#define ucase_toFullTitle ucase_toFullTitle_3_2
-#define ucase_toFullUpper ucase_toFullUpper_3_2
-#define ucase_tolower ucase_tolower_3_2
-#define ucase_totitle ucase_totitle_3_2
-#define ucase_toupper ucase_toupper_3_2
-#define uchar_addPropertyStarts uchar_addPropertyStarts_3_2
-#define uchar_getHST uchar_getHST_3_2
-#define uchar_swapNames uchar_swapNames_3_2
-#define ucln_common_lib_cleanup ucln_common_lib_cleanup_3_2
-#define ucln_common_registerCleanup ucln_common_registerCleanup_3_2
-#define ucln_i18n_registerCleanup ucln_i18n_registerCleanup_3_2
-#define ucln_registerCleanup ucln_registerCleanup_3_2
-#define ucmp8_close ucmp8_close_3_2
-#define ucmp8_compact ucmp8_compact_3_2
-#define ucmp8_expand ucmp8_expand_3_2
-#define ucmp8_flattenMem ucmp8_flattenMem_3_2
-#define ucmp8_getArray ucmp8_getArray_3_2
-#define ucmp8_getCount ucmp8_getCount_3_2
-#define ucmp8_getIndex ucmp8_getIndex_3_2
-#define ucmp8_getkBlockCount ucmp8_getkBlockCount_3_2
-#define ucmp8_getkUnicodeCount ucmp8_getkUnicodeCount_3_2
-#define ucmp8_init ucmp8_init_3_2
-#define ucmp8_initAdopt ucmp8_initAdopt_3_2
-#define ucmp8_initAlias ucmp8_initAlias_3_2
-#define ucmp8_initBogus ucmp8_initBogus_3_2
-#define ucmp8_initFromData ucmp8_initFromData_3_2
-#define ucmp8_isBogus ucmp8_isBogus_3_2
-#define ucmp8_open ucmp8_open_3_2
-#define ucmp8_openAdopt ucmp8_openAdopt_3_2
-#define ucmp8_openAlias ucmp8_openAlias_3_2
-#define ucmp8_set ucmp8_set_3_2
-#define ucmp8_setRange ucmp8_setRange_3_2
-#define ucnv_MBCSFromUChar32 ucnv_MBCSFromUChar32_3_2
-#define ucnv_MBCSFromUnicodeWithOffsets ucnv_MBCSFromUnicodeWithOffsets_3_2
-#define ucnv_MBCSGetType ucnv_MBCSGetType_3_2
-#define ucnv_MBCSGetUnicodeSetForBytes ucnv_MBCSGetUnicodeSetForBytes_3_2
-#define ucnv_MBCSGetUnicodeSetForUnicode ucnv_MBCSGetUnicodeSetForUnicode_3_2
-#define ucnv_MBCSIsLeadByte ucnv_MBCSIsLeadByte_3_2
-#define ucnv_MBCSSimpleGetNextUChar ucnv_MBCSSimpleGetNextUChar_3_2
-#define ucnv_MBCSToUnicodeWithOffsets ucnv_MBCSToUnicodeWithOffsets_3_2
-#define ucnv_cbFromUWriteBytes ucnv_cbFromUWriteBytes_3_2
-#define ucnv_cbFromUWriteSub ucnv_cbFromUWriteSub_3_2
-#define ucnv_cbFromUWriteUChars ucnv_cbFromUWriteUChars_3_2
-#define ucnv_cbToUWriteSub ucnv_cbToUWriteSub_3_2
-#define ucnv_cbToUWriteUChars ucnv_cbToUWriteUChars_3_2
-#define ucnv_close ucnv_close_3_2
-#define ucnv_compareNames ucnv_compareNames_3_2
-#define ucnv_convert ucnv_convert_3_2
-#define ucnv_convertEx ucnv_convertEx_3_2
-#define ucnv_copyPlatformString ucnv_copyPlatformString_3_2
-#define ucnv_countAliases ucnv_countAliases_3_2
-#define ucnv_countAvailable ucnv_countAvailable_3_2
-#define ucnv_countStandards ucnv_countStandards_3_2
-#define ucnv_createAlgorithmicConverter ucnv_createAlgorithmicConverter_3_2
-#define ucnv_createConverter ucnv_createConverter_3_2
-#define ucnv_createConverterFromPackage ucnv_createConverterFromPackage_3_2
-#define ucnv_createConverterFromSharedData ucnv_createConverterFromSharedData_3_2
-#define ucnv_detectUnicodeSignature ucnv_detectUnicodeSignature_3_2
-#define ucnv_extContinueMatchFromU ucnv_extContinueMatchFromU_3_2
-#define ucnv_extContinueMatchToU ucnv_extContinueMatchToU_3_2
-#define ucnv_extGetUnicodeSet ucnv_extGetUnicodeSet_3_2
-#define ucnv_extInitialMatchFromU ucnv_extInitialMatchFromU_3_2
-#define ucnv_extInitialMatchToU ucnv_extInitialMatchToU_3_2
-#define ucnv_extSimpleMatchFromU ucnv_extSimpleMatchFromU_3_2
-#define ucnv_extSimpleMatchToU ucnv_extSimpleMatchToU_3_2
-#define ucnv_fixFileSeparator ucnv_fixFileSeparator_3_2
-#define ucnv_flushCache ucnv_flushCache_3_2
-#define ucnv_fromAlgorithmic ucnv_fromAlgorithmic_3_2
-#define ucnv_fromUChars ucnv_fromUChars_3_2
-#define ucnv_fromUWriteBytes ucnv_fromUWriteBytes_3_2
-#define ucnv_fromUnicode ucnv_fromUnicode_3_2
-#define ucnv_fromUnicode_UTF8 ucnv_fromUnicode_UTF8_3_2
-#define ucnv_fromUnicode_UTF8_OFFSETS_LOGIC ucnv_fromUnicode_UTF8_OFFSETS_LOGIC_3_2
-#define ucnv_getAlias ucnv_getAlias_3_2
-#define ucnv_getAliases ucnv_getAliases_3_2
-#define ucnv_getAvailableName ucnv_getAvailableName_3_2
-#define ucnv_getCCSID ucnv_getCCSID_3_2
-#define ucnv_getCanonicalName ucnv_getCanonicalName_3_2
-#define ucnv_getCompleteUnicodeSet ucnv_getCompleteUnicodeSet_3_2
-#define ucnv_getDefaultName ucnv_getDefaultName_3_2
-#define ucnv_getDisplayName ucnv_getDisplayName_3_2
-#define ucnv_getFromUCallBack ucnv_getFromUCallBack_3_2
-#define ucnv_getInvalidChars ucnv_getInvalidChars_3_2
-#define ucnv_getInvalidUChars ucnv_getInvalidUChars_3_2
-#define ucnv_getMaxCharSize ucnv_getMaxCharSize_3_2
-#define ucnv_getMinCharSize ucnv_getMinCharSize_3_2
-#define ucnv_getName ucnv_getName_3_2
-#define ucnv_getNextUChar ucnv_getNextUChar_3_2
-#define ucnv_getNonSurrogateUnicodeSet ucnv_getNonSurrogateUnicodeSet_3_2
-#define ucnv_getPlatform ucnv_getPlatform_3_2
-#define ucnv_getStandard ucnv_getStandard_3_2
-#define ucnv_getStandardName ucnv_getStandardName_3_2
-#define ucnv_getStarters ucnv_getStarters_3_2
-#define ucnv_getSubstChars ucnv_getSubstChars_3_2
-#define ucnv_getToUCallBack ucnv_getToUCallBack_3_2
-#define ucnv_getType ucnv_getType_3_2
-#define ucnv_getUnicodeSet ucnv_getUnicodeSet_3_2
-#define ucnv_incrementRefCount ucnv_incrementRefCount_3_2
-#define ucnv_io_countAliases ucnv_io_countAliases_3_2
-#define ucnv_io_countAvailableAliases ucnv_io_countAvailableAliases_3_2
-#define ucnv_io_countAvailableConverters ucnv_io_countAvailableConverters_3_2
-#define ucnv_io_countStandards ucnv_io_countStandards_3_2
-#define ucnv_io_flushAvailableConverterCache ucnv_io_flushAvailableConverterCache_3_2
-#define ucnv_io_getAlias ucnv_io_getAlias_3_2
-#define ucnv_io_getAliases ucnv_io_getAliases_3_2
-#define ucnv_io_getAvailableConverter ucnv_io_getAvailableConverter_3_2
-#define ucnv_io_getConverterName ucnv_io_getConverterName_3_2
-#define ucnv_io_getDefaultConverterName ucnv_io_getDefaultConverterName_3_2
-#define ucnv_io_setDefaultConverterName ucnv_io_setDefaultConverterName_3_2
-#define ucnv_io_stripASCIIForCompare ucnv_io_stripASCIIForCompare_3_2
-#define ucnv_io_stripEBCDICForCompare ucnv_io_stripEBCDICForCompare_3_2
-#define ucnv_isAmbiguous ucnv_isAmbiguous_3_2
-#define ucnv_load ucnv_load_3_2
-#define ucnv_loadSharedData ucnv_loadSharedData_3_2
-#define ucnv_open ucnv_open_3_2
-#define ucnv_openAllNames ucnv_openAllNames_3_2
-#define ucnv_openCCSID ucnv_openCCSID_3_2
-#define ucnv_openPackage ucnv_openPackage_3_2
-#define ucnv_openStandardNames ucnv_openStandardNames_3_2
-#define ucnv_openU ucnv_openU_3_2
-#define ucnv_reset ucnv_reset_3_2
-#define ucnv_resetFromUnicode ucnv_resetFromUnicode_3_2
-#define ucnv_resetToUnicode ucnv_resetToUnicode_3_2
-#define ucnv_safeClone ucnv_safeClone_3_2
-#define ucnv_setDefaultName ucnv_setDefaultName_3_2
-#define ucnv_setFallback ucnv_setFallback_3_2
-#define ucnv_setFromUCallBack ucnv_setFromUCallBack_3_2
-#define ucnv_setSubstChars ucnv_setSubstChars_3_2
-#define ucnv_setToUCallBack ucnv_setToUCallBack_3_2
-#define ucnv_swap ucnv_swap_3_2
-#define ucnv_swapAliases ucnv_swapAliases_3_2
-#define ucnv_toAlgorithmic ucnv_toAlgorithmic_3_2
-#define ucnv_toUChars ucnv_toUChars_3_2
-#define ucnv_toUWriteCodePoint ucnv_toUWriteCodePoint_3_2
-#define ucnv_toUWriteUChars ucnv_toUWriteUChars_3_2
-#define ucnv_toUnicode ucnv_toUnicode_3_2
-#define ucnv_unload ucnv_unload_3_2
-#define ucnv_unloadSharedDataIfReady ucnv_unloadSharedDataIfReady_3_2
-#define ucnv_usesFallback ucnv_usesFallback_3_2
-#define ucol_allocWeights ucol_allocWeights_3_2
-#define ucol_assembleTailoringTable ucol_assembleTailoringTable_3_2
-#define ucol_calcSortKey ucol_calcSortKey_3_2
-#define ucol_calcSortKeySimpleTertiary ucol_calcSortKeySimpleTertiary_3_2
-#define ucol_cloneBinary ucol_cloneBinary_3_2
-#define ucol_cloneRuleData ucol_cloneRuleData_3_2
-#define ucol_close ucol_close_3_2
-#define ucol_closeElements ucol_closeElements_3_2
-#define ucol_collatorToIdentifier ucol_collatorToIdentifier_3_2
-#define ucol_countAvailable ucol_countAvailable_3_2
-#define ucol_createElements ucol_createElements_3_2
-#define ucol_doCE ucol_doCE_3_2
-#define ucol_equal ucol_equal_3_2
-#define ucol_equals ucol_equals_3_2
-#define ucol_getAttribute ucol_getAttribute_3_2
-#define ucol_getAttributeOrDefault ucol_getAttributeOrDefault_3_2
-#define ucol_getAvailable ucol_getAvailable_3_2
-#define ucol_getBound ucol_getBound_3_2
-#define ucol_getCEGenerator ucol_getCEGenerator_3_2
-#define ucol_getCEStrengthDifference ucol_getCEStrengthDifference_3_2
-#define ucol_getContractions ucol_getContractions_3_2
-#define ucol_getDisplayName ucol_getDisplayName_3_2
-#define ucol_getFirstCE ucol_getFirstCE_3_2
-#define ucol_getFunctionalEquivalent ucol_getFunctionalEquivalent_3_2
-#define ucol_getKeywordValues ucol_getKeywordValues_3_2
-#define ucol_getKeywords ucol_getKeywords_3_2
-#define ucol_getLocale ucol_getLocale_3_2
-#define ucol_getLocaleByType ucol_getLocaleByType_3_2
-#define ucol_getMaxExpansion ucol_getMaxExpansion_3_2
-#define ucol_getNextCE ucol_getNextCE_3_2
-#define ucol_getNextGenerated ucol_getNextGenerated_3_2
-#define ucol_getOffset ucol_getOffset_3_2
-#define ucol_getPrevCE ucol_getPrevCE_3_2
-#define ucol_getRules ucol_getRules_3_2
-#define ucol_getRulesEx ucol_getRulesEx_3_2
-#define ucol_getShortDefinitionString ucol_getShortDefinitionString_3_2
-#define ucol_getSimpleCEGenerator ucol_getSimpleCEGenerator_3_2
-#define ucol_getSortKey ucol_getSortKey_3_2
-#define ucol_getSortKeySize ucol_getSortKeySize_3_2
-#define ucol_getSortKeyWithAllocation ucol_getSortKeyWithAllocation_3_2
-#define ucol_getStrength ucol_getStrength_3_2
-#define ucol_getTailoredSet ucol_getTailoredSet_3_2
-#define ucol_getUCAVersion ucol_getUCAVersion_3_2
-#define ucol_getUnsafeSet ucol_getUnsafeSet_3_2
-#define ucol_getVariableTop ucol_getVariableTop_3_2
-#define ucol_getVersion ucol_getVersion_3_2
-#define ucol_greater ucol_greater_3_2
-#define ucol_greaterOrEqual ucol_greaterOrEqual_3_2
-#define ucol_identifierToShortString ucol_identifierToShortString_3_2
-#define ucol_initBuffers ucol_initBuffers_3_2
-#define ucol_initCollator ucol_initCollator_3_2
-#define ucol_initInverseUCA ucol_initInverseUCA_3_2
-#define ucol_initUCA ucol_initUCA_3_2
-#define ucol_inv_getGapPositions ucol_inv_getGapPositions_3_2
-#define ucol_inv_getNextCE ucol_inv_getNextCE_3_2
-#define ucol_inv_getPrevCE ucol_inv_getPrevCE_3_2
-#define ucol_isTailored ucol_isTailored_3_2
-#define ucol_keyHashCode ucol_keyHashCode_3_2
-#define ucol_mergeSortkeys ucol_mergeSortkeys_3_2
-#define ucol_next ucol_next_3_2
-#define ucol_nextSortKeyPart ucol_nextSortKeyPart_3_2
-#define ucol_nextWeight ucol_nextWeight_3_2
-#define ucol_normalizeShortDefinitionString ucol_normalizeShortDefinitionString_3_2
-#define ucol_open ucol_open_3_2
-#define ucol_openAvailableLocales ucol_openAvailableLocales_3_2
-#define ucol_openBinary ucol_openBinary_3_2
-#define ucol_openElements ucol_openElements_3_2
-#define ucol_openFromIdentifier ucol_openFromIdentifier_3_2
-#define ucol_openFromShortString ucol_openFromShortString_3_2
-#define ucol_openRules ucol_openRules_3_2
-#define ucol_open_internal ucol_open_internal_3_2
-#define ucol_previous ucol_previous_3_2
-#define ucol_primaryOrder ucol_primaryOrder_3_2
-#define ucol_prv_getSpecialCE ucol_prv_getSpecialCE_3_2
-#define ucol_prv_getSpecialPrevCE ucol_prv_getSpecialPrevCE_3_2
-#define ucol_reset ucol_reset_3_2
-#define ucol_restoreVariableTop ucol_restoreVariableTop_3_2
-#define ucol_safeClone ucol_safeClone_3_2
-#define ucol_secondaryOrder ucol_secondaryOrder_3_2
-#define ucol_setAttribute ucol_setAttribute_3_2
-#define ucol_setOffset ucol_setOffset_3_2
-#define ucol_setOptionsFromHeader ucol_setOptionsFromHeader_3_2
-#define ucol_setReqValidLocales ucol_setReqValidLocales_3_2
-#define ucol_setStrength ucol_setStrength_3_2
-#define ucol_setText ucol_setText_3_2
-#define ucol_setVariableTop ucol_setVariableTop_3_2
-#define ucol_shortStringToIdentifier ucol_shortStringToIdentifier_3_2
-#define ucol_sortKeyToString ucol_sortKeyToString_3_2
-#define ucol_strcoll ucol_strcoll_3_2
-#define ucol_strcollIter ucol_strcollIter_3_2
-#define ucol_swap ucol_swap_3_2
-#define ucol_swapBinary ucol_swapBinary_3_2
-#define ucol_swapInverseUCA ucol_swapInverseUCA_3_2
-#define ucol_tertiaryOrder ucol_tertiaryOrder_3_2
-#define ucol_tok_assembleTokenList ucol_tok_assembleTokenList_3_2
-#define ucol_tok_closeTokenList ucol_tok_closeTokenList_3_2
-#define ucol_tok_getNextArgument ucol_tok_getNextArgument_3_2
-#define ucol_tok_initTokenList ucol_tok_initTokenList_3_2
-#define ucol_tok_parseNextToken ucol_tok_parseNextToken_3_2
-#define ucol_updateInternalState ucol_updateInternalState_3_2
-#define ucurr_forLocale ucurr_forLocale_3_2
-#define ucurr_getDefaultFractionDigits ucurr_getDefaultFractionDigits_3_2
-#define ucurr_getName ucurr_getName_3_2
-#define ucurr_getRoundingIncrement ucurr_getRoundingIncrement_3_2
-#define ucurr_register ucurr_register_3_2
-#define ucurr_unregister ucurr_unregister_3_2
-#define udat_applyPattern udat_applyPattern_3_2
-#define udat_clone udat_clone_3_2
-#define udat_close udat_close_3_2
-#define udat_countAvailable udat_countAvailable_3_2
-#define udat_countSymbols udat_countSymbols_3_2
-#define udat_format udat_format_3_2
-#define udat_get2DigitYearStart udat_get2DigitYearStart_3_2
-#define udat_getAvailable udat_getAvailable_3_2
-#define udat_getCalendar udat_getCalendar_3_2
-#define udat_getLocaleByType udat_getLocaleByType_3_2
-#define udat_getNumberFormat udat_getNumberFormat_3_2
-#define udat_getSymbols udat_getSymbols_3_2
-#define udat_isLenient udat_isLenient_3_2
-#define udat_open udat_open_3_2
-#define udat_parse udat_parse_3_2
-#define udat_parseCalendar udat_parseCalendar_3_2
-#define udat_set2DigitYearStart udat_set2DigitYearStart_3_2
-#define udat_setCalendar udat_setCalendar_3_2
-#define udat_setLenient udat_setLenient_3_2
-#define udat_setNumberFormat udat_setNumberFormat_3_2
-#define udat_setSymbols udat_setSymbols_3_2
-#define udat_toPattern udat_toPattern_3_2
-#define udata_checkCommonData udata_checkCommonData_3_2
-#define udata_close udata_close_3_2
-#define udata_closeSwapper udata_closeSwapper_3_2
-#define udata_getHeaderSize udata_getHeaderSize_3_2
-#define udata_getInfo udata_getInfo_3_2
-#define udata_getInfoSize udata_getInfoSize_3_2
-#define udata_getLength udata_getLength_3_2
-#define udata_getMemory udata_getMemory_3_2
-#define udata_getRawMemory udata_getRawMemory_3_2
-#define udata_open udata_open_3_2
-#define udata_openChoice udata_openChoice_3_2
-#define udata_openSwapper udata_openSwapper_3_2
-#define udata_openSwapperForInputData udata_openSwapperForInputData_3_2
-#define udata_printError udata_printError_3_2
-#define udata_readInt16 udata_readInt16_3_2
-#define udata_readInt32 udata_readInt32_3_2
-#define udata_setAppData udata_setAppData_3_2
-#define udata_setCommonData udata_setCommonData_3_2
-#define udata_swapDataHeader udata_swapDataHeader_3_2
-#define udata_swapInvStringBlock udata_swapInvStringBlock_3_2
-#define uenum_close uenum_close_3_2
-#define uenum_count uenum_count_3_2
-#define uenum_next uenum_next_3_2
-#define uenum_nextDefault uenum_nextDefault_3_2
-#define uenum_openCharStringsEnumeration uenum_openCharStringsEnumeration_3_2
-#define uenum_openStringEnumeration uenum_openStringEnumeration_3_2
-#define uenum_reset uenum_reset_3_2
-#define uenum_unext uenum_unext_3_2
-#define uenum_unextDefault uenum_unextDefault_3_2
-#define ufile_close_translit ufile_close_translit_3_2
-#define ufile_fill_uchar_buffer ufile_fill_uchar_buffer_3_2
-#define ufile_flush_translit ufile_flush_translit_3_2
-#define ufile_getch ufile_getch_3_2
-#define ufile_getch32 ufile_getch32_3_2
-#define ufmt_64tou ufmt_64tou_3_2
-#define ufmt_defaultCPToUnicode ufmt_defaultCPToUnicode_3_2
-#define ufmt_digitvalue ufmt_digitvalue_3_2
-#define ufmt_isdigit ufmt_isdigit_3_2
-#define ufmt_ptou ufmt_ptou_3_2
-#define ufmt_uto64 ufmt_uto64_3_2
-#define ufmt_utop ufmt_utop_3_2
-#define uhash_close uhash_close_3_2
-#define uhash_compareCaselessUnicodeString uhash_compareCaselessUnicodeString_3_2
-#define uhash_compareChars uhash_compareChars_3_2
-#define uhash_compareIChars uhash_compareIChars_3_2
-#define uhash_compareLong uhash_compareLong_3_2
-#define uhash_compareUChars uhash_compareUChars_3_2
-#define uhash_compareUnicodeString uhash_compareUnicodeString_3_2
-#define uhash_count uhash_count_3_2
-#define uhash_deleteHashtable uhash_deleteHashtable_3_2
-#define uhash_deleteUVector uhash_deleteUVector_3_2
-#define uhash_deleteUnicodeString uhash_deleteUnicodeString_3_2
-#define uhash_find uhash_find_3_2
-#define uhash_freeBlock uhash_freeBlock_3_2
-#define uhash_get uhash_get_3_2
-#define uhash_geti uhash_geti_3_2
-#define uhash_hashCaselessUnicodeString uhash_hashCaselessUnicodeString_3_2
-#define uhash_hashChars uhash_hashChars_3_2
-#define uhash_hashIChars uhash_hashIChars_3_2
-#define uhash_hashLong uhash_hashLong_3_2
-#define uhash_hashUChars uhash_hashUChars_3_2
-#define uhash_hashUCharsN uhash_hashUCharsN_3_2
-#define uhash_hashUnicodeString uhash_hashUnicodeString_3_2
-#define uhash_iget uhash_iget_3_2
-#define uhash_igeti uhash_igeti_3_2
-#define uhash_iput uhash_iput_3_2
-#define uhash_iputi uhash_iputi_3_2
-#define uhash_iremove uhash_iremove_3_2
-#define uhash_iremovei uhash_iremovei_3_2
-#define uhash_nextElement uhash_nextElement_3_2
-#define uhash_open uhash_open_3_2
-#define uhash_openSize uhash_openSize_3_2
-#define uhash_put uhash_put_3_2
-#define uhash_puti uhash_puti_3_2
-#define uhash_remove uhash_remove_3_2
-#define uhash_removeAll uhash_removeAll_3_2
-#define uhash_removeElement uhash_removeElement_3_2
-#define uhash_removei uhash_removei_3_2
-#define uhash_setKeyComparator uhash_setKeyComparator_3_2
-#define uhash_setKeyDeleter uhash_setKeyDeleter_3_2
-#define uhash_setKeyHasher uhash_setKeyHasher_3_2
-#define uhash_setResizePolicy uhash_setResizePolicy_3_2
-#define uhash_setValueDeleter uhash_setValueDeleter_3_2
-#define uhash_toki uhash_toki_3_2
-#define uhash_tokp uhash_tokp_3_2
-#define uhst_addPropertyStarts uhst_addPropertyStarts_3_2
-#define uidna_IDNToASCII uidna_IDNToASCII_3_2
-#define uidna_IDNToUnicode uidna_IDNToUnicode_3_2
-#define uidna_compare uidna_compare_3_2
-#define uidna_toASCII uidna_toASCII_3_2
-#define uidna_toUnicode uidna_toUnicode_3_2
-#define uiter_current32 uiter_current32_3_2
-#define uiter_getState uiter_getState_3_2
-#define uiter_next32 uiter_next32_3_2
-#define uiter_previous32 uiter_previous32_3_2
-#define uiter_setCharacterIterator uiter_setCharacterIterator_3_2
-#define uiter_setReplaceable uiter_setReplaceable_3_2
-#define uiter_setState uiter_setState_3_2
-#define uiter_setString uiter_setString_3_2
-#define uiter_setUTF16BE uiter_setUTF16BE_3_2
-#define uiter_setUTF8 uiter_setUTF8_3_2
-#define uloc_acceptLanguage uloc_acceptLanguage_3_2
-#define uloc_acceptLanguageFromHTTP uloc_acceptLanguageFromHTTP_3_2
-#define uloc_canonicalize uloc_canonicalize_3_2
-#define uloc_countAvailable uloc_countAvailable_3_2
-#define uloc_getAvailable uloc_getAvailable_3_2
-#define uloc_getBaseName uloc_getBaseName_3_2
-#define uloc_getCountry uloc_getCountry_3_2
-#define uloc_getDefault uloc_getDefault_3_2
-#define uloc_getDisplayCountry uloc_getDisplayCountry_3_2
-#define uloc_getDisplayKeyword uloc_getDisplayKeyword_3_2
-#define uloc_getDisplayKeywordValue uloc_getDisplayKeywordValue_3_2
-#define uloc_getDisplayLanguage uloc_getDisplayLanguage_3_2
-#define uloc_getDisplayName uloc_getDisplayName_3_2
-#define uloc_getDisplayScript uloc_getDisplayScript_3_2
-#define uloc_getDisplayVariant uloc_getDisplayVariant_3_2
-#define uloc_getISO3Country uloc_getISO3Country_3_2
-#define uloc_getISO3Language uloc_getISO3Language_3_2
-#define uloc_getISOCountries uloc_getISOCountries_3_2
-#define uloc_getISOLanguages uloc_getISOLanguages_3_2
-#define uloc_getKeywordValue uloc_getKeywordValue_3_2
-#define uloc_getLCID uloc_getLCID_3_2
-#define uloc_getLanguage uloc_getLanguage_3_2
-#define uloc_getName uloc_getName_3_2
-#define uloc_getParent uloc_getParent_3_2
-#define uloc_getScript uloc_getScript_3_2
-#define uloc_getVariant uloc_getVariant_3_2
-#define uloc_openKeywordList uloc_openKeywordList_3_2
-#define uloc_openKeywords uloc_openKeywords_3_2
-#define uloc_setDefault uloc_setDefault_3_2
-#define uloc_setKeywordValue uloc_setKeywordValue_3_2
-#define ulocdata_getExemplarSet ulocdata_getExemplarSet_3_2
-#define ulocdata_getMeasurementSystem ulocdata_getMeasurementSystem_3_2
-#define ulocdata_getPaperSize ulocdata_getPaperSize_3_2
-#define umsg_applyPattern umsg_applyPattern_3_2
-#define umsg_clone umsg_clone_3_2
-#define umsg_close umsg_close_3_2
-#define umsg_format umsg_format_3_2
-#define umsg_getLocale umsg_getLocale_3_2
-#define umsg_getLocaleByType umsg_getLocaleByType_3_2
-#define umsg_open umsg_open_3_2
-#define umsg_parse umsg_parse_3_2
-#define umsg_setLocale umsg_setLocale_3_2
-#define umsg_toPattern umsg_toPattern_3_2
-#define umsg_vformat umsg_vformat_3_2
-#define umsg_vparse umsg_vparse_3_2
-#define umtx_atomic_dec umtx_atomic_dec_3_2
-#define umtx_atomic_inc umtx_atomic_inc_3_2
-#define umtx_cleanup umtx_cleanup_3_2
-#define umtx_destroy umtx_destroy_3_2
-#define umtx_init umtx_init_3_2
-#define umtx_lock umtx_lock_3_2
-#define umtx_unlock umtx_unlock_3_2
-#define unorm_addPropertyStarts unorm_addPropertyStarts_3_2
-#define unorm_closeIter unorm_closeIter_3_2
-#define unorm_compare unorm_compare_3_2
-#define unorm_compose unorm_compose_3_2
-#define unorm_concatenate unorm_concatenate_3_2
-#define unorm_decompose unorm_decompose_3_2
-#define unorm_getCanonStartSet unorm_getCanonStartSet_3_2
-#define unorm_getCanonicalDecomposition unorm_getCanonicalDecomposition_3_2
-#define unorm_getDecomposition unorm_getDecomposition_3_2
-#define unorm_getFCD16FromCodePoint unorm_getFCD16FromCodePoint_3_2
-#define unorm_getFCDTrie unorm_getFCDTrie_3_2
-#define unorm_getNX unorm_getNX_3_2
-#define unorm_getQuickCheck unorm_getQuickCheck_3_2
-#define unorm_getUnicodeVersion unorm_getUnicodeVersion_3_2
-#define unorm_haveData unorm_haveData_3_2
-#define unorm_internalIsFullCompositionExclusion unorm_internalIsFullCompositionExclusion_3_2
-#define unorm_internalNormalize unorm_internalNormalize_3_2
-#define unorm_internalNormalizeWithNX unorm_internalNormalizeWithNX_3_2
-#define unorm_internalQuickCheck unorm_internalQuickCheck_3_2
-#define unorm_isCanonSafeStart unorm_isCanonSafeStart_3_2
-#define unorm_isNFSkippable unorm_isNFSkippable_3_2
-#define unorm_isNormalized unorm_isNormalized_3_2
-#define unorm_isNormalizedWithOptions unorm_isNormalizedWithOptions_3_2
-#define unorm_next unorm_next_3_2
-#define unorm_normalize unorm_normalize_3_2
-#define unorm_openIter unorm_openIter_3_2
-#define unorm_previous unorm_previous_3_2
-#define unorm_quickCheck unorm_quickCheck_3_2
-#define unorm_quickCheckWithOptions unorm_quickCheckWithOptions_3_2
-#define unorm_setIter unorm_setIter_3_2
-#define unorm_swap unorm_swap_3_2
-#define unum_applyPattern unum_applyPattern_3_2
-#define unum_clone unum_clone_3_2
-#define unum_close unum_close_3_2
-#define unum_countAvailable unum_countAvailable_3_2
-#define unum_format unum_format_3_2
-#define unum_formatDouble unum_formatDouble_3_2
-#define unum_formatDoubleCurrency unum_formatDoubleCurrency_3_2
-#define unum_formatInt64 unum_formatInt64_3_2
-#define unum_getAttribute unum_getAttribute_3_2
-#define unum_getAvailable unum_getAvailable_3_2
-#define unum_getDoubleAttribute unum_getDoubleAttribute_3_2
-#define unum_getLocaleByType unum_getLocaleByType_3_2
-#define unum_getSymbol unum_getSymbol_3_2
-#define unum_getTextAttribute unum_getTextAttribute_3_2
-#define unum_open unum_open_3_2
-#define unum_parse unum_parse_3_2
-#define unum_parseDouble unum_parseDouble_3_2
-#define unum_parseDoubleCurrency unum_parseDoubleCurrency_3_2
-#define unum_parseInt64 unum_parseInt64_3_2
-#define unum_setAttribute unum_setAttribute_3_2
-#define unum_setDoubleAttribute unum_setDoubleAttribute_3_2
-#define unum_setSymbol unum_setSymbol_3_2
-#define unum_setTextAttribute unum_setTextAttribute_3_2
-#define unum_toPattern unum_toPattern_3_2
-#define upname_swap upname_swap_3_2
-#define uprops_getSource uprops_getSource_3_2
-#define uprops_swap uprops_swap_3_2
-#define uprv_asciiFromEbcdic uprv_asciiFromEbcdic_3_2
-#define uprv_asciitolower uprv_asciitolower_3_2
-#define uprv_ceil uprv_ceil_3_2
-#define uprv_cnttab_addContraction uprv_cnttab_addContraction_3_2
-#define uprv_cnttab_changeContraction uprv_cnttab_changeContraction_3_2
-#define uprv_cnttab_changeLastCE uprv_cnttab_changeLastCE_3_2
-#define uprv_cnttab_clone uprv_cnttab_clone_3_2
-#define uprv_cnttab_close uprv_cnttab_close_3_2
-#define uprv_cnttab_constructTable uprv_cnttab_constructTable_3_2
-#define uprv_cnttab_findCE uprv_cnttab_findCE_3_2
-#define uprv_cnttab_findCP uprv_cnttab_findCP_3_2
-#define uprv_cnttab_getCE uprv_cnttab_getCE_3_2
-#define uprv_cnttab_insertContraction uprv_cnttab_insertContraction_3_2
-#define uprv_cnttab_isTailored uprv_cnttab_isTailored_3_2
-#define uprv_cnttab_open uprv_cnttab_open_3_2
-#define uprv_cnttab_setContraction uprv_cnttab_setContraction_3_2
-#define uprv_compareASCIIPropertyNames uprv_compareASCIIPropertyNames_3_2
-#define uprv_compareEBCDICPropertyNames uprv_compareEBCDICPropertyNames_3_2
-#define uprv_compareInvAscii uprv_compareInvAscii_3_2
-#define uprv_compareInvEbcdic uprv_compareInvEbcdic_3_2
-#define uprv_convertToLCID uprv_convertToLCID_3_2
-#define uprv_convertToPosix uprv_convertToPosix_3_2
-#define uprv_copyAscii uprv_copyAscii_3_2
-#define uprv_copyEbcdic uprv_copyEbcdic_3_2
-#define uprv_dtostr uprv_dtostr_3_2
-#define uprv_ebcdicFromAscii uprv_ebcdicFromAscii_3_2
-#define uprv_ebcdictolower uprv_ebcdictolower_3_2
-#define uprv_fabs uprv_fabs_3_2
-#define uprv_floor uprv_floor_3_2
-#define uprv_fmax uprv_fmax_3_2
-#define uprv_fmin uprv_fmin_3_2
-#define uprv_fmod uprv_fmod_3_2
-#define uprv_free uprv_free_3_2
-#define uprv_getCharNameCharacters uprv_getCharNameCharacters_3_2
-#define uprv_getDefaultCodepage uprv_getDefaultCodepage_3_2
-#define uprv_getDefaultLocaleID uprv_getDefaultLocaleID_3_2
-#define uprv_getInfinity uprv_getInfinity_3_2
-#define uprv_getMaxCharNameLength uprv_getMaxCharNameLength_3_2
-#define uprv_getMaxValues uprv_getMaxValues_3_2
-#define uprv_getNaN uprv_getNaN_3_2
-#define uprv_getStaticCurrencyName uprv_getStaticCurrencyName_3_2
-#define uprv_getUTCtime uprv_getUTCtime_3_2
-#define uprv_haveProperties uprv_haveProperties_3_2
-#define uprv_init_collIterate uprv_init_collIterate_3_2
-#define uprv_int32Comparator uprv_int32Comparator_3_2
-#define uprv_isInfinite uprv_isInfinite_3_2
-#define uprv_isInvariantString uprv_isInvariantString_3_2
-#define uprv_isInvariantUString uprv_isInvariantUString_3_2
-#define uprv_isNaN uprv_isNaN_3_2
-#define uprv_isNegativeInfinity uprv_isNegativeInfinity_3_2
-#define uprv_isPositiveInfinity uprv_isPositiveInfinity_3_2
-#define uprv_isRuleWhiteSpace uprv_isRuleWhiteSpace_3_2
-#define uprv_itou uprv_itou_3_2
-#define uprv_loadPropsData uprv_loadPropsData_3_2
-#define uprv_log uprv_log_3_2
-#define uprv_log10 uprv_log10_3_2
-#define uprv_malloc uprv_malloc_3_2
-#define uprv_mapFile uprv_mapFile_3_2
-#define uprv_max uprv_max_3_2
-#define uprv_maxMantissa uprv_maxMantissa_3_2
-#define uprv_min uprv_min_3_2
-#define uprv_modf uprv_modf_3_2
-#define uprv_openRuleWhiteSpaceSet uprv_openRuleWhiteSpaceSet_3_2
-#define uprv_pathIsAbsolute uprv_pathIsAbsolute_3_2
-#define uprv_pow uprv_pow_3_2
-#define uprv_pow10 uprv_pow10_3_2
-#define uprv_realloc uprv_realloc_3_2
-#define uprv_round uprv_round_3_2
-#define uprv_sortArray uprv_sortArray_3_2
-#define uprv_strCompare uprv_strCompare_3_2
-#define uprv_strdup uprv_strdup_3_2
-#define uprv_strndup uprv_strndup_3_2
-#define uprv_syntaxError uprv_syntaxError_3_2
-#define uprv_timezone uprv_timezone_3_2
-#define uprv_toupper uprv_toupper_3_2
-#define uprv_trunc uprv_trunc_3_2
-#define uprv_tzname uprv_tzname_3_2
-#define uprv_tzset uprv_tzset_3_2
-#define uprv_uca_addAnElement uprv_uca_addAnElement_3_2
-#define uprv_uca_assembleTable uprv_uca_assembleTable_3_2
-#define uprv_uca_canonicalClosure uprv_uca_canonicalClosure_3_2
-#define uprv_uca_cloneTempTable uprv_uca_cloneTempTable_3_2
-#define uprv_uca_closeTempTable uprv_uca_closeTempTable_3_2
-#define uprv_uca_getCodePointFromRaw uprv_uca_getCodePointFromRaw_3_2
-#define uprv_uca_getImplicitFromRaw uprv_uca_getImplicitFromRaw_3_2
-#define uprv_uca_getImplicitPrimary uprv_uca_getImplicitPrimary_3_2
-#define uprv_uca_getRawFromCodePoint uprv_uca_getRawFromCodePoint_3_2
-#define uprv_uca_getRawFromImplicit uprv_uca_getRawFromImplicit_3_2
-#define uprv_uca_initImplicitConstants uprv_uca_initImplicitConstants_3_2
-#define uprv_uca_initTempTable uprv_uca_initTempTable_3_2
-#define uprv_uint16Comparator uprv_uint16Comparator_3_2
-#define uprv_uint32Comparator uprv_uint32Comparator_3_2
-#define uprv_unmapFile uprv_unmapFile_3_2
-#define uregex_appendReplacement uregex_appendReplacement_3_2
-#define uregex_appendTail uregex_appendTail_3_2
-#define uregex_clone uregex_clone_3_2
-#define uregex_close uregex_close_3_2
-#define uregex_end uregex_end_3_2
-#define uregex_find uregex_find_3_2
-#define uregex_findNext uregex_findNext_3_2
-#define uregex_flags uregex_flags_3_2
-#define uregex_getText uregex_getText_3_2
-#define uregex_group uregex_group_3_2
-#define uregex_groupCount uregex_groupCount_3_2
-#define uregex_lookingAt uregex_lookingAt_3_2
-#define uregex_matches uregex_matches_3_2
-#define uregex_open uregex_open_3_2
-#define uregex_openC uregex_openC_3_2
-#define uregex_pattern uregex_pattern_3_2
-#define uregex_replaceAll uregex_replaceAll_3_2
-#define uregex_replaceFirst uregex_replaceFirst_3_2
-#define uregex_reset uregex_reset_3_2
-#define uregex_setText uregex_setText_3_2
-#define uregex_split uregex_split_3_2
-#define uregex_start uregex_start_3_2
-#define ures_appendResPath ures_appendResPath_3_2
-#define ures_close ures_close_3_2
-#define ures_copyResb ures_copyResb_3_2
-#define ures_countArrayItems ures_countArrayItems_3_2
-#define ures_findResource ures_findResource_3_2
-#define ures_findSubResource ures_findSubResource_3_2
-#define ures_freeResPath ures_freeResPath_3_2
-#define ures_getBinary ures_getBinary_3_2
-#define ures_getByIndex ures_getByIndex_3_2
-#define ures_getByKey ures_getByKey_3_2
-#define ures_getByKeyWithFallback ures_getByKeyWithFallback_3_2
-#define ures_getFunctionalEquivalent ures_getFunctionalEquivalent_3_2
-#define ures_getInt ures_getInt_3_2
-#define ures_getIntVector ures_getIntVector_3_2
-#define ures_getKey ures_getKey_3_2
-#define ures_getKeywordValues ures_getKeywordValues_3_2
-#define ures_getLocale ures_getLocale_3_2
-#define ures_getLocaleByType ures_getLocaleByType_3_2
-#define ures_getName ures_getName_3_2
-#define ures_getNextResource ures_getNextResource_3_2
-#define ures_getNextString ures_getNextString_3_2
-#define ures_getPath ures_getPath_3_2
-#define ures_getSize ures_getSize_3_2
-#define ures_getString ures_getString_3_2
-#define ures_getStringByIndex ures_getStringByIndex_3_2
-#define ures_getStringByKey ures_getStringByKey_3_2
-#define ures_getType ures_getType_3_2
-#define ures_getUInt ures_getUInt_3_2
-#define ures_getVersion ures_getVersion_3_2
-#define ures_getVersionNumber ures_getVersionNumber_3_2
-#define ures_hasNext ures_hasNext_3_2
-#define ures_initStackObject ures_initStackObject_3_2
-#define ures_open ures_open_3_2
-#define ures_openAvailableLocales ures_openAvailableLocales_3_2
-#define ures_openDirect ures_openDirect_3_2
-#define ures_openFillIn ures_openFillIn_3_2
-#define ures_openU ures_openU_3_2
-#define ures_resetIterator ures_resetIterator_3_2
-#define ures_swap ures_swap_3_2
-#define uscript_closeRun uscript_closeRun_3_2
-#define uscript_getCode uscript_getCode_3_2
-#define uscript_getName uscript_getName_3_2
-#define uscript_getScript uscript_getScript_3_2
-#define uscript_getShortName uscript_getShortName_3_2
-#define uscript_nextRun uscript_nextRun_3_2
-#define uscript_openRun uscript_openRun_3_2
-#define uscript_resetRun uscript_resetRun_3_2
-#define uscript_setRunText uscript_setRunText_3_2
-#define usearch_close usearch_close_3_2
-#define usearch_first usearch_first_3_2
-#define usearch_following usearch_following_3_2
-#define usearch_getAttribute usearch_getAttribute_3_2
-#define usearch_getBreakIterator usearch_getBreakIterator_3_2
-#define usearch_getCollator usearch_getCollator_3_2
-#define usearch_getMatchedLength usearch_getMatchedLength_3_2
-#define usearch_getMatchedStart usearch_getMatchedStart_3_2
-#define usearch_getMatchedText usearch_getMatchedText_3_2
-#define usearch_getOffset usearch_getOffset_3_2
-#define usearch_getPattern usearch_getPattern_3_2
-#define usearch_getText usearch_getText_3_2
-#define usearch_handleNextCanonical usearch_handleNextCanonical_3_2
-#define usearch_handleNextExact usearch_handleNextExact_3_2
-#define usearch_handlePreviousCanonical usearch_handlePreviousCanonical_3_2
-#define usearch_handlePreviousExact usearch_handlePreviousExact_3_2
-#define usearch_last usearch_last_3_2
-#define usearch_next usearch_next_3_2
-#define usearch_open usearch_open_3_2
-#define usearch_openFromCollator usearch_openFromCollator_3_2
-#define usearch_preceding usearch_preceding_3_2
-#define usearch_previous usearch_previous_3_2
-#define usearch_reset usearch_reset_3_2
-#define usearch_setAttribute usearch_setAttribute_3_2
-#define usearch_setBreakIterator usearch_setBreakIterator_3_2
-#define usearch_setCollator usearch_setCollator_3_2
-#define usearch_setOffset usearch_setOffset_3_2
-#define usearch_setPattern usearch_setPattern_3_2
-#define usearch_setText usearch_setText_3_2
-#define userv_deleteStringPair userv_deleteStringPair_3_2
-#define uset_add uset_add_3_2
-#define uset_addAll uset_addAll_3_2
-#define uset_addRange uset_addRange_3_2
-#define uset_addString uset_addString_3_2
-#define uset_applyIntPropertyValue uset_applyIntPropertyValue_3_2
-#define uset_applyPattern uset_applyPattern_3_2
-#define uset_applyPropertyAlias uset_applyPropertyAlias_3_2
-#define uset_charAt uset_charAt_3_2
-#define uset_clear uset_clear_3_2
-#define uset_close uset_close_3_2
-#define uset_compact uset_compact_3_2
-#define uset_complement uset_complement_3_2
-#define uset_complementAll uset_complementAll_3_2
-#define uset_contains uset_contains_3_2
-#define uset_containsAll uset_containsAll_3_2
-#define uset_containsNone uset_containsNone_3_2
-#define uset_containsRange uset_containsRange_3_2
-#define uset_containsSome uset_containsSome_3_2
-#define uset_containsString uset_containsString_3_2
-#define uset_equals uset_equals_3_2
-#define uset_getItem uset_getItem_3_2
-#define uset_getItemCount uset_getItemCount_3_2
-#define uset_getSerializedRange uset_getSerializedRange_3_2
-#define uset_getSerializedRangeCount uset_getSerializedRangeCount_3_2
-#define uset_getSerializedSet uset_getSerializedSet_3_2
-#define uset_indexOf uset_indexOf_3_2
-#define uset_isEmpty uset_isEmpty_3_2
-#define uset_open uset_open_3_2
-#define uset_openPattern uset_openPattern_3_2
-#define uset_openPatternOptions uset_openPatternOptions_3_2
-#define uset_remove uset_remove_3_2
-#define uset_removeAll uset_removeAll_3_2
-#define uset_removeRange uset_removeRange_3_2
-#define uset_removeString uset_removeString_3_2
-#define uset_resemblesPattern uset_resemblesPattern_3_2
-#define uset_retain uset_retain_3_2
-#define uset_retainAll uset_retainAll_3_2
-#define uset_serialize uset_serialize_3_2
-#define uset_serializedContains uset_serializedContains_3_2
-#define uset_set uset_set_3_2
-#define uset_setSerializedToOne uset_setSerializedToOne_3_2
-#define uset_size uset_size_3_2
-#define uset_toPattern uset_toPattern_3_2
-#define usprep_close usprep_close_3_2
-#define usprep_open usprep_open_3_2
-#define usprep_prepare usprep_prepare_3_2
-#define usprep_swap usprep_swap_3_2
-#define ustr_foldCase ustr_foldCase_3_2
-#define ustr_toLower ustr_toLower_3_2
-#define ustr_toTitle ustr_toTitle_3_2
-#define ustr_toUpper ustr_toUpper_3_2
-#define utf8_appendCharSafeBody utf8_appendCharSafeBody_3_2
-#define utf8_back1SafeBody utf8_back1SafeBody_3_2
-#define utf8_countTrailBytes utf8_countTrailBytes_3_2
-#define utf8_nextCharSafeBody utf8_nextCharSafeBody_3_2
-#define utf8_prevCharSafeBody utf8_prevCharSafeBody_3_2
-#define utmscale_fromInt64 utmscale_fromInt64_3_2
-#define utmscale_getTimeScaleValue utmscale_getTimeScaleValue_3_2
-#define utmscale_toInt64 utmscale_toInt64_3_2
-#define utrace_cleanup utrace_cleanup_3_2
-#define utrace_data utrace_data_3_2
-#define utrace_entry utrace_entry_3_2
-#define utrace_exit utrace_exit_3_2
-#define utrace_format utrace_format_3_2
-#define utrace_functionName utrace_functionName_3_2
-#define utrace_getFunctions utrace_getFunctions_3_2
-#define utrace_getLevel utrace_getLevel_3_2
-#define utrace_level utrace_level_3_2
-#define utrace_setFunctions utrace_setFunctions_3_2
-#define utrace_setLevel utrace_setLevel_3_2
-#define utrace_vformat utrace_vformat_3_2
-#define utrans_clone utrans_clone_3_2
-#define utrans_close utrans_close_3_2
-#define utrans_countAvailableIDs utrans_countAvailableIDs_3_2
-#define utrans_getAvailableID utrans_getAvailableID_3_2
-#define utrans_getID utrans_getID_3_2
-#define utrans_getUnicodeID utrans_getUnicodeID_3_2
-#define utrans_open utrans_open_3_2
-#define utrans_openIDs utrans_openIDs_3_2
-#define utrans_openInverse utrans_openInverse_3_2
-#define utrans_openU utrans_openU_3_2
-#define utrans_register utrans_register_3_2
-#define utrans_rep_caseContextIterator utrans_rep_caseContextIterator_3_2
-#define utrans_setFilter utrans_setFilter_3_2
-#define utrans_trans utrans_trans_3_2
-#define utrans_transIncremental utrans_transIncremental_3_2
-#define utrans_transIncrementalUChars utrans_transIncrementalUChars_3_2
-#define utrans_transUChars utrans_transUChars_3_2
-#define utrans_unregister utrans_unregister_3_2
-#define utrans_unregisterID utrans_unregisterID_3_2
-#define utrie_clone utrie_clone_3_2
-#define utrie_close utrie_close_3_2
-#define utrie_enum utrie_enum_3_2
-#define utrie_get32 utrie_get32_3_2
-#define utrie_getData utrie_getData_3_2
-#define utrie_open utrie_open_3_2
-#define utrie_serialize utrie_serialize_3_2
-#define utrie_set32 utrie_set32_3_2
-#define utrie_setRange32 utrie_setRange32_3_2
-#define utrie_swap utrie_swap_3_2
-#define utrie_unserialize utrie_unserialize_3_2
+#define T_CString_int64ToString T_CString_int64ToString_3_6
+#define T_CString_integerToString T_CString_integerToString_3_6
+#define T_CString_stricmp T_CString_stricmp_3_6
+#define T_CString_stringToInteger T_CString_stringToInteger_3_6
+#define T_CString_strnicmp T_CString_strnicmp_3_6
+#define T_CString_toLowerCase T_CString_toLowerCase_3_6
+#define T_CString_toUpperCase T_CString_toUpperCase_3_6
+#define UCNV_FROM_U_CALLBACK_ESCAPE UCNV_FROM_U_CALLBACK_ESCAPE_3_6
+#define UCNV_FROM_U_CALLBACK_SKIP UCNV_FROM_U_CALLBACK_SKIP_3_6
+#define UCNV_FROM_U_CALLBACK_STOP UCNV_FROM_U_CALLBACK_STOP_3_6
+#define UCNV_FROM_U_CALLBACK_SUBSTITUTE UCNV_FROM_U_CALLBACK_SUBSTITUTE_3_6
+#define UCNV_TO_U_CALLBACK_ESCAPE UCNV_TO_U_CALLBACK_ESCAPE_3_6
+#define UCNV_TO_U_CALLBACK_SKIP UCNV_TO_U_CALLBACK_SKIP_3_6
+#define UCNV_TO_U_CALLBACK_STOP UCNV_TO_U_CALLBACK_STOP_3_6
+#define UCNV_TO_U_CALLBACK_SUBSTITUTE UCNV_TO_U_CALLBACK_SUBSTITUTE_3_6
+#define UDataMemory_createNewInstance UDataMemory_createNewInstance_3_6
+#define UDataMemory_init UDataMemory_init_3_6
+#define UDataMemory_isLoaded UDataMemory_isLoaded_3_6
+#define UDataMemory_normalizeDataPointer UDataMemory_normalizeDataPointer_3_6
+#define UDataMemory_setData UDataMemory_setData_3_6
+#define UDatamemory_assign UDatamemory_assign_3_6
+#define _ASCIIData _ASCIIData_3_6
+#define _Bocu1Data _Bocu1Data_3_6
+#define _CESU8Data _CESU8Data_3_6
+#define _HZData _HZData_3_6
+#define _IMAPData _IMAPData_3_6
+#define _ISCIIData _ISCIIData_3_6
+#define _ISO2022Data _ISO2022Data_3_6
+#define _LMBCSData1 _LMBCSData1_3_6
+#define _LMBCSData11 _LMBCSData11_3_6
+#define _LMBCSData16 _LMBCSData16_3_6
+#define _LMBCSData17 _LMBCSData17_3_6
+#define _LMBCSData18 _LMBCSData18_3_6
+#define _LMBCSData19 _LMBCSData19_3_6
+#define _LMBCSData2 _LMBCSData2_3_6
+#define _LMBCSData3 _LMBCSData3_3_6
+#define _LMBCSData4 _LMBCSData4_3_6
+#define _LMBCSData5 _LMBCSData5_3_6
+#define _LMBCSData6 _LMBCSData6_3_6
+#define _LMBCSData8 _LMBCSData8_3_6
+#define _Latin1Data _Latin1Data_3_6
+#define _MBCSData _MBCSData_3_6
+#define _SCSUData _SCSUData_3_6
+#define _UTF16BEData _UTF16BEData_3_6
+#define _UTF16Data _UTF16Data_3_6
+#define _UTF16LEData _UTF16LEData_3_6
+#define _UTF32BEData _UTF32BEData_3_6
+#define _UTF32Data _UTF32Data_3_6
+#define _UTF32LEData _UTF32LEData_3_6
+#define _UTF7Data _UTF7Data_3_6
+#define _UTF8Data _UTF8Data_3_6
+#define cmemory_cleanup cmemory_cleanup_3_6
+#define cmemory_inUse cmemory_inUse_3_6
+#define locale_getKeywords locale_getKeywords_3_6
+#define locale_get_default locale_get_default_3_6
+#define locale_set_default locale_set_default_3_6
+#define res_countArrayItems res_countArrayItems_3_6
+#define res_findResource res_findResource_3_6
+#define res_getAlias res_getAlias_3_6
+#define res_getArrayItem res_getArrayItem_3_6
+#define res_getBinary res_getBinary_3_6
+#define res_getIntVector res_getIntVector_3_6
+#define res_getResource res_getResource_3_6
+#define res_getString res_getString_3_6
+#define res_getTableItemByIndex res_getTableItemByIndex_3_6
+#define res_getTableItemByKey res_getTableItemByKey_3_6
+#define res_load res_load_3_6
+#define res_unload res_unload_3_6
+#define transliterator_cleanup transliterator_cleanup_3_6
+#define triedict_swap triedict_swap_3_6
+#define u_UCharsToChars u_UCharsToChars_3_6
+#define u_austrcpy u_austrcpy_3_6
+#define u_austrncpy u_austrncpy_3_6
+#define u_catclose u_catclose_3_6
+#define u_catgets u_catgets_3_6
+#define u_catopen u_catopen_3_6
+#define u_charAge u_charAge_3_6
+#define u_charDigitValue u_charDigitValue_3_6
+#define u_charDirection u_charDirection_3_6
+#define u_charFromName u_charFromName_3_6
+#define u_charMirror u_charMirror_3_6
+#define u_charName u_charName_3_6
+#define u_charType u_charType_3_6
+#define u_charsToUChars u_charsToUChars_3_6
+#define u_cleanup u_cleanup_3_6
+#define u_countChar32 u_countChar32_3_6
+#define u_digit u_digit_3_6
+#define u_enumCharNames u_enumCharNames_3_6
+#define u_enumCharTypes u_enumCharTypes_3_6
+#define u_errorName u_errorName_3_6
+#define u_fclose u_fclose_3_6
+#define u_feof u_feof_3_6
+#define u_fflush u_fflush_3_6
+#define u_fgetConverter u_fgetConverter_3_6
+#define u_fgetc u_fgetc_3_6
+#define u_fgetcodepage u_fgetcodepage_3_6
+#define u_fgetcx u_fgetcx_3_6
+#define u_fgetfile u_fgetfile_3_6
+#define u_fgetlocale u_fgetlocale_3_6
+#define u_fgets u_fgets_3_6
+#define u_file_read u_file_read_3_6
+#define u_file_write u_file_write_3_6
+#define u_file_write_flush u_file_write_flush_3_6
+#define u_finit u_finit_3_6
+#define u_foldCase u_foldCase_3_6
+#define u_fopen u_fopen_3_6
+#define u_forDigit u_forDigit_3_6
+#define u_formatMessage u_formatMessage_3_6
+#define u_formatMessageWithError u_formatMessageWithError_3_6
+#define u_fprintf u_fprintf_3_6
+#define u_fprintf_u u_fprintf_u_3_6
+#define u_fputc u_fputc_3_6
+#define u_fputs u_fputs_3_6
+#define u_frewind u_frewind_3_6
+#define u_fscanf u_fscanf_3_6
+#define u_fscanf_u u_fscanf_u_3_6
+#define u_fsetcodepage u_fsetcodepage_3_6
+#define u_fsetlocale u_fsetlocale_3_6
+#define u_fsettransliterator u_fsettransliterator_3_6
+#define u_fstropen u_fstropen_3_6
+#define u_fungetc u_fungetc_3_6
+#define u_getCombiningClass u_getCombiningClass_3_6
+#define u_getDataDirectory u_getDataDirectory_3_6
+#define u_getDefaultConverter u_getDefaultConverter_3_6
+#define u_getFC_NFKC_Closure u_getFC_NFKC_Closure_3_6
+#define u_getISOComment u_getISOComment_3_6
+#define u_getIntPropertyMaxValue u_getIntPropertyMaxValue_3_6
+#define u_getIntPropertyMinValue u_getIntPropertyMinValue_3_6
+#define u_getIntPropertyValue u_getIntPropertyValue_3_6
+#define u_getNumericValue u_getNumericValue_3_6
+#define u_getPropertyEnum u_getPropertyEnum_3_6
+#define u_getPropertyName u_getPropertyName_3_6
+#define u_getPropertyValueEnum u_getPropertyValueEnum_3_6
+#define u_getPropertyValueName u_getPropertyValueName_3_6
+#define u_getUnicodeProperties u_getUnicodeProperties_3_6
+#define u_getUnicodeVersion u_getUnicodeVersion_3_6
+#define u_getVersion u_getVersion_3_6
+#define u_growBufferFromStatic u_growBufferFromStatic_3_6
+#define u_hasBinaryProperty u_hasBinaryProperty_3_6
+#define u_init u_init_3_6
+#define u_isIDIgnorable u_isIDIgnorable_3_6
+#define u_isIDPart u_isIDPart_3_6
+#define u_isIDStart u_isIDStart_3_6
+#define u_isISOControl u_isISOControl_3_6
+#define u_isJavaIDPart u_isJavaIDPart_3_6
+#define u_isJavaIDStart u_isJavaIDStart_3_6
+#define u_isJavaSpaceChar u_isJavaSpaceChar_3_6
+#define u_isMirrored u_isMirrored_3_6
+#define u_isUAlphabetic u_isUAlphabetic_3_6
+#define u_isULowercase u_isULowercase_3_6
+#define u_isUUppercase u_isUUppercase_3_6
+#define u_isUWhiteSpace u_isUWhiteSpace_3_6
+#define u_isWhitespace u_isWhitespace_3_6
+#define u_isalnum u_isalnum_3_6
+#define u_isalnumPOSIX u_isalnumPOSIX_3_6
+#define u_isalpha u_isalpha_3_6
+#define u_isbase u_isbase_3_6
+#define u_isblank u_isblank_3_6
+#define u_iscntrl u_iscntrl_3_6
+#define u_isdefined u_isdefined_3_6
+#define u_isdigit u_isdigit_3_6
+#define u_isgraph u_isgraph_3_6
+#define u_isgraphPOSIX u_isgraphPOSIX_3_6
+#define u_islower u_islower_3_6
+#define u_isprint u_isprint_3_6
+#define u_isprintPOSIX u_isprintPOSIX_3_6
+#define u_ispunct u_ispunct_3_6
+#define u_isspace u_isspace_3_6
+#define u_istitle u_istitle_3_6
+#define u_isupper u_isupper_3_6
+#define u_isxdigit u_isxdigit_3_6
+#define u_lengthOfIdenticalLevelRun u_lengthOfIdenticalLevelRun_3_6
+#define u_locbund_close u_locbund_close_3_6
+#define u_locbund_getNumberFormat u_locbund_getNumberFormat_3_6
+#define u_locbund_init u_locbund_init_3_6
+#define u_memcasecmp u_memcasecmp_3_6
+#define u_memchr u_memchr_3_6
+#define u_memchr32 u_memchr32_3_6
+#define u_memcmp u_memcmp_3_6
+#define u_memcmpCodePointOrder u_memcmpCodePointOrder_3_6
+#define u_memcpy u_memcpy_3_6
+#define u_memmove u_memmove_3_6
+#define u_memrchr u_memrchr_3_6
+#define u_memrchr32 u_memrchr32_3_6
+#define u_memset u_memset_3_6
+#define u_parseMessage u_parseMessage_3_6
+#define u_parseMessageWithError u_parseMessageWithError_3_6
+#define u_printf_parse u_printf_parse_3_6
+#define u_releaseDefaultConverter u_releaseDefaultConverter_3_6
+#define u_scanf_parse u_scanf_parse_3_6
+#define u_setAtomicIncDecFunctions u_setAtomicIncDecFunctions_3_6
+#define u_setDataDirectory u_setDataDirectory_3_6
+#define u_setMemoryFunctions u_setMemoryFunctions_3_6
+#define u_setMutexFunctions u_setMutexFunctions_3_6
+#define u_shapeArabic u_shapeArabic_3_6
+#define u_snprintf u_snprintf_3_6
+#define u_snprintf_u u_snprintf_u_3_6
+#define u_sprintf u_sprintf_3_6
+#define u_sprintf_u u_sprintf_u_3_6
+#define u_sscanf u_sscanf_3_6
+#define u_sscanf_u u_sscanf_u_3_6
+#define u_strCaseCompare u_strCaseCompare_3_6
+#define u_strCompare u_strCompare_3_6
+#define u_strCompareIter u_strCompareIter_3_6
+#define u_strFindFirst u_strFindFirst_3_6
+#define u_strFindLast u_strFindLast_3_6
+#define u_strFoldCase u_strFoldCase_3_6
+#define u_strFromPunycode u_strFromPunycode_3_6
+#define u_strFromUTF32 u_strFromUTF32_3_6
+#define u_strFromUTF8 u_strFromUTF8_3_6
+#define u_strFromUTF8Lenient u_strFromUTF8Lenient_3_6
+#define u_strFromUTF8WithSub u_strFromUTF8WithSub_3_6
+#define u_strFromWCS u_strFromWCS_3_6
+#define u_strHasMoreChar32Than u_strHasMoreChar32Than_3_6
+#define u_strToLower u_strToLower_3_6
+#define u_strToPunycode u_strToPunycode_3_6
+#define u_strToTitle u_strToTitle_3_6
+#define u_strToUTF32 u_strToUTF32_3_6
+#define u_strToUTF8 u_strToUTF8_3_6
+#define u_strToUTF8WithSub u_strToUTF8WithSub_3_6
+#define u_strToUpper u_strToUpper_3_6
+#define u_strToWCS u_strToWCS_3_6
+#define u_strcasecmp u_strcasecmp_3_6
+#define u_strcat u_strcat_3_6
+#define u_strchr u_strchr_3_6
+#define u_strchr32 u_strchr32_3_6
+#define u_strcmp u_strcmp_3_6
+#define u_strcmpCodePointOrder u_strcmpCodePointOrder_3_6
+#define u_strcmpFold u_strcmpFold_3_6
+#define u_strcpy u_strcpy_3_6
+#define u_strcspn u_strcspn_3_6
+#define u_strlen u_strlen_3_6
+#define u_strncasecmp u_strncasecmp_3_6
+#define u_strncat u_strncat_3_6
+#define u_strncmp u_strncmp_3_6
+#define u_strncmpCodePointOrder u_strncmpCodePointOrder_3_6
+#define u_strncpy u_strncpy_3_6
+#define u_strpbrk u_strpbrk_3_6
+#define u_strrchr u_strrchr_3_6
+#define u_strrchr32 u_strrchr32_3_6
+#define u_strrstr u_strrstr_3_6
+#define u_strspn u_strspn_3_6
+#define u_strstr u_strstr_3_6
+#define u_strtok_r u_strtok_r_3_6
+#define u_terminateChars u_terminateChars_3_6
+#define u_terminateUChar32s u_terminateUChar32s_3_6
+#define u_terminateUChars u_terminateUChars_3_6
+#define u_terminateWChars u_terminateWChars_3_6
+#define u_tolower u_tolower_3_6
+#define u_totitle u_totitle_3_6
+#define u_toupper u_toupper_3_6
+#define u_uastrcpy u_uastrcpy_3_6
+#define u_uastrncpy u_uastrncpy_3_6
+#define u_unescape u_unescape_3_6
+#define u_unescapeAt u_unescapeAt_3_6
+#define u_versionFromString u_versionFromString_3_6
+#define u_versionToString u_versionToString_3_6
+#define u_vformatMessage u_vformatMessage_3_6
+#define u_vformatMessageWithError u_vformatMessageWithError_3_6
+#define u_vfprintf u_vfprintf_3_6
+#define u_vfprintf_u u_vfprintf_u_3_6
+#define u_vfscanf u_vfscanf_3_6
+#define u_vfscanf_u u_vfscanf_u_3_6
+#define u_vparseMessage u_vparseMessage_3_6
+#define u_vparseMessageWithError u_vparseMessageWithError_3_6
+#define u_vsnprintf u_vsnprintf_3_6
+#define u_vsnprintf_u u_vsnprintf_u_3_6
+#define u_vsprintf u_vsprintf_3_6
+#define u_vsprintf_u u_vsprintf_u_3_6
+#define u_vsscanf u_vsscanf_3_6
+#define u_vsscanf_u u_vsscanf_u_3_6
+#define u_writeDiff u_writeDiff_3_6
+#define u_writeIdenticalLevelRun u_writeIdenticalLevelRun_3_6
+#define u_writeIdenticalLevelRunTwoChars u_writeIdenticalLevelRunTwoChars_3_6
+#define ubidi_addPropertyStarts ubidi_addPropertyStarts_3_6
+#define ubidi_close ubidi_close_3_6
+#define ubidi_closeProps ubidi_closeProps_3_6
+#define ubidi_countParagraphs ubidi_countParagraphs_3_6
+#define ubidi_countRuns ubidi_countRuns_3_6
+#define ubidi_getClass ubidi_getClass_3_6
+#define ubidi_getClassCallback ubidi_getClassCallback_3_6
+#define ubidi_getCustomizedClass ubidi_getCustomizedClass_3_6
+#define ubidi_getDirection ubidi_getDirection_3_6
+#define ubidi_getDummy ubidi_getDummy_3_6
+#define ubidi_getJoiningGroup ubidi_getJoiningGroup_3_6
+#define ubidi_getJoiningType ubidi_getJoiningType_3_6
+#define ubidi_getLength ubidi_getLength_3_6
+#define ubidi_getLevelAt ubidi_getLevelAt_3_6
+#define ubidi_getLevels ubidi_getLevels_3_6
+#define ubidi_getLogicalIndex ubidi_getLogicalIndex_3_6
+#define ubidi_getLogicalMap ubidi_getLogicalMap_3_6
+#define ubidi_getLogicalRun ubidi_getLogicalRun_3_6
+#define ubidi_getMaxValue ubidi_getMaxValue_3_6
+#define ubidi_getMemory ubidi_getMemory_3_6
+#define ubidi_getMirror ubidi_getMirror_3_6
+#define ubidi_getParaLevel ubidi_getParaLevel_3_6
+#define ubidi_getParagraph ubidi_getParagraph_3_6
+#define ubidi_getParagraphByIndex ubidi_getParagraphByIndex_3_6
+#define ubidi_getProcessedLength ubidi_getProcessedLength_3_6
+#define ubidi_getReorderingMode ubidi_getReorderingMode_3_6
+#define ubidi_getReorderingOptions ubidi_getReorderingOptions_3_6
+#define ubidi_getResultLength ubidi_getResultLength_3_6
+#define ubidi_getRuns ubidi_getRuns_3_6
+#define ubidi_getSingleton ubidi_getSingleton_3_6
+#define ubidi_getText ubidi_getText_3_6
+#define ubidi_getVisualIndex ubidi_getVisualIndex_3_6
+#define ubidi_getVisualMap ubidi_getVisualMap_3_6
+#define ubidi_getVisualRun ubidi_getVisualRun_3_6
+#define ubidi_invertMap ubidi_invertMap_3_6
+#define ubidi_isBidiControl ubidi_isBidiControl_3_6
+#define ubidi_isInverse ubidi_isInverse_3_6
+#define ubidi_isJoinControl ubidi_isJoinControl_3_6
+#define ubidi_isMirrored ubidi_isMirrored_3_6
+#define ubidi_isOrderParagraphsLTR ubidi_isOrderParagraphsLTR_3_6
+#define ubidi_open ubidi_open_3_6
+#define ubidi_openSized ubidi_openSized_3_6
+#define ubidi_orderParagraphsLTR ubidi_orderParagraphsLTR_3_6
+#define ubidi_reorderLogical ubidi_reorderLogical_3_6
+#define ubidi_reorderVisual ubidi_reorderVisual_3_6
+#define ubidi_setClassCallback ubidi_setClassCallback_3_6
+#define ubidi_setInverse ubidi_setInverse_3_6
+#define ubidi_setLine ubidi_setLine_3_6
+#define ubidi_setPara ubidi_setPara_3_6
+#define ubidi_setReorderingMode ubidi_setReorderingMode_3_6
+#define ubidi_setReorderingOptions ubidi_setReorderingOptions_3_6
+#define ubidi_writeReordered ubidi_writeReordered_3_6
+#define ubidi_writeReverse ubidi_writeReverse_3_6
+#define ublock_getCode ublock_getCode_3_6
+#define ubrk_close ubrk_close_3_6
+#define ubrk_countAvailable ubrk_countAvailable_3_6
+#define ubrk_current ubrk_current_3_6
+#define ubrk_first ubrk_first_3_6
+#define ubrk_following ubrk_following_3_6
+#define ubrk_getAvailable ubrk_getAvailable_3_6
+#define ubrk_getLocaleByType ubrk_getLocaleByType_3_6
+#define ubrk_getRuleStatus ubrk_getRuleStatus_3_6
+#define ubrk_getRuleStatusVec ubrk_getRuleStatusVec_3_6
+#define ubrk_isBoundary ubrk_isBoundary_3_6
+#define ubrk_last ubrk_last_3_6
+#define ubrk_next ubrk_next_3_6
+#define ubrk_open ubrk_open_3_6
+#define ubrk_openRules ubrk_openRules_3_6
+#define ubrk_preceding ubrk_preceding_3_6
+#define ubrk_previous ubrk_previous_3_6
+#define ubrk_safeClone ubrk_safeClone_3_6
+#define ubrk_setText ubrk_setText_3_6
+#define ubrk_setUText ubrk_setUText_3_6
+#define ubrk_swap ubrk_swap_3_6
+#define ucal_add ucal_add_3_6
+#define ucal_clear ucal_clear_3_6
+#define ucal_clearField ucal_clearField_3_6
+#define ucal_close ucal_close_3_6
+#define ucal_countAvailable ucal_countAvailable_3_6
+#define ucal_equivalentTo ucal_equivalentTo_3_6
+#define ucal_get ucal_get_3_6
+#define ucal_getAttribute ucal_getAttribute_3_6
+#define ucal_getAvailable ucal_getAvailable_3_6
+#define ucal_getDSTSavings ucal_getDSTSavings_3_6
+#define ucal_getDefaultTimeZone ucal_getDefaultTimeZone_3_6
+#define ucal_getGregorianChange ucal_getGregorianChange_3_6
+#define ucal_getLimit ucal_getLimit_3_6
+#define ucal_getLocaleByType ucal_getLocaleByType_3_6
+#define ucal_getMillis ucal_getMillis_3_6
+#define ucal_getNow ucal_getNow_3_6
+#define ucal_getTimeZoneDisplayName ucal_getTimeZoneDisplayName_3_6
+#define ucal_inDaylightTime ucal_inDaylightTime_3_6
+#define ucal_isSet ucal_isSet_3_6
+#define ucal_open ucal_open_3_6
+#define ucal_openCountryTimeZones ucal_openCountryTimeZones_3_6
+#define ucal_openTimeZones ucal_openTimeZones_3_6
+#define ucal_roll ucal_roll_3_6
+#define ucal_set ucal_set_3_6
+#define ucal_setAttribute ucal_setAttribute_3_6
+#define ucal_setDate ucal_setDate_3_6
+#define ucal_setDateTime ucal_setDateTime_3_6
+#define ucal_setDefaultTimeZone ucal_setDefaultTimeZone_3_6
+#define ucal_setGregorianChange ucal_setGregorianChange_3_6
+#define ucal_setMillis ucal_setMillis_3_6
+#define ucal_setTimeZone ucal_setTimeZone_3_6
+#define ucase_addCaseClosure ucase_addCaseClosure_3_6
+#define ucase_addPropertyStarts ucase_addPropertyStarts_3_6
+#define ucase_addStringCaseClosure ucase_addStringCaseClosure_3_6
+#define ucase_close ucase_close_3_6
+#define ucase_fold ucase_fold_3_6
+#define ucase_getCaseLocale ucase_getCaseLocale_3_6
+#define ucase_getDummy ucase_getDummy_3_6
+#define ucase_getSingleton ucase_getSingleton_3_6
+#define ucase_getType ucase_getType_3_6
+#define ucase_getTypeOrIgnorable ucase_getTypeOrIgnorable_3_6
+#define ucase_hasBinaryProperty ucase_hasBinaryProperty_3_6
+#define ucase_isCaseSensitive ucase_isCaseSensitive_3_6
+#define ucase_isSoftDotted ucase_isSoftDotted_3_6
+#define ucase_toFullFolding ucase_toFullFolding_3_6
+#define ucase_toFullLower ucase_toFullLower_3_6
+#define ucase_toFullTitle ucase_toFullTitle_3_6
+#define ucase_toFullUpper ucase_toFullUpper_3_6
+#define ucase_tolower ucase_tolower_3_6
+#define ucase_totitle ucase_totitle_3_6
+#define ucase_toupper ucase_toupper_3_6
+#define ucasemap_close ucasemap_close_3_6
+#define ucasemap_getLocale ucasemap_getLocale_3_6
+#define ucasemap_getOptions ucasemap_getOptions_3_6
+#define ucasemap_open ucasemap_open_3_6
+#define ucasemap_setLocale ucasemap_setLocale_3_6
+#define ucasemap_setOptions ucasemap_setOptions_3_6
+#define ucasemap_utf8ToLower ucasemap_utf8ToLower_3_6
+#define ucasemap_utf8ToUpper ucasemap_utf8ToUpper_3_6
+#define uchar_addPropertyStarts uchar_addPropertyStarts_3_6
+#define uchar_getHST uchar_getHST_3_6
+#define uchar_swapNames uchar_swapNames_3_6
+#define ucln_common_registerCleanup ucln_common_registerCleanup_3_6
+#define ucln_i18n_registerCleanup ucln_i18n_registerCleanup_3_6
+#define ucln_io_registerCleanup ucln_io_registerCleanup_3_6
+#define ucln_lib_cleanup ucln_lib_cleanup_3_6
+#define ucln_registerCleanup ucln_registerCleanup_3_6
+#define ucnv_MBCSFromUChar32 ucnv_MBCSFromUChar32_3_6
+#define ucnv_MBCSFromUnicodeWithOffsets ucnv_MBCSFromUnicodeWithOffsets_3_6
+#define ucnv_MBCSGetType ucnv_MBCSGetType_3_6
+#define ucnv_MBCSGetUnicodeSetForBytes ucnv_MBCSGetUnicodeSetForBytes_3_6
+#define ucnv_MBCSGetUnicodeSetForUnicode ucnv_MBCSGetUnicodeSetForUnicode_3_6
+#define ucnv_MBCSIsLeadByte ucnv_MBCSIsLeadByte_3_6
+#define ucnv_MBCSSimpleGetNextUChar ucnv_MBCSSimpleGetNextUChar_3_6
+#define ucnv_MBCSToUnicodeWithOffsets ucnv_MBCSToUnicodeWithOffsets_3_6
+#define ucnv_bld_countAvailableConverters ucnv_bld_countAvailableConverters_3_6
+#define ucnv_bld_getAvailableConverter ucnv_bld_getAvailableConverter_3_6
+#define ucnv_cbFromUWriteBytes ucnv_cbFromUWriteBytes_3_6
+#define ucnv_cbFromUWriteSub ucnv_cbFromUWriteSub_3_6
+#define ucnv_cbFromUWriteUChars ucnv_cbFromUWriteUChars_3_6
+#define ucnv_cbToUWriteSub ucnv_cbToUWriteSub_3_6
+#define ucnv_cbToUWriteUChars ucnv_cbToUWriteUChars_3_6
+#define ucnv_close ucnv_close_3_6
+#define ucnv_compareNames ucnv_compareNames_3_6
+#define ucnv_convert ucnv_convert_3_6
+#define ucnv_convertEx ucnv_convertEx_3_6
+#define ucnv_countAliases ucnv_countAliases_3_6
+#define ucnv_countAvailable ucnv_countAvailable_3_6
+#define ucnv_countStandards ucnv_countStandards_3_6
+#define ucnv_createAlgorithmicConverter ucnv_createAlgorithmicConverter_3_6
+#define ucnv_createConverter ucnv_createConverter_3_6
+#define ucnv_createConverterFromPackage ucnv_createConverterFromPackage_3_6
+#define ucnv_createConverterFromSharedData ucnv_createConverterFromSharedData_3_6
+#define ucnv_detectUnicodeSignature ucnv_detectUnicodeSignature_3_6
+#define ucnv_extContinueMatchFromU ucnv_extContinueMatchFromU_3_6
+#define ucnv_extContinueMatchToU ucnv_extContinueMatchToU_3_6
+#define ucnv_extGetUnicodeSet ucnv_extGetUnicodeSet_3_6
+#define ucnv_extInitialMatchFromU ucnv_extInitialMatchFromU_3_6
+#define ucnv_extInitialMatchToU ucnv_extInitialMatchToU_3_6
+#define ucnv_extSimpleMatchFromU ucnv_extSimpleMatchFromU_3_6
+#define ucnv_extSimpleMatchToU ucnv_extSimpleMatchToU_3_6
+#define ucnv_fixFileSeparator ucnv_fixFileSeparator_3_6
+#define ucnv_flushCache ucnv_flushCache_3_6
+#define ucnv_fromAlgorithmic ucnv_fromAlgorithmic_3_6
+#define ucnv_fromUChars ucnv_fromUChars_3_6
+#define ucnv_fromUCountPending ucnv_fromUCountPending_3_6
+#define ucnv_fromUWriteBytes ucnv_fromUWriteBytes_3_6
+#define ucnv_fromUnicode ucnv_fromUnicode_3_6
+#define ucnv_fromUnicode_UTF8 ucnv_fromUnicode_UTF8_3_6
+#define ucnv_fromUnicode_UTF8_OFFSETS_LOGIC ucnv_fromUnicode_UTF8_OFFSETS_LOGIC_3_6
+#define ucnv_getAlias ucnv_getAlias_3_6
+#define ucnv_getAliases ucnv_getAliases_3_6
+#define ucnv_getAvailableName ucnv_getAvailableName_3_6
+#define ucnv_getCCSID ucnv_getCCSID_3_6
+#define ucnv_getCanonicalName ucnv_getCanonicalName_3_6
+#define ucnv_getCompleteUnicodeSet ucnv_getCompleteUnicodeSet_3_6
+#define ucnv_getDefaultName ucnv_getDefaultName_3_6
+#define ucnv_getDisplayName ucnv_getDisplayName_3_6
+#define ucnv_getFromUCallBack ucnv_getFromUCallBack_3_6
+#define ucnv_getInvalidChars ucnv_getInvalidChars_3_6
+#define ucnv_getInvalidUChars ucnv_getInvalidUChars_3_6
+#define ucnv_getMaxCharSize ucnv_getMaxCharSize_3_6
+#define ucnv_getMinCharSize ucnv_getMinCharSize_3_6
+#define ucnv_getName ucnv_getName_3_6
+#define ucnv_getNextUChar ucnv_getNextUChar_3_6
+#define ucnv_getNonSurrogateUnicodeSet ucnv_getNonSurrogateUnicodeSet_3_6
+#define ucnv_getPlatform ucnv_getPlatform_3_6
+#define ucnv_getStandard ucnv_getStandard_3_6
+#define ucnv_getStandardName ucnv_getStandardName_3_6
+#define ucnv_getStarters ucnv_getStarters_3_6
+#define ucnv_getSubstChars ucnv_getSubstChars_3_6
+#define ucnv_getToUCallBack ucnv_getToUCallBack_3_6
+#define ucnv_getType ucnv_getType_3_6
+#define ucnv_getUnicodeSet ucnv_getUnicodeSet_3_6
+#define ucnv_incrementRefCount ucnv_incrementRefCount_3_6
+#define ucnv_io_countTotalAliases ucnv_io_countTotalAliases_3_6
+#define ucnv_io_getConverterName ucnv_io_getConverterName_3_6
+#define ucnv_io_stripASCIIForCompare ucnv_io_stripASCIIForCompare_3_6
+#define ucnv_io_stripEBCDICForCompare ucnv_io_stripEBCDICForCompare_3_6
+#define ucnv_isAmbiguous ucnv_isAmbiguous_3_6
+#define ucnv_load ucnv_load_3_6
+#define ucnv_loadSharedData ucnv_loadSharedData_3_6
+#define ucnv_open ucnv_open_3_6
+#define ucnv_openAllNames ucnv_openAllNames_3_6
+#define ucnv_openCCSID ucnv_openCCSID_3_6
+#define ucnv_openPackage ucnv_openPackage_3_6
+#define ucnv_openStandardNames ucnv_openStandardNames_3_6
+#define ucnv_openU ucnv_openU_3_6
+#define ucnv_reset ucnv_reset_3_6
+#define ucnv_resetFromUnicode ucnv_resetFromUnicode_3_6
+#define ucnv_resetToUnicode ucnv_resetToUnicode_3_6
+#define ucnv_safeClone ucnv_safeClone_3_6
+#define ucnv_setDefaultName ucnv_setDefaultName_3_6
+#define ucnv_setFallback ucnv_setFallback_3_6
+#define ucnv_setFromUCallBack ucnv_setFromUCallBack_3_6
+#define ucnv_setSubstChars ucnv_setSubstChars_3_6
+#define ucnv_setSubstString ucnv_setSubstString_3_6
+#define ucnv_setToUCallBack ucnv_setToUCallBack_3_6
+#define ucnv_swap ucnv_swap_3_6
+#define ucnv_swapAliases ucnv_swapAliases_3_6
+#define ucnv_toAlgorithmic ucnv_toAlgorithmic_3_6
+#define ucnv_toUChars ucnv_toUChars_3_6
+#define ucnv_toUCountPending ucnv_toUCountPending_3_6
+#define ucnv_toUWriteCodePoint ucnv_toUWriteCodePoint_3_6
+#define ucnv_toUWriteUChars ucnv_toUWriteUChars_3_6
+#define ucnv_toUnicode ucnv_toUnicode_3_6
+#define ucnv_unload ucnv_unload_3_6
+#define ucnv_unloadSharedDataIfReady ucnv_unloadSharedDataIfReady_3_6
+#define ucnv_usesFallback ucnv_usesFallback_3_6
+#define ucol_allocWeights ucol_allocWeights_3_6
+#define ucol_assembleTailoringTable ucol_assembleTailoringTable_3_6
+#define ucol_calcSortKey ucol_calcSortKey_3_6
+#define ucol_calcSortKeySimpleTertiary ucol_calcSortKeySimpleTertiary_3_6
+#define ucol_cloneBinary ucol_cloneBinary_3_6
+#define ucol_cloneRuleData ucol_cloneRuleData_3_6
+#define ucol_close ucol_close_3_6
+#define ucol_closeElements ucol_closeElements_3_6
+#define ucol_collatorToIdentifier ucol_collatorToIdentifier_3_6
+#define ucol_countAvailable ucol_countAvailable_3_6
+#define ucol_createElements ucol_createElements_3_6
+#define ucol_doCE ucol_doCE_3_6
+#define ucol_equal ucol_equal_3_6
+#define ucol_equals ucol_equals_3_6
+#define ucol_forgetUCA ucol_forgetUCA_3_6
+#define ucol_getAttribute ucol_getAttribute_3_6
+#define ucol_getAttributeOrDefault ucol_getAttributeOrDefault_3_6
+#define ucol_getAvailable ucol_getAvailable_3_6
+#define ucol_getBound ucol_getBound_3_6
+#define ucol_getCEGenerator ucol_getCEGenerator_3_6
+#define ucol_getCEStrengthDifference ucol_getCEStrengthDifference_3_6
+#define ucol_getContractions ucol_getContractions_3_6
+#define ucol_getContractionsAndExpansions ucol_getContractionsAndExpansions_3_6
+#define ucol_getDisplayName ucol_getDisplayName_3_6
+#define ucol_getFirstCE ucol_getFirstCE_3_6
+#define ucol_getFunctionalEquivalent ucol_getFunctionalEquivalent_3_6
+#define ucol_getKeywordValues ucol_getKeywordValues_3_6
+#define ucol_getKeywords ucol_getKeywords_3_6
+#define ucol_getLocale ucol_getLocale_3_6
+#define ucol_getLocaleByType ucol_getLocaleByType_3_6
+#define ucol_getMaxExpansion ucol_getMaxExpansion_3_6
+#define ucol_getNextCE ucol_getNextCE_3_6
+#define ucol_getNextGenerated ucol_getNextGenerated_3_6
+#define ucol_getOffset ucol_getOffset_3_6
+#define ucol_getPrevCE ucol_getPrevCE_3_6
+#define ucol_getRules ucol_getRules_3_6
+#define ucol_getRulesEx ucol_getRulesEx_3_6
+#define ucol_getShortDefinitionString ucol_getShortDefinitionString_3_6
+#define ucol_getSimpleCEGenerator ucol_getSimpleCEGenerator_3_6
+#define ucol_getSortKey ucol_getSortKey_3_6
+#define ucol_getSortKeySize ucol_getSortKeySize_3_6
+#define ucol_getSortKeyWithAllocation ucol_getSortKeyWithAllocation_3_6
+#define ucol_getStrength ucol_getStrength_3_6
+#define ucol_getTailoredSet ucol_getTailoredSet_3_6
+#define ucol_getUCAVersion ucol_getUCAVersion_3_6
+#define ucol_getUnsafeSet ucol_getUnsafeSet_3_6
+#define ucol_getVariableTop ucol_getVariableTop_3_6
+#define ucol_getVersion ucol_getVersion_3_6
+#define ucol_greater ucol_greater_3_6
+#define ucol_greaterOrEqual ucol_greaterOrEqual_3_6
+#define ucol_identifierToShortString ucol_identifierToShortString_3_6
+#define ucol_initBuffers ucol_initBuffers_3_6
+#define ucol_initCollator ucol_initCollator_3_6
+#define ucol_initInverseUCA ucol_initInverseUCA_3_6
+#define ucol_initUCA ucol_initUCA_3_6
+#define ucol_inv_getGapPositions ucol_inv_getGapPositions_3_6
+#define ucol_inv_getNextCE ucol_inv_getNextCE_3_6
+#define ucol_inv_getPrevCE ucol_inv_getPrevCE_3_6
+#define ucol_isTailored ucol_isTailored_3_6
+#define ucol_keyHashCode ucol_keyHashCode_3_6
+#define ucol_mergeSortkeys ucol_mergeSortkeys_3_6
+#define ucol_next ucol_next_3_6
+#define ucol_nextSortKeyPart ucol_nextSortKeyPart_3_6
+#define ucol_nextWeight ucol_nextWeight_3_6
+#define ucol_normalizeShortDefinitionString ucol_normalizeShortDefinitionString_3_6
+#define ucol_open ucol_open_3_6
+#define ucol_openAvailableLocales ucol_openAvailableLocales_3_6
+#define ucol_openBinary ucol_openBinary_3_6
+#define ucol_openElements ucol_openElements_3_6
+#define ucol_openFromIdentifier ucol_openFromIdentifier_3_6
+#define ucol_openFromShortString ucol_openFromShortString_3_6
+#define ucol_openRules ucol_openRules_3_6
+#define ucol_open_internal ucol_open_internal_3_6
+#define ucol_prepareShortStringOpen ucol_prepareShortStringOpen_3_6
+#define ucol_previous ucol_previous_3_6
+#define ucol_primaryOrder ucol_primaryOrder_3_6
+#define ucol_prv_getSpecialCE ucol_prv_getSpecialCE_3_6
+#define ucol_prv_getSpecialPrevCE ucol_prv_getSpecialPrevCE_3_6
+#define ucol_reset ucol_reset_3_6
+#define ucol_restoreVariableTop ucol_restoreVariableTop_3_6
+#define ucol_safeClone ucol_safeClone_3_6
+#define ucol_secondaryOrder ucol_secondaryOrder_3_6
+#define ucol_setAttribute ucol_setAttribute_3_6
+#define ucol_setOffset ucol_setOffset_3_6
+#define ucol_setOptionsFromHeader ucol_setOptionsFromHeader_3_6
+#define ucol_setReqValidLocales ucol_setReqValidLocales_3_6
+#define ucol_setStrength ucol_setStrength_3_6
+#define ucol_setText ucol_setText_3_6
+#define ucol_setVariableTop ucol_setVariableTop_3_6
+#define ucol_shortStringToIdentifier ucol_shortStringToIdentifier_3_6
+#define ucol_strcoll ucol_strcoll_3_6
+#define ucol_strcollIter ucol_strcollIter_3_6
+#define ucol_swap ucol_swap_3_6
+#define ucol_swapBinary ucol_swapBinary_3_6
+#define ucol_swapInverseUCA ucol_swapInverseUCA_3_6
+#define ucol_tertiaryOrder ucol_tertiaryOrder_3_6
+#define ucol_tok_assembleTokenList ucol_tok_assembleTokenList_3_6
+#define ucol_tok_closeTokenList ucol_tok_closeTokenList_3_6
+#define ucol_tok_getNextArgument ucol_tok_getNextArgument_3_6
+#define ucol_tok_initTokenList ucol_tok_initTokenList_3_6
+#define ucol_tok_parseNextToken ucol_tok_parseNextToken_3_6
+#define ucol_updateInternalState ucol_updateInternalState_3_6
+#define ucsdet_close ucsdet_close_3_6
+#define ucsdet_detect ucsdet_detect_3_6
+#define ucsdet_detectAll ucsdet_detectAll_3_6
+#define ucsdet_enableInputFilter ucsdet_enableInputFilter_3_6
+#define ucsdet_getAllDetectableCharsets ucsdet_getAllDetectableCharsets_3_6
+#define ucsdet_getConfidence ucsdet_getConfidence_3_6
+#define ucsdet_getLanguage ucsdet_getLanguage_3_6
+#define ucsdet_getName ucsdet_getName_3_6
+#define ucsdet_getUChars ucsdet_getUChars_3_6
+#define ucsdet_isInputFilterEnabled ucsdet_isInputFilterEnabled_3_6
+#define ucsdet_open ucsdet_open_3_6
+#define ucsdet_setDeclaredEncoding ucsdet_setDeclaredEncoding_3_6
+#define ucsdet_setText ucsdet_setText_3_6
+#define ucurr_forLocale ucurr_forLocale_3_6
+#define ucurr_getDefaultFractionDigits ucurr_getDefaultFractionDigits_3_6
+#define ucurr_getName ucurr_getName_3_6
+#define ucurr_getRoundingIncrement ucurr_getRoundingIncrement_3_6
+#define ucurr_openISOCurrencies ucurr_openISOCurrencies_3_6
+#define ucurr_register ucurr_register_3_6
+#define ucurr_unregister ucurr_unregister_3_6
+#define udat_applyPattern udat_applyPattern_3_6
+#define udat_clone udat_clone_3_6
+#define udat_close udat_close_3_6
+#define udat_countAvailable udat_countAvailable_3_6
+#define udat_countSymbols udat_countSymbols_3_6
+#define udat_format udat_format_3_6
+#define udat_get2DigitYearStart udat_get2DigitYearStart_3_6
+#define udat_getAvailable udat_getAvailable_3_6
+#define udat_getCalendar udat_getCalendar_3_6
+#define udat_getLocaleByType udat_getLocaleByType_3_6
+#define udat_getNumberFormat udat_getNumberFormat_3_6
+#define udat_getSymbols udat_getSymbols_3_6
+#define udat_isLenient udat_isLenient_3_6
+#define udat_open udat_open_3_6
+#define udat_parse udat_parse_3_6
+#define udat_parseCalendar udat_parseCalendar_3_6
+#define udat_set2DigitYearStart udat_set2DigitYearStart_3_6
+#define udat_setCalendar udat_setCalendar_3_6
+#define udat_setLenient udat_setLenient_3_6
+#define udat_setNumberFormat udat_setNumberFormat_3_6
+#define udat_setSymbols udat_setSymbols_3_6
+#define udat_toPattern udat_toPattern_3_6
+#define udata_checkCommonData udata_checkCommonData_3_6
+#define udata_close udata_close_3_6
+#define udata_closeSwapper udata_closeSwapper_3_6
+#define udata_getHeaderSize udata_getHeaderSize_3_6
+#define udata_getInfo udata_getInfo_3_6
+#define udata_getInfoSize udata_getInfoSize_3_6
+#define udata_getLength udata_getLength_3_6
+#define udata_getMemory udata_getMemory_3_6
+#define udata_getRawMemory udata_getRawMemory_3_6
+#define udata_open udata_open_3_6
+#define udata_openChoice udata_openChoice_3_6
+#define udata_openSwapper udata_openSwapper_3_6
+#define udata_openSwapperForInputData udata_openSwapperForInputData_3_6
+#define udata_printError udata_printError_3_6
+#define udata_readInt16 udata_readInt16_3_6
+#define udata_readInt32 udata_readInt32_3_6
+#define udata_setAppData udata_setAppData_3_6
+#define udata_setCommonData udata_setCommonData_3_6
+#define udata_setFileAccess udata_setFileAccess_3_6
+#define udata_swapDataHeader udata_swapDataHeader_3_6
+#define udata_swapInvStringBlock udata_swapInvStringBlock_3_6
+#define uenum_close uenum_close_3_6
+#define uenum_count uenum_count_3_6
+#define uenum_next uenum_next_3_6
+#define uenum_nextDefault uenum_nextDefault_3_6
+#define uenum_openCharStringsEnumeration uenum_openCharStringsEnumeration_3_6
+#define uenum_openStringEnumeration uenum_openStringEnumeration_3_6
+#define uenum_reset uenum_reset_3_6
+#define uenum_unext uenum_unext_3_6
+#define uenum_unextDefault uenum_unextDefault_3_6
+#define ufile_close_translit ufile_close_translit_3_6
+#define ufile_fill_uchar_buffer ufile_fill_uchar_buffer_3_6
+#define ufile_flush_translit ufile_flush_translit_3_6
+#define ufile_getch ufile_getch_3_6
+#define ufile_getch32 ufile_getch32_3_6
+#define ufmt_64tou ufmt_64tou_3_6
+#define ufmt_defaultCPToUnicode ufmt_defaultCPToUnicode_3_6
+#define ufmt_digitvalue ufmt_digitvalue_3_6
+#define ufmt_isdigit ufmt_isdigit_3_6
+#define ufmt_ptou ufmt_ptou_3_6
+#define ufmt_uto64 ufmt_uto64_3_6
+#define ufmt_utop ufmt_utop_3_6
+#define uhash_close uhash_close_3_6
+#define uhash_compareCaselessUnicodeString uhash_compareCaselessUnicodeString_3_6
+#define uhash_compareChars uhash_compareChars_3_6
+#define uhash_compareIChars uhash_compareIChars_3_6
+#define uhash_compareLong uhash_compareLong_3_6
+#define uhash_compareUChars uhash_compareUChars_3_6
+#define uhash_compareUnicodeString uhash_compareUnicodeString_3_6
+#define uhash_count uhash_count_3_6
+#define uhash_deleteHashtable uhash_deleteHashtable_3_6
+#define uhash_deleteUVector uhash_deleteUVector_3_6
+#define uhash_deleteUnicodeString uhash_deleteUnicodeString_3_6
+#define uhash_equals uhash_equals_3_6
+#define uhash_find uhash_find_3_6
+#define uhash_freeBlock uhash_freeBlock_3_6
+#define uhash_get uhash_get_3_6
+#define uhash_geti uhash_geti_3_6
+#define uhash_hashCaselessUnicodeString uhash_hashCaselessUnicodeString_3_6
+#define uhash_hashChars uhash_hashChars_3_6
+#define uhash_hashIChars uhash_hashIChars_3_6
+#define uhash_hashLong uhash_hashLong_3_6
+#define uhash_hashUChars uhash_hashUChars_3_6
+#define uhash_hashUCharsN uhash_hashUCharsN_3_6
+#define uhash_hashUnicodeString uhash_hashUnicodeString_3_6
+#define uhash_iget uhash_iget_3_6
+#define uhash_igeti uhash_igeti_3_6
+#define uhash_init uhash_init_3_6
+#define uhash_iput uhash_iput_3_6
+#define uhash_iputi uhash_iputi_3_6
+#define uhash_iremove uhash_iremove_3_6
+#define uhash_iremovei uhash_iremovei_3_6
+#define uhash_nextElement uhash_nextElement_3_6
+#define uhash_open uhash_open_3_6
+#define uhash_openSize uhash_openSize_3_6
+#define uhash_put uhash_put_3_6
+#define uhash_puti uhash_puti_3_6
+#define uhash_remove uhash_remove_3_6
+#define uhash_removeAll uhash_removeAll_3_6
+#define uhash_removeElement uhash_removeElement_3_6
+#define uhash_removei uhash_removei_3_6
+#define uhash_setKeyComparator uhash_setKeyComparator_3_6
+#define uhash_setKeyDeleter uhash_setKeyDeleter_3_6
+#define uhash_setKeyHasher uhash_setKeyHasher_3_6
+#define uhash_setResizePolicy uhash_setResizePolicy_3_6
+#define uhash_setValueComparator uhash_setValueComparator_3_6
+#define uhash_setValueDeleter uhash_setValueDeleter_3_6
+#define uhst_addPropertyStarts uhst_addPropertyStarts_3_6
+#define uidna_IDNToASCII uidna_IDNToASCII_3_6
+#define uidna_IDNToUnicode uidna_IDNToUnicode_3_6
+#define uidna_compare uidna_compare_3_6
+#define uidna_toASCII uidna_toASCII_3_6
+#define uidna_toUnicode uidna_toUnicode_3_6
+#define uiter_current32 uiter_current32_3_6
+#define uiter_getState uiter_getState_3_6
+#define uiter_next32 uiter_next32_3_6
+#define uiter_previous32 uiter_previous32_3_6
+#define uiter_setCharacterIterator uiter_setCharacterIterator_3_6
+#define uiter_setReplaceable uiter_setReplaceable_3_6
+#define uiter_setState uiter_setState_3_6
+#define uiter_setString uiter_setString_3_6
+#define uiter_setUTF16BE uiter_setUTF16BE_3_6
+#define uiter_setUTF8 uiter_setUTF8_3_6
+#define uloc_acceptLanguage uloc_acceptLanguage_3_6
+#define uloc_acceptLanguageFromHTTP uloc_acceptLanguageFromHTTP_3_6
+#define uloc_canonicalize uloc_canonicalize_3_6
+#define uloc_countAvailable uloc_countAvailable_3_6
+#define uloc_getAvailable uloc_getAvailable_3_6
+#define uloc_getBaseName uloc_getBaseName_3_6
+#define uloc_getCountry uloc_getCountry_3_6
+#define uloc_getDefault uloc_getDefault_3_6
+#define uloc_getDisplayCountry uloc_getDisplayCountry_3_6
+#define uloc_getDisplayKeyword uloc_getDisplayKeyword_3_6
+#define uloc_getDisplayKeywordValue uloc_getDisplayKeywordValue_3_6
+#define uloc_getDisplayLanguage uloc_getDisplayLanguage_3_6
+#define uloc_getDisplayName uloc_getDisplayName_3_6
+#define uloc_getDisplayScript uloc_getDisplayScript_3_6
+#define uloc_getDisplayVariant uloc_getDisplayVariant_3_6
+#define uloc_getISO3Country uloc_getISO3Country_3_6
+#define uloc_getISO3Language uloc_getISO3Language_3_6
+#define uloc_getISOCountries uloc_getISOCountries_3_6
+#define uloc_getISOLanguages uloc_getISOLanguages_3_6
+#define uloc_getKeywordValue uloc_getKeywordValue_3_6
+#define uloc_getLCID uloc_getLCID_3_6
+#define uloc_getLanguage uloc_getLanguage_3_6
+#define uloc_getLocaleForLCID uloc_getLocaleForLCID_3_6
+#define uloc_getName uloc_getName_3_6
+#define uloc_getParent uloc_getParent_3_6
+#define uloc_getScript uloc_getScript_3_6
+#define uloc_getVariant uloc_getVariant_3_6
+#define uloc_openKeywordList uloc_openKeywordList_3_6
+#define uloc_openKeywords uloc_openKeywords_3_6
+#define uloc_setDefault uloc_setDefault_3_6
+#define uloc_setKeywordValue uloc_setKeywordValue_3_6
+#define ulocdata_close ulocdata_close_3_6
+#define ulocdata_getDelimiter ulocdata_getDelimiter_3_6
+#define ulocdata_getExemplarSet ulocdata_getExemplarSet_3_6
+#define ulocdata_getMeasurementSystem ulocdata_getMeasurementSystem_3_6
+#define ulocdata_getNoSubstitute ulocdata_getNoSubstitute_3_6
+#define ulocdata_getPaperSize ulocdata_getPaperSize_3_6
+#define ulocdata_open ulocdata_open_3_6
+#define ulocdata_setNoSubstitute ulocdata_setNoSubstitute_3_6
+#define umsg_applyPattern umsg_applyPattern_3_6
+#define umsg_autoQuoteApostrophe umsg_autoQuoteApostrophe_3_6
+#define umsg_clone umsg_clone_3_6
+#define umsg_close umsg_close_3_6
+#define umsg_format umsg_format_3_6
+#define umsg_getLocale umsg_getLocale_3_6
+#define umsg_open umsg_open_3_6
+#define umsg_parse umsg_parse_3_6
+#define umsg_setLocale umsg_setLocale_3_6
+#define umsg_toPattern umsg_toPattern_3_6
+#define umsg_vformat umsg_vformat_3_6
+#define umsg_vparse umsg_vparse_3_6
+#define umtx_atomic_dec umtx_atomic_dec_3_6
+#define umtx_atomic_inc umtx_atomic_inc_3_6
+#define umtx_cleanup umtx_cleanup_3_6
+#define umtx_destroy umtx_destroy_3_6
+#define umtx_init umtx_init_3_6
+#define umtx_lock umtx_lock_3_6
+#define umtx_unlock umtx_unlock_3_6
+#define unorm_addPropertyStarts unorm_addPropertyStarts_3_6
+#define unorm_closeIter unorm_closeIter_3_6
+#define unorm_compare unorm_compare_3_6
+#define unorm_compose unorm_compose_3_6
+#define unorm_concatenate unorm_concatenate_3_6
+#define unorm_decompose unorm_decompose_3_6
+#define unorm_getCanonStartSet unorm_getCanonStartSet_3_6
+#define unorm_getCanonicalDecomposition unorm_getCanonicalDecomposition_3_6
+#define unorm_getDecomposition unorm_getDecomposition_3_6
+#define unorm_getFCD16FromCodePoint unorm_getFCD16FromCodePoint_3_6
+#define unorm_getFCDTrie unorm_getFCDTrie_3_6
+#define unorm_getNX unorm_getNX_3_6
+#define unorm_getQuickCheck unorm_getQuickCheck_3_6
+#define unorm_getUnicodeVersion unorm_getUnicodeVersion_3_6
+#define unorm_haveData unorm_haveData_3_6
+#define unorm_internalIsFullCompositionExclusion unorm_internalIsFullCompositionExclusion_3_6
+#define unorm_internalNormalize unorm_internalNormalize_3_6
+#define unorm_internalNormalizeWithNX unorm_internalNormalizeWithNX_3_6
+#define unorm_internalQuickCheck unorm_internalQuickCheck_3_6
+#define unorm_isCanonSafeStart unorm_isCanonSafeStart_3_6
+#define unorm_isNFSkippable unorm_isNFSkippable_3_6
+#define unorm_isNormalized unorm_isNormalized_3_6
+#define unorm_isNormalizedWithOptions unorm_isNormalizedWithOptions_3_6
+#define unorm_next unorm_next_3_6
+#define unorm_normalize unorm_normalize_3_6
+#define unorm_openIter unorm_openIter_3_6
+#define unorm_previous unorm_previous_3_6
+#define unorm_quickCheck unorm_quickCheck_3_6
+#define unorm_quickCheckWithOptions unorm_quickCheckWithOptions_3_6
+#define unorm_setIter unorm_setIter_3_6
+#define unum_applyPattern unum_applyPattern_3_6
+#define unum_clone unum_clone_3_6
+#define unum_close unum_close_3_6
+#define unum_countAvailable unum_countAvailable_3_6
+#define unum_format unum_format_3_6
+#define unum_formatDouble unum_formatDouble_3_6
+#define unum_formatDoubleCurrency unum_formatDoubleCurrency_3_6
+#define unum_formatInt64 unum_formatInt64_3_6
+#define unum_getAttribute unum_getAttribute_3_6
+#define unum_getAvailable unum_getAvailable_3_6
+#define unum_getDoubleAttribute unum_getDoubleAttribute_3_6
+#define unum_getLocaleByType unum_getLocaleByType_3_6
+#define unum_getSymbol unum_getSymbol_3_6
+#define unum_getTextAttribute unum_getTextAttribute_3_6
+#define unum_open unum_open_3_6
+#define unum_parse unum_parse_3_6
+#define unum_parseDouble unum_parseDouble_3_6
+#define unum_parseDoubleCurrency unum_parseDoubleCurrency_3_6
+#define unum_parseInt64 unum_parseInt64_3_6
+#define unum_setAttribute unum_setAttribute_3_6
+#define unum_setDoubleAttribute unum_setDoubleAttribute_3_6
+#define unum_setSymbol unum_setSymbol_3_6
+#define unum_setTextAttribute unum_setTextAttribute_3_6
+#define unum_toPattern unum_toPattern_3_6
+#define upname_swap upname_swap_3_6
+#define uprops_getSource uprops_getSource_3_6
+#define upropsvec_addPropertyStarts upropsvec_addPropertyStarts_3_6
+#define uprv_asciiFromEbcdic uprv_asciiFromEbcdic_3_6
+#define uprv_asciitolower uprv_asciitolower_3_6
+#define uprv_ceil uprv_ceil_3_6
+#define uprv_cnttab_addContraction uprv_cnttab_addContraction_3_6
+#define uprv_cnttab_changeContraction uprv_cnttab_changeContraction_3_6
+#define uprv_cnttab_changeLastCE uprv_cnttab_changeLastCE_3_6
+#define uprv_cnttab_clone uprv_cnttab_clone_3_6
+#define uprv_cnttab_close uprv_cnttab_close_3_6
+#define uprv_cnttab_constructTable uprv_cnttab_constructTable_3_6
+#define uprv_cnttab_findCE uprv_cnttab_findCE_3_6
+#define uprv_cnttab_findCP uprv_cnttab_findCP_3_6
+#define uprv_cnttab_getCE uprv_cnttab_getCE_3_6
+#define uprv_cnttab_insertContraction uprv_cnttab_insertContraction_3_6
+#define uprv_cnttab_isTailored uprv_cnttab_isTailored_3_6
+#define uprv_cnttab_open uprv_cnttab_open_3_6
+#define uprv_cnttab_setContraction uprv_cnttab_setContraction_3_6
+#define uprv_compareASCIIPropertyNames uprv_compareASCIIPropertyNames_3_6
+#define uprv_compareEBCDICPropertyNames uprv_compareEBCDICPropertyNames_3_6
+#define uprv_compareInvAscii uprv_compareInvAscii_3_6
+#define uprv_compareInvEbcdic uprv_compareInvEbcdic_3_6
+#define uprv_convertToLCID uprv_convertToLCID_3_6
+#define uprv_convertToPosix uprv_convertToPosix_3_6
+#define uprv_copyAscii uprv_copyAscii_3_6
+#define uprv_copyEbcdic uprv_copyEbcdic_3_6
+#define uprv_ebcdicFromAscii uprv_ebcdicFromAscii_3_6
+#define uprv_ebcdictolower uprv_ebcdictolower_3_6
+#define uprv_fabs uprv_fabs_3_6
+#define uprv_floor uprv_floor_3_6
+#define uprv_fmax uprv_fmax_3_6
+#define uprv_fmin uprv_fmin_3_6
+#define uprv_fmod uprv_fmod_3_6
+#define uprv_free uprv_free_3_6
+#define uprv_getCharNameCharacters uprv_getCharNameCharacters_3_6
+#define uprv_getDefaultCodepage uprv_getDefaultCodepage_3_6
+#define uprv_getDefaultLocaleID uprv_getDefaultLocaleID_3_6
+#define uprv_getInfinity uprv_getInfinity_3_6
+#define uprv_getMaxCharNameLength uprv_getMaxCharNameLength_3_6
+#define uprv_getMaxValues uprv_getMaxValues_3_6
+#define uprv_getNaN uprv_getNaN_3_6
+#define uprv_getStaticCurrencyName uprv_getStaticCurrencyName_3_6
+#define uprv_getUTCtime uprv_getUTCtime_3_6
+#define uprv_haveProperties uprv_haveProperties_3_6
+#define uprv_init_collIterate uprv_init_collIterate_3_6
+#define uprv_int32Comparator uprv_int32Comparator_3_6
+#define uprv_isInfinite uprv_isInfinite_3_6
+#define uprv_isInvariantString uprv_isInvariantString_3_6
+#define uprv_isInvariantUString uprv_isInvariantUString_3_6
+#define uprv_isNaN uprv_isNaN_3_6
+#define uprv_isNegativeInfinity uprv_isNegativeInfinity_3_6
+#define uprv_isPositiveInfinity uprv_isPositiveInfinity_3_6
+#define uprv_isRuleWhiteSpace uprv_isRuleWhiteSpace_3_6
+#define uprv_itou uprv_itou_3_6
+#define uprv_log uprv_log_3_6
+#define uprv_malloc uprv_malloc_3_6
+#define uprv_mapFile uprv_mapFile_3_6
+#define uprv_max uprv_max_3_6
+#define uprv_maxMantissa uprv_maxMantissa_3_6
+#define uprv_min uprv_min_3_6
+#define uprv_modf uprv_modf_3_6
+#define uprv_openRuleWhiteSpaceSet uprv_openRuleWhiteSpaceSet_3_6
+#define uprv_parseCurrency uprv_parseCurrency_3_6
+#define uprv_pathIsAbsolute uprv_pathIsAbsolute_3_6
+#define uprv_pow uprv_pow_3_6
+#define uprv_pow10 uprv_pow10_3_6
+#define uprv_realloc uprv_realloc_3_6
+#define uprv_round uprv_round_3_6
+#define uprv_sortArray uprv_sortArray_3_6
+#define uprv_strCompare uprv_strCompare_3_6
+#define uprv_strdup uprv_strdup_3_6
+#define uprv_strndup uprv_strndup_3_6
+#define uprv_syntaxError uprv_syntaxError_3_6
+#define uprv_timezone uprv_timezone_3_6
+#define uprv_toupper uprv_toupper_3_6
+#define uprv_trunc uprv_trunc_3_6
+#define uprv_tzname uprv_tzname_3_6
+#define uprv_tzset uprv_tzset_3_6
+#define uprv_uca_addAnElement uprv_uca_addAnElement_3_6
+#define uprv_uca_assembleTable uprv_uca_assembleTable_3_6
+#define uprv_uca_canonicalClosure uprv_uca_canonicalClosure_3_6
+#define uprv_uca_cloneTempTable uprv_uca_cloneTempTable_3_6
+#define uprv_uca_closeTempTable uprv_uca_closeTempTable_3_6
+#define uprv_uca_getCodePointFromRaw uprv_uca_getCodePointFromRaw_3_6
+#define uprv_uca_getImplicitFromRaw uprv_uca_getImplicitFromRaw_3_6
+#define uprv_uca_getImplicitPrimary uprv_uca_getImplicitPrimary_3_6
+#define uprv_uca_getRawFromCodePoint uprv_uca_getRawFromCodePoint_3_6
+#define uprv_uca_getRawFromImplicit uprv_uca_getRawFromImplicit_3_6
+#define uprv_uca_initImplicitConstants uprv_uca_initImplicitConstants_3_6
+#define uprv_uca_initTempTable uprv_uca_initTempTable_3_6
+#define uprv_uint16Comparator uprv_uint16Comparator_3_6
+#define uprv_uint32Comparator uprv_uint32Comparator_3_6
+#define uprv_unmapFile uprv_unmapFile_3_6
+#define uregex_appendReplacement uregex_appendReplacement_3_6
+#define uregex_appendTail uregex_appendTail_3_6
+#define uregex_clone uregex_clone_3_6
+#define uregex_close uregex_close_3_6
+#define uregex_end uregex_end_3_6
+#define uregex_find uregex_find_3_6
+#define uregex_findNext uregex_findNext_3_6
+#define uregex_flags uregex_flags_3_6
+#define uregex_getText uregex_getText_3_6
+#define uregex_group uregex_group_3_6
+#define uregex_groupCount uregex_groupCount_3_6
+#define uregex_lookingAt uregex_lookingAt_3_6
+#define uregex_matches uregex_matches_3_6
+#define uregex_open uregex_open_3_6
+#define uregex_openC uregex_openC_3_6
+#define uregex_pattern uregex_pattern_3_6
+#define uregex_replaceAll uregex_replaceAll_3_6
+#define uregex_replaceFirst uregex_replaceFirst_3_6
+#define uregex_reset uregex_reset_3_6
+#define uregex_setText uregex_setText_3_6
+#define uregex_split uregex_split_3_6
+#define uregex_start uregex_start_3_6
+#define ures_clone ures_clone_3_6
+#define ures_close ures_close_3_6
+#define ures_copyResb ures_copyResb_3_6
+#define ures_countArrayItems ures_countArrayItems_3_6
+#define ures_equal ures_equal_3_6
+#define ures_findResource ures_findResource_3_6
+#define ures_findSubResource ures_findSubResource_3_6
+#define ures_getBinary ures_getBinary_3_6
+#define ures_getByIndex ures_getByIndex_3_6
+#define ures_getByKey ures_getByKey_3_6
+#define ures_getByKeyWithFallback ures_getByKeyWithFallback_3_6
+#define ures_getFunctionalEquivalent ures_getFunctionalEquivalent_3_6
+#define ures_getInt ures_getInt_3_6
+#define ures_getIntVector ures_getIntVector_3_6
+#define ures_getKey ures_getKey_3_6
+#define ures_getKeywordValues ures_getKeywordValues_3_6
+#define ures_getLocale ures_getLocale_3_6
+#define ures_getLocaleByType ures_getLocaleByType_3_6
+#define ures_getName ures_getName_3_6
+#define ures_getNextResource ures_getNextResource_3_6
+#define ures_getNextString ures_getNextString_3_6
+#define ures_getParentBundle ures_getParentBundle_3_6
+#define ures_getPath ures_getPath_3_6
+#define ures_getSize ures_getSize_3_6
+#define ures_getString ures_getString_3_6
+#define ures_getStringByIndex ures_getStringByIndex_3_6
+#define ures_getStringByKey ures_getStringByKey_3_6
+#define ures_getStringByKeyWithFallback ures_getStringByKeyWithFallback_3_6
+#define ures_getType ures_getType_3_6
+#define ures_getUInt ures_getUInt_3_6
+#define ures_getUTF8String ures_getUTF8String_3_6
+#define ures_getUTF8StringByIndex ures_getUTF8StringByIndex_3_6
+#define ures_getUTF8StringByKey ures_getUTF8StringByKey_3_6
+#define ures_getVersion ures_getVersion_3_6
+#define ures_getVersionNumber ures_getVersionNumber_3_6
+#define ures_hasNext ures_hasNext_3_6
+#define ures_initStackObject ures_initStackObject_3_6
+#define ures_open ures_open_3_6
+#define ures_openAvailableLocales ures_openAvailableLocales_3_6
+#define ures_openDirect ures_openDirect_3_6
+#define ures_openFillIn ures_openFillIn_3_6
+#define ures_openU ures_openU_3_6
+#define ures_resetIterator ures_resetIterator_3_6
+#define ures_swap ures_swap_3_6
+#define uscript_closeRun uscript_closeRun_3_6
+#define uscript_getCode uscript_getCode_3_6
+#define uscript_getName uscript_getName_3_6
+#define uscript_getScript uscript_getScript_3_6
+#define uscript_getShortName uscript_getShortName_3_6
+#define uscript_nextRun uscript_nextRun_3_6
+#define uscript_openRun uscript_openRun_3_6
+#define uscript_resetRun uscript_resetRun_3_6
+#define uscript_setRunText uscript_setRunText_3_6
+#define usearch_close usearch_close_3_6
+#define usearch_first usearch_first_3_6
+#define usearch_following usearch_following_3_6
+#define usearch_getAttribute usearch_getAttribute_3_6
+#define usearch_getBreakIterator usearch_getBreakIterator_3_6
+#define usearch_getCollator usearch_getCollator_3_6
+#define usearch_getMatchedLength usearch_getMatchedLength_3_6
+#define usearch_getMatchedStart usearch_getMatchedStart_3_6
+#define usearch_getMatchedText usearch_getMatchedText_3_6
+#define usearch_getOffset usearch_getOffset_3_6
+#define usearch_getPattern usearch_getPattern_3_6
+#define usearch_getText usearch_getText_3_6
+#define usearch_handleNextCanonical usearch_handleNextCanonical_3_6
+#define usearch_handleNextExact usearch_handleNextExact_3_6
+#define usearch_handlePreviousCanonical usearch_handlePreviousCanonical_3_6
+#define usearch_handlePreviousExact usearch_handlePreviousExact_3_6
+#define usearch_last usearch_last_3_6
+#define usearch_next usearch_next_3_6
+#define usearch_open usearch_open_3_6
+#define usearch_openFromCollator usearch_openFromCollator_3_6
+#define usearch_preceding usearch_preceding_3_6
+#define usearch_previous usearch_previous_3_6
+#define usearch_reset usearch_reset_3_6
+#define usearch_setAttribute usearch_setAttribute_3_6
+#define usearch_setBreakIterator usearch_setBreakIterator_3_6
+#define usearch_setCollator usearch_setCollator_3_6
+#define usearch_setOffset usearch_setOffset_3_6
+#define usearch_setPattern usearch_setPattern_3_6
+#define usearch_setText usearch_setText_3_6
+#define userv_deleteStringPair userv_deleteStringPair_3_6
+#define uset_add uset_add_3_6
+#define uset_addAll uset_addAll_3_6
+#define uset_addAllCodePoints uset_addAllCodePoints_3_6
+#define uset_addRange uset_addRange_3_6
+#define uset_addString uset_addString_3_6
+#define uset_applyIntPropertyValue uset_applyIntPropertyValue_3_6
+#define uset_applyPattern uset_applyPattern_3_6
+#define uset_applyPropertyAlias uset_applyPropertyAlias_3_6
+#define uset_charAt uset_charAt_3_6
+#define uset_clear uset_clear_3_6
+#define uset_close uset_close_3_6
+#define uset_compact uset_compact_3_6
+#define uset_complement uset_complement_3_6
+#define uset_complementAll uset_complementAll_3_6
+#define uset_contains uset_contains_3_6
+#define uset_containsAll uset_containsAll_3_6
+#define uset_containsAllCodePoints uset_containsAllCodePoints_3_6
+#define uset_containsNone uset_containsNone_3_6
+#define uset_containsRange uset_containsRange_3_6
+#define uset_containsSome uset_containsSome_3_6
+#define uset_containsString uset_containsString_3_6
+#define uset_equals uset_equals_3_6
+#define uset_getItem uset_getItem_3_6
+#define uset_getItemCount uset_getItemCount_3_6
+#define uset_getSerializedRange uset_getSerializedRange_3_6
+#define uset_getSerializedRangeCount uset_getSerializedRangeCount_3_6
+#define uset_getSerializedSet uset_getSerializedSet_3_6
+#define uset_indexOf uset_indexOf_3_6
+#define uset_isEmpty uset_isEmpty_3_6
+#define uset_open uset_open_3_6
+#define uset_openPattern uset_openPattern_3_6
+#define uset_openPatternOptions uset_openPatternOptions_3_6
+#define uset_remove uset_remove_3_6
+#define uset_removeAll uset_removeAll_3_6
+#define uset_removeRange uset_removeRange_3_6
+#define uset_removeString uset_removeString_3_6
+#define uset_resemblesPattern uset_resemblesPattern_3_6
+#define uset_retain uset_retain_3_6
+#define uset_retainAll uset_retainAll_3_6
+#define uset_serialize uset_serialize_3_6
+#define uset_serializedContains uset_serializedContains_3_6
+#define uset_set uset_set_3_6
+#define uset_setSerializedToOne uset_setSerializedToOne_3_6
+#define uset_size uset_size_3_6
+#define uset_toPattern uset_toPattern_3_6
+#define usprep_close usprep_close_3_6
+#define usprep_open usprep_open_3_6
+#define usprep_prepare usprep_prepare_3_6
+#define usprep_swap usprep_swap_3_6
+#define ustr_foldCase ustr_foldCase_3_6
+#define ustr_toLower ustr_toLower_3_6
+#define ustr_toTitle ustr_toTitle_3_6
+#define ustr_toUpper ustr_toUpper_3_6
+#define utext_char32At utext_char32At_3_6
+#define utext_clone utext_clone_3_6
+#define utext_close utext_close_3_6
+#define utext_copy utext_copy_3_6
+#define utext_current32 utext_current32_3_6
+#define utext_equals utext_equals_3_6
+#define utext_extract utext_extract_3_6
+#define utext_freeze utext_freeze_3_6
+#define utext_getNativeIndex utext_getNativeIndex_3_6
+#define utext_getPreviousNativeIndex utext_getPreviousNativeIndex_3_6
+#define utext_hasMetaData utext_hasMetaData_3_6
+#define utext_isLengthExpensive utext_isLengthExpensive_3_6
+#define utext_isWritable utext_isWritable_3_6
+#define utext_moveIndex32 utext_moveIndex32_3_6
+#define utext_nativeLength utext_nativeLength_3_6
+#define utext_next32 utext_next32_3_6
+#define utext_next32From utext_next32From_3_6
+#define utext_openCharacterIterator utext_openCharacterIterator_3_6
+#define utext_openConstUnicodeString utext_openConstUnicodeString_3_6
+#define utext_openReplaceable utext_openReplaceable_3_6
+#define utext_openUChars utext_openUChars_3_6
+#define utext_openUTF8 utext_openUTF8_3_6
+#define utext_openUnicodeString utext_openUnicodeString_3_6
+#define utext_previous32 utext_previous32_3_6
+#define utext_previous32From utext_previous32From_3_6
+#define utext_replace utext_replace_3_6
+#define utext_setNativeIndex utext_setNativeIndex_3_6
+#define utext_setup utext_setup_3_6
+#define utf8_appendCharSafeBody utf8_appendCharSafeBody_3_6
+#define utf8_back1SafeBody utf8_back1SafeBody_3_6
+#define utf8_countTrailBytes utf8_countTrailBytes_3_6
+#define utf8_nextCharSafeBody utf8_nextCharSafeBody_3_6
+#define utf8_prevCharSafeBody utf8_prevCharSafeBody_3_6
+#define utmscale_fromInt64 utmscale_fromInt64_3_6
+#define utmscale_getTimeScaleValue utmscale_getTimeScaleValue_3_6
+#define utmscale_toInt64 utmscale_toInt64_3_6
+#define utrace_cleanup utrace_cleanup_3_6
+#define utrace_data utrace_data_3_6
+#define utrace_entry utrace_entry_3_6
+#define utrace_exit utrace_exit_3_6
+#define utrace_format utrace_format_3_6
+#define utrace_functionName utrace_functionName_3_6
+#define utrace_getFunctions utrace_getFunctions_3_6
+#define utrace_getLevel utrace_getLevel_3_6
+#define utrace_level utrace_level_3_6
+#define utrace_setFunctions utrace_setFunctions_3_6
+#define utrace_setLevel utrace_setLevel_3_6
+#define utrace_vformat utrace_vformat_3_6
+#define utrans_clone utrans_clone_3_6
+#define utrans_close utrans_close_3_6
+#define utrans_countAvailableIDs utrans_countAvailableIDs_3_6
+#define utrans_getAvailableID utrans_getAvailableID_3_6
+#define utrans_getID utrans_getID_3_6
+#define utrans_getUnicodeID utrans_getUnicodeID_3_6
+#define utrans_open utrans_open_3_6
+#define utrans_openIDs utrans_openIDs_3_6
+#define utrans_openInverse utrans_openInverse_3_6
+#define utrans_openU utrans_openU_3_6
+#define utrans_register utrans_register_3_6
+#define utrans_rep_caseContextIterator utrans_rep_caseContextIterator_3_6
+#define utrans_setFilter utrans_setFilter_3_6
+#define utrans_stripRules utrans_stripRules_3_6
+#define utrans_trans utrans_trans_3_6
+#define utrans_transIncremental utrans_transIncremental_3_6
+#define utrans_transIncrementalUChars utrans_transIncrementalUChars_3_6
+#define utrans_transUChars utrans_transUChars_3_6
+#define utrans_unregister utrans_unregister_3_6
+#define utrans_unregisterID utrans_unregisterID_3_6
+#define utrie_clone utrie_clone_3_6
+#define utrie_close utrie_close_3_6
+#define utrie_defaultGetFoldingOffset utrie_defaultGetFoldingOffset_3_6
+#define utrie_enum utrie_enum_3_6
+#define utrie_get32 utrie_get32_3_6
+#define utrie_getData utrie_getData_3_6
+#define utrie_open utrie_open_3_6
+#define utrie_serialize utrie_serialize_3_6
+#define utrie_set32 utrie_set32_3_6
+#define utrie_setRange32 utrie_setRange32_3_6
+#define utrie_swap utrie_swap_3_6
+#define utrie_unserialize utrie_unserialize_3_6
+#define utrie_unserializeDummy utrie_unserializeDummy_3_6
/* C++ class names renaming defines */
#ifdef XP_CPLUSPLUS
#if !U_HAVE_NAMESPACE
-#define AbsoluteValueSubstitution AbsoluteValueSubstitution_3_2
-#define AlternateSubstitutionSubtable AlternateSubstitutionSubtable_3_2
-#define AnchorTable AnchorTable_3_2
-#define AnyTransliterator AnyTransliterator_3_2
-#define ArabicOpenTypeLayoutEngine ArabicOpenTypeLayoutEngine_3_2
-#define ArabicShaping ArabicShaping_3_2
-#define BasicCalendarFactory BasicCalendarFactory_3_2
-#define BinarySearchLookupTable BinarySearchLookupTable_3_2
-#define BreakDictionary BreakDictionary_3_2
-#define BreakIterator BreakIterator_3_2
-#define BuddhistCalendar BuddhistCalendar_3_2
-#define CFactory CFactory_3_2
-#define Calendar Calendar_3_2
-#define CalendarAstronomer CalendarAstronomer_3_2
-#define CalendarCache CalendarCache_3_2
-#define CalendarData CalendarData_3_2
-#define CalendarService CalendarService_3_2
-#define CanonShaping CanonShaping_3_2
-#define CanonicalIterator CanonicalIterator_3_2
-#define CaseMapTransliterator CaseMapTransliterator_3_2
-#define ChainingContextualSubstitutionFormat1Subtable ChainingContextualSubstitutionFormat1Subtable_3_2
-#define ChainingContextualSubstitutionFormat2Subtable ChainingContextualSubstitutionFormat2Subtable_3_2
-#define ChainingContextualSubstitutionFormat3Subtable ChainingContextualSubstitutionFormat3Subtable_3_2
-#define ChainingContextualSubstitutionSubtable ChainingContextualSubstitutionSubtable_3_2
-#define CharSubstitutionFilter CharSubstitutionFilter_3_2
-#define CharacterIterator CharacterIterator_3_2
-#define ChoiceFormat ChoiceFormat_3_2
-#define ClassDefFormat1Table ClassDefFormat1Table_3_2
-#define ClassDefFormat2Table ClassDefFormat2Table_3_2
-#define ClassDefinitionTable ClassDefinitionTable_3_2
-#define CollationElementIterator CollationElementIterator_3_2
-#define CollationKey CollationKey_3_2
-#define Collator Collator_3_2
-#define CollatorFactory CollatorFactory_3_2
-#define CompoundTransliterator CompoundTransliterator_3_2
-#define ContextualGlyphSubstitutionProcessor ContextualGlyphSubstitutionProcessor_3_2
-#define ContextualSubstitutionBase ContextualSubstitutionBase_3_2
-#define ContextualSubstitutionFormat1Subtable ContextualSubstitutionFormat1Subtable_3_2
-#define ContextualSubstitutionFormat2Subtable ContextualSubstitutionFormat2Subtable_3_2
-#define ContextualSubstitutionFormat3Subtable ContextualSubstitutionFormat3Subtable_3_2
-#define ContextualSubstitutionSubtable ContextualSubstitutionSubtable_3_2
-#define CoverageFormat1Table CoverageFormat1Table_3_2
-#define CoverageFormat2Table CoverageFormat2Table_3_2
-#define CoverageTable CoverageTable_3_2
-#define CurrencyAmount CurrencyAmount_3_2
-#define CurrencyFormat CurrencyFormat_3_2
-#define CurrencyUnit CurrencyUnit_3_2
-#define CursiveAttachmentSubtable CursiveAttachmentSubtable_3_2
-#define DateFormat DateFormat_3_2
-#define DateFormatSymbols DateFormatSymbols_3_2
-#define DecimalFormat DecimalFormat_3_2
-#define DecimalFormatSymbols DecimalFormatSymbols_3_2
-#define DefaultCalendarFactory DefaultCalendarFactory_3_2
-#define DefaultCharMapper DefaultCharMapper_3_2
-#define DeviceTable DeviceTable_3_2
-#define DictionaryBasedBreakIterator DictionaryBasedBreakIterator_3_2
-#define DictionaryBasedBreakIteratorTables DictionaryBasedBreakIteratorTables_3_2
-#define DigitList DigitList_3_2
-#define Entry Entry_3_2
-#define EnumToOffset EnumToOffset_3_2
-#define EscapeTransliterator EscapeTransliterator_3_2
-#define EventListener EventListener_3_2
-#define ExtensionSubtable ExtensionSubtable_3_2
-#define FeatureListTable FeatureListTable_3_2
-#define FieldPosition FieldPosition_3_2
-#define FontRuns FontRuns_3_2
-#define Format Format_3_2
-#define Format1AnchorTable Format1AnchorTable_3_2
-#define Format2AnchorTable Format2AnchorTable_3_2
-#define Format3AnchorTable Format3AnchorTable_3_2
-#define Formattable Formattable_3_2
-#define ForwardCharacterIterator ForwardCharacterIterator_3_2
-#define FractionalPartSubstitution FractionalPartSubstitution_3_2
-#define FunctionReplacer FunctionReplacer_3_2
-#define GDEFMarkFilter GDEFMarkFilter_3_2
-#define GXLayoutEngine GXLayoutEngine_3_2
-#define GlyphDefinitionTableHeader GlyphDefinitionTableHeader_3_2
-#define GlyphIterator GlyphIterator_3_2
-#define GlyphLookupTableHeader GlyphLookupTableHeader_3_2
-#define GlyphPositioningLookupProcessor GlyphPositioningLookupProcessor_3_2
-#define GlyphPositioningTableHeader GlyphPositioningTableHeader_3_2
-#define GlyphSubstitutionLookupProcessor GlyphSubstitutionLookupProcessor_3_2
-#define GlyphSubstitutionTableHeader GlyphSubstitutionTableHeader_3_2
-#define Grego Grego_3_2
-#define GregorianCalendar GregorianCalendar_3_2
-#define HanOpenTypeLayoutEngine HanOpenTypeLayoutEngine_3_2
-#define HebrewCalendar HebrewCalendar_3_2
-#define ICUBreakIteratorFactory ICUBreakIteratorFactory_3_2
-#define ICUBreakIteratorService ICUBreakIteratorService_3_2
-#define ICUCollatorFactory ICUCollatorFactory_3_2
-#define ICUCollatorService ICUCollatorService_3_2
-#define ICULayoutEngine ICULayoutEngine_3_2
-#define ICULocaleService ICULocaleService_3_2
-#define ICUNotifier ICUNotifier_3_2
-#define ICUNumberFormatFactory ICUNumberFormatFactory_3_2
-#define ICUNumberFormatService ICUNumberFormatService_3_2
-#define ICUResourceBundleFactory ICUResourceBundleFactory_3_2
-#define ICUService ICUService_3_2
-#define ICUServiceFactory ICUServiceFactory_3_2
-#define ICUServiceKey ICUServiceKey_3_2
-#define ICU_Utility ICU_Utility_3_2
-#define IndicClassTable IndicClassTable_3_2
-#define IndicOpenTypeLayoutEngine IndicOpenTypeLayoutEngine_3_2
-#define IndicRearrangementProcessor IndicRearrangementProcessor_3_2
-#define IndicReordering IndicReordering_3_2
-#define IntegralPartSubstitution IntegralPartSubstitution_3_2
-#define IslamicCalendar IslamicCalendar_3_2
-#define JapaneseCalendar JapaneseCalendar_3_2
-#define KeywordEnumeration KeywordEnumeration_3_2
-#define LECharMapper LECharMapper_3_2
-#define LEFontInstance LEFontInstance_3_2
-#define LEGlyphFilter LEGlyphFilter_3_2
-#define LEGlyphStorage LEGlyphStorage_3_2
-#define LEInsertionCallback LEInsertionCallback_3_2
-#define LEInsertionList LEInsertionList_3_2
-#define LXUtilities LXUtilities_3_2
-#define LayoutEngine LayoutEngine_3_2
-#define LigatureSubstitutionProcessor LigatureSubstitutionProcessor_3_2
-#define LigatureSubstitutionSubtable LigatureSubstitutionSubtable_3_2
-#define LocDataParser LocDataParser_3_2
-#define Locale Locale_3_2
-#define LocaleBased LocaleBased_3_2
-#define LocaleKey LocaleKey_3_2
-#define LocaleKeyFactory LocaleKeyFactory_3_2
-#define LocaleRuns LocaleRuns_3_2
-#define LocaleUtility LocaleUtility_3_2
-#define LocalizationInfo LocalizationInfo_3_2
-#define LookupListTable LookupListTable_3_2
-#define LookupProcessor LookupProcessor_3_2
-#define LookupSubtable LookupSubtable_3_2
-#define LookupTable LookupTable_3_2
-#define LowercaseTransliterator LowercaseTransliterator_3_2
-#define MPreFixups MPreFixups_3_2
-#define MarkArray MarkArray_3_2
-#define MarkToBasePositioningSubtable MarkToBasePositioningSubtable_3_2
-#define MarkToLigaturePositioningSubtable MarkToLigaturePositioningSubtable_3_2
-#define MarkToMarkPositioningSubtable MarkToMarkPositioningSubtable_3_2
-#define Math Math_3_2
-#define Measure Measure_3_2
-#define MeasureFormat MeasureFormat_3_2
-#define MeasureUnit MeasureUnit_3_2
-#define MessageFormat MessageFormat_3_2
-#define MessageFormatAdapter MessageFormatAdapter_3_2
-#define ModulusSubstitution ModulusSubstitution_3_2
-#define MoonRiseSetCoordFunc MoonRiseSetCoordFunc_3_2
-#define MoonTimeAngleFunc MoonTimeAngleFunc_3_2
-#define MorphSubtableHeader MorphSubtableHeader_3_2
-#define MorphTableHeader MorphTableHeader_3_2
-#define MultipleSubstitutionSubtable MultipleSubstitutionSubtable_3_2
-#define MultiplierSubstitution MultiplierSubstitution_3_2
-#define NFFactory NFFactory_3_2
-#define NFRule NFRule_3_2
-#define NFRuleSet NFRuleSet_3_2
-#define NFSubstitution NFSubstitution_3_2
-#define NameToEnum NameToEnum_3_2
-#define NameUnicodeTransliterator NameUnicodeTransliterator_3_2
-#define NonContextualGlyphSubstitutionProcessor NonContextualGlyphSubstitutionProcessor_3_2
-#define NonContiguousEnumToOffset NonContiguousEnumToOffset_3_2
-#define NormalizationTransliterator NormalizationTransliterator_3_2
-#define Normalizer Normalizer_3_2
-#define NullSubstitution NullSubstitution_3_2
-#define NullTransliterator NullTransliterator_3_2
-#define NumberFormat NumberFormat_3_2
-#define NumberFormatFactory NumberFormatFactory_3_2
-#define NumeratorSubstitution NumeratorSubstitution_3_2
-#define OlsonTimeZone OlsonTimeZone_3_2
-#define OpenTypeLayoutEngine OpenTypeLayoutEngine_3_2
-#define OpenTypeUtilities OpenTypeUtilities_3_2
-#define PairPositioningFormat1Subtable PairPositioningFormat1Subtable_3_2
-#define PairPositioningFormat2Subtable PairPositioningFormat2Subtable_3_2
-#define PairPositioningSubtable PairPositioningSubtable_3_2
-#define ParagraphLayout ParagraphLayout_3_2
-#define ParseData ParseData_3_2
-#define ParsePosition ParsePosition_3_2
-#define PropertyAliases PropertyAliases_3_2
-#define Quantifier Quantifier_3_2
-#define RBBIDataWrapper RBBIDataWrapper_3_2
-#define RBBINode RBBINode_3_2
-#define RBBIRuleBuilder RBBIRuleBuilder_3_2
-#define RBBIRuleScanner RBBIRuleScanner_3_2
-#define RBBISetBuilder RBBISetBuilder_3_2
-#define RBBIStateDescriptor RBBIStateDescriptor_3_2
-#define RBBISymbolTable RBBISymbolTable_3_2
-#define RBBISymbolTableEntry RBBISymbolTableEntry_3_2
-#define RBBITableBuilder RBBITableBuilder_3_2
-#define RangeDescriptor RangeDescriptor_3_2
-#define RegexCompile RegexCompile_3_2
-#define RegexMatcher RegexMatcher_3_2
-#define RegexPattern RegexPattern_3_2
-#define RegexStaticSets RegexStaticSets_3_2
-#define RemoveTransliterator RemoveTransliterator_3_2
-#define Replaceable Replaceable_3_2
-#define ReplaceableGlue ReplaceableGlue_3_2
-#define ResourceBundle ResourceBundle_3_2
-#define RiseSetCoordFunc RiseSetCoordFunc_3_2
-#define RuleBasedBreakIterator RuleBasedBreakIterator_3_2
-#define RuleBasedCollator RuleBasedCollator_3_2
-#define RuleBasedNumberFormat RuleBasedNumberFormat_3_2
-#define RuleBasedTransliterator RuleBasedTransliterator_3_2
-#define RuleCharacterIterator RuleCharacterIterator_3_2
-#define RuleHalf RuleHalf_3_2
-#define RunArray RunArray_3_2
-#define SameValueSubstitution SameValueSubstitution_3_2
-#define ScriptListTable ScriptListTable_3_2
-#define ScriptRunIterator ScriptRunIterator_3_2
-#define ScriptTable ScriptTable_3_2
-#define SearchIterator SearchIterator_3_2
-#define SegmentArrayProcessor SegmentArrayProcessor_3_2
-#define SegmentSingleProcessor SegmentSingleProcessor_3_2
-#define ServiceEnumeration ServiceEnumeration_3_2
-#define ServiceListener ServiceListener_3_2
-#define SimpleArrayProcessor SimpleArrayProcessor_3_2
-#define SimpleDateFormat SimpleDateFormat_3_2
-#define SimpleFactory SimpleFactory_3_2
-#define SimpleLocaleKeyFactory SimpleLocaleKeyFactory_3_2
-#define SimpleNumberFormatFactory SimpleNumberFormatFactory_3_2
-#define SimpleTimeZone SimpleTimeZone_3_2
-#define SinglePositioningFormat1Subtable SinglePositioningFormat1Subtable_3_2
-#define SinglePositioningFormat2Subtable SinglePositioningFormat2Subtable_3_2
-#define SinglePositioningSubtable SinglePositioningSubtable_3_2
-#define SingleSubstitutionFormat1Subtable SingleSubstitutionFormat1Subtable_3_2
-#define SingleSubstitutionFormat2Subtable SingleSubstitutionFormat2Subtable_3_2
-#define SingleSubstitutionSubtable SingleSubstitutionSubtable_3_2
-#define SingleTableProcessor SingleTableProcessor_3_2
-#define Spec Spec_3_2
-#define StateTableProcessor StateTableProcessor_3_2
-#define StringCharacterIterator StringCharacterIterator_3_2
-#define StringEnumeration StringEnumeration_3_2
-#define StringLocalizationInfo StringLocalizationInfo_3_2
-#define StringMatcher StringMatcher_3_2
-#define StringPair StringPair_3_2
-#define StringReplacer StringReplacer_3_2
-#define StringSearch StringSearch_3_2
-#define StyleRuns StyleRuns_3_2
-#define SubstitutionLookup SubstitutionLookup_3_2
-#define SubtableProcessor SubtableProcessor_3_2
-#define SunTimeAngleFunc SunTimeAngleFunc_3_2
-#define SymbolTable SymbolTable_3_2
-#define TZEnumeration TZEnumeration_3_2
-#define ThaiLayoutEngine ThaiLayoutEngine_3_2
-#define ThaiShaping ThaiShaping_3_2
-#define TimeZone TimeZone_3_2
-#define TitlecaseTransliterator TitlecaseTransliterator_3_2
-#define TransliterationRule TransliterationRule_3_2
-#define TransliterationRuleData TransliterationRuleData_3_2
-#define TransliterationRuleSet TransliterationRuleSet_3_2
-#define Transliterator Transliterator_3_2
-#define TransliteratorAlias TransliteratorAlias_3_2
-#define TransliteratorIDParser TransliteratorIDParser_3_2
-#define TransliteratorParser TransliteratorParser_3_2
-#define TransliteratorRegistry TransliteratorRegistry_3_2
-#define TrimmedArrayProcessor TrimmedArrayProcessor_3_2
-#define UCharCharacterIterator UCharCharacterIterator_3_2
-#define UMemory UMemory_3_2
-#define UObject UObject_3_2
-#define UStack UStack_3_2
-#define UStringEnumeration UStringEnumeration_3_2
-#define UVector UVector_3_2
-#define UVector32 UVector32_3_2
-#define UnescapeTransliterator UnescapeTransliterator_3_2
-#define UnicodeArabicOpenTypeLayoutEngine UnicodeArabicOpenTypeLayoutEngine_3_2
-#define UnicodeFilter UnicodeFilter_3_2
-#define UnicodeFunctor UnicodeFunctor_3_2
-#define UnicodeMatcher UnicodeMatcher_3_2
-#define UnicodeNameTransliterator UnicodeNameTransliterator_3_2
-#define UnicodeReplacer UnicodeReplacer_3_2
-#define UnicodeSet UnicodeSet_3_2
-#define UnicodeSetIterator UnicodeSetIterator_3_2
-#define UnicodeString UnicodeString_3_2
-#define UppercaseTransliterator UppercaseTransliterator_3_2
-#define ValueRecord ValueRecord_3_2
-#define ValueRuns ValueRuns_3_2
-#define locale_set_default_internal locale_set_default_internal_3_2
-#define uprv_parseCurrency uprv_parseCurrency_3_2
-#define util64_fromDouble util64_fromDouble_3_2
-#define util64_pow util64_pow_3_2
-#define util64_tou util64_tou_3_2
-#define util64_utoi util64_utoi_3_2
+#define AbsoluteValueSubstitution AbsoluteValueSubstitution_3_6
+#define AlternateSubstitutionSubtable AlternateSubstitutionSubtable_3_6
+#define AnchorTable AnchorTable_3_6
+#define AnyTransliterator AnyTransliterator_3_6
+#define ArabicOpenTypeLayoutEngine ArabicOpenTypeLayoutEngine_3_6
+#define ArabicShaping ArabicShaping_3_6
+#define BasicCalendarFactory BasicCalendarFactory_3_6
+#define BinarySearchLookupTable BinarySearchLookupTable_3_6
+#define BreakIterator BreakIterator_3_6
+#define BuddhistCalendar BuddhistCalendar_3_6
+#define BuildCompactTrieHorizontalNode BuildCompactTrieHorizontalNode_3_6
+#define BuildCompactTrieNode BuildCompactTrieNode_3_6
+#define BuildCompactTrieVerticalNode BuildCompactTrieVerticalNode_3_6
+#define CFactory CFactory_3_6
+#define Calendar Calendar_3_6
+#define CalendarAstronomer CalendarAstronomer_3_6
+#define CalendarCache CalendarCache_3_6
+#define CalendarData CalendarData_3_6
+#define CalendarService CalendarService_3_6
+#define CanonShaping CanonShaping_3_6
+#define CanonicalIterator CanonicalIterator_3_6
+#define CaseMapTransliterator CaseMapTransliterator_3_6
+#define ChainingContextualSubstitutionFormat1Subtable ChainingContextualSubstitutionFormat1Subtable_3_6
+#define ChainingContextualSubstitutionFormat2Subtable ChainingContextualSubstitutionFormat2Subtable_3_6
+#define ChainingContextualSubstitutionFormat3Subtable ChainingContextualSubstitutionFormat3Subtable_3_6
+#define ChainingContextualSubstitutionSubtable ChainingContextualSubstitutionSubtable_3_6
+#define CharSubstitutionFilter CharSubstitutionFilter_3_6
+#define CharacterIterator CharacterIterator_3_6
+#define CharsetDetector CharsetDetector_3_6
+#define CharsetMatch CharsetMatch_3_6
+#define CharsetRecog_2022 CharsetRecog_2022_3_6
+#define CharsetRecog_2022CN CharsetRecog_2022CN_3_6
+#define CharsetRecog_2022JP CharsetRecog_2022JP_3_6
+#define CharsetRecog_2022KR CharsetRecog_2022KR_3_6
+#define CharsetRecog_8859_1 CharsetRecog_8859_1_3_6
+#define CharsetRecog_8859_1_da CharsetRecog_8859_1_da_3_6
+#define CharsetRecog_8859_1_de CharsetRecog_8859_1_de_3_6
+#define CharsetRecog_8859_1_en CharsetRecog_8859_1_en_3_6
+#define CharsetRecog_8859_1_es CharsetRecog_8859_1_es_3_6
+#define CharsetRecog_8859_1_fr CharsetRecog_8859_1_fr_3_6
+#define CharsetRecog_8859_1_it CharsetRecog_8859_1_it_3_6
+#define CharsetRecog_8859_1_nl CharsetRecog_8859_1_nl_3_6
+#define CharsetRecog_8859_1_no CharsetRecog_8859_1_no_3_6
+#define CharsetRecog_8859_1_pt CharsetRecog_8859_1_pt_3_6
+#define CharsetRecog_8859_1_sv CharsetRecog_8859_1_sv_3_6
+#define CharsetRecog_8859_2 CharsetRecog_8859_2_3_6
+#define CharsetRecog_8859_2_cs CharsetRecog_8859_2_cs_3_6
+#define CharsetRecog_8859_2_hu CharsetRecog_8859_2_hu_3_6
+#define CharsetRecog_8859_2_pl CharsetRecog_8859_2_pl_3_6
+#define CharsetRecog_8859_2_ro CharsetRecog_8859_2_ro_3_6
+#define CharsetRecog_8859_5 CharsetRecog_8859_5_3_6
+#define CharsetRecog_8859_5_ru CharsetRecog_8859_5_ru_3_6
+#define CharsetRecog_8859_6 CharsetRecog_8859_6_3_6
+#define CharsetRecog_8859_6_ar CharsetRecog_8859_6_ar_3_6
+#define CharsetRecog_8859_7 CharsetRecog_8859_7_3_6
+#define CharsetRecog_8859_7_el CharsetRecog_8859_7_el_3_6
+#define CharsetRecog_8859_8 CharsetRecog_8859_8_3_6
+#define CharsetRecog_8859_8_I_he CharsetRecog_8859_8_I_he_3_6
+#define CharsetRecog_8859_8_he CharsetRecog_8859_8_he_3_6
+#define CharsetRecog_8859_9 CharsetRecog_8859_9_3_6
+#define CharsetRecog_8859_9_tr CharsetRecog_8859_9_tr_3_6
+#define CharsetRecog_KOI8_R CharsetRecog_KOI8_R_3_6
+#define CharsetRecog_UTF8 CharsetRecog_UTF8_3_6
+#define CharsetRecog_UTF_16_BE CharsetRecog_UTF_16_BE_3_6
+#define CharsetRecog_UTF_16_LE CharsetRecog_UTF_16_LE_3_6
+#define CharsetRecog_UTF_32 CharsetRecog_UTF_32_3_6
+#define CharsetRecog_UTF_32_BE CharsetRecog_UTF_32_BE_3_6
+#define CharsetRecog_UTF_32_LE CharsetRecog_UTF_32_LE_3_6
+#define CharsetRecog_Unicode CharsetRecog_Unicode_3_6
+#define CharsetRecog_big5 CharsetRecog_big5_3_6
+#define CharsetRecog_euc CharsetRecog_euc_3_6
+#define CharsetRecog_euc_jp CharsetRecog_euc_jp_3_6
+#define CharsetRecog_euc_kr CharsetRecog_euc_kr_3_6
+#define CharsetRecog_gb_18030 CharsetRecog_gb_18030_3_6
+#define CharsetRecog_mbcs CharsetRecog_mbcs_3_6
+#define CharsetRecog_sbcs CharsetRecog_sbcs_3_6
+#define CharsetRecog_sjis CharsetRecog_sjis_3_6
+#define CharsetRecog_windows_1251 CharsetRecog_windows_1251_3_6
+#define CharsetRecog_windows_1256 CharsetRecog_windows_1256_3_6
+#define CharsetRecognizer CharsetRecognizer_3_6
+#define ChoiceFormat ChoiceFormat_3_6
+#define ClassDefFormat1Table ClassDefFormat1Table_3_6
+#define ClassDefFormat2Table ClassDefFormat2Table_3_6
+#define ClassDefinitionTable ClassDefinitionTable_3_6
+#define CollationElementIterator CollationElementIterator_3_6
+#define CollationKey CollationKey_3_6
+#define Collator Collator_3_6
+#define CollatorFactory CollatorFactory_3_6
+#define CompactTrieDictionary CompactTrieDictionary_3_6
+#define CompactTrieEnumeration CompactTrieEnumeration_3_6
+#define CompoundTransliterator CompoundTransliterator_3_6
+#define ContextualGlyphSubstitutionProcessor ContextualGlyphSubstitutionProcessor_3_6
+#define ContextualSubstitutionBase ContextualSubstitutionBase_3_6
+#define ContextualSubstitutionFormat1Subtable ContextualSubstitutionFormat1Subtable_3_6
+#define ContextualSubstitutionFormat2Subtable ContextualSubstitutionFormat2Subtable_3_6
+#define ContextualSubstitutionFormat3Subtable ContextualSubstitutionFormat3Subtable_3_6
+#define ContextualSubstitutionSubtable ContextualSubstitutionSubtable_3_6
+#define CoverageFormat1Table CoverageFormat1Table_3_6
+#define CoverageFormat2Table CoverageFormat2Table_3_6
+#define CoverageTable CoverageTable_3_6
+#define CurrencyAmount CurrencyAmount_3_6
+#define CurrencyFormat CurrencyFormat_3_6
+#define CurrencyUnit CurrencyUnit_3_6
+#define CursiveAttachmentSubtable CursiveAttachmentSubtable_3_6
+#define DateFormat DateFormat_3_6
+#define DateFormatSymbols DateFormatSymbols_3_6
+#define DecimalFormat DecimalFormat_3_6
+#define DecimalFormatSymbols DecimalFormatSymbols_3_6
+#define DefaultCalendarFactory DefaultCalendarFactory_3_6
+#define DefaultCharMapper DefaultCharMapper_3_6
+#define DeviceTable DeviceTable_3_6
+#define DictionaryBreakEngine DictionaryBreakEngine_3_6
+#define DigitList DigitList_3_6
+#define Entry Entry_3_6
+#define EnumToOffset EnumToOffset_3_6
+#define EscapeTransliterator EscapeTransliterator_3_6
+#define EventListener EventListener_3_6
+#define ExtensionSubtable ExtensionSubtable_3_6
+#define FeatureListTable FeatureListTable_3_6
+#define FieldPosition FieldPosition_3_6
+#define FontRuns FontRuns_3_6
+#define Format Format_3_6
+#define Format1AnchorTable Format1AnchorTable_3_6
+#define Format2AnchorTable Format2AnchorTable_3_6
+#define Format3AnchorTable Format3AnchorTable_3_6
+#define Formattable Formattable_3_6
+#define ForwardCharacterIterator ForwardCharacterIterator_3_6
+#define FractionalPartSubstitution FractionalPartSubstitution_3_6
+#define FunctionReplacer FunctionReplacer_3_6
+#define GDEFMarkFilter GDEFMarkFilter_3_6
+#define GXLayoutEngine GXLayoutEngine_3_6
+#define GlyphDefinitionTableHeader GlyphDefinitionTableHeader_3_6
+#define GlyphIterator GlyphIterator_3_6
+#define GlyphLookupTableHeader GlyphLookupTableHeader_3_6
+#define GlyphPositionAdjustments GlyphPositionAdjustments_3_6
+#define GlyphPositioningLookupProcessor GlyphPositioningLookupProcessor_3_6
+#define GlyphPositioningTableHeader GlyphPositioningTableHeader_3_6
+#define GlyphSubstitutionLookupProcessor GlyphSubstitutionLookupProcessor_3_6
+#define GlyphSubstitutionTableHeader GlyphSubstitutionTableHeader_3_6
+#define Grego Grego_3_6
+#define GregorianCalendar GregorianCalendar_3_6
+#define HanOpenTypeLayoutEngine HanOpenTypeLayoutEngine_3_6
+#define HangulOpenTypeLayoutEngine HangulOpenTypeLayoutEngine_3_6
+#define HebrewCalendar HebrewCalendar_3_6
+#define ICUBreakIteratorFactory ICUBreakIteratorFactory_3_6
+#define ICUBreakIteratorService ICUBreakIteratorService_3_6
+#define ICUCollatorFactory ICUCollatorFactory_3_6
+#define ICUCollatorService ICUCollatorService_3_6
+#define ICULanguageBreakFactory ICULanguageBreakFactory_3_6
+#define ICULocaleService ICULocaleService_3_6
+#define ICUNotifier ICUNotifier_3_6
+#define ICUNumberFormatFactory ICUNumberFormatFactory_3_6
+#define ICUNumberFormatService ICUNumberFormatService_3_6
+#define ICUResourceBundleFactory ICUResourceBundleFactory_3_6
+#define ICUService ICUService_3_6
+#define ICUServiceFactory ICUServiceFactory_3_6
+#define ICUServiceKey ICUServiceKey_3_6
+#define ICU_Utility ICU_Utility_3_6
+#define IndicClassTable IndicClassTable_3_6
+#define IndicOpenTypeLayoutEngine IndicOpenTypeLayoutEngine_3_6
+#define IndicRearrangementProcessor IndicRearrangementProcessor_3_6
+#define IndicReordering IndicReordering_3_6
+#define InputText InputText_3_6
+#define IntegralPartSubstitution IntegralPartSubstitution_3_6
+#define IslamicCalendar IslamicCalendar_3_6
+#define IteratedChar IteratedChar_3_6
+#define JapaneseCalendar JapaneseCalendar_3_6
+#define KernTable KernTable_3_6
+#define KeywordEnumeration KeywordEnumeration_3_6
+#define KhmerClassTable KhmerClassTable_3_6
+#define KhmerOpenTypeLayoutEngine KhmerOpenTypeLayoutEngine_3_6
+#define KhmerReordering KhmerReordering_3_6
+#define LECharMapper LECharMapper_3_6
+#define LEFontInstance LEFontInstance_3_6
+#define LEGlyphFilter LEGlyphFilter_3_6
+#define LEGlyphStorage LEGlyphStorage_3_6
+#define LEInsertionCallback LEInsertionCallback_3_6
+#define LEInsertionList LEInsertionList_3_6
+#define LXUtilities LXUtilities_3_6
+#define LanguageBreakEngine LanguageBreakEngine_3_6
+#define LanguageBreakFactory LanguageBreakFactory_3_6
+#define LayoutEngine LayoutEngine_3_6
+#define LigatureSubstitutionProcessor LigatureSubstitutionProcessor_3_6
+#define LigatureSubstitutionSubtable LigatureSubstitutionSubtable_3_6
+#define LocDataParser LocDataParser_3_6
+#define Locale Locale_3_6
+#define LocaleBased LocaleBased_3_6
+#define LocaleKey LocaleKey_3_6
+#define LocaleKeyFactory LocaleKeyFactory_3_6
+#define LocaleRuns LocaleRuns_3_6
+#define LocaleUtility LocaleUtility_3_6
+#define LocalizationInfo LocalizationInfo_3_6
+#define LookupListTable LookupListTable_3_6
+#define LookupProcessor LookupProcessor_3_6
+#define LookupSubtable LookupSubtable_3_6
+#define LookupTable LookupTable_3_6
+#define LowercaseTransliterator LowercaseTransliterator_3_6
+#define MPreFixups MPreFixups_3_6
+#define MarkArray MarkArray_3_6
+#define MarkToBasePositioningSubtable MarkToBasePositioningSubtable_3_6
+#define MarkToLigaturePositioningSubtable MarkToLigaturePositioningSubtable_3_6
+#define MarkToMarkPositioningSubtable MarkToMarkPositioningSubtable_3_6
+#define Math Math_3_6
+#define Measure Measure_3_6
+#define MeasureFormat MeasureFormat_3_6
+#define MeasureUnit MeasureUnit_3_6
+#define MessageFormat MessageFormat_3_6
+#define MessageFormatAdapter MessageFormatAdapter_3_6
+#define ModulusSubstitution ModulusSubstitution_3_6
+#define MoonRiseSetCoordFunc MoonRiseSetCoordFunc_3_6
+#define MoonTimeAngleFunc MoonTimeAngleFunc_3_6
+#define MorphSubtableHeader MorphSubtableHeader_3_6
+#define MorphTableHeader MorphTableHeader_3_6
+#define MultipleSubstitutionSubtable MultipleSubstitutionSubtable_3_6
+#define MultiplierSubstitution MultiplierSubstitution_3_6
+#define MutableTrieDictionary MutableTrieDictionary_3_6
+#define MutableTrieEnumeration MutableTrieEnumeration_3_6
+#define NFFactory NFFactory_3_6
+#define NFRule NFRule_3_6
+#define NFRuleSet NFRuleSet_3_6
+#define NFSubstitution NFSubstitution_3_6
+#define NGramParser NGramParser_3_6
+#define NameToEnum NameToEnum_3_6
+#define NameUnicodeTransliterator NameUnicodeTransliterator_3_6
+#define NonContextualGlyphSubstitutionProcessor NonContextualGlyphSubstitutionProcessor_3_6
+#define NonContiguousEnumToOffset NonContiguousEnumToOffset_3_6
+#define NormalizationTransliterator NormalizationTransliterator_3_6
+#define Normalizer Normalizer_3_6
+#define NullSubstitution NullSubstitution_3_6
+#define NullTransliterator NullTransliterator_3_6
+#define NumberFormat NumberFormat_3_6
+#define NumberFormatFactory NumberFormatFactory_3_6
+#define NumeratorSubstitution NumeratorSubstitution_3_6
+#define OlsonTimeZone OlsonTimeZone_3_6
+#define OpenTypeLayoutEngine OpenTypeLayoutEngine_3_6
+#define OpenTypeUtilities OpenTypeUtilities_3_6
+#define PairPositioningFormat1Subtable PairPositioningFormat1Subtable_3_6
+#define PairPositioningFormat2Subtable PairPositioningFormat2Subtable_3_6
+#define PairPositioningSubtable PairPositioningSubtable_3_6
+#define ParagraphLayout ParagraphLayout_3_6
+#define ParseData ParseData_3_6
+#define ParsePosition ParsePosition_3_6
+#define PropertyAliases PropertyAliases_3_6
+#define Quantifier Quantifier_3_6
+#define RBBIDataWrapper RBBIDataWrapper_3_6
+#define RBBINode RBBINode_3_6
+#define RBBIRuleBuilder RBBIRuleBuilder_3_6
+#define RBBIRuleScanner RBBIRuleScanner_3_6
+#define RBBISetBuilder RBBISetBuilder_3_6
+#define RBBIStateDescriptor RBBIStateDescriptor_3_6
+#define RBBISymbolTable RBBISymbolTable_3_6
+#define RBBISymbolTableEntry RBBISymbolTableEntry_3_6
+#define RBBITableBuilder RBBITableBuilder_3_6
+#define RangeDescriptor RangeDescriptor_3_6
+#define RegexCompile RegexCompile_3_6
+#define RegexMatcher RegexMatcher_3_6
+#define RegexPattern RegexPattern_3_6
+#define RegexStaticSets RegexStaticSets_3_6
+#define RemoveTransliterator RemoveTransliterator_3_6
+#define Replaceable Replaceable_3_6
+#define ReplaceableGlue ReplaceableGlue_3_6
+#define ResourceBundle ResourceBundle_3_6
+#define RiseSetCoordFunc RiseSetCoordFunc_3_6
+#define RuleBasedBreakIterator RuleBasedBreakIterator_3_6
+#define RuleBasedCollator RuleBasedCollator_3_6
+#define RuleBasedNumberFormat RuleBasedNumberFormat_3_6
+#define RuleBasedTransliterator RuleBasedTransliterator_3_6
+#define RuleCharacterIterator RuleCharacterIterator_3_6
+#define RuleHalf RuleHalf_3_6
+#define RunArray RunArray_3_6
+#define SameValueSubstitution SameValueSubstitution_3_6
+#define ScriptListTable ScriptListTable_3_6
+#define ScriptRunIterator ScriptRunIterator_3_6
+#define ScriptTable ScriptTable_3_6
+#define SearchIterator SearchIterator_3_6
+#define SegmentArrayProcessor SegmentArrayProcessor_3_6
+#define SegmentSingleProcessor SegmentSingleProcessor_3_6
+#define ServiceEnumeration ServiceEnumeration_3_6
+#define ServiceListener ServiceListener_3_6
+#define SimpleArrayProcessor SimpleArrayProcessor_3_6
+#define SimpleDateFormat SimpleDateFormat_3_6
+#define SimpleFactory SimpleFactory_3_6
+#define SimpleLocaleKeyFactory SimpleLocaleKeyFactory_3_6
+#define SimpleNumberFormatFactory SimpleNumberFormatFactory_3_6
+#define SimpleTimeZone SimpleTimeZone_3_6
+#define SinglePositioningFormat1Subtable SinglePositioningFormat1Subtable_3_6
+#define SinglePositioningFormat2Subtable SinglePositioningFormat2Subtable_3_6
+#define SinglePositioningSubtable SinglePositioningSubtable_3_6
+#define SingleSubstitutionFormat1Subtable SingleSubstitutionFormat1Subtable_3_6
+#define SingleSubstitutionFormat2Subtable SingleSubstitutionFormat2Subtable_3_6
+#define SingleSubstitutionSubtable SingleSubstitutionSubtable_3_6
+#define SingleTableProcessor SingleTableProcessor_3_6
+#define Spec Spec_3_6
+#define StateTableProcessor StateTableProcessor_3_6
+#define StringCharacterIterator StringCharacterIterator_3_6
+#define StringEnumeration StringEnumeration_3_6
+#define StringLocalizationInfo StringLocalizationInfo_3_6
+#define StringMatcher StringMatcher_3_6
+#define StringPair StringPair_3_6
+#define StringReplacer StringReplacer_3_6
+#define StringSearch StringSearch_3_6
+#define StyleRuns StyleRuns_3_6
+#define SubstitutionLookup SubstitutionLookup_3_6
+#define SubtableProcessor SubtableProcessor_3_6
+#define SunTimeAngleFunc SunTimeAngleFunc_3_6
+#define SymbolTable SymbolTable_3_6
+#define TZEnumeration TZEnumeration_3_6
+#define TernaryNode TernaryNode_3_6
+#define ThaiBreakEngine ThaiBreakEngine_3_6
+#define ThaiLayoutEngine ThaiLayoutEngine_3_6
+#define ThaiShaping ThaiShaping_3_6
+#define TibetanClassTable TibetanClassTable_3_6
+#define TibetanOpenTypeLayoutEngine TibetanOpenTypeLayoutEngine_3_6
+#define TibetanReordering TibetanReordering_3_6
+#define TimeZone TimeZone_3_6
+#define TimeZoneKeysEnumeration TimeZoneKeysEnumeration_3_6
+#define TitlecaseTransliterator TitlecaseTransliterator_3_6
+#define TransliterationRule TransliterationRule_3_6
+#define TransliterationRuleData TransliterationRuleData_3_6
+#define TransliterationRuleSet TransliterationRuleSet_3_6
+#define Transliterator Transliterator_3_6
+#define TransliteratorAlias TransliteratorAlias_3_6
+#define TransliteratorIDParser TransliteratorIDParser_3_6
+#define TransliteratorParser TransliteratorParser_3_6
+#define TransliteratorRegistry TransliteratorRegistry_3_6
+#define TrieWordDictionary TrieWordDictionary_3_6
+#define TrimmedArrayProcessor TrimmedArrayProcessor_3_6
+#define UCharCharacterIterator UCharCharacterIterator_3_6
+#define UMemory UMemory_3_6
+#define UObject UObject_3_6
+#define URegularExpression URegularExpression_3_6
+#define UStack UStack_3_6
+#define UStringEnumeration UStringEnumeration_3_6
+#define UVector UVector_3_6
+#define UVector32 UVector32_3_6
+#define UnescapeTransliterator UnescapeTransliterator_3_6
+#define UnhandledEngine UnhandledEngine_3_6
+#define UnicodeArabicOpenTypeLayoutEngine UnicodeArabicOpenTypeLayoutEngine_3_6
+#define UnicodeFilter UnicodeFilter_3_6
+#define UnicodeFunctor UnicodeFunctor_3_6
+#define UnicodeMatcher UnicodeMatcher_3_6
+#define UnicodeNameTransliterator UnicodeNameTransliterator_3_6
+#define UnicodeReplacer UnicodeReplacer_3_6
+#define UnicodeSet UnicodeSet_3_6
+#define UnicodeSetIterator UnicodeSetIterator_3_6
+#define UnicodeString UnicodeString_3_6
+#define UppercaseTransliterator UppercaseTransliterator_3_6
+#define ValueRecord ValueRecord_3_6
+#define ValueRuns ValueRuns_3_6
+#define locale_set_default_internal locale_set_default_internal_3_6
+#define util64_fromDouble util64_fromDouble_3_6
+#define util64_pow util64_pow_3_6
+#define util64_tou util64_tou_3_6
#endif
#endif
diff --git a/icuSources/common/unicode/urep.h b/icuSources/common/unicode/urep.h
index ee2df3d4..57b547c8 100644
--- a/icuSources/common/unicode/urep.h
+++ b/icuSources/common/unicode/urep.h
@@ -1,6 +1,6 @@
/*
******************************************************************************
-* Copyright (C) 1997-2003, International Business Machines
+* Copyright (C) 1997-2005, International Business Machines
* Corporation and others. All Rights Reserved.
******************************************************************************
* Date Name Description
@@ -28,7 +28,10 @@ U_CDECL_BEGIN
/********************************************************************
* Data Structures
********************************************************************/
-
+/**
+ * \file
+ * \brief C API: Callbacks for UReplacebale
+ */
/**
* An opaque replaceable text object. This will be manipulated only
* through the caller-supplied UReplaceableFunctor struct. Related
diff --git a/icuSources/common/unicode/ures.h b/icuSources/common/unicode/ures.h
index c1cecd49..f6e3b347 100644
--- a/icuSources/common/unicode/ures.h
+++ b/icuSources/common/unicode/ures.h
@@ -1,6 +1,6 @@
/*
**********************************************************************
-* Copyright (C) 1997-2004, International Business Machines
+* Copyright (C) 1997-2006, International Business Machines
* Corporation and others. All Rights Reserved.
**********************************************************************
*
@@ -38,9 +38,9 @@
* locale and then ask it for individual resources.
*
* Resource bundles in ICU4C are currently defined using text files which conform to the following
- * BNF definition.
+ * BNF definition.
* More on resource bundle concepts and syntax can be found in the
- * Users Guide.
+ * Users Guide.
*
*/
@@ -82,6 +82,8 @@ typedef enum {
*/
URES_ALIAS=3,
+#ifndef U_HIDE_INTERNAL_API
+
/**
* Internal use only.
* Alternative resource type constant for tables of key-value pairs.
@@ -90,6 +92,8 @@ typedef enum {
*/
URES_TABLE32=4,
+#endif /* U_HIDE_INTERNAL_API */
+
/**
* Resource type constant for a single 28-bit integer, interpreted as
* signed or unsigned by the ures_getInt() or ures_getUInt() function.
@@ -107,8 +111,7 @@ typedef enum {
* @see ures_getIntVector
* @stable ICU 2.6
*/
- URES_INT_VECTOR=14,
-
+ URES_INT_VECTOR = 14,
#ifndef U_HIDE_DEPRECATED_API
/** @deprecated ICU 2.6 Use the URES_ constant instead. */
RES_NONE=URES_NONE,
@@ -126,10 +129,11 @@ typedef enum {
RES_ARRAY=URES_ARRAY,
/** @deprecated ICU 2.6 Use the URES_ constant instead. */
RES_INT_VECTOR=URES_INT_VECTOR,
+ /** @deprecated ICU 2.6 Not used. */
+ RES_RESERVED=15,
#endif /* U_HIDE_DEPRECATED_API */
- /** @deprecated ICU 2.6 Not used. */
- RES_RESERVED=15
+ URES_LIMIT = 16
} UResType;
/*
@@ -141,10 +145,11 @@ typedef enum {
* their corresponding keys.
* Note that the caller is responsible of calling ures_close on each succesfully
* opened resource bundle.
- * @param path string containing the full path pointing to the directory
- * where the resources reside followed by the package name
- * e.g. "/usr/resource/my_app/resources/guimessages" on a Unix system.
- * if NULL, ICU default data files will be used.
+ * @param packageName The packageName and locale together point to an ICU udata object,
+ * as defined by udata_open( packageName, "res", locale, err)
+ * or equivalent. Typically, packageName will refer to a (.dat) file, or to
+ * a package registered with udata_setAppData(). Using a full file or directory
+ * pathname for packageName is deprecated. If NULL, ICU data will be used.
* @param locale specifies the locale for which we want to open the resource
* if NULL, the default locale will be used. If strlen(locale) == 0
* root locale will be used.
@@ -164,7 +169,7 @@ typedef enum {
* @stable ICU 2.0
*/
U_STABLE UResourceBundle* U_EXPORT2
-ures_open(const char* path,
+ures_open(const char* packageName,
const char* locale,
UErrorCode* status);
@@ -172,10 +177,11 @@ ures_open(const char* path,
/** This function does not care what kind of localeID is passed in. It simply opens a bundle with
* that name. Fallback mechanism is disabled for the new bundle. If the requested bundle contains
* an %%ALIAS directive, the results are undefined.
- * @param path string containing the full path pointing to the directory
- * where the resources reside followed by the package name
- * e.g. "/usr/resource/my_app/resources/guimessages" on a Unix system.
- * if NULL, ICU default data files will be used.
+ * @param packageName The packageName and locale together point to an ICU udata object,
+ * as defined by udata_open( packageName, "res", locale, err)
+ * or equivalent. Typically, packageName will refer to a (.dat) file, or to
+ * a package registered with udata_setAppData(). Using a full file or directory
+ * pathname for packageName is deprecated. If NULL, ICU data will be used.
* @param locale specifies the locale for which we want to open the resource
* if NULL, the default locale will be used. If strlen(locale) == 0
* root locale will be used.
@@ -186,7 +192,7 @@ ures_open(const char* path,
* @stable ICU 2.0
*/
U_STABLE UResourceBundle* U_EXPORT2
-ures_openDirect(const char* path,
+ures_openDirect(const char* packageName,
const char* locale,
UErrorCode* status);
@@ -195,8 +201,11 @@ ures_openDirect(const char* path,
* This path will be converted to char * using the default converter,
* then ures_open() is called.
*
- * @param path string containing the full path pointing to the directory
- * where the resources reside followed by the package name
+ * @param packageName The packageName and locale together point to an ICU udata object,
+ * as defined by udata_open( packageName, "res", locale, err)
+ * or equivalent. Typically, packageName will refer to a (.dat) file, or to
+ * a package registered with udata_setAppData(). Using a full file or directory
+ * pathname for packageName is deprecated. If NULL, ICU data will be used.
* @param locale specifies the locale for which we want to open the resource
* if NULL, the default locale will be used. If strlen(locale) == 0
* root locale will be used.
@@ -206,7 +215,7 @@ ures_openDirect(const char* path,
* @stable ICU 2.0
*/
U_STABLE UResourceBundle* U_EXPORT2
-ures_openU(const UChar* path,
+ures_openU(const UChar* packageName,
const char* locale,
UErrorCode* status);
@@ -294,9 +303,9 @@ ures_getLocale(const UResourceBundle* resourceBundle,
* ULocDataLocaleType in uloc.h
* @param status just for catching illegal arguments
* @return A Locale name
- * @draft ICU 2.8
+ * @stable ICU 2.8
*/
-U_DRAFT const char* U_EXPORT2
+U_STABLE const char* U_EXPORT2
ures_getLocaleByType(const UResourceBundle* resourceBundle,
ULocDataLocaleType type,
UErrorCode* status);
@@ -308,8 +317,11 @@ ures_getLocaleByType(const UResourceBundle* resourceBundle,
* TODO need to revisit usefulness of this function
* and usage model for fillIn parameters without knowing sizeof(UResourceBundle)
* @param r The resourcebundle to open
- * @param path String containing the full path pointing to the directory
- * where the resources reside followed by the package name
+ * @param packageName The packageName and locale together point to an ICU udata object,
+ * as defined by udata_open( packageName, "res", locale, err)
+ * or equivalent. Typically, packageName will refer to a (.dat) file, or to
+ * a package registered with udata_setAppData(). Using a full file or directory
+ * pathname for packageName is deprecated. If NULL, ICU data will be used.
* @param localeID specifies the locale for which we want to open the resource
* @param status The error code
* @return a newly allocated resource bundle or NULL if it doesn't exist.
@@ -317,7 +329,7 @@ ures_getLocaleByType(const UResourceBundle* resourceBundle,
*/
U_INTERNAL void U_EXPORT2
ures_openFillIn(UResourceBundle *r,
- const char* path,
+ const char* packageName,
const char* localeID,
UErrorCode* status);
@@ -343,6 +355,59 @@ ures_getString(const UResourceBundle* resourceBundle,
int32_t* len,
UErrorCode* status);
+/**
+ * Returns a UTF-8 string from a string resource.
+ * The UTF-8 string may be returnable directly as a pointer, or
+ * it may need to be copied, or transformed from UTF-16 using u_strToUTF8()
+ * or equivalent.
+ *
+ * If forceCopy==TRUE, then the string is always written to the dest buffer
+ * and dest is returned.
+ *
+ * If forceCopy==FALSE, then the string is returned as a pointer if possible,
+ * without needing a dest buffer (it can be NULL). If the string needs to be
+ * copied or transformed, then it may be placed into dest at an arbitrary offset.
+ *
+ * If the string is to be written to dest, then U_BUFFER_OVERFLOW_ERROR and
+ * U_STRING_NOT_TERMINATED_WARNING are set if appropriate, as usual.
+ *
+ * If the string is transformed from UTF-16, then a conversion error may occur
+ * if an unpaired surrogate is encountered. If the function is successful, then
+ * the output UTF-8 string is always well-formed.
+ *
+ * @param resB Resource bundle.
+ * @param dest Destination buffer. Can be NULL only if capacity=*length==0.
+ * @param length Input: Capacity of destination buffer.
+ * Output: Actual length of the UTF-8 string, not counting the
+ * terminating NUL, even in case of U_BUFFER_OVERFLOW_ERROR.
+ * Can be NULL, meaning capacity=0 and the string length is not
+ * returned to the caller.
+ * @param forceCopy If TRUE, then the output string will always be written to
+ * dest, with U_BUFFER_OVERFLOW_ERROR and
+ * U_STRING_NOT_TERMINATED_WARNING set if appropriate.
+ * If FALSE, then the dest buffer may or may not contain a
+ * copy of the string. dest may or may not be modified.
+ * If a copy needs to be written, then the UErrorCode parameter
+ * indicates overflow etc. as usual.
+ * @param status Pointer to a standard ICU error code. Its input value must
+ * pass the U_SUCCESS() test, or else the function returns
+ * immediately. Check for U_FAILURE() on output or use with
+ * function chaining. (See User Guide for details.)
+ * @return The pointer to the UTF-8 string. It may be dest, or at some offset
+ * from dest (only if !forceCopy), or in unrelated memory.
+ * Always NUL-terminated unless the string was written to dest and
+ * length==capacity (in which case U_STRING_NOT_TERMINATED_WARNING is set).
+ *
+ * @see ures_getString
+ * @see u_strToUTF8
+ * @draft ICU 3.6
+ */
+U_DRAFT const char * U_EXPORT2
+ures_getUTF8String(const UResourceBundle *resB,
+ char *dest, int32_t *length,
+ UBool forceCopy,
+ UErrorCode *status);
+
/**
* Returns a binary data from a binary resource.
*
@@ -490,11 +555,11 @@ ures_hasNext(const UResourceBundle *resourceBundle);
* to iterate over. Features a fill-in parameter.
*
* @param resourceBundle a resource
- * @param fillIn if NULL a new UResourceBundle struct is allocated and must be deleted by the caller.
+ * @param fillIn if NULL a new UResourceBundle struct is allocated and must be closed by the caller.
* Alternatively, you can supply a struct to be filled by this function.
* @param status fills in the outgoing error code. You may still get a non NULL result even if an
* error occured. Check status instead.
- * @return a pointer to a UResourceBundle struct. If fill in param was NULL, caller must delete it
+ * @return a pointer to a UResourceBundle struct. If fill in param was NULL, caller must close it
* @stable ICU 2.0
*/
U_STABLE UResourceBundle* U_EXPORT2
@@ -525,11 +590,11 @@ ures_getNextString(UResourceBundle *resourceBundle,
*
* @param resourceBundle the resource bundle from which to get a sub-resource
* @param indexR an index to the wanted resource.
- * @param fillIn if NULL a new UResourceBundle struct is allocated and must be deleted by the caller.
+ * @param fillIn if NULL a new UResourceBundle struct is allocated and must be closed by the caller.
* Alternatively, you can supply a struct to be filled by this function.
* @param status fills in the outgoing error code. Don't count on NULL being returned if an error has
* occured. Check status instead.
- * @return a pointer to a UResourceBundle struct. If fill in param was NULL, caller must delete it
+ * @return a pointer to a UResourceBundle struct. If fill in param was NULL, caller must close it
* @stable ICU 2.0
*/
U_STABLE UResourceBundle* U_EXPORT2
@@ -555,16 +620,71 @@ ures_getStringByIndex(const UResourceBundle *resourceBundle,
int32_t* len,
UErrorCode *status);
+/**
+ * Returns a UTF-8 string from a resource at the specified index.
+ * The UTF-8 string may be returnable directly as a pointer, or
+ * it may need to be copied, or transformed from UTF-16 using u_strToUTF8()
+ * or equivalent.
+ *
+ * If forceCopy==TRUE, then the string is always written to the dest buffer
+ * and dest is returned.
+ *
+ * If forceCopy==FALSE, then the string is returned as a pointer if possible,
+ * without needing a dest buffer (it can be NULL). If the string needs to be
+ * copied or transformed, then it may be placed into dest at an arbitrary offset.
+ *
+ * If the string is to be written to dest, then U_BUFFER_OVERFLOW_ERROR and
+ * U_STRING_NOT_TERMINATED_WARNING are set if appropriate, as usual.
+ *
+ * If the string is transformed from UTF-16, then a conversion error may occur
+ * if an unpaired surrogate is encountered. If the function is successful, then
+ * the output UTF-8 string is always well-formed.
+ *
+ * @param resB Resource bundle.
+ * @param index An index to the wanted string.
+ * @param dest Destination buffer. Can be NULL only if capacity=*length==0.
+ * @param pLength Input: Capacity of destination buffer.
+ * Output: Actual length of the UTF-8 string, not counting the
+ * terminating NUL, even in case of U_BUFFER_OVERFLOW_ERROR.
+ * Can be NULL, meaning capacity=0 and the string length is not
+ * returned to the caller.
+ * @param forceCopy If TRUE, then the output string will always be written to
+ * dest, with U_BUFFER_OVERFLOW_ERROR and
+ * U_STRING_NOT_TERMINATED_WARNING set if appropriate.
+ * If FALSE, then the dest buffer may or may not contain a
+ * copy of the string. dest may or may not be modified.
+ * If a copy needs to be written, then the UErrorCode parameter
+ * indicates overflow etc. as usual.
+ * @param status Pointer to a standard ICU error code. Its input value must
+ * pass the U_SUCCESS() test, or else the function returns
+ * immediately. Check for U_FAILURE() on output or use with
+ * function chaining. (See User Guide for details.)
+ * @return The pointer to the UTF-8 string. It may be dest, or at some offset
+ * from dest (only if !forceCopy), or in unrelated memory.
+ * Always NUL-terminated unless the string was written to dest and
+ * length==capacity (in which case U_STRING_NOT_TERMINATED_WARNING is set).
+ *
+ * @see ures_getStringByIndex
+ * @see u_strToUTF8
+ * @draft ICU 3.6
+ */
+U_DRAFT const char * U_EXPORT2
+ures_getUTF8StringByIndex(const UResourceBundle *resB,
+ int32_t index,
+ char *dest, int32_t *pLength,
+ UBool forceCopy,
+ UErrorCode *status);
+
/**
* Returns a resource in a given resource that has a given key. This procedure works only with table
* resources. Features a fill-in parameter.
*
* @param resourceBundle a resource
* @param key a key associated with the wanted resource
- * @param fillIn if NULL a new UResourceBundle struct is allocated and must be deleted by the caller.
+ * @param fillIn if NULL a new UResourceBundle struct is allocated and must be closed by the caller.
* Alternatively, you can supply a struct to be filled by this function.
* @param status fills in the outgoing error code.
- * @return a pointer to a UResourceBundle struct. If fill in param was NULL, caller must delete it
+ * @return a pointer to a UResourceBundle struct. If fill in param was NULL, caller must close it
* @stable ICU 2.0
*/
U_STABLE UResourceBundle* U_EXPORT2
@@ -591,6 +711,63 @@ ures_getStringByKey(const UResourceBundle *resB,
int32_t* len,
UErrorCode *status);
+/**
+ * Returns a UTF-8 string from a resource and a key.
+ * This function works only with table resources.
+ *
+ * The UTF-8 string may be returnable directly as a pointer, or
+ * it may need to be copied, or transformed from UTF-16 using u_strToUTF8()
+ * or equivalent.
+ *
+ * If forceCopy==TRUE, then the string is always written to the dest buffer
+ * and dest is returned.
+ *
+ * If forceCopy==FALSE, then the string is returned as a pointer if possible,
+ * without needing a dest buffer (it can be NULL). If the string needs to be
+ * copied or transformed, then it may be placed into dest at an arbitrary offset.
+ *
+ * If the string is to be written to dest, then U_BUFFER_OVERFLOW_ERROR and
+ * U_STRING_NOT_TERMINATED_WARNING are set if appropriate, as usual.
+ *
+ * If the string is transformed from UTF-16, then a conversion error may occur
+ * if an unpaired surrogate is encountered. If the function is successful, then
+ * the output UTF-8 string is always well-formed.
+ *
+ * @param resB Resource bundle.
+ * @param key A key associated with the wanted resource
+ * @param dest Destination buffer. Can be NULL only if capacity=*length==0.
+ * @param pLength Input: Capacity of destination buffer.
+ * Output: Actual length of the UTF-8 string, not counting the
+ * terminating NUL, even in case of U_BUFFER_OVERFLOW_ERROR.
+ * Can be NULL, meaning capacity=0 and the string length is not
+ * returned to the caller.
+ * @param forceCopy If TRUE, then the output string will always be written to
+ * dest, with U_BUFFER_OVERFLOW_ERROR and
+ * U_STRING_NOT_TERMINATED_WARNING set if appropriate.
+ * If FALSE, then the dest buffer may or may not contain a
+ * copy of the string. dest may or may not be modified.
+ * If a copy needs to be written, then the UErrorCode parameter
+ * indicates overflow etc. as usual.
+ * @param status Pointer to a standard ICU error code. Its input value must
+ * pass the U_SUCCESS() test, or else the function returns
+ * immediately. Check for U_FAILURE() on output or use with
+ * function chaining. (See User Guide for details.)
+ * @return The pointer to the UTF-8 string. It may be dest, or at some offset
+ * from dest (only if !forceCopy), or in unrelated memory.
+ * Always NUL-terminated unless the string was written to dest and
+ * length==capacity (in which case U_STRING_NOT_TERMINATED_WARNING is set).
+ *
+ * @see ures_getStringByKey
+ * @see u_strToUTF8
+ * @draft ICU 3.6
+ */
+U_DRAFT const char * U_EXPORT2
+ures_getUTF8StringByKey(const UResourceBundle *resB,
+ const char *key,
+ char *dest, int32_t *pLength,
+ UBool forceCopy,
+ UErrorCode *status);
+
#ifdef XP_CPLUSPLUS
#include "unicode/unistr.h"
@@ -598,12 +775,12 @@ U_NAMESPACE_BEGIN
/**
* returns a string from a string resource type
*
- * @param resB a resource
+ * @param resB a resource
* @param status: fills in the outgoing error code
* could be U_MISSING_RESOURCE_ERROR if the key is not found
* could be a non-failing error
* e.g.: U_USING_FALLBACK_WARNING,U_USING_DEFAULT_WARNING
- * @return an UnicodeString object. If there is an error, string is bogus
+ * @return a UnicodeString object. If there is an error, string is bogus
* @stable ICU 2.0
*/
inline UnicodeString
@@ -678,41 +855,16 @@ U_NAMESPACE_END
#endif
-
-/**
- * Get a resource with multi-level fallback. Normally only the top level resources will
- * fallback to its parent. This performs fallback on subresources. For example, when a table
- * is defined in a resource bundle and a parent resource bundle, normally no fallback occurs
- * on the sub-resources because the table is defined in the current resource bundle, but this
- * function can perform fallback on the sub-resources of the table.
- * @param resB a resource
- * @param inKey a key associated with the requested resource
- * @param fillIn if NULL a new UResourceBundle struct is allocated and must be deleted by the caller.
- * Alternatively, you can supply a struct to be filled by this function.
- * @param status: fills in the outgoing error code
- * could be U_MISSING_RESOURCE_ERROR if the key is not found
- * could be a non-failing error
- * e.g.: U_USING_FALLBACK_WARNING,U_USING_DEFAULT_WARNING
- * @return a pointer to a UResourceBundle struct. If fill in param was NULL, caller must delete it
- * @internal ICU 3.0
- */
-U_INTERNAL UResourceBundle* U_EXPORT2
-ures_getByKeyWithFallback(const UResourceBundle *resB,
- const char* inKey,
- UResourceBundle *fillIn,
- UErrorCode *status);
-
-
/**
* Create a string enumerator, owned by the caller, of all locales located within
* the specified resource tree.
- * @param path path to the tree, such as (NULL) or U_ICUDATA_ALIAS or or "ICUDATA-coll"
+ * @param packageName name of the tree, such as (NULL) or U_ICUDATA_ALIAS or or "ICUDATA-coll"
* This call is similar to uloc_getAvailable().
* @param status error code
- * @draft ICU 3.2
+ * @stable ICU 3.2
*/
-U_DRAFT UEnumeration* U_EXPORT2
-ures_openAvailableLocales(const char *path, UErrorCode *status);
+U_STABLE UEnumeration* U_EXPORT2
+ures_openAvailableLocales(const char *packageName, UErrorCode *status);
#endif /*_URES*/
diff --git a/icuSources/common/unicode/uscript.h b/icuSources/common/unicode/uscript.h
index f31d7480..d7cbc38e 100644
--- a/icuSources/common/unicode/uscript.h
+++ b/icuSources/common/unicode/uscript.h
@@ -1,6 +1,6 @@
/*
**********************************************************************
-* Copyright (C) 1997-2004, International Business Machines
+* Copyright (C) 1997-2006, International Business Machines
* Corporation and others. All Rights Reserved.
**********************************************************************
*
@@ -17,7 +17,28 @@
#include "unicode/utypes.h"
/**
- * Constants for Unicode script values from ScriptNames.txt .
+ * \file
+ * \brief C API: Unicode Script Information
+ */
+
+/**
+ * Constants for ISO 15924 script codes.
+ *
+ * Many of these script codes - those from Unicode's ScriptNames.txt -
+ * are character property values for Unicode's Script property.
+ * See UAX #24 Script Names (http://www.unicode.org/reports/tr24/).
+ *
+ * Starting with ICU 3.6, constants for most ISO 15924 script codes
+ * are included (currently excluding private-use codes Qaaa..Qabx).
+ * For scripts for which there are codes in ISO 15924 but which are not
+ * used in the Unicode Character Database (UCD), there are no Unicode characters
+ * associated with those scripts.
+ *
+ * For example, there are no characters that have a UCD script code of
+ * Hans or Hant. All Han ideographs have the Hani script code.
+ * The Hans and Hant script codes are used with CLDR data.
+ *
+ * ISO 15924 script codes are included for use with CLDR and similar.
*
* @stable ICU 2.2
*/
@@ -31,11 +52,11 @@ typedef enum UScriptCode {
USCRIPT_BOPOMOFO = 5, /* Bopo */
USCRIPT_CHEROKEE = 6, /* Cher */
USCRIPT_COPTIC = 7, /* Copt */
- USCRIPT_CYRILLIC = 8, /* Cyrl (Cyrs) */
+ USCRIPT_CYRILLIC = 8, /* Cyrl */
USCRIPT_DESERET = 9, /* Dsrt */
USCRIPT_DEVANAGARI = 10, /* Deva */
USCRIPT_ETHIOPIC = 11, /* Ethi */
- USCRIPT_GEORGIAN = 12, /* Geor (Geon, Geoa) */
+ USCRIPT_GEORGIAN = 12, /* Geor */
USCRIPT_GOTHIC = 13, /* Goth */
USCRIPT_GREEK = 14, /* Grek */
USCRIPT_GUJARATI = 15, /* Gujr */
@@ -48,7 +69,7 @@ typedef enum UScriptCode {
USCRIPT_KATAKANA = 22, /* Kana */
USCRIPT_KHMER = 23, /* Khmr */
USCRIPT_LAO = 24, /* Laoo */
- USCRIPT_LATIN = 25, /* Latn (Latf, Latg) */
+ USCRIPT_LATIN = 25, /* Latn */
USCRIPT_MALAYALAM = 26, /* Mlym */
USCRIPT_MONGOLIAN = 27, /* Mong */
USCRIPT_MYANMAR = 28, /* Mymr */
@@ -57,7 +78,7 @@ typedef enum UScriptCode {
USCRIPT_ORIYA = 31, /* Orya */
USCRIPT_RUNIC = 32, /* Runr */
USCRIPT_SINHALA = 33, /* Sinh */
- USCRIPT_SYRIAC = 34, /* Syrc (Syrj, Syrn, Syre) */
+ USCRIPT_SYRIAC = 34, /* Syrc */
USCRIPT_TAMIL = 35, /* Taml */
USCRIPT_TELUGU = 36, /* Telu */
USCRIPT_THAANA = 37, /* Thaa */
@@ -74,19 +95,74 @@ typedef enum UScriptCode {
USCRIPT_TAGBANWA = 45, /* Tagb */
/* New scripts in Unicode 4 @stable ICU 2.6 */
- USCRIPT_BRAILLE, /* Brai */
- USCRIPT_CYPRIOT, /* Cprt */
- USCRIPT_LIMBU, /* Limb */
- USCRIPT_LINEAR_B, /* Linb */
- USCRIPT_OSMANYA, /* Osma */
- USCRIPT_SHAVIAN, /* Shaw */
- USCRIPT_TAI_LE, /* Tale */
- USCRIPT_UGARITIC, /* Ugar */
+ USCRIPT_BRAILLE = 46, /* Brai */
+ USCRIPT_CYPRIOT = 47, /* Cprt */
+ USCRIPT_LIMBU = 48, /* Limb */
+ USCRIPT_LINEAR_B = 49, /* Linb */
+ USCRIPT_OSMANYA = 50, /* Osma */
+ USCRIPT_SHAVIAN = 51, /* Shaw */
+ USCRIPT_TAI_LE = 52, /* Tale */
+ USCRIPT_UGARITIC = 53, /* Ugar */
- /** New script code in Unicode 4.0.1 @draft ICU 3.0 */
- USCRIPT_KATAKANA_OR_HIRAGANA,/*Hrkt */
+ /** New script code in Unicode 4.0.1 @stable ICU 3.0 */
+ USCRIPT_KATAKANA_OR_HIRAGANA = 54,/*Hrkt */
+
+#ifndef U_HIDE_DRAFT_API
+ /* New scripts in Unicode 4.1 @draft ICU 3.4 */
+ USCRIPT_BUGINESE = 55, /* Bugi */
+ USCRIPT_GLAGOLITIC = 56, /* Glag */
+ USCRIPT_KHAROSHTHI = 57, /* Khar */
+ USCRIPT_SYLOTI_NAGRI = 58, /* Sylo */
+ USCRIPT_NEW_TAI_LUE = 59, /* Talu */
+ USCRIPT_TIFINAGH = 60, /* Tfng */
+ USCRIPT_OLD_PERSIAN = 61, /* Xpeo */
- USCRIPT_CODE_LIMIT
+ /* New script codes from ISO 15924 @draft ICU 3.6 */
+ USCRIPT_BALINESE = 62, /* Bali */
+ USCRIPT_BATAK = 63, /* Batk */
+ USCRIPT_BLISSYMBOLS = 64, /* Blis */
+ USCRIPT_BRAHMI = 65, /* Brah */
+ USCRIPT_CHAM = 66, /* Cham */
+ USCRIPT_CIRTH = 67, /* Cirt */
+ USCRIPT_OLD_CHURCH_SLAVONIC_CYRILLIC = 68, /* Cyrs */
+ USCRIPT_DEMOTIC_EGYPTIAN = 69, /* Egyd */
+ USCRIPT_HIERATIC_EGYPTIAN = 70, /* Egyh */
+ USCRIPT_EGYPTIAN_HIEROGLYPHS = 71, /* Egyp */
+ USCRIPT_KHUTSURI = 72, /* Geok */
+ USCRIPT_SIMPLIFIED_HAN = 73, /* Hans */
+ USCRIPT_TRADITIONAL_HAN = 74, /* Hant */
+ USCRIPT_PAHAWH_HMONG = 75, /* Hmng */
+ USCRIPT_OLD_HUNGARIAN = 76, /* Hung */
+ USCRIPT_HARAPPAN_INDUS = 77, /* Inds */
+ USCRIPT_JAVANESE = 78, /* Java */
+ USCRIPT_KAYAH_LI = 79, /* Kali */
+ USCRIPT_LATIN_FRAKTUR = 80, /* Latf */
+ USCRIPT_LATIN_GAELIC = 81, /* Latg */
+ USCRIPT_LEPCHA = 82, /* Lepc */
+ USCRIPT_LINEAR_A = 83, /* Lina */
+ USCRIPT_MANDAEAN = 84, /* Mand */
+ USCRIPT_MAYAN_HIEROGLYPHS = 85, /* Maya */
+ USCRIPT_MEROITIC = 86, /* Mero */
+ USCRIPT_NKO = 87, /* Nkoo */
+ USCRIPT_ORKHON = 88, /* Orkh */
+ USCRIPT_OLD_PERMIC = 89, /* Perm */
+ USCRIPT_PHAGS_PA = 90, /* Phag */
+ USCRIPT_PHOENICIAN = 91, /* Phnx */
+ USCRIPT_PHONETIC_POLLARD = 92, /* Plrd */
+ USCRIPT_RONGORONGO = 93, /* Roro */
+ USCRIPT_SARATI = 94, /* Sara */
+ USCRIPT_ESTRANGELO_SYRIAC = 95, /* Syre */
+ USCRIPT_WESTERN_SYRIAC = 96, /* Syrj */
+ USCRIPT_EASTERN_SYRIAC = 97, /* Syrn */
+ USCRIPT_TENGWAR = 98, /* Teng */
+ USCRIPT_VAI = 99, /* Vaii */
+ USCRIPT_VISIBLE_SPEECH = 100, /* Visp */
+ USCRIPT_CUNEIFORM = 101,/* Xsux */
+ USCRIPT_UNWRITTEN_LANGUAGES = 102,/* Zxxx */
+ USCRIPT_UNKNOWN = 103,/* Zzzz */ /* Unknown="Code for uncoded script", for unassigned code points */
+ /* Private use codes from Qaaa - Qabx are not supported*/
+#endif /* U_HIDE_DRAFT_API */
+ USCRIPT_CODE_LIMIT = 104
} UScriptCode;
/**
diff --git a/icuSources/common/unicode/uset.h b/icuSources/common/unicode/uset.h
index b82ceb8f..e6c7d3ec 100644
--- a/icuSources/common/unicode/uset.h
+++ b/icuSources/common/unicode/uset.h
@@ -1,7 +1,7 @@
/*
*******************************************************************************
*
-* Copyright (C) 2002-2004, International Business Machines
+* Copyright (C) 2002-2006, International Business Machines
* Corporation and others. All Rights Reserved.
*
*******************************************************************************
@@ -57,27 +57,39 @@ enum {
* will match 'a', 'A', 'b', and 'B'. "[^ab]" with this flag will
* match all except 'a', 'A', 'b', and 'B'. This performs a full
* closure over case mappings, e.g. U+017F for s.
+ *
+ * The resulting set is a superset of the input for the code points but
+ * not for the strings.
+ * It performs a case mapping closure of the code points and adds
+ * full case folding strings for the code points, and reduces strings of
+ * the original set to their full case folding equivalents.
+ *
+ * This is designed for case-insensitive matches, for example
+ * in regular expressions. The full code point case closure allows checking of
+ * an input character directly against the closure set.
+ * Strings are matched by comparing the case-folded form from the closure
+ * set with an incremental case folding of the string in question.
+ *
+ * The closure set will also contain single code points if the original
+ * set contained case-equivalent strings (like U+00DF for "ss" or "Ss" etc.).
+ * This is not necessary (that is, redundant) for the above matching method
+ * but results in the same closure sets regardless of whether the original
+ * set contained the code point or a string.
+ *
* @stable ICU 2.4
*/
USET_CASE_INSENSITIVE = 2,
- /**
- * Bitmask for UnicodeSet::closeOver() indicating letter case.
- * This may be ORed together with other selectors.
- * @internal
- */
- USET_CASE = 2,
-
/**
* Enable case insensitive matching. E.g., "[ab]" with this flag
* will match 'a', 'A', 'b', and 'B'. "[^ab]" with this flag will
* match all except 'a', 'A', 'b', and 'B'. This adds the lower-,
* title-, and uppercase mappings as well as the case folding
* of each existing element in the set.
- * @draft ICU 3.2
+ * @stable ICU 3.2
*/
USET_ADD_CASE_MAPPINGS = 4,
-
+
/**
* Enough for any single-code point set
* @internal
@@ -173,9 +185,9 @@ uset_close(USet* set);
* @param set the object to set to the given range
* @param start first character in the set, inclusive
* @param end last character in the set, inclusive
- * @draft ICU 3.2
+ * @stable ICU 3.2
*/
-U_DRAFT void U_EXPORT2
+U_STABLE void U_EXPORT2
uset_set(USet* set,
UChar32 start, UChar32 end);
@@ -197,9 +209,9 @@ uset_set(USet* set,
* If the status code indicates failure, then the return value
* is the index of the error in the source.
*
- * @draft ICU 2.8
+ * @stable ICU 2.8
*/
-U_DRAFT int32_t U_EXPORT2
+U_STABLE int32_t U_EXPORT2
uset_applyPattern(USet *set,
const UChar *pattern, int32_t patternLength,
uint32_t options,
@@ -224,9 +236,9 @@ uset_applyPattern(USet *set,
*
* @param ec error code input/output parameter
*
- * @draft ICU 3.2
+ * @stable ICU 3.2
*/
-U_DRAFT void U_EXPORT2
+U_STABLE void U_EXPORT2
uset_applyIntPropertyValue(USet* set,
UProperty prop, int32_t value, UErrorCode* ec);
@@ -246,7 +258,8 @@ uset_applyIntPropertyValue(USet* set,
* matched loosely and correspond to the following sets:
*
* "ANY" = [\\u0000-\\U0010FFFF],
- * "ASCII" = [\\u0000-\\u007F].
+ * "ASCII" = [\\u0000-\\u007F],
+ * "Assigned" = [:^Cn:].
*
* @param propLength the length of the prop, or -1 if NULL
*
@@ -261,9 +274,9 @@ uset_applyIntPropertyValue(USet* set,
*
* @param ec error code input/output parameter
*
- * @draft ICU 3.2
+ * @stable ICU 3.2
*/
-U_DRAFT void U_EXPORT2
+U_STABLE void U_EXPORT2
uset_applyPropertyAlias(USet* set,
const UChar *prop, int32_t propLength,
const UChar *value, int32_t valueLength,
@@ -276,9 +289,9 @@ uset_applyPropertyAlias(USet* set,
* @param pattern a string specifying the pattern
* @param patternLength the length of the pattern, or -1 if NULL
* @param pos the given position
- * @draft ICU 3.2
+ * @stable ICU 3.2
*/
-U_DRAFT UBool U_EXPORT2
+U_STABLE UBool U_EXPORT2
uset_resemblesPattern(const UChar *pattern, int32_t patternLength,
int32_t pos);
@@ -349,6 +362,17 @@ uset_addRange(USet* set, UChar32 start, UChar32 end);
U_STABLE void U_EXPORT2
uset_addString(USet* set, const UChar* str, int32_t strLen);
+/**
+ * Adds each of the characters in this string to the set. Thus "ch" => {"c", "h"}
+ * If this set already any particular character, it has no effect on that character.
+ * @param set the object to which to add the character
+ * @param str the source string
+ * @param strLen the length of the string or -1 if null terminated.
+ * @draft ICU 3.4
+ */
+U_DRAFT void U_EXPORT2
+uset_addAllCodePoints(USet* set, const UChar *str, int32_t strLen);
+
/**
* Removes the given character from the given USet. After this call,
* uset_contains(set, c) will return FALSE.
@@ -389,9 +413,9 @@ uset_removeString(USet* set, const UChar* str, int32_t strLen);
* @param set the object from which the elements are to be removed
* @param removeSet the object that defines which elements will be
* removed from this set
- * @draft ICU 3.2
+ * @stable ICU 3.2
*/
-U_DRAFT void U_EXPORT2
+U_STABLE void U_EXPORT2
uset_removeAll(USet* set, const USet* removeSet);
/**
@@ -405,9 +429,9 @@ uset_removeAll(USet* set, const USet* removeSet);
* to this set.
* @param end last character, inclusive, of range to be retained
* to this set.
- * @draft ICU 3.2
+ * @stable ICU 3.2
*/
-U_DRAFT void U_EXPORT2
+U_STABLE void U_EXPORT2
uset_retain(USet* set, UChar32 start, UChar32 end);
/**
@@ -419,9 +443,9 @@ uset_retain(USet* set, UChar32 start, UChar32 end);
*
* @param set the object on which to perform the retain
* @param retain set that defines which elements this set will retain
- * @draft ICU 3.2
+ * @stable ICU 3.2
*/
-U_DRAFT void U_EXPORT2
+U_STABLE void U_EXPORT2
uset_retainAll(USet* set, const USet* retain);
/**
@@ -429,9 +453,9 @@ uset_retainAll(USet* set, const USet* retain);
* possible space, without changing this object's value.
*
* @param set the object on which to perfrom the compact
- * @draft ICU 3.2
+ * @stable ICU 3.2
*/
-U_DRAFT void U_EXPORT2
+U_STABLE void U_EXPORT2
uset_compact(USet* set);
/**
@@ -452,9 +476,9 @@ uset_complement(USet* set);
* @param set the set with which to complement
* @param complement set that defines which elements will be xor'ed
* from this set.
- * @draft ICU 3.2
+ * @stable ICU 3.2
*/
-U_DRAFT void U_EXPORT2
+U_STABLE void U_EXPORT2
uset_complementAll(USet* set, const USet* complement);
/**
@@ -517,9 +541,9 @@ uset_containsString(const USet* set, const UChar* str, int32_t strLen);
* @param set the set
* @param c the character to obtain the index for
* @return an index from 0..size()-1, or -1
- * @draft ICU 3.2
+ * @stable ICU 3.2
*/
-U_DRAFT int32_t U_EXPORT2
+U_STABLE int32_t U_EXPORT2
uset_indexOf(const USet* set, UChar32 c);
/**
@@ -530,9 +554,9 @@ uset_indexOf(const USet* set, UChar32 c);
* @param set the set
* @param index an index from 0..size()-1 to obtain the char for
* @return the character at the given index, or (UChar32)-1.
- * @draft ICU 3.2
+ * @stable ICU 3.2
*/
-U_DRAFT UChar32 U_EXPORT2
+U_STABLE UChar32 U_EXPORT2
uset_charAt(const USet* set, int32_t index);
/**
@@ -583,24 +607,37 @@ uset_getItem(const USet* set, int32_t itemIndex,
/**
* Returns true if set1 contains all the characters and strings
- * of set2. It answers the question, 'Is set1 a subset of set2?'
+ * of set2. It answers the question, 'Is set1 a superset of set2?'
* @param set1 set to be checked for containment
* @param set2 set to be checked for containment
* @return true if the test condition is met
- * @draft ICU 3.2
+ * @stable ICU 3.2
*/
-U_DRAFT UBool U_EXPORT2
+U_STABLE UBool U_EXPORT2
uset_containsAll(const USet* set1, const USet* set2);
+/**
+ * Returns true if this set contains all the characters
+ * of the given string. This is does not check containment of grapheme
+ * clusters, like uset_containsString.
+ * @param set set of characters to be checked for containment
+ * @param str string containing codepoints to be checked for containment
+ * @param strLen the length of the string or -1 if null terminated.
+ * @return true if the test condition is met
+ * @draft ICU 3.4
+ */
+U_DRAFT UBool U_EXPORT2
+uset_containsAllCodePoints(const USet* set, const UChar *str, int32_t strLen);
+
/**
* Returns true if set1 contains none of the characters and strings
* of set2. It answers the question, 'Is set1 a disjoint set of set2?'
* @param set1 set to be checked for containment
* @param set2 set to be checked for containment
* @return true if the test condition is met
- * @draft ICU 3.2
+ * @stable ICU 3.2
*/
-U_DRAFT UBool U_EXPORT2
+U_STABLE UBool U_EXPORT2
uset_containsNone(const USet* set1, const USet* set2);
/**
@@ -609,9 +646,9 @@ uset_containsNone(const USet* set1, const USet* set2);
* @param set1 set to be checked for containment
* @param set2 set to be checked for containment
* @return true if the test condition is met
- * @draft ICU 3.2
+ * @stable ICU 3.2
*/
-U_DRAFT UBool U_EXPORT2
+U_STABLE UBool U_EXPORT2
uset_containsSome(const USet* set1, const USet* set2);
/**
@@ -620,9 +657,9 @@ uset_containsSome(const USet* set1, const USet* set2);
* @param set1 set to be checked for containment
* @param set2 set to be checked for containment
* @return true if the test condition is met
- * @draft ICU 3.2
+ * @stable ICU 3.2
*/
-U_DRAFT UBool U_EXPORT2
+U_STABLE UBool U_EXPORT2
uset_equals(const USet* set1, const USet* set2);
/*********************************************************************
diff --git a/icuSources/common/unicode/usetiter.h b/icuSources/common/unicode/usetiter.h
index 9584b748..defa75cd 100644
--- a/icuSources/common/unicode/usetiter.h
+++ b/icuSources/common/unicode/usetiter.h
@@ -1,6 +1,6 @@
/*
**********************************************************************
-* Copyright (c) 2002-2004, International Business Machines
+* Copyright (c) 2002-2006, International Business Machines
* Corporation and others. All Rights Reserved.
**********************************************************************
*/
@@ -11,30 +11,40 @@
#include "unicode/uobject.h"
#include "unicode/unistr.h"
+/**
+ * \file
+ * \brief C++ API: UnicodeSetIterator iterates over the contents of a UnicodeSet.
+ */
+
U_NAMESPACE_BEGIN
class UnicodeSet;
class UnicodeString;
/**
+ *
* UnicodeSetIterator iterates over the contents of a UnicodeSet. It
* iterates over either code points or code point ranges. After all
* code points or ranges have been returned, it returns the
* multicharacter strings of the UnicodSet, if any.
*
- *
To iterate over code points, use a loop like this:
+ * This class is not intended to be subclassed. Consider any fields
+ * or methods declared as "protected" to be private. The use of
+ * protected in this class is an artifact of history.
+ *
+ *
To iterate over code points and strings, use a loop like this:
*
* UnicodeSetIterator it(set);
* while (set.next()) {
- * if (set.isString()) {
- * processString(set.getString());
- * } else {
- * processCodepoint(set.getCodepoint());
- * }
+ * processItem(set.getString());
* }
*
+ * Each item in the set is accessed as a string. Set elements
+ * consisting of single code points are returned as strings containing
+ * just the one code point.
*
- *
To iterate over code point ranges, use a loop like this:
+ *
To iterate over code point ranges, instead of individual code points,
+ * use a loop like this:
*
* UnicodeSetIterator it(set);
* while (it.nextRange()) {
@@ -115,9 +125,14 @@ class U_COMMON_API UnicodeSetIterator : public UObject {
* caller can retrieve it with getString(). If this
* method returns false, the current element is a code point or
* code point range, depending on whether next() or
- * nextRange() was called, and the caller can retrieve it
- * with getCodepoint() and, for a range,
- * getCodepointEnd().
+ * nextRange() was called.
+ * Elements of types string and codepoint can both be retrieved
+ * with the function getString().
+ * Elements of type codepoint can also be retrieved with
+ * getCodepoint().
+ * For ranges, getCodepoint() returns the starting codepoint
+ * of the range, and getCodepointEnd() returns the end
+ * of the range.
* @stable ICU 2.4
*/
inline UBool isString() const;
@@ -139,28 +154,37 @@ class U_COMMON_API UnicodeSetIterator : public UObject {
/**
* Returns the current string, if isString() returned
- * true. Otherwise returns an undefined result.
+ * true. If the current iteration item is a code point, a UnicodeString
+ * containing that single code point is returned.
+ *
+ * Ownership of the returned string remains with the iterator.
+ * The string is guaranteed to remain valid only until the iterator is
+ * advanced to the next item, or until the iterator is deleted.
+ *
* @stable ICU 2.4
*/
- inline const UnicodeString& getString() const;
+ const UnicodeString& getString();
/**
- * Returns the next element in the set, either a single code point
- * or a string. If there are no more elements in the set, return
- * false. If codepoint == IS_STRING, the value is a
- * string in the string field. Otherwise the value is a
- * single code point in the codepoint field.
+ * Advances the iteration position to the next element in the set,
+ * which can be either a single code point or a string.
+ * If there are no more elements in the set, return false.
+ *
+ *
+ * If isString() == TRUE, the value is a
+ * string, otherwise the value is a
+ * single code point. Elements of either type can be retrieved
+ * with the function getString(), while elements of
+ * consisting of a single code point can be retrieved with
+ * getCodepoint()
*
*
The order of iteration is all code points in sorted order,
- * followed by all strings sorted order. codepointEnd is
- * undefined after calling this method. string is
- * undefined unless codepoint == IS_STRING. Do not mix
+ * followed by all strings sorted order. Do not mix
* calls to next() and nextRange() without
* calling reset() between them. The results of doing so
* are undefined.
*
- * @return true if there was another element in the set and this
- * object contains the element.
+ * @return true if there was another element in the set.
* @stable ICU 2.4
*/
UBool next();
@@ -168,21 +192,20 @@ class U_COMMON_API UnicodeSetIterator : public UObject {
/**
* Returns the next element in the set, either a code point range
* or a string. If there are no more elements in the set, return
- * false. If codepoint == IS_STRING, the value is a
- * string in the string field. Otherwise the value is a
- * range of one or more code points from codepoint to
- * codepointeEnd inclusive.
+ * false. If isString() == TRUE, the value is a
+ * string and can be accessed with getString(). Otherwise the value is a
+ * range of one or more code points from getCodepoint() to
+ * getCodepointeEnd() inclusive.
*
*
The order of iteration is all code points ranges in sorted
* order, followed by all strings sorted order. Ranges are
- * disjoint and non-contiguous. string is undefined
- * unless codepoint == IS_STRING. Do not mix calls to
+ * disjoint and non-contiguous. The value returned from getString()
+ * is undefined unless isString() == TRUE. Do not mix calls to
* next() and nextRange() without calling
* reset() between them. The results of doing so are
* undefined.
*
- * @return true if there was another element in the set and this
- * object contains the element.
+ * @return true if there was another element in the set.
* @stable ICU 2.4
*/
UBool nextRange();
@@ -253,6 +276,13 @@ class U_COMMON_API UnicodeSetIterator : public UObject {
*/
int32_t stringCount;
+ /**
+ * Points to the string to use when the caller asks for a
+ * string and the current iteration item is a code point, not a string.
+ * @internal
+ */
+ UnicodeString *cpString;
+
/** Copy constructor. Disallowed.
* @stable ICU 2.4
*/
@@ -282,9 +312,6 @@ inline UChar32 UnicodeSetIterator::getCodepointEnd() const {
return codepointEnd;
}
-inline const UnicodeString& UnicodeSetIterator::getString() const {
- return *string;
-}
U_NAMESPACE_END
diff --git a/icuSources/common/unicode/usprep.h b/icuSources/common/unicode/usprep.h
index 5bedc11f..c7e75a53 100644
--- a/icuSources/common/unicode/usprep.h
+++ b/icuSources/common/unicode/usprep.h
@@ -1,7 +1,7 @@
/*
*******************************************************************************
*
- * Copyright (C) 2003-2004, International Business Machines
+ * Copyright (C) 2003-2006, International Business Machines
* Corporation and others. All Rights Reserved.
*
*******************************************************************************
@@ -17,9 +17,14 @@
#ifndef __USPREP_H__
#define __USPREP_H__
+/**
+ * \file
+ * \brief C API: Implements the StringPrep algorithm.
+ */
+
#include "unicode/utypes.h"
/**
- *\file
+ *
* StringPrep API implements the StingPrep framework as described by RFC 3454.
* StringPrep prepares Unicode strings for use in network protocols.
* Profiles of StingPrep are set of rules and data according to with the
@@ -54,11 +59,9 @@
#include "unicode/parseerr.h"
-#ifndef U_HIDE_DRAFT_API
-
/**
* The StringPrep profile
- * @draft ICU 2.8
+ * @stable ICU 2.8
*/
typedef struct UStringPrepProfile UStringPrepProfile;
@@ -67,7 +70,7 @@ typedef struct UStringPrepProfile UStringPrepProfile;
* Option to prohibit processing of unassigned code points in the input
*
* @see usprep_prepare
- * @draft ICU 2.8
+ * @stable ICU 2.8
*/
#define USPREP_DEFAULT 0x0000
@@ -75,13 +78,11 @@ typedef struct UStringPrepProfile UStringPrepProfile;
* Option to allow processing of unassigned code points in the input
*
* @see usprep_prepare
- * @draft ICU 2.8
+ * @stable ICU 2.8
*/
#define USPREP_ALLOW_UNASSIGNED 0x0001
-#endif /*U_HIDE_DRAFT_API*/
-
/**
* Creates a StringPrep profile from the data file.
*
@@ -95,9 +96,9 @@ typedef struct UStringPrepProfile UStringPrepProfile;
* @return Pointer to UStringPrepProfile that is opened. Should be closed by
* calling usprep_close()
* @see usprep_close()
- * @draft ICU 2.8
+ * @stable ICU 2.8
*/
-U_DRAFT UStringPrepProfile* U_EXPORT2
+U_STABLE UStringPrepProfile* U_EXPORT2
usprep_open(const char* path,
const char* fileName,
UErrorCode* status);
@@ -106,9 +107,9 @@ usprep_open(const char* path,
/**
* Closes the profile
* @param profile The profile to close
- * @draft ICU 2.8
+ * @stable ICU 2.8
*/
-U_DRAFT void U_EXPORT2
+U_STABLE void U_EXPORT2
usprep_close(UStringPrepProfile* profile);
@@ -138,10 +139,10 @@ usprep_close(UStringPrepProfile* profile);
* too many code points.
* U_BUFFER_OVERFLOW_ERROR if destCapacity is not enough
* @return The number of UChars in the destination buffer
- * @draft ICU 2.8
+ * @stable ICU 2.8
*/
-U_DRAFT int32_t U_EXPORT2
+U_STABLE int32_t U_EXPORT2
usprep_prepare( const UStringPrepProfile* prep,
const UChar* src, int32_t srcLength,
UChar* dest, int32_t destCapacity,
diff --git a/icuSources/common/unicode/ustring.h b/icuSources/common/unicode/ustring.h
index 6ebb6fbe..4777c269 100644
--- a/icuSources/common/unicode/ustring.h
+++ b/icuSources/common/unicode/ustring.h
@@ -1,6 +1,6 @@
/*
**********************************************************************
-* Copyright (C) 1998-2004, International Business Machines
+* Copyright (C) 1998-2006, International Business Machines
* Corporation and others. All Rights Reserved.
**********************************************************************
*
@@ -65,11 +65,15 @@
* their occurrence is rare. Almost all characters in modern use require only
* a single UChar code unit (i.e., their code point values are <=0xffff).
*
- * For more details see the User Guide Strings chapter (http://oss.software.ibm.com/icu/userguide/strings.html).
+ * For more details see the User Guide Strings chapter (http://icu.sourceforge.net/userguide/strings.html).
* For a discussion of the handling of unpaired surrogates see also
* Jitterbug 2145 and its icu mailing list proposal on 2002-sep-18.
*/
+/**
+* \defgroup ustring_ustrlen
+ */
+/*@{*/
/**
* Determine the length of an array of UChar.
*
@@ -79,6 +83,7 @@
*/
U_STABLE int32_t U_EXPORT2
u_strlen(const UChar *s);
+/*@}*/
/**
* Count Unicode code points in the length UChar code units of the string.
@@ -898,22 +903,22 @@ u_memrchr32(const UChar *s, UChar32 c, int32_t count);
*
* Usage:
*
- * U_STRING_DECL(ustringVar1, "Quick-Fox 2", 11);
- * U_STRING_DECL(ustringVar2, "jumps 5%", 8);
- * static UBool didInit=FALSE;
- *
- * int32_t function() {
- * if(!didInit) {
- * U_STRING_INIT(ustringVar1, "Quick-Fox 2", 11);
- * U_STRING_INIT(ustringVar2, "jumps 5%", 8);
- * didInit=TRUE;
- * }
- * return u_strcmp(ustringVar1, ustringVar2);
- * }
+ * U_STRING_DECL(ustringVar1, "Quick-Fox 2", 11);
+ * U_STRING_DECL(ustringVar2, "jumps 5%", 8);
+ * static UBool didInit=FALSE;
+ *
+ * int32_t function() {
+ * if(!didInit) {
+ * U_STRING_INIT(ustringVar1, "Quick-Fox 2", 11);
+ * U_STRING_INIT(ustringVar2, "jumps 5%", 8);
+ * didInit=TRUE;
+ * }
+ * return u_strcmp(ustringVar1, ustringVar2);
+ * }
*
* @stable ICU 2.0
*/
-#if U_SIZEOF_WCHAR_T==U_SIZEOF_UCHAR && U_CHARSET_FAMILY==U_ASCII_FAMILY
+#if U_SIZEOF_WCHAR_T==U_SIZEOF_UCHAR && (U_CHARSET_FAMILY==U_ASCII_FAMILY || (U_SIZEOF_UCHAR == 2 && defined(U_WCHAR_IS_UTF16)))
# define U_STRING_DECL(var, cs, length) static const wchar_t var[(length)+1]={ L ## cs }
/**@stable ICU 2.0 */
# define U_STRING_INIT(var, cs, length)
@@ -1157,6 +1162,7 @@ u_strFoldCase(UChar *dest, int32_t destCapacity,
uint32_t options,
UErrorCode *pErrorCode);
+#if defined(U_WCHAR_IS_UTF16) || defined(U_WCHAR_IS_UTF32) || !UCONFIG_NO_CONVERSION
/**
* Converts a sequence of UChars to wchar_t units.
*
@@ -1209,6 +1215,8 @@ u_strFromWCS(UChar *dest,
const wchar_t *src,
int32_t srcLength,
UErrorCode *pErrorCode);
+#endif /* defined(U_WCHAR_IS_UTF16) || defined(U_WCHAR_IS_UTF32) || !UCONFIG_NO_CONVERSION */
+
/**
* Converts a sequence of UChars (UTF-16) to UTF-8 bytes
*
@@ -1227,6 +1235,8 @@ u_strFromWCS(UChar *dest,
* which must not indicate a failure before the function call.
* @return The pointer to destination buffer.
* @stable ICU 2.0
+ * @see u_strToUTF8WithSub
+ * @see u_strFromUTF8
*/
U_STABLE char* U_EXPORT2
u_strToUTF8(char *dest,
@@ -1254,6 +1264,8 @@ u_strToUTF8(char *dest,
* which must not indicate a failure before the function call.
* @return The pointer to destination buffer.
* @stable ICU 2.0
+ * @see u_strFromUTF8WithSub
+ * @see u_strFromUTF8Lenient
*/
U_STABLE UChar* U_EXPORT2
u_strFromUTF8(UChar *dest,
@@ -1263,6 +1275,148 @@ u_strFromUTF8(UChar *dest,
int32_t srcLength,
UErrorCode *pErrorCode);
+/**
+ * Converts a sequence of UChars (UTF-16) to UTF-8 bytes.
+ * Same as u_strToUTF8() except for the additional subchar which is output for
+ * illegal input sequences, instead of stopping with the U_INVALID_CHAR_FOUND error code.
+ * With subchar==U_SENTINEL, this function behaves exactly like u_strToUTF8().
+ *
+ * @param dest A buffer for the result string. The result will be zero-terminated if
+ * the buffer is large enough.
+ * @param destCapacity The size of the buffer (number of chars). If it is 0, then
+ * dest may be NULL and the function will only return the length of the
+ * result without writing any of the result string (pre-flighting).
+ * @param pDestLength A pointer to receive the number of units written to the destination. If
+ * pDestLength!=NULL then *pDestLength is always set to the
+ * number of output units corresponding to the transformation of
+ * all the input units, even in case of a buffer overflow.
+ * @param src The original source string
+ * @param srcLength The length of the original string. If -1, then src must be zero-terminated.
+ * @param subchar The substitution character to use in place of an illegal input sequence,
+ * or U_SENTINEL if the function is to return with U_INVALID_CHAR_FOUND instead.
+ * A substitution character can be any valid Unicode code point (up to U+10FFFF)
+ * except for surrogate code points (U+D800..U+DFFF).
+ * The recommended value is U+FFFD "REPLACEMENT CHARACTER".
+ * @param pNumSubstitutions Output parameter receiving the number of substitutions if subchar>=0.
+ * Set to 0 if no substitutions occur or subchar<0.
+ * pNumSubstitutions can be NULL.
+ * @param pErrorCode Pointer to a standard ICU error code. Its input value must
+ * pass the U_SUCCESS() test, or else the function returns
+ * immediately. Check for U_FAILURE() on output or use with
+ * function chaining. (See User Guide for details.)
+ * @return The pointer to destination buffer.
+ * @see u_strToUTF8
+ * @see u_strFromUTF8WithSub
+ * @draft ICU 3.6
+ */
+U_DRAFT char* U_EXPORT2
+u_strToUTF8WithSub(char *dest,
+ int32_t destCapacity,
+ int32_t *pDestLength,
+ const UChar *src,
+ int32_t srcLength,
+ UChar32 subchar, int32_t *pNumSubstitutions,
+ UErrorCode *pErrorCode);
+
+/**
+ * Converts a sequence of UTF-8 bytes to UChars (UTF-16).
+ * Same as u_strFromUTF8() except for the additional subchar which is output for
+ * illegal input sequences, instead of stopping with the U_INVALID_CHAR_FOUND error code.
+ * With subchar==U_SENTINEL, this function behaves exactly like u_strFromUTF8().
+ *
+ * @param dest A buffer for the result string. The result will be zero-terminated if
+ * the buffer is large enough.
+ * @param destCapacity The size of the buffer (number of UChars). If it is 0, then
+ * dest may be NULL and the function will only return the length of the
+ * result without writing any of the result string (pre-flighting).
+ * @param pDestLength A pointer to receive the number of units written to the destination. If
+ * pDestLength!=NULL then *pDestLength is always set to the
+ * number of output units corresponding to the transformation of
+ * all the input units, even in case of a buffer overflow.
+ * @param src The original source string
+ * @param srcLength The length of the original string. If -1, then src must be zero-terminated.
+ * @param subchar The substitution character to use in place of an illegal input sequence,
+ * or U_SENTINEL if the function is to return with U_INVALID_CHAR_FOUND instead.
+ * A substitution character can be any valid Unicode code point (up to U+10FFFF)
+ * except for surrogate code points (U+D800..U+DFFF).
+ * The recommended value is U+FFFD "REPLACEMENT CHARACTER".
+ * @param pNumSubstitutions Output parameter receiving the number of substitutions if subchar>=0.
+ * Set to 0 if no substitutions occur or subchar<0.
+ * pNumSubstitutions can be NULL.
+ * @param pErrorCode Pointer to a standard ICU error code. Its input value must
+ * pass the U_SUCCESS() test, or else the function returns
+ * immediately. Check for U_FAILURE() on output or use with
+ * function chaining. (See User Guide for details.)
+ * @return The pointer to destination buffer.
+ * @see u_strFromUTF8
+ * @see u_strFromUTF8Lenient
+ * @see u_strToUTF8WithSub
+ * @draft ICU 3.6
+ */
+U_DRAFT UChar* U_EXPORT2
+u_strFromUTF8WithSub(UChar *dest,
+ int32_t destCapacity,
+ int32_t *pDestLength,
+ const char *src,
+ int32_t srcLength,
+ UChar32 subchar, int32_t *pNumSubstitutions,
+ UErrorCode *pErrorCode);
+
+/**
+ * Converts a sequence of UTF-8 bytes to UChars (UTF-16).
+ * Same as u_strFromUTF8() except that this function is designed to be very fast,
+ * which it achieves by being lenient about malformed UTF-8 sequences.
+ * This function is intended for use in environments where UTF-8 text is
+ * expected to be well-formed.
+ *
+ * Its semantics are:
+ * - Well-formed UTF-8 text is correctly converted to well-formed UTF-16 text.
+ * - The function will not read beyond the input string, nor write beyond
+ * the destCapacity.
+ * - Malformed UTF-8 results in "garbage" 16-bit Unicode strings which may not
+ * be well-formed UTF-16.
+ * The function will resynchronize to valid code point boundaries
+ * within a small number of code points after an illegal sequence.
+ * - Non-shortest forms are not detected and will result in "spoofing" output.
+ *
+ * For further performance improvement, if srcLength is given (>=0),
+ * then it must be destCapacity>=srcLength.
+ *
+ * @param dest A buffer for the result string. The result will be zero-terminated if
+ * the buffer is large enough.
+ * @param destCapacity The size of the buffer (number of UChars). If it is 0, then
+ * dest may be NULL and the function will only return the length of the
+ * result without writing any of the result string (pre-flighting).
+ * Unlike for other ICU functions, if srcLength>=0 then it
+ * must be destCapacity>=srcLength.
+ * @param pDestLength A pointer to receive the number of units written to the destination. If
+ * pDestLength!=NULL then *pDestLength is always set to the
+ * number of output units corresponding to the transformation of
+ * all the input units, even in case of a buffer overflow.
+ * Unlike for other ICU functions, if srcLength>=0 but
+ * destCapacityIterating over text
+ *
+ * Here is sample code for a forward iteration over the contents of a UText
+ *
+ * \code
+ * UChar32 c;
+ * UText *ut = whatever();
+ *
+ * for (c=utext_next32From(ut, 0); c>=0; c=utext_next32(ut)) {
+ * // do whatever with the codepoint c here.
+ * }
+ * \endcode
+ *
+ * And here is similar code to iterate in the reverse direction, from the end
+ * of the text towards the beginning.
+ *
+ * \code
+ * UChar32 c;
+ * UText *ut = whatever();
+ * int textLength = utext_nativeLength(ut);
+ * for (c=utext_previous32From(ut, textLength); c>=0; c=utext_previous32(ut)) {
+ * // do whatever with the codepoint c here.
+ * }
+ * \endcode
+ *
+ * Characters and Indexing
+ *
+ * Indexing into text by UText functions is nearly always in terms of the native
+ * indexing of the underlying text storage. The storage format could be UTF-8
+ * or UTF-32, for example. When coding to the UText access API, no assumptions
+ * can be made regarding the size of characters, or how far an index
+ * may move when iterating between characters.
+ *
+ * All indices supplied to UText functions are pinned to the length of the
+ * text. An out-of-bounds index is not considered to be an error, but is
+ * adjusted to be in the range 0 <= index <= length of input text.
+ *
+ *
+ * When an index position is returned from a UText function, it will be
+ * a native index to the underlying text. In the case of multi-unit characters,
+ * it will always refer to the first position of the character,
+ * never to the interior. This is essentially the same thing as saying that
+ * a returned index will always point to a boundary between characters.
+ *
+ * When a native index is supplied to a UText function, all indices that
+ * refer to any part of a multi-unit character representation are considered
+ * to be equivalent. In the case of multi-unit characters, an incoming index
+ * will be logically normalized to refer to the start of the character.
+ *
+ * It is possible to test whether a native index is on a code point boundary
+ * by doing a utext_setNativeIndex() followed by a utext_getNativeIndex().
+ * If the index is returned unchanged, it was on a code point boundary. If
+ * an adjusted index is returned, the original index referred to the
+ * interior of a character.
+ *
+ * Conventions for calling UText functions
+ *
+ * Most UText access functions have as their first parameter a (UText *) pointer,
+ * which specifies the UText to be used. Unless otherwise noted, the
+ * pointer must refer to a valid, open UText. Attempting to
+ * use a closed UText or passing a NULL pointer is a programming error and
+ * will produce undefined results or NULL pointer exceptions.
+ *
+ * The UText_Open family of functions can either open an existing (closed)
+ * UText, or heap allocate a new UText. Here is sample code for creating
+ * a stack-allocated UText.
+ *
+ * \code
+ * char *s = whatever(); // A utf-8 string
+ * U_ErrorCode status = U_ZERO_ERROR;
+ * UText ut = UTEXT_INITIALIZER;
+ * utext_openUTF8(ut, s, -1, &status);
+ * if (U_FAILURE(status)) {
+ * // error handling
+ * } else {
+ * // work with the UText
+ * }
+ * \endcode
+ *
+ * Any existing UText passed to an open function _must_ have been initialized,
+ * either by the UTEXT_INITIALIZER, or by having been originally heap-allocated
+ * by an open function. Passing NULL will cause the open function to
+ * heap-allocate and fully initialize a new UText.
+ *
+ */
+
+
+
+#include "unicode/utypes.h"
+#ifdef XP_CPLUSPLUS
+#include "unicode/rep.h"
+#include "unicode/unistr.h"
+#include "unicode/chariter.h"
+#endif
+
+
+U_CDECL_BEGIN
+
+struct UText;
+typedef struct UText UText; /**< C typedef for struct UText. @draft ICU 3.6 */
+
+
+/***************************************************************************************
+ *
+ * C Functions for creating UText wrappers around various kinds of text strings.
+ *
+ ****************************************************************************************/
+
+
+/**
+ * Close function for UText instances.
+ * Cleans up, releases any resources being held by an open UText.
+ *
+ * If the UText was originally allocated by one of the utext_open functions,
+ * the storage associated with the utext will also be freed.
+ * If the UText storage originated with the application, as it would with
+ * a local or static instance, the storage will not be deleted.
+ *
+ * An open UText can be reset to refer to new string by using one of the utext_open()
+ * functions without first closing the UText.
+ *
+ * @param ut The UText to be closed.
+ * @return NULL if the UText struct was deleted by the close. If the UText struct
+ * was originally provided by the caller to the open function, it is
+ * returned by this function, and may be safely used again in
+ * a subsequent utext_open.
+ *
+ * @draft ICU 3.4
+ */
+U_DRAFT UText * U_EXPORT2
+utext_close(UText *ut);
+
+
+/**
+ * Open a read-only UText implementation for UTF-8 strings.
+ *
+ * \htmlonly
+ * Any invalid UTF-8 in the input will be handled in this way:
+ * a sequence of bytes that has the form of a truncated, but otherwise valid,
+ * UTF-8 sequence will be replaced by a single unicode replacement character, \uFFFD.
+ * Any other illegal bytes will each be replaced by a \uFFFD.
+ * \endhtmlonly
+ *
+ * @param ut Pointer to a UText struct. If NULL, a new UText will be created.
+ * If non-NULL, must refer to an initialized UText struct, which will then
+ * be reset to reference the specified UTF-8 string.
+ * @param s A UTF-8 string. Must not be NULL.
+ * @param length The length of the UTF-8 string in bytes, or -1 if the string is
+ * zero terminated.
+ * @param status Errors are returned here.
+ * @return A pointer to the UText. If a pre-allocated UText was provided, it
+ * will always be used and returned.
+ * @draft ICU 3.4
+ */
+U_DRAFT UText * U_EXPORT2
+utext_openUTF8(UText *ut, const char *s, int64_t length, UErrorCode *status);
+
+
+/**
+ * Open a read-only UText for UChar * string.
+ *
+ * @param ut Pointer to a UText struct. If NULL, a new UText will be created.
+ * If non-NULL, must refer to an initialized UText struct, which will then
+ * be reset to reference the specified UChar string.
+ * @param s A UChar (UTF-16) string
+ * @param length The number of UChars in the input string, or -1 if the string is
+ * zero terminated.
+ * @param status Errors are returned here.
+ * @return A pointer to the UText. If a pre-allocated UText was provided, it
+ * will always be used and returned.
+ * @draft ICU 3.4
+ */
+U_DRAFT UText * U_EXPORT2
+utext_openUChars(UText *ut, const UChar *s, int64_t length, UErrorCode *status);
+
+
+#ifdef XP_CPLUSPLUS
+/**
+ * Open a writable UText for a non-const UnicodeString.
+ *
+ * @param ut Pointer to a UText struct. If NULL, a new UText will be created.
+ * If non-NULL, must refer to an initialized UText struct, which will then
+ * be reset to reference the specified input string.
+ * @param s A UnicodeString.
+ * @param status Errors are returned here.
+ * @return Pointer to the UText. If a UText was supplied as input, this
+ * will always be used and returned.
+ * @draft ICU 3.4
+ */
+U_DRAFT UText * U_EXPORT2
+utext_openUnicodeString(UText *ut, UnicodeString *s, UErrorCode *status);
+
+
+/**
+ * Open a UText for a const UnicodeString. The resulting UText will not be writable.
+ *
+ * @param ut Pointer to a UText struct. If NULL, a new UText will be created.
+ * If non-NULL, must refer to an initialized UText struct, which will then
+ * be reset to reference the specified input string.
+ * @param s A const UnicodeString to be wrapped.
+ * @param status Errors are returned here.
+ * @return Pointer to the UText. If a UText was supplied as input, this
+ * will always be used and returned.
+ * @draft ICU 3.4
+ */
+U_DRAFT UText * U_EXPORT2
+utext_openConstUnicodeString(UText *ut, const UnicodeString *s, UErrorCode *status);
+
+
+/**
+ * Open a writable UText implementation for an ICU Replaceable object.
+ * @param ut Pointer to a UText struct. If NULL, a new UText will be created.
+ * If non-NULL, must refer to an already existing UText, which will then
+ * be reset to reference the specified replaceable text.
+ * @param rep A Replaceable text object.
+ * @param status Errors are returned here.
+ * @return Pointer to the UText. If a UText was supplied as input, this
+ * will always be used and returned.
+ * @see Replaceable
+ * @draft ICU 3.4
+ */
+U_DRAFT UText * U_EXPORT2
+utext_openReplaceable(UText *ut, Replaceable *rep, UErrorCode *status);
+
+/**
+ * Open a UText implementation over an ICU CharacterIterator.
+ * @param ut Pointer to a UText struct. If NULL, a new UText will be created.
+ * If non-NULL, must refer to an already existing UText, which will then
+ * be reset to reference the specified replaceable text.
+ * @param ci A Character Iterator.
+ * @param status Errors are returned here.
+ * @return Pointer to the UText. If a UText was supplied as input, this
+ * will always be used and returned.
+ * @see Replaceable
+ * @draft ICU 3.4
+ */
+U_DRAFT UText * U_EXPORT2
+utext_openCharacterIterator(UText *ut, CharacterIterator *ic, UErrorCode *status);
+
+#endif
+
+
+/**
+ * Clone a UText. This is much like opening a UText where the source text is itself
+ * another UText.
+ *
+ * A deep clone will copy both the UText data structures and the underlying text.
+ * The original and cloned UText will operate completely independently; modifications
+ * made to the text in one will not affect the other. Text providers are not
+ * required to support deep clones. The user of clone() must check the status return
+ * and be prepared to handle failures.
+ *
+ * The standard UText implementations for UTF8, UChar *, UnicodeString and
+ * Replaceable all support deep cloning.
+ *
+ * The UText returned from a deep clone will be writable, assuming that the text
+ * provider is able to support writing, even if the source UText had been made
+ * non-writable by means of UText_freeze().
+ *
+ * A shallow clone replicates only the UText data structures; it does not make
+ * a copy of the underlying text. Shallow clones can be used as an efficient way to
+ * have multiple iterators active in a single text string that is not being
+ * modified.
+ *
+ * A shallow clone operation will not fail, barring truly exceptional conditions such
+ * as memory allocation failures.
+ *
+ * Shallow UText clones should be avoided if the UText functions that modify the
+ * text are expected to be used, either on the original or the cloned UText.
+ * Any such modifications can cause unpredictable behavior. Read Only
+ * shallow clones provide some protection against errors of this type by
+ * disabling text modification via the cloned UText.
+ *
+ * A shallow clone made with the readOnly parameter == FALSE will preserve the
+ * utext_isWritable() state of the source object. Note, however, that
+ * write operations must be avoided while more than one UText exists that refer
+ * to the same underlying text.
+ *
+ * A UText and its clone may be safely concurrently accessed by separate threads.
+ * This is true for read access only with shallow clones, and for both read and
+ * write access with deep clones.
+ * It is the responsibility of the Text Provider to ensure that this thread safety
+ * constraint is met.
+ *
+ * @param dest A UText struct to be filled in with the result of the clone operation,
+ * or NULL if the clone function should heap-allocate a new UText struct.
+ * If non-NULL, must refer to an already existing UText, which will then
+ * be reset to become the clone.
+ * @param src The UText to be cloned.
+ * @param deep TRUE to request a deep clone, FALSE for a shallow clone.
+ * @param readOnly TRUE to request that the cloned UText have read only access to the
+ * underlying text.
+
+ * @param status Errors are returned here. For deep clones, U_UNSUPPORTED_ERROR
+ * will be returned if the text provider is unable to clone the
+ * original text.
+ * @return The newly created clone, or NULL if the clone operation failed.
+ * @draft ICU 3.4
+ */
+U_DRAFT UText * U_EXPORT2
+utext_clone(UText *dest, const UText *src, UBool deep, UBool readOnly, UErrorCode *status);
+
+
+/**
+ * Compare two UText objects for equality.
+ * UTexts are equal if they are iterating over the same text, and
+ * have the same iteration position within the text.
+ * If either or both of the parameters are NULL, the comparison is FALSE.
+ *
+ * @param a The first of the two UTexts to compare.
+ * @param b The other UText to be compared.
+ * @return TRUE if the two UTexts are equal.
+ * @draft ICU 3.6
+ */
+U_DRAFT UBool U_EXPORT2
+utext_equals(const UText *a, const UText *b);
+
+
+/*****************************************************************************
+ *
+ * Functions to work with the text represeted by a UText wrapper
+ *
+ *****************************************************************************/
+
+/**
+ * Get the length of the text. Depending on the characteristics
+ * of the underlying text representation, this may be expensive.
+ * @see utext_isLengthExpensive()
+ *
+ *
+ * @param ut the text to be accessed.
+ * @return the length of the text, expressed in native units.
+ *
+ * @draft ICU 3.4
+ */
+U_DRAFT int64_t U_EXPORT2
+utext_nativeLength(UText *ut);
+
+/**
+ * Return TRUE if calculating the length of the text could be expensive.
+ * Finding the length of NUL terminated strings is considered to be expensive.
+ *
+ * Note that the value of this function may change
+ * as the result of other operations on a UText.
+ * Once the length of a string has been discovered, it will no longer
+ * be expensive to report it.
+ *
+ * @param ut the text to be accessed.
+ * @return TRUE if determining the length of the text could be time consuming.
+ * @draft ICU 3.4
+ */
+U_DRAFT UBool U_EXPORT2
+utext_isLengthExpensive(const UText *ut);
+
+/**
+ * Returns the code point at the requested index,
+ * or U_SENTINEL (-1) if it is out of bounds.
+ *
+ * If the specified index points to the interior of a multi-unit
+ * character - one of the trail bytes of a UTF-8 sequence, for example -
+ * the complete code point will be returned.
+ *
+ * The iteration position will be set to the start of the returned code point.
+ *
+ * This function is roughly equivalent to the the sequence
+ * utext_setNativeIndex(index);
+ * utext_current32();
+ * (There is a subtle difference if the index is out of bounds by being less than zero -
+ * utext_setNativeIndex(negative value) sets the index to zero, after which utext_current()
+ * will return the char at zero. utext_char32At(negative index), on the other hand, will
+ * return the U_SENTINEL value of -1.)
+ *
+ * @param ut the text to be accessed
+ * @param nativeIndex the native index of the character to be accessed. If the index points
+ * to other than the first unit of a multi-unit character, it will be adjusted
+ * to the start of the character.
+ * @return the code point at the specified index.
+ * @draft ICU 3.4
+ */
+U_DRAFT UChar32 U_EXPORT2
+utext_char32At(UText *ut, int64_t nativeIndex);
+
+
+/**
+ *
+ * Get the code point at the current iteration position,
+ * or U_SENTINEL (-1) if the iteration has reached the end of
+ * the input text.
+ *
+ * @param ut the text to be accessed.
+ * @return the Unicode code point at the current iterator position.
+ * @draft ICU 3.4
+ */
+U_DRAFT UChar32 U_EXPORT2
+utext_current32(UText *ut);
+
+
+/**
+ * Get the code point at the current iteration position of the UText, and
+ * advance the position to the first index following the character.
+ *
+ * If the position is at the end of the text (the index following
+ * the last character, which is also the length of the text),
+ * return U_SENTINEL (-1) and do not advance the index.
+ *
+ * This is a post-increment operation.
+ *
+ * An inline macro version of this function, UTEXT_NEXT32(),
+ * is available for performance critical use.
+ *
+ * @param ut the text to be accessed.
+ * @return the Unicode code point at the iteration position.
+ * @see UTEXT_NEXT32
+ * @draft ICU 3.4
+ */
+U_DRAFT UChar32 U_EXPORT2
+utext_next32(UText *ut);
+
+
+/**
+ * Move the iterator position to the character (code point) whose
+ * index precedes the current position, and return that character.
+ * This is a pre-decrement operation.
+ *
+ * If the initial position is at the start of the text (index of 0)
+ * return U_SENTINEL (-1), and leave the position unchanged.
+ *
+ * An inline macro version of this function, UTEXT_PREVIOUS32(),
+ * is available for performance critical use.
+ *
+ * @param ut the text to be accessed.
+ * @return the previous UChar32 code point, or U_SENTINEL (-1)
+ * if the iteration has reached the start of the text.
+ * @see UTEXT_PREVIOUS32
+ * @draft ICU 3.4
+ */
+U_DRAFT UChar32 U_EXPORT2
+utext_previous32(UText *ut);
+
+
+/**
+ * Set the iteration index and return the code point at that index.
+ * Leave the iteration index at the start of the following code point.
+ *
+ * This function is the most efficient and convenient way to
+ * begin a forward iteration. The results are identical to the those
+ * from the sequence
+ * \code
+ * utext_setIndex();
+ * utext_next32();
+ * \endcode
+ *
+ * @param ut the text to be accessed.
+ * @param nativeIndex Iteration index, in the native units of the text provider.
+ * @return Code point which starts at or before index,
+ * or U_SENTINEL (-1) if it is out of bounds.
+ * @draft ICU 3.4
+ */
+U_DRAFT UChar32 U_EXPORT2
+utext_next32From(UText *ut, int64_t nativeIndex);
+
+
+
+/**
+ * Set the iteration index, and return the code point preceding the
+ * one specified by the initial index. Leave the iteration position
+ * at the start of the returned code point.
+ *
+ * This function is the most efficient and convenient way to
+ * begin a backwards iteration.
+ *
+ * @param ut the text to be accessed.
+ * @param nativeIndex Iteration index in the native units of the text provider.
+ * @return Code point preceding the one at the initial index,
+ * or U_SENTINEL (-1) if it is out of bounds.
+ *
+ * @draft ICU 3.4
+ */
+U_DRAFT UChar32 U_EXPORT2
+utext_previous32From(UText *ut, int64_t nativeIndex);
+
+/**
+ * Get the current iterator position, which can range from 0 to
+ * the length of the text.
+ * The position is a native index into the input text, in whatever format it
+ * may have (possibly UTF-8 for example), and may not always be the same as
+ * the corresponding UChar (UTF-16) index.
+ * The returned position will always be aligned to a code point boundary.
+ *
+ * @param ut the text to be accessed.
+ * @return the current index position, in the native units of the text provider.
+ * @draft ICU 3.4
+ */
+U_DRAFT int64_t U_EXPORT2
+utext_getNativeIndex(const UText *ut);
+
+/**
+ * Set the current iteration position to the nearest code point
+ * boundary at or preceding the specified index.
+ * The index is in the native units of the original input text.
+ * If the index is out of range, it will be pinned to be within
+ * the range of the input text.
+ *
+ * It will usually be more efficient to begin an iteration
+ * using the functions utext_next32From() or utext_previous32From()
+ * rather than setIndex().
+ *
+ * Moving the index position to an adjacent character is best done
+ * with utext_next32(), utext_previous32() or utext_moveIndex32().
+ * Attempting to do direct arithmetic on the index position is
+ * complicated by the fact that the size (in native units) of a
+ * character depends on the underlying representation of the character
+ * (UTF-8, UTF-16, UTF-32, arbitrary codepage), and is not
+ * easily knowable.
+ *
+ * @param ut the text to be accessed.
+ * @param nativeIndex the native unit index of the new iteration position.
+ * @draft ICU 3.4
+ */
+U_DRAFT void U_EXPORT2
+utext_setNativeIndex(UText *ut, int64_t nativeIndex);
+
+/**
+ * Move the iterator postion by delta code points. The number of code points
+ * is a signed number; a negative delta will move the iterator backwards,
+ * towards the start of the text.
+ *
+ * The index is moved by delta
code points
+ * forward or backward, but no further backward than to 0 and
+ * no further forward than to utext_nativeLength().
+ * The resulting index value will be in between 0 and length, inclusive.
+ *
+ * @param ut the text to be accessed.
+ * @param delta the signed number of code points to move the iteration position.
+ * @return TRUE if the position could be moved the requested number of positions while
+ * staying within the range [0 - text length].
+ * @draft ICU 3.4
+ */
+U_DRAFT UBool U_EXPORT2
+utext_moveIndex32(UText *ut, int32_t delta);
+
+/**
+ * Get the native index of the character preceeding the current position.
+ * If the iteration position is already at the start of the text, zero
+ * is returned.
+ * The value returned is the same as that obtained from the following sequence,
+ * but without the side effect of changing the iteration position.
+ *
+ * \code
+ * UText *ut = whatever;
+ * ...
+ * utext_previous(ut)
+ * utext_getNativeIndex(ut);
+ * \endcode
+ *
+ * This function is most useful during forwards iteration, where it will get the
+ * native index of the character most recently returned from utext_next().
+ *
+ * @param ut the text to be accessed
+ * @return the native index of the character preceeding the current index position,
+ * or zero if the current position is at the start of the text.
+ * @draft ICU 3.6
+ */
+U_DRAFT int64_t U_EXPORT2
+utext_getPreviousNativeIndex(UText *ut);
+
+
+/**
+ *
+ * Extract text from a UText into a UChar buffer. The range of text to be extracted
+ * is specified in the native indices of the UText provider. These may not necessarily
+ * be UTF-16 indices.
+ *
+ * The size (number of 16 bit UChars) of the data to be extracted is returned. The
+ * full number of UChars is returned, even when the extracted text is truncated
+ * because the specified buffer size is too small.
+ *
+ * The extracted string will (if you are a user) / must (if you are a text provider)
+ * be NUL-terminated if there is sufficient space in the destination buffer. This
+ * terminating NUL is not included in the returned length.
+ *
+ * The iteration index is left at the position following the last extracted character.
+ *
+ * @param ut the UText from which to extract data.
+ * @param nativeStart the native index of the first character to extract.\
+ * If the specified index is out of range,
+ * it will be pinned to to be within 0 <= index <= textLength
+ * @param nativeLimit the native string index of the position following the last
+ * character to extract. If the specified index is out of range,
+ * it will be pinned to to be within 0 <= index <= textLength.
+ * nativeLimit must be >= nativeStart.
+ * @param dest the UChar (UTF-16) buffer into which the extracted text is placed
+ * @param destCapacity The size, in UChars, of the destination buffer. May be zero
+ * for precomputing the required size.
+ * @param status receives any error status.
+ * U_BUFFER_OVERFLOW_ERROR: the extracted text was truncated because the
+ * buffer was too small. Returns number of UChars for preflighting.
+ * @return Number of UChars in the data to be extracted. Does not include a trailing NUL.
+ *
+ * @draft ICU 3.4
+ */
+U_DRAFT int32_t U_EXPORT2
+utext_extract(UText *ut,
+ int64_t nativeStart, int64_t nativeLimit,
+ UChar *dest, int32_t destCapacity,
+ UErrorCode *status);
+
+
+#ifndef U_HIDE_DRAFT_API
+/************************************************************************************
+ *
+ * #define inline versions of selected performance-critical text access functions
+ * Caution: do not use auto increment++ or decrement-- expressions
+ * as parameters to these macros.
+ *
+ * For most use, where there is no extreme performance constraint, the
+ * normal, non-inline functions are a better choice. The resulting code
+ * will be smaller, and, if the need ever arises, easier to debug.
+ *
+ * These are implemented as #defines rather than real functions
+ * because there is no fully portable way to do inline functions in plain C.
+ *
+ ************************************************************************************/
+
+/**
+ * inline version of utext_next32(), for performance-critical situations.
+ *
+ * Get the code point at the current iteration position of the UText, and
+ * advance the position to the first index following the character.
+ * This is a post-increment operation.
+ * Returns U_SENTINEL (-1) if the position is at the end of the
+ * text.
+ *
+ * @draft ICU 3.4
+ */
+#define UTEXT_NEXT32(ut) \
+ ((ut)->chunkOffset < (ut)->chunkLength && ((ut)->chunkContents)[(ut)->chunkOffset]<0xd800 ? \
+ ((ut)->chunkContents)[((ut)->chunkOffset)++] : utext_next32(ut))
+
+/**
+ * inline version of utext_previous32(), for performance-critical situations.
+ *
+ * Move the iterator position to the character (code point) whose
+ * index precedes the current position, and return that character.
+ * This is a pre-decrement operation.
+ * Returns U_SENTINEL (-1) if the position is at the start of the text.
+ *
+ * @draft ICU 3.4
+ */
+#define UTEXT_PREVIOUS32(ut) \
+ ((ut)->chunkOffset > 0 && \
+ (ut)->chunkContents[(ut)->chunkOffset-1] < 0xd800 ? \
+ (ut)->chunkContents[--((ut)->chunkOffset)] : utext_previous32(ut))
+
+/**
+ * inline version of utext_getNativeIndex(), for performance-critical situations.
+ *
+ * Get the current iterator position, which can range from 0 to
+ * the length of the text.
+ * The position is a native index into the input text, in whatever format it
+ * may have (possibly UTF-8 for example), and may not always be the same as
+ * the corresponding UChar (UTF-16) index.
+ * The returned position will always be aligned to a code point boundary.
+ *
+ * @draft ICU 3.6
+ */
+#define UTEXT_GETNATIVEINDEX(ut) \
+ ((ut)->chunkOffset <= (ut)->nativeIndexingLimit? \
+ (ut)->chunkNativeStart+(ut)->chunkOffset : \
+ (ut)->pFuncs->mapOffsetToNative(ut))
+
+/**
+ * inline version of utext_setNativeIndex(), for performance-critical situations.
+ *
+ * Set the current iteration position to the nearest code point
+ * boundary at or preceding the specified index.
+ * The index is in the native units of the original input text.
+ * If the index is out of range, it will be pinned to be within
+ * the range of the input text.
+ *
+ * @draft ICU 3.8
+ */
+#define UTEXT_SETNATIVEINDEX(ut, ix) \
+ { int64_t __offset = (ix) - (ut)->chunkNativeStart; \
+ if (__offset>=0 && __offset<=(int64_t)(ut)->nativeIndexingLimit) { \
+ (ut)->chunkOffset=(int32_t)__offset; \
+ } else { \
+ utext_setNativeIndex((ut), (ix)); } }
+
+
+
+#endif
+
+/************************************************************************************
+ *
+ * Functions related to writing or modifying the text.
+ * These will work only with modifiable UTexts. Attempting to
+ * modify a read-only UText will return an error status.
+ *
+ ************************************************************************************/
+
+
+/**
+ * Return TRUE if the text can be written (modified) with utext_replace() or
+ * utext_copy(). For the text to be writable, the text provider must
+ * be of a type that supports writing and the UText must not be frozen.
+ *
+ * Attempting to modify text when utext_isWriteable() is FALSE will fail -
+ * the text will not be modified, and an error will be returned from the function
+ * that attempted the modification.
+ *
+ * @param ut the UText to be tested.
+ * @return TRUE if the text is modifiable.
+ *
+ * @see utext_freeze()
+ * @see utext_replace()
+ * @see utext_copy()
+ * @draft ICU 3.4
+ *
+ */
+U_DRAFT UBool U_EXPORT2
+utext_isWritable(const UText *ut);
+
+
+/**
+ * Test whether there is meta data associated with the text.
+ * @see Replaceable::hasMetaData()
+ *
+ * @param ut The UText to be tested
+ * @return TRUE if the underlying text includes meta data.
+ * @draft ICU 3.4
+ */
+U_DRAFT UBool U_EXPORT2
+utext_hasMetaData(const UText *ut);
+
+
+/**
+ * Replace a range of the original text with a replacement text.
+ *
+ * Leaves the current iteration position at the position following the
+ * newly inserted replacement text.
+ *
+ * This function is only available on UText types that support writing,
+ * that is, ones where utext_isWritable() returns TRUE.
+ *
+ * When using this function, there should be only a single UText opened onto the
+ * underlying native text string. Behavior after a replace operation
+ * on a UText is undefined for any other additional UTexts that refer to the
+ * modified string.
+ *
+ * @param ut the UText representing the text to be operated on.
+ * @param nativeStart the native index of the start of the region to be replaced
+ * @param nativeLimit the native index of the character following the region to be replaced.
+ * @param replacementText pointer to the replacement text
+ * @param replacementLength length of the replacement text, or -1 if the text is NUL terminated.
+ * @param status receives any error status. Possible errors include
+ * U_NO_WRITE_PERMISSION
+ *
+ * @return The signed number of (native) storage units by which
+ * the length of the text expanded or contracted.
+ *
+ * @draft ICU 3.4
+ */
+U_DRAFT int32_t U_EXPORT2
+utext_replace(UText *ut,
+ int64_t nativeStart, int64_t nativeLimit,
+ const UChar *replacementText, int32_t replacementLength,
+ UErrorCode *status);
+
+
+
+/**
+ *
+ * Copy or move a substring from one position to another within the text,
+ * while retaining any metadata associated with the text.
+ * This function is used to duplicate or reorder substrings.
+ * The destination index must not overlap the source range.
+ *
+ * The text to be copied or moved is inserted at destIndex;
+ * it does not replace or overwrite any existing text.
+ *
+ * The iteration position is left following the newly inserted text
+ * at the destination position.
+ *
+ * This function is only available on UText types that support writing,
+ * that is, ones where utext_isWritable() returns TRUE.
+ *
+ * When using this function, there should be only a single UText opened onto the
+ * underlying native text string. Behavior after a copy operation
+ * on a UText is undefined in any other additional UTexts that refer to the
+ * modified string.
+ *
+ * @param ut The UText representing the text to be operated on.
+ * @param nativeStart The native index of the start of the region to be copied or moved
+ * @param nativeLimit The native index of the character position following the region
+ * to be copied.
+ * @param destIndex The native destination index to which the source substring is
+ * copied or moved.
+ * @param move If TRUE, then the substring is moved, not copied/duplicated.
+ * @param status receives any error status. Possible errors include U_NO_WRITE_PERMISSION
+ *
+ * @draft ICU 3.4
+ */
+U_DRAFT void U_EXPORT2
+utext_copy(UText *ut,
+ int64_t nativeStart, int64_t nativeLimit,
+ int64_t destIndex,
+ UBool move,
+ UErrorCode *status);
+
+
+/**
+ *
+ * Freeze a UText. This prevents any modification to the underlying text itself
+ * by means of functions operating on this UText.
+ *
+ *
+ * Once frozen, a UText can not be unfrozen. The intent is to ensure
+ * that a the text underlying a frozen UText wrapper cannot be modified via that UText.
+ *
+ *
+ * Caution: freezing a UText will disable changes made via the specific
+ * frozen UText wrapper only; it will not have any effect on the ability to
+ * directly modify the text by bypassing the UText. Any such backdoor modifications
+ * are always an error while UText access is occuring because the underlying
+ * text can get out of sync with UText's buffering.
+ *
+ *
+ * @param ut The UText to be frozen.
+ * @see utext_isWritable()
+ * @draft ICU 3.6
+ */
+U_DRAFT void U_EXPORT2
+utext_freeze(UText *ut);
+
+
+#ifndef U_HIDE_DRAFT_API
+/**
+ * UText provider properties (bit field indexes).
+ *
+ * @see UText
+ * @draft ICU 3.4
+ */
+enum {
+ /**
+ * It is potentially time consuming for the provider to determine the length of the text.
+ * @draft ICU 3.4
+ */
+ UTEXT_PROVIDER_LENGTH_IS_EXPENSIVE = 1,
+ /**
+ * Text chunks remain valid and usable until the text object is modified or
+ * deleted, not just until the next time the access() function is called
+ * (which is the default).
+ * @draft ICU 3.4
+ */
+ UTEXT_PROVIDER_STABLE_CHUNKS = 2,
+ /**
+ * The provider supports modifying the text via the replace() and copy()
+ * functions.
+ * @see Replaceable
+ * @draft ICU 3.4
+ */
+ UTEXT_PROVIDER_WRITABLE = 3,
+ /**
+ * There is meta data associated with the text.
+ * @see Replaceable::hasMetaData()
+ * @draft ICU 3.4
+ */
+ UTEXT_PROVIDER_HAS_META_DATA = 4,
+ /**
+ * Text provider owns the text storage.
+ * Generally occurs as the result of a deep clone of the UText.
+ * When closing the UText, the associated text must
+ * also be closed/deleted/freed/ whatever is appropriate.
+ * @draft ICU 3.6
+ */
+ UTEXT_PROVIDER_OWNS_TEXT = 5
+};
+
+/**
+ * Function type declaration for UText.clone().
+ *
+ * clone a UText. Much like opening a UText where the source text is itself
+ * another UText.
+ *
+ * A deep clone will copy both the UText data structures and the underlying text.
+ * The original and cloned UText will operate completely independently; modifications
+ * made to the text in one will not effect the other. Text providers are not
+ * required to support deep clones. The user of clone() must check the status return
+ * and be prepared to handle failures.
+ *
+ * A shallow clone replicates only the UText data structures; it does not make
+ * a copy of the underlying text. Shallow clones can be used as an efficient way to
+ * have multiple iterators active in a single text string that is not being
+ * modified.
+ *
+ * A shallow clone operation must not fail except for truly exceptional conditions such
+ * as memory allocation failures.
+ *
+ * A UText and its clone may be safely concurrently accessed by separate threads.
+ * This is true for both shallow and deep clones.
+ * It is the responsibility of the Text Provider to ensure that this thread safety
+ * constraint is met.
+
+ *
+ * @param dest A UText struct to be filled in with the result of the clone operation,
+ * or NULL if the clone function should heap-allocate a new UText struct.
+ * @param src The UText to be cloned.
+ * @param deep TRUE to request a deep clone, FALSE for a shallow clone.
+ * @param status Errors are returned here. For deep clones, U_UNSUPPORTED_ERROR
+ * should be returned if the text provider is unable to clone the
+ * original text.
+ * @return The newly created clone, or NULL if the clone operation failed.
+ *
+ * @draft ICU 3.4
+ */
+typedef UText * U_CALLCONV
+UTextClone(UText *dest, const UText *src, UBool deep, UErrorCode *status);
+
+
+/**
+ * Function type declaration for UText.nativeLength().
+ *
+ * @param ut the UText to get the length of.
+ * @return the length, in the native units of the original text string.
+ * @see UText
+ * @draft ICU 3.4
+ */
+typedef int64_t U_CALLCONV
+UTextNativeLength(UText *ut);
+
+/**
+ * Function type declaration for UText.access(). Get the description of the text chunk
+ * containing the text at a requested native index. The UText's iteration
+ * position will be left at the requested index. If the index is out
+ * of bounds, the iteration position will be left at the start or end
+ * of the string, as appropriate.
+ *
+ * Chunks must begin and end on code point boundaries. A single code point
+ * comprised of multiple storage units must never span a chunk boundary.
+ *
+ *
+ * @param ut the UText being accessed.
+ * @param nativeIndex Requested index of the text to be accessed.
+ * @param forward If TRUE, then the returned chunk must contain text
+ * starting from the index, so that start<=index
+ * The size (number of 16 bit UChars) in the data to be extracted is returned. The
+ * full amount is returned, even when the specified buffer size is smaller.
+ *
+ * The extracted string will (if you are a user) / must (if you are a text provider)
+ * be NUL-terminated if there is sufficient space in the destination buffer.
+ *
+ * @param ut the UText from which to extract data.
+ * @param nativeStart the native index of the first characer to extract.
+ * @param nativeLimit the native string index of the position following the last
+ * character to extract.
+ * @param dest the UChar (UTF-16) buffer into which the extracted text is placed
+ * @param destCapacity The size, in UChars, of the destination buffer. May be zero
+ * for precomputing the required size.
+ * @param status receives any error status.
+ * If U_BUFFER_OVERFLOW_ERROR: Returns number of UChars for
+ * preflighting.
+ * @return Number of UChars in the data. Does not include a trailing NUL.
+ *
+ * @draft ICU 3.4
+ */
+typedef int32_t U_CALLCONV
+UTextExtract(UText *ut,
+ int64_t nativeStart, int64_t nativeLimit,
+ UChar *dest, int32_t destCapacity,
+ UErrorCode *status);
+
+/**
+ * Function type declaration for UText.replace().
+ *
+ * Replace a range of the original text with a replacement text.
+ *
+ * Leaves the current iteration position at the position following the
+ * newly inserted replacement text.
+ *
+ * This function need only be implemented on UText types that support writing.
+ *
+ * When using this function, there should be only a single UText opened onto the
+ * underlying native text string. The function is responsible for updating the
+ * text chunk within the UText to reflect the updated iteration position,
+ * taking into account any changes to the underlying string's structure caused
+ * by the replace operation.
+ *
+ * @param ut the UText representing the text to be operated on.
+ * @param nativeStart the index of the start of the region to be replaced
+ * @param nativeLimit the index of the character following the region to be replaced.
+ * @param replacementText pointer to the replacement text
+ * @param replacmentLength length of the replacement text in UChars, or -1 if the text is NUL terminated.
+ * @param status receives any error status. Possible errors include
+ * U_NO_WRITE_PERMISSION
+ *
+ * @return The signed number of (native) storage units by which
+ * the length of the text expanded or contracted.
+ *
+ * @draft ICU 3.4
+ */
+typedef int32_t U_CALLCONV
+UTextReplace(UText *ut,
+ int64_t nativeStart, int64_t nativeLimit,
+ const UChar *replacementText, int32_t replacmentLength,
+ UErrorCode *status);
+
+/**
+ * Function type declaration for UText.copy().
+ *
+ * Copy or move a substring from one position to another within the text,
+ * while retaining any metadata associated with the text.
+ * This function is used to duplicate or reorder substrings.
+ * The destination index must not overlap the source range.
+ *
+ * The text to be copied or moved is inserted at destIndex;
+ * it does not replace or overwrite any existing text.
+ *
+ * This function need only be implemented for UText types that support writing.
+ *
+ * When using this function, there should be only a single UText opened onto the
+ * underlying native text string. The function is responsible for updating the
+ * text chunk within the UText to reflect the updated iteration position,
+ * taking into account any changes to the underlying string's structure caused
+ * by the replace operation.
+ *
+ * @param ut The UText representing the text to be operated on.
+ * @param nativeStart The index of the start of the region to be copied or moved
+ * @param nativeLimit The index of the character following the region to be replaced.
+ * @param nativeDest The destination index to which the source substring is copied or moved.
+ * @param move If TRUE, then the substring is moved, not copied/duplicated.
+ * @param status receives any error status. Possible errors include U_NO_WRITE_PERMISSION
+ *
+ * @draft ICU 3.4
+ */
+typedef void U_CALLCONV
+UTextCopy(UText *ut,
+ int64_t nativeStart, int64_t nativeLimit,
+ int64_t nativeDest,
+ UBool move,
+ UErrorCode *status);
+
+/**
+ * Function type declaration for UText.mapOffsetToNative().
+ * Map from the current UChar offset within the current text chunk to
+ * the corresponding native index in the original source text.
+ *
+ * This is required only for text providers that do not use native UTF-16 indexes.
+ *
+ * @param ut the UText.
+ * @return Absolute (native) index corresponding to chunkOffset in the current chunk.
+ * The returned native index should always be to a code point boundary.
+ *
+ * @draft ICU 3.4
+ */
+typedef int64_t U_CALLCONV
+UTextMapOffsetToNative(const UText *ut);
+
+/**
+ * Function type declaration for UText.mapIndexToUTF16().
+ * Map from a native index to a UChar offset within a text chunk.
+ * Behavior is undefined if the native index does not fall within the
+ * current chunk.
+ *
+ * This function is required only for text providers that do not use native UTF-16 indexes.
+ *
+ * @param ut The UText containing the text chunk.
+ * @param nativeIndex Absolute (native) text index, chunk->start<=index<=chunk->limit.
+ * @return Chunk-relative UTF-16 offset corresponding to the specified native
+ * index.
+ *
+ * @draft ICU 3.4
+ */
+typedef int32_t U_CALLCONV
+UTextMapNativeIndexToUTF16(const UText *ut, int64_t nativeIndex);
+
+
+/**
+ * Function type declaration for UText.utextClose().
+ *
+ * A Text Provider close function is only required for provider types that make
+ * allocations in their open function (or other functions) that must be
+ * cleaned when the UText is closed.
+ *
+ * The allocation of the UText struct itself and any "extra" storage
+ * associated with the UText is handled by the common UText implementation
+ * and does not require provider specific cleanup in a close function.
+ *
+ * Most UText provider implementations do not need to implement this function.
+ *
+ * @param ut A UText object to be closed.
+ *
+ * @draft ICU 3.4
+ */
+typedef void U_CALLCONV
+UTextClose(UText *ut);
+
+
+/**
+ * (public) Function dispatch table for UText.
+ * Conceptually very much like a C++ Virtual Function Table.
+ * This struct defines the organization of the table.
+ * Each text provider implementation must provide an
+ * actual table that is initialized with the appropriate functions
+ * for the type of text being handled.
+ * @draft ICU 3.6
+ */
+struct UTextFuncs {
+ /**
+ * (public) Function table size, sizeof(UTextFuncs)
+ * Intended for use should the table grow to accomodate added
+ * functions in the future, to allow tests for older format
+ * function tables that do not contain the extensions.
+ *
+ * Fields are placed for optimal alignment on
+ * 32/64/128-bit-pointer machines, by normally grouping together
+ * 4 32-bit fields,
+ * 4 pointers,
+ * 2 64-bit fields
+ * in sequence.
+ * @draft ICU 3.6
+ */
+ int32_t tableSize;
+
+ /**
+ * (private) Alignment padding.
+ * Do not use, reserved for use by the UText framework only.
+ * @internal
+ */
+ int32_t reserved1, reserved2, reserved3;
+
+
+ /**
+ * (public) Function pointer for UTextClone
+ *
+ * @see UTextClone
+ * @draft ICU 3.6
+ */
+ UTextClone *clone;
+
+ /**
+ * (public) function pointer for UTextLength
+ * May be expensive to compute!
+ *
+ * @see UTextLength
+ * @draft ICU 3.6
+ */
+ UTextNativeLength *nativeLength;
+
+ /**
+ * (public) Function pointer for UTextAccess.
+ *
+ * @see UTextAccess
+ * @draft ICU 3.6
+ */
+ UTextAccess *access;
+
+ /**
+ * (public) Function pointer for UTextExtract.
+ *
+ * @see UTextExtract
+ * @draft ICU 3.6
+ */
+ UTextExtract *extract;
+
+ /**
+ * (public) Function pointer for UTextReplace.
+ *
+ * @see UTextReplace
+ * @draft ICU 3.6
+ */
+ UTextReplace *replace;
+
+ /**
+ * (public) Function pointer for UTextCopy.
+ *
+ * @see UTextCopy
+ * @draft ICU 3.6
+ */
+ UTextCopy *copy;
+
+ /**
+ * (public) Function pointer for UTextMapOffsetToNative.
+ *
+ * @see UTextMapOffsetToNative
+ * @draft ICU 3.6
+ */
+ UTextMapOffsetToNative *mapOffsetToNative;
+
+ /**
+ * (public) Function pointer for UTextMapNativeIndexToUTF16.
+ *
+ * @see UTextMapNativeIndexToUTF16
+ * @draft ICU 3.6
+ */
+ UTextMapNativeIndexToUTF16 *mapNativeIndexToUTF16;
+
+ /**
+ * (public) Function pointer for UTextClose.
+ *
+ * @see UTextClose
+ * @draft ICU 3.6
+ */
+ UTextClose *close;
+
+ /**
+ * (private) Spare function pointer
+ * @internal
+ */
+
+ UTextClose *spare1;
+ /**
+ * (private) Spare function pointer
+ * @internal
+ */
+ UTextClose *spare2;
+
+ /**
+ * (private) Spare function pointer
+ * @internal
+ */
+ UTextClose *spare3;
+
+};
+typedef struct UTextFuncs UTextFuncs;
+
+#endif
+
+#ifndef U_HIDE_DRAFT_API
+ /**
+ * UText struct. Provides the interface between the generic UText access code
+ * and the UText provider code that works on specific kinds of
+ * text (UTF-8, noncontiguous UTF-16, whatever.)
+ *
+ * Applications that are using predefined types of text providers
+ * to pass text data to ICU services will have no need to view the
+ * internals of the UText structs that they open.
+ *
+ * @draft ICU 3.6
+ */
+struct UText {
+ /**
+ * (private) Magic. Used to help detect when UText functions are handed
+ * invalid or unitialized UText structs.
+ * utext_openXYZ() functions take an initialized,
+ * but not necessarily open, UText struct as an
+ * optional fill-in parameter. This magic field
+ * is used to check for that initialization.
+ * Text provider close functions must NOT clear
+ * the magic field because that would prevent
+ * reuse of the UText struct.
+ * @internal
+ */
+ uint32_t magic;
+
+
+ /**
+ * (private) Flags for managing the allocation and freeing of
+ * memory associated with this UText.
+ * @internal
+ */
+ int32_t flags;
+
+
+ /**
+ * Text provider properties. This set of flags is maintainted by the
+ * text provider implementation.
+ * @draft ICU 3.4
+ */
+ int32_t providerProperties;
+
+ /**
+ * (public) sizeOfStruct=sizeof(UText)
+ * Allows possible backward compatible extension.
+ *
+ * @draft ICU 3.4
+ */
+ int32_t sizeOfStruct;
+
+ /* ------ 16 byte alignment boundary ----------- */
+
+
+ /**
+ * (protected) Native index of the first character position following
+ * the current chunk.
+ * @draft ICU 3.6
+ */
+ int64_t chunkNativeLimit;
+
+ /**
+ * (protected) Size in bytes of the extra space (pExtra).
+ * @draft ICU 3.4
+ */
+ int32_t extraSize;
+
+ /**
+ * (protected) The highest chunk offset where native indexing and
+ * chunk (UTF-16) indexing correspond. For UTF-16 sources, value
+ * will be equal to chunkLength.
+ *
+ * @draft ICU 3.6
+ */
+ int32_t nativeIndexingLimit;
+
+ /* ---- 16 byte alignment boundary------ */
+
+ /**
+ * (protected) Native index of the first character in the text chunk.
+ * @draft ICU 3.6
+ */
+ int64_t chunkNativeStart;
+
+ /**
+ * (protected) Current iteration position within the text chunk (UTF-16 buffer).
+ * This is the index to the character that will be returned by utext_next32().
+ * @draft ICU 3.6
+ */
+ int32_t chunkOffset;
+
+ /**
+ * (protected) Length the text chunk (UTF-16 buffer), in UChars.
+ * @draft ICU 3.6
+ */
+ int32_t chunkLength;
+
+ /* ---- 16 byte alignment boundary-- */
+
+
+ /**
+ * (protected) pointer to a chunk of text in UTF-16 format.
+ * May refer either to original storage of the source of the text, or
+ * if conversion was required, to a buffer owned by the UText.
+ * @draft ICU 3.6
+ */
+ const UChar *chunkContents;
+
+ /**
+ * (public) Pointer to Dispatch table for accessing functions for this UText.
+ * @draft ICU 3.6
+ */
+ UTextFuncs *pFuncs;
+
+ /**
+ * (protected) Pointer to additional space requested by the
+ * text provider during the utext_open operation.
+ * @draft ICU 3.4
+ */
+ void *pExtra;
+
+ /**
+ * (protected) Pointer to string or text-containin object or similar.
+ * This is the source of the text that this UText is wrapping, in a format
+ * that is known to the text provider functions.
+ * @draft ICU 3.4
+ */
+ const void *context;
+
+ /* --- 16 byte alignment boundary--- */
+
+ /**
+ * (protected) Pointer fields available for use by the text provider.
+ * Not used by UText common code.
+ * @draft ICU 3.6
+ */
+ const void *p;
+ /**
+ * (protected) Pointer fields available for use by the text provider.
+ * Not used by UText common code.
+ * @draft ICU 3.6
+ */
+ const void *q;
+ /**
+ * (protected) Pointer fields available for use by the text provider.
+ * Not used by UText common code.
+ * @draft ICU 3.6
+ */
+ const void *r;
+
+ /**
+ * Private field reserved for future use by the UText framework
+ * itself. This is not to be touched by the text providers.
+ * @internal ICU 3.4
+ */
+ void *privP;
+
+
+ /* --- 16 byte alignment boundary--- */
+
+
+ /**
+ * (protected) Integer field reserved for use by the text provider.
+ * Not used by the UText framework, or by the client (user) of the UText.
+ * @draft ICU 3.4
+ */
+ int64_t a;
+
+ /**
+ * (protected) Integer field reserved for use by the text provider.
+ * Not used by the UText framework, or by the client (user) of the UText.
+ * @draft ICU 3.4
+ */
+ int32_t b;
+
+ /**
+ * (protected) Integer field reserved for use by the text provider.
+ * Not used by the UText framework, or by the client (user) of the UText.
+ * @draft ICU 3.4
+ */
+ int32_t c;
+
+ /* ---- 16 byte alignment boundary---- */
+
+
+ /**
+ * Private field reserved for future use by the UText framework
+ * itself. This is not to be touched by the text providers.
+ * @internal ICU 3.4
+ */
+ int64_t privA;
+ /**
+ * Private field reserved for future use by the UText framework
+ * itself. This is not to be touched by the text providers.
+ * @internal ICU 3.4
+ */
+ int32_t privB;
+ /**
+ * Private field reserved for future use by the UText framework
+ * itself. This is not to be touched by the text providers.
+ * @internal ICU 3.4
+ */
+ int32_t privC;
+};
+
+#endif
+
+/**
+ * Common function for use by Text Provider implementations to allocate and/or initialize
+ * a new UText struct. To be called in the implementation of utext_open() functions.
+ * If the supplied UText parameter is null, a new UText struct will be allocated on the heap.
+ * If the supplied UText is already open, the provider's close function will be called
+ * so that the struct can be reused by the open that is in progress.
+ *
+ * @param ut pointer to a UText struct to be re-used, or null if a new UText
+ * should be allocated.
+ * @param extraSpace The amount of additional space to be allocated as part
+ * of this UText, for use by types of providers that require
+ * additional storage.
+ * @param status Errors are returned here.
+ * @return pointer to the UText, allocated if necessary, with extra space set up if requested.
+ * @draft ICU 3.4
+ */
+U_DRAFT UText * U_EXPORT2
+utext_setup(UText *ut, int32_t extraSpace, UErrorCode *status);
+
+/**
+ * @internal
+ * Value used to help identify correctly initialized UText structs.
+ * Note: must be publicly visible so that UTEXT_INITIALIZER can access it.
+ */
+enum {
+ UTEXT_MAGIC = 0x345ad82c
+};
+#ifndef U_HIDE_DRAFT_API
+
+/**
+ * initializer to be used with local (stack) instances of a UText
+ * struct. UText structs must be initialized before passing
+ * them to one of the utext_open functions.
+ *
+ * @draft ICU 3.6
+ */
+#define UTEXT_INITIALIZER { \
+ UTEXT_MAGIC, /* magic */ \
+ 0, /* flags */ \
+ 0, /* providerProps */ \
+ sizeof(UText), /* sizeOfStruct */ \
+ 0, /* chunkNativeLimit */ \
+ 0, /* extraSize */ \
+ 0, /* nativeIndexingLimit */ \
+ 0, /* chunkNativeStart */ \
+ 0, /* chunkOffset */ \
+ 0, /* chunkLength */ \
+ NULL, /* chunkContents */ \
+ NULL, /* pFuncs */ \
+ NULL, /* pExtra */ \
+ NULL, /* context */ \
+ NULL, NULL, NULL, /* p, q, r */ \
+ NULL, /* privP */ \
+ 0, 0, 0, /* a, b, c */ \
+ 0, 0, 0 /* privA,B,C, */ \
+ }
+
+
+#endif /* U_HIDE_DRAFT_API */
+
+U_CDECL_END
+
+
+
+#endif
diff --git a/icuSources/common/unicode/utf.h b/icuSources/common/unicode/utf.h
index 201691d0..2dfef63d 100644
--- a/icuSources/common/unicode/utf.h
+++ b/icuSources/common/unicode/utf.h
@@ -1,7 +1,7 @@
/*
*******************************************************************************
*
-* Copyright (C) 1999-2004, International Business Machines
+* Copyright (C) 1999-2006, International Business Machines
* Corporation and others. All Rights Reserved.
*
*******************************************************************************
@@ -63,6 +63,14 @@
* malformed sequences can be expressed unambiguously with a distinct subrange
* of Unicode code points.)
*
+ * The regular "safe" macros require that the initial, passed-in string index
+ * is within bounds. They only check the index when they read more than one
+ * code unit. This is usually done with code similar to the following loop:
+ *
while(i
+ *
* When it is safe to assume that text is well-formed UTF-16
* (does not contain single, unpaired surrogates), then one can use
* U16_..._UNSAFE macros.
@@ -80,12 +88,14 @@
* The unsafe UTF-8 macros are entirely implemented inside the macro definitions
* and are fast, while the safe UTF-8 macros call functions for all but the
* trivial (ASCII) cases.
+ * (ICU 3.6 optimizes U8_NEXT() and U8_APPEND() to handle most other common
+ * characters inline as well.)
*
* Unlike with UTF-16, malformed sequences cannot be expressed with distinct
* code point values (0..U+10ffff). They are indicated with negative values instead.
*
* For more information see the ICU User Guide Strings chapter
- * (http://oss.software.ibm.com/icu/userguide/).
+ * (http://icu.sourceforge.net/userguide/strings.html).
*
* Usage:
* ICU coding guidelines for if() statements should be followed when using these macros.
@@ -157,13 +167,11 @@
(uint32_t)(c)<=0x10ffff && \
!U_IS_UNICODE_NONCHAR(c)))
-#ifndef U_HIDE_DRAFT_API
-
/**
* Is this code point a BMP code point (U+0000..U+ffff)?
* @param c 32-bit code point
* @return TRUE or FALSE
- * @draft ICU 2.8
+ * @stable ICU 2.8
*/
#define U_IS_BMP(c) ((uint32_t)(c)<=0xffff)
@@ -171,11 +179,9 @@
* Is this code point a supplementary code point (U+10000..U+10ffff)?
* @param c 32-bit code point
* @return TRUE or FALSE
- * @draft ICU 2.8
+ * @stable ICU 2.8
*/
#define U_IS_SUPPLEMENTARY(c) ((uint32_t)((c)-0x10000)<=0xfffff)
-
-#endif /*U_HIDE_DRAFT_API*/
/**
* Is this code point a lead surrogate (U+d800..U+dbff)?
diff --git a/icuSources/common/unicode/utf16.h b/icuSources/common/unicode/utf16.h
index 7bf38720..cd8c5c1e 100644
--- a/icuSources/common/unicode/utf16.h
+++ b/icuSources/common/unicode/utf16.h
@@ -1,7 +1,7 @@
/*
*******************************************************************************
*
-* Copyright (C) 1999-2004, International Business Machines
+* Copyright (C) 1999-2006, International Business Machines
* Corporation and others. All Rights Reserved.
*
*******************************************************************************
@@ -23,7 +23,7 @@
* and some common definitions.
*
* For more information see utf.h and the ICU User Guide Strings chapter
- * (http://oss.software.ibm.com/icu/userguide/).
+ * (http://icu.sourceforge.net/userguide/strings.html).
*
* Usage:
* ICU coding guidelines for if() statements should be followed when using these macros.
@@ -179,7 +179,7 @@
*
* @param s const UChar * string
* @param start starting string offset (usually 0)
- * @param i string offset, start<=iUsage:
* ICU coding guidelines for if() statements should be followed when using these macros.
@@ -48,8 +48,8 @@
* @internal
*/
#ifdef U_UTF8_IMPL
-U_INTERNAL const uint8_t
-#elif defined(U_STATIC_IMPLEMENTATION)
+U_EXPORT const uint8_t
+#elif defined(U_STATIC_IMPLEMENTATION) || defined(U_COMMON_IMPLEMENTATION)
U_CFUNC const uint8_t
#else
U_CFUNC U_IMPORT const uint8_t /* U_IMPORT2? */ /*U_IMPORT*/
@@ -181,7 +181,7 @@ utf8_back1SafeBody(const uint8_t *s, int32_t start, int32_t i);
*
* @param s const uint8_t * string
* @param start starting string offset
- * @param i string offset, start<=i=0x80) { \
- if(U8_IS_LEAD(c)) { \
+ (c)=(uint8_t)(s)[(i)++]; \
+ if((c)>=0x80) { \
+ uint8_t __t1, __t2; \
+ if( /* handle U+1000..U+CFFF inline */ \
+ (0xe0<(c) && (c)<=0xec) && \
+ (((i)+1)<(length)) && \
+ (__t1=(uint8_t)((s)[i]-0x80))<=0x3f && \
+ (__t2=(uint8_t)((s)[(i)+1]-0x80))<= 0x3f \
+ ) { \
+ /* no need for (c&0xf) because the upper bits are truncated after <<12 in the cast to (UChar) */ \
+ (c)=(UChar)(((c)<<12)|(__t1<<6)|__t2); \
+ (i)+=2; \
+ } else if( /* handle U+0080..U+07FF inline */ \
+ ((c)<0xe0 && (c)>=0xc2) && \
+ ((i)<(length)) && \
+ (__t1=(uint8_t)((s)[i]-0x80))<=0x3f \
+ ) { \
+ (c)=(UChar)((((c)&0x1f)<<6)|__t1); \
+ ++(i); \
+ } else if(U8_IS_LEAD(c)) { \
+ /* function call for "complicated" and error cases */ \
(c)=utf8_nextCharSafeBody((const uint8_t *)s, &(i), (int32_t)(length), c, -1); \
} else { \
(c)=U_SENTINEL; \
@@ -293,7 +311,7 @@ utf8_back1SafeBody(const uint8_t *s, int32_t start, int32_t i);
}
/**
- * Append a code point to a string, overwriting 1 or 2 code units.
+ * Append a code point to a string, overwriting 1 to 4 bytes.
* The offset points to the current end of the string contents
* and is advanced (post-increment).
* "Safe" macro, checks for a valid code point.
@@ -302,18 +320,25 @@ utf8_back1SafeBody(const uint8_t *s, int32_t start, int32_t i);
* then isError is set to TRUE.
*
* @param s const uint8_t * string buffer
- * @param i string offset, i>6)|0xc0); \
+ (s)[(i)++]=(uint8_t)(((c)&0x3f)|0x80); \
+ } else if((uint32_t)(c)<=0xd7ff && (i)+2<(capacity)) { \
+ (s)[(i)++]=(uint8_t)(((c)>>12)|0xe0); \
+ (s)[(i)++]=(uint8_t)((((c)>>6)&0x3f)|0x80); \
+ (s)[(i)++]=(uint8_t)(((c)&0x3f)|0x80); \
} else { \
- (i)=utf8_appendCharSafeBody(s, (int32_t)(i), (int32_t)(length), c, &(isError)); \
+ (i)=utf8_appendCharSafeBody(s, (int32_t)(i), (int32_t)(capacity), c, &(isError)); \
} \
}
@@ -337,13 +362,13 @@ utf8_back1SafeBody(const uint8_t *s, int32_t start, int32_t i);
* "Safe" macro, checks for illegal sequences and for string boundaries.
*
* @param s const uint8_t * string
- * @param i string offset, i(length)) { \
@@ -383,7 +408,7 @@ utf8_back1SafeBody(const uint8_t *s, int32_t start, int32_t i);
* "Safe" macro, checks for illegal sequences and for string boundaries.
*
* @param s const uint8_t * string
- * @param i string offset, i=0xc0) { \
U8_MASK_LEAD_BYTE(__b, __count); \
(c)|=(UChar32)__b<<__shift; \
@@ -492,16 +517,16 @@ utf8_back1SafeBody(const uint8_t *s, int32_t start, int32_t i);
*
* @param s const uint8_t * string
* @param start starting string offset (usually 0)
- * @param i string offset, start<=i
+ * @param i string offset, must be start=0x80) { \
if((c)<=0xbf) { \
- (c)=utf8_prevCharSafeBody(s, start, &(i), c, -1); \
+ (c)=utf8_prevCharSafeBody((const uint8_t *)s, start, &(i), c, -1); \
} else { \
(c)=U_SENTINEL; \
} \
@@ -531,7 +556,7 @@ utf8_back1SafeBody(const uint8_t *s, int32_t start, int32_t i);
*
* @param s const uint8_t * string
* @param start starting string offset (usually 0)
- * @param i string offset, start<=i
+ * @param i string offset, must be start
*
* This concept has been abandoned.
- * A lot of the ICU source code — especially low-level code like
- * conversion, normalization, and collation — assumes UTF-16,
- * utf.h enforces the default of UTF-16.
+ * A lot of the ICU source code assumes UChar strings are in UTF-16.
+ * This is especially true for low-level code like
+ * conversion, normalization, and collation.
+ * The utf.h header enforces the default of UTF-16.
* The UTF-8 and UTF-32 macros remain for now for completeness and backward compatibility.
*
* Accordingly, utf.h defines UChar to be an unsigned 16-bit integer. If this matches wchar_t, then
diff --git a/icuSources/common/unicode/utrace.h b/icuSources/common/unicode/utrace.h
index cf21b982..bacca6df 100644
--- a/icuSources/common/unicode/utrace.h
+++ b/icuSources/common/unicode/utrace.h
@@ -1,7 +1,7 @@
/*
*******************************************************************************
*
-* Copyright (C) 2003-2004, International Business Machines
+* Copyright (C) 2003-2006, International Business Machines
* Corporation and others. All Rights Reserved.
*
*******************************************************************************
@@ -23,33 +23,36 @@
#include
#include "unicode/utypes.h"
+/**
+ * \file
+ * \brief C API: Definitions for ICU tracing/logging.
+ */
+
U_CDECL_BEGIN
-#ifndef U_HIDE_DRAFT_API
-
/**
* Trace severity levels. Higher levels increase the verbosity of the trace output.
* @see utrace_setLevel
- * @draft ICU 2.8
+ * @stable ICU 2.8
*/
typedef enum UTraceLevel {
- /** Disable all tracing @draft ICU 2.8*/
+ /** Disable all tracing @stable ICU 2.8*/
UTRACE_OFF=-1,
- /** Trace error conditions only @draft ICU 2.8*/
+ /** Trace error conditions only @stable ICU 2.8*/
UTRACE_ERROR=0,
- /** Trace errors and warnings @draft ICU 2.8*/
+ /** Trace errors and warnings @stable ICU 2.8*/
UTRACE_WARNING=3,
- /** Trace opens and closes of ICU services @draft ICU 2.8*/
+ /** Trace opens and closes of ICU services @stable ICU 2.8*/
UTRACE_OPEN_CLOSE=5,
- /** Trace an intermediate number of ICU operations @draft ICU 2.8*/
+ /** Trace an intermediate number of ICU operations @stable ICU 2.8*/
UTRACE_INFO=7,
- /** Trace the maximum number of ICU operations @draft ICU 2.8*/
+ /** Trace the maximum number of ICU operations @stable ICU 2.8*/
UTRACE_VERBOSE=9
} UTraceLevel;
/**
* These are the ICU functions that will be traced when tracing is enabled.
- * @draft ICU 2.8
+ * @stable ICU 2.8
*/
typedef enum UTraceFunctionNumber {
UTRACE_FUNCTION_START=0,
@@ -80,22 +83,20 @@ typedef enum UTraceFunctionNumber {
UTRACE_COLLATION_LIMIT
} UTraceFunctionNumber;
-#endif /*U_HIDE_DRAFT_API*/
-
/**
* Setter for the trace level.
* @param traceLevel A UTraceLevel value.
- * @draft ICU 2.8
+ * @stable ICU 2.8
*/
-U_DRAFT void U_EXPORT2
+U_STABLE void U_EXPORT2
utrace_setLevel(int32_t traceLevel);
/**
* Getter for the trace level.
* @return The UTraceLevel value being used by ICU.
- * @draft ICU 2.8
+ * @stable ICU 2.8
*/
-U_DRAFT int32_t U_EXPORT2
+U_STABLE int32_t U_EXPORT2
utrace_getLevel(void);
/* Trace function pointers types ----------------------------- */
@@ -104,7 +105,7 @@ utrace_getLevel(void);
* Type signature for the trace function to be called when entering a function.
* @param context value supplied at the time the trace functions are set.
* @param fnNumber Enum value indicating the ICU function being entered.
- * @draft ICU 2.8
+ * @stable ICU 2.8
*/
typedef void U_CALLCONV
UTraceEntry(const void *context, int32_t fnNumber);
@@ -120,7 +121,7 @@ UTraceEntry(const void *context, int32_t fnNumber);
* @param args A variable arguments list. Contents are described by
* the fmt parameter.
* @see utrace_vformat
- * @draft ICU 2.8
+ * @stable ICU 2.8
*/
typedef void U_CALLCONV
UTraceExit(const void *context, int32_t fnNumber,
@@ -135,7 +136,7 @@ UTraceExit(const void *context, int32_t fnNumber,
* @param fmt A format string describing the tracing data that is supplied
* as variable args
* @param args The data being traced, passed as variable args.
- * @draft ICU 2.8
+ * @stable ICU 2.8
*/
typedef void U_CALLCONV
UTraceData(const void *context, int32_t fnNumber, int32_t level,
@@ -167,9 +168,9 @@ UTraceData(const void *context, int32_t fnNumber, int32_t level,
* traced ICU function, for the purpose of providing
* data to the trace.
*
- * @draft ICU 2.8
+ * @stable ICU 2.8
*/
-U_DRAFT void U_EXPORT2
+U_STABLE void U_EXPORT2
utrace_setFunctions(const void *context,
UTraceEntry *e, UTraceExit *x, UTraceData *d);
@@ -181,9 +182,9 @@ utrace_setFunctions(const void *context,
* @param e The currently installed UTraceEntry function.
* @param x The currently installed UTraceExit function.
* @param d The currently installed UTraceData function.
- * @draft ICU 2.8
+ * @stable ICU 2.8
*/
-U_DRAFT void U_EXPORT2
+U_STABLE void U_EXPORT2
utrace_getFunctions(const void **context,
UTraceEntry **e, UTraceExit **x, UTraceData **d);
@@ -303,9 +304,9 @@ utrace_getFunctions(const void **context,
* @param args Data to be formatted.
* @return Length of formatted output, including the terminating NUL.
* If buffer capacity is insufficient, the required capacity is returned.
- * @draft ICU 2.8
+ * @stable ICU 2.8
*/
-U_DRAFT int32_t U_EXPORT2
+U_STABLE int32_t U_EXPORT2
utrace_vformat(char *outBuf, int32_t capacity,
int32_t indent, const char *fmt, va_list args);
@@ -324,9 +325,9 @@ utrace_vformat(char *outBuf, int32_t capacity,
* @param ... Data to be formatted.
* @return Length of formatted output, including the terminating NUL.
* If buffer capacity is insufficient, the required capacity is returned.
- * @draft ICU 2.8
+ * @stable ICU 2.8
*/
-U_DRAFT int32_t U_EXPORT2
+U_STABLE int32_t U_EXPORT2
utrace_format(char *outBuf, int32_t capacity,
int32_t indent, const char *fmt, ...);
@@ -341,9 +342,9 @@ utrace_format(char *outBuf, int32_t capacity,
* @return The name string for the function.
*
* @see UTraceFunctionNumber
- * @draft ICU 2.8
+ * @stable ICU 2.8
*/
-U_DRAFT const char * U_EXPORT2
+U_STABLE const char * U_EXPORT2
utrace_functionName(int32_t fnNumber);
U_CDECL_END
diff --git a/icuSources/common/unicode/utypes.h b/icuSources/common/unicode/utypes.h
index e20cd793..7aceb27f 100644
--- a/icuSources/common/unicode/utypes.h
+++ b/icuSources/common/unicode/utypes.h
@@ -1,6 +1,6 @@
/*
**********************************************************************
-* Copyright (C) 1996-2004, International Business Machines
+* Copyright (C) 1996-2006, International Business Machines
* Corporation and others. All Rights Reserved.
**********************************************************************
*
@@ -38,6 +38,10 @@
#include "unicode/uversion.h"
#include "unicode/uconfig.h"
+#if !U_DEFAULT_SHOW_DRAFT && !defined(U_SHOW_DRAFT_API)
+#define U_HIDE_DRAFT_API 1
+#endif
+
#ifdef U_HIDE_DRAFT_API
#include "unicode/udraft.h"
#endif
@@ -50,6 +54,13 @@
#include "unicode/uobslete.h"
#endif
+#ifdef U_HIDE_INTERNAL_API
+#include "unicode/uintrnal.h"
+#endif
+
+#ifdef U_HIDE_SYSTEM_API
+#include "unicode/usystem.h"
+#endif
/*!
* \file
@@ -186,11 +197,14 @@
* @stable ICU 2.4
*/
#define U_ICUDATA_ENTRY_POINT U_DEF2_ICUDATA_ENTRY_POINT(U_ICU_VERSION_MAJOR_NUM, U_ICU_VERSION_MINOR_NUM)
+
/**
+ * Do not use.
* @internal
*/
#define U_DEF2_ICUDATA_ENTRY_POINT(major, minor) U_DEF_ICUDATA_ENTRY_POINT(major, minor)
/**
+ * Do not use.
* @internal
*/
#define U_DEF_ICUDATA_ENTRY_POINT(major, minor) icudt##major##minor##_dat
@@ -318,7 +332,7 @@ typedef void* UClassID;
* \def U_DATA_API
* Set to export library symbols from inside the stubdata library,
* and to import them from outside.
- * @draft ICU 3.0
+ * @stable ICU 3.0
*/
/**
@@ -356,6 +370,13 @@ typedef void* UClassID;
* @stable ICU 2.0
*/
+/**
+ * \def U_TOOLUTIL_API
+ * Set to export library symbols from inside the toolutil library,
+ * and to import them from outside.
+ * @draft ICU 3.4
+ */
+
#if defined(U_COMBINED_IMPLEMENTATION)
#define U_DATA_API U_EXPORT
#define U_COMMON_API U_EXPORT
@@ -363,6 +384,7 @@ typedef void* UClassID;
#define U_LAYOUT_API U_EXPORT
#define U_LAYOUTEX_API U_EXPORT
#define U_IO_API U_EXPORT
+#define U_TOOLUTIL_API U_EXPORT
#elif defined(U_STATIC_IMPLEMENTATION)
#define U_DATA_API
#define U_COMMON_API
@@ -370,6 +392,7 @@ typedef void* UClassID;
#define U_LAYOUT_API
#define U_LAYOUTEX_API
#define U_IO_API
+#define U_TOOLUTIL_API
#elif defined(U_COMMON_IMPLEMENTATION)
#define U_DATA_API U_IMPORT
#define U_COMMON_API U_EXPORT
@@ -377,6 +400,7 @@ typedef void* UClassID;
#define U_LAYOUT_API U_IMPORT
#define U_LAYOUTEX_API U_IMPORT
#define U_IO_API U_IMPORT
+#define U_TOOLUTIL_API U_IMPORT
#elif defined(U_I18N_IMPLEMENTATION)
#define U_DATA_API U_IMPORT
#define U_COMMON_API U_IMPORT
@@ -384,6 +408,7 @@ typedef void* UClassID;
#define U_LAYOUT_API U_IMPORT
#define U_LAYOUTEX_API U_IMPORT
#define U_IO_API U_IMPORT
+#define U_TOOLUTIL_API U_IMPORT
#elif defined(U_LAYOUT_IMPLEMENTATION)
#define U_DATA_API U_IMPORT
#define U_COMMON_API U_IMPORT
@@ -391,6 +416,7 @@ typedef void* UClassID;
#define U_LAYOUT_API U_EXPORT
#define U_LAYOUTEX_API U_IMPORT
#define U_IO_API U_IMPORT
+#define U_TOOLUTIL_API U_IMPORT
#elif defined(U_LAYOUTEX_IMPLEMENTATION)
#define U_DATA_API U_IMPORT
#define U_COMMON_API U_IMPORT
@@ -398,6 +424,7 @@ typedef void* UClassID;
#define U_LAYOUT_API U_IMPORT
#define U_LAYOUTEX_API U_EXPORT
#define U_IO_API U_IMPORT
+#define U_TOOLUTIL_API U_IMPORT
#elif defined(U_IO_IMPLEMENTATION)
#define U_DATA_API U_IMPORT
#define U_COMMON_API U_IMPORT
@@ -405,6 +432,15 @@ typedef void* UClassID;
#define U_LAYOUT_API U_IMPORT
#define U_LAYOUTEX_API U_IMPORT
#define U_IO_API U_EXPORT
+#define U_TOOLUTIL_API U_IMPORT
+#elif defined(U_TOOLUTIL_IMPLEMENTATION)
+#define U_DATA_API U_IMPORT
+#define U_COMMON_API U_IMPORT
+#define U_I18N_API U_IMPORT
+#define U_LAYOUT_API U_IMPORT
+#define U_LAYOUTEX_API U_IMPORT
+#define U_IO_API U_IMPORT
+#define U_TOOLUTIL_API U_EXPORT
#else
#define U_DATA_API U_IMPORT
#define U_COMMON_API U_IMPORT
@@ -412,6 +448,7 @@ typedef void* UClassID;
#define U_LAYOUT_API U_IMPORT
#define U_LAYOUTEX_API U_IMPORT
#define U_IO_API U_IMPORT
+#define U_TOOLUTIL_API U_IMPORT
#endif
/**
@@ -449,10 +486,11 @@ typedef void* UClassID;
*
* Note: This is currently only done on Windows because
* some Linux/Unix compilers have problems with defining global new/delete.
- * On Windows, WIN32 is defined, and it is _MSC_Ver>=1200 for MSVC 6.0 and higher.
+ * On Windows, WIN32 is defined, and it is _MSC_VER>=1200 for MSVC 6.0 and higher.
*/
-#if defined(XP_CPLUSPLUS) && defined(WIN32) && (_MSC_Ver>=1200) && (defined(U_COMMON_IMPLEMENTATION) || defined(U_I18N_IMPLEMENTATION) || defined(U_LAYOUT_IMPLEMENTATION) || defined(U_USTDIO_IMPLEMENTATION))
+#if defined(XP_CPLUSPLUS) && defined(U_WINDOWS) && (_MSC_VER>=1200) && U_DEBUG && (defined(U_COMMON_IMPLEMENTATION) || defined(U_I18N_IMPLEMENTATION) || defined(U_LAYOUT_IMPLEMENTATION) || defined(U_USTDIO_IMPLEMENTATION))
+#ifndef U_HIDE_INTERNAL_API
/**
* Global operator new, defined only inside ICU4C, must not be used.
* Crashes intentionally.
@@ -499,6 +537,7 @@ operator delete[](void * /*p*/) {
*q=5; /* break it */
}
+#endif /* U_HIDE_INTERNAL_API */
#endif
/*===========================================================================*/
@@ -559,7 +598,7 @@ typedef enum UErrorCode {
U_PARSE_ERROR = 9, /**< Equivalent to Java ParseException */
U_INVALID_CHAR_FOUND = 10, /**< Character conversion: Unmappable input sequence. In other APIs: Invalid character. */
U_TRUNCATED_CHAR_FOUND = 11, /**< Character conversion: Incomplete input sequence. */
- U_ILLEGAL_CHAR_FOUND = 12, /**< Character conversion: Illegal input sequence/combination of input units.. */
+ U_ILLEGAL_CHAR_FOUND = 12, /**< Character conversion: Illegal input sequence/combination of input units. */
U_INVALID_TABLE_FORMAT = 13, /**< Conversion table file found, but corrupted */
U_INVALID_TABLE_FILE = 14, /**< Conversion table file not found */
U_BUFFER_OVERFLOW_ERROR = 15, /**< A result would not fit in the supplied buffer */
@@ -578,6 +617,7 @@ typedef enum UErrorCode {
U_INVALID_STATE_ERROR = 27, /**< Requested operation can not be completed with ICU in its current state */
U_COLLATOR_VERSION_MISMATCH = 28, /**< Collator version is not compatible with the base version */
U_USELESS_COLLATOR_ERROR = 29, /**< Collator is options only and no base is specified */
+ U_NO_WRITE_PERMISSION = 30, /**< Attempt to modify read-only or constant data. */
U_STANDARD_ERROR_LIMIT, /**< This must always be the last value to indicate the limit for standard errors */
/*
@@ -643,8 +683,8 @@ typedef enum UErrorCode {
/*
* the error code range 0x10200 0x102ff are reserved for Break Iterator related error
*/
+ U_BRK_INTERNAL_ERROR=0x10200, /**< An internal error (bug) was detected. */
U_BRK_ERROR_START=0x10200, /**< Start of codes indicating Break Iterator failures */
- U_BRK_INTERNAL_ERROR, /**< An internal error (bug) was detected. */
U_BRK_HEX_DIGITS_EXPECTED, /**< Hex digits expected as part of a escaped char in a rule. */
U_BRK_SEMICOLON_EXPECTED, /**< Missing ';' at the end of a RBBI rule. */
U_BRK_RULE_SYNTAX, /**< Syntax error in RBBI rule. */
@@ -663,8 +703,8 @@ typedef enum UErrorCode {
/*
* The error codes in the range 0x10300-0x103ff are reserved for regular expression related errrs
*/
+ U_REGEX_INTERNAL_ERROR=0x10300, /**< An internal error (bug) was detected. */
U_REGEX_ERROR_START=0x10300, /**< Start of codes indicating Regexp failures */
- U_REGEX_INTERNAL_ERROR, /**< An internal error (bug) was detected. */
U_REGEX_RULE_SYNTAX, /**< Syntax error in regexp pattern. */
U_REGEX_INVALID_STATE, /**< RegexMatcher in invalid state for requested operation */
U_REGEX_BAD_ESCAPE_SEQUENCE, /**< Unrecognized backslash escape sequence in pattern */
@@ -683,14 +723,15 @@ typedef enum UErrorCode {
/*
* The error code in the range 0x10400-0x104ff are reserved for IDNA related error codes
*/
+ U_IDNA_PROHIBITED_ERROR=0x10400,
U_IDNA_ERROR_START=0x10400,
- U_IDNA_PROHIBITED_ERROR,
U_IDNA_UNASSIGNED_ERROR,
U_IDNA_CHECK_BIDI_ERROR,
U_IDNA_STD3_ASCII_RULES_ERROR,
U_IDNA_ACE_PREFIX_ERROR,
U_IDNA_VERIFICATION_ERROR,
U_IDNA_LABEL_TOO_LONG_ERROR,
+ U_IDNA_ZERO_LENGTH_LABEL_ERROR,
U_IDNA_ERROR_LIMIT,
/*
* Aliases for StringPrep
diff --git a/icuSources/common/unicode/uversion.h b/icuSources/common/unicode/uversion.h
index f9a7755b..67e57a8c 100644
--- a/icuSources/common/unicode/uversion.h
+++ b/icuSources/common/unicode/uversion.h
@@ -1,6 +1,6 @@
/*
*******************************************************************************
-* Copyright (C) 2000-2004, International Business Machines
+* Copyright (C) 2000-2006, International Business Machines
* Corporation and others. All Rights Reserved.
*******************************************************************************
*
@@ -15,6 +15,10 @@
* Gets included by utypes.h and Windows .rc files
*/
+/**
+ * \file
+ * \brief C API: Contains all the important version numbers for ICU.
+ */
/*===========================================================================*/
/* Main ICU version information */
/*===========================================================================*/
@@ -22,20 +26,22 @@
#ifndef UVERSION_H
#define UVERSION_H
-/** IMPORTANT: When updating version, the following things need to be done: */
-/** source/common/unicode/uversion.h - this file: update major, minor, */
-/** patchlevel, suffix, version, short version constants, namespace, */
-/** and copyright */
-/** source/common/common.dsp - update 'Output file name' on the link tab so */
-/** that it contains the new major/minor combination */
-/** source/i18n/i18n.dsp - same as for the common.dsp */
-/** source/layout/layout.dsp - same as for the common.dsp */
-/** source/stubdata/stubdata.dsp - same as for the common.dsp */
-/** source/extra/ustdio/ustdio.dsp - same as for the common.dsp */
-/** source/data/makedata.mak - change U_ICUDATA_NAME so that it contains */
-/** the new major/minor combination */
-/** source/tools/genren/genren.pl - use this script according to the README */
-/** in that folder */
+/**
+ * IMPORTANT: When updating version, the following things need to be done:
+ * source/common/unicode/uversion.h - this file: update major, minor,
+ * patchlevel, suffix, version, short version constants, namespace,
+ * and copyright
+ * source/common/common.vcproj - update 'Output file name' on the link tab so
+ * that it contains the new major/minor combination
+ * source/i18n/i18n.vcproj - same as for the common.vcproj
+ * source/layout/layout.vcproj - same as for the common.vcproj
+ * source/stubdata/stubdata.vcproj - same as for the common.vcproj
+ * source/io/io.vcproj - same as for the common.vcproj
+ * source/data/makedata.mak - change U_ICUDATA_NAME so that it contains
+ * the new major/minor combination
+ * source/tools/genren/genren.pl - use this script according to the README
+ * in that folder
+ */
#include "unicode/umachine.h"
@@ -44,7 +50,7 @@
* @stable ICU 2.4
*/
#define U_COPYRIGHT_STRING \
- " Copyright (C) 2004, International Business Machines Corporation and others. All Rights Reserved. "
+ " Copyright (C) 2005, International Business Machines Corporation and others. All Rights Reserved. "
/** Maximum length of the copyright string.
* @stable ICU 2.4
@@ -61,7 +67,7 @@
* This value will change in the subsequent releases of ICU
* @stable ICU 2.6
*/
-#define U_ICU_VERSION_MINOR_NUM 2
+#define U_ICU_VERSION_MINOR_NUM 6
/** The current ICU patchlevel version as an integer.
* This value will change in the subsequent releases of ICU
@@ -69,24 +75,32 @@
*/
#define U_ICU_VERSION_PATCHLEVEL_NUM 0
+/** The current ICU build level version as an integer.
+ * This value is for use by ICU clients. It defaults to 0.
+ * @draft ICU 4.0
+ */
+#ifndef U_ICU_VERSION_BUILDLEVEL_NUM
+#define U_ICU_VERSION_BUILDLEVEL_NUM 0
+#endif
+
/** Glued version suffix for renamers
* This value will change in the subsequent releases of ICU
* @stable ICU 2.6
*/
-#define U_ICU_VERSION_SUFFIX _3_2
+#define U_ICU_VERSION_SUFFIX _3_6
/** The current ICU library version as a dotted-decimal string. The patchlevel
* only appears in this string if it non-zero.
* This value will change in the subsequent releases of ICU
* @stable ICU 2.4
*/
-#define U_ICU_VERSION "3.2"
+#define U_ICU_VERSION "3.6"
/** The current ICU library major/minor version as a string without dots, for library name suffixes.
* This value will change in the subsequent releases of ICU
* @stable ICU 2.6
*/
-#define U_ICU_VERSION_SHORT "32"
+#define U_ICU_VERSION_SHORT "36"
/** An ICU version consists of up to 4 numbers from 0..255.
* @stable ICU 2.4
@@ -113,13 +127,21 @@ typedef uint8_t UVersionInfo[U_MAX_VERSION_LENGTH];
#define U_ICU_NAMESPACE icu
namespace U_ICU_NAMESPACE { }
#else
-#define U_ICU_NAMESPACE icu_3_2
+#define U_ICU_NAMESPACE icu_3_6
namespace U_ICU_NAMESPACE { }
namespace icu = U_ICU_NAMESPACE;
#endif
+
+#ifndef U_USING_ICU_NAMESPACE
+# define U_USING_ICU_NAMESPACE 1
+#endif
+
+#if U_USING_ICU_NAMESPACE
U_NAMESPACE_USE
#endif
+#endif
+
/*===========================================================================*/
/* General version helper functions. Definitions in putil.c */
@@ -180,10 +202,11 @@ u_getVersion(UVersionInfo versionArray);
* version 4 - ICU 2.2 - tracking UCA changes, ignore completely ignorables
* in contractions, ignore primary ignorables after shifted
* version 5 - ICU 2.8 - changed implicit generation code
+ * version 6 - ICU 3.4 - with the UCA 4.1, Thai tag is no longer generated or used
* This value may change in the subsequent releases of ICU
* @stable ICU 2.4
*/
-#define UCOL_RUNTIME_VERSION 5
+#define UCOL_RUNTIME_VERSION 6
/** Builder code version. When this is different, same tailoring might result
* in assigning different collation elements to code points
@@ -191,11 +214,13 @@ u_getVersion(UVersionInfo versionArray);
* closure. However, the tailorings should probably get same CEs assigned
* version 5 - ICU 2.2 - fixed some bugs, renamed some indirect values.
* version 6 - ICU 2.8 - fixed bug in builder that allowed 0xFF in primary values
+ * version 7 - ICU 3.4 - with the UCA 4.1 Thai tag is no longer processed, complete ignorables
+ * now break contractions
* Backward compatible with the old rules.
* This value may change in the subsequent releases of ICU
* @stable ICU 2.4
*/
-#define UCOL_BUILDER_VERSION 6
+#define UCOL_BUILDER_VERSION 7
/** *** Removed *** Instead we use the data we read from FractionalUCA.txt
* This is the version of FractionalUCA.txt tailoring rules
diff --git a/icuSources/common/uniset.cpp b/icuSources/common/uniset.cpp
index 07794e70..50e78630 100644
--- a/icuSources/common/uniset.cpp
+++ b/icuSources/common/uniset.cpp
@@ -1,6 +1,6 @@
/*
**********************************************************************
-* Copyright (C) 1999-2004, International Business Machines
+* Copyright (C) 1999-2006, International Business Machines
* Corporation and others. All Rights Reserved.
**********************************************************************
* Date Name Description
@@ -57,16 +57,6 @@ U_NAMESPACE_BEGIN
SymbolTable::~SymbolTable() {}
-/**
- * Minimum value that can be stored in a UnicodeSet.
- */
-const UChar32 UnicodeSet::MIN_VALUE = UNICODESET_LOW;
-
-/**
- * Maximum value that can be stored in a UnicodeSet.
- */
-const UChar32 UnicodeSet::MAX_VALUE = UNICODESET_HIGH - 1;
-
UOBJECT_DEFINE_RTTI_IMPLEMENTATION(UnicodeSet)
/**
@@ -349,24 +339,27 @@ int32_t UnicodeSet::findCodePoint(UChar32 c) const {
// Return the smallest i such that c < list[i]. Assume
// list[len - 1] == HIGH and that c is legal (0..HIGH-1).
- if (c < list[0]) return 0;
+ if (c < list[0])
+ return 0;
// High runner test. c is often after the last range, so an
// initial check for this condition pays off.
- if (len >= 2 && c >= list[len-2]) return len-1;
+ if (len >= 2 && c >= list[len-2])
+ return len-1;
int32_t lo = 0;
int32_t hi = len - 1;
// invariant: c >= list[lo]
// invariant: c < list[hi]
for (;;) {
int32_t i = (lo + hi) >> 1;
- if (i == lo) return hi;
- if (c < list[i]) {
+ if (i == lo) {
+ break; // Found!
+ } else if (c < list[i]) {
hi = i;
} else {
lo = i;
}
}
- return 0; // To make compiler happy; never reached
+ return hi;
}
/**
diff --git a/icuSources/common/uniset_props.cpp b/icuSources/common/uniset_props.cpp
index c0ffa87c..fe6e1291 100644
--- a/icuSources/common/uniset_props.cpp
+++ b/icuSources/common/uniset_props.cpp
@@ -1,7 +1,7 @@
/*
*******************************************************************************
*
-* Copyright (C) 1999-2004, International Business Machines
+* Copyright (C) 1999-2006, International Business Machines
* Corporation and others. All Rights Reserved.
*
*******************************************************************************
@@ -28,7 +28,6 @@
#include "uset_imp.h"
#include "ruleiter.h"
#include "cmemory.h"
-#include "uhash.h"
#include "ucln_cmn.h"
#include "util.h"
#include "uvector.h"
@@ -36,13 +35,15 @@
#include "propname.h"
#include "unormimp.h"
#include "ucase.h"
+#include "ubidi_props.h"
#include "uinvchar.h"
#include "charstr.h"
#include "cstring.h"
#include "mutex.h"
#include "uassert.h"
#include "hash.h"
-#include "ucmp8.h"
+
+#define LENGTHOF(array) (int32_t)(sizeof(array)/sizeof((array)[0]))
// initial storage. Must be >= 0
// *** same as in uniset.cpp ! ***
@@ -66,101 +67,32 @@
#define UPPER_N ((UChar)78) /*N*/
#define EQUALS ((UChar)0x003D) /*=*/
-static const UChar POSIX_OPEN[] = { SET_OPEN,COLON,0 }; // "[:"
+//static const UChar POSIX_OPEN[] = { SET_OPEN,COLON,0 }; // "[:"
static const UChar POSIX_CLOSE[] = { COLON,SET_CLOSE,0 }; // ":]"
-static const UChar PERL_OPEN[] = { BACKSLASH,LOWER_P,0 }; // "\\p"
+//static const UChar PERL_OPEN[] = { BACKSLASH,LOWER_P,0 }; // "\\p"
static const UChar PERL_CLOSE[] = { CLOSE_BRACE,0 }; // "}"
-static const UChar NAME_OPEN[] = { BACKSLASH,UPPER_N,0 }; // "\\N"
+//static const UChar NAME_OPEN[] = { BACKSLASH,UPPER_N,0 }; // "\\N"
static const UChar HYPHEN_RIGHT_BRACE[] = {HYPHEN,SET_CLOSE,0}; /*-]*/
// Special property set IDs
static const char ANY[] = "ANY"; // [\u0000-\U0010FFFF]
static const char ASCII[] = "ASCII"; // [\u0000-\u007F]
+static const char ASSIGNED[] = "Assigned"; // [:^Cn:]
// Unicode name property alias
#define NAME_PROP "na"
#define NAME_PROP_LENGTH 2
-// TODO: Remove the following special-case code when
-// these four C99-compatibility properties are implemented
-// as enums/names.
-U_CDECL_BEGIN
- typedef UBool (U_CALLCONV *C99_Property_Function)(UChar32);
-U_CDECL_END
-static const struct C99_Map {
- const char* name;
- C99_Property_Function func;
-} C99_DISPATCH[] = {
- // These three entries omitted; they clash with PropertyAliases
- // names for Unicode properties, so UnicodeSet already maps them
- // to those properties.
- //{ "alpha", u_isalpha },
- //{ "lower", u_islower },
- //{ "upper", u_isupper },
-
- // MUST be in SORTED order
- { "blank", u_isblank },
- { "cntrl", u_iscntrl },
- { "digit", u_isdigit },
- { "graph", u_isgraph },
- { "print", u_isprint },
- { "punct", u_ispunct },
- { "space", u_isspace },
- { "title", u_istitle },
- { "xdigit", u_isxdigit }
-};
-#define C99_COUNT (9)
-
-// TEMPORARY: Remove when deprecated category code constructor is removed.
-static const UChar CATEGORY_NAMES[] = {
- // Must be kept in sync with uchar.h/UCharCategory
- 0x43, 0x6E, /* "Cn" */
- 0x4C, 0x75, /* "Lu" */
- 0x4C, 0x6C, /* "Ll" */
- 0x4C, 0x74, /* "Lt" */
- 0x4C, 0x6D, /* "Lm" */
- 0x4C, 0x6F, /* "Lo" */
- 0x4D, 0x6E, /* "Mn" */
- 0x4D, 0x65, /* "Me" */
- 0x4D, 0x63, /* "Mc" */
- 0x4E, 0x64, /* "Nd" */
- 0x4E, 0x6C, /* "Nl" */
- 0x4E, 0x6F, /* "No" */
- 0x5A, 0x73, /* "Zs" */
- 0x5A, 0x6C, /* "Zl" */
- 0x5A, 0x70, /* "Zp" */
- 0x43, 0x63, /* "Cc" */
- 0x43, 0x66, /* "Cf" */
- 0x43, 0x6F, /* "Co" */
- 0x43, 0x73, /* "Cs" */
- 0x50, 0x64, /* "Pd" */
- 0x50, 0x73, /* "Ps" */
- 0x50, 0x65, /* "Pe" */
- 0x50, 0x63, /* "Pc" */
- 0x50, 0x6F, /* "Po" */
- 0x53, 0x6D, /* "Sm" */
- 0x53, 0x63, /* "Sc" */
- 0x53, 0x6B, /* "Sk" */
- 0x53, 0x6F, /* "So" */
- 0x50, 0x69, /* "Pi" */
- 0x50, 0x66, /* "Pf" */
- 0x00
-};
-
/**
* Delimiter string used in patterns to close a category reference:
* ":]". Example: "[:Lu:]".
*/
-static const UChar CATEGORY_CLOSE[] = {COLON, SET_CLOSE, 0x0000}; /* ":]" */
+//static const UChar CATEGORY_CLOSE[] = {COLON, SET_CLOSE, 0x0000}; /* ":]" */
U_NAMESPACE_BEGIN
static UnicodeSet *INCLUSIONS[UPROPS_SRC_COUNT] = { NULL }; // cached getInclusions()
-static Hashtable* CASE_EQUIV_HASH = NULL; // for closeOver(USET_CASE)
-
-static CompactByteArray* CASE_EQUIV_CBA = NULL; // for closeOver(USET_CASE)
-
// helper functions for matching of pattern syntax pieces ------------------ ***
// these functions are parallel to the PERL_OPEN etc. strings above
@@ -174,10 +106,10 @@ isPerlOpen(const UnicodeString &pattern, int32_t pos) {
return pattern.charAt(pos)==BACKSLASH && ((c=pattern.charAt(pos+1))==LOWER_P || c==UPPER_P);
}
-static inline UBool
+/*static inline UBool
isPerlClose(const UnicodeString &pattern, int32_t pos) {
return pattern.charAt(pos)==CLOSE_BRACE;
-}
+}*/
static inline UBool
isNameOpen(const UnicodeString &pattern, int32_t pos) {
@@ -189,10 +121,10 @@ isPOSIXOpen(const UnicodeString &pattern, int32_t pos) {
return pattern.charAt(pos)==SET_OPEN && pattern.charAt(pos+1)==COLON;
}
-static inline UBool
+/*static inline UBool
isPOSIXClose(const UnicodeString &pattern, int32_t pos) {
return pattern.charAt(pos)==COLON && pattern.charAt(pos+1)==SET_CLOSE;
-}
+}*/
// TODO memory debugging provided inside uniset.cpp
// could be made available here but probably obsolete with use of modern
@@ -275,40 +207,6 @@ UnicodeSet::UnicodeSet(const UnicodeString& pattern, ParsePosition& pos,
_dbgct(this);
}
-#ifdef U_USE_UNICODESET_DEPRECATES
-/**
- * DEPRECATED Constructs a set from the given Unicode character category.
- * @param category an integer indicating the character category as
- * defined in uchar.h.
- * @deprecated To be removed after 2002-DEC-31
- */
-UnicodeSet::UnicodeSet(int8_t category, UErrorCode& status) :
- len(0), capacity(START_EXTRA), bufferCapacity(0),
- list(0), buffer(0), strings(0)
-{
- static const UChar OPEN[] = { 91, 58, 0 }; // "[:"
- static const UChar CLOSE[]= { 58, 93, 0 }; // ":]"
- if (U_SUCCESS(status)) {
- if (category < 0 || category >= U_CHAR_CATEGORY_COUNT) {
- status = U_ILLEGAL_ARGUMENT_ERROR;
- } else {
- UnicodeString pattern(FALSE, CATEGORY_NAMES + category*2, 2);
- pattern.insert(0, OPEN);
- pattern.append(CLOSE);
- list = (UChar32*) uprv_malloc(sizeof(UChar32) * capacity);
- /* test for NULL */
- if(list == NULL) {
- status = U_MEMORY_ALLOCATION_ERROR;
- }else{
- allocateStrings();
- applyPattern(pattern, status);
- }
- }
- }
- _dbgct(this);
-}
-#endif
-
//----------------------------------------------------------------
// Public API
//----------------------------------------------------------------
@@ -806,7 +704,7 @@ void UnicodeSet::applyPattern(RuleCharacterIterator& chars,
* patterns like /[^abc]/i work.
*/
if ((options & USET_CASE_INSENSITIVE) != 0) {
- closeOver(USET_CASE);
+ closeOver(USET_CASE_INSENSITIVE);
}
else if ((options & USET_ADD_CASE_MAPPINGS) != 0) {
closeOver(USET_ADD_CASE_MAPPINGS);
@@ -933,14 +831,6 @@ static UBool mungeCharName(char* dst, const char* src, int32_t dstCapacity) {
#define FAIL(ec) {ec=U_ILLEGAL_ARGUMENT_ERROR; return *this;}
-// TODO: Remove the following special-case code when
-// these four C99-compatibility properties are implemented
-// as enums/names.
-static UBool c99Filter(UChar32 ch, void* context) {
- struct C99_Map* m = (struct C99_Map*) context;
- return m->func(ch);
-}
-
UnicodeSet&
UnicodeSet::applyIntPropertyValue(UProperty prop, int32_t value, UErrorCode& ec) {
if (U_FAILURE(ec)) return *this;
@@ -976,7 +866,7 @@ UnicodeSet::applyPropertyAlias(const UnicodeString& prop,
UProperty p;
int32_t v;
- UBool mustNotBeEmpty = FALSE;
+ UBool mustNotBeEmpty = FALSE, invert = FALSE;
if (value.length() > 0) {
p = u_getPropertyEnum(pname);
@@ -1053,7 +943,7 @@ UnicodeSet::applyPropertyAlias(const UnicodeString& prop,
if (!mungeCharName(buf, vname, sizeof(buf))) FAIL(ec);
UVersionInfo version;
u_versionFromString(version, buf);
- applyFilter(versionFilter, &version, UPROPS_SRC_CHAR, ec);
+ applyFilter(versionFilter, &version, UPROPS_SRC_PROPSVEC, ec);
return *this;
}
break;
@@ -1083,22 +973,12 @@ UnicodeSet::applyPropertyAlias(const UnicodeString& prop,
} else if (0 == uprv_comparePropertyNames(ASCII, pname)) {
set(0, 0x7F);
return *this;
+ } else if (0 == uprv_comparePropertyNames(ASSIGNED, pname)) {
+ // [:Assigned:]=[:^Cn:]
+ p = UCHAR_GENERAL_CATEGORY_MASK;
+ v = U_GC_CN_MASK;
+ invert = TRUE;
} else {
-
- // TODO: Remove the following special-case code when
- // these four C99-compatibility properties are implemented
- // as enums/names.
- for (int32_t i=0; isize() > 0) {
- for (int32_t j=0; jsize(); ++j) {
- str = * (const UnicodeString*) strings->elementAt(j);
- foldSet.caseCloseOne(str.foldCase());
- }
- }
- *this = foldSet;
- }
- else if ((attribute & USET_ADD_CASE_MAPPINGS)) {
- UnicodeSet foldSet(*this);
- UnicodeString str;
+ if (attribute & (USET_CASE_INSENSITIVE | USET_ADD_CASE_MAPPINGS)) {
UErrorCode status = U_ZERO_ERROR;
- UCaseProps *csp = ucase_getSingleton(&status);
+ const UCaseProps *csp = ucase_getSingleton(&status);
if (U_SUCCESS(status)) {
+ UnicodeSet foldSet(*this);
+ UnicodeString str;
+ USetAdder sa = {
+ (USet *)&foldSet,
+ _set_add,
+ _set_addRange,
+ _set_addString,
+ NULL // don't need remove()
+ };
+
+ // start with input set to guarantee inclusion
+ // USET_CASE: remove strings because the strings will actually be reduced (folded);
+ // therefore, start with no strings and add only those needed
+ if (attribute & USET_CASE_INSENSITIVE) {
+ foldSet.strings->removeAllElements();
+ }
+
int32_t n = getRangeCount();
UChar32 result;
const UChar *full;
@@ -1442,45 +1320,64 @@ UnicodeSet& UnicodeSet::closeOver(int32_t attribute) {
UChar32 start = getRangeStart(i);
UChar32 end = getRangeEnd(i);
- for (UChar32 cp=start; cp<=end; ++cp) {
- result = ucase_toFullLower(csp, cp, NULL, NULL, &full, "", &locCache);
- addCaseMapping(foldSet, result, full, str);
+ if (attribute & USET_CASE_INSENSITIVE) {
+ // full case closure
+ for (UChar32 cp=start; cp<=end; ++cp) {
+ ucase_addCaseClosure(csp, cp, &sa);
+ }
+ } else {
+ // add case mappings
+ // (does not add long s for regular s, or Kelvin for k, for example)
+ for (UChar32 cp=start; cp<=end; ++cp) {
+ result = ucase_toFullLower(csp, cp, NULL, NULL, &full, "", &locCache);
+ addCaseMapping(foldSet, result, full, str);
- result = ucase_toFullTitle(csp, cp, NULL, NULL, &full, "", &locCache);
- addCaseMapping(foldSet, result, full, str);
+ result = ucase_toFullTitle(csp, cp, NULL, NULL, &full, "", &locCache);
+ addCaseMapping(foldSet, result, full, str);
- result = ucase_toFullUpper(csp, cp, NULL, NULL, &full, "", &locCache);
- addCaseMapping(foldSet, result, full, str);
+ result = ucase_toFullUpper(csp, cp, NULL, NULL, &full, "", &locCache);
+ addCaseMapping(foldSet, result, full, str);
- result = ucase_toFullFolding(csp, cp, &full, 0);
- addCaseMapping(foldSet, result, full, str);
+ result = ucase_toFullFolding(csp, cp, &full, 0);
+ addCaseMapping(foldSet, result, full, str);
+ }
}
}
if (strings != NULL && strings->size() > 0) {
- Locale root("");
+ if (attribute & USET_CASE_INSENSITIVE) {
+ for (int32_t j=0; jsize(); ++j) {
+ str = *(const UnicodeString *) strings->elementAt(j);
+ str.foldCase();
+ if(!ucase_addStringCaseClosure(csp, str.getBuffer(), str.length(), &sa)) {
+ foldSet.add(str); // does not map to code points: add the folded string itself
+ }
+ }
+ } else {
+ Locale root("");
#if !UCONFIG_NO_BREAK_ITERATION
- BreakIterator *bi = BreakIterator::createWordInstance(root, status);
+ BreakIterator *bi = BreakIterator::createWordInstance(root, status);
#endif
- if (U_SUCCESS(status)) {
- const UnicodeString *pStr;
+ if (U_SUCCESS(status)) {
+ const UnicodeString *pStr;
- for (int32_t j=0; jsize(); ++j) {
- pStr = (const UnicodeString *) strings->elementAt(j);
- (str = *pStr).toLower(root);
- foldSet.add(str);
+ for (int32_t j=0; jsize(); ++j) {
+ pStr = (const UnicodeString *) strings->elementAt(j);
+ (str = *pStr).toLower(root);
+ foldSet.add(str);
#if !UCONFIG_NO_BREAK_ITERATION
- (str = *pStr).toTitle(bi, root);
- foldSet.add(str);
+ (str = *pStr).toTitle(bi, root);
+ foldSet.add(str);
#endif
- (str = *pStr).toUpper(root);
- foldSet.add(str);
- (str = *pStr).foldCase();
- foldSet.add(str);
+ (str = *pStr).toUpper(root);
+ foldSet.add(str);
+ (str = *pStr).foldCase();
+ foldSet.add(str);
+ }
}
- }
#if !UCONFIG_NO_BREAK_ITERATION
- delete bi;
+ delete bi;
#endif
+ }
}
*this = foldSet;
}
@@ -1488,525 +1385,4 @@ UnicodeSet& UnicodeSet::closeOver(int32_t attribute) {
return *this;
}
-//----------------------------------------------------------------
-// Case folding implementation
-//----------------------------------------------------------------
-
-/**
- * Data structure representing a case-fold equivalency class. It is a
- * SET containing 0 or more code units, and 0 or more strings of
- * length 2 code units or longer.
- *
- * This class is implemented as a 8-UChar buffer with a few
- * convenience methods on it. The format of the buffer:
- * - All single code units in this set, followed by a terminating
- * zero. If none, then just a terminating zero.
- * - Zero or more 0-terminated strings, each of length >= 2
- * code units.
- * - A single terminating (UChar)0.
- *
- * Usage:
- *
- * const CaseEquivClass& c = ...;
- * const UChar* p;
- * for (c.getStrings(p); *p; c.nextString(p)) {
- * foo(p);
- * }
- */
-class CaseEquivClass {
-public:
- UChar data[8];
-
- /**
- * Return the string of single code units. May be "". Will never
- * be NULL.
- */
- const UChar* getSingles() const {
- return data;
- }
-
- /**
- * Return the first multi-code-unit string. May be "" if there
- * are none. Will never be NULL.
- * @param p pointer to be set to point to the first string.
- */
- void getStrings(const UChar*& p) const {
- p = data;
- nextString(p);
- }
-
- /**
- * Advance a pointer from one multi-code-unit string to the next.
- * May advance 'p' to point to "" if there are no more.
- * Do NOT call if *p == 0.
- * @param p pointer to be advanced to point to the next string.
- */
- static void nextString(const UChar*& p) {
- while (*p++) {}
- }
-};
-
-/**
- * IMPORTANT: The following two static data arrays represent the
- * information used to do case closure. The first array is an array
- * of pairs. That is, for each even index e, entries [e] and [e+1]
- * form a pair of case equivalent code units. The entry at [e] is the
- * folded one, that is, the one for which u_foldCase(x)==x.
- *
- * The second static array is an array of CaseEquivClass objects.
- * Since these objects are just adorned UChar[] arrays, they can be
- * initialized in place in the array, and all of them can live in a
- * single piece of static memory, with no heap allocation.
- */
-
-// MACHINE-GENERATED: Do not edit (see com.ibm.icu.dev.tools.translit.UnicodeSetCloseOver)
-static const UChar CASE_PAIRS[] = {
- 0x0061,0x0041,0x0062,0x0042,0x0063,0x0043,0x0064,0x0044,0x0065,0x0045,
- 0x0066,0x0046,0x0067,0x0047,0x0068,0x0048,0x0069,0x0049,0x006A,0x004A,
- 0x006C,0x004C,0x006D,0x004D,0x006E,0x004E,0x006F,0x004F,0x0070,0x0050,
- 0x0071,0x0051,0x0072,0x0052,0x0074,0x0054,0x0075,0x0055,0x0076,0x0056,
- 0x0077,0x0057,0x0078,0x0058,0x0079,0x0059,0x007A,0x005A,0x00E0,0x00C0,
- 0x00E1,0x00C1,0x00E2,0x00C2,0x00E3,0x00C3,0x00E4,0x00C4,0x00E6,0x00C6,
- 0x00E7,0x00C7,0x00E8,0x00C8,0x00E9,0x00C9,0x00EA,0x00CA,0x00EB,0x00CB,
- 0x00EC,0x00CC,0x00ED,0x00CD,0x00EE,0x00CE,0x00EF,0x00CF,0x00F0,0x00D0,
- 0x00F1,0x00D1,0x00F2,0x00D2,0x00F3,0x00D3,0x00F4,0x00D4,0x00F5,0x00D5,
- 0x00F6,0x00D6,0x00F8,0x00D8,0x00F9,0x00D9,0x00FA,0x00DA,0x00FB,0x00DB,
- 0x00FC,0x00DC,0x00FD,0x00DD,0x00FE,0x00DE,0x00FF,0x0178,0x0101,0x0100,
- 0x0103,0x0102,0x0105,0x0104,0x0107,0x0106,0x0109,0x0108,0x010B,0x010A,
- 0x010D,0x010C,0x010F,0x010E,0x0111,0x0110,0x0113,0x0112,0x0115,0x0114,
- 0x0117,0x0116,0x0119,0x0118,0x011B,0x011A,0x011D,0x011C,0x011F,0x011E,
- 0x0121,0x0120,0x0123,0x0122,0x0125,0x0124,0x0127,0x0126,0x0129,0x0128,
- 0x012B,0x012A,0x012D,0x012C,0x012F,0x012E,0x0133,0x0132,0x0135,0x0134,
- 0x0137,0x0136,0x013A,0x0139,0x013C,0x013B,0x013E,0x013D,0x0140,0x013F,
- 0x0142,0x0141,0x0144,0x0143,0x0146,0x0145,0x0148,0x0147,0x014B,0x014A,
- 0x014D,0x014C,0x014F,0x014E,0x0151,0x0150,0x0153,0x0152,0x0155,0x0154,
- 0x0157,0x0156,0x0159,0x0158,0x015B,0x015A,0x015D,0x015C,0x015F,0x015E,
- 0x0161,0x0160,0x0163,0x0162,0x0165,0x0164,0x0167,0x0166,0x0169,0x0168,
- 0x016B,0x016A,0x016D,0x016C,0x016F,0x016E,0x0171,0x0170,0x0173,0x0172,
- 0x0175,0x0174,0x0177,0x0176,0x017A,0x0179,0x017C,0x017B,0x017E,0x017D,
- 0x0183,0x0182,0x0185,0x0184,0x0188,0x0187,0x018C,0x018B,0x0192,0x0191,
- 0x0195,0x01F6,0x0199,0x0198,0x019E,0x0220,0x01A1,0x01A0,0x01A3,0x01A2,
- 0x01A5,0x01A4,0x01A8,0x01A7,0x01AD,0x01AC,0x01B0,0x01AF,0x01B4,0x01B3,
- 0x01B6,0x01B5,0x01B9,0x01B8,0x01BD,0x01BC,0x01BF,0x01F7,0x01CE,0x01CD,
- 0x01D0,0x01CF,0x01D2,0x01D1,0x01D4,0x01D3,0x01D6,0x01D5,0x01D8,0x01D7,
- 0x01DA,0x01D9,0x01DC,0x01DB,0x01DD,0x018E,0x01DF,0x01DE,0x01E1,0x01E0,
- 0x01E3,0x01E2,0x01E5,0x01E4,0x01E7,0x01E6,0x01E9,0x01E8,0x01EB,0x01EA,
- 0x01ED,0x01EC,0x01EF,0x01EE,0x01F5,0x01F4,0x01F9,0x01F8,0x01FB,0x01FA,
- 0x01FD,0x01FC,0x01FF,0x01FE,0x0201,0x0200,0x0203,0x0202,0x0205,0x0204,
- 0x0207,0x0206,0x0209,0x0208,0x020B,0x020A,0x020D,0x020C,0x020F,0x020E,
- 0x0211,0x0210,0x0213,0x0212,0x0215,0x0214,0x0217,0x0216,0x0219,0x0218,
- 0x021B,0x021A,0x021D,0x021C,0x021F,0x021E,0x0223,0x0222,0x0225,0x0224,
- 0x0227,0x0226,0x0229,0x0228,0x022B,0x022A,0x022D,0x022C,0x022F,0x022E,
- 0x0231,0x0230,0x0233,0x0232,0x0253,0x0181,0x0254,0x0186,0x0256,0x0189,
- 0x0257,0x018A,0x0259,0x018F,0x025B,0x0190,0x0260,0x0193,0x0263,0x0194,
- 0x0268,0x0197,0x0269,0x0196,0x026F,0x019C,0x0272,0x019D,0x0275,0x019F,
- 0x0280,0x01A6,0x0283,0x01A9,0x0288,0x01AE,0x028A,0x01B1,0x028B,0x01B2,
- 0x0292,0x01B7,0x03AC,0x0386,0x03AD,0x0388,0x03AE,0x0389,0x03AF,0x038A,
- 0x03B1,0x0391,0x03B3,0x0393,0x03B4,0x0394,0x03B6,0x0396,0x03B7,0x0397,
- 0x03BB,0x039B,0x03BD,0x039D,0x03BE,0x039E,0x03BF,0x039F,0x03C4,0x03A4,
- 0x03C5,0x03A5,0x03C7,0x03A7,0x03C8,0x03A8,0x03CA,0x03AA,0x03CB,0x03AB,
- 0x03CC,0x038C,0x03CD,0x038E,0x03CE,0x038F,0x03D9,0x03D8,0x03DB,0x03DA,
- 0x03DD,0x03DC,0x03DF,0x03DE,0x03E1,0x03E0,0x03E3,0x03E2,0x03E5,0x03E4,
- 0x03E7,0x03E6,0x03E9,0x03E8,0x03EB,0x03EA,0x03ED,0x03EC,0x03EF,0x03EE,
- 0x0430,0x0410,0x0431,0x0411,0x0432,0x0412,0x0433,0x0413,0x0434,0x0414,
- 0x0435,0x0415,0x0436,0x0416,0x0437,0x0417,0x0438,0x0418,0x0439,0x0419,
- 0x043A,0x041A,0x043B,0x041B,0x043C,0x041C,0x043D,0x041D,0x043E,0x041E,
- 0x043F,0x041F,0x0440,0x0420,0x0441,0x0421,0x0442,0x0422,0x0443,0x0423,
- 0x0444,0x0424,0x0445,0x0425,0x0446,0x0426,0x0447,0x0427,0x0448,0x0428,
- 0x0449,0x0429,0x044A,0x042A,0x044B,0x042B,0x044C,0x042C,0x044D,0x042D,
- 0x044E,0x042E,0x044F,0x042F,0x0450,0x0400,0x0451,0x0401,0x0452,0x0402,
- 0x0453,0x0403,0x0454,0x0404,0x0455,0x0405,0x0456,0x0406,0x0457,0x0407,
- 0x0458,0x0408,0x0459,0x0409,0x045A,0x040A,0x045B,0x040B,0x045C,0x040C,
- 0x045D,0x040D,0x045E,0x040E,0x045F,0x040F,0x0461,0x0460,0x0463,0x0462,
- 0x0465,0x0464,0x0467,0x0466,0x0469,0x0468,0x046B,0x046A,0x046D,0x046C,
- 0x046F,0x046E,0x0471,0x0470,0x0473,0x0472,0x0475,0x0474,0x0477,0x0476,
- 0x0479,0x0478,0x047B,0x047A,0x047D,0x047C,0x047F,0x047E,0x0481,0x0480,
- 0x048B,0x048A,0x048D,0x048C,0x048F,0x048E,0x0491,0x0490,0x0493,0x0492,
- 0x0495,0x0494,0x0497,0x0496,0x0499,0x0498,0x049B,0x049A,0x049D,0x049C,
- 0x049F,0x049E,0x04A1,0x04A0,0x04A3,0x04A2,0x04A5,0x04A4,0x04A7,0x04A6,
- 0x04A9,0x04A8,0x04AB,0x04AA,0x04AD,0x04AC,0x04AF,0x04AE,0x04B1,0x04B0,
- 0x04B3,0x04B2,0x04B5,0x04B4,0x04B7,0x04B6,0x04B9,0x04B8,0x04BB,0x04BA,
- 0x04BD,0x04BC,0x04BF,0x04BE,0x04C2,0x04C1,0x04C4,0x04C3,0x04C6,0x04C5,
- 0x04C8,0x04C7,0x04CA,0x04C9,0x04CC,0x04CB,0x04CE,0x04CD,0x04D1,0x04D0,
- 0x04D3,0x04D2,0x04D5,0x04D4,0x04D7,0x04D6,0x04D9,0x04D8,0x04DB,0x04DA,
- 0x04DD,0x04DC,0x04DF,0x04DE,0x04E1,0x04E0,0x04E3,0x04E2,0x04E5,0x04E4,
- 0x04E7,0x04E6,0x04E9,0x04E8,0x04EB,0x04EA,0x04ED,0x04EC,0x04EF,0x04EE,
- 0x04F1,0x04F0,0x04F3,0x04F2,0x04F5,0x04F4,0x04F9,0x04F8,0x0501,0x0500,
- 0x0503,0x0502,0x0505,0x0504,0x0507,0x0506,0x0509,0x0508,0x050B,0x050A,
- 0x050D,0x050C,0x050F,0x050E,0x0561,0x0531,0x0562,0x0532,0x0563,0x0533,
- 0x0564,0x0534,0x0565,0x0535,0x0566,0x0536,0x0567,0x0537,0x0568,0x0538,
- 0x0569,0x0539,0x056A,0x053A,0x056B,0x053B,0x056C,0x053C,0x056D,0x053D,
- 0x056E,0x053E,0x056F,0x053F,0x0570,0x0540,0x0571,0x0541,0x0572,0x0542,
- 0x0573,0x0543,0x0574,0x0544,0x0575,0x0545,0x0576,0x0546,0x0577,0x0547,
- 0x0578,0x0548,0x0579,0x0549,0x057A,0x054A,0x057B,0x054B,0x057C,0x054C,
- 0x057D,0x054D,0x057E,0x054E,0x057F,0x054F,0x0580,0x0550,0x0581,0x0551,
- 0x0582,0x0552,0x0583,0x0553,0x0584,0x0554,0x0585,0x0555,0x0586,0x0556,
- 0x1E01,0x1E00,0x1E03,0x1E02,0x1E05,0x1E04,0x1E07,0x1E06,0x1E09,0x1E08,
- 0x1E0B,0x1E0A,0x1E0D,0x1E0C,0x1E0F,0x1E0E,0x1E11,0x1E10,0x1E13,0x1E12,
- 0x1E15,0x1E14,0x1E17,0x1E16,0x1E19,0x1E18,0x1E1B,0x1E1A,0x1E1D,0x1E1C,
- 0x1E1F,0x1E1E,0x1E21,0x1E20,0x1E23,0x1E22,0x1E25,0x1E24,0x1E27,0x1E26,
- 0x1E29,0x1E28,0x1E2B,0x1E2A,0x1E2D,0x1E2C,0x1E2F,0x1E2E,0x1E31,0x1E30,
- 0x1E33,0x1E32,0x1E35,0x1E34,0x1E37,0x1E36,0x1E39,0x1E38,0x1E3B,0x1E3A,
- 0x1E3D,0x1E3C,0x1E3F,0x1E3E,0x1E41,0x1E40,0x1E43,0x1E42,0x1E45,0x1E44,
- 0x1E47,0x1E46,0x1E49,0x1E48,0x1E4B,0x1E4A,0x1E4D,0x1E4C,0x1E4F,0x1E4E,
- 0x1E51,0x1E50,0x1E53,0x1E52,0x1E55,0x1E54,0x1E57,0x1E56,0x1E59,0x1E58,
- 0x1E5B,0x1E5A,0x1E5D,0x1E5C,0x1E5F,0x1E5E,0x1E63,0x1E62,0x1E65,0x1E64,
- 0x1E67,0x1E66,0x1E69,0x1E68,0x1E6B,0x1E6A,0x1E6D,0x1E6C,0x1E6F,0x1E6E,
- 0x1E71,0x1E70,0x1E73,0x1E72,0x1E75,0x1E74,0x1E77,0x1E76,0x1E79,0x1E78,
- 0x1E7B,0x1E7A,0x1E7D,0x1E7C,0x1E7F,0x1E7E,0x1E81,0x1E80,0x1E83,0x1E82,
- 0x1E85,0x1E84,0x1E87,0x1E86,0x1E89,0x1E88,0x1E8B,0x1E8A,0x1E8D,0x1E8C,
- 0x1E8F,0x1E8E,0x1E91,0x1E90,0x1E93,0x1E92,0x1E95,0x1E94,0x1EA1,0x1EA0,
- 0x1EA3,0x1EA2,0x1EA5,0x1EA4,0x1EA7,0x1EA6,0x1EA9,0x1EA8,0x1EAB,0x1EAA,
- 0x1EAD,0x1EAC,0x1EAF,0x1EAE,0x1EB1,0x1EB0,0x1EB3,0x1EB2,0x1EB5,0x1EB4,
- 0x1EB7,0x1EB6,0x1EB9,0x1EB8,0x1EBB,0x1EBA,0x1EBD,0x1EBC,0x1EBF,0x1EBE,
- 0x1EC1,0x1EC0,0x1EC3,0x1EC2,0x1EC5,0x1EC4,0x1EC7,0x1EC6,0x1EC9,0x1EC8,
- 0x1ECB,0x1ECA,0x1ECD,0x1ECC,0x1ECF,0x1ECE,0x1ED1,0x1ED0,0x1ED3,0x1ED2,
- 0x1ED5,0x1ED4,0x1ED7,0x1ED6,0x1ED9,0x1ED8,0x1EDB,0x1EDA,0x1EDD,0x1EDC,
- 0x1EDF,0x1EDE,0x1EE1,0x1EE0,0x1EE3,0x1EE2,0x1EE5,0x1EE4,0x1EE7,0x1EE6,
- 0x1EE9,0x1EE8,0x1EEB,0x1EEA,0x1EED,0x1EEC,0x1EEF,0x1EEE,0x1EF1,0x1EF0,
- 0x1EF3,0x1EF2,0x1EF5,0x1EF4,0x1EF7,0x1EF6,0x1EF9,0x1EF8,0x1F00,0x1F08,
- 0x1F01,0x1F09,0x1F02,0x1F0A,0x1F03,0x1F0B,0x1F04,0x1F0C,0x1F05,0x1F0D,
- 0x1F06,0x1F0E,0x1F07,0x1F0F,0x1F10,0x1F18,0x1F11,0x1F19,0x1F12,0x1F1A,
- 0x1F13,0x1F1B,0x1F14,0x1F1C,0x1F15,0x1F1D,0x1F20,0x1F28,0x1F21,0x1F29,
- 0x1F22,0x1F2A,0x1F23,0x1F2B,0x1F24,0x1F2C,0x1F25,0x1F2D,0x1F26,0x1F2E,
- 0x1F27,0x1F2F,0x1F30,0x1F38,0x1F31,0x1F39,0x1F32,0x1F3A,0x1F33,0x1F3B,
- 0x1F34,0x1F3C,0x1F35,0x1F3D,0x1F36,0x1F3E,0x1F37,0x1F3F,0x1F40,0x1F48,
- 0x1F41,0x1F49,0x1F42,0x1F4A,0x1F43,0x1F4B,0x1F44,0x1F4C,0x1F45,0x1F4D,
- 0x1F51,0x1F59,0x1F53,0x1F5B,0x1F55,0x1F5D,0x1F57,0x1F5F,0x1F60,0x1F68,
- 0x1F61,0x1F69,0x1F62,0x1F6A,0x1F63,0x1F6B,0x1F64,0x1F6C,0x1F65,0x1F6D,
- 0x1F66,0x1F6E,0x1F67,0x1F6F,0x1F70,0x1FBA,0x1F71,0x1FBB,0x1F72,0x1FC8,
- 0x1F73,0x1FC9,0x1F74,0x1FCA,0x1F75,0x1FCB,0x1F76,0x1FDA,0x1F77,0x1FDB,
- 0x1F78,0x1FF8,0x1F79,0x1FF9,0x1F7A,0x1FEA,0x1F7B,0x1FEB,0x1F7C,0x1FFA,
- 0x1F7D,0x1FFB,0x1FB0,0x1FB8,0x1FB1,0x1FB9,0x1FD0,0x1FD8,0x1FD1,0x1FD9,
- 0x1FE0,0x1FE8,0x1FE1,0x1FE9,0x1FE5,0x1FEC,0x2170,0x2160,0x2171,0x2161,
- 0x2172,0x2162,0x2173,0x2163,0x2174,0x2164,0x2175,0x2165,0x2176,0x2166,
- 0x2177,0x2167,0x2178,0x2168,0x2179,0x2169,0x217A,0x216A,0x217B,0x216B,
- 0x217C,0x216C,0x217D,0x216D,0x217E,0x216E,0x217F,0x216F,0x24D0,0x24B6,
- 0x24D1,0x24B7,0x24D2,0x24B8,0x24D3,0x24B9,0x24D4,0x24BA,0x24D5,0x24BB,
- 0x24D6,0x24BC,0x24D7,0x24BD,0x24D8,0x24BE,0x24D9,0x24BF,0x24DA,0x24C0,
- 0x24DB,0x24C1,0x24DC,0x24C2,0x24DD,0x24C3,0x24DE,0x24C4,0x24DF,0x24C5,
- 0x24E0,0x24C6,0x24E1,0x24C7,0x24E2,0x24C8,0x24E3,0x24C9,0x24E4,0x24CA,
- 0x24E5,0x24CB,0x24E6,0x24CC,0x24E7,0x24CD,0x24E8,0x24CE,0x24E9,0x24CF,
- 0xFF41,0xFF21,0xFF42,0xFF22,0xFF43,0xFF23,0xFF44,0xFF24,0xFF45,0xFF25,
- 0xFF46,0xFF26,0xFF47,0xFF27,0xFF48,0xFF28,0xFF49,0xFF29,0xFF4A,0xFF2A,
- 0xFF4B,0xFF2B,0xFF4C,0xFF2C,0xFF4D,0xFF2D,0xFF4E,0xFF2E,0xFF4F,0xFF2F,
- 0xFF50,0xFF30,0xFF51,0xFF31,0xFF52,0xFF32,0xFF53,0xFF33,0xFF54,0xFF34,
- 0xFF55,0xFF35,0xFF56,0xFF36,0xFF57,0xFF37,0xFF58,0xFF38,0xFF59,0xFF39,
- 0xFF5A,0xFF3A,
-};
-
-// MACHINE-GENERATED: Do not edit (see com.ibm.icu.dev.tools.translit.UnicodeSetCloseOver)
-static const CaseEquivClass CASE_NONPAIRS[] = {
- {{0x1E9A,0, 0x0061,0x02BE,0, 0}},
- {{0xFB00,0, 0x0066,0x0066,0, 0}},
- {{0xFB03,0, 0x0066,0x0066,0x0069,0, 0}},
- {{0xFB04,0, 0x0066,0x0066,0x006C,0, 0}},
- {{0xFB01,0, 0x0066,0x0069,0, 0}},
- {{0xFB02,0, 0x0066,0x006C,0, 0}},
- {{0x1E96,0, 0x0068,0x0331,0, 0}},
- {{0x0130,0, 0x0069,0x0307,0, 0}},
- {{0x01F0,0, 0x006A,0x030C,0, 0}},
- {{0x004B,0x006B,0x212A,0, 0}},
- {{0x0053,0x0073,0x017F,0, 0}},
- {{0x00DF,0, 0x0073,0x0073,0, 0}},
- {{0xFB05,0xFB06,0, 0x0073,0x0074,0, 0}},
- {{0x1E97,0, 0x0074,0x0308,0, 0}},
- {{0x1E98,0, 0x0077,0x030A,0, 0}},
- {{0x1E99,0, 0x0079,0x030A,0, 0}},
- {{0x00C5,0x00E5,0x212B,0, 0}},
- {{0x01C4,0x01C5,0x01C6,0, 0}},
- {{0x01C7,0x01C8,0x01C9,0, 0}},
- {{0x01CA,0x01CB,0x01CC,0, 0}},
- {{0x01F1,0x01F2,0x01F3,0, 0}},
- {{0x0149,0, 0x02BC,0x006E,0, 0}},
- {{0x1FB4,0, 0x03AC,0x03B9,0, 0}},
- {{0x1FC4,0, 0x03AE,0x03B9,0, 0}},
- {{0x1FB6,0, 0x03B1,0x0342,0, 0}},
- {{0x1FB7,0, 0x03B1,0x0342,0x03B9,0, 0}},
- {{0x1FB3,0x1FBC,0, 0x03B1,0x03B9,0, 0}},
- {{0x0392,0x03B2,0x03D0,0, 0}},
- {{0x0395,0x03B5,0x03F5,0, 0}},
- {{0x1FC6,0, 0x03B7,0x0342,0, 0}},
- {{0x1FC7,0, 0x03B7,0x0342,0x03B9,0, 0}},
- {{0x1FC3,0x1FCC,0, 0x03B7,0x03B9,0, 0}},
- {{0x0398,0x03B8,0x03D1,0x03F4,0, 0}},
- {{0x0345,0x0399,0x03B9,0x1FBE,0, 0}},
- {{0x1FD2,0, 0x03B9,0x0308,0x0300,0, 0}},
- {{0x0390,0x1FD3,0, 0x03B9,0x0308,0x0301,0, 0}},
- {{0x1FD7,0, 0x03B9,0x0308,0x0342,0, 0}},
- {{0x1FD6,0, 0x03B9,0x0342,0, 0}},
- {{0x039A,0x03BA,0x03F0,0, 0}},
- {{0x00B5,0x039C,0x03BC,0, 0}},
- {{0x03A0,0x03C0,0x03D6,0, 0}},
- {{0x03A1,0x03C1,0x03F1,0, 0}},
- {{0x1FE4,0, 0x03C1,0x0313,0, 0}},
- {{0x03A3,0x03C2,0x03C3,0x03F2,0, 0}},
- {{0x1FE2,0, 0x03C5,0x0308,0x0300,0, 0}},
- {{0x03B0,0x1FE3,0, 0x03C5,0x0308,0x0301,0, 0}},
- {{0x1FE7,0, 0x03C5,0x0308,0x0342,0, 0}},
- {{0x1F50,0, 0x03C5,0x0313,0, 0}},
- {{0x1F52,0, 0x03C5,0x0313,0x0300,0, 0}},
- {{0x1F54,0, 0x03C5,0x0313,0x0301,0, 0}},
- {{0x1F56,0, 0x03C5,0x0313,0x0342,0, 0}},
- {{0x1FE6,0, 0x03C5,0x0342,0, 0}},
- {{0x03A6,0x03C6,0x03D5,0, 0}},
- {{0x03A9,0x03C9,0x2126,0, 0}},
- {{0x1FF6,0, 0x03C9,0x0342,0, 0}},
- {{0x1FF7,0, 0x03C9,0x0342,0x03B9,0, 0}},
- {{0x1FF3,0x1FFC,0, 0x03C9,0x03B9,0, 0}},
- {{0x1FF4,0, 0x03CE,0x03B9,0, 0}},
- {{0x0587,0, 0x0565,0x0582,0, 0}},
- {{0xFB14,0, 0x0574,0x0565,0, 0}},
- {{0xFB15,0, 0x0574,0x056B,0, 0}},
- {{0xFB17,0, 0x0574,0x056D,0, 0}},
- {{0xFB13,0, 0x0574,0x0576,0, 0}},
- {{0xFB16,0, 0x057E,0x0576,0, 0}},
- {{0x1E60,0x1E61,0x1E9B,0, 0}},
- {{0x1F80,0x1F88,0, 0x1F00,0x03B9,0, 0}},
- {{0x1F81,0x1F89,0, 0x1F01,0x03B9,0, 0}},
- {{0x1F82,0x1F8A,0, 0x1F02,0x03B9,0, 0}},
- {{0x1F83,0x1F8B,0, 0x1F03,0x03B9,0, 0}},
- {{0x1F84,0x1F8C,0, 0x1F04,0x03B9,0, 0}},
- {{0x1F85,0x1F8D,0, 0x1F05,0x03B9,0, 0}},
- {{0x1F86,0x1F8E,0, 0x1F06,0x03B9,0, 0}},
- {{0x1F87,0x1F8F,0, 0x1F07,0x03B9,0, 0}},
- {{0x1F90,0x1F98,0, 0x1F20,0x03B9,0, 0}},
- {{0x1F91,0x1F99,0, 0x1F21,0x03B9,0, 0}},
- {{0x1F92,0x1F9A,0, 0x1F22,0x03B9,0, 0}},
- {{0x1F93,0x1F9B,0, 0x1F23,0x03B9,0, 0}},
- {{0x1F94,0x1F9C,0, 0x1F24,0x03B9,0, 0}},
- {{0x1F95,0x1F9D,0, 0x1F25,0x03B9,0, 0}},
- {{0x1F96,0x1F9E,0, 0x1F26,0x03B9,0, 0}},
- {{0x1F97,0x1F9F,0, 0x1F27,0x03B9,0, 0}},
- {{0x1FA0,0x1FA8,0, 0x1F60,0x03B9,0, 0}},
- {{0x1FA1,0x1FA9,0, 0x1F61,0x03B9,0, 0}},
- {{0x1FA2,0x1FAA,0, 0x1F62,0x03B9,0, 0}},
- {{0x1FA3,0x1FAB,0, 0x1F63,0x03B9,0, 0}},
- {{0x1FA4,0x1FAC,0, 0x1F64,0x03B9,0, 0}},
- {{0x1FA5,0x1FAD,0, 0x1F65,0x03B9,0, 0}},
- {{0x1FA6,0x1FAE,0, 0x1F66,0x03B9,0, 0}},
- {{0x1FA7,0x1FAF,0, 0x1F67,0x03B9,0, 0}},
- {{0x1FB2,0, 0x1F70,0x03B9,0, 0}},
- {{0x1FC2,0, 0x1F74,0x03B9,0, 0}},
- {{0x1FF2,0, 0x1F7C,0x03B9,0, 0}},
- {{0, 0xD801,0xDC00,0, 0xD801,0xDC28,0, 0}},
- {{0, 0xD801,0xDC01,0, 0xD801,0xDC29,0, 0}},
- {{0, 0xD801,0xDC02,0, 0xD801,0xDC2A,0, 0}},
- {{0, 0xD801,0xDC03,0, 0xD801,0xDC2B,0, 0}},
- {{0, 0xD801,0xDC04,0, 0xD801,0xDC2C,0, 0}},
- {{0, 0xD801,0xDC05,0, 0xD801,0xDC2D,0, 0}},
- {{0, 0xD801,0xDC06,0, 0xD801,0xDC2E,0, 0}},
- {{0, 0xD801,0xDC07,0, 0xD801,0xDC2F,0, 0}},
- {{0, 0xD801,0xDC08,0, 0xD801,0xDC30,0, 0}},
- {{0, 0xD801,0xDC09,0, 0xD801,0xDC31,0, 0}},
- {{0, 0xD801,0xDC0A,0, 0xD801,0xDC32,0, 0}},
- {{0, 0xD801,0xDC0B,0, 0xD801,0xDC33,0, 0}},
- {{0, 0xD801,0xDC0C,0, 0xD801,0xDC34,0, 0}},
- {{0, 0xD801,0xDC0D,0, 0xD801,0xDC35,0, 0}},
- {{0, 0xD801,0xDC0E,0, 0xD801,0xDC36,0, 0}},
- {{0, 0xD801,0xDC0F,0, 0xD801,0xDC37,0, 0}},
- {{0, 0xD801,0xDC10,0, 0xD801,0xDC38,0, 0}},
- {{0, 0xD801,0xDC11,0, 0xD801,0xDC39,0, 0}},
- {{0, 0xD801,0xDC12,0, 0xD801,0xDC3A,0, 0}},
- {{0, 0xD801,0xDC13,0, 0xD801,0xDC3B,0, 0}},
- {{0, 0xD801,0xDC14,0, 0xD801,0xDC3C,0, 0}},
- {{0, 0xD801,0xDC15,0, 0xD801,0xDC3D,0, 0}},
- {{0, 0xD801,0xDC16,0, 0xD801,0xDC3E,0, 0}},
- {{0, 0xD801,0xDC17,0, 0xD801,0xDC3F,0, 0}},
- {{0, 0xD801,0xDC18,0, 0xD801,0xDC40,0, 0}},
- {{0, 0xD801,0xDC19,0, 0xD801,0xDC41,0, 0}},
- {{0, 0xD801,0xDC1A,0, 0xD801,0xDC42,0, 0}},
- {{0, 0xD801,0xDC1B,0, 0xD801,0xDC43,0, 0}},
- {{0, 0xD801,0xDC1C,0, 0xD801,0xDC44,0, 0}},
- {{0, 0xD801,0xDC1D,0, 0xD801,0xDC45,0, 0}},
- {{0, 0xD801,0xDC1E,0, 0xD801,0xDC46,0, 0}},
- {{0, 0xD801,0xDC1F,0, 0xD801,0xDC47,0, 0}},
- {{0, 0xD801,0xDC20,0, 0xD801,0xDC48,0, 0}},
- {{0, 0xD801,0xDC21,0, 0xD801,0xDC49,0, 0}},
- {{0, 0xD801,0xDC22,0, 0xD801,0xDC4A,0, 0}},
- {{0, 0xD801,0xDC23,0, 0xD801,0xDC4B,0, 0}},
- {{0, 0xD801,0xDC24,0, 0xD801,0xDC4C,0, 0}},
- {{0, 0xD801,0xDC25,0, 0xD801,0xDC4D,0, 0}}
-};
-
-#define CASE_PAIRS_LENGTH (sizeof(CASE_PAIRS)/sizeof(CASE_PAIRS[0]))
-#define CASE_NONPAIRS_LENGTH (sizeof(CASE_NONPAIRS)/sizeof(CASE_NONPAIRS[0]))
-
-/**
- * Add to this set all members of the case fold equivalency class
- * that contains 'folded'.
- * @param folded a string within a case fold equivalency class.
- * It must have the property that UCharacter.foldCase(folded,
- * DEFAULT_CASE_MAP).equals(folded).
- */
-void UnicodeSet::caseCloseOne(const UnicodeString& folded) {
- if (folded.length() == 1) {
- caseCloseOne(folded.charAt(0));
- return;
- }
-
- const CaseEquivClass* c = getCaseMapOf(folded);
- if (c != NULL) {
- caseCloseOne(*c);
- return;
- }
-
- // Add 'folded' itself; it belongs to no equivalency class.
- add(folded);
-}
-
-/**
- * Add to this set all members of the case fold equivalency class
- * that contains 'folded'.
- * @param folded a code UNIT within a case fold equivalency class.
- * It must have the property that uchar_foldCase(folded,
- * DEFAULT_CASE_MAP) == folded.
- */
-void UnicodeSet::caseCloseOne(UChar folded) {
- // We must do a DOUBLE LOOKUP, first in the CompactByteArray that
- // indexes into CASE_NONPAIRS[] and then into the CASE_PAIRS[]
- // sorted array. A character will occur in one or the other, or
- // neither, but not both.
-
- // Look in the CompactByteArray.
- const CaseEquivClass* c = getCaseMapOf(folded);
- if (c != NULL) {
- caseCloseOne(*c);
- return;
- }
-
- // Binary search in pairs array, looking at only even entries.
- // The indices low, high, and x will be halved with respect to
- // CASE_PAIRS[]; that is, they must be doubled before indexing.
-
- // CASE_PAIRS has 1312 elements, of 656 pairs, so the search
- // takes no more than 10 passes.
- int32_t low = 0;
- int32_t high = (CASE_PAIRS_LENGTH >> 1) - 1;
- int32_t x;
- do {
- x = (low + high) >> 1;
- UChar ch = CASE_PAIRS[(uint32_t)(x << 1)];
- if (folded < ch) {
- high = x - 1;
- } else if (folded > ch) {
- low = x + 1;
- } else {
- break;
- }
- } while (low < high);
-
- x = (low + high) & ~1; // ((low + high) >> 1) << 1
- if (folded == CASE_PAIRS[x]) {
- add(CASE_PAIRS[x]);
- add(CASE_PAIRS[x+1]);
- } else {
- // If the search fails, then add folded itself; it is a
- // case-unique code unit.
- add(folded);
- }
-}
-
-/**
- * Add to this set all members of the given CaseEquivClass object.
- */
-void UnicodeSet::caseCloseOne(const CaseEquivClass& c) {
- const UChar* p = c.getSingles();
- while (*p) {
- add(*p++); // add all single code units
- }
- for (c.getStrings(p); *p; c.nextString(p)) {
- add(p); // add all strings
- }
-}
-
-/**
- * Given a folded string of length >= 2 code units, return the
- * CaseEquivClass containing this string, or NULL if none.
- */
-const CaseEquivClass* UnicodeSet::getCaseMapOf(const UnicodeString& folded) {
- umtx_lock(NULL);
- UBool f = (CASE_EQUIV_HASH == NULL);
- umtx_unlock(NULL);
-
- if (f) {
- // Create the Hashtable, which maps UnicodeStrings to index
- // values into CASE_NONPAIRS.
- UErrorCode ec = U_ZERO_ERROR;
- Hashtable* hash = new Hashtable();
- if (hash != NULL) {
- int32_t i;
- for (i=0; i<(int32_t)CASE_NONPAIRS_LENGTH; ++i) {
- const CaseEquivClass* c = &CASE_NONPAIRS[i];
- const UChar* p;
- for (c->getStrings(p); *p; c->nextString(p)) {
- hash->put(UnicodeString(p), (void*) c, ec);
- }
- }
- if (U_SUCCESS(ec)) {
- umtx_lock(NULL);
- if (CASE_EQUIV_HASH == NULL) {
- CASE_EQUIV_HASH = hash;
- hash = NULL;
- ucln_common_registerCleanup(UCLN_COMMON_USET, uset_cleanup);
- }
- umtx_unlock(NULL);
- }
- delete hash;
- }
- }
-
- return (CASE_EQUIV_HASH != NULL) ?
- (const CaseEquivClass*) CASE_EQUIV_HASH->get(folded) : NULL;
-}
-
-/**
- * Given a folded code unit, return the CaseEquivClass containing it,
- * or NULL if none.
- */
-const CaseEquivClass* UnicodeSet::getCaseMapOf(UChar folded) {
- umtx_lock(NULL);
- UBool f = (CASE_EQUIV_CBA == NULL);
- umtx_unlock(NULL);
-
- if (f) {
- // Create the CompactByteArray, which maps single code units
- // to index values into CASE_NONPAIRS.
- CompactByteArray* cba = ucmp8_open(-1);
- if (ucmp8_isBogus(cba)) {
- ucmp8_close(cba);
- cba = NULL;
- } else {
- int32_t i;
- for (i=0; i<(int32_t)CASE_NONPAIRS_LENGTH; ++i) {
- const UChar* p = CASE_NONPAIRS[i].getSingles();
- UChar ch;
- while ((ch = *p++) != 0) {
- ucmp8_set(cba, ch, (int8_t) i);
- }
- }
- ucmp8_compact(cba, 256);
- }
-
- umtx_lock(NULL);
- if (CASE_EQUIV_CBA == NULL) {
- CASE_EQUIV_CBA = cba;
- cba = NULL;
- ucln_common_registerCleanup(UCLN_COMMON_USET, uset_cleanup);
- }
- umtx_unlock(NULL);
- if (cba != NULL) {
- ucmp8_close(cba);
- }
- }
-
- if (CASE_EQUIV_CBA != NULL) {
- int32_t index = ucmp8_getu(CASE_EQUIV_CBA, folded);
- if (index != 255) {
- return &CASE_NONPAIRS[index];
- }
- }
- return NULL;
-}
-
U_NAMESPACE_END
diff --git a/icuSources/common/unistr.cpp b/icuSources/common/unistr.cpp
index 640ef899..1b3e9da5 100644
--- a/icuSources/common/unistr.cpp
+++ b/icuSources/common/unistr.cpp
@@ -1,6 +1,6 @@
/*
******************************************************************************
-* Copyright (C) 1999-2004, International Business Machines Corporation and *
+* Copyright (C) 1999-2005, International Business Machines Corporation and *
* others. All Rights Reserved. *
******************************************************************************
*
@@ -302,7 +302,7 @@ UnicodeString::UnicodeString(const char *src, int32_t length, EInvariant)
// treat as an empty string
} else {
if(length<0) {
- length=uprv_strlen(src);
+ length=(int32_t)uprv_strlen(src);
}
if(cloneArrayIfNeeded(length, length, FALSE)) {
u_charsToUChars(src, getArrayStart(), length);
@@ -759,7 +759,7 @@ UnicodeString::indexOf(const UChar *srcChars,
if(match == NULL) {
return -1;
} else {
- return match - fArray;
+ return (int32_t)(match - fArray);
}
}
@@ -776,7 +776,7 @@ UnicodeString::doIndexOf(UChar c,
if(match == NULL) {
return -1;
} else {
- return match - fArray;
+ return (int32_t)(match - fArray);
}
}
@@ -792,7 +792,7 @@ UnicodeString::doIndexOf(UChar32 c,
if(match == NULL) {
return -1;
} else {
- return match - fArray;
+ return (int32_t)(match - fArray);
}
}
@@ -820,7 +820,7 @@ UnicodeString::lastIndexOf(const UChar *srcChars,
if(match == NULL) {
return -1;
} else {
- return match - fArray;
+ return (int32_t)(match - fArray);
}
}
@@ -841,7 +841,7 @@ UnicodeString::doLastIndexOf(UChar c,
if(match == NULL) {
return -1;
} else {
- return match - fArray;
+ return (int32_t)(match - fArray);
}
}
@@ -857,7 +857,7 @@ UnicodeString::doLastIndexOf(UChar32 c,
if(match == NULL) {
return -1;
} else {
- return match - fArray;
+ return (int32_t)(match - fArray);
}
}
@@ -1368,3 +1368,18 @@ UnicodeString::cloneArrayIfNeeded(int32_t newCapacity,
return TRUE;
}
U_NAMESPACE_END
+
+#ifdef U_STATIC_IMPLEMENTATION
+/*
+This should never be called. It is defined here to make sure that the
+virtual vector deleting destructor is defined within unistr.cpp.
+The vector deleting destructor is already a part of UObject,
+but defining it here makes sure that it is included with this object file.
+This makes sure that static library dependencies are kept to a minimum.
+*/
+static void uprv_UnicodeStringDummy(void) {
+ U_NAMESPACE_USE
+ delete [] (new UnicodeString[2]);
+}
+#endif
+
diff --git a/icuSources/common/unistr_case.cpp b/icuSources/common/unistr_case.cpp
index dd4a0819..34f53d8a 100644
--- a/icuSources/common/unistr_case.cpp
+++ b/icuSources/common/unistr_case.cpp
@@ -1,7 +1,7 @@
/*
*******************************************************************************
*
-* Copyright (C) 1999-2004, International Business Machines
+* Copyright (C) 1999-2005, International Business Machines
* Corporation and others. All Rights Reserved.
*
*******************************************************************************
@@ -27,6 +27,7 @@
#include "unicode/ubrk.h"
#include "ustr_imp.h"
#include "unormimp.h"
+#include "uhash.h"
U_NAMESPACE_BEGIN
@@ -108,7 +109,7 @@ UnicodeString::caseMap(BreakIterator *titleIter,
UErrorCode errorCode;
errorCode = U_ZERO_ERROR;
- UCaseProps *csp=ucase_getSingleton(&errorCode);
+ const UCaseProps *csp=ucase_getSingleton(&errorCode);
if(U_FAILURE(errorCode)) {
setToBogus();
return *this;
@@ -242,3 +243,33 @@ UnicodeString::foldCase(uint32_t options) {
}
U_NAMESPACE_END
+
+// Defined here to reduce dependencies on break iterator
+U_CAPI int32_t U_EXPORT2
+uhash_hashCaselessUnicodeString(const UHashTok key) {
+ U_NAMESPACE_USE
+ const UnicodeString *str = (const UnicodeString*) key.pointer;
+ if (str == NULL) {
+ return 0;
+ }
+ // Inefficient; a better way would be to have a hash function in
+ // UnicodeString that does case folding on the fly.
+ UnicodeString copy(*str);
+ return copy.foldCase().hashCode();
+}
+
+// Defined here to reduce dependencies on break iterator
+U_CAPI UBool U_EXPORT2
+uhash_compareCaselessUnicodeString(const UHashTok key1, const UHashTok key2) {
+ U_NAMESPACE_USE
+ const UnicodeString *str1 = (const UnicodeString*) key1.pointer;
+ const UnicodeString *str2 = (const UnicodeString*) key2.pointer;
+ if (str1 == str2) {
+ return TRUE;
+ }
+ if (str1 == NULL || str2 == NULL) {
+ return FALSE;
+ }
+ return str1->caseCompare(*str2, U_FOLD_CASE_DEFAULT) == 0;
+}
+
diff --git a/icuSources/common/unistr_cnv.cpp b/icuSources/common/unistr_cnv.cpp
index f5defc66..adc0dda6 100644
--- a/icuSources/common/unistr_cnv.cpp
+++ b/icuSources/common/unistr_cnv.cpp
@@ -1,7 +1,7 @@
/*
*******************************************************************************
*
-* Copyright (C) 1999-2004, International Business Machines
+* Copyright (C) 1999-2006, International Business Machines
* Corporation and others. All Rights Reserved.
*
*******************************************************************************
@@ -43,9 +43,9 @@ UnicodeString::UnicodeString(const char *codepageData,
fArray(fStackBuffer),
fFlags(kShortString)
{
- if(codepageData != 0) {
- doCodepageCreate(codepageData, (int32_t)uprv_strlen(codepageData), codepage);
- }
+ if(codepageData != 0) {
+ doCodepageCreate(codepageData, (int32_t)uprv_strlen(codepageData), codepage);
+ }
}
@@ -57,9 +57,9 @@ UnicodeString::UnicodeString(const char *codepageData,
fArray(fStackBuffer),
fFlags(kShortString)
{
- if(codepageData != 0) {
- doCodepageCreate(codepageData, dataLength, codepage);
- }
+ if(codepageData != 0) {
+ doCodepageCreate(codepageData, dataLength, codepage);
+ }
}
UnicodeString::UnicodeString(const char *src, int32_t srcLength,
@@ -70,35 +70,35 @@ UnicodeString::UnicodeString(const char *src, int32_t srcLength,
fArray(fStackBuffer),
fFlags(kShortString)
{
- if(U_SUCCESS(errorCode)) {
- // check arguments
- if(src==NULL) {
- // treat as an empty string, do nothing more
- } else if(srcLength<-1) {
- errorCode=U_ILLEGAL_ARGUMENT_ERROR;
- } else {
- // get input length
- if(srcLength==-1) {
- srcLength=(int32_t)uprv_strlen(src);
- }
- if(srcLength>0) {
- if(cnv!=0) {
- // use the provided converter
- ucnv_resetToUnicode(cnv);
- doCodepageCreate(src, srcLength, cnv, errorCode);
+ if(U_SUCCESS(errorCode)) {
+ // check arguments
+ if(src==NULL) {
+ // treat as an empty string, do nothing more
+ } else if(srcLength<-1) {
+ errorCode=U_ILLEGAL_ARGUMENT_ERROR;
} else {
- // use the default converter
- cnv=u_getDefaultConverter(&errorCode);
- doCodepageCreate(src, srcLength, cnv, errorCode);
- u_releaseDefaultConverter(cnv);
+ // get input length
+ if(srcLength==-1) {
+ srcLength=(int32_t)uprv_strlen(src);
+ }
+ if(srcLength>0) {
+ if(cnv!=0) {
+ // use the provided converter
+ ucnv_resetToUnicode(cnv);
+ doCodepageCreate(src, srcLength, cnv, errorCode);
+ } else {
+ // use the default converter
+ cnv=u_getDefaultConverter(&errorCode);
+ doCodepageCreate(src, srcLength, cnv, errorCode);
+ u_releaseDefaultConverter(cnv);
+ }
+ }
}
- }
- }
- if(U_FAILURE(errorCode)) {
- setToBogus();
+ if(U_FAILURE(errorCode)) {
+ setToBogus();
+ }
}
- }
}
//========================================
@@ -111,257 +111,260 @@ UnicodeString::extract(int32_t start,
uint32_t dstSize,
const char *codepage) const
{
- // if the arguments are illegal, then do nothing
- if(/*dstSize < 0 || */(dstSize > 0 && target == 0)) {
- return 0;
- }
-
- // pin the indices to legal values
- pinIndices(start, length);
-
- // create the converter
- UConverter *converter;
- UErrorCode status = U_ZERO_ERROR;
-
- // just write the NUL if the string length is 0
- if(length == 0) {
- if(dstSize >= 0x80000000) {
- // careful: dstSize is unsigned! (0xffffffff means "unlimited")
- // make sure that the NUL-termination works (takes int32_t)
- dstSize=0x7fffffff;
- }
- return u_terminateChars(target, dstSize, 0, &status);
- }
-
- // if the codepage is the default, use our cache
- // if it is an empty string, then use the "invariant character" conversion
- if (codepage == 0) {
- converter = u_getDefaultConverter(&status);
- } else if (*codepage == 0) {
- // use the "invariant characters" conversion
- int32_t destLength;
- // careful: dstSize is unsigned! (0xffffffff means "unlimited")
- if(dstSize >= 0x80000000) {
- destLength = length;
- // make sure that the NUL-termination works (takes int32_t)
- dstSize=0x7fffffff;
- } else if(length <= (int32_t)dstSize) {
- destLength = length;
+ // if the arguments are illegal, then do nothing
+ if(/*dstSize < 0 || */(dstSize > 0 && target == 0)) {
+ return 0;
+ }
+
+ // pin the indices to legal values
+ pinIndices(start, length);
+
+ // create the converter
+ UConverter *converter;
+ UErrorCode status = U_ZERO_ERROR;
+
+ // just write the NUL if the string length is 0
+ if(length == 0) {
+ if(dstSize >= 0x80000000) {
+ // careful: dstSize is unsigned! (0xffffffff means "unlimited")
+ // make sure that the NUL-termination works (takes int32_t)
+ dstSize=0x7fffffff;
+ }
+ return u_terminateChars(target, dstSize, 0, &status);
+ }
+
+ // if the codepage is the default, use our cache
+ // if it is an empty string, then use the "invariant character" conversion
+ if (codepage == 0) {
+ converter = u_getDefaultConverter(&status);
+ } else if (*codepage == 0) {
+ // use the "invariant characters" conversion
+ int32_t destLength;
+ // careful: dstSize is unsigned! (0xffffffff means "unlimited")
+ if(dstSize >= 0x80000000) {
+ destLength = length;
+ // make sure that the NUL-termination works (takes int32_t)
+ dstSize=0x7fffffff;
+ } else if(length <= (int32_t)dstSize) {
+ destLength = length;
+ } else {
+ destLength = (int32_t)dstSize;
+ }
+ u_UCharsToChars(getArrayStart() + start, target, destLength);
+ return u_terminateChars(target, (int32_t)dstSize, length, &status);
} else {
- destLength = (int32_t)dstSize;
+ converter = ucnv_open(codepage, &status);
}
- u_UCharsToChars(getArrayStart() + start, target, destLength);
- return u_terminateChars(target, (int32_t)dstSize, length, &status);
- } else {
- converter = ucnv_open(codepage, &status);
- }
-
- length = doExtract(start, length, target, (int32_t)dstSize, converter, status);
-
- // close the converter
- if (codepage == 0) {
- u_releaseDefaultConverter(converter);
- } else {
- ucnv_close(converter);
- }
-
- return length;
+
+ length = doExtract(start, length, target, (int32_t)dstSize, converter, status);
+
+ // close the converter
+ if (codepage == 0) {
+ u_releaseDefaultConverter(converter);
+ } else {
+ ucnv_close(converter);
+ }
+
+ return length;
}
int32_t
UnicodeString::extract(char *dest, int32_t destCapacity,
UConverter *cnv,
- UErrorCode &errorCode) const {
- if(U_FAILURE(errorCode)) {
- return 0;
- }
-
- if(isBogus() || destCapacity<0 || (destCapacity>0 && dest==0)) {
- errorCode=U_ILLEGAL_ARGUMENT_ERROR;
- return 0;
- }
-
- // nothing to do?
- if(fLength<=0) {
- return u_terminateChars(dest, destCapacity, 0, &errorCode);
- }
-
- // get the converter
- UBool isDefaultConverter;
- if(cnv==0) {
- isDefaultConverter=TRUE;
- cnv=u_getDefaultConverter(&errorCode);
+ UErrorCode &errorCode) const
+{
if(U_FAILURE(errorCode)) {
- return 0;
+ return 0;
}
- } else {
- isDefaultConverter=FALSE;
- ucnv_resetFromUnicode(cnv);
- }
- // convert
- int32_t length=doExtract(0, fLength, dest, destCapacity, cnv, errorCode);
+ if(isBogus() || destCapacity<0 || (destCapacity>0 && dest==0)) {
+ errorCode=U_ILLEGAL_ARGUMENT_ERROR;
+ return 0;
+ }
- // release the converter
- if(isDefaultConverter) {
- u_releaseDefaultConverter(cnv);
- }
+ // nothing to do?
+ if(fLength<=0) {
+ return u_terminateChars(dest, destCapacity, 0, &errorCode);
+ }
- return length;
+ // get the converter
+ UBool isDefaultConverter;
+ if(cnv==0) {
+ isDefaultConverter=TRUE;
+ cnv=u_getDefaultConverter(&errorCode);
+ if(U_FAILURE(errorCode)) {
+ return 0;
+ }
+ } else {
+ isDefaultConverter=FALSE;
+ ucnv_resetFromUnicode(cnv);
+ }
+
+ // convert
+ int32_t length=doExtract(0, fLength, dest, destCapacity, cnv, errorCode);
+
+ // release the converter
+ if(isDefaultConverter) {
+ u_releaseDefaultConverter(cnv);
+ }
+
+ return length;
}
int32_t
UnicodeString::doExtract(int32_t start, int32_t length,
char *dest, int32_t destCapacity,
UConverter *cnv,
- UErrorCode &errorCode) const {
- if(U_FAILURE(errorCode)) {
- if(destCapacity!=0) {
- *dest=0;
+ UErrorCode &errorCode) const
+{
+ if(U_FAILURE(errorCode)) {
+ if(destCapacity!=0) {
+ *dest=0;
+ }
+ return 0;
+ }
+
+ const UChar *src=fArray+start, *srcLimit=src+length;
+ char *originalDest=dest;
+ const char *destLimit;
+
+ if(destCapacity==0) {
+ destLimit=dest=0;
+ } else if(destCapacity==-1) {
+ // Pin the limit to U_MAX_PTR if the "magic" destCapacity is used.
+ destLimit=(char*)U_MAX_PTR(dest);
+ // for NUL-termination, translate into highest int32_t
+ destCapacity=0x7fffffff;
+ } else {
+ destLimit=dest+destCapacity;
+ }
+
+ // perform the conversion
+ ucnv_fromUnicode(cnv, &dest, destLimit, &src, srcLimit, 0, TRUE, &errorCode);
+ length=(int32_t)(dest-originalDest);
+
+ // if an overflow occurs, then get the preflighting length
+ if(errorCode==U_BUFFER_OVERFLOW_ERROR) {
+ char buffer[1024];
+
+ destLimit=buffer+sizeof(buffer);
+ do {
+ dest=buffer;
+ errorCode=U_ZERO_ERROR;
+ ucnv_fromUnicode(cnv, &dest, destLimit, &src, srcLimit, 0, TRUE, &errorCode);
+ length+=(int32_t)(dest-buffer);
+ } while(errorCode==U_BUFFER_OVERFLOW_ERROR);
}
- return 0;
- }
-
- const UChar *src=fArray+start, *srcLimit=src+length;
- char *originalDest=dest;
- const char *destLimit;
-
- if(destCapacity==0) {
- destLimit=dest=0;
- } else if(destCapacity==-1) {
- // Pin the limit to U_MAX_PTR if the "magic" destCapacity is used.
- destLimit=(char*)U_MAX_PTR(dest);
- // for NUL-termination, translate into highest int32_t
- destCapacity=0x7fffffff;
- } else {
- destLimit=dest+destCapacity;
- }
-
- // perform the conversion
- ucnv_fromUnicode(cnv, &dest, destLimit, &src, srcLimit, 0, TRUE, &errorCode);
- length=(int32_t)(dest-originalDest);
-
- // if an overflow occurs, then get the preflighting length
- if(errorCode==U_BUFFER_OVERFLOW_ERROR) {
- char buffer[1024];
-
- destLimit=buffer+sizeof(buffer);
- do {
- dest=buffer;
- errorCode=U_ZERO_ERROR;
- ucnv_fromUnicode(cnv, &dest, destLimit, &src, srcLimit, 0, TRUE, &errorCode);
- length+=(int32_t)(dest-buffer);
- } while(errorCode==U_BUFFER_OVERFLOW_ERROR);
- }
-
- return u_terminateChars(originalDest, destCapacity, length, &errorCode);
+
+ return u_terminateChars(originalDest, destCapacity, length, &errorCode);
}
void
UnicodeString::doCodepageCreate(const char *codepageData,
- int32_t dataLength,
- const char *codepage)
+ int32_t dataLength,
+ const char *codepage)
{
- // if there's nothing to convert, do nothing
- if(codepageData == 0 || dataLength == 0 || dataLength < -1) {
- return;
- }
- if(dataLength == -1) {
- dataLength = uprv_strlen(codepageData);
- }
-
- UErrorCode status = U_ZERO_ERROR;
-
- // create the converter
- // if the codepage is the default, use our cache
- // if it is an empty string, then use the "invariant character" conversion
- UConverter *converter = (codepage == 0 ?
+ // if there's nothing to convert, do nothing
+ if(codepageData == 0 || dataLength == 0 || dataLength < -1) {
+ return;
+ }
+ if(dataLength == -1) {
+ dataLength = (int32_t)uprv_strlen(codepageData);
+ }
+
+ UErrorCode status = U_ZERO_ERROR;
+
+ // create the converter
+ // if the codepage is the default, use our cache
+ // if it is an empty string, then use the "invariant character" conversion
+ UConverter *converter = (codepage == 0 ?
u_getDefaultConverter(&status) :
*codepage == 0 ?
0 :
ucnv_open(codepage, &status));
- // if we failed, set the appropriate flags and return
- if(U_FAILURE(status)) {
- setToBogus();
- return;
- }
-
- // perform the conversion
- if(converter == 0) {
- // use the "invariant characters" conversion
- if(cloneArrayIfNeeded(dataLength, dataLength, FALSE)) {
- u_charsToUChars(codepageData, getArrayStart(), dataLength);
- fLength = dataLength;
+ // if we failed, set the appropriate flags and return
+ if(U_FAILURE(status)) {
+ setToBogus();
+ return;
+ }
+
+ // perform the conversion
+ if(converter == 0) {
+ // use the "invariant characters" conversion
+ if(cloneArrayIfNeeded(dataLength, dataLength, FALSE)) {
+ u_charsToUChars(codepageData, getArrayStart(), dataLength);
+ fLength = dataLength;
+ } else {
+ setToBogus();
+ }
+ return;
+ }
+
+ // convert using the real converter
+ doCodepageCreate(codepageData, dataLength, converter, status);
+ if(U_FAILURE(status)) {
+ setToBogus();
+ }
+
+ // close the converter
+ if(codepage == 0) {
+ u_releaseDefaultConverter(converter);
} else {
- setToBogus();
+ ucnv_close(converter);
}
- return;
- }
-
- // convert using the real converter
- doCodepageCreate(codepageData, dataLength, converter, status);
- if(U_FAILURE(status)) {
- setToBogus();
- }
-
- // close the converter
- if(codepage == 0) {
- u_releaseDefaultConverter(converter);
- } else {
- ucnv_close(converter);
- }
}
void
UnicodeString::doCodepageCreate(const char *codepageData,
int32_t dataLength,
UConverter *converter,
- UErrorCode &status) {
- if(U_FAILURE(status)) {
- return;
- }
-
- // set up the conversion parameters
- const char *mySource = codepageData;
- const char *mySourceEnd = mySource + dataLength;
- UChar *myTarget;
-
- // estimate the size needed:
- // 1.25 UChar's per source byte should cover most cases
- int32_t arraySize = dataLength + (dataLength >> 2);
-
- // we do not care about the current contents
- UBool doCopyArray = FALSE;
- for(;;) {
- if(!cloneArrayIfNeeded(arraySize, arraySize, doCopyArray)) {
- setToBogus();
- break;
+ UErrorCode &status)
+{
+ if(U_FAILURE(status)) {
+ return;
}
- // perform the conversion
- myTarget = fArray + fLength;
- ucnv_toUnicode(converter, &myTarget, fArray + fCapacity,
- &mySource, mySourceEnd, 0, TRUE, &status);
+ // set up the conversion parameters
+ const char *mySource = codepageData;
+ const char *mySourceEnd = mySource + dataLength;
+ UChar *myTarget;
+
+ // estimate the size needed:
+ // 1.25 UChar's per source byte should cover most cases
+ int32_t arraySize = dataLength + (dataLength >> 2);
+
+ // we do not care about the current contents
+ UBool doCopyArray = FALSE;
+ for(;;) {
+ if(!cloneArrayIfNeeded(arraySize, arraySize, doCopyArray)) {
+ setToBogus();
+ break;
+ }
- // update the conversion parameters
- fLength = (int32_t)(myTarget - fArray);
+ // perform the conversion
+ myTarget = fArray + fLength;
+ ucnv_toUnicode(converter, &myTarget, fArray + fCapacity,
+ &mySource, mySourceEnd, 0, TRUE, &status);
- // allocate more space and copy data, if needed
- if(status == U_BUFFER_OVERFLOW_ERROR) {
- // reset the error code
- status = U_ZERO_ERROR;
+ // update the conversion parameters
+ fLength = (int32_t)(myTarget - fArray);
- // keep the previous conversion results
- doCopyArray = TRUE;
+ // allocate more space and copy data, if needed
+ if(status == U_BUFFER_OVERFLOW_ERROR) {
+ // reset the error code
+ status = U_ZERO_ERROR;
- // estimate the new size needed, larger than before
- // try 2 UChar's per remaining source byte
- arraySize = (int32_t)(fLength + 2 * (mySourceEnd - mySource));
- } else {
- break;
+ // keep the previous conversion results
+ doCopyArray = TRUE;
+
+ // estimate the new size needed, larger than before
+ // try 2 UChar's per remaining source byte
+ arraySize = (int32_t)(fLength + 2 * (mySourceEnd - mySource));
+ } else {
+ break;
+ }
}
- }
}
U_NAMESPACE_END
diff --git a/icuSources/common/unorm.cpp b/icuSources/common/unorm.cpp
index fc9cfb0b..b89c3e1f 100644
--- a/icuSources/common/unorm.cpp
+++ b/icuSources/common/unorm.cpp
@@ -1,6 +1,6 @@
/*
******************************************************************************
-* Copyright (c) 1996-2004, International Business Machines
+* Copyright (c) 1996-2006, International Business Machines
* Corporation and others. All Rights Reserved.
******************************************************************************
* File unorm.cpp
@@ -117,6 +117,7 @@ enum {
_NORM_OPTIONS_COMPOSE_CONTIGUOUS=0x2000
};
+U_CDECL_BEGIN
static inline UBool
isHangulWithoutJamoT(UChar c) {
c-=HANGUL_BASE;
@@ -147,10 +148,10 @@ isNorm32HangulOrJamo(uint32_t norm32) {
* Given isNorm32HangulOrJamo(),
* is this a Hangul syllable or a Jamo?
*/
-static inline UBool
+/*static inline UBool
isHangulJamoNorm32HangulOrJamoL(uint32_t norm32) {
return norm32<_NORM_MIN_JAMO_V;
-}
+}*/
/*
* Given norm32 for Jamo V or T,
@@ -163,6 +164,37 @@ isJamoVTNorm32JamoV(uint32_t norm32) {
/* load unorm.dat ----------------------------------------------------------- */
+/* normTrie: 32-bit trie result may contain a special extraData index with the folding offset */
+static int32_t U_CALLCONV
+getFoldingNormOffset(uint32_t norm32) {
+ if(isNorm32LeadSurrogate(norm32)) {
+ return
+ UTRIE_BMP_INDEX_LENGTH+
+ (((int32_t)norm32>>(_NORM_EXTRA_SHIFT-UTRIE_SURROGATE_BLOCK_BITS))&
+ (0x3ff<>(_NORM_EXTRA_SHIFT-UTRIE_SURROGATE_BLOCK_BITS))&
- (0x3ff<add(sa->set, start);
return TRUE;
}
U_CDECL_END
+#if !UNORM_HARDCODE_DATA
+
static int8_t
loadNormData(UErrorCode &errorCode) {
/* load Unicode normalization data from file */
@@ -290,6 +309,7 @@ loadNormData(UErrorCode &errorCode) {
if(haveNormData==0) {
UTrie _normTrie={ 0,0,0,0,0,0,0 }, _fcdTrie={ 0,0,0,0,0,0,0 }, _auxTrie={ 0,0,0,0,0,0,0 };
UDataMemory *data;
+
const int32_t *p=NULL;
const uint8_t *pb;
@@ -310,11 +330,12 @@ loadNormData(UErrorCode &errorCode) {
_normTrie.getFoldingOffset=getFoldingNormOffset;
pb+=p[_NORM_INDEX_TRIE_SIZE]+p[_NORM_INDEX_UCHAR_COUNT]*2+p[_NORM_INDEX_COMBINE_DATA_COUNT]*2;
- utrie_unserialize(&_fcdTrie, pb, p[_NORM_INDEX_FCD_TRIE_SIZE], &errorCode);
- _fcdTrie.getFoldingOffset=getFoldingFCDOffset;
-
if(p[_NORM_INDEX_FCD_TRIE_SIZE]!=0) {
- pb+=p[_NORM_INDEX_FCD_TRIE_SIZE];
+ utrie_unserialize(&_fcdTrie, pb, p[_NORM_INDEX_FCD_TRIE_SIZE], &errorCode);
+ }
+ pb+=p[_NORM_INDEX_FCD_TRIE_SIZE];
+
+ if(p[_NORM_INDEX_AUX_TRIE_SIZE]!=0) {
utrie_unserialize(&_auxTrie, pb, p[_NORM_INDEX_AUX_TRIE_SIZE], &errorCode);
_auxTrie.getFoldingOffset=getFoldingAuxOffset;
}
@@ -362,14 +383,24 @@ loadNormData(UErrorCode &errorCode) {
return haveNormData;
}
+#endif
+
static inline UBool
_haveData(UErrorCode &errorCode) {
- if(haveNormData!=0) {
+#if UNORM_HARDCODE_DATA
+ return U_SUCCESS(errorCode);
+#else
+ if(U_FAILURE(errorCode)) {
+ return FALSE;
+ } else if(haveNormData>0) {
+ return TRUE;
+ } else if(haveNormData<0) {
errorCode=dataErrorCode;
- return (UBool)(haveNormData>0);
- } else {
+ return FALSE;
+ } else /* haveNormData==0 */ {
return (UBool)(loadNormData(errorCode)>0);
}
+#endif
}
U_CAPI UBool U_EXPORT2
@@ -436,6 +467,38 @@ _getExtraData(uint32_t norm32) {
return extraData+(norm32>>_NORM_EXTRA_SHIFT);
}
+#if 0
+/*
+ * It is possible to get the FCD data from the main trie if unorm.icu
+ * was built without the FCD trie, although it is slower.
+ * This is not implemented because it is hard to test, and because it seems
+ * unusual to want to use FCD and not build the data file for it.
+ *
+ * Untested sample code:
+ */
+static inline uint16_t
+_getFCD16FromNormData(UChar32 c) {
+ uint32_t norm32, fcd;
+
+ norm32=_getNorm32(c);
+ if((norm32&_NORM_QC_NFD) && isNorm32Regular(norm32)) {
+ /* get the lead/trail cc from the decomposition data */
+ const uint16_t *nfd=_getExtraData(norm32);
+ if(*nfd&_NORM_DECOMP_FLAG_LENGTH_HAS_CC) {
+ fcd=nfd[1];
+ }
+ } else {
+ fcd=norm32&_NORM_CC_MASK;
+ if(fcd!=0) {
+ /* use the code point cc value for both lead and trail cc's */
+ fcd|=fcd>>_NORM_CC_SHIFT; /* assume that the cc is in bits 15..8 */
+ }
+ }
+
+ return (uint16_t)fcd;
+}
+#endif
+
/* normalization exclusion sets --------------------------------------------- */
/*
@@ -464,6 +527,7 @@ internalGetNXHangul(UErrorCode &errorCode) {
if(nxCache[UNORM_NX_HANGUL]==NULL) {
nxCache[UNORM_NX_HANGUL]=set;
set=NULL;
+ ucln_common_registerCleanup(UCLN_COMMON_UNORM, unorm_cleanup);
}
umtx_unlock(NULL);
@@ -520,6 +584,7 @@ internalGetSerializedNX(int32_t options, int32_t nxIndex, UErrorCode &errorCode)
if(nxCache[options]==NULL) {
nxCache[options]=set;
set=NULL;
+ ucln_common_registerCleanup(UCLN_COMMON_UNORM, unorm_cleanup);
}
umtx_unlock(NULL);
@@ -610,6 +675,7 @@ internalGetNX(int32_t options, UErrorCode &errorCode) {
if(nxCache[options]==NULL) {
nxCache[options]=set;
set=NULL;
+ ucln_common_registerCleanup(UCLN_COMMON_UNORM, unorm_cleanup);
}
umtx_unlock(NULL);
@@ -882,21 +948,29 @@ _isTrueStarter(uint32_t norm32, uint32_t ccOrQCMask, uint32_t decompQCMask) {
/* uchar.h */
U_CAPI uint8_t U_EXPORT2
u_getCombiningClass(UChar32 c) {
+#if !UNORM_HARDCODE_DATA
UErrorCode errorCode=U_ZERO_ERROR;
if(_haveData(errorCode)) {
+#endif
uint32_t norm32;
UTRIE_GET32(&normTrie, c, norm32);
return (uint8_t)(norm32>>_NORM_CC_SHIFT);
+#if !UNORM_HARDCODE_DATA
} else {
return 0;
}
+#endif
}
U_CAPI UBool U_EXPORT2
unorm_internalIsFullCompositionExclusion(UChar32 c) {
+#if UNORM_HARDCODE_DATA
+ if(auxTrie.index!=NULL) {
+#else
UErrorCode errorCode=U_ZERO_ERROR;
- if(_haveData(errorCode) && formatVersion_2_1) {
+ if(_haveData(errorCode) && auxTrie.index!=NULL) {
+#endif
uint16_t aux;
UTRIE_GET16(&auxTrie, c, aux);
@@ -908,8 +982,12 @@ unorm_internalIsFullCompositionExclusion(UChar32 c) {
U_CAPI UBool U_EXPORT2
unorm_isCanonSafeStart(UChar32 c) {
+#if UNORM_HARDCODE_DATA
+ if(auxTrie.index!=NULL) {
+#else
UErrorCode errorCode=U_ZERO_ERROR;
- if(_haveData(errorCode) && formatVersion_2_1) {
+ if(_haveData(errorCode) && auxTrie.index!=NULL) {
+#endif
uint16_t aux;
UTRIE_GET16(&auxTrie, c, aux);
@@ -929,9 +1007,14 @@ unorm_getUnicodeVersion(UVersionInfo *versionInfo, UErrorCode *pErrorCode){
U_CAPI UBool U_EXPORT2
unorm_getCanonStartSet(UChar32 c, USerializedSet *fillSet) {
+#if !UNORM_HARDCODE_DATA
UErrorCode errorCode=U_ZERO_ERROR;
+#endif
if( fillSet!=NULL && (uint32_t)c<=0x10ffff &&
- _haveData(errorCode) && canonStartSets!=NULL
+#if !UNORM_HARDCODE_DATA
+ _haveData(errorCode) &&
+#endif
+ canonStartSets!=NULL
) {
const uint16_t *table;
int32_t i, start, limit;
@@ -1031,7 +1114,7 @@ u_getFC_NFKC_Closure(UChar32 c, UChar *dest, int32_t destCapacity, UErrorCode *p
*pErrorCode=U_ILLEGAL_ARGUMENT_ERROR;
return 0;
}
- if(!_haveData(*pErrorCode) || !formatVersion_2_1) {
+ if(!_haveData(*pErrorCode) || auxTrie.index==NULL) {
return 0;
}
@@ -1061,14 +1144,15 @@ u_getFC_NFKC_Closure(UChar32 c, UChar *dest, int32_t destCapacity, UErrorCode *p
/* Is c an NF-skippable code point? See unormimp.h. */
U_CAPI UBool U_EXPORT2
unorm_isNFSkippable(UChar32 c, UNormalizationMode mode) {
- UErrorCode errorCode;
uint32_t norm32, mask;
uint16_t aux, fcd;
- errorCode=U_ZERO_ERROR;
+#if !UNORM_HARDCODE_DATA
+ UErrorCode errorCode=U_ZERO_ERROR;
if(!_haveData(errorCode)) {
return FALSE;
}
+#endif
/* handle trivial cases; set the comparison mask for the normal ones */
switch(mode) {
@@ -1089,8 +1173,12 @@ unorm_isNFSkippable(UChar32 c, UNormalizationMode mode) {
break;
case UNORM_FCD:
/* FCD: skippable if lead cc==0 and trail cc<=1 */
- UTRIE_GET16(&fcdTrie, c, fcd);
- return fcd<=1;
+ if(fcdTrie.index!=NULL) {
+ UTRIE_GET16(&fcdTrie, c, fcd);
+ return fcd<=1;
+ } else {
+ return FALSE;
+ }
default:
return FALSE;
}
@@ -1118,7 +1206,7 @@ unorm_isNFSkippable(UChar32 c, UNormalizationMode mode) {
/* if(mode<=UNORM_NFKC) { -- enable when implementing FCC */
/* NF*C, test (f) flag */
- if(!formatVersion_2_2) {
+ if(!formatVersion_2_2 || auxTrie.index==NULL) {
return FALSE; /* no (f) data, say not skippable to be safe */
}
@@ -1129,17 +1217,19 @@ unorm_isNFSkippable(UChar32 c, UNormalizationMode mode) {
}
U_CAPI void U_EXPORT2
-unorm_addPropertyStarts(USetAdder *sa, UErrorCode *pErrorCode) {
+unorm_addPropertyStarts(const USetAdder *sa, UErrorCode *pErrorCode) {
UChar c;
- if(U_FAILURE(*pErrorCode) || !_haveData(*pErrorCode)) {
+ if(!_haveData(*pErrorCode)) {
return;
}
/* add the start code point of each same-value range of each trie */
utrie_enum(&normTrie, NULL, _enumPropertyStartsRange, sa);
- utrie_enum(&fcdTrie, NULL, _enumPropertyStartsRange, sa);
- if(formatVersion_2_1) {
+ if(fcdTrie.index!=NULL) {
+ utrie_enum(&fcdTrie, NULL, _enumPropertyStartsRange, sa);
+ }
+ if(auxTrie.index!=NULL) {
utrie_enum(&auxTrie, NULL, _enumPropertyStartsRange, sa);
}
@@ -1157,13 +1247,14 @@ unorm_getQuickCheck(UChar32 c, UNormalizationMode mode) {
0, 0, _NORM_QC_NFD, _NORM_QC_NFKD, _NORM_QC_NFC, _NORM_QC_NFKC
};
- UErrorCode errorCode;
uint32_t norm32;
- errorCode=U_ZERO_ERROR;
+#if !UNORM_HARDCODE_DATA
+ UErrorCode errorCode=U_ZERO_ERROR;
if(!_haveData(errorCode)) {
return UNORM_YES;
}
+#endif
UTRIE_GET32(&normTrie, c, norm32);
norm32&=qcMask[mode];
@@ -1183,7 +1274,12 @@ unorm_getFCD16FromCodePoint(UChar32 c) {
uint16_t fcd;
errorCode=U_ZERO_ERROR;
- if(!_haveData(errorCode)) {
+ if(
+#if !UNORM_HARDCODE_DATA
+ !_haveData(errorCode) ||
+#endif
+ fcdTrie.index==NULL
+ ) {
return 0;
}
@@ -1411,9 +1507,13 @@ _findNextStarter(const UChar *src, const UChar *limit,
U_CAPI int32_t U_EXPORT2
unorm_getDecomposition(UChar32 c, UBool compat,
UChar *dest, int32_t destCapacity) {
+#if !UNORM_HARDCODE_DATA
UErrorCode errorCode=U_ZERO_ERROR;
+#endif
if( (uint32_t)c<=0x10ffff &&
+#if !UNORM_HARDCODE_DATA
_haveData(errorCode) &&
+#endif
((dest!=NULL && destCapacity>0) || destCapacity==0)
) {
uint32_t norm32, qcMask;
@@ -1522,6 +1622,8 @@ _decompose(UChar *dest, int32_t destCapacity,
/* avoid compiler warnings */
norm32=0;
c=0;
+ cc=0;
+ trailCC=0;
if(srcLength>=0) {
/* string with length */
@@ -2153,7 +2255,7 @@ _composePart(UChar *stackBuffer, UChar *&buffer, int32_t &bufferCapacity, int32_
/* decompose [prevStarter..src[ */
length=_decompose(buffer, bufferCapacity,
- prevStarter, src-prevStarter,
+ prevStarter, (int32_t)(src-prevStarter),
compat, nx,
trailCC);
if(length>bufferCapacity) {
@@ -2162,7 +2264,7 @@ _composePart(UChar *stackBuffer, UChar *&buffer, int32_t &bufferCapacity, int32_
return NULL;
}
length=_decompose(buffer, bufferCapacity,
- prevStarter, src-prevStarter,
+ prevStarter, (int32_t)(src-prevStarter),
compat, nx,
trailCC);
}
@@ -2174,7 +2276,7 @@ _composePart(UChar *stackBuffer, UChar *&buffer, int32_t &bufferCapacity, int32_
}
/* return with a pointer to the recomposition and its length */
- length=recomposeLimit-buffer;
+ length=(int32_t)(recomposeLimit-buffer);
return buffer;
}
@@ -3006,6 +3108,10 @@ _quickCheck(const UChar *src,
options=_NORM_OPTIONS_COMPAT;
break;
case UNORM_FCD:
+ if(fcdTrie.index==NULL) {
+ *pErrorCode=U_UNSUPPORTED_ERROR;
+ return UNORM_MAYBE;
+ }
return unorm_checkFCD(src, srcLength, nx) ? UNORM_YES : UNORM_NO;
default:
*pErrorCode=U_ILLEGAL_ARGUMENT_ERROR;
@@ -3218,6 +3324,10 @@ unorm_internalNormalizeWithNX(UChar *dest, int32_t destCapacity,
options|_NORM_OPTIONS_COMPAT, nx, pErrorCode);
break;
case UNORM_FCD:
+ if(fcdTrie.index==NULL) {
+ *pErrorCode=U_UNSUPPORTED_ERROR;
+ return 0;
+ }
return unorm_makeFCD(dest, destCapacity,
src, srcLength,
nx,
@@ -3483,8 +3593,13 @@ unorm_previous(UCharIterator *src,
}
switch(mode) {
- case UNORM_NFD:
case UNORM_FCD:
+ if(fcdTrie.index==NULL) {
+ *pErrorCode=U_UNSUPPORTED_ERROR;
+ return 0;
+ }
+ /* fall through to NFD */
+ case UNORM_NFD:
isPreviousBoundary=_isPrevNFDSafe;
minC=_NORM_MIN_WITH_LEAD_CC;
mask=_NORM_CC_MASK|_NORM_QC_NFD;
@@ -3731,8 +3846,13 @@ unorm_next(UCharIterator *src,
}
switch(mode) {
- case UNORM_NFD:
case UNORM_FCD:
+ if(fcdTrie.index==NULL) {
+ *pErrorCode=U_UNSUPPORTED_ERROR;
+ return 0;
+ }
+ /* fall through to NFD */
+ case UNORM_NFD:
isNextBoundary=_isNextNFDSafe;
minC=_NORM_MIN_WITH_LEAD_CC;
mask=_NORM_CC_MASK|_NORM_QC_NFD;
@@ -3966,127 +4086,4 @@ unorm_concatenate(const UChar *left, int32_t leftLength,
return u_terminateUChars(dest, destCapacity, destLength, pErrorCode);
}
-/* data swapping ------------------------------------------------------------ */
-
-U_CAPI int32_t U_EXPORT2
-unorm_swap(const UDataSwapper *ds,
- const void *inData, int32_t length, void *outData,
- UErrorCode *pErrorCode) {
- const UDataInfo *pInfo;
- int32_t headerSize;
-
- const uint8_t *inBytes;
- uint8_t *outBytes;
-
- const int32_t *inIndexes;
- int32_t indexes[32];
-
- int32_t i, offset, count, size;
-
- /* udata_swapDataHeader checks the arguments */
- headerSize=udata_swapDataHeader(ds, inData, length, outData, pErrorCode);
- if(pErrorCode==NULL || U_FAILURE(*pErrorCode)) {
- return 0;
- }
-
- /* check data format and format version */
- pInfo=(const UDataInfo *)((const char *)inData+4);
- if(!(
- pInfo->dataFormat[0]==0x4e && /* dataFormat="Norm" */
- pInfo->dataFormat[1]==0x6f &&
- pInfo->dataFormat[2]==0x72 &&
- pInfo->dataFormat[3]==0x6d &&
- pInfo->formatVersion[0]==2
- )) {
- udata_printError(ds, "unorm_swap(): data format %02x.%02x.%02x.%02x (format version %02x) is not recognized as unorm.icu\n",
- pInfo->dataFormat[0], pInfo->dataFormat[1],
- pInfo->dataFormat[2], pInfo->dataFormat[3],
- pInfo->formatVersion[0]);
- *pErrorCode=U_UNSUPPORTED_ERROR;
- return 0;
- }
-
- inBytes=(const uint8_t *)inData+headerSize;
- outBytes=(uint8_t *)outData+headerSize;
-
- inIndexes=(const int32_t *)inBytes;
-
- if(length>=0) {
- length-=headerSize;
- if(length<32*4) {
- udata_printError(ds, "unorm_swap(): too few bytes (%d after header) for unorm.icu\n",
- length);
- *pErrorCode=U_INDEX_OUTOFBOUNDS_ERROR;
- return 0;
- }
- }
-
- /* read the first 32 indexes (ICU 2.8/format version 2.2: _NORM_INDEX_TOP==32, might grow) */
- for(i=0; i<32; ++i) {
- indexes[i]=udata_readInt32(ds, inIndexes[i]);
- }
-
- /* calculate the total length of the data */
- size=
- 32*4+ /* size of indexes[] */
- indexes[_NORM_INDEX_TRIE_SIZE]+
- indexes[_NORM_INDEX_UCHAR_COUNT]*2+
- indexes[_NORM_INDEX_COMBINE_DATA_COUNT]*2+
- indexes[_NORM_INDEX_FCD_TRIE_SIZE]+
- indexes[_NORM_INDEX_AUX_TRIE_SIZE]+
- indexes[_NORM_INDEX_CANON_SET_COUNT]*2;
-
- if(length>=0) {
- if(lengthswapArray32(ds, inBytes, count, outBytes, pErrorCode);
- offset+=count;
-
- /* swap the main UTrie */
- count=indexes[_NORM_INDEX_TRIE_SIZE];
- utrie_swap(ds, inBytes+offset, count, outBytes+offset, pErrorCode);
- offset+=count;
-
- /* swap the uint16_t extraData[] and the uint16_t combiningTable[] */
- count=(indexes[_NORM_INDEX_UCHAR_COUNT]+indexes[_NORM_INDEX_COMBINE_DATA_COUNT])*2;
- ds->swapArray16(ds, inBytes+offset, count, outBytes+offset, pErrorCode);
- offset+=count;
-
- /* swap the FCD UTrie */
- count=indexes[_NORM_INDEX_FCD_TRIE_SIZE];
- if(count!=0) {
- utrie_swap(ds, inBytes+offset, count, outBytes+offset, pErrorCode);
- offset+=count;
- }
-
- /* swap the aux UTrie */
- count=indexes[_NORM_INDEX_AUX_TRIE_SIZE];
- if(count!=0) {
- utrie_swap(ds, inBytes+offset, count, outBytes+offset, pErrorCode);
- offset+=count;
- }
-
- /* swap the uint16_t combiningTable[] */
- count=indexes[_NORM_INDEX_CANON_SET_COUNT]*2;
- ds->swapArray16(ds, inBytes+offset, count, outBytes+offset, pErrorCode);
- offset+=count;
- }
-
- return headerSize+size;
-}
-
#endif /* #if !UCONFIG_NO_NORMALIZATION */
diff --git a/icuSources/common/unorm_props_data.c b/icuSources/common/unorm_props_data.c
new file mode 100644
index 00000000..f6945378
--- /dev/null
+++ b/icuSources/common/unorm_props_data.c
@@ -0,0 +1,3262 @@
+/*
+ * Copyright (C) 1999-2007, International Business Machines
+ * Corporation and others. All Rights Reserved.
+ *
+ * file name: unorm_props_data.c
+ *
+ * machine-generated on: 2006-06-13
+ * machine-generated on: 2007-02-08 U_DARWIN
+ */
+
+static const UVersionInfo formatVersion={ 2,3,5,2 };
+
+static const UVersionInfo dataVersion={ 5,0,0,0 };
+
+static const int32_t indexes[_NORM_INDEX_TOP]={
+#ifndef U_DARWIN
+0xa1a0,0x3e4b,0x7a7,0x16f,0,0x36,0x300,0xa0,0xc0,0xa0,0x2b00,0x2cf8,0x1e2c,0,0,0,
+#else /* U_DARWIN */
+0xa230,0x3e4b,0x7a7,0x16f,0,0x36,0x300,0xa0,0xc0,0xa0,0x2b48,0x2d40,0x1e2c,0,0,0,
+#endif /* U_DARWIN */
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+};
+
+static const uint16_t normTrie_index[2208]={
+0,0x8b4,0x7ff,0x807,0,0x54d,0x336,0x33e,0x346,0x34e,0x356,0x35e,0,0x366,0x36d,0x375,
+0x37d,0x385,0,0,0x80e,0x555,0x55c,0x564,0x4ff,0x507,0x175,8,0x17d,0x38d,0x10,0x16,
+0x395,0x39d,0x3a5,0x3ad,0x816,0,0x3b5,0x3bd,0,0,0,0,0x56b,0x81e,0x826,0,
+0x82a,0x3c5,0x50f,0x573,0,0,0x3cd,0x832,0x836,0x83b,0x843,0,0,0,0,0x849,
+0,0,0,0,0,0,0,0,0,0x3d5,0x185,0,0,0x517,0x18d,0,
+0,0x195,0x19d,0,0,0x84e,0x856,0,0,0x51f,0x1a5,0,0x3dd,0x527,0x3e4,0,
+0,0,0x3eb,0,0,0x85a,0x3f3,0,0,0x52f,0x3fa,0,0,0,0x400,0,
+0,0x57a,0x862,0,0,0x581,0x588,0,0x590,0x865,0x1ad,0x1b5,0x1bd,0x1c5,0x86c,0,
+#ifndef U_DARWIN
+0,0x408,0,0,0,0,0,0x597,0x8dd,0,0,0x537,0,0x53d,0x545,0,
+#else /* U_DARWIN */
+0,0x408,0,0,0,0,0,0x597,0x8e6,0,0,0x537,0,0x53d,0x545,0,
+#endif /* U_DARWIN */
+0,0,0,0,0,0,0,0,0,0,0x86e,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0x876,0x876,0,0,0,0,0x87c,0,
+0,0,0,0,0,0x884,0,0,0,0x887,0,0,0,0,0,0,
+0x88e,0,0,0,0,0,0,0,0x40f,0x414,0x41c,0x895,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0x1d,0x25,0x59f,0x5a6,0x5ae,0x89d,0x8a0,
+0x424,0x42c,0x434,0x43c,0x444,0x44c,0x454,0x45c,0x464,0x46c,0x474,0x1cd,0x47c,0x1d5,0x1dd,0x1e5,
+0x1ed,0x5b6,0x5be,0x5c6,0x5ce,0x2d,0x8a8,0x8b0,0x35,0x3d,0x45,0x5d6,0x484,0x48b,0x490,0,
+0x498,0x4a0,0x4a8,0x4b0,0x4b8,0x4c0,0,0x4c8,0,0x1f3,0,0,0,0,0,0,
+0,0,0,0x5de,0x5e6,0x5ee,0x5f6,0x5fe,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0x603,0,0,0x607,0,0,0x1f6,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0x60d,0,0,0,0,
+0,0,0,0,0x611,0,0,0x619,0x621,0x629,0x631,0x639,0x641,0x649,0x651,0,
+0x659,0x65f,0x4cf,0x4d7,0x4df,0x4e7,0x4ef,0x4f7,0,0x666,0x66e,0x676,0x67e,0,0,0,
+0x686,0x68e,0x4d,0x696,0x69e,0x6a6,0x55,0x6ae,0x6b6,0x6be,0x6c6,0x5d,0x65,0x6d,0x75,0x6ce,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0x8bc,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+#ifndef U_DARWIN
+0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,
+0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,
+0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,
+0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,
+0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,
+0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,
+0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,
+0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,
+0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,
+0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,
+0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,
+0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,
+0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,
+0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,
+0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,
+0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,
+0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,
+0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,
+0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,
+0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,
+0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,
+0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8ec,0,0,
+0x8f4,0x8f7,0,0x8fd,0,0,0,0,0,0,0,0,0,0,0,0,
+#else /* U_DARWIN */
+0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,
+0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,
+0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,
+0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,
+0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,
+0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,
+0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,
+0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,
+0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,
+0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,
+0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,
+0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,
+0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,
+0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,
+0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,
+0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,
+0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,
+0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,
+0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,
+0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,
+0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,
+0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8f5,0,0,
+0x8fd,0x900,0,0x906,0,0,0,0,0,0,0,0,0,0,0,0,
+#endif /* U_DARWIN */
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+#ifndef U_DARWIN
+0,0,0,0,0,0,0,0,0x1fe,0x206,0x20e,0x216,0x21e,0x226,0x22e,0x236,
+#else /* U_DARWIN */
+0,0,0,0,0x8c2,0,0,0,0x1fe,0x206,0x20e,0x216,0x21e,0x226,0x22e,0x236,
+#endif /* U_DARWIN */
+0x23e,0x246,0x24e,0x256,0x25e,0x266,0x26e,0,0x276,0x27e,0x286,0x6d6,0x6de,0x6e6,0x6eb,0x6f3,
+0x6fb,0x703,0x70b,0x713,0x71b,0x723,0x72b,0x733,0x73b,0x743,0x74b,0x753,0x75b,0x763,0x76b,0x76f,
+0x777,0x77f,0x787,0x78f,0x797,0x79f,0x7a7,0x7af,0x7b7,0x7bf,0x7c7,0x7cf,0x7d7,0x7df,0x7e7,0x7ef,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+#ifndef U_DARWIN
+0x8c1,0x8c5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0x28e,0x296,0x8cd,0x29e,0x2a6,0,
+0,0,0x8d5,0,0,0,0,0,0,0,0,0,0,0,0,0,
+#else /* U_DARWIN */
+0x8ca,0x8ce,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0x28e,0x296,0x8d6,0x29e,0x2a6,0,
+0,0,0x8de,0,0,0,0,0,0,0,0,0,0,0,0,0,
+#endif /* U_DARWIN */
+0x7d,0x85,0x8d,0x95,0x9d,0xa5,0xad,0xb5,0xbd,0xc5,0xcd,0xd5,0xdd,0xe5,0xed,0xf5,
+0xfd,0x105,0x10d,0x115,0x11d,0x125,0x12d,0x135,0x13d,0x145,0x14d,0x155,0x15d,0x165,0x16d,0x7f7,
+0x2ae,0x2b6,0x2be,0x2c6,0x2ce,0x2d6,0x2de,0x2e6,0x2ee,0x2f6,0x2fe,0x306,0x30e,0x316,0x31e,0x326,
+0x32e,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+};
+
+#ifndef U_DARWIN
+static const uint32_t normTrie_data32[9236]={
+#else /* U_DARWIN */
+static const uint32_t normTrie_data32[9272]={
+#endif /* U_DARWIN */
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0xea00,0xea00,0xe900,0xe600,0xe600,0xe600,0xe600,0xe600,0xe600,0xe600,0xe600,0xe600,0xe600,0xe600,0xe600,0xe600,
+0,0,0,0,0x612000f,0,0,0,0,0,0x13b000a,0,0,0,0x614000f,0,
+0,0x3dee0040,0,0,0,0x3d9f0040,0,0,0,0x3da10040,0x14a5004c,0x14aa004c,0x14ae000c,0x14b2000c,0x14b7004c,0,
+0x2123000a,0x2125000a,0x140004a,0x142000e,0x149000e,0x2127000a,0x2129000a,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0x212b000a,0x212d000a,0x150000a,0,0x212f000a,0x2131000a,0,0,
+0,0x152000a,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0x154000a,0x156000a,0x158000a,0,0x15a000a,0x15c000a,0x15e000a,0x160000a,0x162000a,0x164000a,0x166000a,0x168000a,0x16a000a,0x16c000a,0x16e000a,0,
+0x170000a,0x172000a,0x174000a,0x176000a,0x178000a,0x17a000a,0x17c000a,0x215c000a,0x215e000a,0x2160000a,0x2162000a,0x2164000a,0x2166000a,0x2168000a,0x216a000a,0x216c000a,
+0x216e000a,0x2170000a,0,0x2172000a,0x2174000a,0x2176000a,0x2178000a,0x217a000a,0x217c000a,0x217e000a,0x2180000a,0x2182000a,0x2184000a,0x2186000a,0x2188000a,0x218a000a,
+0x218c000a,0x218e000a,0x2190000a,0x2192000a,0,0,0,0,0,0,0,0,0x17e000a,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0x2297000a,0x229b000a,0x181000a,0x183000a,0,0x229f000a,0x22a3000a,0x186000a,0,0x188000a,0x22a7000a,0x18b000a,
+0x18d000a,0x18f000a,0x22a9000a,0x22ab000a,0x191000a,0x193000a,0x195000a,0x22ad000a,0,0x197000a,0x199000a,0,0,0x19c000a,0x19e000a,0x1a0000a,
+0x1a2000a,0x1a4000a,0,0,0x1a6000a,0x1a9000a,0x1ad000a,0,0x1b0000a,0,0x6f5000f,0,0x1b2000a,0,0x6f7000f,0x6f9000f,
+0x1b4000a,0x1b6000a,0,0x22af000a,0x1b8000a,0x1ba000a,0,0x1bc000a,0x22b1000a,0x22b3000a,0x22b5000a,0x22b7000a,0x22b9000a,0x22bb000a,0,0x1be000a,
+0x22bd000a,0x22bf000a,0x1c2000a,0x1c4000a,0x22c1000a,0,0,0,0,0x1c6000a,0x22c3000a,0x22c5000a,0x22c7000a,0x22c9000a,0,0,
+0,0,0,0,0,0,0,0x22cb000a,0x22cf000a,0x22d3000a,0x22d7000a,0x22db000a,0x22df000a,0x22e3000a,0x22e7000a,0x22eb000a,
+0x22ef000a,0x22f3000a,0x22f7000a,0x22fb000a,0x28d3000a,0x28d7000a,0x28db000a,0x28df000a,0,0,0,0,0,0,0,0,
+0,0,0,0,0x1c8000a,0x28e3000a,0x28e6000a,0x28e9000a,0x28ec000a,0x28ef000a,0x28f2000a,0x28f5000a,0x28f8000a,0x28fb000a,0x28fe000a,0x2901000a,
+0x2904000a,0x2907000a,0x290a000a,0x290d000a,0x29f3000a,0x29f6000a,0x29f9000a,0x29fc000a,0x29ff000a,0x2a02000a,0x2a05000a,0x2a08000a,0x2a0b000a,0x2a0e000a,0x2a12000a,0x2a16000a,
+0x1cc000a,0x2a1a000a,0x1cf000a,0x1d2000a,0x2a1e000a,0x2a20000a,0x2a22000a,0x2a24000a,0x2a26000a,0x2a28000a,0x2a2a000a,0x2a2c000a,0x2a2e000a,0x2a30000a,0x2a32000a,0x2a34000a,
+0x2a36000a,0x2a38000a,0x2a3a000a,0x2a3c000a,0x2c52000a,0x2c55000a,0x2c58000a,0x2c5c000a,0x2c60000a,0x2c64000a,0x2c68000a,0x2c6c000a,0x2c70000a,0x2c74000a,0x2c78000a,0x2c7c000a,
+0x2c80000a,0x2c84000a,0x2c88000a,0x2c8c000a,0x2c90000a,0x1d6000a,0x2c94000a,0x1da000a,0x2c97000a,0x1dd000a,0x2c9b000a,0x2c9e000a,0x2ca1000a,0x2ca5000a,0x1e0000a,0x2ca9000a,
+0x2cac000a,0x2caf000a,0x2cb2000a,0x2cb5000a,0x1e3000a,0x1e6000a,0x1e9000a,0x1ec000a,0x1ef000a,0x1f2000a,0x1f5000a,0x1f8000a,0x2cba000a,0x2cbe000a,0x1fb000a,0x1fe000a,
+0x201000a,0x2cc3000a,0x2cc6000a,0x2cc9000a,0x204000a,0x207000a,0x20b000a,0x20f000a,0x213000a,0x2ccc000a,0x2ccf000a,0x2cd2000a,0x2cd5000a,0x2cd8000a,0x2cdb000a,0x2cde000a,
+0x2ce1000a,0x2ce4000a,0x2ce7000a,0x2cea000a,0x2cee000a,0x2cf2000a,0x2cf5000a,0x2cf9000a,0x2cfd000a,0x2d01000a,0x2d04000a,0x2d08000a,0x2d0c000a,0x217000a,0x21a000a,0x21e000a,
+0x222000a,0x2d11000a,0x2d15000a,0x2d1b000a,0x2d22000a,0x2d25000a,0x2d28000a,0x2d2b000a,0x226000a,0x229000a,0x22c000a,0x22f000a,0x232000a,0x235000a,0x238000a,0x23b000a,
+0x23e000a,0x241000a,0x244000a,0x247000a,0x24a000a,0x24d000a,0x2d2e000a,0x250000a,0x2d33000a,0x2d36000a,0x253000a,0x258000a,0x25c000a,0x25f000a,0x2d39000a,0x262000a,
+0x2d3c000a,0x265000a,0x268000a,0x2d3f000a,0x2d42000a,0x2d45000a,0x2d48000a,0x2d4c000a,0x2d4f000a,0x2d52000a,0x2d56000a,0x26b000a,0x2d5a000a,0x26e000a,0x272000a,0x2d5f000a,
+0x275000a,0x278000a,0x27b000a,0x27f000a,0x283000a,0x285000a,0x287000a,0x289000a,0x28b000a,0x28d000a,0x28f000a,0x291000a,0x293000a,0x295000a,0x297000a,0x299000a,
+0x29b000a,0x29d000a,0x29f000a,0x2a1000a,0x2a3000a,0x2a5000a,0x2a7000a,0x2a9000a,0x2ab000a,0x2ad000a,0x2af000a,0x2b1000a,0x2b3000a,0x2b5000a,0x3921000a,0x3923000a,
+0x3925000a,0x3927000a,0x3929000a,0x392b000a,0x392d000a,0x392f000a,0x3931000a,0x3933000a,0x3935000a,0x3937000a,0x3939000a,0x393b000a,0x393d000a,0x393f000a,0x3941000a,0x3943000a,
+0x3945000a,0x3947000a,0x3949000a,0x394b000a,0x394d000a,0x394f000a,0x3951000a,0x3953000a,0x2b7000a,0x2b9000a,0x2bb000a,0x2bd000a,0x2bf000a,0x2c1000a,0x2c3000a,0x2c5000a,
+0x2c7000a,0x2c9000a,0x2cb000a,0x2cd000a,0x2cf000a,0x2d1000a,0x2d3000a,0x2d5000a,0x2d7000a,0x2d9000a,0x2db000a,0x2dd000a,0x2df000a,0x2e1000a,0x2e3000a,0x2e5000a,
+0x2e7000a,0x2e9000a,0x3955000a,0x3957000a,0x3959000a,0x395b000a,0x395d000a,0x395f000a,0x3961000a,0,0x3963000a,0x3965000a,0x3967000a,0x3969000a,0x396b000a,0x396d000a,
+0x396f000a,0x3971000a,0x3973000a,0x3975000a,0x3977000a,0x3979000a,0x397b000a,0x397d000a,0x397f000a,0x3981000a,0x3983000a,0x3985000a,0x2eb000a,0x2ed000a,0x2ef000a,0x2f1000a,
+0x2f3000a,0x2f5000a,0x2f7000a,0x2f9000a,0x2fb000a,0x2fd000a,0x2ff000a,0x301000a,0x303000a,0x305000a,0x307000a,0x309000a,0x30b000a,0x30d000a,0x30f000a,0x311000a,
+0x313000a,0x315000a,0x317000a,0x319000a,0x31b000a,0x31d000a,0x3987000a,0x3989000a,0x398b000a,0x398d000a,0x398f000a,0x3991000a,0x3993000a,0x3995000a,0x3997000a,0x3999000a,
+0x399b000a,0x399d000a,0x399f000a,0x39a1000a,0x39a3000a,0x39a5000a,0x39a7000a,0x39a9000a,0x39ab000a,0x39ad000a,0x39af000a,0x39b1000a,0x39b3000a,0x39b5000a,0x39b7000a,0x39b9000a,
+0x31f000a,0,0x321000a,0x323000a,0,0,0x325000a,0,0,0x327000a,0x329000a,0,0,0x32b000a,0x32d000a,0x32f000a,
+0x331000a,0,0x333000a,0x335000a,0x337000a,0x339000a,0x33b000a,0x33d000a,0x33f000a,0x341000a,0x39bb000a,0x39bd000a,0x39bf000a,0x39c1000a,0,0x39c3000a,
+0,0x39c5000a,0x39c7000a,0x39c9000a,0x39cb000a,0x39cd000a,0x39cf000a,0x39d1000a,0,0x39d3000a,0x39d5000a,0x39d7000a,0x39d9000a,0x39db000a,0x39dd000a,0x39df000a,
+0x39e1000a,0x39e3000a,0x39e5000a,0x39e7000a,0x343000a,0x345000a,0x347000a,0x349000a,0x34b000a,0x34d000a,0x34f000a,0x351000a,0x353000a,0x355000a,0x357000a,0x359000a,
+0x35b000a,0x35d000a,0x35f000a,0x361000a,0x363000a,0x365000a,0x367000a,0x369000a,0x36b000a,0x36d000a,0x36f000a,0x371000a,0x373000a,0x375000a,0x39e9000a,0x39eb000a,
+0x39ed000a,0x39ef000a,0x39f1000a,0x39f3000a,0x39f5000a,0x39f7000a,0x39f9000a,0x39fb000a,0x39fd000a,0x39ff000a,0x3a01000a,0x3a03000a,0x3a05000a,0x3a07000a,0x3a09000a,0x3a0b000a,
+0x3a0d000a,0x3a0f000a,0x3a11000a,0x3a13000a,0x3a15000a,0x3a17000a,0x3a19000a,0x3a1b000a,0x377000a,0x379000a,0,0x37b000a,0x37d000a,0x37f000a,0x381000a,0,
+0,0x383000a,0x385000a,0x387000a,0x389000a,0x38b000a,0x38d000a,0x38f000a,0x391000a,0,0x393000a,0x395000a,0x397000a,0x399000a,0x39b000a,0x39d000a,
+0x39f000a,0,0x3a1d000a,0x3a1f000a,0x3a21000a,0x3a23000a,0x3a25000a,0x3a27000a,0x3a29000a,0x3a2b000a,0x3a2d000a,0x3a2f000a,0x3a31000a,0x3a33000a,0x3a35000a,0x3a37000a,
+0x3a39000a,0x3a3b000a,0x3a3d000a,0x3a3f000a,0x3a41000a,0x3a43000a,0x3a45000a,0x3a47000a,0x3a49000a,0x3a4b000a,0x3a4d000a,0x3a4f000a,0x3a1000a,0x3a3000a,0,0x3a5000a,
+0x3a7000a,0x3a9000a,0x3ab000a,0,0x3ad000a,0x3af000a,0x3b1000a,0x3b3000a,0x3b5000a,0,0x3b7000a,0,0,0,0x3b9000a,0x3bb000a,
+0x3bd000a,0x3bf000a,0x3c1000a,0x3c3000a,0x3c5000a,0,0x3a51000a,0x3a53000a,0x3a55000a,0x3a57000a,0x3a59000a,0x3a5b000a,0x3a5d000a,0x3a5f000a,0x3a61000a,0x3a63000a,
+0x3a65000a,0x3a67000a,0x3a69000a,0x3a6b000a,0x3a6d000a,0x3a6f000a,0x3a71000a,0x3a73000a,0x3a75000a,0x3a77000a,0x3a79000a,0x3a7b000a,0x3a7d000a,0x3a7f000a,0x3a81000a,0x3a83000a,
+0x3c7000a,0x3c9000a,0x3cb000a,0x3cd000a,0x3cf000a,0x3d1000a,0x3d3000a,0x3d5000a,0x3d7000a,0x3d9000a,0x3db000a,0x3dd000a,0x3df000a,0x3e1000a,0x3e3000a,0x3e5000a,
+0x3e7000a,0x3e9000a,0x3eb000a,0x3ed000a,0x3ef000a,0x3f1000a,0x3f3000a,0x3f5000a,0x3f7000a,0x3f9000a,0x3a85000a,0x3a87000a,0x3a89000a,0x3a8b000a,0x3a8d000a,0x3a8f000a,
+0x3a91000a,0x3a93000a,0x3a95000a,0x3a97000a,0x3a99000a,0x3a9b000a,0x3a9d000a,0x3a9f000a,0x3aa1000a,0x3aa3000a,0x3aa5000a,0x3aa7000a,0x3aa9000a,0x3aab000a,0x3aad000a,0x3aaf000a,
+0x3ab1000a,0x3ab3000a,0x3ab5000a,0x3ab7000a,0x3fb000a,0x3fd000a,0x3ff000a,0x401000a,0x403000a,0x405000a,0x407000a,0x409000a,0x40b000a,0x40d000a,0x40f000a,0x411000a,
+0x413000a,0x415000a,0x417000a,0x419000a,0x41b000a,0x41d000a,0x41f000a,0x421000a,0x423000a,0x425000a,0x427000a,0x429000a,0x42b000a,0x42d000a,0x3ab9000a,0x3abb000a,
+0x3abd000a,0x3abf000a,0x3ac1000a,0x3ac3000a,0x3ac5000a,0x3ac7000a,0x3ac9000a,0x3acb000a,0x3acd000a,0x3acf000a,0x3ad1000a,0x3ad3000a,0x3ad5000a,0x3ad7000a,0x3ad9000a,0x3adb000a,
+0x3add000a,0x3adf000a,0x3ae1000a,0x3ae3000a,0x3ae5000a,0x3ae7000a,0x3ae9000a,0x3aeb000a,0x42f000a,0x431000a,0x433000a,0x435000a,0x437000a,0x439000a,0x43b000a,0x43d000a,
+0x43f000a,0x441000a,0x443000a,0x445000a,0x447000a,0x449000a,0x44b000a,0x44d000a,0x44f000a,0x451000a,0x453000a,0x455000a,0x457000a,0x459000a,0x45b000a,0x45d000a,
+0x45f000a,0x461000a,0x3aed000a,0x3aef000a,0x3af1000a,0x3af3000a,0x3af5000a,0x3af7000a,0x3af9000a,0x3afb000a,0x3afd000a,0x3aff000a,0x3b01000a,0x3b03000a,0x3b05000a,0x3b07000a,
+0x3b09000a,0x3b0b000a,0x3b0d000a,0x3b0f000a,0x3b11000a,0x3b13000a,0x3b15000a,0x3b17000a,0x3b19000a,0x3b1b000a,0x3b1d000a,0x3b1f000a,0x463000a,0x465000a,0x467000a,0x469000a,
+0x46b000a,0x46d000a,0x46f000a,0x471000a,0x473000a,0x475000a,0x477000a,0x479000a,0x47b000a,0x47d000a,0x47f000a,0x481000a,0x483000a,0x485000a,0x487000a,0x489000a,
+0x48b000a,0x48d000a,0x48f000a,0x491000a,0x493000a,0x495000a,0x3b21000a,0x3b23000a,0x3b25000a,0x3b27000a,0x3b29000a,0x3b2b000a,0x3b2d000a,0x3b2f000a,0x3b31000a,0x3b33000a,
+0x3b35000a,0x3b37000a,0x3b39000a,0x3b3b000a,0x3b3d000a,0x3b3f000a,0x3b41000a,0x3b43000a,0x3b45000a,0x3b47000a,0x3b49000a,0x3b4b000a,0x3b4d000a,0x3b4f000a,0x3b51000a,0x3b53000a,
+0x497000a,0x499000a,0x49b000a,0x49d000a,0x49f000a,0x4a1000a,0x4a3000a,0x4a5000a,0x4a7000a,0x4a9000a,0x4ab000a,0x4ad000a,0x4af000a,0x4b1000a,0x4b3000a,0x4b5000a,
+0x4b7000a,0x4b9000a,0x4bb000a,0x4bd000a,0x4bf000a,0x4c1000a,0x4c3000a,0x4c5000a,0x4c7000a,0x4c9000a,0x3b55000a,0x3b57000a,0x3b59000a,0x3b5b000a,0x3b5d000a,0x3b5f000a,
+0x3b61000a,0x3b63000a,0x3b65000a,0x3b67000a,0x3b69000a,0x3b6b000a,0x3b6d000a,0x3b6f000a,0x3b71000a,0x3b73000a,0x3b75000a,0x3b77000a,0x3b79000a,0x3b7b000a,0x3b7d000a,0x3b7f000a,
+0x3b81000a,0x3b83000a,0x3b85000a,0x3b87000a,0x4cb000a,0x4cd000a,0x4cf000a,0x4d1000a,0x4d3000a,0x4d5000a,0x4d7000a,0x4d9000a,0x4db000a,0x4dd000a,0x4df000a,0x4e1000a,
+0x4e3000a,0x4e5000a,0x4e7000a,0x4e9000a,0x4eb000a,0x4ed000a,0x4ef000a,0x4f1000a,0x4f3000a,0x4f5000a,0x4f7000a,0x4f9000a,0x4fb000a,0x4fd000a,0x3b89000a,0x3b8b000a,
+0x3b8d000a,0x3b8f000a,0x3b91000a,0x3b93000a,0x3b95000a,0x3b97000a,0x3b99000a,0x3b9b000a,0x3b9d000a,0x3b9f000a,0x3ba1000a,0x3ba3000a,0x3ba5000a,0x3ba7000a,0x3ba9000a,0x3bab000a,
+0x3bad000a,0x3baf000a,0x3bb1000a,0x3bb3000a,0x3bb5000a,0x3bb7000a,0x3bb9000a,0x3bbb000a,0x3bbd000a,0x3bbf000a,0,0,0x4ff000a,0x501000a,0x503000a,0x505000a,
+0x507000a,0x509000a,0x50b000a,0x50d000a,0x50f000a,0x511000a,0x513000a,0x515000a,0x517000a,0x519000a,0x51b000a,0x51d000a,0x51f000a,0x521000a,0x523000a,0x525000a,
+0x527000a,0x529000a,0x52b000a,0x52d000a,0x52f000a,0x3bc1000a,0x3bc3000a,0x3bc5000a,0x3bc7000a,0x3bc9000a,0x3bcb000a,0x3bcd000a,0x3bcf000a,0x3bd1000a,0x3bd3000a,0x3bd5000a,
+0x3bd7000a,0x3bd9000a,0x3bdb000a,0x3bdd000a,0x3bdf000a,0x3be1000a,0x3be3000a,0x531000a,0x3be5000a,0x3be7000a,0x3be9000a,0x3beb000a,0x3bed000a,0x3bef000a,0x3bf1000a,0x3bf3000a,
+0x3bf5000a,0x3bf7000a,0x3bf9000a,0x3bfb000a,0x3bfd000a,0x3bff000a,0x533000a,0x535000a,0x537000a,0x539000a,0x53b000a,0x53d000a,0x53f000a,0x541000a,0x543000a,0x545000a,
+0x547000a,0x549000a,0x54b000a,0x54d000a,0x54f000a,0x551000a,0x553000a,0x555000a,0x557000a,0x559000a,0x55b000a,0x55d000a,0x55f000a,0x561000a,0x563000a,0x3c01000a,
+0x3c03000a,0x3c05000a,0x3c07000a,0x3c09000a,0x3c0b000a,0x3c0d000a,0x3c0f000a,0x3c11000a,0x3c13000a,0x3c15000a,0x3c17000a,0x3c19000a,0x3c1b000a,0x3c1d000a,0x3c1f000a,0x3c21000a,
+0x3c23000a,0x565000a,0x3c25000a,0x3c27000a,0x3c29000a,0x3c2b000a,0x3c2d000a,0x3c2f000a,0x3c31000a,0x3c33000a,0x3c35000a,0x3c37000a,0x3c39000a,0x3c3b000a,0x3c3d000a,0x3c3f000a,
+0x567000a,0x569000a,0x56b000a,0x56d000a,0x56f000a,0x571000a,0x573000a,0x575000a,0x577000a,0x579000a,0x57b000a,0x57d000a,0x57f000a,0x581000a,0x583000a,0x585000a,
+0x587000a,0x589000a,0x58b000a,0x58d000a,0x58f000a,0x591000a,0x593000a,0x595000a,0x597000a,0x3c41000a,0x3c43000a,0x3c45000a,0x3c47000a,0x3c49000a,0x3c4b000a,0x3c4d000a,
+0x3c4f000a,0x3c51000a,0x3c53000a,0x3c55000a,0x3c57000a,0x3c59000a,0x3c5b000a,0x3c5d000a,0x3c5f000a,0x3c61000a,0x3c63000a,0x599000a,0x3c65000a,0x3c67000a,0x3c69000a,0x3c6b000a,
+0x3c6d000a,0x3c6f000a,0x3c71000a,0x3c73000a,0x3c75000a,0x3c77000a,0x3c79000a,0x3c7b000a,0x3c7d000a,0x3c7f000a,0x59b000a,0x59d000a,0x59f000a,0x5a1000a,0x5a3000a,0x5a5000a,
+0x5a7000a,0x5a9000a,0x5ab000a,0x5ad000a,0x5af000a,0x5b1000a,0x5b3000a,0x5b5000a,0x5b7000a,0x5b9000a,0x5bb000a,0x5bd000a,0x5bf000a,0x5c1000a,0x5c3000a,0x5c5000a,
+0x5c7000a,0x5c9000a,0x5cb000a,0x3c81000a,0x3c83000a,0x3c85000a,0x3c87000a,0x3c89000a,0x3c8b000a,0x3c8d000a,0x3c8f000a,0x3c91000a,0x3c93000a,0x3c95000a,0x3c97000a,0x3c99000a,
+0x3c9b000a,0x3c9d000a,0x3c9f000a,0x3ca1000a,0x3ca3000a,0x5cd000a,0x3ca5000a,0x3ca7000a,0x3ca9000a,0x3cab000a,0x3cad000a,0x3caf000a,0x3cb1000a,0x3cb3000a,0x3cb5000a,0x3cb7000a,
+0x3cb9000a,0x3cbb000a,0x3cbd000a,0x3cbf000a,0x5cf000a,0x5d1000a,0x5d3000a,0x5d5000a,0x5d7000a,0x5d9000a,0x5db000a,0x5dd000a,0x5df000a,0x5e1000a,0x5e3000a,0x5e5000a,
+0x5e7000a,0x5e9000a,0x5eb000a,0x5ed000a,0x5ef000a,0x5f1000a,0x5f3000a,0x5f5000a,0x5f7000a,0x5f9000a,0x5fb000a,0x5fd000a,0x5ff000a,0x3cc1000a,0x3cc3000a,0x3cc5000a,
+0x3cc7000a,0x3cc9000a,0x3ccb000a,0x3ccd000a,0x3ccf000a,0x3cd1000a,0x3cd3000a,0x3cd5000a,0x3cd7000a,0x3cd9000a,0x3cdb000a,0x3cdd000a,0x3cdf000a,0x3ce1000a,0x3ce3000a,0x601000a,
+0x3ce5000a,0x3ce7000a,0x3ce9000a,0x3ceb000a,0x3ced000a,0x3cef000a,0x3cf1000a,0x3cf3000a,0x3cf5000a,0x3cf7000a,0x3cf9000a,0x3cfb000a,0x3cfd000a,0x3cff000a,0x603000a,0x3d01000a,
+0,0,0x3d03000a,0x3d05000a,0x3d07000a,0x3d09000a,0x3d0b000a,0x3d0d000a,0x3d0f000a,0x3d11000a,0x3d13000a,0x3d15000a,0x3d17000a,0x3d19000a,0x3d1b000a,0x3d1d000a,
+0x3d1f000a,0x3d21000a,0x3d23000a,0x3d25000a,0x605e60f,0x608e60f,0x206be6b0,0x60be60f,0x60ee60f,0x206cf0b0,0xe600,0xdc00,0xdc00,0xdc00,0xe600,0xe600,
+0xe600,0xdc00,0xdc00,0,0xe600,0xe600,0xe600,0xdc00,0xdc00,0xdc00,0xdc00,0xe600,0xe800,0xdc00,0xdc00,0xe600,
+0xe900,0xea00,0xea00,0xe900,0,0,0,0,0x211f000a,0x145c000e,0x1464000c,0x616000f,0x1468000c,0x146c000c,0x1470000c,0,
+0x1474000c,0,0x1478000c,0x147c000c,0x1480000c,0x3d940040,0,0,0,0x3d950040,0,0x3d960040,0,0x3d970040,0,0,
+0,0,0,0x3d980040,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0x900,0,0,0,0xe600,0xdc00,0xe600,0xe600,0,0,0,0x618000f,0x61c000f,0x620000f,0x624000f,
+0x628000f,0x62c000f,0x630000f,0x634000f,0,0,0,0,0,0,0,0x3dcb0040,0,0,0,0x15b7000c,
+0x15ba000c,0x900,0,0,0,0,0,0,0,0,0,0x207200b0,0,0,0,0,
+0x638000f,0x63c000f,0,0x640000f,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0x644000f,0,0,0x648000f,0,0,0,0,0,
+0x700,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0x900,0,0,0,0,0,0,0,0,0,0,0,0x64c000f,0x650000f,0x654000f,
+0,0,0x658000f,0,0,0,0,0,0,0,0,0x3dcc0040,0x15bd000c,0,0,0x15c0000c,
+0x15c3000c,0x900,0,0,0,0,0,0,0,0,0x207400b0,0x207500b0,0,0,0,0,
+0x65c000f,0x660000f,0,0,0,0,0,0x664000f,0,0,0,0,0,0,0,0,
+0,0x667000f,0,0,0,0,0x66a000f,0,0,0,0,0x66d000f,0,0,0,0,
+0x670000f,0,0,0,0,0,0,0,0,0,0,0,0,0x673000f,0,0,
+0,0,0,0,0,0x8100,0x8200,0x676000f,0x8400,0x67a000f,0x67e000f,0x2150000a,0x682000f,0x2155000a,0x8200,0x8200,
+0x8200,0x8200,0,0,0x8200,0x686000f,0xe600,0xe600,0x900,0,0xe600,0xe600,0,0,0,0,
+0,0,0,0,0,0,0,0x68a000f,0,0,0,0,0,0,0,0,
+0,0x68d000f,0,0,0,0,0x690000f,0,0,0,0,0x693000f,0,0,0,0,
+0x696000f,0,0,0,0,0,0,0,0,0,0,0,0,0x699000f,0,0,
+0,0,0,0,0x1c20004c,0x1c25004c,0x1c2a004c,0x1c30004c,0x1c36004c,0x1c3c004c,0x1c42004c,0x1c48004c,0x1c4e004c,0x1c53004c,0x1c58004c,0x1c5e004c,
+0x1c64004c,0x1c6a004c,0x1c70004c,0x1c76004c,0x1c7c004c,0x69c000f,0x1c80000c,0x6a0000f,0x1c85004c,0x6a4000f,0x1c89000c,0x6a8000f,0x1c8d000c,0x6ac000f,0x1c91000c,0x6b0000f,
+0x1c96004c,0x6b4000f,0,0,0x1d52000c,0x1d57000c,0x1d5c000c,0x1d62000c,0x1d68000c,0x1d6e000c,0x1d74000c,0x1d7a000c,0x1d80000c,0x1d85000c,0x1d8a000c,0x1d90000c,
+0x1d96000c,0x1d9c000c,0x1da2000c,0x1da8000c,0x1dae000c,0x1db2000c,0x1db6000c,0x1dbb000c,0x1dbf000c,0,0x1dc5004c,0x1dc9000c,0x1dce000c,0x1dd2000c,0x1dd6000c,0x6b8000f,
+0x1dda000c,0x21f9000a,0x6bc000f,0x21fe004a,0x2202000a,0x1dde000e,0x1de6000c,0x1deb000c,0x1def000c,0,0x1df5004c,0x1df9000c,0x1dfe000c,0x6be000f,0x1e02000c,0x6c2000f,
+0x1e06000c,0x1e0a000e,0x1e12000e,0x1e1a000e,0x1e22000c,0x1e26000c,0x1e2a000c,0x6c6000f,0,0,0x1e2f000c,0x1e33000c,0x1e38000c,0x1e3c000c,0x1e40000c,0x6cb000f,
+0,0x1e44000e,0x1e4c000e,0x1e54000e,0x1e5c000c,0x1e60000c,0x1e64000c,0x6cf000f,0x1e69000c,0x1e6d000c,0x1e71000c,0x1e75000c,0x1e7a000c,0x1e7e000c,0x1e82000c,0x6d4000f,
+0x1e86000c,0x1e8a000e,0x6d8000f,0x6e0000f,0,0,0x1e92000c,0x1e97000c,0x1e9b000c,0,0x1ea1004c,0x1ea5000c,0x1eaa000c,0x6e2000f,0x1eae000c,0x6e6000f,
+0x1eb2000c,0x6ea000f,0x2207004a,0,0x6ef000f,0x6f2000f,0x220b000a,0x220d000a,0x220f000a,0x2211000a,0x2213000a,0x2215000a,0x2217000a,0x2219000a,0x221b000a,0,
+0,0,0,0,0,0x221d000a,0,0,0,0,0,0x221f000a,0,0,0,0,
+0,0,0,0,0,0x6fd000f,0x6ff000f,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0x701000f,0,0,0,0x705000f,0x707000f,0x709000f,0x70b000f,0x70d000f,0x70f000f,0x711000f,0x713000f,
+0x715000f,0x717000f,0x719000f,0x71b000f,0x71d000f,0x71f000f,0x721000f,0x723000f,0x725000f,0x727000f,0x729000f,0x72b000f,0x72d000f,0x72f000f,0x731000f,0x733000f,
+0x735000f,0x737000f,0x739000f,0x73b000f,0x73d000f,0x73f000f,0x741000f,0x743000f,0x745000f,0x747000f,0x749000f,0x74b000f,0x74d000f,0x74f000f,0x751000f,0x753000f,
+0x755000f,0x757000f,0x759000f,0x75b000f,0x75d000f,0x75f000f,0x761000f,0x763000f,0x765000f,0x767000f,0x769000f,0x76b000f,0x76d000f,0x76f000f,0x771000f,0x773000f,
+0x775000f,0x777000f,0x779000f,0x77b000f,0x77d000f,0x77f000f,0x781000f,0x783000f,0x785000f,0x787000f,0x789000f,0x78b000f,0x78d000f,0x78f000f,0x791000f,0x793000f,
+0x795000f,0x797000f,0x799000f,0x79b000f,0x79d000f,0x79f000f,0x7a1000f,0x7a3000f,0x7a5000f,0x7a7000f,0x7a9000f,0x7ab000f,0x7ad000f,0x7af000f,0x7b1000f,0x7b3000f,
+0x7b5000f,0x7b7000f,0x7b9000f,0x7bb000f,0x7bd000f,0x7bf000f,0x7c1000f,0x7c3000f,0x7c5000f,0x7c7000f,0x7c9000f,0x7cb000f,0x7cd000f,0x7cf000f,0x7d1000f,0x7d3000f,
+0x7d5000f,0x7d7000f,0x7d9000f,0x7db000f,0x7dd000f,0x7df000f,0x7e1000f,0x7e3000f,0x7e5000f,0x7e7000f,0x7e9000f,0x7eb000f,0x7ed000f,0x7ef000f,0x7f1000f,0x7f3000f,
+0x7f5000f,0x7f7000f,0x7f9000f,0x7fb000f,0x7fd000f,0x7ff000f,0x801000f,0x803000f,0x805000f,0x807000f,0x809000f,0x80b000f,0x80d000f,0x80f000f,0x811000f,0x813000f,
+0x815000f,0x817000f,0x819000f,0x81b000f,0x81d000f,0x81f000f,0x821000f,0x823000f,0x825000f,0x827000f,0x829000f,0x82b000f,0x82d000f,0x82f000f,0x831000f,0x833000f,
+0x835000f,0x837000f,0x839000f,0x83b000f,0x83d000f,0x83f000f,0x841000f,0x843000f,0x845000f,0x847000f,0x849000f,0x84b000f,0x84d000f,0x84f000f,0x851000f,0x853000f,
+0x855000f,0x857000f,0x859000f,0x85b000f,0x85d000f,0x85f000f,0x861000f,0x863000f,0x865000f,0x867000f,0x869000f,0x86b000f,0x86d000f,0x86f000f,0x871000f,0x873000f,
+0x875000f,0x877000f,0x879000f,0x87b000f,0x87d000f,0x87f000f,0x881000f,0x883000f,0x885000f,0x887000f,0x889000f,0x88b000f,0x88d000f,0x88f000f,0x891000f,0x893000f,
+0x895000f,0x897000f,0x899000f,0x89b000f,0x89d000f,0x89f000f,0x8a1000f,0x8a3000f,0x8a5000f,0x8a7000f,0x8a9000f,0x8ab000f,0x8ad000f,0x8af000f,0x8b1000f,0x8b3000f,
+0x8b5000f,0x8b7000f,0x8b9000f,0x8bb000f,0x8bd000f,0x8bf000f,0x8c1000f,0x8c3000f,0x8c5000f,0x8c7000f,0x8c9000f,0x8cb000f,0x8cd000f,0x8cf000f,0x8d1000f,0x8d3000f,
+0x8d5000f,0x8d7000f,0x8d9000f,0x8db000f,0x8dd000f,0x8df000f,0x8e1000f,0x8e3000f,0x8e5000f,0x8e7000f,0x8e9000f,0x8eb000f,0x8ed000f,0x8ef000f,0x8f1000f,0x8f3000f,
+0x8f5000f,0x8f7000f,0x8f9000f,0x8fb000f,0x8fd000f,0x8ff000f,0x901000f,0x903000f,0x905000f,0x907000f,0x909000f,0x90b000f,0x90d000f,0x90f000f,0x911000f,0x913000f,
+0x915000f,0x917000f,0x919000f,0x91b000f,0x91d000f,0x91f000f,0,0,0x921000f,0,0x923000f,0,0,0x925000f,0x927000f,0x929000f,
+0x92b000f,0x92d000f,0x92f000f,0x931000f,0x933000f,0x935000f,0x937000f,0,0x939000f,0,0x93b000f,0,0,0x93d000f,0x93f000f,0,
+0,0,0x941000f,0x943000f,0x945000f,0x947000f,0,0,0x949000f,0x94b000f,0x94d000f,0x94f000f,0x951000f,0x953000f,0x955000f,0x957000f,
+0x959000f,0x95b000f,0x95d000f,0x95f000f,0x961000f,0x963000f,0x965000f,0x967000f,0x969000f,0x96b000f,0x96d000f,0x96f000f,0x971000f,0x973000f,0x975000f,0x977000f,
+0x979000f,0x97b000f,0x97d000f,0x97f000f,0x981000f,0x983000f,0x985000f,0x987000f,0x989000f,0x98b000f,0x98d000f,0x98f000f,0x991000f,0x993000f,0x995000f,0x997000f,
+0x999000f,0x99b000f,0x99d000f,0x99f000f,0x9a1000f,0x9a3000f,0x9a5000f,0x9a7000f,0x9a9000f,0x9ab000f,0x9ad000f,0x9af000f,0x9b1000f,0x9b3000f,0x9b5000f,0x9b7000f,
+0x9b9000f,0x9bb000f,0x9bd000f,0,0,0,0,0,0x9bf000f,0x9c1000f,0x9c3000f,0x9c5000f,0x9c7000f,0x9c9000f,0x9cb000f,0x9cd000f,
+0x9cf000f,0x9d1000f,0x9d3000f,0x9d5000f,0x9d7000f,0x9d9000f,0x9db000f,0x9dd000f,0x9df000f,0x9e1000f,0x9e3000f,0x9e5000f,0x9e7000f,0x9e9000f,0x9eb000f,0x9ed000f,
+0x9ef000f,0x9f1000f,0x9f3000f,0x9f5000f,0x9f7000f,0x9f9000f,0x9fb000f,0x9fd000f,0x9ff000f,0xa01000f,0xa03000f,0xa05000f,0xa07000f,0xa09000f,0xa0b000f,0xa0d000f,
+0xa0f000f,0xa11000f,0xa13000f,0xa15000f,0xa17000f,0xa19000f,0xa1b000f,0xa1d000f,0xa1f000f,0xa21000f,0xa23000f,0xa25000f,0xa27000f,0xa29000f,0xa2b000f,0xa2d000f,
+0xa2f000f,0xa31000f,0xa33000f,0xa35000f,0xa37000f,0xa39000f,0xa3b000f,0xa3d000f,0xa3f000f,0xa41000f,0xa43000f,0xa45000f,0xa47000f,0xa49000f,0xa4b000f,0xa4d000f,
+0xa4f000f,0xa51000f,0xa53000f,0xa55000f,0xa57000f,0xa59000f,0xa5b000f,0xa5d000f,0xa5f000f,0xa61000f,0xa63000f,0xa65000f,0xa67000f,0xa69000f,0xa6b000f,0xa6d000f,
+0xa6f000f,0xa71000f,0xa73000f,0xa75000f,0xa77000f,0xa79000f,0xa7b000f,0xa7d000f,0xa80000f,0xa83000f,0xa86000f,0xa88000f,0xa8a000f,0xa8c000f,0xa8f000f,0xa92000f,
+0xa95000f,0xa97000f,0,0,0,0,0,0,0x2dd9000a,0x2ddc000a,0x2ddf000a,0x2de2000a,0x2de6000a,0x2dea000a,0x2ded000a,0,
+0,0,0,0,0,0,0,0,0,0,0,0x2df0000a,0x2df3000a,0x2df6000a,0x2df9000a,0x2dfc000a,
+0,0,0,0,0,0xa99000f,0x1a00,0xa9d000f,0x2dff000a,0x2e01000a,0x2e03000a,0x2e05000a,0x2e07000a,0x2e09000a,0x2e0b000a,0x2e0d000a,
+0x2e0f000a,0x2e11000a,0xaa1000f,0xaa5000f,0xaa9000f,0xaae000f,0xab3000f,0xab7000f,0xabb000f,0xabf000f,0xac3000f,0xac7000f,0xacb000f,0xacf000f,0xad3000f,0,
+0xad7000f,0xadb000f,0xadf000f,0xae3000f,0xae7000f,0,0xaeb000f,0,0xaef000f,0xaf3000f,0,0xaf7000f,0xafb000f,0,0xaff000f,0xb03000f,
+0xb07000f,0xb0b000f,0xb0f000f,0xb13000f,0xb17000f,0xb1b000f,0xb1f000f,0x2e13000a,0x2e16000a,0x2e18000a,0x2e1a000a,0x2e1c000a,0x2e1e000a,0x2e20000a,0x2e22000a,0x2e24000a,
+0x2e26000a,0x2e28000a,0x2e2a000a,0x2e2c000a,0x2e2e000a,0x2e30000a,0x2e32000a,0x2e34000a,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0xb23000f,0xb29000f,0xb2f000f,0xb37000f,0xb3f000f,0xb47000f,0xb4f000f,0xd800,0xd800,0x100,
+0x100,0x100,0,0,0,0xe200,0xd800,0xd800,0xd800,0xd800,0xd800,0,0,0,0,0,
+0,0,0,0xdc00,0xdc00,0xdc00,0xdc00,0xdc00,0,0,0,0,0,0,0,0,
+0,0,0xe600,0xe600,0xe600,0xe600,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0xb57000f,0xb5d000f,0xb63000f,0xb6b000f,0xb73000f,0xb7b000f,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0xb83000f,0xb85000f,0xb87000f,0xb89000f,0xb8c000f,0xb8e000f,0xb90000f,0xb92000f,
+0xb94000f,0xb96000f,0xb98000f,0xb9a000f,0xb9c000f,0xb9e000f,0xba1000f,0xba3000f,0xba5000f,0xba7000f,0xba9000f,0xbac000f,0xbae000f,0xbb0000f,0xbb2000f,0xbb5000f,
+0xbb7000f,0xbb9000f,0xbbb000f,0xbbd000f,0xbbf000f,0xbc2000f,0xbc4000f,0xbc6000f,0xbc8000f,0xbca000f,0xbcc000f,0xbce000f,0xbd0000f,0xbd2000f,0xbd4000f,0xbd6000f,
+0xbd8000f,0xbda000f,0xbdc000f,0xbde000f,0xbe0000f,0xbe2000f,0xbe4000f,0xbe6000f,0xbe8000f,0xbea000f,0xbec000f,0xbee000f,0xbf0000f,0xbf3000f,0xbf5000f,0xbf7000f,
+0xbf9000f,0xbfc000f,0xbfe000f,0xc00000f,0xc02000f,0xc04000f,0xc06000f,0xc08000f,0xc0a000f,0xc0c000f,0xc0e000f,0xc10000f,0xc12000f,0xc14000f,0xc16000f,0xc18000f,
+0xc1a000f,0xc1c000f,0xc1e000f,0xc20000f,0xc22000f,0xc24000f,0xc26000f,0xc28000f,0xc2a000f,0xc2c000f,0xc2e000f,0xc30000f,0xc32000f,0xc34000f,0xc36000f,0xc38000f,
+0xc3a000f,0xc3c000f,0xc3f000f,0xc41000f,0xc43000f,0xc45000f,0xc47000f,0xc49000f,0xc4b000f,0xc4e000f,0xc51000f,0xc53000f,0xc55000f,0xc57000f,0xc59000f,0xc5b000f,
+0xc5d000f,0xc5f000f,0xc61000f,0xc63000f,0xc65000f,0xc68000f,0xc6a000f,0xc6c000f,0xc6e000f,0xc70000f,0xc73000f,0xc75000f,0xc77000f,0xc79000f,0xc7b000f,0xc7d000f,
+0xc7f000f,0xc81000f,0xc83000f,0xc85000f,0xc88000f,0xc8a000f,0xc8d000f,0xc8f000f,0xc91000f,0xc93000f,0xc95000f,0xc97000f,0xc99000f,0xc9b000f,0xc9d000f,0xc9f000f,
+0xca1000f,0xca3000f,0xca6000f,0xca8000f,0xcaa000f,0xcac000f,0xcae000f,0xcb0000f,0xcb3000f,0xcb5000f,0xcb8000f,0xcbb000f,0xcbd000f,0xcbf000f,0xcc1000f,0xcc3000f,
+0xcc6000f,0xcc9000f,0xccb000f,0xccd000f,0xccf000f,0xcd1000f,0xcd3000f,0xcd5000f,0xcd7000f,0xcd9000f,0xcdb000f,0xcdd000f,0xcdf000f,0xce2000f,0xce4000f,0xce6000f,
+0xce8000f,0xcea000f,0xcec000f,0xcee000f,0xcf0000f,0xcf2000f,0xcf4000f,0xcf6000f,0xcf8000f,0xcfa000f,0xcfc000f,0xcfe000f,0xd00000f,0xd02000f,0xd04000f,0xd06000f,
+0xd08000f,0xd0b000f,0xd0d000f,0xd0f000f,0xd11000f,0xd13000f,0xd15000f,0xd18000f,0xd1a000f,0xd1c000f,0xd1e000f,0xd20000f,0xd22000f,0xd24000f,0xd26000f,0xd28000f,
+0xd2a000f,0xd2c000f,0xd2e000f,0xd31000f,0xd33000f,0xd35000f,0xd37000f,0xd39000f,0xd3b000f,0xd3d000f,0xd3f000f,0xd41000f,0xd43000f,0xd45000f,0xd47000f,0xd49000f,
+0xd4b000f,0xd4d000f,0xd4f000f,0xd51000f,0xd53000f,0xd55000f,0xd58000f,0xd5a000f,0xd5c000f,0xd5e000f,0xd60000f,0xd62000f,0xd65000f,0xd67000f,0xd69000f,0xd6b000f,
+0xd6d000f,0xd6f000f,0xd71000f,0xd73000f,0xd75000f,0xd78000f,0xd7a000f,0xd7c000f,0xd7e000f,0xd81000f,0xd83000f,0xd85000f,0xd87000f,0xd89000f,0xd8b000f,0xd8d000f,
+0xd90000f,0xd93000f,0xd96000f,0xd98000f,0xd9b000f,0xd9d000f,0xd9f000f,0xda1000f,0xda3000f,0xda5000f,0xda7000f,0xda9000f,0xdab000f,0xdad000f,0xdaf000f,0xdb2000f,
+0xdb4000f,0xdb6000f,0xdb8000f,0xdba000f,0xdbc000f,0xdbe000f,0xdc1000f,0xdc3000f,0xdc5000f,0xdc8000f,0xdcb000f,0xdcd000f,0xdcf000f,0xdd1000f,0xdd3000f,0xdd5000f,
+0xdd7000f,0xdd9000f,0xddb000f,0xddd000f,0xde0000f,0xde2000f,0xde5000f,0xde7000f,0xdea000f,0xdec000f,0xdee000f,0xdf0000f,0xdf3000f,0xdf5000f,0xdf7000f,0xdfa000f,
+0xdfd000f,0xdff000f,0xe01000f,0xe03000f,0xe05000f,0xe07000f,0xe09000f,0xe0b000f,0xe0d000f,0xe0f000f,0xe11000f,0xe13000f,0xe15000f,0xe17000f,0xe1a000f,0xe1c000f,
+0xe1f000f,0xe21000f,0xe24000f,0xe26000f,0xe29000f,0xe2c000f,0xe2f000f,0xe31000f,0xe33000f,0xe35000f,0xe38000f,0xe3b000f,0xe3e000f,0xe41000f,0xe43000f,0xe45000f,
+0xe47000f,0xe49000f,0xe4b000f,0xe4d000f,0xe4f000f,0xe51000f,0xe54000f,0xe56000f,0xe58000f,0xe5a000f,0xe5c000f,0xe5f000f,0xe61000f,0xe64000f,0xe67000f,0xe69000f,
+0xe6b000f,0xe6d000f,0xe6f000f,0xe71000f,0xe73000f,0xe76000f,0xe79000f,0xe7c000f,0xe7e000f,0xe80000f,0xe83000f,0xe85000f,0xe87000f,0xe89000f,0xe8c000f,0xe8e000f,
+0xe90000f,0xe92000f,0xe94000f,0xe96000f,0xe99000f,0xe9b000f,0xe9d000f,0xe9f000f,0xea1000f,0xea3000f,0xea5000f,0xea8000f,0xeab000f,0xead000f,0xeb0000f,0xeb2000f,
+0xeb5000f,0xeb7000f,0xeb9000f,0xebb000f,0xebe000f,0xec1000f,0xec3000f,0xec6000f,0xec8000f,0xecb000f,0xecd000f,0xecf000f,0xed1000f,0xed3000f,0xed5000f,0xed7000f,
+0xeda000f,0xedd000f,0xee0000f,0xee3000f,0xee5000f,0xee7000f,0xee9000f,0xeeb000f,0xeed000f,0xeef000f,0xef1000f,0xef3000f,0xef5000f,0xef7000f,0xef9000f,0xefb000f,
+0xefe000f,0xf00000f,0xf02000f,0xf04000f,0xf06000f,0xf08000f,0xf0a000f,0xf0c000f,0xf0e000f,0xf10000f,0xf12000f,0xf14000f,0xf16000f,0xf19000f,0xf1c000f,0xf1f000f,
+0xf21000f,0xf23000f,0xf25000f,0xf27000f,0xf2a000f,0xf2c000f,0xf2f000f,0xf31000f,0xf33000f,0xf36000f,0xf39000f,0xf3b000f,0xf3d000f,0xf3f000f,0xf41000f,0xf43000f,
+0xf45000f,0xf47000f,0xf49000f,0xf4b000f,0xf4d000f,0xf4f000f,0xf51000f,0xf53000f,0xf55000f,0xf57000f,0xf59000f,0xf5b000f,0xf5d000f,0xf5f000f,0xf62000f,0xf64000f,
+0xf66000f,0xf68000f,0xf6a000f,0xf6c000f,0xf6f000f,0xf72000f,0xf74000f,0xf76000f,0xf78000f,0xf7a000f,0xf7c000f,0xf7e000f,0xf81000f,0xf83000f,0xf85000f,0xf87000f,
+0xf89000f,0xf8c000f,0xf8f000f,0xf91000f,0xf93000f,0xf95000f,0xf98000f,0xf9a000f,0xf9c000f,0xf9f000f,0xfa2000f,0xfa4000f,0xfa6000f,0xfa8000f,0xfab000f,0xfad000f,
+0xfaf000f,0xfb1000f,0xfb3000f,0xfb5000f,0xfb7000f,0xfb9000f,0xfbc000f,0xfbe000f,0xfc0000f,0xfc2000f,0xfc5000f,0xfc7000f,0xfc9000f,0xfcb000f,0xfcd000f,0xfd0000f,
+0xfd3000f,0xfd5000f,0xfd7000f,0xfd9000f,0xfdc000f,0xfde000f,0xfe1000f,0xfe3000f,0xfe5000f,0xfe7000f,0xfea000f,0xfec000f,0xfee000f,0xff0000f,0xff2000f,0xff4000f,
+0xff6000f,0xff8000f,0xffb000f,0xffd000f,0xfff000f,0x1001000f,0x1003000f,0x1005000f,0x1007000f,0x100a000f,0x100c000f,0x100f000f,0x1012000f,0x1015000f,0x1017000f,0x1019000f,
+0x101b000f,0x101d000f,0x101f000f,0x1021000f,0x1023000f,0x1025000f,0,0,0x1028000c,0x102c000c,0x1031004c,0x1035000c,0x103a004c,0x103f004c,0x3d8e0040,0x1044004c,
+0x1048000c,0x104c000c,0x1051004c,0x1055000c,0x1059000c,0x105d000c,0x1061000c,0x1066004c,0,0x106a000c,0x106e000c,0x1072000c,0x1077004c,0x107c004c,0x1081004c,0,
+0x3d920040,0x1085000c,0x1089000c,0x108d000c,0x1092004c,0x1096000c,0,0,0x109a000c,0x109e000c,0x10a3004c,0x10a7000c,0x10ac004c,0x10b1004c,0x3d8f0040,0x10b6004c,
+0x10ba000c,0x10be000c,0x10c3004c,0x10c7000c,0x10cb000c,0x10cf000c,0x10d3000c,0x10d8004c,0,0x10dc000c,0x10e0000c,0x10e4000c,0x10e9004c,0x10ee004c,0x10f3004c,0,
+0x3d930040,0x10f7000c,0x10fb000c,0x10ff000c,0x1104004c,0x1108000c,0,0x110c000c,0x1110000c,0x1114000c,0x1119004c,0x111e004c,0x1122000c,0x1126000c,0x112a000c,0x112e000c,
+0x1132000c,0x1136000c,0x113a000c,0x113e000c,0x1142000c,0x1146000c,0x114a000c,0x114e000c,0,0,0x1153004c,0x1158004c,0x115c000c,0x1160000c,0x1164000c,0x1168000c,
+0x116c000c,0x1170000c,0x1174000c,0x1178000c,0x117c000c,0x1180000c,0x1184000c,0x1188000c,0x118c000c,0x1190000c,0x1194000c,0x1198000c,0x119c000c,0x11a0000c,0,0,
+0x11a4000c,0x11a8000c,0x11ac000c,0x11b0000c,0x11b4000c,0x11b8000c,0x11bc000c,0x11c0000c,0x11c4000c,0,0x20af000a,0x20b2000a,0x11c8000c,0x11cc000c,0x11d0000c,0x11d4000c,
+0,0x11d8000c,0x11dc000c,0x11e0000c,0x11e4000c,0x11e8000c,0x11ec000c,0x20b5000a,0x20b8000a,0,0,0x11f0000c,0x11f4000c,0x11f8000c,0x11fc000c,0x1200000c,
+0x1204000c,0x20bb000a,0,0,0x1209004c,0x120e004c,0x1212000c,0x1216000c,0x121a000c,0x121e000c,0,0,0x1222000c,0x1226000c,0x122a000c,0x122e000c,
+0x1232000c,0x1236000c,0x123b004c,0x1240004c,0x1244000c,0x1248000c,0x124c000c,0x1250000c,0x1255004c,0x125a004c,0x125e000c,0x1262000c,0x1266000c,0x126a000c,0,0,
+0x126f004c,0x1274004c,0x1279004c,0x127e004c,0x1282000c,0x1286000c,0x128a000c,0x128e000c,0x1292000c,0x1296000c,0x129a000c,0x129e000c,0x12a2000c,0x12a6000c,0x12aa000c,0x12ae000c,
+0x12b2000c,0x12b6000c,0x12ba000c,0x12be000c,0x12c2000c,0x12c6000c,0x12ca000c,0x20bf004a,0x12cf004c,0x12d4004c,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0x12d9004c,0x12de004c,0,0,0,0,0,0,0x3d900040,
+0,0,0,0,0,0,0,0,0x20c1000a,0x20c6000a,0x20cb000a,0x20d0000a,0x20d3000a,0x20d6000a,0x20d9000a,0x20dc000a,
+0x20df000a,0x12e2000c,0x12e6000c,0x12ea000c,0x12ee000c,0x12f2000c,0x12f6000c,0x12fa000c,0x12fe000c,0x1302000c,0x1307000c,0x130c000c,0x1311000c,0x1316000c,0x131b000c,0x1320000c,
+0x1325000c,0,0x132a000c,0x132f000c,0x1334000c,0x1339000c,0x133e000c,0x1342000c,0,0,0x1346000c,0x134a000c,0x134e000c,0x1352000c,0x1357004c,0x135c004c,
+0x1360000c,0x1365000c,0x136a000c,0x136e000c,0x1372000c,0x20e2000a,0x20e5000a,0x20e8000a,0x1376000c,0x137a000c,0,0,0x137e000c,0x1382000c,0x1386000c,0x138b000c,
+0x1390000c,0x1394000c,0x1398000c,0x139c000c,0x13a0000c,0x13a4000c,0x13a8000c,0x13ac000c,0x13b0000c,0x13b4000c,0x13b8000c,0x13bc000c,0x13c0000c,0x13c4000c,0x13c8000c,0x13cc000c,
+0x13d0000c,0x13d4000c,0x13d8000c,0x13dc000c,0x13e0000c,0x13e4000c,0x13e8000c,0x13ec000c,0x13f0000c,0x13f4000c,0x13f8000c,0x13fc000c,0x1400000c,0x1404000c,0x1408000c,0x140c000c,
+0,0,0x1410000c,0x1414000c,0,0,0,0,0,0,0x1419004c,0x141e004c,0x1423004c,0x1428004c,0x142c000c,0x1431000c,
+0x1436000c,0x143b000c,0x1441004c,0x1446004c,0x144a000c,0x144f000c,0x1454000c,0x1458000c,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0x3def0040,0,0,0,0x3d990040,0,0,0,0x3d9a0040,0x1485000c,0x1489000c,
+0x148e004c,0x1492000c,0x1497004c,0x149b000c,0x149f000c,0x3d9b0040,0,0,0,0x3d9c0040,0,0x3d9d0040,0,0x3d9e0040,0,0,
+0,0,0,0x3da00040,0x14bb000c,0x14bf000c,0,0x14c3000c,0,0,0x3da40040,0x14c7000c,0,0,0,0,
+0x14cb000c,0x14cf000c,0x14d3000c,0,0x3db20040,0,0,0x3da30040,0,0x3da20040,0x3db00040,0x3db60040,0x3da60040,0x14d7000c,0x3da50040,0,
+0,0,0x3db80040,0,0,0,0,0x3da70040,0,0,0,0x3dbe0040,0,0,0,0x3dc00040,
+0,0x3dbc0040,0,0,0x3db30040,0,0,0x3daa0040,0,0x3da90040,0x3db10040,0x3db70040,0x3da80040,0x14db000c,0x3dac0040,0,
+0,0,0x3db90040,0,0,0,0,0x3dad0040,0,0,0,0x3dbf0040,0,0,0,0x3dc10040,
+0,0x3dbd0040,0,0,0x14df000c,0x14e3000c,0,0x14e7000c,0,0,0x3dab0040,0x14eb000c,0,0,0,0,
+0x14ef000c,0x14f3000c,0x14f7000c,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0x3dae0040,0x3daf0040,0x14fb000c,0x14ff000c,0,0,0,0,
+0,0,0,0,0,0x1503000c,0x1507000c,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0x150b000c,0x150f000c,0x1513000c,0x1517000c,0,0,0x151b000c,0x151f000c,0x3db40040,0x3db50040,0x1523000c,0x1527000c,
+0x152b000c,0x152f000c,0x1533000c,0x1537000c,0,0,0x153b000c,0x153f000c,0x1543000c,0x1547000c,0x154b000c,0x154f000c,0x3dba0040,0x3dbb0040,0x1553000c,0x1557000c,
+0x155b000c,0x155f000c,0x1563000c,0x1567000c,0x156b000c,0x156f000c,0x1573000c,0x1577000c,0x157b000c,0x157f000c,0,0,0x1583000c,0x1587000c,0,0,
+0,0,0,0,0,0,0x158b000c,0x158f000c,0x1593000c,0x1597000c,0x159b000c,0x3dc20040,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0x159f000c,0x3dc60040,0x15a3000c,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0x3dc70040,0x15a7000c,0,0x3dc50040,0xe600,0xe600,0xe600,0xe600,0xe600,0xe600,
+0xe600,0,0,0xe600,0,0,0,0,0,0,0,0,0x3dc80040,0x15ab000c,0,0,
+0,0,0,0,0x3dc90040,0x15af000c,0,0x3dca0040,0x15b3000c,0,0,0,0,0,0,0,
+0x207007b0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0x3dcd0040,0,0x15c6000c,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0x3dce0040,0x3dcf0040,0,0,0x15c9000c,0x15cc000c,0x15cf000c,0x900,0,0,
+0,0,0,0,0,0,0,0x207700b0,0,0,0,0,0,0,0,0,
+0,0,0x3dd00040,0,0x15d2000c,0,0,0,0,0x900,0,0,0,0,0,0,
+0,0x5400,0x20785bb0,0,0,0,0,0,0,0,0,0,0x15d6000c,0,0x207900b0,0,
+0,0,0x3dd20040,0x15d9000c,0x15dc000c,0,0x15e0004c,0x15e3000c,0,0x900,0,0,0,0,0,0,
+0,0x207a00b0,0x207b00b0,0,0,0,0,0,0,0,0,0,0,0,0x3dd30040,0x3dd40040,
+0,0,0x15e7000c,0x15ea000c,0x15ed000c,0x900,0,0,0,0,0,0,0,0,0,0x207d00b0,
+0,0,0,0,0,0,0,0,0,0,0x207e09b0,0,0,0,0,0x207f00b0,
+0,0,0,0,0,0,0,0,0,0x3dd50040,0x15f0000c,0,0x15f5004c,0x15f8000c,0x15fd000c,0x208000b0,
+0,0,0,0,0,0x3dd60040,0x1600000c,0,0,0,0,0,0,0,0x208100b0,0,
+0,0,0,0,0,0,0,0x700,0,0x900,0,0,0,0,0,0,
+0,0x3dd70040,0x1603000c,0x3dd80040,0x1606000c,0x3dd90040,0x1609000c,0x3dda0040,0x160c000c,0x3ddb0040,0x160f000c,0,0,0x3ddc0040,0x1612000c,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0x700,0x208200b0,0,0,0,0,0x3ddd0040,0x1615000c,0x3dde0040,0x1618000c,0x3ddf0040,0x3de00040,
+0x161b000c,0x161e000c,0x3de10040,0x1621000c,0x900,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0x1624000c,0x1628000c,0x162c000c,0x1630000c,0x1634000c,0x1638000c,0x163c000c,0x1640000c,0x1644000c,0x1649000c,0x164e000c,0x1652000c,0x1656000c,0x165a000c,0x165e000c,0x1662000c,
+0x1666000c,0x166a000c,0x166e000c,0x1672000c,0x1676000c,0x167b000c,0x1680000c,0x1685000c,0x168a000c,0x168e000c,0x1692000c,0x1696000c,0x169a000c,0x169f000c,0x16a4000c,0x16a8000c,
+0x16ac000c,0x16b0000c,0x16b4000c,0x16b8000c,0x16bc000c,0x16c0000c,0x16c4000c,0x16c8000c,0x16cc000c,0x16d0000c,0x16d4000c,0x16d8000c,0x16dc000c,0x16e0000c,0x16e4000c,0x16e9000c,
+0x16ee000c,0x16f2000c,0x16f6000c,0x16fa000c,0x16fe000c,0x1702000c,0x1707004c,0x170c004c,0x1710000c,0x1715000c,0x171a000c,0x171e000c,0x1722000c,0x1726000c,0x172a000c,0x172e000c,
+0x1732000c,0x1736000c,0x173a000c,0x173e000c,0x1742000c,0x1746000c,0x174a000c,0x174e000c,0x1752000c,0x1756000c,0x175a000c,0x175e000c,0x1762000c,0x1767000c,0x176c000c,0x1771000c,
+0x1776000c,0x177b000c,0x1780000c,0x1785000c,0x178a000c,0x178e000c,0x1792000c,0x1796000c,0x179a000c,0x179e000c,0x17a3004c,0x17a8004c,0x17ac000c,0x17b1000c,0x17b6000c,0x17ba000c,
+0x17be000c,0x17c2000c,0x17c7004c,0x17cc004c,0x17d0000c,0x17d5000c,0x17da000c,0x17df000c,0x17e4000c,0x17e9000c,0x17ee000c,0x17f2000c,0x17f6000c,0x17fa000c,0x17fe000c,0x1802000c,
+0x1806000c,0x180a000c,0x180e000c,0x1812000c,0x1816000c,0x181a000c,0x181e000c,0x1822000c,0x1826000c,0x182b000c,0x1830000c,0x1835000c,0x183a000c,0x183e000c,0x1842000c,0x1846000c,
+0x184a000c,0x184e000c,0x1852000c,0x1856000c,0x185a000c,0x185e000c,0x1862000c,0x1866000c,0x186a000c,0x186e000c,0x1872000c,0x1876000c,0x187a000c,0x187e000c,0x1882000c,0x1886000c,
+0x188a000c,0x188e000c,0x1892000c,0x1896000c,0x189a000c,0x189e000c,0x18a2000c,0x18a6000c,0x18aa000c,0x18ae000c,0x21f6000a,0x18b2000e,0,0,0,0,
+0x18ba004c,0x18bf004c,0x18c3000c,0x18c7000c,0x18cb000c,0x18d0000c,0x18d5000c,0x18da000c,0x18df000c,0x18e4000c,0x18e9000c,0x18ee000c,0x18f3000c,0x18f8000c,0x18fd000c,0x1902000c,
+0x1907000c,0x190c000c,0x1911000c,0x1916000c,0x191b000c,0x1920000c,0x1925000c,0x192a000c,0x1930004c,0x1935004c,0x1939000c,0x193d000c,0x1941000c,0x1945000c,0x1949000c,0x194e000c,
+0x1953000c,0x1958000c,0x195d000c,0x1962000c,0x1967000c,0x196c000c,0x1971000c,0x1976000c,0x197b000c,0x197f000c,0x1983000c,0x1987000c,0x198c004c,0x1991004c,0x1995000c,0x1999000c,
+0x199d000c,0x19a2000c,0x19a7000c,0x19ac000c,0x19b1000c,0x19b6000c,0x19bb000c,0x19c0000c,0x19c5000c,0x19ca000c,0x19cf000c,0x19d4000c,0x19d9000c,0x19de000c,0x19e3000c,0x19e8000c,
+0x19ed000c,0x19f2000c,0x19f7000c,0x19fc000c,0x1a01000c,0x1a05000c,0x1a09000c,0x1a0d000c,0x1a11000c,0x1a16000c,0x1a1b000c,0x1a20000c,0x1a25000c,0x1a2a000c,0x1a2f000c,0x1a34000c,
+0x1a39000c,0x1a3e000c,0x1a43000c,0x1a47000c,0x1a4b000c,0x1a4f000c,0x1a53000c,0x1a57000c,0x1a5b000c,0x1a5f000c,0,0,0,0,0,0,
+0x1a64004c,0x1a69004c,0x1a6e004c,0x1a74004c,0x1a7a004c,0x1a80004c,0x1a86004c,0x1a8c004c,0x1a92004c,0x1a97004c,0x1a9c004c,0x1aa2004c,0x1aa8004c,0x1aae004c,0x1ab4004c,0x1aba004c,
+0x1ac0004c,0x1ac5004c,0x1ac9000c,0x1ace000c,0x1ad3000c,0x1ad8000c,0,0,0x1ade004c,0x1ae3004c,0x1ae7000c,0x1aec000c,0x1af1000c,0x1af6000c,0,0,
+0x1afc004c,0x1b01004c,0x1b06004c,0x1b0c004c,0x1b12004c,0x1b18004c,0x1b1e004c,0x1b24004c,0x1b2a004c,0x1b2f004c,0x1b34004c,0x1b3a004c,0x1b40004c,0x1b46004c,0x1b4c004c,0x1b52004c,
+0x1b58004c,0x1b5d004c,0x1b61000c,0x1b66000c,0x1b6b000c,0x1b70000c,0x1b75000c,0x1b7a000c,0x1b80004c,0x1b85004c,0x1b89000c,0x1b8e000c,0x1b93000c,0x1b98000c,0x1b9d000c,0x1ba2000c,
+0x1ba8004c,0x1bad004c,0x1bb1000c,0x1bb6000c,0x1bbb000c,0x1bc0000c,0,0,0x1bc6004c,0x1bcb004c,0x1bcf000c,0x1bd4000c,0x1bd9000c,0x1bde000c,0,0,
+0x1be4004c,0x1be9004c,0x1bed000c,0x1bf2000c,0x1bf7000c,0x1bfc000c,0x1c01000c,0x1c06000c,0,0x1c0c004c,0,0x1c10000c,0,0x1c15000c,0,0x1c1a000c,
+0x1c9a000c,0x1c9f000c,0x1ca4000c,0x1caa000c,0x1cb0000c,0x1cb6000c,0x1cbc000c,0x1cc2000c,0x1cc8000c,0x1ccd000c,0x1cd2000c,0x1cd8000c,0x1cde000c,0x1ce4000c,0x1cea000c,0x1cf0000c,
+0x1cf6000c,0x1cfb000c,0x1d00000c,0x1d06000c,0x1d0c000c,0x1d12000c,0x1d18000c,0x1d1e000c,0x1d24000c,0x1d29000c,0x1d2e000c,0x1d34000c,0x1d3a000c,0x1d40000c,0x1d46000c,0x1d4c000c,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0x3df00040,0,0x3df10040,0,0x3df20040,0,0,0,0,0,0x1eb6000c,0x1eba000c,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0x1ebe000c,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0x1ec2000c,0x1ec6000c,0x1eca000c,
+0x3df30040,0,0x3df50040,0,0x3df40040,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0x3df60040,0x1ece000c,0,0,0,0x3df70040,0x1ed2000c,0,0x3df80040,0x1ed6000c,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0x3df90040,0x1eda000c,0x3dfa0040,0x1ede000c,0,0,0,0,0,0x235a000a,0x235d000a,0,0x2361000a,
+0x2364000a,0,0,0,0,0,0,0,0,0,0,0,0x3dfb0040,0,0,0,
+0,0x1ee2000c,0,0x3dfc0040,0x1ee6000c,0x3dfd0040,0,0x1eea000c,0x3dfe0040,0x1eee000c,0,0,0,0x3e010040,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0x1ef2000c,0x3e000040,0x1ef6000c,0,0x3e040040,0x3e050040,0,0,0,0,0,0,0,0x1efa000c,0x1efe000c,0x1f02000c,
+0x1f06000c,0x1f0a000c,0x3e060040,0x3e070040,0x1f0e000c,0x1f12000c,0x3e080040,0x3e090040,0x1f16000c,0x1f1a000c,0x3e0a0040,0x3e0b0040,0x3e140040,0x3e150040,0,0,
+0x1f1e000c,0x1f22000c,0x3e0c0040,0x3e0d0040,0x1f26000c,0x1f2a000c,0x3e0e0040,0x3e0f0040,0x1f2e000c,0x1f32000c,0,0,0,0,0,0,
+0,0x3e160040,0x3e170040,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0x3e100040,0,0,0,0,0,0x3e110040,0x3e120040,0,0x3e130040,0x1f36000c,0x1f3a000c,0x1f3e000c,0x1f42000c,
+0,0,0x3e180040,0x3e190040,0x3e1a0040,0x3e1b0040,0,0,0,0,0,0,0,0,0,0,
+0x1f46000c,0x1f4a000c,0x1f4e000c,0x1f52000c,0,0,0,0,0,0,0x1f56000c,0x1f5a000c,0x1f5e000c,0x1f62000c,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0x3e300040,0,0,0,0,0x3e1c0040,0x1f66000c,0x3e1d0040,0x1f6a000c,0x3e1e0040,0x1f6e000c,0x3e1f0040,0x1f72000c,0x3e200040,
+0x1f76000c,0x3e210040,0x1f7a000c,0x3e220040,0x1f7e000c,0x3e230040,0x1f82000c,0x3e240040,0x1f86000c,0x3e250040,0x1f8a000c,0x3e260040,0x1f8e000c,0x3e270040,0x1f92000c,0,
+0x3e280040,0x1f96000c,0x3e290040,0x1f9a000c,0x3e2a0040,0x1f9e000c,0,0,0,0,0,0x3e2b0040,0x1fa2000c,0x1fa6000c,0x3e2c0040,0x1faa000c,
+0x1fae000c,0x3e2d0040,0x1fb2000c,0x1fb6000c,0x3e2e0040,0x1fba000c,0x1fbe000c,0x3e2f0040,0x1fc2000c,0x1fc6000c,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0x1fca000c,0,0,0,0,0x208308b0,0x208408b0,0x26db000a,0x26df000a,0x3e310040,0x1fce000c,0x26e3000a,0,0,0,0,
+0,0,0x3e460040,0,0,0,0,0x3e320040,0x1fd2000c,0x3e330040,0x1fd6000c,0x3e340040,0x1fda000c,0x3e350040,0x1fde000c,0x3e360040,
+0x1fe2000c,0x3e370040,0x1fe6000c,0x3e380040,0x1fea000c,0x3e390040,0x1fee000c,0x3e3a0040,0x1ff2000c,0x3e3b0040,0x1ff6000c,0x3e3c0040,0x1ffa000c,0x3e3d0040,0x1ffe000c,0,
+0x3e3e0040,0x2002000c,0x3e3f0040,0x2006000c,0x3e400040,0x200a000c,0,0,0,0,0,0x3e410040,0x200e000c,0x2012000c,0x3e420040,0x2016000c,
+0x201a000c,0x3e430040,0x201e000c,0x2022000c,0x3e440040,0x2026000c,0x202a000c,0x3e450040,0x202e000c,0x2032000c,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0x3e470040,0x3e480040,0x3e490040,0x3e4a0040,0,
+0x2036000c,0,0,0x203a000c,0x203e000c,0x2042000c,0x2046000c,0,0,0x3e4b0040,0x204a000c,0x26e6000a,0x204fe6b0,0x2050e6b0,0x2051e6b0,0x2052e6b0,
+0x2053e6b0,0xe600,0x2054e6b0,0x2055e6b0,0x2056e6b0,0x2057e6b0,0x2058e6b0,0x2059e6b0,0x205ae6b0,0xe600,0xe600,0x205be6b0,0xe600,0x205ce6b0,0xe600,0x205de6b0,
+0x205ee6b0,0xe800,0xdc00,0xdc00,0xdc00,0xdc00,0xe800,0x205fd8b0,0xdc00,0xdc00,0xdc00,0xdc00,0xdc00,0xca00,0xca00,0x2060dcb0,
+0x2061dcb0,0x2062dcb0,0x2063dcb0,0x2064cab0,0x2065cab0,0xdc00,0xdc00,0xdc00,0xdc00,0x2066dcb0,0x2067dcb0,0xdc00,0x2068dcb0,0x2069dcb0,0xdc00,0xdc00,
+0x100,0x100,0x100,0x100,0x206a01b0,0xdc00,0xdc00,0xdc00,0xdc00,0xe600,0xe600,0xe600,0,0,0,0,
+0,0,0,0,0x3dc30040,0,0x3dc40040,0x1b00,0x1c00,0x1d00,0x1e00,0x1f00,0x2000,0x2100,0x2200,0x206de6b0,
+0x206ee6b0,0x206fdcb0,0xdc00,0xe600,0xe600,0xe600,0xe600,0xe600,0xdc00,0xe600,0xe600,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0x700,0,0x207100b0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0x700,0,0x207300b0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0x207600b0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0x207c00b0,0,0,0xfff200b0,0xfff200b0,0xfff200b0,
+0xfff200b0,0xfff200b0,0xfff200b0,0xfff200b0,0xfff200b0,0xfff200b0,0xfff200b0,0xfff200b0,0xfff200b0,0xfff200b0,0xfff200b0,0xfff200b0,0xfff200b0,0xfff200b0,0xfff200b0,0xfff200b0,
+0xfff200b0,0xfff200b0,0,0,0,0,0,0,0,0,0,0,0xfff300b0,0xfff300b0,0xfff300b0,0xfff300b0,
+0xfff300b0,0xfff300b0,0xfff300b0,0xfff300b0,0xfff300b0,0xfff300b0,0xfff300b0,0xfff300b0,0xfff300b0,0xfff300b0,0xfff300b0,0xfff300b0,0xfff300b0,0xfff300b0,0xfff300b0,0xfff300b0,
+0xfff300b0,0xfff300b0,0xfff300b0,0xfff300b0,0xfff300b0,0xfff300b0,0xfff300b0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0x2084000a,0,0,0,0,0,0,0,0x2087004a,0,0x208b000a,0,
+0,0,0,0x208d000a,0,0,0x2091000a,0x2093000a,0x2095000a,0x2099000a,0,0,0x209b000a,0x209f000a,0x20a1000a,0,
+0x20a3000a,0x20a7000a,0x20ab000a,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0x20eb000a,0x20ed000a,0x20ef000a,0x20f1000a,0x20f3000a,0x20f5000a,0x20f7000a,0x20f9000a,0x20fb000a,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0x20fd000a,0x2101000a,0x2105000a,0x2109000a,0x210d000a,0x2111000a,0,0,
+0x2115000a,0x2117000a,0x2119000a,0x211b000a,0x211d000a,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0x2133000a,0,0,0,0,0,0,0,0,0,0xdc00,0xe600,0xe600,
+0xe600,0xe600,0xdc00,0xe600,0xe600,0xe600,0xde00,0xdc00,0xe600,0xe600,0xe600,0xe600,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0x2300,0,0,0,
+0,0x2136000a,0x2139000a,0x213c000a,0x213f000a,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0x2142000a,0,0,0,0,
+0x6700,0x6700,0x900,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0x2145000a,0,0,0,0,0x7600,0x7600,0,0,
+0,0,0,0,0,0,0,0,0x7a00,0x7a00,0x7a00,0x7a00,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0x2148000a,0x214b000a,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0x214e000a,0,0,0,
+0,0,0,0,0,0,0,0,0xdc00,0xdc00,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0x215a000a,0,0,0,0x2194000a,0x2196000a,0x2198000a,0x219a000a,
+0x219c000a,0x219e000a,0x21a0000a,0x21a2000a,0x21a4000a,0x21a6000a,0x21a8000a,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0x21aa000a,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0x21ac000a,0x21ae000a,0x21b0000a,0x21b2000a,0x21b4000a,0x21b6000a,0x21b8000a,0x21ba000a,0x21bc000a,0x21be000a,0x21c0000a,0x21c2000a,0x21c4000a,
+0x21c6000a,0x21c8000a,0x21ca000a,0x21cc000a,0x21ce000a,0x21d0000a,0x21d2000a,0x21d4000a,0x21d6000a,0x21d8000a,0x21da000a,0x21dc000a,0x21de000a,0x21e0000a,0x21e2000a,0x21e4000a,
+0x21e6000a,0x21e8000a,0x21ea000a,0x21ec000a,0x21ee000a,0x21f0000a,0x21f2000a,0x21f4000a,0,0,0,0,0x2223000a,0x2225000a,0x2228000a,0,
+0,0,0,0,0,0,0,0x222c000a,0,0,0,0x222e000a,0x2231000a,0,0x2235000a,0x2238000a,
+0,0,0,0,0x223c000a,0,0x223f000a,0,0,0,0,0,0,0,0,0x2243000a,
+0x2246000a,0x2249000a,0,0,0,0,0,0,0,0,0,0,0,0,0,0x224c000a,
+0,0,0,0,0,0,0,0x2251000a,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0x2253000a,0x2255000a,0,0,0x2257000a,0x2259000a,0x225b000a,0x225d000a,
+0x225f000a,0x2261000a,0x2263000a,0x2265000a,0x2267000a,0x2269000a,0x226b000a,0x226d000a,0x226f000a,0x2271000a,0x2273000a,0x2275000a,0x2277000a,0x2279000a,0x227b000a,0x227d000a,
+0x227f000a,0x2281000a,0x2283000a,0x2285000a,0x2287000a,0x2289000a,0x228b000a,0,0x228d000a,0x228f000a,0x2291000a,0x2293000a,0x2295000a,0,0,0,
+0,0,0,0,0,0,0,0,0x22fe000a,0x2300000a,0x2303000a,0x2307000a,0x230a000a,0x230c000a,0x230f000a,0x2313000a,
+0x2318000a,0x231b000a,0x231d000a,0x2320000a,0x2324000a,0x2326000a,0x2328000a,0x232a000a,0x232c000a,0x232e000a,0x2331000a,0x2335000a,0x2338000a,0x233a000a,0x233d000a,0x2341000a,
+0x2346000a,0x2349000a,0x234b000a,0x234e000a,0x2352000a,0x2354000a,0x2356000a,0x2358000a,0x2368000a,0x236a000a,0x236c000a,0x236e000a,0x2370000a,0x2372000a,0x2374000a,0x2376000a,
+0x2378000a,0x237a000a,0x237d000a,0x2380000a,0x2383000a,0x2386000a,0x2389000a,0x238c000a,0x238f000a,0x2392000a,0x2395000a,0x2398000a,0x239b000a,0x239f000a,0x23a3000a,0x23a7000a,
+0x23ab000a,0x23af000a,0x23b3000a,0x23b7000a,0x23bb000a,0x23bf000a,0x23c4000a,0x23c9000a,0x23ce000a,0x23d3000a,0x23d8000a,0x23dd000a,0x23e2000a,0x23e7000a,0x23ec000a,0x23f1000a,
+0x23f6000a,0x23f9000a,0x23fc000a,0x23ff000a,0x2402000a,0x2405000a,0x2408000a,0x240b000a,0x240e000a,0x2411000a,0x2415000a,0x2419000a,0x241d000a,0x2421000a,0x2425000a,0x2429000a,
+0x242d000a,0x2431000a,0x2435000a,0x2439000a,0x243d000a,0x2441000a,0x2445000a,0x2449000a,0x244d000a,0x2451000a,0x2455000a,0x2459000a,0x245d000a,0x2461000a,0x2465000a,0x2469000a,
+0x246d000a,0x2471000a,0x2475000a,0x2479000a,0x247d000a,0x2481000a,0x2485000a,0x2489000a,0x248d000a,0x2491000a,0x2495000a,0x2499000a,0x249d000a,0x24a1000a,0x24a5000a,0x24a7000a,
+0x24a9000a,0x24ab000a,0x24ad000a,0x24af000a,0x24b1000a,0x24b3000a,0x24b5000a,0x24b7000a,0x24b9000a,0x24bb000a,0x24bd000a,0x24bf000a,0x24c1000a,0x24c3000a,0x24c5000a,0x24c7000a,
+0x24c9000a,0x24cb000a,0x24cd000a,0x24cf000a,0x24d1000a,0x24d3000a,0x24d5000a,0x24d7000a,0x24d9000a,0x24db000a,0x24dd000a,0x24df000a,0x24e1000a,0x24e3000a,0x24e5000a,0x24e7000a,
+0x24e9000a,0x24eb000a,0x24ed000a,0x24ef000a,0x24f1000a,0x24f3000a,0x24f5000a,0x24f7000a,0x24f9000a,0x24fb000a,0x24fd000a,0x24ff000a,0x2501000a,0x2503000a,0x2505000a,0x2507000a,
+0x2509000a,0x250b000a,0x250d000a,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0x250f000a,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0x2514000a,0x2518000a,0x251b000a,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0x251f000a,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0x2521000a,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0x2523000a,0,0,0,0,0,0,0,0,
+0,0,0,0,0x2525000a,0x2527000a,0x2529000a,0x252b000a,0x252d000a,0x252f000a,0x2531000a,0x2533000a,0x2535000a,0x2537000a,0x2539000a,0x253b000a,
+0x253d000a,0x253f000a,0x2541000a,0x2543000a,0x2545000a,0x2547000a,0x2549000a,0x254b000a,0x254d000a,0x254f000a,0x2551000a,0x2553000a,0x2555000a,0x2557000a,0x2559000a,0x255b000a,
+0x255d000a,0x255f000a,0x2561000a,0x2563000a,0x2565000a,0x2567000a,0x2569000a,0x256b000a,0x256d000a,0x256f000a,0x2571000a,0x2573000a,0x2575000a,0x2577000a,0x2579000a,0x257b000a,
+0x257d000a,0x257f000a,0x2581000a,0x2583000a,0x2585000a,0x2587000a,0x2589000a,0x258b000a,0x258d000a,0x258f000a,0x2591000a,0x2593000a,0x2595000a,0x2597000a,0x2599000a,0x259b000a,
+0x259d000a,0x259f000a,0x25a1000a,0x25a3000a,0x25a5000a,0x25a7000a,0x25a9000a,0x25ab000a,0x25ad000a,0x25af000a,0x25b1000a,0x25b3000a,0x25b5000a,0x25b7000a,0x25b9000a,0x25bb000a,
+0x25bd000a,0x25bf000a,0x25c1000a,0x25c3000a,0x25c5000a,0x25c7000a,0x25c9000a,0x25cb000a,0x25cd000a,0x25cf000a,0x25d1000a,0x25d3000a,0x25d5000a,0x25d7000a,0x25d9000a,0x25db000a,
+0x25dd000a,0x25df000a,0x25e1000a,0x25e3000a,0x25e5000a,0x25e7000a,0x25e9000a,0x25eb000a,0x25ed000a,0x25ef000a,0x25f1000a,0x25f3000a,0x25f5000a,0x25f7000a,0x25f9000a,0x25fb000a,
+0x25fd000a,0x25ff000a,0x2601000a,0x2603000a,0x2605000a,0x2607000a,0x2609000a,0x260b000a,0x260d000a,0x260f000a,0x2611000a,0x2613000a,0x2615000a,0x2617000a,0x2619000a,0x261b000a,
+0x261d000a,0x261f000a,0x2621000a,0x2623000a,0x2625000a,0x2627000a,0x2629000a,0x262b000a,0x262d000a,0x262f000a,0x2631000a,0x2633000a,0x2635000a,0x2637000a,0x2639000a,0x263b000a,
+0x263d000a,0x263f000a,0x2641000a,0x2643000a,0x2645000a,0x2647000a,0x2649000a,0x264b000a,0x264d000a,0x264f000a,0x2651000a,0x2653000a,0x2655000a,0x2657000a,0x2659000a,0x265b000a,
+0x265d000a,0x265f000a,0x2661000a,0x2663000a,0x2665000a,0x2667000a,0x2669000a,0x266b000a,0x266d000a,0x266f000a,0x2671000a,0x2673000a,0x2675000a,0x2677000a,0x2679000a,0x267b000a,
+0x267d000a,0x267f000a,0x2681000a,0x2683000a,0x2685000a,0x2687000a,0x2689000a,0x268b000a,0x268d000a,0x268f000a,0x2691000a,0x2693000a,0x2695000a,0x2697000a,0x2699000a,0x269b000a,
+0x269d000a,0x269f000a,0x26a1000a,0x26a3000a,0x26a5000a,0x26a7000a,0x26a9000a,0x26ab000a,0x26ad000a,0x26af000a,0x26b1000a,0x26b3000a,0x26b5000a,0x26b7000a,0x26b9000a,0x26bb000a,
+0x26bd000a,0x26bf000a,0x26c1000a,0x26c3000a,0x26c5000a,0x26c7000a,0x26c9000a,0x26cb000a,0x26cd000a,0x26cf000a,0,0,0,0,0,0,
+0,0,0,0,0x26d1000a,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0xda00,0xe400,0xe800,0xde00,0xe000,0xe000,0,0,0,0,
+0,0,0x26d3000a,0,0x26d5000a,0x26d7000a,0x26d9000a,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0x26e9000a,0x26eb000a,0x26ed000a,0x26ef000a,0x26f1000a,0x26f3000a,0x26f5000a,
+0x26f7000a,0x26f9000a,0x26fb000a,0x26fd000a,0x26ff000a,0x2701000a,0x2703000a,0x2705000a,0x2707000a,0x2709000a,0x270b000a,0x270d000a,0x270f000a,0x2711000a,0x2713000a,0x2715000a,
+0x2717000a,0x2719000a,0x271b000a,0x271d000a,0x271f000a,0x2721000a,0x2723000a,0x2725000a,0x2727000a,0x2729000a,0x272b000a,0x272d000a,0x272f000a,0x2731000a,0x2733000a,0x2735000a,
+0x2737000a,0x2739000a,0x273b000a,0x273d000a,0x273f000a,0x2741000a,0x2743000a,0x2745000a,0x2747000a,0x2749000a,0x274b000a,0x274d000a,0x274f000a,0x2751000a,0x2753000a,0x2755000a,
+0x2757000a,0x2759000a,0x275b000a,0x275d000a,0x275f000a,0x2761000a,0x2763000a,0x2765000a,0x2767000a,0x2769000a,0x276b000a,0x276d000a,0x276f000a,0x2771000a,0x2773000a,0x2775000a,
+0x2777000a,0x2779000a,0x277b000a,0x277d000a,0x277f000a,0x2781000a,0x2783000a,0x2785000a,0x2787000a,0x2789000a,0x278b000a,0x278d000a,0x278f000a,0x2791000a,0x2793000a,0x2795000a,
+0x2797000a,0x2799000a,0x279b000a,0x279d000a,0x279f000a,0x27a1000a,0x27a3000a,0,0,0,0x27a5000a,0x27a7000a,0x27a9000a,0x27ab000a,0x27ad000a,0x27af000a,
+0x27b1000a,0x27b3000a,0x27b5000a,0x27b7000a,0x27b9000a,0x27bb000a,0x27bd000a,0x27bf000a,0x27c1000a,0x27c5000a,0x27c9000a,0x27cd000a,0x27d1000a,0x27d5000a,0x27d9000a,0x27dd000a,
+0x27e1000a,0x27e5000a,0x27e9000a,0x27ed000a,0x27f1000a,0x27f5000a,0x27f9000a,0x27fe000a,0x2803000a,0x2808000a,0x280d000a,0x2812000a,0x2817000a,0x281c000a,0x2821000a,0x2826000a,
+0x282b000a,0x2830000a,0x2835000a,0x283a000a,0x283f000a,0x2844000a,0x284c000a,0,0x2853000a,0x2857000a,0x285b000a,0x285f000a,0x2863000a,0x2867000a,0x286b000a,0x286f000a,
+0x2873000a,0x2877000a,0x287b000a,0x287f000a,0x2883000a,0x2887000a,0x288b000a,0x288f000a,0x2893000a,0x2897000a,0x289b000a,0x289f000a,0x28a3000a,0x28a7000a,0x28ab000a,0x28af000a,
+0x28b3000a,0x28b7000a,0x28bb000a,0x28bf000a,0x28c3000a,0x28c7000a,0x28cb000a,0x28cf000a,0x2910000a,0x2912000a,0x2914000a,0x2916000a,0x2918000a,0x291a000a,0x291c000a,0x291e000a,
+0x2920000a,0x2922000a,0x2924000a,0x2926000a,0x2928000a,0x292a000a,0x292c000a,0x292f000a,0x2932000a,0x2935000a,0x2938000a,0x293b000a,0x293e000a,0x2941000a,0x2944000a,0x2947000a,
+0x294a000a,0x294d000a,0x2950000a,0x2953000a,0x2956000a,0x295c000a,0x2961000a,0,0x2964000a,0x2966000a,0x2968000a,0x296a000a,0x296c000a,0x296e000a,0x2970000a,0x2972000a,
+0x2974000a,0x2976000a,0x2978000a,0x297a000a,0x297c000a,0x297e000a,0x2980000a,0x2982000a,0x2984000a,0x2986000a,0x2988000a,0x298a000a,0x298c000a,0x298e000a,0x2990000a,0x2992000a,
+0x2994000a,0x2996000a,0x2998000a,0x299a000a,0x299c000a,0x299e000a,0x29a0000a,0x29a2000a,0x29a4000a,0x29a6000a,0x29a8000a,0x29aa000a,0x29ac000a,0x29ae000a,0x29b0000a,0x29b2000a,
+0x29b4000a,0x29b6000a,0x29b8000a,0x29ba000a,0x29bc000a,0x29be000a,0x29c0000a,0x29c2000a,0x29c4000a,0x29c6000a,0x29c9000a,0x29cc000a,0x29cf000a,0x29d2000a,0x29d5000a,0x29d8000a,
+0x29db000a,0x29de000a,0x29e1000a,0x29e4000a,0x29e7000a,0x29ea000a,0x29ed000a,0x29f0000a,0x2a3e000a,0x2a40000a,0x2a42000a,0x2a44000a,0x2a46000a,0x2a48000a,0x2a4a000a,0x2a4c000a,
+0x2a4e000a,0x2a50000a,0x2a52000a,0x2a54000a,0x2a56000a,0x2a58000a,0x2a5a000a,0x2a5c000a,0x2a5e000a,0x2a60000a,0x2a62000a,0x2a64000a,0x2a66000a,0x2a68000a,0x2a6a000a,0x2a6c000a,
+0x2a6e000a,0x2a70000a,0x2a72000a,0x2a74000a,0x2a76000a,0x2a78000a,0x2a7a000a,0,0x2a7c000a,0x2a82000a,0x2a87000a,0x2a8d000a,0x2a91000a,0x2a98000a,0x2a9c000a,0x2aa0000a,
+0x2aa8000a,0x2aad000a,0x2ab1000a,0x2ab5000a,0x2ab9000a,0x2abe000a,0x2ac3000a,0x2ac8000a,0x2acd000a,0x2ad3000a,0x2ad8000a,0x2add000a,0x2ae4000a,0x2ae7000a,0x2aee000a,0x2af5000a,
+0x2afb000a,0x2b00000a,0x2b07000a,0x2b0e000a,0x2b13000a,0x2b17000a,0x2b1b000a,0x2b21000a,0x2b26000a,0x2b2c000a,0x2b33000a,0x2b37000a,0x2b3b000a,0x2b40000a,0x2b44000a,0x2b48000a,
+0x2b4b000a,0x2b4e000a,0x2b52000a,0x2b56000a,0x2b5d000a,0x2b62000a,0x2b68000a,0x2b6f000a,0x2b74000a,0x2b78000a,0x2b7c000a,0x2b84000a,0x2b89000a,0x2b90000a,0x2b94000a,0x2b9a000a,
+0x2b9e000a,0x2ba3000a,0x2ba7000a,0x2bac000a,0x2bb3000a,0x2bb8000a,0x2bbe000a,0x2bc3000a,0x2bc6000a,0x2bcd000a,0x2bd1000a,0x2bd5000a,0x2bda000a,0x2bde000a,0x2be2000a,0x2be6000a,
+0x2bec000a,0x2bf1000a,0x2bf4000a,0x2bfb000a,0x2c00000a,0x2c06000a,0x2c0b000a,0x2c11000a,0x2c15000a,0x2c19000a,0x2c1e000a,0x2c21000a,0x2c26000a,0x2c2c000a,0x2c2f000a,0x2c36000a,
+0x2c3a000a,0x2c3d000a,0x2c40000a,0x2c43000a,0x2c46000a,0x2c49000a,0x2c4c000a,0x2c4f000a,0x2d62000a,0x2d65000a,0x2d68000a,0x2d6b000a,0x2d6e000a,0x2d71000a,0x2d74000a,0x2d77000a,
+0x2d7a000a,0x2d7d000a,0x2d81000a,0x2d85000a,0x2d89000a,0x2d8d000a,0x2d91000a,0x2d95000a,0x2d99000a,0x2d9d000a,0x2da1000a,0x2da5000a,0x2da9000a,0x2dad000a,0x2db1000a,0x2db5000a,
+0x2db9000a,0x2dbd000a,0x2dc1000a,0x2dc5000a,0x2dc9000a,0x2dcd000a,0x2dd1000a,0x2dd5000a,0x2e36000a,0x2e38000a,0x2e3a000a,0x2e3c000a,0x2e3e000a,0x2e40000a,0x2e42000a,0x2e44000a,
+0x2e46000a,0x2e48000a,0x2e4a000a,0x2e4c000a,0x2e4e000a,0x2e50000a,0x2e52000a,0x2e54000a,0x2e56000a,0x2e58000a,0x2e5a000a,0x2e5c000a,0x2e5e000a,0x2e60000a,0x2e62000a,0x2e64000a,
+0x2e66000a,0x2e68000a,0x2e6a000a,0x2e6c000a,0x2e6e000a,0x2e70000a,0x2e72000a,0x2e74000a,0x2e76000a,0x2e78000a,0x2e7a000a,0x2e7c000a,0x2e7e000a,0x2e80000a,0x2e82000a,0x2e84000a,
+0x2e86000a,0x2e88000a,0x2e8a000a,0x2e8c000a,0x2e8e000a,0x2e90000a,0x2e92000a,0x2e94000a,0x2e96000a,0x2e98000a,0x2e9a000a,0x2e9c000a,0x2e9e000a,0x2ea0000a,0x2ea2000a,0x2ea4000a,
+0x2ea6000a,0x2ea8000a,0x2eaa000a,0x2eac000a,0x2eae000a,0x2eb0000a,0x2eb2000a,0x2eb4000a,0x2eb6000a,0x2eb8000a,0x2eba000a,0x2ebc000a,0x2ebe000a,0x2ec2000a,0x2ec6000a,0x2ec8000a,
+0x2eca000a,0x2ecc000a,0x2ece000a,0x2ed0000a,0x2ed2000a,0x2ed4000a,0x2ed6000a,0x2ed8000a,0x2eda000a,0x2ede000a,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0x2ee2000a,
+0x2ee4000a,0x2ee6000a,0x2ee8000a,0x2eea000a,0x2eec000a,0x2eee000a,0x2ef0000a,0x2ef2000a,0x2ef4000a,0x2ef6000a,0x2ef9000a,0x2efb000a,0x2efd000a,0x2eff000a,0x2f01000a,0x2f03000a,
+0x2f05000a,0x2f07000a,0x2f09000a,0x2f0b000a,0x2f0d000a,0x2f0f000a,0x2f11000a,0x2f15000a,0x2f19000a,0x2f1d000a,0x2f21000a,0x2f25000a,0x2f29000a,0x2f2d000a,0x2f31000a,0x2f35000a,
+0x2f39000a,0x2f3d000a,0x2f41000a,0x2f45000a,0x2f49000a,0x2f4d000a,0x2f51000a,0x2f55000a,0x2f59000a,0x2f5b000a,0x2f5d000a,0x2f5f000a,0x2f61000a,0x2f65000a,0x2f69000a,0x2f6d000a,
+0x2f71000a,0x2f75000a,0x2f78000a,0x2f7b000a,0x2f7e000a,0x2f81000a,0x2f84000a,0x2f87000a,0x2f8a000a,0x2f8d000a,0x2f90000a,0x2f93000a,0x2f96000a,0x2f99000a,0x2f9c000a,0x2f9f000a,
+0x2fa2000a,0x2fa5000a,0x2fa8000a,0x2fab000a,0x2fae000a,0x2fb1000a,0x2fb4000a,0x2fb7000a,0x2fba000a,0x2fbd000a,0x2fc0000a,0x2fc3000a,0x2fc6000a,0x2fc9000a,0x2fcc000a,0x2fcf000a,
+0x2fd2000a,0x2fd5000a,0x2fd8000a,0x2fdb000a,0x2fde000a,0x2fe1000a,0x2fe4000a,0x2fe7000a,0x2fea000a,0x2fed000a,0x2ff0000a,0x2ff3000a,0x2ff6000a,0x2ff9000a,0x2ffc000a,0x2fff000a,
+0x3002000a,0x3005000a,0x3008000a,0x300b000a,0x300e000a,0x3011000a,0x3014000a,0x3017000a,0x301a000a,0x301d000a,0x3020000a,0x3023000a,0x3026000a,0x3029000a,0x302c000a,0x302f000a,
+0x3032000a,0x3035000a,0x3038000a,0x303b000a,0x303e000a,0x3041000a,0x3044000a,0x3047000a,0x304a000a,0x304d000a,0x3050000a,0x3053000a,0x3056000a,0x3059000a,0x305c000a,0x305f000a,
+0x3062000a,0x3065000a,0x3068000a,0x306b000a,0x306e000a,0x3071000a,0x3074000a,0x3077000a,0x307b000a,0x307f000a,0x3083000a,0x3088000a,0x308d000a,0x3092000a,0x3097000a,0x309c000a,
+0x30a1000a,0x30a5000a,0x30a9000a,0x30ad000a,0x30b1000a,0x30b5000a,0x30b9000a,0x30bc000a,0x30bf000a,0x30c2000a,0x30c5000a,0x30c8000a,0x30cb000a,0x30ce000a,0x30d1000a,0x30d4000a,
+0x30d7000a,0x30da000a,0x30dd000a,0x30e0000a,0x30e3000a,0x30e6000a,0x30e9000a,0x30ec000a,0x30ef000a,0x30f2000a,0x30f5000a,0x30f8000a,0x30fb000a,0x30fe000a,0x3101000a,0x3104000a,
+0x3107000a,0x310a000a,0x310d000a,0x3110000a,0x3113000a,0x3116000a,0x3119000a,0x311c000a,0x311f000a,0x3122000a,0x3125000a,0x3128000a,0x312b000a,0x312f000a,0x3132000a,0x3135000a,
+0x3138000a,0x313b000a,0x313e000a,0x3141000a,0x3145000a,0x3149000a,0x314d000a,0x3151000a,0x3155000a,0x3158000a,0x315b000a,0x315e000a,0x3161000a,0x3164000a,0x3167000a,0x316a000a,
+0x316d000a,0x3170000a,0x3173000a,0x3176000a,0x3179000a,0x317c000a,0x317f000a,0x3182000a,0x3185000a,0x3188000a,0x318b000a,0x318e000a,0x3191000a,0x3194000a,0x3197000a,0x319a000a,
+0x319d000a,0x31a0000a,0x31a3000a,0x31a6000a,0x31a9000a,0x31ac000a,0x31af000a,0x31b2000a,0x31b5000a,0x31b8000a,0x31bb000a,0x31be000a,0x31c1000a,0x31c4000a,0x31c7000a,0x31ca000a,
+0x31cd000a,0x31d0000a,0x31d3000a,0x31d6000a,0x31d9000a,0x31dc000a,0x31df000a,0x31e2000a,0x31e5000a,0x31e8000a,0x31eb000a,0x31ee000a,0x31f1000a,0x31f4000a,0x31f7000a,0x31fa000a,
+0x31fd000a,0x3200000a,0x3203000a,0x3206000a,0x3209000a,0x320c000a,0x3210000a,0x3213000a,0x3216000a,0x3219000a,0x321c000a,0x321f000a,0x3223000a,0x3227000a,0x322a000a,0x322d000a,
+0x3230000a,0x3233000a,0x3236000a,0x3239000a,0x323c000a,0x323f000a,0x3242000a,0x3245000a,0x3248000a,0x324b000a,0x324e000a,0x3251000a,0x3254000a,0x3257000a,0x325a000a,0x325f000a,
+0x3264000a,0x3269000a,0x326c000a,0x326f000a,0x3272000a,0x3275000a,0x3278000a,0x327b000a,0x327e000a,0x3281000a,0x3284000a,0x3287000a,0x328a000a,0x328d000a,0x3290000a,0x3293000a,
+0x3296000a,0x3299000a,0x329c000a,0x329f000a,0x32a2000a,0x32a5000a,0x32a8000a,0x32ab000a,0x32ae000a,0x32b1000a,0x32b4000a,0x32b7000a,0x32ba000a,0x32bd000a,0x32c0000a,0x32c3000a,
+0x32c6000a,0x32c9000a,0x32cc000a,0x32cf000a,0x32d2000a,0x32d5000a,0x32d8000a,0x32db000a,0x32de000a,0x32e1000a,0x32e4000a,0x32e7000a,0x32ea000a,0x32ed000a,0x32f0000a,0x32f3000a,
+0x32f6000a,0x32f9000a,0x32fc000a,0x32ff000a,0x3302000a,0x3305000a,0x3308000a,0x330b000a,0x330e000a,0x3311000a,0x3314000a,0x3317000a,0x331a000a,0x331d000a,0x3320000a,0x3323000a,
+0x3326000a,0x3329000a,0x332c000a,0x332f000a,0x3332000a,0x3335000a,0x3338000a,0x333b000a,0x333e000a,0x3342000a,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0x3346000a,0x334a000a,0x334e000a,0x3352000a,
+0x3356000a,0x335a000a,0x335e000a,0x3362000a,0x3366000a,0x336a000a,0x336e000a,0x3372000a,0x3376000a,0x337a000a,0x337e000a,0x3382000a,0x3386000a,0x338a000a,0x338e000a,0x3392000a,
+0x3396000a,0x339a000a,0x339e000a,0x33a2000a,0x33a6000a,0x33aa000a,0x33ae000a,0x33b2000a,0x33b6000a,0x33ba000a,0x33be000a,0x33c2000a,0x33c6000a,0x33ca000a,0x33ce000a,0x33d2000a,
+0x33d6000a,0x33da000a,0x33de000a,0x33e2000a,0x33e6000a,0x33ea000a,0x33ee000a,0x33f2000a,0x33f6000a,0x33fa000a,0x33fe000a,0x3402000a,0x3406000a,0x340a000a,0x340e000a,0x3412000a,
+0x3416000a,0x341a000a,0x341e000a,0x3422000a,0x3426000a,0x342a000a,0x342e000a,0x3432000a,0x3436000a,0x343a000a,0x343e000a,0x3442000a,0,0,0x3446000a,0x344a000a,
+0x344e000a,0x3452000a,0x3456000a,0x345a000a,0x345e000a,0x3462000a,0x3466000a,0x346a000a,0x346e000a,0x3472000a,0x3476000a,0x347a000a,0x347e000a,0x3482000a,0x3486000a,0x348a000a,
+0x348e000a,0x3492000a,0x3496000a,0x349a000a,0x349e000a,0x34a2000a,0x34a6000a,0x34aa000a,0x34ae000a,0x34b2000a,0x34b6000a,0x34ba000a,0x34be000a,0x34c2000a,0x34c6000a,0x34ca000a,
+0x34ce000a,0x34d2000a,0x34d6000a,0x34da000a,0x34de000a,0x34e2000a,0x34e6000a,0x34ea000a,0x34ee000a,0x34f2000a,0x34f6000a,0x34fa000a,0x34fe000a,0x3502000a,0x3506000a,0x350a000a,
+0x350e000a,0x3512000a,0x3516000a,0x351a000a,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0x351e000a,0x3522000a,0x3526000a,0x352b000a,
+0x3530000a,0x3535000a,0x353a000a,0x353f000a,0x3544000a,0x3549000a,0x354d000a,0x3560000a,0x3569000a,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0x356e000a,0x3570000a,0x3572000a,0x3574000a,
+0x3576000a,0x3578000a,0x357a000a,0x357c000a,0x357e000a,0x3580000a,0,0,0,0,0,0,0xe600,0xe600,0xe600,0xe600,
+0,0,0,0,0,0,0,0,0,0,0,0,0x3584000a,0x3587000a,0x3589000a,0x358b000a,
+0x358d000a,0x358f000a,0x3591000a,0x3593000a,0x3595000a,0x3597000a,0x3599000a,0x359b000a,0x359d000a,0x359f000a,0x35a1000a,0x35a3000a,0x35a5000a,0x35a7000a,0x35a9000a,0x35ab000a,
+0x35ad000a,0,0,0x35af000a,0x35b1000a,0x35b3000a,0x35b7000a,0x35bb000a,0x35bf000a,0x35c3000a,0x35c5000a,0x35c7000a,0x35c9000a,0x35cb000a,0x35cd000a,0,
+0x35cf000a,0x35d1000a,0x35d3000a,0x35d5000a,0x35d7000a,0x35d9000a,0x35db000a,0x35dd000a,0x35df000a,0x35e1000a,0x35e3000a,0x35e5000a,0x35e7000a,0x35e9000a,0x35eb000a,0x35ed000a,
+0x35ef000a,0x35f1000a,0x35f3000a,0,0x35f5000a,0x35f7000a,0x35f9000a,0x35fb000a,0,0,0,0,0x35fd000a,0x3601000a,0x3605000a,0,
+0x3609000a,0,0x360d000a,0x3611000a,0x3615000a,0x3619000a,0x361d000a,0x3621000a,0x3625000a,0x3629000a,0x362d000a,0x3631000a,0x3635000a,0x3637000a,0x363b000a,0x363f000a,
+0x3643000a,0x3647000a,0x364b000a,0x364f000a,0x3653000a,0x3657000a,0x365b000a,0x365f000a,0x3663000a,0x3667000a,0x3669000a,0x366b000a,0x366d000a,0x366f000a,0x3671000a,0x3673000a,
+0x3675000a,0x3677000a,0x3679000a,0x367b000a,0x367d000a,0x367f000a,0x3681000a,0x3683000a,0x3685000a,0x3687000a,0x3689000a,0x368b000a,0x368d000a,0x368f000a,0x3691000a,0x3693000a,
+0x3695000a,0x3697000a,0x3699000a,0x369b000a,0x369d000a,0x369f000a,0x36a1000a,0x36a3000a,0x36a5000a,0x36a7000a,0x36a9000a,0x36ab000a,0x36ad000a,0x36af000a,0x36b1000a,0x36b3000a,
+0x36b5000a,0x36b7000a,0x36b9000a,0x36bb000a,0x36bd000a,0x36bf000a,0x36c1000a,0x36c3000a,0x36c5000a,0x36c7000a,0x36c9000a,0x36cb000a,0x36cd000a,0x36cf000a,0x36d1000a,0x36d3000a,
+0x36d5000a,0x36d7000a,0x36d9000a,0x36db000a,0x36dd000a,0x36df000a,0x36e1000a,0x36e3000a,0x36e5000a,0x36e7000a,0x36e9000a,0x36eb000a,0x36ed000a,0x36ef000a,0x36f1000a,0x36f3000a,
+0x36f5000a,0x36f7000a,0x36f9000a,0x36fb000a,0x36fd000a,0x36ff000a,0x3701000a,0x3703000a,0x3705000a,0x3707000a,0x3709000a,0x370b000a,0x370d000a,0x370f000a,0x3711000a,0x3713000a,
+0x3715000a,0x3717000a,0x3719000a,0x371b000a,0x371d000a,0x371f000a,0x3721000a,0x3723000a,0x3725000a,0x3727000a,0x3729000a,0x372b000a,0x372d000a,0x372f000a,0x3731000a,0x3733000a,
+0x3735000a,0x3737000a,0x373c000a,0x3741000a,0x3746000a,0x374b000a,0x3750000a,0x3755000a,0x3758000a,0,0,0,0,0x375b000a,0x375d000a,0x375f000a,
+0x3761000a,0x3763000a,0x3765000a,0x3767000a,0x3769000a,0x376b000a,0x376d000a,0x376f000a,0x3771000a,0x3773000a,0x3775000a,0x3777000a,0x3779000a,0x377b000a,0x377d000a,0x377f000a,
+0x3781000a,0x3783000a,0x3785000a,0x3787000a,0x3789000a,0x378b000a,0x378d000a,0x378f000a,0x3791000a,0x3793000a,0x3795000a,0x3797000a,0x3799000a,0x379b000a,0x379d000a,0x379f000a,
+0x37a1000a,0x37a3000a,0x37a5000a,0x37a7000a,0x37a9000a,0x37ab000a,0x37ad000a,0x37af000a,0x37b1000a,0x37b3000a,0x37b5000a,0x37b7000a,0x37b9000a,0x37bb000a,0x37bd000a,0x37bf000a,
+0x37c1000a,0x37c3000a,0x37c5000a,0x37c7000a,0x37c9000a,0x37cb000a,0x37cd000a,0x37cf000a,0x37d1000a,0x37d3000a,0x37d5000a,0x37d7000a,0x37d9000a,0x37db000a,0x37dd000a,0x37df000a,
+0x37e1000a,0x37e3000a,0x37e5000a,0x37e7000a,0x37e9000a,0x37eb000a,0x37ed000a,0x37ef000a,0x37f1000a,0x37f3000a,0x37f5000a,0x37f7000a,0x37f9000a,0x37fb000a,0x37fd000a,0x37ff000a,
+0x3801000a,0x3803000a,0x3805000a,0x3807000a,0x3809000a,0x380b000a,0x380d000a,0x380f000a,0x3811000a,0x3813000a,0x3815000a,0x3817000a,0x3819000a,0x381b000a,0x381d000a,0x381f000a,
+0x3821000a,0x3823000a,0x3825000a,0x3827000a,0x3829000a,0x382b000a,0x382d000a,0x382f000a,0x3831000a,0x3833000a,0x3835000a,0x3837000a,0x3839000a,0x383b000a,0x383d000a,0x383f000a,
+0x3841000a,0x3843000a,0x3845000a,0x3847000a,0x3849000a,0x384b000a,0x384d000a,0x384f000a,0x3851000a,0x3853000a,0x3855000a,0x3857000a,0x3859000a,0x385b000a,0x385d000a,0x385f000a,
+0x3861000a,0x3863000a,0x3865000a,0x3867000a,0x3869000a,0x386b000a,0x386d000a,0x386f000a,0x3871000a,0x3873000a,0x3875000a,0x3877000a,0x3879000a,0x387b000a,0x387d000a,0x387f000a,
+0x3881000a,0x3883000a,0x3885000a,0x3887000a,0x3889000a,0x388b000a,0x388d000a,0x388f000a,0x3891000a,0x3893000a,0x3895000a,0x3898000a,0x389b000a,0x389d000a,0x389f000a,0x38a1000a,
+0x38a3000a,0x38a5000a,0x38a7000a,0x38a9000a,0x38ab000a,0x38ad000a,0x38af000a,0x38b1000a,0x38b3000a,0x38b5000a,0x38b7000a,0x38b9000a,0x38bb000a,0x38bd000a,0x38bf000a,0x38c1000a,
+0x38c3000a,0x38c5000a,0x38c7000a,0x38c9000a,0x38cb000a,0x38cd000a,0x38cf000a,0x38d1000a,0x38d3000a,0x38d5000a,0x38d7000a,0,0,0,0x38d9000a,0x38db000a,
+0x38dd000a,0x38df000a,0x38e1000a,0x38e3000a,0,0,0x38e5000a,0x38e7000a,0x38e9000a,0x38eb000a,0x38ed000a,0x38ef000a,0,0,0x38f1000a,0x38f3000a,
+0x38f5000a,0x38f7000a,0x38f9000a,0x38fb000a,0,0,0x38fd000a,0x38ff000a,0x3901000a,0,0,0,0x3903000a,0x3905000a,0x3907000a,0x3909000a,
+0x390d000a,0x390f000a,0x3911000a,0,0x3913000a,0x3915000a,0x3917000a,0x3919000a,0x391b000a,0x391d000a,0x391f000a,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0x3d27000a,0x3d29000a,0x3d2b000a,0x3d2d000a,
+0x3d2f000a,0x3d31000a,0x3d33000a,0x3d35000a,0x3d37000a,0x3d39000a,0x3d3b000a,0x3d3d000a,0x3d3f000a,0x3d41000a,0x3d43000a,0x3d45000a,0x3d47000a,0x3d49000a,0x3d4b000a,0x3d4d000a,
+0x3d4f000a,0x3d51000a,0x3d53000a,0x3d55000a,0x3d57000a,0x3d59000a,0x3d5b000a,0x3d5d000a,0x3d5f000a,0x3d61000a,0x3d63000a,0x3d65000a,0,0x3d680040,0x3de20040,0x3d690040,
+0x3d780040,0x3d6a0040,0x3de40040,0x3d7a0040,0x3d7c0040,0x3d6b0040,0x3d7e0040,0x3d800040,0x3d820040,0x3de60040,0x3d6c0040,0x3d6d0040,0x3de80040,0,0x3d840040,0x3d860040,
+0x3d880040,0x3d6e0040,0x3dea0040,0x3d8a0040,0x3dec0040,0x3d6f0040,0x3d8c0040,0,0,0,0,0,0,0x3d700040,0x3de30040,0x3d710040,
+0x3d790040,0x3d720040,0x3de50040,0x3d7b0040,0x3d7d0040,0x3d730040,0x3d7f0040,0x3d810040,0x3d830040,0x3de70040,0x3d740040,0x3d750040,0x3de90040,0,0x3d850040,0x3d870040,
+0x3d890040,0x3d760040,0x3deb0040,0x3d8b0040,0x3ded0040,0x3d770040,0x3d8d0040,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0x3d910040,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0xe600,0xe600,0xe600,0xe600,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0xe600,0xe600,0xdc00,0xdc00,0xdc00,0xdc00,0xdc00,0xdc00,
+0xe600,0xe600,0xdc00,0xe600,0xe600,0xde00,0xe400,0xe600,0xa00,0xb00,0xc00,0xd00,0xe00,0xf00,0x1000,0x1100,
+0x1200,0x1300,0x1300,0x1400,0x1500,0x1600,0,0x1700,0,0x1800,0x1900,0,0xe600,0xdc00,0,0x1200,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0xe600,0xe600,0xe600,0xe600,0xe600,0xe600,0,0,
+0,0,0,0,0,0,0,0,0xe600,0xe600,0xe600,0xdc00,0xe600,0,0,0xe600,
+0xe600,0,0xdc00,0xe600,0xe600,0xdc00,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0x2400,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0xe600,0xdc00,0xe600,0xe600,
+0xdc00,0xe600,0xe600,0xdc00,0xdc00,0xdc00,0xe600,0xdc00,0xdc00,0xe600,0xdc00,0xe600,0xe600,0xe600,0xdc00,0xe600,
+0xdc00,0xe600,0xdc00,0xe600,0xdc00,0xe600,0xe600,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xe600,
+0xe600,0xe600,0xe600,0xe600,0xe600,0xe600,0xdc00,0xe600,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0x700,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0x900,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0x700,0,0,0x3dd10040,0,0,0,0,0,0,0,0,
+0x6b00,0x6b00,0x6b00,0x6b00,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0xdc00,0,0xdc00,0,0xd800,0,0,
+0,0,0,0,0,0,0xdc00,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0xe600,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0x900,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0x900,0,0,0,0,0,0,0,0,0,0,0xe600,0,0,
+0,0,0,0,0,0,0,0,0,0xe400,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0xde00,0xe600,0xdc00,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xe600,
+0xdc00,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xe600,
+0xdc00,0xe600,0xe600,0xe600,0xe600,0xe600,0xe600,0xe600,0,0,0,0,0,0,0,0,
+0,0,0,0,0xe600,0xe600,0xdc00,0xe600,0xe600,0xe600,0xe600,0xe600,0xe600,0xe600,0xdc00,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xe600,0xdc00,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0xe600,0xe600,0x100,0x100,0xe600,0xe600,0xe600,0xe600,0x100,0x100,0x100,0xe600,0xe600,0,0,0,
+0,0xe600,0,0,0,0x100,0x100,0xe600,0xdc00,0xe600,0x100,0x100,0xdc00,0xdc00,0xdc00,0xdc00,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0x3e020040,0x3dff0040,0x3e030040,0,
+0,0,0,0,0,0,0x900,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+#ifndef U_DARWIN
+0,0xdc00,0,0xe600,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0xe600,0x100,0xdc00,0,
+0,0,0,0x900,0xdc00,0xdc00,0xdc00,0,0,0xe600,0xe600,0xe600,0xe600,0xe600,0xdc00,0xdc00,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0xe600,0xe600,0xe600,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0xfff10040,0xfff10040,0xfff10040,0xfff10040,0xfff10040,0xfff10040,0xfff10040,0xfff10040,0xfff10040,0xfff10040,0xfff10040,0xfff10040,
+0xfff10040,0xfff10040,0xfff10040,0xfff10040,0xfff10040,0xfff10040,0xfff10040,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0xfff0000c,0xfff0000c,0xfff0000c,0xfff0000c,0xfff0000c,0xfff0000c,0xfff0000c,0xfff0000c,0xfff0000c,0xfff0000c,0xfff0000c,0xfff0000c,
+#else /* U_DARWIN */
+0,0,0x6b00,0x6b00,0x6b00,0x6b00,0x6b00,0x6b00,0x6b00,0x6b00,0x6b00,0x6b00,0x6b00,0x6b00,0,0,
+0,0,0,0,0,0,0,0x1200,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0xdc00,0,0xe600,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0xe600,0x100,0xdc00,0,0,0,0,0x900,0xdc00,0xdc00,0xdc00,0,0,0xe600,0xe600,0xe600,
+0xe600,0xe600,0xdc00,0xdc00,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0xe600,0xe600,0xe600,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0xfff10040,0xfff10040,0xfff10040,0xfff10040,0xfff10040,0xfff10040,0xfff10040,0xfff10040,
+0xfff10040,0xfff10040,0xfff10040,0xfff10040,0xfff10040,0xfff10040,0xfff10040,0xfff10040,0xfff10040,0xfff10040,0xfff10040,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0xfff0000c,0xfff0000c,0xfff0000c,0xfff0000c,0xfff0000c,0xfff0000c,0xfff0000c,0xfff0000c,
+#endif /* U_DARWIN */
+0xfff0000c,0xfff0000c,0xfff0000c,0xfff0000c,0xfff0000c,0xfff0000c,0xfff0000c,0xfff0000c,0xfff0000c,0xfff0000c,0xfff0000c,0xfff0000c,0xfff0000c,0xfff0000c,0xfff0000c,0xfff0000c,
+#ifndef U_DARWIN
+0xfff0000c,0xfff0000c,0xfff0000c,0xfff0000c,0,0,0,0,0,0,0,0,0,0,0,0,
+#else /* U_DARWIN */
+0xfff0000c,0xfff0000c,0xfff0000c,0xfff0000c,0xfff0000c,0xfff0000c,0xfff0000c,0xfff0000c,0,0,0,0,0,0,0,0,
+#endif /* U_DARWIN */
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+#ifndef U_DARWIN
+0,0,0xfc01ff00,0,0,0,0,0,0,0,0,0,0,0,0,0,
+#else /* U_DARWIN */
+0,0,0,0,0,0,0xfc01ff00,0,0,0,0,0,0,0,0,0,
+#endif /* U_DARWIN */
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+#ifndef U_DARWIN
+0xfc02ff0f,0xfc03000a,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+#else /* U_DARWIN */
+0,0,0,0,0xfc02ff0f,0xfc03000a,0,0,0,0,0,0,0,0,0,0,
+#endif /* U_DARWIN */
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+#ifndef U_DARWIN
+0,0,0xfc04000f,0
+#else /* U_DARWIN */
+0,0,0,0,0,0,0xfc04000f,0
+#endif /* U_DARWIN */
+};
+
+static const UTrie normTrie={
+ normTrie_index,
+ normTrie_data32,
+ getFoldingNormOffset,
+ 2208,
+#ifndef U_DARWIN
+ 9236,
+#else /* U_DARWIN */
+ 9272,
+#endif /* U_DARWIN */
+ 0,
+ FALSE
+};
+
+static const uint16_t extraData[15947]={
+0x13b,0xff02,0x20,0x3b9,0xff01,0x3c5,0xff01,0x3cd,0xff01,0x3cb,0xff01,0x3c3,0xff01,0x61,0xff01,0xe6,
+0xff01,0x62,0xff01,0x64,0xff01,0x65,0xff01,0x1dd,0xff01,0x67,0xff01,0x68,0xff01,0x69,0xff01,0x6a,
+0xff01,0x6b,0xff01,0x6c,0xff01,0x6d,0xff01,0x6e,0xff01,0x6f,0xff01,0x223,0xff01,0x70,0xff01,0x72,
+0xff01,0x74,0xff01,0x75,0xff01,0x77,0xff02,0x72,0x73,0xff01,0x63,0xff02,0xb0,0x63,0xff01,0x25b,
+0xff02,0xb0,0x66,0xff02,0x6e,0x6f,0xff01,0x71,0xff02,0x73,0x6d,0xff03,0x74,0x65,0x6c,0xff02,
+0x74,0x6d,0xff01,0x7a,0xff03,0x66,0x61,0x78,0xff01,0x3b3,0xff01,0x3c0,0xff03,0x70,0x74,0x65,
+0xff02,0x68,0x67,0xff02,0x65,0x76,0xff03,0x6c,0x74,0x64,0xff03,0x68,0x70,0x61,0xff02,0x61,
+0x75,0xff02,0x6f,0x76,0xff02,0x69,0x75,0xff02,0x70,0x61,0xff02,0x6e,0x61,0xff02,0x3bc,0x61,
+0xff02,0x6d,0x61,0xff02,0x6b,0x61,0xff02,0x6b,0x62,0xff02,0x6d,0x62,0xff02,0x67,0x62,0xff02,
+0x70,0x66,0xff02,0x6e,0x66,0xff02,0x3bc,0x66,0xff02,0x68,0x7a,0xff03,0x6b,0x68,0x7a,0xff03,
+0x6d,0x68,0x7a,0xff03,0x67,0x68,0x7a,0xff03,0x74,0x68,0x7a,0xff02,0x70,0x61,0xff03,0x6b,
+0x70,0x61,0xff03,0x6d,0x70,0x61,0xff03,0x67,0x70,0x61,0xff02,0x70,0x76,0xff02,0x6e,0x76,
+0xff02,0x3bc,0x76,0xff02,0x6d,0x76,0xff02,0x6b,0x76,0xff02,0x6d,0x76,0xff02,0x70,0x77,0xff02,
+0x6e,0x77,0xff02,0x3bc,0x77,0xff02,0x6d,0x77,0xff02,0x6b,0x77,0xff02,0x6d,0x77,0xff02,0x6b,
+0x3c9,0xff02,0x6d,0x3c9,0xff02,0x62,0x71,0xff04,0x63,0x2215,0x6b,0x67,0xff03,0x63,0x6f,0x2e,
+0xff02,0x64,0x62,0xff02,0x67,0x79,0xff02,0x68,0x70,0xff02,0x6b,0x6b,0xff02,0x6b,0x6d,0xff02,
+0x70,0x68,0xff03,0x70,0x70,0x6d,0xff02,0x70,0x72,0xff02,0x73,0x76,0xff02,0x77,0x62,0xff03,
+0x76,0x2215,0x6d,0xff03,0x61,0x2215,0x6d,0xff01,0x3b1,0xff01,0x3b2,0xff01,0x3b4,0xff01,0x3b5,0xff01,
+0x3b6,0xff01,0x3b7,0xff01,0x3b8,0xff01,0x3ba,0xff01,0x3bb,0xff01,0x3bd,0xff01,0x3be,0xff01,0x3bf,0xff01,
+0x3c1,0xff01,0x3c4,0xff01,0x3c6,0xff01,0x3c7,0xff01,0x3c8,0xff01,0x3dd,0x8200,0xf0,0x20,0x345,0x3b2,
+0x100,0x3a5,0x8282,0xe6,0x3d2,0x301,0xe6,0x3a5,0x301,0x8282,0xe6,0x3d2,0x308,0xe6,0x3a5,0x308,
+0x100,0x3c2,0x100,0x3a3,0x100,0x41,0x100,0xc6,0x100,0x42,0x100,0x44,0x100,0x45,0x100,0x18e,
+0x100,0x47,0x100,0x48,0x100,0x49,0x100,0x4a,0x100,0x4b,0x100,0x4c,0x100,0x4d,0x100,0x4e,
+0x100,0x4f,0x100,0x222,0x100,0x50,0x100,0x52,0x100,0x54,0x100,0x55,0x100,0x57,0x200,0x52,
+0x73,0x100,0x43,0x200,0xb0,0x43,0x100,0x190,0x200,0xb0,0x46,0x100,0x48,0x100,0x48,0x100,
+0x48,0x100,0x49,0x100,0x49,0x100,0x4c,0x100,0x4e,0x200,0x4e,0x6f,0x100,0x50,0x100,0x51,
+0x100,0x52,0x100,0x52,0x100,0x52,0x200,0x53,0x4d,0x300,0x54,0x45,0x4c,0x200,0x54,0x4d,
+0x100,0x5a,0x100,0x5a,0x100,0x42,0x100,0x43,0x100,0x45,0x100,0x46,0x100,0x4d,0x300,0x46,
+0x41,0x58,0x100,0x393,0x100,0x3a0,0x100,0x44,0x300,0x50,0x54,0x45,0x200,0x48,0x67,0x200,
+0x65,0x56,0x300,0x4c,0x54,0x44,0x300,0x68,0x50,0x61,0x200,0x41,0x55,0x200,0x6f,0x56,
+0x200,0x49,0x55,0x200,0x70,0x41,0x200,0x6e,0x41,0x200,0x3bc,0x41,0x200,0x6d,0x41,0x200,
+0x6b,0x41,0x200,0x4b,0x42,0x200,0x4d,0x42,0x200,0x47,0x42,0x200,0x70,0x46,0x200,0x6e,
+0x46,0x200,0x3bc,0x46,0x200,0x48,0x7a,0x300,0x6b,0x48,0x7a,0x300,0x4d,0x48,0x7a,0x300,
+0x47,0x48,0x7a,0x300,0x54,0x48,0x7a,0x200,0x50,0x61,0x300,0x6b,0x50,0x61,0x300,0x4d,
+0x50,0x61,0x300,0x47,0x50,0x61,0x200,0x70,0x56,0x200,0x6e,0x56,0x200,0x3bc,0x56,0x200,
+0x6d,0x56,0x200,0x6b,0x56,0x200,0x4d,0x56,0x200,0x70,0x57,0x200,0x6e,0x57,0x200,0x3bc,
+0x57,0x200,0x6d,0x57,0x200,0x6b,0x57,0x200,0x4d,0x57,0x200,0x6b,0x3a9,0x200,0x4d,0x3a9,
+0x200,0x42,0x71,0x400,0x43,0x2215,0x6b,0x67,0x300,0x43,0x6f,0x2e,0x200,0x64,0x42,0x200,
+0x47,0x79,0x200,0x48,0x50,0x200,0x4b,0x4b,0x200,0x4b,0x4d,0x200,0x50,0x48,0x300,0x50,
+0x50,0x4d,0x200,0x50,0x52,0x200,0x53,0x76,0x200,0x57,0x62,0x300,0x56,0x2215,0x6d,0x300,
+0x41,0x2215,0x6d,0x100,0x41,0x100,0x42,0x100,0x43,0x100,0x44,0x100,0x45,0x100,0x46,0x100,
+0x47,0x100,0x48,0x100,0x49,0x100,0x4a,0x100,0x4b,0x100,0x4c,0x100,0x4d,0x100,0x4e,0x100,
+0x4f,0x100,0x50,0x100,0x51,0x100,0x52,0x100,0x53,0x100,0x54,0x100,0x55,0x100,0x56,0x100,
+0x57,0x100,0x58,0x100,0x59,0x100,0x5a,0x100,0x41,0x100,0x42,0x100,0x43,0x100,0x44,0x100,
+0x45,0x100,0x46,0x100,0x47,0x100,0x48,0x100,0x49,0x100,0x4a,0x100,0x4b,0x100,0x4c,0x100,
+0x4d,0x100,0x4e,0x100,0x4f,0x100,0x50,0x100,0x51,0x100,0x52,0x100,0x53,0x100,0x54,0x100,
+0x55,0x100,0x56,0x100,0x57,0x100,0x58,0x100,0x59,0x100,0x5a,0x100,0x41,0x100,0x42,0x100,
+0x43,0x100,0x44,0x100,0x45,0x100,0x46,0x100,0x47,0x100,0x48,0x100,0x49,0x100,0x4a,0x100,
+0x4b,0x100,0x4c,0x100,0x4d,0x100,0x4e,0x100,0x4f,0x100,0x50,0x100,0x51,0x100,0x52,0x100,
+0x53,0x100,0x54,0x100,0x55,0x100,0x56,0x100,0x57,0x100,0x58,0x100,0x59,0x100,0x5a,0x100,
+0x41,0x100,0x43,0x100,0x44,0x100,0x47,0x100,0x4a,0x100,0x4b,0x100,0x4e,0x100,0x4f,0x100,
+0x50,0x100,0x51,0x100,0x53,0x100,0x54,0x100,0x55,0x100,0x56,0x100,0x57,0x100,0x58,0x100,
+0x59,0x100,0x5a,0x100,0x41,0x100,0x42,0x100,0x43,0x100,0x44,0x100,0x45,0x100,0x46,0x100,
+0x47,0x100,0x48,0x100,0x49,0x100,0x4a,0x100,0x4b,0x100,0x4c,0x100,0x4d,0x100,0x4e,0x100,
+0x4f,0x100,0x50,0x100,0x51,0x100,0x52,0x100,0x53,0x100,0x54,0x100,0x55,0x100,0x56,0x100,
+0x57,0x100,0x58,0x100,0x59,0x100,0x5a,0x100,0x41,0x100,0x42,0x100,0x44,0x100,0x45,0x100,
+0x46,0x100,0x47,0x100,0x4a,0x100,0x4b,0x100,0x4c,0x100,0x4d,0x100,0x4e,0x100,0x4f,0x100,
+0x50,0x100,0x51,0x100,0x53,0x100,0x54,0x100,0x55,0x100,0x56,0x100,0x57,0x100,0x58,0x100,
+0x59,0x100,0x41,0x100,0x42,0x100,0x44,0x100,0x45,0x100,0x46,0x100,0x47,0x100,0x49,0x100,
+0x4a,0x100,0x4b,0x100,0x4c,0x100,0x4d,0x100,0x4f,0x100,0x53,0x100,0x54,0x100,0x55,0x100,
+0x56,0x100,0x57,0x100,0x58,0x100,0x59,0x100,0x41,0x100,0x42,0x100,0x43,0x100,0x44,0x100,
+0x45,0x100,0x46,0x100,0x47,0x100,0x48,0x100,0x49,0x100,0x4a,0x100,0x4b,0x100,0x4c,0x100,
+0x4d,0x100,0x4e,0x100,0x4f,0x100,0x50,0x100,0x51,0x100,0x52,0x100,0x53,0x100,0x54,0x100,
+0x55,0x100,0x56,0x100,0x57,0x100,0x58,0x100,0x59,0x100,0x5a,0x100,0x41,0x100,0x42,0x100,
+0x43,0x100,0x44,0x100,0x45,0x100,0x46,0x100,0x47,0x100,0x48,0x100,0x49,0x100,0x4a,0x100,
+0x4b,0x100,0x4c,0x100,0x4d,0x100,0x4e,0x100,0x4f,0x100,0x50,0x100,0x51,0x100,0x52,0x100,
+0x53,0x100,0x54,0x100,0x55,0x100,0x56,0x100,0x57,0x100,0x58,0x100,0x59,0x100,0x5a,0x100,
+0x41,0x100,0x42,0x100,0x43,0x100,0x44,0x100,0x45,0x100,0x46,0x100,0x47,0x100,0x48,0x100,
+0x49,0x100,0x4a,0x100,0x4b,0x100,0x4c,0x100,0x4d,0x100,0x4e,0x100,0x4f,0x100,0x50,0x100,
+0x51,0x100,0x52,0x100,0x53,0x100,0x54,0x100,0x55,0x100,0x56,0x100,0x57,0x100,0x58,0x100,
+0x59,0x100,0x5a,0x100,0x41,0x100,0x42,0x100,0x43,0x100,0x44,0x100,0x45,0x100,0x46,0x100,
+0x47,0x100,0x48,0x100,0x49,0x100,0x4a,0x100,0x4b,0x100,0x4c,0x100,0x4d,0x100,0x4e,0x100,
+0x4f,0x100,0x50,0x100,0x51,0x100,0x52,0x100,0x53,0x100,0x54,0x100,0x55,0x100,0x56,0x100,
+0x57,0x100,0x58,0x100,0x59,0x100,0x5a,0x100,0x41,0x100,0x42,0x100,0x43,0x100,0x44,0x100,
+0x45,0x100,0x46,0x100,0x47,0x100,0x48,0x100,0x49,0x100,0x4a,0x100,0x4b,0x100,0x4c,0x100,
+0x4d,0x100,0x4e,0x100,0x4f,0x100,0x50,0x100,0x51,0x100,0x52,0x100,0x53,0x100,0x54,0x100,
+0x55,0x100,0x56,0x100,0x57,0x100,0x58,0x100,0x59,0x100,0x5a,0x100,0x41,0x100,0x42,0x100,
+0x43,0x100,0x44,0x100,0x45,0x100,0x46,0x100,0x47,0x100,0x48,0x100,0x49,0x100,0x4a,0x100,
+0x4b,0x100,0x4c,0x100,0x4d,0x100,0x4e,0x100,0x4f,0x100,0x50,0x100,0x51,0x100,0x52,0x100,
+0x53,0x100,0x54,0x100,0x55,0x100,0x56,0x100,0x57,0x100,0x58,0x100,0x59,0x100,0x5a,0x100,
+0x391,0x100,0x392,0x100,0x393,0x100,0x394,0x100,0x395,0x100,0x396,0x100,0x397,0x100,0x398,0x100,
+0x399,0x100,0x39a,0x100,0x39b,0x100,0x39c,0x100,0x39d,0x100,0x39e,0x100,0x39f,0x100,0x3a0,0x100,
+0x3a1,0x100,0x398,0x100,0x3a3,0x100,0x3a4,0x100,0x3a5,0x100,0x3a6,0x100,0x3a7,0x100,0x3a8,0x100,
+0x3a9,0x100,0x3c2,0x100,0x391,0x100,0x392,0x100,0x393,0x100,0x394,0x100,0x395,0x100,0x396,0x100,
+0x397,0x100,0x398,0x100,0x399,0x100,0x39a,0x100,0x39b,0x100,0x39c,0x100,0x39d,0x100,0x39e,0x100,
+0x39f,0x100,0x3a0,0x100,0x3a1,0x100,0x398,0x100,0x3a3,0x100,0x3a4,0x100,0x3a5,0x100,0x3a6,0x100,
+0x3a7,0x100,0x3a8,0x100,0x3a9,0x100,0x3c2,0x100,0x391,0x100,0x392,0x100,0x393,0x100,0x394,0x100,
+0x395,0x100,0x396,0x100,0x397,0x100,0x398,0x100,0x399,0x100,0x39a,0x100,0x39b,0x100,0x39c,0x100,
+0x39d,0x100,0x39e,0x100,0x39f,0x100,0x3a0,0x100,0x3a1,0x100,0x398,0x100,0x3a3,0x100,0x3a4,0x100,
+0x3a5,0x100,0x3a6,0x100,0x3a7,0x100,0x3a8,0x100,0x3a9,0x100,0x3c2,0x100,0x391,0x100,0x392,0x100,
+0x393,0x100,0x394,0x100,0x395,0x100,0x396,0x100,0x397,0x100,0x398,0x100,0x399,0x100,0x39a,0x100,
+0x39b,0x100,0x39c,0x100,0x39d,0x100,0x39e,0x100,0x39f,0x100,0x3a0,0x100,0x3a1,0x100,0x398,0x100,
+0x3a3,0x100,0x3a4,0x100,0x3a5,0x100,0x3a6,0x100,0x3a7,0x100,0x3a8,0x100,0x3a9,0x100,0x3c2,0x100,
+0x391,0x100,0x392,0x100,0x393,0x100,0x394,0x100,0x395,0x100,0x396,0x100,0x397,0x100,0x398,0x100,
+0x399,0x100,0x39a,0x100,0x39b,0x100,0x39c,0x100,0x39d,0x100,0x39e,0x100,0x39f,0x100,0x3a0,0x100,
+0x3a1,0x100,0x398,0x100,0x3a3,0x100,0x3a4,0x100,0x3a5,0x100,0x3a6,0x100,0x3a7,0x100,0x3a8,0x100,
+0x3a9,0x100,0x3c2,0x100,0x3dc,0x81,0xe6e6,0x300,0x81,0xe6e6,0x301,0x81,0xe6e6,0x313,0x82,0xe6e6,
+0x308,0x301,1,0x2b9,1,0x3b,1,0xb7,0x82,7,0x915,0x93c,0x82,7,0x916,0x93c,
+0x82,7,0x917,0x93c,0x82,7,0x91c,0x93c,0x82,7,0x921,0x93c,0x82,7,0x922,0x93c,
+0x82,7,0x92b,0x93c,0x82,7,0x92f,0x93c,0x82,7,0x9a1,0x9bc,0x82,7,0x9a2,0x9bc,
+0x82,7,0x9af,0x9bc,0x82,7,0xa32,0xa3c,0x82,7,0xa38,0xa3c,0x82,7,0xa16,0xa3c,
+0x82,7,0xa17,0xa3c,0x82,7,0xa1c,0xa3c,0x82,7,0xa2b,0xa3c,0x82,7,0xb21,0xb3c,
+0x82,7,0xb22,0xb3c,2,0xf42,0xfb7,2,0xf4c,0xfb7,2,0xf51,0xfb7,2,0xf56,0xfb7,
+2,0xf5b,0xfb7,2,0xf40,0xfb5,0x82,0x8182,0xf71,0xf72,0x82,0x8184,0xf71,0xf74,0x82,0x82,
+0xfb2,0xf80,0x82,0x82,0xfb3,0xf80,0x82,0x8182,0xf71,0xf80,2,0xf92,0xfb7,2,0xf9c,0xfb7,
+2,0xfa1,0xfb7,2,0xfa6,0xfb7,2,0xfab,0xfb7,2,0xf90,0xfb5,0x82,0xe6,0x3b1,0x301,
+0x82,0xe6,0x3b5,0x301,0x82,0xe6,0x3b7,0x301,0x82,0xe6,0x3b9,0x301,0x82,0xe6,0x3bf,0x301,
+0x82,0xe6,0x3c5,0x301,0x82,0xe6,0x3c9,0x301,0x82,0xe6,0x391,0x301,1,0x3b9,0x82,0xe6,
+0x395,0x301,0x82,0xe6,0x397,0x301,0x83,0xe6,0x3b9,0x308,0x301,0x82,0xe6,0x399,0x301,0x83,
+0xe6,0x3c5,0x308,0x301,0x82,0xe6,0x3a5,0x301,0x8382,0xe6,0xa8,0x301,0xe6,0x20,0x308,0x301,
+1,0x60,0x82,0xe6,0x39f,0x301,0x82,0xe6,0x3a9,0x301,0x8201,0xb4,0xe6,0x20,0x301,0x101,
+0x2002,0x20,0x101,0x2003,0x20,1,0x3a9,1,0x4b,0x82,0xe6,0x41,0x30a,1,0x3008,1,
+0x3009,0x82,1,0x2add,0x338,1,0x8c48,1,0x66f4,1,0x8eca,1,0x8cc8,1,0x6ed1,1,
+0x4e32,1,0x53e5,1,0x9f9c,1,0x9f9c,1,0x5951,1,0x91d1,1,0x5587,1,0x5948,1,
+0x61f6,1,0x7669,1,0x7f85,1,0x863f,1,0x87ba,1,0x88f8,1,0x908f,1,0x6a02,1,
+0x6d1b,1,0x70d9,1,0x73de,1,0x843d,1,0x916a,1,0x99f1,1,0x4e82,1,0x5375,1,
+0x6b04,1,0x721b,1,0x862d,1,0x9e1e,1,0x5d50,1,0x6feb,1,0x85cd,1,0x8964,1,
+0x62c9,1,0x81d8,1,0x881f,1,0x5eca,1,0x6717,1,0x6d6a,1,0x72fc,1,0x90ce,1,
+0x4f86,1,0x51b7,1,0x52de,1,0x64c4,1,0x6ad3,1,0x7210,1,0x76e7,1,0x8001,1,
+0x8606,1,0x865c,1,0x8def,1,0x9732,1,0x9b6f,1,0x9dfa,1,0x788c,1,0x797f,1,
+0x7da0,1,0x83c9,1,0x9304,1,0x9e7f,1,0x8ad6,1,0x58df,1,0x5f04,1,0x7c60,1,
+0x807e,1,0x7262,1,0x78ca,1,0x8cc2,1,0x96f7,1,0x58d8,1,0x5c62,1,0x6a13,1,
+0x6dda,1,0x6f0f,1,0x7d2f,1,0x7e37,1,0x964b,1,0x52d2,1,0x808b,1,0x51dc,1,
+0x51cc,1,0x7a1c,1,0x7dbe,1,0x83f1,1,0x9675,1,0x8b80,1,0x62cf,1,0x6a02,1,
+0x8afe,1,0x4e39,1,0x5be7,1,0x6012,1,0x7387,1,0x7570,1,0x5317,1,0x78fb,1,
+0x4fbf,1,0x5fa9,1,0x4e0d,1,0x6ccc,1,0x6578,1,0x7d22,1,0x53c3,1,0x585e,1,
+0x7701,1,0x8449,1,0x8aaa,1,0x6bba,1,0x8fb0,1,0x6c88,1,0x62fe,1,0x82e5,1,
+0x63a0,1,0x7565,1,0x4eae,1,0x5169,1,0x51c9,1,0x6881,1,0x7ce7,1,0x826f,1,
+0x8ad2,1,0x91cf,1,0x52f5,1,0x5442,1,0x5973,1,0x5eec,1,0x65c5,1,0x6ffe,1,
+0x792a,1,0x95ad,1,0x9a6a,1,0x9e97,1,0x9ece,1,0x529b,1,0x66c6,1,0x6b77,1,
+0x8f62,1,0x5e74,1,0x6190,1,0x6200,1,0x649a,1,0x6f23,1,0x7149,1,0x7489,1,
+0x79ca,1,0x7df4,1,0x806f,1,0x8f26,1,0x84ee,1,0x9023,1,0x934a,1,0x5217,1,
+0x52a3,1,0x54bd,1,0x70c8,1,0x88c2,1,0x8aaa,1,0x5ec9,1,0x5ff5,1,0x637b,1,
+0x6bae,1,0x7c3e,1,0x7375,1,0x4ee4,1,0x56f9,1,0x5be7,1,0x5dba,1,0x601c,1,
+0x73b2,1,0x7469,1,0x7f9a,1,0x8046,1,0x9234,1,0x96f6,1,0x9748,1,0x9818,1,
+0x4f8b,1,0x79ae,1,0x91b4,1,0x96b8,1,0x60e1,1,0x4e86,1,0x50da,1,0x5bee,1,
+0x5c3f,1,0x6599,1,0x6a02,1,0x71ce,1,0x7642,1,0x84fc,1,0x907c,1,0x9f8d,1,
+0x6688,1,0x962e,1,0x5289,1,0x677b,1,0x67f3,1,0x6d41,1,0x6e9c,1,0x7409,1,
+0x7559,1,0x786b,1,0x7d10,1,0x985e,1,0x516d,1,0x622e,1,0x9678,1,0x502b,1,
+0x5d19,1,0x6dea,1,0x8f2a,1,0x5f8b,1,0x6144,1,0x6817,1,0x7387,1,0x9686,1,
+0x5229,1,0x540f,1,0x5c65,1,0x6613,1,0x674e,1,0x68a8,1,0x6ce5,1,0x7406,1,
+0x75e2,1,0x7f79,1,0x88cf,1,0x88e1,1,0x91cc,1,0x96e2,1,0x533f,1,0x6eba,1,
+0x541d,1,0x71d0,1,0x7498,1,0x85fa,1,0x96a3,1,0x9c57,1,0x9e9f,1,0x6797,1,
+0x6dcb,1,0x81e8,1,0x7acb,1,0x7b20,1,0x7c92,1,0x72c0,1,0x7099,1,0x8b58,1,
+0x4ec0,1,0x8336,1,0x523a,1,0x5207,1,0x5ea6,1,0x62d3,1,0x7cd6,1,0x5b85,1,
+0x6d1e,1,0x66b4,1,0x8f3b,1,0x884c,1,0x964d,1,0x898b,1,0x5ed3,1,0x5140,1,
+0x55c0,1,0x585a,1,0x6674,1,0x51de,1,0x732a,1,0x76ca,1,0x793c,1,0x795e,1,
+0x7965,1,0x798f,1,0x9756,1,0x7cbe,1,0x7fbd,1,0x8612,1,0x8af8,1,0x9038,1,
+0x90fd,1,0x98ef,1,0x98fc,1,0x9928,1,0x9db4,1,0x4fae,1,0x50e7,1,0x514d,1,
+0x52c9,1,0x52e4,1,0x5351,1,0x559d,1,0x5606,1,0x5668,1,0x5840,1,0x58a8,1,
+0x5c64,1,0x5c6e,1,0x6094,1,0x6168,1,0x618e,1,0x61f2,1,0x654f,1,0x65e2,1,
+0x6691,1,0x6885,1,0x6d77,1,0x6e1a,1,0x6f22,1,0x716e,1,0x722b,1,0x7422,1,
+0x7891,1,0x793e,1,0x7949,1,0x7948,1,0x7950,1,0x7956,1,0x795d,1,0x798d,1,
+0x798e,1,0x7a40,1,0x7a81,1,0x7bc0,1,0x7df4,1,0x7e09,1,0x7e41,1,0x7f72,1,
+0x8005,1,0x81ed,1,0x8279,1,0x8279,1,0x8457,1,0x8910,1,0x8996,1,0x8b01,1,
+0x8b39,1,0x8cd3,1,0x8d08,1,0x8fb6,1,0x9038,1,0x96e3,1,0x97ff,1,0x983b,1,
+0x4e26,1,0x51b5,1,0x5168,1,0x4f80,1,0x5145,1,0x5180,1,0x52c7,1,0x52fa,1,
+0x559d,1,0x5555,1,0x5599,1,0x55e2,1,0x585a,1,0x58b3,1,0x5944,1,0x5954,1,
+0x5a62,1,0x5b28,1,0x5ed2,1,0x5ed9,1,0x5f69,1,0x5fad,1,0x60d8,1,0x614e,1,
+0x6108,1,0x618e,1,0x6160,1,0x61f2,1,0x6234,1,0x63c4,1,0x641c,1,0x6452,1,
+0x6556,1,0x6674,1,0x6717,1,0x671b,1,0x6756,1,0x6b79,1,0x6bba,1,0x6d41,1,
+0x6edb,1,0x6ecb,1,0x6f22,1,0x701e,1,0x716e,1,0x77a7,1,0x7235,1,0x72af,1,
+0x732a,1,0x7471,1,0x7506,1,0x753b,1,0x761d,1,0x761f,1,0x76ca,1,0x76db,1,
+0x76f4,1,0x774a,1,0x7740,1,0x78cc,1,0x7ab1,1,0x7bc0,1,0x7c7b,1,0x7d5b,1,
+0x7df4,1,0x7f3e,1,0x8005,1,0x8352,1,0x83ef,1,0x8779,1,0x8941,1,0x8986,1,
+0x8996,1,0x8abf,1,0x8af8,1,0x8acb,1,0x8b01,1,0x8afe,1,0x8aed,1,0x8b39,1,
+0x8b8a,1,0x8d08,1,0x8f38,1,0x9072,1,0x9199,1,0x9276,1,0x967c,1,0x96e3,1,
+0x9756,1,0x97db,1,0x97ff,1,0x980b,1,0x983b,1,0x9b12,1,0x9f9c,2,0xd84a,0xdc4a,
+2,0xd84a,0xdc44,2,0xd84c,0xdfd5,1,0x3b9d,1,0x4018,1,0x4039,2,0xd854,0xde49,2,
+0xd857,0xdcd0,2,0xd85f,0xded3,1,0x9f43,1,0x9f8e,0x82,0xe,0x5d9,0x5b4,0x82,0x11,0x5f2,
+0x5b7,0x82,0x18,0x5e9,0x5c1,0x82,0x19,0x5e9,0x5c2,0x83,0x18,0x5e9,0x5bc,0x5c1,0x83,0x19,
+0x5e9,0x5bc,0x5c2,0x82,0x11,0x5d0,0x5b7,0x82,0x12,0x5d0,0x5b8,0x82,0x15,0x5d0,0x5bc,0x82,
+0x15,0x5d1,0x5bc,0x82,0x15,0x5d2,0x5bc,0x82,0x15,0x5d3,0x5bc,0x82,0x15,0x5d4,0x5bc,0x82,
+0x15,0x5d5,0x5bc,0x82,0x15,0x5d6,0x5bc,0x82,0x15,0x5d8,0x5bc,0x82,0x15,0x5d9,0x5bc,0x82,
+0x15,0x5da,0x5bc,0x82,0x15,0x5db,0x5bc,0x82,0x15,0x5dc,0x5bc,0x82,0x15,0x5de,0x5bc,0x82,
+0x15,0x5e0,0x5bc,0x82,0x15,0x5e1,0x5bc,0x82,0x15,0x5e3,0x5bc,0x82,0x15,0x5e4,0x5bc,0x82,
+0x15,0x5e6,0x5bc,0x82,0x15,0x5e7,0x5bc,0x82,0x15,0x5e8,0x5bc,0x82,0x15,0x5e9,0x5bc,0x82,
+0x15,0x5ea,0x5bc,0x82,0x13,0x5d5,0x5b9,0x82,0x17,0x5d1,0x5bf,0x82,0x17,0x5db,0x5bf,0x82,
+0x17,0x5e4,0x5bf,0x84,0xd8,0xd834,0xdd57,0xd834,0xdd65,0x84,0xd8,0xd834,0xdd58,0xd834,0xdd65,0x86,
+0xd8,0xd834,0xdd58,0xd834,0xdd65,0xd834,0xdd6e,0x86,0xd8,0xd834,0xdd58,0xd834,0xdd65,0xd834,0xdd6f,0x86,
+0xd8,0xd834,0xdd58,0xd834,0xdd65,0xd834,0xdd70,0x86,0xd8,0xd834,0xdd58,0xd834,0xdd65,0xd834,0xdd71,0x86,
+0xd8,0xd834,0xdd58,0xd834,0xdd65,0xd834,0xdd72,0x84,0xd8,0xd834,0xddb9,0xd834,0xdd65,0x84,0xd8,0xd834,
+0xddba,0xd834,0xdd65,0x86,0xd8,0xd834,0xddb9,0xd834,0xdd65,0xd834,0xdd6e,0x86,0xd8,0xd834,0xddba,0xd834,
+0xdd65,0xd834,0xdd6e,0x86,0xd8,0xd834,0xddb9,0xd834,0xdd65,0xd834,0xdd6f,0x86,0xd8,0xd834,0xddba,0xd834,
+0xdd65,0xd834,0xdd6f,1,0x4e3d,1,0x4e38,1,0x4e41,2,0xd840,0xdd22,1,0x4f60,1,0x4fae,
+1,0x4fbb,1,0x5002,1,0x507a,1,0x5099,1,0x50e7,1,0x50cf,1,0x349e,2,0xd841,
+0xde3a,1,0x514d,1,0x5154,1,0x5164,1,0x5177,2,0xd841,0xdd1c,1,0x34b9,1,0x5167,
+1,0x518d,2,0xd841,0xdd4b,1,0x5197,1,0x51a4,1,0x4ecc,1,0x51ac,1,0x51b5,2,
+0xd864,0xdddf,1,0x51f5,1,0x5203,1,0x34df,1,0x523b,1,0x5246,1,0x5272,1,0x5277,
+1,0x3515,1,0x52c7,1,0x52c9,1,0x52e4,1,0x52fa,1,0x5305,1,0x5306,1,0x5317,
+1,0x5349,1,0x5351,1,0x535a,1,0x5373,1,0x537d,1,0x537f,1,0x537f,1,0x537f,
+2,0xd842,0xde2c,1,0x7070,1,0x53ca,1,0x53df,2,0xd842,0xdf63,1,0x53eb,1,0x53f1,
+1,0x5406,1,0x549e,1,0x5438,1,0x5448,1,0x5468,1,0x54a2,1,0x54f6,1,0x5510,
+1,0x5553,1,0x5563,1,0x5584,1,0x5584,1,0x5599,1,0x55ab,1,0x55b3,1,0x55c2,
+1,0x5716,1,0x5606,1,0x5717,1,0x5651,1,0x5674,1,0x5207,1,0x58ee,1,0x57ce,
+1,0x57f4,1,0x580d,1,0x578b,1,0x5832,1,0x5831,1,0x58ac,2,0xd845,0xdce4,1,
+0x58f2,1,0x58f7,1,0x5906,1,0x591a,1,0x5922,1,0x5962,2,0xd845,0xdea8,2,0xd845,
+0xdeea,1,0x59ec,1,0x5a1b,1,0x5a27,1,0x59d8,1,0x5a66,1,0x36ee,1,0x36fc,1,
+0x5b08,1,0x5b3e,1,0x5b3e,2,0xd846,0xddc8,1,0x5bc3,1,0x5bd8,1,0x5be7,1,0x5bf3,
+2,0xd846,0xdf18,1,0x5bff,1,0x5c06,1,0x5f53,1,0x5c22,1,0x3781,1,0x5c60,1,
+0x5c6e,1,0x5cc0,1,0x5c8d,2,0xd847,0xdde4,1,0x5d43,2,0xd847,0xdde6,1,0x5d6e,1,
+0x5d6b,1,0x5d7c,1,0x5de1,1,0x5de2,1,0x382f,1,0x5dfd,1,0x5e28,1,0x5e3d,1,
+0x5e69,1,0x3862,2,0xd848,0xdd83,1,0x387c,1,0x5eb0,1,0x5eb3,1,0x5eb6,1,0x5eca,
+2,0xd868,0xdf92,1,0x5efe,2,0xd848,0xdf31,2,0xd848,0xdf31,1,0x8201,1,0x5f22,1,
+0x5f22,1,0x38c7,2,0xd84c,0xdeb8,2,0xd858,0xddda,1,0x5f62,1,0x5f6b,1,0x38e3,1,
+0x5f9a,1,0x5fcd,1,0x5fd7,1,0x5ff9,1,0x6081,1,0x393a,1,0x391c,1,0x6094,2,
+0xd849,0xded4,1,0x60c7,1,0x6148,1,0x614c,1,0x614e,1,0x614c,1,0x617a,1,0x618e,
+1,0x61b2,1,0x61a4,1,0x61af,1,0x61de,1,0x61f2,1,0x61f6,1,0x6210,1,0x621b,
+1,0x625d,1,0x62b1,1,0x62d4,1,0x6350,2,0xd84a,0xdf0c,1,0x633d,1,0x62fc,1,
+0x6368,1,0x6383,1,0x63e4,2,0xd84a,0xdff1,1,0x6422,1,0x63c5,1,0x63a9,1,0x3a2e,
+1,0x6469,1,0x647e,1,0x649d,1,0x6477,1,0x3a6c,1,0x654f,1,0x656c,2,0xd84c,
+0xdc0a,1,0x65e3,1,0x66f8,1,0x6649,1,0x3b19,1,0x6691,1,0x3b08,1,0x3ae4,1,
+0x5192,1,0x5195,1,0x6700,1,0x669c,1,0x80ad,1,0x43d9,1,0x6717,1,0x671b,1,
+0x6721,1,0x675e,1,0x6753,2,0xd84c,0xdfc3,1,0x3b49,1,0x67fa,1,0x6785,1,0x6852,
+1,0x6885,2,0xd84d,0xdc6d,1,0x688e,1,0x681f,1,0x6914,1,0x3b9d,1,0x6942,1,
+0x69a3,1,0x69ea,1,0x6aa8,2,0xd84d,0xdea3,1,0x6adb,1,0x3c18,1,0x6b21,2,0xd84e,
+0xdca7,1,0x6b54,1,0x3c4e,1,0x6b72,1,0x6b9f,1,0x6bba,1,0x6bbb,2,0xd84e,0xde8d,
+2,0xd847,0xdd0b,2,0xd84e,0xdefa,1,0x6c4e,2,0xd84f,0xdcbc,1,0x6cbf,1,0x6ccd,1,
+0x6c67,1,0x6d16,1,0x6d3e,1,0x6d77,1,0x6d41,1,0x6d69,1,0x6d78,1,0x6d85,2,
+0xd84f,0xdd1e,1,0x6d34,1,0x6e2f,1,0x6e6e,1,0x3d33,1,0x6ecb,1,0x6ec7,2,0xd84f,
+0xded1,1,0x6df9,1,0x6f6e,2,0xd84f,0xdf5e,2,0xd84f,0xdf8e,1,0x6fc6,1,0x7039,1,
+0x701e,1,0x701b,1,0x3d96,1,0x704a,1,0x707d,1,0x7077,1,0x70ad,2,0xd841,0xdd25,
+1,0x7145,2,0xd850,0xde63,1,0x719c,2,0xd850,0xdfab,1,0x7228,1,0x7235,1,0x7250,
+2,0xd851,0xde08,1,0x7280,1,0x7295,2,0xd851,0xdf35,2,0xd852,0xdc14,1,0x737a,1,
+0x738b,1,0x3eac,1,0x73a5,1,0x3eb8,1,0x3eb8,1,0x7447,1,0x745c,1,0x7471,1,
+0x7485,1,0x74ca,1,0x3f1b,1,0x7524,2,0xd853,0xdc36,1,0x753e,2,0xd853,0xdc92,1,
+0x7570,2,0xd848,0xdd9f,1,0x7610,2,0xd853,0xdfa1,2,0xd853,0xdfb8,2,0xd854,0xdc44,1,
+0x3ffc,1,0x4008,1,0x76f4,2,0xd854,0xdcf3,2,0xd854,0xdcf2,2,0xd854,0xdd19,2,0xd854,
+0xdd33,1,0x771e,1,0x771f,1,0x771f,1,0x774a,1,0x4039,1,0x778b,1,0x4046,1,
+0x4096,2,0xd855,0xdc1d,1,0x784e,1,0x788c,1,0x78cc,1,0x40e3,2,0xd855,0xde26,1,
+0x7956,2,0xd855,0xde9a,2,0xd855,0xdec5,1,0x798f,1,0x79eb,1,0x412f,1,0x7a40,1,
+0x7a4a,1,0x7a4f,2,0xd856,0xdd7c,2,0xd856,0xdea7,2,0xd856,0xdea7,1,0x7aee,1,0x4202,
+2,0xd856,0xdfab,1,0x7bc6,1,0x7bc9,1,0x4227,2,0xd857,0xdc80,1,0x7cd2,1,0x42a0,
+1,0x7ce8,1,0x7ce3,1,0x7d00,2,0xd857,0xdf86,1,0x7d63,1,0x4301,1,0x7dc7,1,
+0x7e02,1,0x7e45,1,0x4334,2,0xd858,0xde28,2,0xd858,0xde47,1,0x4359,2,0xd858,0xded9,
+1,0x7f7a,2,0xd858,0xdf3e,1,0x7f95,1,0x7ffa,1,0x8005,2,0xd859,0xdcda,2,0xd859,
+0xdd23,1,0x8060,2,0xd859,0xdda8,1,0x8070,2,0xd84c,0xdf5f,1,0x43d5,1,0x80b2,1,
+0x8103,1,0x440b,1,0x813e,1,0x5ab5,2,0xd859,0xdfa7,2,0xd859,0xdfb5,2,0xd84c,0xdf93,
+2,0xd84c,0xdf9c,1,0x8201,1,0x8204,1,0x8f9e,1,0x446b,1,0x8291,1,0x828b,1,
+0x829d,1,0x52b3,1,0x82b1,1,0x82b3,1,0x82bd,1,0x82e6,2,0xd85a,0xdf3c,1,0x82e5,
+1,0x831d,1,0x8363,1,0x83ad,1,0x8323,1,0x83bd,1,0x83e7,1,0x8457,1,0x8353,
+1,0x83ca,1,0x83cc,1,0x83dc,2,0xd85b,0xdc36,2,0xd85b,0xdd6b,2,0xd85b,0xdcd5,1,
+0x452b,1,0x84f1,1,0x84f3,1,0x8516,2,0xd85c,0xdfca,1,0x8564,2,0xd85b,0xdf2c,1,
+0x455d,1,0x4561,2,0xd85b,0xdfb1,2,0xd85c,0xdcd2,1,0x456b,1,0x8650,1,0x865c,1,
+0x8667,1,0x8669,1,0x86a9,1,0x8688,1,0x870e,1,0x86e2,1,0x8779,1,0x8728,1,
+0x876b,1,0x8786,1,0x45d7,1,0x87e1,1,0x8801,1,0x45f9,1,0x8860,1,0x8863,2,
+0xd85d,0xde67,1,0x88d7,1,0x88de,1,0x4635,1,0x88fa,1,0x34bb,2,0xd85e,0xdcae,2,
+0xd85e,0xdd66,1,0x46be,1,0x46c7,1,0x8aa0,1,0x8aed,1,0x8b8a,1,0x8c55,2,0xd85f,
+0xdca8,1,0x8cab,1,0x8cc1,1,0x8d1b,1,0x8d77,2,0xd85f,0xdf2f,2,0xd842,0xdc04,1,
+0x8dcb,1,0x8dbc,1,0x8df0,2,0xd842,0xdcde,1,0x8ed4,1,0x8f38,2,0xd861,0xddd2,2,
+0xd861,0xdded,1,0x9094,1,0x90f1,1,0x9111,2,0xd861,0xdf2e,1,0x911b,1,0x9238,1,
+0x92d7,1,0x92d8,1,0x927c,1,0x93f9,1,0x9415,2,0xd862,0xdffa,1,0x958b,1,0x4995,
+1,0x95b7,2,0xd863,0xdd77,1,0x49e6,1,0x96c3,1,0x5db2,1,0x9723,2,0xd864,0xdd45,
+2,0xd864,0xde1a,1,0x4a6e,1,0x4a76,1,0x97e0,2,0xd865,0xdc0a,1,0x4ab2,2,0xd865,
+0xdc96,1,0x980b,1,0x980b,1,0x9829,2,0xd865,0xddb6,1,0x98e2,1,0x4b33,1,0x9929,
+1,0x99a7,1,0x99c2,1,0x99fe,1,0x4bce,2,0xd866,0xdf30,1,0x9b12,1,0x9c40,1,
+0x9cfd,1,0x4cce,1,0x4ced,1,0x9d67,2,0xd868,0xdcce,1,0x4cf8,2,0xd868,0xdd05,2,
+0xd868,0xde0e,2,0xd868,0xde91,1,0x9ebb,1,0x4d56,1,0x9ef9,1,0x9efe,1,0x9f05,1,
+0x9f0f,1,0x9f16,1,0x9f3b,2,0xd869,0xde00,0x82,0xe6,0x41,0x300,0x82,0xe6,0x41,0x301,
+0x4e6,0x82,0xe6,0x41,0x302,0x82,0xe6,0x41,0x303,0x2c8,0x82,0xe6,0x41,0x308,0x2e0,0x82,
+0xe6,0x41,0x30a,0x484,0x82,0xca,0x43,0x327,0x82,0xe6,0x45,0x300,0x82,0xe6,0x45,0x301,
+0x50e,0x82,0xe6,0x45,0x302,0x82,0xe6,0x45,0x308,0x82,0xe6,0x49,0x300,0x82,0xe6,0x49,
+0x301,0x82,0xe6,0x49,0x302,0x498,0x82,0xe6,0x49,0x308,0x82,0xe6,0x4e,0x303,0x82,0xe6,
+0x4f,0x300,0x82,0xe6,0x4f,0x301,0x522,0x82,0xe6,0x4f,0x302,0x2ec,0x82,0xe6,0x4f,0x303,
+0x2e8,0x82,0xe6,0x4f,0x308,0x82,0xe6,0x55,0x300,0x82,0xe6,0x55,0x301,0x82,0xe6,0x55,
+0x302,0x2b8,0x82,0xe6,0x55,0x308,0x82,0xe6,0x59,0x301,0x82,0xe6,0x61,0x300,0x82,0xe6,
+0x61,0x301,0x4ee,0x82,0xe6,0x61,0x302,0x82,0xe6,0x61,0x303,0x2ca,0x82,0xe6,0x61,0x308,
+0x2e2,0x82,0xe6,0x61,0x30a,0x486,0x82,0xca,0x63,0x327,0x82,0xe6,0x65,0x300,0x82,0xe6,
+0x65,0x301,0x516,0x82,0xe6,0x65,0x302,0x82,0xe6,0x65,0x308,0x82,0xe6,0x69,0x300,0x82,
+0xe6,0x69,0x301,0x82,0xe6,0x69,0x302,0x49a,0x82,0xe6,0x69,0x308,0x82,0xe6,0x6e,0x303,
+0x82,0xe6,0x6f,0x300,0x82,0xe6,0x6f,0x301,0x52a,0x82,0xe6,0x6f,0x302,0x2f2,0x82,0xe6,
+0x6f,0x303,0x2ea,0x82,0xe6,0x6f,0x308,0x82,0xe6,0x75,0x300,0x82,0xe6,0x75,0x301,0x82,
+0xe6,0x75,0x302,0x2c0,0x82,0xe6,0x75,0x308,0x82,0xe6,0x79,0x301,0x82,0xe6,0x79,0x308,
+0x82,0xe6,0x41,0x304,0x82,0xe6,0x61,0x304,0x4fe,0x82,0xe6,0x41,0x306,0x506,0x82,0xe6,
+0x61,0x306,0x82,0xca,0x41,0x328,0x82,0xca,0x61,0x328,0x82,0xe6,0x43,0x301,0x82,0xe6,
+0x63,0x301,0x82,0xe6,0x43,0x302,0x82,0xe6,0x63,0x302,0x82,0xe6,0x43,0x307,0x82,0xe6,
+0x63,0x307,0x82,0xe6,0x43,0x30c,0x82,0xe6,0x63,0x30c,0x82,0xe6,0x44,0x30c,0x82,0xe6,
+0x64,0x30c,0x488,0x82,0xe6,0x45,0x304,0x48c,0x82,0xe6,0x65,0x304,0x82,0xe6,0x45,0x306,
+0x82,0xe6,0x65,0x306,0x82,0xe6,0x45,0x307,0x82,0xe6,0x65,0x307,0x82,0xca,0x45,0x328,
+0x82,0xca,0x65,0x328,0x82,0xe6,0x45,0x30c,0x82,0xe6,0x65,0x30c,0x82,0xe6,0x47,0x302,
+0x82,0xe6,0x67,0x302,0x82,0xe6,0x47,0x306,0x82,0xe6,0x67,0x306,0x82,0xe6,0x47,0x307,
+0x82,0xe6,0x67,0x307,0x82,0xca,0x47,0x327,0x82,0xca,0x67,0x327,0x82,0xe6,0x48,0x302,
+0x82,0xe6,0x68,0x302,0x82,0xe6,0x49,0x303,0x82,0xe6,0x69,0x303,0x82,0xe6,0x49,0x304,
+0x82,0xe6,0x69,0x304,0x82,0xe6,0x49,0x306,0x82,0xe6,0x69,0x306,0x82,0xca,0x49,0x328,
+0x82,0xca,0x69,0x328,0x82,0xe6,0x49,0x307,0x82,0xe6,0x4a,0x302,0x82,0xe6,0x6a,0x302,
+0x82,0xca,0x4b,0x327,0x82,0xca,0x6b,0x327,0x82,0xe6,0x4c,0x301,0x82,0xe6,0x6c,0x301,
+0x82,0xca,0x4c,0x327,0x82,0xca,0x6c,0x327,0x82,0xe6,0x4c,0x30c,0x82,0xe6,0x6c,0x30c,
+0x82,0xe6,0x4e,0x301,0x82,0xe6,0x6e,0x301,0x82,0xca,0x4e,0x327,0x82,0xca,0x6e,0x327,
+0x82,0xe6,0x4e,0x30c,0x82,0xe6,0x6e,0x30c,0x4ac,0x82,0xe6,0x4f,0x304,0x4b0,0x82,0xe6,
+0x6f,0x304,0x82,0xe6,0x4f,0x306,0x82,0xe6,0x6f,0x306,0x82,0xe6,0x4f,0x30b,0x82,0xe6,
+0x6f,0x30b,0x82,0xe6,0x52,0x301,0x82,0xe6,0x72,0x301,0x82,0xca,0x52,0x327,0x82,0xca,
+0x72,0x327,0x82,0xe6,0x52,0x30c,0x82,0xe6,0x72,0x30c,0x4c0,0x82,0xe6,0x53,0x301,0x4c2,
+0x82,0xe6,0x73,0x301,0x82,0xe6,0x53,0x302,0x82,0xe6,0x73,0x302,0x82,0xca,0x53,0x327,
+0x82,0xca,0x73,0x327,0x4c4,0x82,0xe6,0x53,0x30c,0x4c6,0x82,0xe6,0x73,0x30c,0x82,0xca,
+0x54,0x327,0x82,0xca,0x74,0x327,0x82,0xe6,0x54,0x30c,0x82,0xe6,0x74,0x30c,0x4cc,0x82,
+0xe6,0x55,0x303,0x4ce,0x82,0xe6,0x75,0x303,0x4d0,0x82,0xe6,0x55,0x304,0x4d2,0x82,0xe6,
+0x75,0x304,0x82,0xe6,0x55,0x306,0x82,0xe6,0x75,0x306,0x82,0xe6,0x55,0x30a,0x82,0xe6,
+0x75,0x30a,0x82,0xe6,0x55,0x30b,0x82,0xe6,0x75,0x30b,0x82,0xca,0x55,0x328,0x82,0xca,
+0x75,0x328,0x82,0xe6,0x57,0x302,0x82,0xe6,0x77,0x302,0x82,0xe6,0x59,0x302,0x82,0xe6,
+0x79,0x302,0x82,0xe6,0x59,0x308,0x82,0xe6,0x5a,0x301,0x82,0xe6,0x7a,0x301,0x82,0xe6,
+0x5a,0x307,0x82,0xe6,0x7a,0x307,0x82,0xe6,0x5a,0x30c,0x82,0xe6,0x7a,0x30c,0x536,0x82,
+0xd8,0x4f,0x31b,0x540,0x82,0xd8,0x6f,0x31b,0x54a,0x82,0xd8,0x55,0x31b,0x554,0x82,0xd8,
+0x75,0x31b,0x82,0xe6,0x41,0x30c,0x82,0xe6,0x61,0x30c,0x82,0xe6,0x49,0x30c,0x82,0xe6,
+0x69,0x30c,0x82,0xe6,0x4f,0x30c,0x82,0xe6,0x6f,0x30c,0x82,0xe6,0x55,0x30c,0x82,0xe6,
+0x75,0x30c,0x83,0xe6,0x55,0x308,0x304,0x83,0xe6,0x75,0x308,0x304,0x83,0xe6,0x55,0x308,
+0x301,0x83,0xe6,0x75,0x308,0x301,0x83,0xe6,0x55,0x308,0x30c,0x83,0xe6,0x75,0x308,0x30c,
+0x83,0xe6,0x55,0x308,0x300,0x83,0xe6,0x75,0x308,0x300,0x83,0xe6,0x41,0x308,0x304,0x83,
+0xe6,0x61,0x308,0x304,0x83,0xe6,0x41,0x307,0x304,0x83,0xe6,0x61,0x307,0x304,0x82,0xe6,
+0xc6,0x304,0x82,0xe6,0xe6,0x304,0x82,0xe6,0x47,0x30c,0x82,0xe6,0x67,0x30c,0x82,0xe6,
+0x4b,0x30c,0x82,0xe6,0x6b,0x30c,0x2d8,0x82,0xca,0x4f,0x328,0x2da,0x82,0xca,0x6f,0x328,
+0x83,0xe6,0x4f,0x328,0x304,0x83,0xe6,0x6f,0x328,0x304,0x82,0xe6,0x1b7,0x30c,0x82,0xe6,
+0x292,0x30c,0x82,0xe6,0x6a,0x30c,0x82,0xe6,0x47,0x301,0x82,0xe6,0x67,0x301,0x82,0xe6,
+0x4e,0x300,0x82,0xe6,0x6e,0x300,0x83,0xe6,0x41,0x30a,0x301,0x83,0xe6,0x61,0x30a,0x301,
+0x82,0xe6,0xc6,0x301,0x82,0xe6,0xe6,0x301,0x82,0xe6,0xd8,0x301,0x82,0xe6,0xf8,0x301,
+0x82,0xe6,0x41,0x30f,0x82,0xe6,0x61,0x30f,0x82,0xe6,0x41,0x311,0x82,0xe6,0x61,0x311,
+0x82,0xe6,0x45,0x30f,0x82,0xe6,0x65,0x30f,0x82,0xe6,0x45,0x311,0x82,0xe6,0x65,0x311,
+0x82,0xe6,0x49,0x30f,0x82,0xe6,0x69,0x30f,0x82,0xe6,0x49,0x311,0x82,0xe6,0x69,0x311,
+0x82,0xe6,0x4f,0x30f,0x82,0xe6,0x6f,0x30f,0x82,0xe6,0x4f,0x311,0x82,0xe6,0x6f,0x311,
+0x82,0xe6,0x52,0x30f,0x82,0xe6,0x72,0x30f,0x82,0xe6,0x52,0x311,0x82,0xe6,0x72,0x311,
+0x82,0xe6,0x55,0x30f,0x82,0xe6,0x75,0x30f,0x82,0xe6,0x55,0x311,0x82,0xe6,0x75,0x311,
+0x82,0xdc,0x53,0x326,0x82,0xdc,0x73,0x326,0x82,0xdc,0x54,0x326,0x82,0xdc,0x74,0x326,
+0x82,0xe6,0x48,0x30c,0x82,0xe6,0x68,0x30c,0x2cc,0x82,0xe6,0x41,0x307,0x2ce,0x82,0xe6,
+0x61,0x307,0x490,0x82,0xca,0x45,0x327,0x492,0x82,0xca,0x65,0x327,0x83,0xe6,0x4f,0x308,
+0x304,0x83,0xe6,0x6f,0x308,0x304,0x83,0xe6,0x4f,0x303,0x304,0x83,0xe6,0x6f,0x303,0x304,
+0x2f8,0x82,0xe6,0x4f,0x307,0x2fa,0x82,0xe6,0x6f,0x307,0x83,0xe6,0x4f,0x307,0x304,0x83,
+0xe6,0x6f,0x307,0x304,0x82,0xe6,0x59,0x304,0x82,0xe6,0x79,0x304,0x8382,0xe6,0xa8,0x301,
+0xe6,0x20,0x308,0x301,0x82,0xe6,0x391,0x301,0x82,0xe6,0x395,0x301,0x82,0xe6,0x397,0x301,
+0x82,0xe6,0x399,0x301,0x82,0xe6,0x39f,0x301,0x82,0xe6,0x3a5,0x301,0x82,0xe6,0x3a9,0x301,
+0x83,0xe6,0x3b9,0x308,0x301,0x82,0xe6,0x399,0x308,0x82,0xe6,0x3a5,0x308,0x652,0x82,0xe6,
+0x3b1,0x301,0x82,0xe6,0x3b5,0x301,0x658,0x82,0xe6,0x3b7,0x301,0x82,0xe6,0x3b9,0x301,0x83,
+0xe6,0x3c5,0x308,0x301,0x34e,0x82,0xe6,0x3b9,0x308,0x388,0x82,0xe6,0x3c5,0x308,0x82,0xe6,
+0x3bf,0x301,0x82,0xe6,0x3c5,0x301,0x670,0x82,0xe6,0x3c9,0x301,0x82,0xe6,0x415,0x300,0x82,
+0xe6,0x415,0x308,0x82,0xe6,0x413,0x301,0x82,0xe6,0x406,0x308,0x82,0xe6,0x41a,0x301,0x82,
+0xe6,0x418,0x300,0x82,0xe6,0x423,0x306,0x82,0xe6,0x418,0x306,0x82,0xe6,0x438,0x306,0x82,
+0xe6,0x435,0x300,0x82,0xe6,0x435,0x308,0x82,0xe6,0x433,0x301,0x82,0xe6,0x456,0x308,0x82,
+0xe6,0x43a,0x301,0x82,0xe6,0x438,0x300,0x82,0xe6,0x443,0x306,0x82,0xe6,0x474,0x30f,0x82,
+0xe6,0x475,0x30f,0x82,0xe6,0x416,0x306,0x82,0xe6,0x436,0x306,0x82,0xe6,0x410,0x306,0x82,
+0xe6,0x430,0x306,0x82,0xe6,0x410,0x308,0x82,0xe6,0x430,0x308,0x82,0xe6,0x415,0x306,0x82,
+0xe6,0x435,0x306,0x82,0xe6,0x4d8,0x308,0x82,0xe6,0x4d9,0x308,0x82,0xe6,0x416,0x308,0x82,
+0xe6,0x436,0x308,0x82,0xe6,0x417,0x308,0x82,0xe6,0x437,0x308,0x82,0xe6,0x418,0x304,0x82,
+0xe6,0x438,0x304,0x82,0xe6,0x418,0x308,0x82,0xe6,0x438,0x308,0x82,0xe6,0x41e,0x308,0x82,
+0xe6,0x43e,0x308,0x82,0xe6,0x4e8,0x308,0x82,0xe6,0x4e9,0x308,0x82,0xe6,0x42d,0x308,0x82,
+0xe6,0x44d,0x308,0x82,0xe6,0x423,0x304,0x82,0xe6,0x443,0x304,0x82,0xe6,0x423,0x308,0x82,
+0xe6,0x443,0x308,0x82,0xe6,0x423,0x30b,0x82,0xe6,0x443,0x30b,0x82,0xe6,0x427,0x308,0x82,
+0xe6,0x447,0x308,0x82,0xe6,0x42b,0x308,0x82,0xe6,0x44b,0x308,0x82,0xe6,0x627,0x653,0x82,
+0xe6,0x627,0x654,0x82,0xe6,0x648,0x654,0x82,0xdc,0x627,0x655,0x82,0xe6,0x64a,0x654,0x82,
+0xe6,0x6d5,0x654,0x82,0xe6,0x6c1,0x654,0x82,0xe6,0x6d2,0x654,0x82,7,0x928,0x93c,0x82,
+7,0x930,0x93c,0x82,7,0x933,0x93c,2,0x9c7,0x9be,2,0x9c7,0x9d7,2,0xb47,0xb56,
+2,0xb47,0xb3e,2,0xb47,0xb57,2,0xb92,0xbd7,2,0xbc6,0xbbe,2,0xbc7,0xbbe,2,
+0xbc6,0xbd7,0x82,0x5b,0xc46,0xc56,2,0xcbf,0xcd5,2,0xcc6,0xcd5,2,0xcc6,0xcd6,0x450,
+2,0xcc6,0xcc2,3,0xcc6,0xcc2,0xcd5,2,0xd46,0xd3e,2,0xd47,0xd3e,2,0xd46,0xd57,
+0x82,9,0xdd9,0xdca,0x45e,2,0xdd9,0xdcf,0x83,9,0xdd9,0xdcf,0xdca,2,0xdd9,0xddf,
+2,0x1025,0x102e,2,0x1b05,0x1b35,2,0x1b07,0x1b35,2,0x1b09,0x1b35,2,0x1b0b,0x1b35,2,
+0x1b0d,0x1b35,2,0x1b11,0x1b35,2,0x1b3a,0x1b35,2,0x1b3c,0x1b35,2,0x1b3e,0x1b35,2,0x1b3f,
+0x1b35,2,0x1b42,0x1b35,0x82,0xdc,0x41,0x325,0x82,0xdc,0x61,0x325,0x82,0xe6,0x42,0x307,
+0x82,0xe6,0x62,0x307,0x82,0xdc,0x42,0x323,0x82,0xdc,0x62,0x323,0x82,0xdc,0x42,0x331,
+0x82,0xdc,0x62,0x331,0x83,0xe6,0x43,0x327,0x301,0x83,0xe6,0x63,0x327,0x301,0x82,0xe6,
+0x44,0x307,0x82,0xe6,0x64,0x307,0x82,0xdc,0x44,0x323,0x82,0xdc,0x64,0x323,0x82,0xdc,
+0x44,0x331,0x82,0xdc,0x64,0x331,0x82,0xca,0x44,0x327,0x82,0xca,0x64,0x327,0x82,0xdc,
+0x44,0x32d,0x82,0xdc,0x64,0x32d,0x83,0xe6,0x45,0x304,0x300,0x83,0xe6,0x65,0x304,0x300,
+0x83,0xe6,0x45,0x304,0x301,0x83,0xe6,0x65,0x304,0x301,0x82,0xdc,0x45,0x32d,0x82,0xdc,
+0x65,0x32d,0x82,0xdc,0x45,0x330,0x82,0xdc,0x65,0x330,0x83,0xe6,0x45,0x327,0x306,0x83,
+0xe6,0x65,0x327,0x306,0x82,0xe6,0x46,0x307,0x82,0xe6,0x66,0x307,0x82,0xe6,0x47,0x304,
+0x82,0xe6,0x67,0x304,0x82,0xe6,0x48,0x307,0x82,0xe6,0x68,0x307,0x82,0xdc,0x48,0x323,
+0x82,0xdc,0x68,0x323,0x82,0xe6,0x48,0x308,0x82,0xe6,0x68,0x308,0x82,0xca,0x48,0x327,
+0x82,0xca,0x68,0x327,0x82,0xdc,0x48,0x32e,0x82,0xdc,0x68,0x32e,0x82,0xdc,0x49,0x330,
+0x82,0xdc,0x69,0x330,0x83,0xe6,0x49,0x308,0x301,0x83,0xe6,0x69,0x308,0x301,0x82,0xe6,
+0x4b,0x301,0x82,0xe6,0x6b,0x301,0x82,0xdc,0x4b,0x323,0x82,0xdc,0x6b,0x323,0x82,0xdc,
+0x4b,0x331,0x82,0xdc,0x6b,0x331,0x49c,0x82,0xdc,0x4c,0x323,0x49e,0x82,0xdc,0x6c,0x323,
+0x83,0xe6,0x4c,0x323,0x304,0x83,0xe6,0x6c,0x323,0x304,0x82,0xdc,0x4c,0x331,0x82,0xdc,
+0x6c,0x331,0x82,0xdc,0x4c,0x32d,0x82,0xdc,0x6c,0x32d,0x82,0xe6,0x4d,0x301,0x82,0xe6,
+0x6d,0x301,0x82,0xe6,0x4d,0x307,0x82,0xe6,0x6d,0x307,0x82,0xdc,0x4d,0x323,0x82,0xdc,
+0x6d,0x323,0x82,0xe6,0x4e,0x307,0x82,0xe6,0x6e,0x307,0x82,0xdc,0x4e,0x323,0x82,0xdc,
+0x6e,0x323,0x82,0xdc,0x4e,0x331,0x82,0xdc,0x6e,0x331,0x82,0xdc,0x4e,0x32d,0x82,0xdc,
+0x6e,0x32d,0x83,0xe6,0x4f,0x303,0x301,0x83,0xe6,0x6f,0x303,0x301,0x83,0xe6,0x4f,0x303,
+0x308,0x83,0xe6,0x6f,0x303,0x308,0x83,0xe6,0x4f,0x304,0x300,0x83,0xe6,0x6f,0x304,0x300,
+0x83,0xe6,0x4f,0x304,0x301,0x83,0xe6,0x6f,0x304,0x301,0x82,0xe6,0x50,0x301,0x82,0xe6,
+0x70,0x301,0x82,0xe6,0x50,0x307,0x82,0xe6,0x70,0x307,0x82,0xe6,0x52,0x307,0x82,0xe6,
+0x72,0x307,0x4bc,0x82,0xdc,0x52,0x323,0x4be,0x82,0xdc,0x72,0x323,0x83,0xe6,0x52,0x323,
+0x304,0x83,0xe6,0x72,0x323,0x304,0x82,0xdc,0x52,0x331,0x82,0xdc,0x72,0x331,0x82,0xe6,
+0x53,0x307,0x82,0xe6,0x73,0x307,0x4c8,0x82,0xdc,0x53,0x323,0x4ca,0x82,0xdc,0x73,0x323,
+0x83,0xe6,0x53,0x301,0x307,0x83,0xe6,0x73,0x301,0x307,0x83,0xe6,0x53,0x30c,0x307,0x83,
+0xe6,0x73,0x30c,0x307,0x83,0xe6,0x53,0x323,0x307,0x83,0xe6,0x73,0x323,0x307,0x82,0xe6,
+0x54,0x307,0x82,0xe6,0x74,0x307,0x82,0xdc,0x54,0x323,0x82,0xdc,0x74,0x323,0x82,0xdc,
+0x54,0x331,0x82,0xdc,0x74,0x331,0x82,0xdc,0x54,0x32d,0x82,0xdc,0x74,0x32d,0x82,0xdc,
+0x55,0x324,0x82,0xdc,0x75,0x324,0x82,0xdc,0x55,0x330,0x82,0xdc,0x75,0x330,0x82,0xdc,
+0x55,0x32d,0x82,0xdc,0x75,0x32d,0x83,0xe6,0x55,0x303,0x301,0x83,0xe6,0x75,0x303,0x301,
+0x83,0xe6,0x55,0x304,0x308,0x83,0xe6,0x75,0x304,0x308,0x82,0xe6,0x56,0x303,0x82,0xe6,
+0x76,0x303,0x82,0xdc,0x56,0x323,0x82,0xdc,0x76,0x323,0x82,0xe6,0x57,0x300,0x82,0xe6,
+0x77,0x300,0x82,0xe6,0x57,0x301,0x82,0xe6,0x77,0x301,0x82,0xe6,0x57,0x308,0x82,0xe6,
+0x77,0x308,0x82,0xe6,0x57,0x307,0x82,0xe6,0x77,0x307,0x82,0xdc,0x57,0x323,0x82,0xdc,
+0x77,0x323,0x82,0xe6,0x58,0x307,0x82,0xe6,0x78,0x307,0x82,0xe6,0x58,0x308,0x82,0xe6,
+0x78,0x308,0x82,0xe6,0x59,0x307,0x82,0xe6,0x79,0x307,0x82,0xe6,0x5a,0x302,0x82,0xe6,
+0x7a,0x302,0x82,0xdc,0x5a,0x323,0x82,0xdc,0x7a,0x323,0x82,0xdc,0x5a,0x331,0x82,0xdc,
+0x7a,0x331,0x82,0xdc,0x68,0x331,0x82,0xe6,0x74,0x308,0x82,0xe6,0x77,0x30a,0x82,0xe6,
+0x79,0x30a,0x8282,0xe6,0x17f,0x307,0xe6,0x73,0x307,0x4f6,0x82,0xdc,0x41,0x323,0x4fa,0x82,
+0xdc,0x61,0x323,0x82,0xe6,0x41,0x309,0x82,0xe6,0x61,0x309,0x83,0xe6,0x41,0x302,0x301,
+0x83,0xe6,0x61,0x302,0x301,0x83,0xe6,0x41,0x302,0x300,0x83,0xe6,0x61,0x302,0x300,0x83,
+0xe6,0x41,0x302,0x309,0x83,0xe6,0x61,0x302,0x309,0x83,0xe6,0x41,0x302,0x303,0x83,0xe6,
+0x61,0x302,0x303,0x83,0xe6,0x41,0x323,0x302,0x83,0xe6,0x61,0x323,0x302,0x83,0xe6,0x41,
+0x306,0x301,0x83,0xe6,0x61,0x306,0x301,0x83,0xe6,0x41,0x306,0x300,0x83,0xe6,0x61,0x306,
+0x300,0x83,0xe6,0x41,0x306,0x309,0x83,0xe6,0x61,0x306,0x309,0x83,0xe6,0x41,0x306,0x303,
+0x83,0xe6,0x61,0x306,0x303,0x83,0xe6,0x41,0x323,0x306,0x83,0xe6,0x61,0x323,0x306,0x51e,
+0x82,0xdc,0x45,0x323,0x520,0x82,0xdc,0x65,0x323,0x82,0xe6,0x45,0x309,0x82,0xe6,0x65,
+0x309,0x82,0xe6,0x45,0x303,0x82,0xe6,0x65,0x303,0x83,0xe6,0x45,0x302,0x301,0x83,0xe6,
+0x65,0x302,0x301,0x83,0xe6,0x45,0x302,0x300,0x83,0xe6,0x65,0x302,0x300,0x83,0xe6,0x45,
+0x302,0x309,0x83,0xe6,0x65,0x302,0x309,0x83,0xe6,0x45,0x302,0x303,0x83,0xe6,0x65,0x302,
+0x303,0x83,0xe6,0x45,0x323,0x302,0x83,0xe6,0x65,0x323,0x302,0x82,0xe6,0x49,0x309,0x82,
+0xe6,0x69,0x309,0x82,0xdc,0x49,0x323,0x82,0xdc,0x69,0x323,0x532,0x82,0xdc,0x4f,0x323,
+0x534,0x82,0xdc,0x6f,0x323,0x82,0xe6,0x4f,0x309,0x82,0xe6,0x6f,0x309,0x83,0xe6,0x4f,
+0x302,0x301,0x83,0xe6,0x6f,0x302,0x301,0x83,0xe6,0x4f,0x302,0x300,0x83,0xe6,0x6f,0x302,
+0x300,0x83,0xe6,0x4f,0x302,0x309,0x83,0xe6,0x6f,0x302,0x309,0x83,0xe6,0x4f,0x302,0x303,
+0x83,0xe6,0x6f,0x302,0x303,0x83,0xe6,0x4f,0x323,0x302,0x83,0xe6,0x6f,0x323,0x302,0x83,
+0xe6,0x4f,0x31b,0x301,0x83,0xe6,0x6f,0x31b,0x301,0x83,0xe6,0x4f,0x31b,0x300,0x83,0xe6,
+0x6f,0x31b,0x300,0x83,0xe6,0x4f,0x31b,0x309,0x83,0xe6,0x6f,0x31b,0x309,0x83,0xe6,0x4f,
+0x31b,0x303,0x83,0xe6,0x6f,0x31b,0x303,0x83,0xdc,0x4f,0x31b,0x323,0x83,0xdc,0x6f,0x31b,
+0x323,0x82,0xdc,0x55,0x323,0x82,0xdc,0x75,0x323,0x82,0xe6,0x55,0x309,0x82,0xe6,0x75,
+0x309,0x83,0xe6,0x55,0x31b,0x301,0x83,0xe6,0x75,0x31b,0x301,0x83,0xe6,0x55,0x31b,0x300,
+0x83,0xe6,0x75,0x31b,0x300,0x83,0xe6,0x55,0x31b,0x309,0x83,0xe6,0x75,0x31b,0x309,0x83,
+0xe6,0x55,0x31b,0x303,0x83,0xe6,0x75,0x31b,0x303,0x83,0xdc,0x55,0x31b,0x323,0x83,0xdc,
+0x75,0x31b,0x323,0x82,0xe6,0x59,0x300,0x82,0xe6,0x79,0x300,0x82,0xdc,0x59,0x323,0x82,
+0xdc,0x79,0x323,0x82,0xe6,0x59,0x309,0x82,0xe6,0x79,0x309,0x82,0xe6,0x59,0x303,0x82,
+0xe6,0x79,0x303,0x55e,0x82,0xe6,0x3b1,0x313,0x566,0x82,0xe6,0x3b1,0x314,0x608,0x83,0xe6,
+0x3b1,0x313,0x300,0x60a,0x83,0xe6,0x3b1,0x314,0x300,0x60c,0x83,0xe6,0x3b1,0x313,0x301,0x60e,
+0x83,0xe6,0x3b1,0x314,0x301,0x610,0x83,0xe6,0x3b1,0x313,0x342,0x612,0x83,0xe6,0x3b1,0x314,
+0x342,0x56e,0x82,0xe6,0x391,0x313,0x576,0x82,0xe6,0x391,0x314,0x614,0x83,0xe6,0x391,0x313,
+0x300,0x616,0x83,0xe6,0x391,0x314,0x300,0x618,0x83,0xe6,0x391,0x313,0x301,0x61a,0x83,0xe6,
+0x391,0x314,0x301,0x61c,0x83,0xe6,0x391,0x313,0x342,0x61e,0x83,0xe6,0x391,0x314,0x342,0x57e,
+0x82,0xe6,0x3b5,0x313,0x582,0x82,0xe6,0x3b5,0x314,0x83,0xe6,0x3b5,0x313,0x300,0x83,0xe6,
+0x3b5,0x314,0x300,0x83,0xe6,0x3b5,0x313,0x301,0x83,0xe6,0x3b5,0x314,0x301,0x586,0x82,0xe6,
+0x395,0x313,0x58a,0x82,0xe6,0x395,0x314,0x83,0xe6,0x395,0x313,0x300,0x83,0xe6,0x395,0x314,
+0x300,0x83,0xe6,0x395,0x313,0x301,0x83,0xe6,0x395,0x314,0x301,0x58e,0x82,0xe6,0x3b7,0x313,
+0x596,0x82,0xe6,0x3b7,0x314,0x620,0x83,0xe6,0x3b7,0x313,0x300,0x622,0x83,0xe6,0x3b7,0x314,
+0x300,0x624,0x83,0xe6,0x3b7,0x313,0x301,0x626,0x83,0xe6,0x3b7,0x314,0x301,0x628,0x83,0xe6,
+0x3b7,0x313,0x342,0x62a,0x83,0xe6,0x3b7,0x314,0x342,0x59e,0x82,0xe6,0x397,0x313,0x5a6,0x82,
+0xe6,0x397,0x314,0x62c,0x83,0xe6,0x397,0x313,0x300,0x62e,0x83,0xe6,0x397,0x314,0x300,0x630,
+0x83,0xe6,0x397,0x313,0x301,0x632,0x83,0xe6,0x397,0x314,0x301,0x634,0x83,0xe6,0x397,0x313,
+0x342,0x636,0x83,0xe6,0x397,0x314,0x342,0x5ae,0x82,0xe6,0x3b9,0x313,0x5b4,0x82,0xe6,0x3b9,
+0x314,0x83,0xe6,0x3b9,0x313,0x300,0x83,0xe6,0x3b9,0x314,0x300,0x83,0xe6,0x3b9,0x313,0x301,
+0x83,0xe6,0x3b9,0x314,0x301,0x83,0xe6,0x3b9,0x313,0x342,0x83,0xe6,0x3b9,0x314,0x342,0x5ba,
+0x82,0xe6,0x399,0x313,0x5c0,0x82,0xe6,0x399,0x314,0x83,0xe6,0x399,0x313,0x300,0x83,0xe6,
+0x399,0x314,0x300,0x83,0xe6,0x399,0x313,0x301,0x83,0xe6,0x399,0x314,0x301,0x83,0xe6,0x399,
+0x313,0x342,0x83,0xe6,0x399,0x314,0x342,0x5c6,0x82,0xe6,0x3bf,0x313,0x5ca,0x82,0xe6,0x3bf,
+0x314,0x83,0xe6,0x3bf,0x313,0x300,0x83,0xe6,0x3bf,0x314,0x300,0x83,0xe6,0x3bf,0x313,0x301,
+0x83,0xe6,0x3bf,0x314,0x301,0x5ce,0x82,0xe6,0x39f,0x313,0x5d2,0x82,0xe6,0x39f,0x314,0x83,
+0xe6,0x39f,0x313,0x300,0x83,0xe6,0x39f,0x314,0x300,0x83,0xe6,0x39f,0x313,0x301,0x83,0xe6,
+0x39f,0x314,0x301,0x5d6,0x82,0xe6,0x3c5,0x313,0x5dc,0x82,0xe6,0x3c5,0x314,0x83,0xe6,0x3c5,
+0x313,0x300,0x83,0xe6,0x3c5,0x314,0x300,0x83,0xe6,0x3c5,0x313,0x301,0x83,0xe6,0x3c5,0x314,
+0x301,0x83,0xe6,0x3c5,0x313,0x342,0x83,0xe6,0x3c5,0x314,0x342,0x5e2,0x82,0xe6,0x3a5,0x314,
+0x83,0xe6,0x3a5,0x314,0x300,0x83,0xe6,0x3a5,0x314,0x301,0x83,0xe6,0x3a5,0x314,0x342,0x5e8,
+0x82,0xe6,0x3c9,0x313,0x5f0,0x82,0xe6,0x3c9,0x314,0x638,0x83,0xe6,0x3c9,0x313,0x300,0x63a,
+0x83,0xe6,0x3c9,0x314,0x300,0x63c,0x83,0xe6,0x3c9,0x313,0x301,0x63e,0x83,0xe6,0x3c9,0x314,
+0x301,0x640,0x83,0xe6,0x3c9,0x313,0x342,0x642,0x83,0xe6,0x3c9,0x314,0x342,0x5f8,0x82,0xe6,
+0x3a9,0x313,0x600,0x82,0xe6,0x3a9,0x314,0x644,0x83,0xe6,0x3a9,0x313,0x300,0x646,0x83,0xe6,
+0x3a9,0x314,0x300,0x648,0x83,0xe6,0x3a9,0x313,0x301,0x64a,0x83,0xe6,0x3a9,0x314,0x301,0x64c,
+0x83,0xe6,0x3a9,0x313,0x342,0x64e,0x83,0xe6,0x3a9,0x314,0x342,0x650,0x82,0xe6,0x3b1,0x300,
+0x82,0xe6,0x3b5,0x300,0x656,0x82,0xe6,0x3b7,0x300,0x82,0xe6,0x3b9,0x300,0x82,0xe6,0x3bf,
+0x300,0x82,0xe6,0x3c5,0x300,0x66e,0x82,0xe6,0x3c9,0x300,0x83,0xf0,0x3b1,0x313,0x345,0x83,
+0xf0,0x3b1,0x314,0x345,0x84,0xf0,0x3b1,0x313,0x300,0x345,0x84,0xf0,0x3b1,0x314,0x300,0x345,
+0x84,0xf0,0x3b1,0x313,0x301,0x345,0x84,0xf0,0x3b1,0x314,0x301,0x345,0x84,0xf0,0x3b1,0x313,
+0x342,0x345,0x84,0xf0,0x3b1,0x314,0x342,0x345,0x83,0xf0,0x391,0x313,0x345,0x83,0xf0,0x391,
+0x314,0x345,0x84,0xf0,0x391,0x313,0x300,0x345,0x84,0xf0,0x391,0x314,0x300,0x345,0x84,0xf0,
+0x391,0x313,0x301,0x345,0x84,0xf0,0x391,0x314,0x301,0x345,0x84,0xf0,0x391,0x313,0x342,0x345,
+0x84,0xf0,0x391,0x314,0x342,0x345,0x83,0xf0,0x3b7,0x313,0x345,0x83,0xf0,0x3b7,0x314,0x345,
+0x84,0xf0,0x3b7,0x313,0x300,0x345,0x84,0xf0,0x3b7,0x314,0x300,0x345,0x84,0xf0,0x3b7,0x313,
+0x301,0x345,0x84,0xf0,0x3b7,0x314,0x301,0x345,0x84,0xf0,0x3b7,0x313,0x342,0x345,0x84,0xf0,
+0x3b7,0x314,0x342,0x345,0x83,0xf0,0x397,0x313,0x345,0x83,0xf0,0x397,0x314,0x345,0x84,0xf0,
+0x397,0x313,0x300,0x345,0x84,0xf0,0x397,0x314,0x300,0x345,0x84,0xf0,0x397,0x313,0x301,0x345,
+0x84,0xf0,0x397,0x314,0x301,0x345,0x84,0xf0,0x397,0x313,0x342,0x345,0x84,0xf0,0x397,0x314,
+0x342,0x345,0x83,0xf0,0x3c9,0x313,0x345,0x83,0xf0,0x3c9,0x314,0x345,0x84,0xf0,0x3c9,0x313,
+0x300,0x345,0x84,0xf0,0x3c9,0x314,0x300,0x345,0x84,0xf0,0x3c9,0x313,0x301,0x345,0x84,0xf0,
+0x3c9,0x314,0x301,0x345,0x84,0xf0,0x3c9,0x313,0x342,0x345,0x84,0xf0,0x3c9,0x314,0x342,0x345,
+0x83,0xf0,0x3a9,0x313,0x345,0x83,0xf0,0x3a9,0x314,0x345,0x84,0xf0,0x3a9,0x313,0x300,0x345,
+0x84,0xf0,0x3a9,0x314,0x300,0x345,0x84,0xf0,0x3a9,0x313,0x301,0x345,0x84,0xf0,0x3a9,0x314,
+0x301,0x345,0x84,0xf0,0x3a9,0x313,0x342,0x345,0x84,0xf0,0x3a9,0x314,0x342,0x345,0x82,0xe6,
+0x3b1,0x306,0x82,0xe6,0x3b1,0x304,0x83,0xf0,0x3b1,0x300,0x345,0x82,0xf0,0x3b1,0x345,0x83,
+0xf0,0x3b1,0x301,0x345,0x654,0x82,0xe6,0x3b1,0x342,0x83,0xf0,0x3b1,0x342,0x345,0x82,0xe6,
+0x391,0x306,0x82,0xe6,0x391,0x304,0x82,0xe6,0x391,0x300,0x82,0xf0,0x391,0x345,0x8382,0xe6,
+0xa8,0x342,0xe6,0x20,0x308,0x342,0x83,0xf0,0x3b7,0x300,0x345,0x82,0xf0,0x3b7,0x345,0x83,
+0xf0,0x3b7,0x301,0x345,0x65a,0x82,0xe6,0x3b7,0x342,0x83,0xf0,0x3b7,0x342,0x345,0x82,0xe6,
+0x395,0x300,0x82,0xe6,0x397,0x300,0x82,0xf0,0x397,0x345,0x8382,0xe6,0x1fbf,0x300,0xe6,0x20,
+0x313,0x300,0x8382,0xe6,0x1fbf,0x301,0xe6,0x20,0x313,0x301,0x8382,0xe6,0x1fbf,0x342,0xe6,0x20,
+0x313,0x342,0x82,0xe6,0x3b9,0x306,0x82,0xe6,0x3b9,0x304,0x83,0xe6,0x3b9,0x308,0x300,0x82,
+0xe6,0x3b9,0x342,0x83,0xe6,0x3b9,0x308,0x342,0x82,0xe6,0x399,0x306,0x82,0xe6,0x399,0x304,
+0x82,0xe6,0x399,0x300,0x8382,0xe6,0x1ffe,0x300,0xe6,0x20,0x314,0x300,0x8382,0xe6,0x1ffe,0x301,
+0xe6,0x20,0x314,0x301,0x8382,0xe6,0x1ffe,0x342,0xe6,0x20,0x314,0x342,0x82,0xe6,0x3c5,0x306,
+0x82,0xe6,0x3c5,0x304,0x83,0xe6,0x3c5,0x308,0x300,0x82,0xe6,0x3c1,0x313,0x82,0xe6,0x3c1,
+0x314,0x82,0xe6,0x3c5,0x342,0x83,0xe6,0x3c5,0x308,0x342,0x82,0xe6,0x3a5,0x306,0x82,0xe6,
+0x3a5,0x304,0x82,0xe6,0x3a5,0x300,0x82,0xe6,0x3a1,0x314,0x8382,0xe6,0xa8,0x300,0xe6,0x20,
+0x308,0x300,0x83,0xf0,0x3c9,0x300,0x345,0x82,0xf0,0x3c9,0x345,0x83,0xf0,0x3c9,0x301,0x345,
+0x672,0x82,0xe6,0x3c9,0x342,0x83,0xf0,0x3c9,0x342,0x345,0x82,0xe6,0x39f,0x300,0x82,0xe6,
+0x3a9,0x300,0x82,0xf0,0x3a9,0x345,0x82,1,0x2190,0x338,0x82,1,0x2192,0x338,0x82,1,
+0x2194,0x338,0x82,1,0x21d0,0x338,0x82,1,0x21d4,0x338,0x82,1,0x21d2,0x338,0x82,1,
+0x2203,0x338,0x82,1,0x2208,0x338,0x82,1,0x220b,0x338,0x82,1,0x2223,0x338,0x82,1,
+0x2225,0x338,0x82,1,0x223c,0x338,0x82,1,0x2243,0x338,0x82,1,0x2245,0x338,0x82,1,
+0x2248,0x338,0x82,1,0x3d,0x338,0x82,1,0x2261,0x338,0x82,1,0x224d,0x338,0x82,1,
+0x3c,0x338,0x82,1,0x3e,0x338,0x82,1,0x2264,0x338,0x82,1,0x2265,0x338,0x82,1,
+0x2272,0x338,0x82,1,0x2273,0x338,0x82,1,0x2276,0x338,0x82,1,0x2277,0x338,0x82,1,
+0x227a,0x338,0x82,1,0x227b,0x338,0x82,1,0x2282,0x338,0x82,1,0x2283,0x338,0x82,1,
+0x2286,0x338,0x82,1,0x2287,0x338,0x82,1,0x22a2,0x338,0x82,1,0x22a8,0x338,0x82,1,
+0x22a9,0x338,0x82,1,0x22ab,0x338,0x82,1,0x227c,0x338,0x82,1,0x227d,0x338,0x82,1,
+0x2291,0x338,0x82,1,0x2292,0x338,0x82,1,0x22b2,0x338,0x82,1,0x22b3,0x338,0x82,1,
+0x22b4,0x338,0x82,1,0x22b5,0x338,0x82,8,0x304b,0x3099,0x82,8,0x304d,0x3099,0x82,8,
+0x304f,0x3099,0x82,8,0x3051,0x3099,0x82,8,0x3053,0x3099,0x82,8,0x3055,0x3099,0x82,8,
+0x3057,0x3099,0x82,8,0x3059,0x3099,0x82,8,0x305b,0x3099,0x82,8,0x305d,0x3099,0x82,8,
+0x305f,0x3099,0x82,8,0x3061,0x3099,0x82,8,0x3064,0x3099,0x82,8,0x3066,0x3099,0x82,8,
+0x3068,0x3099,0x82,8,0x306f,0x3099,0x82,8,0x306f,0x309a,0x82,8,0x3072,0x3099,0x82,8,
+0x3072,0x309a,0x82,8,0x3075,0x3099,0x82,8,0x3075,0x309a,0x82,8,0x3078,0x3099,0x82,8,
+0x3078,0x309a,0x82,8,0x307b,0x3099,0x82,8,0x307b,0x309a,0x82,8,0x3046,0x3099,0x82,8,
+0x309d,0x3099,0x82,8,0x30ab,0x3099,0x82,8,0x30ad,0x3099,0x82,8,0x30af,0x3099,0x82,8,
+0x30b1,0x3099,0x82,8,0x30b3,0x3099,0x82,8,0x30b5,0x3099,0x82,8,0x30b7,0x3099,0x82,8,
+0x30b9,0x3099,0x82,8,0x30bb,0x3099,0x82,8,0x30bd,0x3099,0x82,8,0x30bf,0x3099,0x82,8,
+0x30c1,0x3099,0x82,8,0x30c4,0x3099,0x82,8,0x30c6,0x3099,0x82,8,0x30c8,0x3099,0x82,8,
+0x30cf,0x3099,0x82,8,0x30cf,0x309a,0x82,8,0x30d2,0x3099,0x82,8,0x30d2,0x309a,0x82,8,
+0x30d5,0x3099,0x82,8,0x30d5,0x309a,0x82,8,0x30d8,0x3099,0x82,8,0x30d8,0x309a,0x82,8,
+0x30db,0x3099,0x82,8,0x30db,0x309a,0x82,8,0x30a6,0x3099,0x82,8,0x30ef,0x3099,0x82,8,
+0x30f0,0x3099,0x82,8,0x30f1,0x3099,0x82,8,0x30f2,0x3099,0x82,8,0x30fd,0x3099,0x7a6,0x7a7,
+0x7a8,0x7a9,0x7ad,0x7ae,0x7b0,0x7aa,0x7d4,0x7ab,0x7b2,0x7b1,0x7b4,0x7b5,0x7d5,0x7d6,0x7b3,0x7ce,
+0x7d3,0x7cd,0x7b6,0x7ac,0x7af,0x7d0,0x7d2,0x7d1,0x7cf,0x7d9,0x7d7,0x7d8,0x7b7,0x7b8,0x7b9,0x7ba,
+0x7bb,0x7bc,0x7be,0x7bd,0x7bf,0x7c1,0x7c0,0x7c2,0x7c5,0x7c3,0x7c4,0x7c6,0x7c7,0x7c8,0x7c9,0x7ca,
+0x7cb,0x7cc,0x7da,0x7db,0x100,0x20,0x2fc,0x8200,0xe6,0x20,0x308,0x100,0x61,0x8200,0xe6,0x20,
+0x304,0x100,0x32,0x100,0x33,0x8200,0xe6,0x20,0x301,0x100,0x3bc,0x8200,0xca,0x20,0x327,0x100,
+0x31,0x100,0x6f,0x300,0x31,0x2044,0x34,0x300,0x31,0x2044,0x32,0x300,0x33,0x2044,0x34,0x200,
+0x49,0x4a,0x200,0x69,0x6a,0x200,0x4c,0xb7,0x200,0x6c,0xb7,0x200,0x2bc,0x6e,0x4e4,0x100,
+0x73,0x8300,0xe6,0x44,0x5a,0x30c,0x8300,0xe6,0x44,0x7a,0x30c,0x8300,0xe6,0x64,0x7a,0x30c,
+0x200,0x4c,0x4a,0x200,0x4c,0x6a,0x200,0x6c,0x6a,0x200,0x4e,0x4a,0x200,0x4e,0x6a,0x200,
+0x6e,0x6a,0x200,0x44,0x5a,0x200,0x44,0x7a,0x200,0x64,0x7a,0x100,0x68,0x100,0x266,0x100,
+0x6a,0x100,0x72,0x100,0x279,0x100,0x27b,0x100,0x281,0x100,0x77,0x100,0x79,0x8200,0xe6,0x20,
+0x306,0x8200,0xe6,0x20,0x307,0x8200,0xe6,0x20,0x30a,0x8200,0xca,0x20,0x328,0x8200,0xe6,0x20,
+0x303,0x8200,0xe6,0x20,0x30b,0x100,0x263,0x100,0x6c,0x100,0x73,0x100,0x78,0x100,0x295,0x8200,
+0xe6,0x20,0x301,0x100,0x3b2,0x100,0x3b8,0x100,0x3c6,0x100,0x3c0,0x100,0x3ba,0x100,0x3c1,0x100,
+0x398,0x100,0x3b5,0x200,0x565,0x582,0x200,0x627,0x674,0x200,0x648,0x674,0x200,0x6c7,0x674,0x200,
+0x64a,0x674,0x200,0xe4d,0xe32,0x200,0xecd,0xeb2,0x200,0xeab,0xe99,0x200,0xeab,0xea1,0x100,0xf0b,
+0x8300,0x82,0xfb2,0xf71,0xf80,0x8300,0x82,0xfb3,0xf71,0xf80,0x100,0x10dc,0x100,0x61,0x100,0x250,
+0x100,0x251,0x100,0x1d02,0x100,0x62,0x100,0x64,0x100,0x65,0x100,0x259,0x100,0x25b,0x100,0x25c,
+0x100,0x67,0x100,0x6b,0x100,0x6d,0x100,0x14b,0x100,0x6f,0x100,0x254,0x100,0x1d16,0x100,0x1d17,
+0x100,0x70,0x100,0x74,0x100,0x75,0x100,0x1d1d,0x100,0x26f,0x100,0x76,0x100,0x1d25,0x100,0x3b2,
+0x100,0x3b3,0x100,0x3b4,0x100,0x3c6,0x100,0x3c7,0x100,0x69,0x100,0x72,0x100,0x75,0x100,0x76,
+0x100,0x3b2,0x100,0x3b3,0x100,0x3c1,0x100,0x3c6,0x100,0x3c7,0x100,0x43d,0x100,0x252,0x100,0x63,
+0x100,0x255,0x100,0xf0,0x100,0x25c,0x100,0x66,0x100,0x25f,0x100,0x261,0x100,0x265,0x100,0x268,
+0x100,0x269,0x100,0x26a,0x100,0x1d7b,0x100,0x29d,0x100,0x26d,0x100,0x1d85,0x100,0x29f,0x100,0x271,
+0x100,0x270,0x100,0x272,0x100,0x273,0x100,0x274,0x100,0x275,0x100,0x278,0x100,0x282,0x100,0x283,
+0x100,0x1ab,0x100,0x289,0x100,0x28a,0x100,0x1d1c,0x100,0x28b,0x100,0x28c,0x100,0x7a,0x100,0x290,
+0x100,0x291,0x100,0x292,0x100,0x3b8,0x200,0x61,0x2be,0x8200,0xe6,0x20,0x313,0x65c,0x8200,0xe6,
+0x20,0x313,0x8200,0xe6,0x20,0x342,0x662,0x8200,0xe6,0x20,0x314,0x100,0x20,0x100,0x20,0x100,
+0x20,0x100,0x20,0x100,0x20,0x100,0x20,0x100,0x20,0x100,0x20,0x100,0x20,0x100,0x2010,0x8200,
+0xdc,0x20,0x333,0x100,0x2e,0x200,0x2e,0x2e,0x300,0x2e,0x2e,0x2e,0x100,0x20,0x200,0x2032,
+0x2032,0x300,0x2032,0x2032,0x2032,0x200,0x2035,0x2035,0x300,0x2035,0x2035,0x2035,0x200,0x21,0x21,0x8200,
+0xe6,0x20,0x305,0x200,0x3f,0x3f,0x200,0x3f,0x21,0x200,0x21,0x3f,0x400,0x2032,0x2032,0x2032,
+0x2032,0x100,0x20,0x100,0x30,0x100,0x69,0x100,0x34,0x100,0x35,0x100,0x36,0x100,0x37,0x100,
+0x38,0x100,0x39,0x100,0x2b,0x100,0x2212,0x100,0x3d,0x100,0x28,0x100,0x29,0x100,0x6e,0x100,
+0x30,0x100,0x31,0x100,0x32,0x100,0x33,0x100,0x34,0x100,0x35,0x100,0x36,0x100,0x37,0x100,
+0x38,0x100,0x39,0x100,0x2b,0x100,0x2212,0x100,0x3d,0x100,0x28,0x100,0x29,0x100,0x61,0x100,
+0x65,0x100,0x6f,0x100,0x78,0x100,0x259,0x300,0x61,0x2f,0x63,0x300,0x61,0x2f,0x73,0x300,
+0x63,0x2f,0x6f,0x300,0x63,0x2f,0x75,0x100,0x67,0x100,0x68,0x100,0x127,0x100,0x6c,0x100,
+0x65,0x100,0x6f,0x100,0x5d0,0x100,0x5d1,0x100,0x5d2,0x100,0x5d3,0x100,0x69,0x100,0x3c0,0x100,
+0x3b3,0x100,0x2211,0x100,0x64,0x100,0x65,0x100,0x69,0x100,0x6a,0x300,0x31,0x2044,0x33,0x300,
+0x32,0x2044,0x33,0x300,0x31,0x2044,0x35,0x300,0x32,0x2044,0x35,0x300,0x33,0x2044,0x35,0x300,
+0x34,0x2044,0x35,0x300,0x31,0x2044,0x36,0x300,0x35,0x2044,0x36,0x300,0x31,0x2044,0x38,0x300,
+0x33,0x2044,0x38,0x300,0x35,0x2044,0x38,0x300,0x37,0x2044,0x38,0x200,0x31,0x2044,0x100,0x49,
+0x200,0x49,0x49,0x300,0x49,0x49,0x49,0x200,0x49,0x56,0x100,0x56,0x200,0x56,0x49,0x300,
+0x56,0x49,0x49,0x400,0x56,0x49,0x49,0x49,0x200,0x49,0x58,0x100,0x58,0x200,0x58,0x49,
+0x300,0x58,0x49,0x49,0x100,0x4c,0x100,0x43,0x100,0x44,0x100,0x4d,0x100,0x69,0x200,0x69,
+0x69,0x300,0x69,0x69,0x69,0x200,0x69,0x76,0x100,0x76,0x200,0x76,0x69,0x300,0x76,0x69,
+0x69,0x400,0x76,0x69,0x69,0x69,0x200,0x69,0x78,0x100,0x78,0x200,0x78,0x69,0x300,0x78,
+0x69,0x69,0x100,0x6c,0x100,0x63,0x100,0x64,0x100,0x6d,0x200,0x222b,0x222b,0x300,0x222b,0x222b,
+0x222b,0x200,0x222e,0x222e,0x300,0x222e,0x222e,0x222e,0x100,0x31,0x100,0x32,0x100,0x33,0x100,0x34,
+0x100,0x35,0x100,0x36,0x100,0x37,0x100,0x38,0x100,0x39,0x200,0x31,0x30,0x200,0x31,0x31,
+0x200,0x31,0x32,0x200,0x31,0x33,0x200,0x31,0x34,0x200,0x31,0x35,0x200,0x31,0x36,0x200,
+0x31,0x37,0x200,0x31,0x38,0x200,0x31,0x39,0x200,0x32,0x30,0x300,0x28,0x31,0x29,0x300,
+0x28,0x32,0x29,0x300,0x28,0x33,0x29,0x300,0x28,0x34,0x29,0x300,0x28,0x35,0x29,0x300,
+0x28,0x36,0x29,0x300,0x28,0x37,0x29,0x300,0x28,0x38,0x29,0x300,0x28,0x39,0x29,0x400,
+0x28,0x31,0x30,0x29,0x400,0x28,0x31,0x31,0x29,0x400,0x28,0x31,0x32,0x29,0x400,0x28,
+0x31,0x33,0x29,0x400,0x28,0x31,0x34,0x29,0x400,0x28,0x31,0x35,0x29,0x400,0x28,0x31,
+0x36,0x29,0x400,0x28,0x31,0x37,0x29,0x400,0x28,0x31,0x38,0x29,0x400,0x28,0x31,0x39,
+0x29,0x400,0x28,0x32,0x30,0x29,0x200,0x31,0x2e,0x200,0x32,0x2e,0x200,0x33,0x2e,0x200,
+0x34,0x2e,0x200,0x35,0x2e,0x200,0x36,0x2e,0x200,0x37,0x2e,0x200,0x38,0x2e,0x200,0x39,
+0x2e,0x300,0x31,0x30,0x2e,0x300,0x31,0x31,0x2e,0x300,0x31,0x32,0x2e,0x300,0x31,0x33,
+0x2e,0x300,0x31,0x34,0x2e,0x300,0x31,0x35,0x2e,0x300,0x31,0x36,0x2e,0x300,0x31,0x37,
+0x2e,0x300,0x31,0x38,0x2e,0x300,0x31,0x39,0x2e,0x300,0x32,0x30,0x2e,0x300,0x28,0x61,
+0x29,0x300,0x28,0x62,0x29,0x300,0x28,0x63,0x29,0x300,0x28,0x64,0x29,0x300,0x28,0x65,
+0x29,0x300,0x28,0x66,0x29,0x300,0x28,0x67,0x29,0x300,0x28,0x68,0x29,0x300,0x28,0x69,
+0x29,0x300,0x28,0x6a,0x29,0x300,0x28,0x6b,0x29,0x300,0x28,0x6c,0x29,0x300,0x28,0x6d,
+0x29,0x300,0x28,0x6e,0x29,0x300,0x28,0x6f,0x29,0x300,0x28,0x70,0x29,0x300,0x28,0x71,
+0x29,0x300,0x28,0x72,0x29,0x300,0x28,0x73,0x29,0x300,0x28,0x74,0x29,0x300,0x28,0x75,
+0x29,0x300,0x28,0x76,0x29,0x300,0x28,0x77,0x29,0x300,0x28,0x78,0x29,0x300,0x28,0x79,
+0x29,0x300,0x28,0x7a,0x29,0x100,0x41,0x100,0x42,0x100,0x43,0x100,0x44,0x100,0x45,0x100,
+0x46,0x100,0x47,0x100,0x48,0x100,0x49,0x100,0x4a,0x100,0x4b,0x100,0x4c,0x100,0x4d,0x100,
+0x4e,0x100,0x4f,0x100,0x50,0x100,0x51,0x100,0x52,0x100,0x53,0x100,0x54,0x100,0x55,0x100,
+0x56,0x100,0x57,0x100,0x58,0x100,0x59,0x100,0x5a,0x100,0x61,0x100,0x62,0x100,0x63,0x100,
+0x64,0x100,0x65,0x100,0x66,0x100,0x67,0x100,0x68,0x100,0x69,0x100,0x6a,0x100,0x6b,0x100,
+0x6c,0x100,0x6d,0x100,0x6e,0x100,0x6f,0x100,0x70,0x100,0x71,0x100,0x72,0x100,0x73,0x100,
+0x74,0x100,0x75,0x100,0x76,0x100,0x77,0x100,0x78,0x100,0x79,0x100,0x7a,0x100,0x30,0x400,
+0x222b,0x222b,0x222b,0x222b,0x300,0x3a,0x3a,0x3d,0x200,0x3d,0x3d,0x300,0x3d,0x3d,0x3d,0x100,
+0x2d61,0x100,0x6bcd,0x100,0x9f9f,0x100,0x4e00,0x100,0x4e28,0x100,0x4e36,0x100,0x4e3f,0x100,0x4e59,0x100,
+0x4e85,0x100,0x4e8c,0x100,0x4ea0,0x100,0x4eba,0x100,0x513f,0x100,0x5165,0x100,0x516b,0x100,0x5182,0x100,
+0x5196,0x100,0x51ab,0x100,0x51e0,0x100,0x51f5,0x100,0x5200,0x100,0x529b,0x100,0x52f9,0x100,0x5315,0x100,
+0x531a,0x100,0x5338,0x100,0x5341,0x100,0x535c,0x100,0x5369,0x100,0x5382,0x100,0x53b6,0x100,0x53c8,0x100,
+0x53e3,0x100,0x56d7,0x100,0x571f,0x100,0x58eb,0x100,0x5902,0x100,0x590a,0x100,0x5915,0x100,0x5927,0x100,
+0x5973,0x100,0x5b50,0x100,0x5b80,0x100,0x5bf8,0x100,0x5c0f,0x100,0x5c22,0x100,0x5c38,0x100,0x5c6e,0x100,
+0x5c71,0x100,0x5ddb,0x100,0x5de5,0x100,0x5df1,0x100,0x5dfe,0x100,0x5e72,0x100,0x5e7a,0x100,0x5e7f,0x100,
+0x5ef4,0x100,0x5efe,0x100,0x5f0b,0x100,0x5f13,0x100,0x5f50,0x100,0x5f61,0x100,0x5f73,0x100,0x5fc3,0x100,
+0x6208,0x100,0x6236,0x100,0x624b,0x100,0x652f,0x100,0x6534,0x100,0x6587,0x100,0x6597,0x100,0x65a4,0x100,
+0x65b9,0x100,0x65e0,0x100,0x65e5,0x100,0x66f0,0x100,0x6708,0x100,0x6728,0x100,0x6b20,0x100,0x6b62,0x100,
+0x6b79,0x100,0x6bb3,0x100,0x6bcb,0x100,0x6bd4,0x100,0x6bdb,0x100,0x6c0f,0x100,0x6c14,0x100,0x6c34,0x100,
+0x706b,0x100,0x722a,0x100,0x7236,0x100,0x723b,0x100,0x723f,0x100,0x7247,0x100,0x7259,0x100,0x725b,0x100,
+0x72ac,0x100,0x7384,0x100,0x7389,0x100,0x74dc,0x100,0x74e6,0x100,0x7518,0x100,0x751f,0x100,0x7528,0x100,
+0x7530,0x100,0x758b,0x100,0x7592,0x100,0x7676,0x100,0x767d,0x100,0x76ae,0x100,0x76bf,0x100,0x76ee,0x100,
+0x77db,0x100,0x77e2,0x100,0x77f3,0x100,0x793a,0x100,0x79b8,0x100,0x79be,0x100,0x7a74,0x100,0x7acb,0x100,
+0x7af9,0x100,0x7c73,0x100,0x7cf8,0x100,0x7f36,0x100,0x7f51,0x100,0x7f8a,0x100,0x7fbd,0x100,0x8001,0x100,
+0x800c,0x100,0x8012,0x100,0x8033,0x100,0x807f,0x100,0x8089,0x100,0x81e3,0x100,0x81ea,0x100,0x81f3,0x100,
+0x81fc,0x100,0x820c,0x100,0x821b,0x100,0x821f,0x100,0x826e,0x100,0x8272,0x100,0x8278,0x100,0x864d,0x100,
+0x866b,0x100,0x8840,0x100,0x884c,0x100,0x8863,0x100,0x897e,0x100,0x898b,0x100,0x89d2,0x100,0x8a00,0x100,
+0x8c37,0x100,0x8c46,0x100,0x8c55,0x100,0x8c78,0x100,0x8c9d,0x100,0x8d64,0x100,0x8d70,0x100,0x8db3,0x100,
+0x8eab,0x100,0x8eca,0x100,0x8f9b,0x100,0x8fb0,0x100,0x8fb5,0x100,0x9091,0x100,0x9149,0x100,0x91c6,0x100,
+0x91cc,0x100,0x91d1,0x100,0x9577,0x100,0x9580,0x100,0x961c,0x100,0x96b6,0x100,0x96b9,0x100,0x96e8,0x100,
+0x9751,0x100,0x975e,0x100,0x9762,0x100,0x9769,0x100,0x97cb,0x100,0x97ed,0x100,0x97f3,0x100,0x9801,0x100,
+0x98a8,0x100,0x98db,0x100,0x98df,0x100,0x9996,0x100,0x9999,0x100,0x99ac,0x100,0x9aa8,0x100,0x9ad8,0x100,
+0x9adf,0x100,0x9b25,0x100,0x9b2f,0x100,0x9b32,0x100,0x9b3c,0x100,0x9b5a,0x100,0x9ce5,0x100,0x9e75,0x100,
+0x9e7f,0x100,0x9ea5,0x100,0x9ebb,0x100,0x9ec3,0x100,0x9ecd,0x100,0x9ed1,0x100,0x9ef9,0x100,0x9efd,0x100,
+0x9f0e,0x100,0x9f13,0x100,0x9f20,0x100,0x9f3b,0x100,0x9f4a,0x100,0x9f52,0x100,0x9f8d,0x100,0x9f9c,0x100,
+0x9fa0,0x100,0x20,0x100,0x3012,0x100,0x5341,0x100,0x5344,0x100,0x5345,0x8200,8,0x20,0x3099,0x8200,
+8,0x20,0x309a,0x200,0x3088,0x308a,0x200,0x30b3,0x30c8,0x100,0x1100,0x100,0x1101,0x100,0x11aa,0x100,
+0x1102,0x100,0x11ac,0x100,0x11ad,0x100,0x1103,0x100,0x1104,0x100,0x1105,0x100,0x11b0,0x100,0x11b1,0x100,
+0x11b2,0x100,0x11b3,0x100,0x11b4,0x100,0x11b5,0x100,0x111a,0x100,0x1106,0x100,0x1107,0x100,0x1108,0x100,
+0x1121,0x100,0x1109,0x100,0x110a,0x100,0x110b,0x100,0x110c,0x100,0x110d,0x100,0x110e,0x100,0x110f,0x100,
+0x1110,0x100,0x1111,0x100,0x1112,0x100,0x1161,0x100,0x1162,0x100,0x1163,0x100,0x1164,0x100,0x1165,0x100,
+0x1166,0x100,0x1167,0x100,0x1168,0x100,0x1169,0x100,0x116a,0x100,0x116b,0x100,0x116c,0x100,0x116d,0x100,
+0x116e,0x100,0x116f,0x100,0x1170,0x100,0x1171,0x100,0x1172,0x100,0x1173,0x100,0x1174,0x100,0x1175,0x100,
+0x1160,0x100,0x1114,0x100,0x1115,0x100,0x11c7,0x100,0x11c8,0x100,0x11cc,0x100,0x11ce,0x100,0x11d3,0x100,
+0x11d7,0x100,0x11d9,0x100,0x111c,0x100,0x11dd,0x100,0x11df,0x100,0x111d,0x100,0x111e,0x100,0x1120,0x100,
+0x1122,0x100,0x1123,0x100,0x1127,0x100,0x1129,0x100,0x112b,0x100,0x112c,0x100,0x112d,0x100,0x112e,0x100,
+0x112f,0x100,0x1132,0x100,0x1136,0x100,0x1140,0x100,0x1147,0x100,0x114c,0x100,0x11f1,0x100,0x11f2,0x100,
+0x1157,0x100,0x1158,0x100,0x1159,0x100,0x1184,0x100,0x1185,0x100,0x1188,0x100,0x1191,0x100,0x1192,0x100,
+0x1194,0x100,0x119e,0x100,0x11a1,0x100,0x4e00,0x100,0x4e8c,0x100,0x4e09,0x100,0x56db,0x100,0x4e0a,0x100,
+0x4e2d,0x100,0x4e0b,0x100,0x7532,0x100,0x4e59,0x100,0x4e19,0x100,0x4e01,0x100,0x5929,0x100,0x5730,0x100,
+0x4eba,0x300,0x28,0x1100,0x29,0x300,0x28,0x1102,0x29,0x300,0x28,0x1103,0x29,0x300,0x28,0x1105,
+0x29,0x300,0x28,0x1106,0x29,0x300,0x28,0x1107,0x29,0x300,0x28,0x1109,0x29,0x300,0x28,0x110b,
+0x29,0x300,0x28,0x110c,0x29,0x300,0x28,0x110e,0x29,0x300,0x28,0x110f,0x29,0x300,0x28,0x1110,
+0x29,0x300,0x28,0x1111,0x29,0x300,0x28,0x1112,0x29,0x400,0x28,0x1100,0x1161,0x29,0x400,0x28,
+0x1102,0x1161,0x29,0x400,0x28,0x1103,0x1161,0x29,0x400,0x28,0x1105,0x1161,0x29,0x400,0x28,0x1106,
+0x1161,0x29,0x400,0x28,0x1107,0x1161,0x29,0x400,0x28,0x1109,0x1161,0x29,0x400,0x28,0x110b,0x1161,
+0x29,0x400,0x28,0x110c,0x1161,0x29,0x400,0x28,0x110e,0x1161,0x29,0x400,0x28,0x110f,0x1161,0x29,
+0x400,0x28,0x1110,0x1161,0x29,0x400,0x28,0x1111,0x1161,0x29,0x400,0x28,0x1112,0x1161,0x29,0x400,
+0x28,0x110c,0x116e,0x29,0x700,0x28,0x110b,0x1169,0x110c,0x1165,0x11ab,0x29,0x600,0x28,0x110b,0x1169,
+0x1112,0x116e,0x29,0x300,0x28,0x4e00,0x29,0x300,0x28,0x4e8c,0x29,0x300,0x28,0x4e09,0x29,0x300,
+0x28,0x56db,0x29,0x300,0x28,0x4e94,0x29,0x300,0x28,0x516d,0x29,0x300,0x28,0x4e03,0x29,0x300,
+0x28,0x516b,0x29,0x300,0x28,0x4e5d,0x29,0x300,0x28,0x5341,0x29,0x300,0x28,0x6708,0x29,0x300,
+0x28,0x706b,0x29,0x300,0x28,0x6c34,0x29,0x300,0x28,0x6728,0x29,0x300,0x28,0x91d1,0x29,0x300,
+0x28,0x571f,0x29,0x300,0x28,0x65e5,0x29,0x300,0x28,0x682a,0x29,0x300,0x28,0x6709,0x29,0x300,
+0x28,0x793e,0x29,0x300,0x28,0x540d,0x29,0x300,0x28,0x7279,0x29,0x300,0x28,0x8ca1,0x29,0x300,
+0x28,0x795d,0x29,0x300,0x28,0x52b4,0x29,0x300,0x28,0x4ee3,0x29,0x300,0x28,0x547c,0x29,0x300,
+0x28,0x5b66,0x29,0x300,0x28,0x76e3,0x29,0x300,0x28,0x4f01,0x29,0x300,0x28,0x8cc7,0x29,0x300,
+0x28,0x5354,0x29,0x300,0x28,0x796d,0x29,0x300,0x28,0x4f11,0x29,0x300,0x28,0x81ea,0x29,0x300,
+0x28,0x81f3,0x29,0x200,0x32,0x31,0x200,0x32,0x32,0x200,0x32,0x33,0x200,0x32,0x34,0x200,
+0x32,0x35,0x200,0x32,0x36,0x200,0x32,0x37,0x200,0x32,0x38,0x200,0x32,0x39,0x200,0x33,
+0x30,0x200,0x33,0x31,0x200,0x33,0x32,0x200,0x33,0x33,0x200,0x33,0x34,0x200,0x33,0x35,
+0x100,0x1100,0x100,0x1102,0x100,0x1103,0x100,0x1105,0x100,0x1106,0x100,0x1107,0x100,0x1109,0x100,0x110b,
+0x100,0x110c,0x100,0x110e,0x100,0x110f,0x100,0x1110,0x100,0x1111,0x100,0x1112,0x200,0x1100,0x1161,0x200,
+0x1102,0x1161,0x200,0x1103,0x1161,0x200,0x1105,0x1161,0x200,0x1106,0x1161,0x200,0x1107,0x1161,0x200,0x1109,
+0x1161,0x200,0x110b,0x1161,0x200,0x110c,0x1161,0x200,0x110e,0x1161,0x200,0x110f,0x1161,0x200,0x1110,0x1161,
+0x200,0x1111,0x1161,0x200,0x1112,0x1161,0x500,0x110e,0x1161,0x11b7,0x1100,0x1169,0x400,0x110c,0x116e,0x110b,
+0x1174,0x200,0x110b,0x116e,0x100,0x4e00,0x100,0x4e8c,0x100,0x4e09,0x100,0x56db,0x100,0x4e94,0x100,0x516d,
+0x100,0x4e03,0x100,0x516b,0x100,0x4e5d,0x100,0x5341,0x100,0x6708,0x100,0x706b,0x100,0x6c34,0x100,0x6728,
+0x100,0x91d1,0x100,0x571f,0x100,0x65e5,0x100,0x682a,0x100,0x6709,0x100,0x793e,0x100,0x540d,0x100,0x7279,
+0x100,0x8ca1,0x100,0x795d,0x100,0x52b4,0x100,0x79d8,0x100,0x7537,0x100,0x5973,0x100,0x9069,0x100,0x512a,
+0x100,0x5370,0x100,0x6ce8,0x100,0x9805,0x100,0x4f11,0x100,0x5199,0x100,0x6b63,0x100,0x4e0a,0x100,0x4e2d,
+0x100,0x4e0b,0x100,0x5de6,0x100,0x53f3,0x100,0x533b,0x100,0x5b97,0x100,0x5b66,0x100,0x76e3,0x100,0x4f01,
+0x100,0x8cc7,0x100,0x5354,0x100,0x591c,0x200,0x33,0x36,0x200,0x33,0x37,0x200,0x33,0x38,0x200,
+0x33,0x39,0x200,0x34,0x30,0x200,0x34,0x31,0x200,0x34,0x32,0x200,0x34,0x33,0x200,0x34,
+0x34,0x200,0x34,0x35,0x200,0x34,0x36,0x200,0x34,0x37,0x200,0x34,0x38,0x200,0x34,0x39,
+0x200,0x35,0x30,0x200,0x31,0x6708,0x200,0x32,0x6708,0x200,0x33,0x6708,0x200,0x34,0x6708,0x200,
+0x35,0x6708,0x200,0x36,0x6708,0x200,0x37,0x6708,0x200,0x38,0x6708,0x200,0x39,0x6708,0x300,0x31,
+0x30,0x6708,0x300,0x31,0x31,0x6708,0x300,0x31,0x32,0x6708,0x300,0x65,0x72,0x67,0x100,0x30a2,
+0x100,0x30a4,0x100,0x30a6,0x100,0x30a8,0x100,0x30aa,0x100,0x30ab,0x100,0x30ad,0x100,0x30af,0x100,0x30b1,
+0x100,0x30b3,0x100,0x30b5,0x100,0x30b7,0x100,0x30b9,0x100,0x30bb,0x100,0x30bd,0x100,0x30bf,0x100,0x30c1,
+0x100,0x30c4,0x100,0x30c6,0x100,0x30c8,0x100,0x30ca,0x100,0x30cb,0x100,0x30cc,0x100,0x30cd,0x100,0x30ce,
+0x100,0x30cf,0x100,0x30d2,0x100,0x30d5,0x100,0x30d8,0x100,0x30db,0x100,0x30de,0x100,0x30df,0x100,0x30e0,
+0x100,0x30e1,0x100,0x30e2,0x100,0x30e4,0x100,0x30e6,0x100,0x30e8,0x100,0x30e9,0x100,0x30ea,0x100,0x30eb,
+0x100,0x30ec,0x100,0x30ed,0x100,0x30ef,0x100,0x30f0,0x100,0x30f1,0x100,0x30f2,0x500,0x30a2,0x30cf,0x309a,
+0x30fc,0x30c8,0x400,0x30a2,0x30eb,0x30d5,0x30a1,0x500,0x30a2,0x30f3,0x30d8,0x309a,0x30a2,0x300,0x30a2,0x30fc,
+0x30eb,0x8500,8,0x30a4,0x30cb,0x30f3,0x30af,0x3099,0x300,0x30a4,0x30f3,0x30c1,0x300,0x30a6,0x30a9,0x30f3,
+0x8600,8,0x30a8,0x30b9,0x30af,0x30fc,0x30c8,0x3099,0x400,0x30a8,0x30fc,0x30ab,0x30fc,0x300,0x30aa,0x30f3,
+0x30b9,0x300,0x30aa,0x30fc,0x30e0,0x300,0x30ab,0x30a4,0x30ea,0x400,0x30ab,0x30e9,0x30c3,0x30c8,0x400,0x30ab,
+0x30ed,0x30ea,0x30fc,0x400,0x30ab,0x3099,0x30ed,0x30f3,0x400,0x30ab,0x3099,0x30f3,0x30de,0x8400,8,0x30ad,
+0x3099,0x30ab,0x3099,0x400,0x30ad,0x3099,0x30cb,0x30fc,0x400,0x30ad,0x30e5,0x30ea,0x30fc,0x600,0x30ad,0x3099,
+0x30eb,0x30bf,0x3099,0x30fc,0x200,0x30ad,0x30ed,0x600,0x30ad,0x30ed,0x30af,0x3099,0x30e9,0x30e0,0x600,0x30ad,
+0x30ed,0x30e1,0x30fc,0x30c8,0x30eb,0x500,0x30ad,0x30ed,0x30ef,0x30c3,0x30c8,0x400,0x30af,0x3099,0x30e9,0x30e0,
+0x600,0x30af,0x3099,0x30e9,0x30e0,0x30c8,0x30f3,0x600,0x30af,0x30eb,0x30bb,0x3099,0x30a4,0x30ed,0x400,0x30af,
+0x30ed,0x30fc,0x30cd,0x300,0x30b1,0x30fc,0x30b9,0x300,0x30b3,0x30eb,0x30ca,0x8400,8,0x30b3,0x30fc,0x30db,
+0x309a,0x400,0x30b5,0x30a4,0x30af,0x30eb,0x500,0x30b5,0x30f3,0x30c1,0x30fc,0x30e0,0x8500,8,0x30b7,0x30ea,
+0x30f3,0x30af,0x3099,0x300,0x30bb,0x30f3,0x30c1,0x300,0x30bb,0x30f3,0x30c8,0x400,0x30bf,0x3099,0x30fc,0x30b9,
+0x300,0x30c6,0x3099,0x30b7,0x300,0x30c8,0x3099,0x30eb,0x200,0x30c8,0x30f3,0x200,0x30ca,0x30ce,0x300,0x30ce,
+0x30c3,0x30c8,0x300,0x30cf,0x30a4,0x30c4,0x600,0x30cf,0x309a,0x30fc,0x30bb,0x30f3,0x30c8,0x400,0x30cf,0x309a,
+0x30fc,0x30c4,0x500,0x30cf,0x3099,0x30fc,0x30ec,0x30eb,0x600,0x30d2,0x309a,0x30a2,0x30b9,0x30c8,0x30eb,0x400,
+0x30d2,0x309a,0x30af,0x30eb,0x300,0x30d2,0x309a,0x30b3,0x300,0x30d2,0x3099,0x30eb,0x8600,8,0x30d5,0x30a1,
+0x30e9,0x30c3,0x30c8,0x3099,0x400,0x30d5,0x30a3,0x30fc,0x30c8,0x600,0x30d5,0x3099,0x30c3,0x30b7,0x30a7,0x30eb,
+0x300,0x30d5,0x30e9,0x30f3,0x500,0x30d8,0x30af,0x30bf,0x30fc,0x30eb,0x300,0x30d8,0x309a,0x30bd,0x400,0x30d8,
+0x309a,0x30cb,0x30d2,0x300,0x30d8,0x30eb,0x30c4,0x400,0x30d8,0x309a,0x30f3,0x30b9,0x8500,8,0x30d8,0x309a,
+0x30fc,0x30b7,0x3099,0x400,0x30d8,0x3099,0x30fc,0x30bf,0x500,0x30db,0x309a,0x30a4,0x30f3,0x30c8,0x400,0x30db,
+0x3099,0x30eb,0x30c8,0x200,0x30db,0x30f3,0x8500,8,0x30db,0x309a,0x30f3,0x30c8,0x3099,0x300,0x30db,0x30fc,
+0x30eb,0x300,0x30db,0x30fc,0x30f3,0x400,0x30de,0x30a4,0x30af,0x30ed,0x300,0x30de,0x30a4,0x30eb,0x300,0x30de,
+0x30c3,0x30cf,0x300,0x30de,0x30eb,0x30af,0x500,0x30de,0x30f3,0x30b7,0x30e7,0x30f3,0x400,0x30df,0x30af,0x30ed,
+0x30f3,0x200,0x30df,0x30ea,0x600,0x30df,0x30ea,0x30cf,0x3099,0x30fc,0x30eb,0x8300,8,0x30e1,0x30ab,0x3099,
+0x500,0x30e1,0x30ab,0x3099,0x30c8,0x30f3,0x400,0x30e1,0x30fc,0x30c8,0x30eb,0x8400,8,0x30e4,0x30fc,0x30c8,
+0x3099,0x300,0x30e4,0x30fc,0x30eb,0x300,0x30e6,0x30a2,0x30f3,0x400,0x30ea,0x30c3,0x30c8,0x30eb,0x200,0x30ea,
+0x30e9,0x400,0x30eb,0x30d2,0x309a,0x30fc,0x500,0x30eb,0x30fc,0x30d5,0x3099,0x30eb,0x200,0x30ec,0x30e0,0x600,
+0x30ec,0x30f3,0x30c8,0x30b1,0x3099,0x30f3,0x300,0x30ef,0x30c3,0x30c8,0x200,0x30,0x70b9,0x200,0x31,0x70b9,
+0x200,0x32,0x70b9,0x200,0x33,0x70b9,0x200,0x34,0x70b9,0x200,0x35,0x70b9,0x200,0x36,0x70b9,0x200,
+0x37,0x70b9,0x200,0x38,0x70b9,0x200,0x39,0x70b9,0x300,0x31,0x30,0x70b9,0x300,0x31,0x31,0x70b9,
+0x300,0x31,0x32,0x70b9,0x300,0x31,0x33,0x70b9,0x300,0x31,0x34,0x70b9,0x300,0x31,0x35,0x70b9,
+0x300,0x31,0x36,0x70b9,0x300,0x31,0x37,0x70b9,0x300,0x31,0x38,0x70b9,0x300,0x31,0x39,0x70b9,
+0x300,0x32,0x30,0x70b9,0x300,0x32,0x31,0x70b9,0x300,0x32,0x32,0x70b9,0x300,0x32,0x33,0x70b9,
+0x300,0x32,0x34,0x70b9,0x200,0x64,0x61,0x300,0x62,0x61,0x72,0x200,0x70,0x63,0x200,0x64,
+0x6d,0x300,0x64,0x6d,0x32,0x300,0x64,0x6d,0x33,0x200,0x5e73,0x6210,0x200,0x662d,0x548c,0x200,
+0x5927,0x6b63,0x200,0x660e,0x6cbb,0x400,0x682a,0x5f0f,0x4f1a,0x793e,0x300,0x63,0x61,0x6c,0x400,0x6b,
+0x63,0x61,0x6c,0x200,0x3bc,0x67,0x200,0x6d,0x67,0x200,0x6b,0x67,0x200,0x3bc,0x6c,0x200,
+0x6d,0x6c,0x200,0x64,0x6c,0x200,0x6b,0x6c,0x200,0x66,0x6d,0x200,0x6e,0x6d,0x200,0x3bc,
+0x6d,0x200,0x6d,0x6d,0x200,0x63,0x6d,0x200,0x6b,0x6d,0x300,0x6d,0x6d,0x32,0x300,0x63,
+0x6d,0x32,0x200,0x6d,0x32,0x300,0x6b,0x6d,0x32,0x300,0x6d,0x6d,0x33,0x300,0x63,0x6d,
+0x33,0x200,0x6d,0x33,0x300,0x6b,0x6d,0x33,0x300,0x6d,0x2215,0x73,0x400,0x6d,0x2215,0x73,
+0x32,0x300,0x72,0x61,0x64,0x500,0x72,0x61,0x64,0x2215,0x73,0x600,0x72,0x61,0x64,0x2215,
+0x73,0x32,0x200,0x70,0x73,0x200,0x6e,0x73,0x200,0x3bc,0x73,0x200,0x6d,0x73,0x400,0x61,
+0x2e,0x6d,0x2e,0x200,0x63,0x63,0x200,0x63,0x64,0x200,0x68,0x61,0x200,0x69,0x6e,0x200,
+0x6b,0x74,0x200,0x6c,0x6d,0x200,0x6c,0x6e,0x300,0x6c,0x6f,0x67,0x200,0x6c,0x78,0x200,
+0x6d,0x62,0x300,0x6d,0x69,0x6c,0x300,0x6d,0x6f,0x6c,0x400,0x70,0x2e,0x6d,0x2e,0x200,
+0x73,0x72,0x200,0x31,0x65e5,0x200,0x32,0x65e5,0x200,0x33,0x65e5,0x200,0x34,0x65e5,0x200,0x35,
+0x65e5,0x200,0x36,0x65e5,0x200,0x37,0x65e5,0x200,0x38,0x65e5,0x200,0x39,0x65e5,0x300,0x31,0x30,
+0x65e5,0x300,0x31,0x31,0x65e5,0x300,0x31,0x32,0x65e5,0x300,0x31,0x33,0x65e5,0x300,0x31,0x34,
+0x65e5,0x300,0x31,0x35,0x65e5,0x300,0x31,0x36,0x65e5,0x300,0x31,0x37,0x65e5,0x300,0x31,0x38,
+0x65e5,0x300,0x31,0x39,0x65e5,0x300,0x32,0x30,0x65e5,0x300,0x32,0x31,0x65e5,0x300,0x32,0x32,
+0x65e5,0x300,0x32,0x33,0x65e5,0x300,0x32,0x34,0x65e5,0x300,0x32,0x35,0x65e5,0x300,0x32,0x36,
+0x65e5,0x300,0x32,0x37,0x65e5,0x300,0x32,0x38,0x65e5,0x300,0x32,0x39,0x65e5,0x300,0x33,0x30,
+0x65e5,0x300,0x33,0x31,0x65e5,0x300,0x67,0x61,0x6c,0x200,0x66,0x66,0x200,0x66,0x69,0x200,
+0x66,0x6c,0x300,0x66,0x66,0x69,0x300,0x66,0x66,0x6c,0x200,0x73,0x74,0x200,0x73,0x74,
+0x200,0x574,0x576,0x200,0x574,0x565,0x200,0x574,0x56b,0x200,0x57e,0x576,0x200,0x574,0x56d,0x100,
+0x5e2,0x100,0x5d0,0x100,0x5d3,0x100,0x5d4,0x100,0x5db,0x100,0x5dc,0x100,0x5dd,0x100,0x5e8,0x100,
+0x5ea,0x100,0x2b,0x200,0x5d0,0x5dc,0x100,0x671,0x100,0x671,0x100,0x67b,0x100,0x67b,0x100,0x67b,
+0x100,0x67b,0x100,0x67e,0x100,0x67e,0x100,0x67e,0x100,0x67e,0x100,0x680,0x100,0x680,0x100,0x680,
+0x100,0x680,0x100,0x67a,0x100,0x67a,0x100,0x67a,0x100,0x67a,0x100,0x67f,0x100,0x67f,0x100,0x67f,
+0x100,0x67f,0x100,0x679,0x100,0x679,0x100,0x679,0x100,0x679,0x100,0x6a4,0x100,0x6a4,0x100,0x6a4,
+0x100,0x6a4,0x100,0x6a6,0x100,0x6a6,0x100,0x6a6,0x100,0x6a6,0x100,0x684,0x100,0x684,0x100,0x684,
+0x100,0x684,0x100,0x683,0x100,0x683,0x100,0x683,0x100,0x683,0x100,0x686,0x100,0x686,0x100,0x686,
+0x100,0x686,0x100,0x687,0x100,0x687,0x100,0x687,0x100,0x687,0x100,0x68d,0x100,0x68d,0x100,0x68c,
+0x100,0x68c,0x100,0x68e,0x100,0x68e,0x100,0x688,0x100,0x688,0x100,0x698,0x100,0x698,0x100,0x691,
+0x100,0x691,0x100,0x6a9,0x100,0x6a9,0x100,0x6a9,0x100,0x6a9,0x100,0x6af,0x100,0x6af,0x100,0x6af,
+0x100,0x6af,0x100,0x6b3,0x100,0x6b3,0x100,0x6b3,0x100,0x6b3,0x100,0x6b1,0x100,0x6b1,0x100,0x6b1,
+0x100,0x6b1,0x100,0x6ba,0x100,0x6ba,0x100,0x6bb,0x100,0x6bb,0x100,0x6bb,0x100,0x6bb,0x8200,0xe6,
+0x6d5,0x654,0x8200,0xe6,0x6d5,0x654,0x100,0x6c1,0x100,0x6c1,0x100,0x6c1,0x100,0x6c1,0x100,0x6be,
+0x100,0x6be,0x100,0x6be,0x100,0x6be,0x100,0x6d2,0x100,0x6d2,0x8200,0xe6,0x6d2,0x654,0x8200,0xe6,
+0x6d2,0x654,0x100,0x6ad,0x100,0x6ad,0x100,0x6ad,0x100,0x6ad,0x100,0x6c7,0x100,0x6c7,0x100,0x6c6,
+0x100,0x6c6,0x100,0x6c8,0x100,0x6c8,0x200,0x6c7,0x674,0x100,0x6cb,0x100,0x6cb,0x100,0x6c5,0x100,
+0x6c5,0x100,0x6c9,0x100,0x6c9,0x100,0x6d0,0x100,0x6d0,0x100,0x6d0,0x100,0x6d0,0x100,0x649,0x100,
+0x649,0x300,0x64a,0x654,0x627,0x300,0x64a,0x654,0x627,0x300,0x64a,0x654,0x6d5,0x300,0x64a,0x654,
+0x6d5,0x300,0x64a,0x654,0x648,0x300,0x64a,0x654,0x648,0x300,0x64a,0x654,0x6c7,0x300,0x64a,0x654,
+0x6c7,0x300,0x64a,0x654,0x6c6,0x300,0x64a,0x654,0x6c6,0x300,0x64a,0x654,0x6c8,0x300,0x64a,0x654,
+0x6c8,0x300,0x64a,0x654,0x6d0,0x300,0x64a,0x654,0x6d0,0x300,0x64a,0x654,0x6d0,0x300,0x64a,0x654,
+0x649,0x300,0x64a,0x654,0x649,0x300,0x64a,0x654,0x649,0x100,0x6cc,0x100,0x6cc,0x100,0x6cc,0x100,
+0x6cc,0x300,0x64a,0x654,0x62c,0x300,0x64a,0x654,0x62d,0x300,0x64a,0x654,0x645,0x300,0x64a,0x654,
+0x649,0x300,0x64a,0x654,0x64a,0x200,0x628,0x62c,0x200,0x628,0x62d,0x200,0x628,0x62e,0x200,0x628,
+0x645,0x200,0x628,0x649,0x200,0x628,0x64a,0x200,0x62a,0x62c,0x200,0x62a,0x62d,0x200,0x62a,0x62e,
+0x200,0x62a,0x645,0x200,0x62a,0x649,0x200,0x62a,0x64a,0x200,0x62b,0x62c,0x200,0x62b,0x645,0x200,
+0x62b,0x649,0x200,0x62b,0x64a,0x200,0x62c,0x62d,0x200,0x62c,0x645,0x200,0x62d,0x62c,0x200,0x62d,
+0x645,0x200,0x62e,0x62c,0x200,0x62e,0x62d,0x200,0x62e,0x645,0x200,0x633,0x62c,0x200,0x633,0x62d,
+0x200,0x633,0x62e,0x200,0x633,0x645,0x200,0x635,0x62d,0x200,0x635,0x645,0x200,0x636,0x62c,0x200,
+0x636,0x62d,0x200,0x636,0x62e,0x200,0x636,0x645,0x200,0x637,0x62d,0x200,0x637,0x645,0x200,0x638,
+0x645,0x200,0x639,0x62c,0x200,0x639,0x645,0x200,0x63a,0x62c,0x200,0x63a,0x645,0x200,0x641,0x62c,
+0x200,0x641,0x62d,0x200,0x641,0x62e,0x200,0x641,0x645,0x200,0x641,0x649,0x200,0x641,0x64a,0x200,
+0x642,0x62d,0x200,0x642,0x645,0x200,0x642,0x649,0x200,0x642,0x64a,0x200,0x643,0x627,0x200,0x643,
+0x62c,0x200,0x643,0x62d,0x200,0x643,0x62e,0x200,0x643,0x644,0x200,0x643,0x645,0x200,0x643,0x649,
+0x200,0x643,0x64a,0x200,0x644,0x62c,0x200,0x644,0x62d,0x200,0x644,0x62e,0x200,0x644,0x645,0x200,
+0x644,0x649,0x200,0x644,0x64a,0x200,0x645,0x62c,0x200,0x645,0x62d,0x200,0x645,0x62e,0x200,0x645,
+0x645,0x200,0x645,0x649,0x200,0x645,0x64a,0x200,0x646,0x62c,0x200,0x646,0x62d,0x200,0x646,0x62e,
+0x200,0x646,0x645,0x200,0x646,0x649,0x200,0x646,0x64a,0x200,0x647,0x62c,0x200,0x647,0x645,0x200,
+0x647,0x649,0x200,0x647,0x64a,0x200,0x64a,0x62c,0x200,0x64a,0x62d,0x200,0x64a,0x62e,0x200,0x64a,
+0x645,0x200,0x64a,0x649,0x200,0x64a,0x64a,0x8200,0x23,0x630,0x670,0x8200,0x23,0x631,0x670,0x8200,
+0x23,0x649,0x670,0x8300,0x21,0x20,0x64c,0x651,0x8300,0x21,0x20,0x64d,0x651,0x8300,0x21,0x20,
+0x64e,0x651,0x8300,0x21,0x20,0x64f,0x651,0x8300,0x21,0x20,0x650,0x651,0x8300,0x23,0x20,0x651,
+0x670,0x300,0x64a,0x654,0x631,0x300,0x64a,0x654,0x632,0x300,0x64a,0x654,0x645,0x300,0x64a,0x654,
+0x646,0x300,0x64a,0x654,0x649,0x300,0x64a,0x654,0x64a,0x200,0x628,0x631,0x200,0x628,0x632,0x200,
+0x628,0x645,0x200,0x628,0x646,0x200,0x628,0x649,0x200,0x628,0x64a,0x200,0x62a,0x631,0x200,0x62a,
+0x632,0x200,0x62a,0x645,0x200,0x62a,0x646,0x200,0x62a,0x649,0x200,0x62a,0x64a,0x200,0x62b,0x631,
+0x200,0x62b,0x632,0x200,0x62b,0x645,0x200,0x62b,0x646,0x200,0x62b,0x649,0x200,0x62b,0x64a,0x200,
+0x641,0x649,0x200,0x641,0x64a,0x200,0x642,0x649,0x200,0x642,0x64a,0x200,0x643,0x627,0x200,0x643,
+0x644,0x200,0x643,0x645,0x200,0x643,0x649,0x200,0x643,0x64a,0x200,0x644,0x645,0x200,0x644,0x649,
+0x200,0x644,0x64a,0x200,0x645,0x627,0x200,0x645,0x645,0x200,0x646,0x631,0x200,0x646,0x632,0x200,
+0x646,0x645,0x200,0x646,0x646,0x200,0x646,0x649,0x200,0x646,0x64a,0x8200,0x23,0x649,0x670,0x200,
+0x64a,0x631,0x200,0x64a,0x632,0x200,0x64a,0x645,0x200,0x64a,0x646,0x200,0x64a,0x649,0x200,0x64a,
+0x64a,0x300,0x64a,0x654,0x62c,0x300,0x64a,0x654,0x62d,0x300,0x64a,0x654,0x62e,0x300,0x64a,0x654,
+0x645,0x300,0x64a,0x654,0x647,0x200,0x628,0x62c,0x200,0x628,0x62d,0x200,0x628,0x62e,0x200,0x628,
+0x645,0x200,0x628,0x647,0x200,0x62a,0x62c,0x200,0x62a,0x62d,0x200,0x62a,0x62e,0x200,0x62a,0x645,
+0x200,0x62a,0x647,0x200,0x62b,0x645,0x200,0x62c,0x62d,0x200,0x62c,0x645,0x200,0x62d,0x62c,0x200,
+0x62d,0x645,0x200,0x62e,0x62c,0x200,0x62e,0x645,0x200,0x633,0x62c,0x200,0x633,0x62d,0x200,0x633,
+0x62e,0x200,0x633,0x645,0x200,0x635,0x62d,0x200,0x635,0x62e,0x200,0x635,0x645,0x200,0x636,0x62c,
+0x200,0x636,0x62d,0x200,0x636,0x62e,0x200,0x636,0x645,0x200,0x637,0x62d,0x200,0x638,0x645,0x200,
+0x639,0x62c,0x200,0x639,0x645,0x200,0x63a,0x62c,0x200,0x63a,0x645,0x200,0x641,0x62c,0x200,0x641,
+0x62d,0x200,0x641,0x62e,0x200,0x641,0x645,0x200,0x642,0x62d,0x200,0x642,0x645,0x200,0x643,0x62c,
+0x200,0x643,0x62d,0x200,0x643,0x62e,0x200,0x643,0x644,0x200,0x643,0x645,0x200,0x644,0x62c,0x200,
+0x644,0x62d,0x200,0x644,0x62e,0x200,0x644,0x645,0x200,0x644,0x647,0x200,0x645,0x62c,0x200,0x645,
+0x62d,0x200,0x645,0x62e,0x200,0x645,0x645,0x200,0x646,0x62c,0x200,0x646,0x62d,0x200,0x646,0x62e,
+0x200,0x646,0x645,0x200,0x646,0x647,0x200,0x647,0x62c,0x200,0x647,0x645,0x8200,0x23,0x647,0x670,
+0x200,0x64a,0x62c,0x200,0x64a,0x62d,0x200,0x64a,0x62e,0x200,0x64a,0x645,0x200,0x64a,0x647,0x300,
+0x64a,0x654,0x645,0x300,0x64a,0x654,0x647,0x200,0x628,0x645,0x200,0x628,0x647,0x200,0x62a,0x645,
+0x200,0x62a,0x647,0x200,0x62b,0x645,0x200,0x62b,0x647,0x200,0x633,0x645,0x200,0x633,0x647,0x200,
+0x634,0x645,0x200,0x634,0x647,0x200,0x643,0x644,0x200,0x643,0x645,0x200,0x644,0x645,0x200,0x646,
+0x645,0x200,0x646,0x647,0x200,0x64a,0x645,0x200,0x64a,0x647,0x8300,0x21,0x640,0x64e,0x651,0x8300,
+0x21,0x640,0x64f,0x651,0x8300,0x21,0x640,0x650,0x651,0x200,0x637,0x649,0x200,0x637,0x64a,0x200,
+0x639,0x649,0x200,0x639,0x64a,0x200,0x63a,0x649,0x200,0x63a,0x64a,0x200,0x633,0x649,0x200,0x633,
+0x64a,0x200,0x634,0x649,0x200,0x634,0x64a,0x200,0x62d,0x649,0x200,0x62d,0x64a,0x200,0x62c,0x649,
+0x200,0x62c,0x64a,0x200,0x62e,0x649,0x200,0x62e,0x64a,0x200,0x635,0x649,0x200,0x635,0x64a,0x200,
+0x636,0x649,0x200,0x636,0x64a,0x200,0x634,0x62c,0x200,0x634,0x62d,0x200,0x634,0x62e,0x200,0x634,
+0x645,0x200,0x634,0x631,0x200,0x633,0x631,0x200,0x635,0x631,0x200,0x636,0x631,0x200,0x637,0x649,
+0x200,0x637,0x64a,0x200,0x639,0x649,0x200,0x639,0x64a,0x200,0x63a,0x649,0x200,0x63a,0x64a,0x200,
+0x633,0x649,0x200,0x633,0x64a,0x200,0x634,0x649,0x200,0x634,0x64a,0x200,0x62d,0x649,0x200,0x62d,
+0x64a,0x200,0x62c,0x649,0x200,0x62c,0x64a,0x200,0x62e,0x649,0x200,0x62e,0x64a,0x200,0x635,0x649,
+0x200,0x635,0x64a,0x200,0x636,0x649,0x200,0x636,0x64a,0x200,0x634,0x62c,0x200,0x634,0x62d,0x200,
+0x634,0x62e,0x200,0x634,0x645,0x200,0x634,0x631,0x200,0x633,0x631,0x200,0x635,0x631,0x200,0x636,
+0x631,0x200,0x634,0x62c,0x200,0x634,0x62d,0x200,0x634,0x62e,0x200,0x634,0x645,0x200,0x633,0x647,
+0x200,0x634,0x647,0x200,0x637,0x645,0x200,0x633,0x62c,0x200,0x633,0x62d,0x200,0x633,0x62e,0x200,
+0x634,0x62c,0x200,0x634,0x62d,0x200,0x634,0x62e,0x200,0x637,0x645,0x200,0x638,0x645,0x8200,0x1b,
+0x627,0x64b,0x8200,0x1b,0x627,0x64b,0x300,0x62a,0x62c,0x645,0x300,0x62a,0x62d,0x62c,0x300,0x62a,
+0x62d,0x62c,0x300,0x62a,0x62d,0x645,0x300,0x62a,0x62e,0x645,0x300,0x62a,0x645,0x62c,0x300,0x62a,
+0x645,0x62d,0x300,0x62a,0x645,0x62e,0x300,0x62c,0x645,0x62d,0x300,0x62c,0x645,0x62d,0x300,0x62d,
+0x645,0x64a,0x300,0x62d,0x645,0x649,0x300,0x633,0x62d,0x62c,0x300,0x633,0x62c,0x62d,0x300,0x633,
+0x62c,0x649,0x300,0x633,0x645,0x62d,0x300,0x633,0x645,0x62d,0x300,0x633,0x645,0x62c,0x300,0x633,
+0x645,0x645,0x300,0x633,0x645,0x645,0x300,0x635,0x62d,0x62d,0x300,0x635,0x62d,0x62d,0x300,0x635,
+0x645,0x645,0x300,0x634,0x62d,0x645,0x300,0x634,0x62d,0x645,0x300,0x634,0x62c,0x64a,0x300,0x634,
+0x645,0x62e,0x300,0x634,0x645,0x62e,0x300,0x634,0x645,0x645,0x300,0x634,0x645,0x645,0x300,0x636,
+0x62d,0x649,0x300,0x636,0x62e,0x645,0x300,0x636,0x62e,0x645,0x300,0x637,0x645,0x62d,0x300,0x637,
+0x645,0x62d,0x300,0x637,0x645,0x645,0x300,0x637,0x645,0x64a,0x300,0x639,0x62c,0x645,0x300,0x639,
+0x645,0x645,0x300,0x639,0x645,0x645,0x300,0x639,0x645,0x649,0x300,0x63a,0x645,0x645,0x300,0x63a,
+0x645,0x64a,0x300,0x63a,0x645,0x649,0x300,0x641,0x62e,0x645,0x300,0x641,0x62e,0x645,0x300,0x642,
+0x645,0x62d,0x300,0x642,0x645,0x645,0x300,0x644,0x62d,0x645,0x300,0x644,0x62d,0x64a,0x300,0x644,
+0x62d,0x649,0x300,0x644,0x62c,0x62c,0x300,0x644,0x62c,0x62c,0x300,0x644,0x62e,0x645,0x300,0x644,
+0x62e,0x645,0x300,0x644,0x645,0x62d,0x300,0x644,0x645,0x62d,0x300,0x645,0x62d,0x62c,0x300,0x645,
+0x62d,0x645,0x300,0x645,0x62d,0x64a,0x300,0x645,0x62c,0x62d,0x300,0x645,0x62c,0x645,0x300,0x645,
+0x62e,0x62c,0x300,0x645,0x62e,0x645,0x300,0x645,0x62c,0x62e,0x300,0x647,0x645,0x62c,0x300,0x647,
+0x645,0x645,0x300,0x646,0x62d,0x645,0x300,0x646,0x62d,0x649,0x300,0x646,0x62c,0x645,0x300,0x646,
+0x62c,0x645,0x300,0x646,0x62c,0x649,0x300,0x646,0x645,0x64a,0x300,0x646,0x645,0x649,0x300,0x64a,
+0x645,0x645,0x300,0x64a,0x645,0x645,0x300,0x628,0x62e,0x64a,0x300,0x62a,0x62c,0x64a,0x300,0x62a,
+0x62c,0x649,0x300,0x62a,0x62e,0x64a,0x300,0x62a,0x62e,0x649,0x300,0x62a,0x645,0x64a,0x300,0x62a,
+0x645,0x649,0x300,0x62c,0x645,0x64a,0x300,0x62c,0x62d,0x649,0x300,0x62c,0x645,0x649,0x300,0x633,
+0x62e,0x649,0x300,0x635,0x62d,0x64a,0x300,0x634,0x62d,0x64a,0x300,0x636,0x62d,0x64a,0x300,0x644,
+0x62c,0x64a,0x300,0x644,0x645,0x64a,0x300,0x64a,0x62d,0x64a,0x300,0x64a,0x62c,0x64a,0x300,0x64a,
+0x645,0x64a,0x300,0x645,0x645,0x64a,0x300,0x642,0x645,0x64a,0x300,0x646,0x62d,0x64a,0x300,0x642,
+0x645,0x62d,0x300,0x644,0x62d,0x645,0x300,0x639,0x645,0x64a,0x300,0x643,0x645,0x64a,0x300,0x646,
+0x62c,0x62d,0x300,0x645,0x62e,0x64a,0x300,0x644,0x62c,0x645,0x300,0x643,0x645,0x645,0x300,0x644,
+0x62c,0x645,0x300,0x646,0x62c,0x62d,0x300,0x62c,0x62d,0x64a,0x300,0x62d,0x62c,0x64a,0x300,0x645,
+0x62c,0x64a,0x300,0x641,0x645,0x64a,0x300,0x628,0x62d,0x64a,0x300,0x643,0x645,0x645,0x300,0x639,
+0x62c,0x645,0x300,0x635,0x645,0x645,0x300,0x633,0x62e,0x64a,0x300,0x646,0x62c,0x64a,0x300,0x635,
+0x644,0x6d2,0x300,0x642,0x644,0x6d2,0x400,0x627,0x644,0x644,0x647,0x400,0x627,0x643,0x628,0x631,
+0x400,0x645,0x62d,0x645,0x62f,0x400,0x635,0x644,0x639,0x645,0x400,0x631,0x633,0x648,0x644,0x400,
+0x639,0x644,0x64a,0x647,0x400,0x648,0x633,0x644,0x645,0x300,0x635,0x644,0x649,0x1200,0x635,0x644,
+0x649,0x20,0x627,0x644,0x644,0x647,0x20,0x639,0x644,0x64a,0x647,0x20,0x648,0x633,0x644,0x645,
+0x800,0x62c,0x644,0x20,0x62c,0x644,0x627,0x644,0x647,0x400,0x631,0x6cc,0x627,0x644,0x100,0x2c,
+0x100,0x3001,0x100,0x3002,0x100,0x3a,0x100,0x3b,0x100,0x21,0x100,0x3f,0x100,0x3016,0x100,0x3017,
+0x300,0x2e,0x2e,0x2e,0x200,0x2e,0x2e,0x100,0x2014,0x100,0x2013,0x100,0x5f,0x100,0x5f,0x100,
+0x28,0x100,0x29,0x100,0x7b,0x100,0x7d,0x100,0x3014,0x100,0x3015,0x100,0x3010,0x100,0x3011,0x100,
+0x300a,0x100,0x300b,0x100,0x3008,0x100,0x3009,0x100,0x300c,0x100,0x300d,0x100,0x300e,0x100,0x300f,0x100,
+0x5b,0x100,0x5d,0x8200,0xe6,0x20,0x305,0x8200,0xe6,0x20,0x305,0x8200,0xe6,0x20,0x305,0x8200,
+0xe6,0x20,0x305,0x100,0x5f,0x100,0x5f,0x100,0x5f,0x100,0x2c,0x100,0x3001,0x100,0x2e,0x100,
+0x3b,0x100,0x3a,0x100,0x3f,0x100,0x21,0x100,0x2014,0x100,0x28,0x100,0x29,0x100,0x7b,0x100,
+0x7d,0x100,0x3014,0x100,0x3015,0x100,0x23,0x100,0x26,0x100,0x2a,0x100,0x2b,0x100,0x2d,0x100,
+0x3c,0x100,0x3e,0x100,0x3d,0x100,0x5c,0x100,0x24,0x100,0x25,0x100,0x40,0x8200,0x1b,0x20,
+0x64b,0x8200,0x1b,0x640,0x64b,0x8200,0x1c,0x20,0x64c,0x8200,0x1d,0x20,0x64d,0x8200,0x1e,0x20,
+0x64e,0x8200,0x1e,0x640,0x64e,0x8200,0x1f,0x20,0x64f,0x8200,0x1f,0x640,0x64f,0x8200,0x20,0x20,
+0x650,0x8200,0x20,0x640,0x650,0x8200,0x21,0x20,0x651,0x8200,0x21,0x640,0x651,0x8200,0x22,0x20,
+0x652,0x8200,0x22,0x640,0x652,0x100,0x621,0x8200,0xe6,0x627,0x653,0x8200,0xe6,0x627,0x653,0x8200,
+0xe6,0x627,0x654,0x8200,0xe6,0x627,0x654,0x8200,0xe6,0x648,0x654,0x8200,0xe6,0x648,0x654,0x8200,
+0xdc,0x627,0x655,0x8200,0xdc,0x627,0x655,0x8200,0xe6,0x64a,0x654,0x8200,0xe6,0x64a,0x654,0x8200,
+0xe6,0x64a,0x654,0x8200,0xe6,0x64a,0x654,0x100,0x627,0x100,0x627,0x100,0x628,0x100,0x628,0x100,
+0x628,0x100,0x628,0x100,0x629,0x100,0x629,0x100,0x62a,0x100,0x62a,0x100,0x62a,0x100,0x62a,0x100,
+0x62b,0x100,0x62b,0x100,0x62b,0x100,0x62b,0x100,0x62c,0x100,0x62c,0x100,0x62c,0x100,0x62c,0x100,
+0x62d,0x100,0x62d,0x100,0x62d,0x100,0x62d,0x100,0x62e,0x100,0x62e,0x100,0x62e,0x100,0x62e,0x100,
+0x62f,0x100,0x62f,0x100,0x630,0x100,0x630,0x100,0x631,0x100,0x631,0x100,0x632,0x100,0x632,0x100,
+0x633,0x100,0x633,0x100,0x633,0x100,0x633,0x100,0x634,0x100,0x634,0x100,0x634,0x100,0x634,0x100,
+0x635,0x100,0x635,0x100,0x635,0x100,0x635,0x100,0x636,0x100,0x636,0x100,0x636,0x100,0x636,0x100,
+0x637,0x100,0x637,0x100,0x637,0x100,0x637,0x100,0x638,0x100,0x638,0x100,0x638,0x100,0x638,0x100,
+0x639,0x100,0x639,0x100,0x639,0x100,0x639,0x100,0x63a,0x100,0x63a,0x100,0x63a,0x100,0x63a,0x100,
+0x641,0x100,0x641,0x100,0x641,0x100,0x641,0x100,0x642,0x100,0x642,0x100,0x642,0x100,0x642,0x100,
+0x643,0x100,0x643,0x100,0x643,0x100,0x643,0x100,0x644,0x100,0x644,0x100,0x644,0x100,0x644,0x100,
+0x645,0x100,0x645,0x100,0x645,0x100,0x645,0x100,0x646,0x100,0x646,0x100,0x646,0x100,0x646,0x100,
+0x647,0x100,0x647,0x100,0x647,0x100,0x647,0x100,0x648,0x100,0x648,0x100,0x649,0x100,0x649,0x100,
+0x64a,0x100,0x64a,0x100,0x64a,0x100,0x64a,0x8300,0xe6,0x644,0x627,0x653,0x8300,0xe6,0x644,0x627,
+0x653,0x8300,0xe6,0x644,0x627,0x654,0x8300,0xe6,0x644,0x627,0x654,0x8300,0xdc,0x644,0x627,0x655,
+0x8300,0xdc,0x644,0x627,0x655,0x200,0x644,0x627,0x200,0x644,0x627,0x100,0x21,0x100,0x22,0x100,
+0x23,0x100,0x24,0x100,0x25,0x100,0x26,0x100,0x27,0x100,0x28,0x100,0x29,0x100,0x2a,0x100,
+0x2b,0x100,0x2c,0x100,0x2d,0x100,0x2e,0x100,0x2f,0x100,0x30,0x100,0x31,0x100,0x32,0x100,
+0x33,0x100,0x34,0x100,0x35,0x100,0x36,0x100,0x37,0x100,0x38,0x100,0x39,0x100,0x3a,0x100,
+0x3b,0x100,0x3c,0x100,0x3d,0x100,0x3e,0x100,0x3f,0x100,0x40,0x100,0x41,0x100,0x42,0x100,
+0x43,0x100,0x44,0x100,0x45,0x100,0x46,0x100,0x47,0x100,0x48,0x100,0x49,0x100,0x4a,0x100,
+0x4b,0x100,0x4c,0x100,0x4d,0x100,0x4e,0x100,0x4f,0x100,0x50,0x100,0x51,0x100,0x52,0x100,
+0x53,0x100,0x54,0x100,0x55,0x100,0x56,0x100,0x57,0x100,0x58,0x100,0x59,0x100,0x5a,0x100,
+0x5b,0x100,0x5c,0x100,0x5d,0x100,0x5e,0x100,0x5f,0x100,0x60,0x100,0x61,0x100,0x62,0x100,
+0x63,0x100,0x64,0x100,0x65,0x100,0x66,0x100,0x67,0x100,0x68,0x100,0x69,0x100,0x6a,0x100,
+0x6b,0x100,0x6c,0x100,0x6d,0x100,0x6e,0x100,0x6f,0x100,0x70,0x100,0x71,0x100,0x72,0x100,
+0x73,0x100,0x74,0x100,0x75,0x100,0x76,0x100,0x77,0x100,0x78,0x100,0x79,0x100,0x7a,0x100,
+0x7b,0x100,0x7c,0x100,0x7d,0x100,0x7e,0x100,0x2985,0x100,0x2986,0x100,0x3002,0x100,0x300c,0x100,
+0x300d,0x100,0x3001,0x100,0x30fb,0x100,0x30f2,0x100,0x30a1,0x100,0x30a3,0x100,0x30a5,0x100,0x30a7,0x100,
+0x30a9,0x100,0x30e3,0x100,0x30e5,0x100,0x30e7,0x100,0x30c3,0x100,0x30fc,0x100,0x30a2,0x100,0x30a4,0x100,
+0x30a6,0x100,0x30a8,0x100,0x30aa,0x100,0x30ab,0x100,0x30ad,0x100,0x30af,0x100,0x30b1,0x100,0x30b3,0x100,
+0x30b5,0x100,0x30b7,0x100,0x30b9,0x100,0x30bb,0x100,0x30bd,0x100,0x30bf,0x100,0x30c1,0x100,0x30c4,0x100,
+0x30c6,0x100,0x30c8,0x100,0x30ca,0x100,0x30cb,0x100,0x30cc,0x100,0x30cd,0x100,0x30ce,0x100,0x30cf,0x100,
+0x30d2,0x100,0x30d5,0x100,0x30d8,0x100,0x30db,0x100,0x30de,0x100,0x30df,0x100,0x30e0,0x100,0x30e1,0x100,
+0x30e2,0x100,0x30e4,0x100,0x30e6,0x100,0x30e8,0x100,0x30e9,0x100,0x30ea,0x100,0x30eb,0x100,0x30ec,0x100,
+0x30ed,0x100,0x30ef,0x100,0x30f3,0x8100,0x808,0x3099,0x8100,0x808,0x309a,0x100,0x1160,0x100,0x1100,0x100,
+0x1101,0x100,0x11aa,0x100,0x1102,0x100,0x11ac,0x100,0x11ad,0x100,0x1103,0x100,0x1104,0x100,0x1105,0x100,
+0x11b0,0x100,0x11b1,0x100,0x11b2,0x100,0x11b3,0x100,0x11b4,0x100,0x11b5,0x100,0x111a,0x100,0x1106,0x100,
+0x1107,0x100,0x1108,0x100,0x1121,0x100,0x1109,0x100,0x110a,0x100,0x110b,0x100,0x110c,0x100,0x110d,0x100,
+0x110e,0x100,0x110f,0x100,0x1110,0x100,0x1111,0x100,0x1112,0x100,0x1161,0x100,0x1162,0x100,0x1163,0x100,
+0x1164,0x100,0x1165,0x100,0x1166,0x100,0x1167,0x100,0x1168,0x100,0x1169,0x100,0x116a,0x100,0x116b,0x100,
+0x116c,0x100,0x116d,0x100,0x116e,0x100,0x116f,0x100,0x1170,0x100,0x1171,0x100,0x1172,0x100,0x1173,0x100,
+0x1174,0x100,0x1175,0x100,0xa2,0x100,0xa3,0x100,0xac,0x8200,0xe6,0x20,0x304,0x100,0xa6,0x100,
+0xa5,0x100,0x20a9,0x100,0x2502,0x100,0x2190,0x100,0x2191,0x100,0x2192,0x100,0x2193,0x100,0x25a0,0x100,
+0x25cb,0x100,0x61,0x100,0x62,0x100,0x63,0x100,0x64,0x100,0x65,0x100,0x66,0x100,0x67,0x100,
+0x68,0x100,0x69,0x100,0x6a,0x100,0x6b,0x100,0x6c,0x100,0x6d,0x100,0x6e,0x100,0x6f,0x100,
+0x70,0x100,0x71,0x100,0x72,0x100,0x73,0x100,0x74,0x100,0x75,0x100,0x76,0x100,0x77,0x100,
+0x78,0x100,0x79,0x100,0x7a,0x100,0x61,0x100,0x62,0x100,0x63,0x100,0x64,0x100,0x65,0x100,
+0x66,0x100,0x67,0x100,0x69,0x100,0x6a,0x100,0x6b,0x100,0x6c,0x100,0x6d,0x100,0x6e,0x100,
+0x6f,0x100,0x70,0x100,0x71,0x100,0x72,0x100,0x73,0x100,0x74,0x100,0x75,0x100,0x76,0x100,
+0x77,0x100,0x78,0x100,0x79,0x100,0x7a,0x100,0x61,0x100,0x62,0x100,0x63,0x100,0x64,0x100,
+0x65,0x100,0x66,0x100,0x67,0x100,0x68,0x100,0x69,0x100,0x6a,0x100,0x6b,0x100,0x6c,0x100,
+0x6d,0x100,0x6e,0x100,0x6f,0x100,0x70,0x100,0x71,0x100,0x72,0x100,0x73,0x100,0x74,0x100,
+0x75,0x100,0x76,0x100,0x77,0x100,0x78,0x100,0x79,0x100,0x7a,0x100,0x61,0x100,0x62,0x100,
+0x63,0x100,0x64,0x100,0x66,0x100,0x68,0x100,0x69,0x100,0x6a,0x100,0x6b,0x100,0x6c,0x100,
+0x6d,0x100,0x6e,0x100,0x70,0x100,0x71,0x100,0x72,0x100,0x73,0x100,0x74,0x100,0x75,0x100,
+0x76,0x100,0x77,0x100,0x78,0x100,0x79,0x100,0x7a,0x100,0x61,0x100,0x62,0x100,0x63,0x100,
+0x64,0x100,0x65,0x100,0x66,0x100,0x67,0x100,0x68,0x100,0x69,0x100,0x6a,0x100,0x6b,0x100,
+0x6c,0x100,0x6d,0x100,0x6e,0x100,0x6f,0x100,0x70,0x100,0x71,0x100,0x72,0x100,0x73,0x100,
+0x74,0x100,0x75,0x100,0x76,0x100,0x77,0x100,0x78,0x100,0x79,0x100,0x7a,0x100,0x61,0x100,
+0x62,0x100,0x63,0x100,0x64,0x100,0x65,0x100,0x66,0x100,0x67,0x100,0x68,0x100,0x69,0x100,
+0x6a,0x100,0x6b,0x100,0x6c,0x100,0x6d,0x100,0x6e,0x100,0x6f,0x100,0x70,0x100,0x71,0x100,
+0x72,0x100,0x73,0x100,0x74,0x100,0x75,0x100,0x76,0x100,0x77,0x100,0x78,0x100,0x79,0x100,
+0x7a,0x100,0x61,0x100,0x62,0x100,0x63,0x100,0x64,0x100,0x65,0x100,0x66,0x100,0x67,0x100,
+0x68,0x100,0x69,0x100,0x6a,0x100,0x6b,0x100,0x6c,0x100,0x6d,0x100,0x6e,0x100,0x6f,0x100,
+0x70,0x100,0x71,0x100,0x72,0x100,0x73,0x100,0x74,0x100,0x75,0x100,0x76,0x100,0x77,0x100,
+0x78,0x100,0x79,0x100,0x7a,0x100,0x61,0x100,0x62,0x100,0x63,0x100,0x64,0x100,0x65,0x100,
+0x66,0x100,0x67,0x100,0x68,0x100,0x69,0x100,0x6a,0x100,0x6b,0x100,0x6c,0x100,0x6d,0x100,
+0x6e,0x100,0x6f,0x100,0x70,0x100,0x71,0x100,0x72,0x100,0x73,0x100,0x74,0x100,0x75,0x100,
+0x76,0x100,0x77,0x100,0x78,0x100,0x79,0x100,0x7a,0x100,0x61,0x100,0x62,0x100,0x63,0x100,
+0x64,0x100,0x65,0x100,0x66,0x100,0x67,0x100,0x68,0x100,0x69,0x100,0x6a,0x100,0x6b,0x100,
+0x6c,0x100,0x6d,0x100,0x6e,0x100,0x6f,0x100,0x70,0x100,0x71,0x100,0x72,0x100,0x73,0x100,
+0x74,0x100,0x75,0x100,0x76,0x100,0x77,0x100,0x78,0x100,0x79,0x100,0x7a,0x100,0x61,0x100,
+0x62,0x100,0x63,0x100,0x64,0x100,0x65,0x100,0x66,0x100,0x67,0x100,0x68,0x100,0x69,0x100,
+0x6a,0x100,0x6b,0x100,0x6c,0x100,0x6d,0x100,0x6e,0x100,0x6f,0x100,0x70,0x100,0x71,0x100,
+0x72,0x100,0x73,0x100,0x74,0x100,0x75,0x100,0x76,0x100,0x77,0x100,0x78,0x100,0x79,0x100,
+0x7a,0x100,0x61,0x100,0x62,0x100,0x63,0x100,0x64,0x100,0x65,0x100,0x66,0x100,0x67,0x100,
+0x68,0x100,0x69,0x100,0x6a,0x100,0x6b,0x100,0x6c,0x100,0x6d,0x100,0x6e,0x100,0x6f,0x100,
+0x70,0x100,0x71,0x100,0x72,0x100,0x73,0x100,0x74,0x100,0x75,0x100,0x76,0x100,0x77,0x100,
+0x78,0x100,0x79,0x100,0x7a,0x100,0x61,0x100,0x62,0x100,0x63,0x100,0x64,0x100,0x65,0x100,
+0x66,0x100,0x67,0x100,0x68,0x100,0x69,0x100,0x6a,0x100,0x6b,0x100,0x6c,0x100,0x6d,0x100,
+0x6e,0x100,0x6f,0x100,0x70,0x100,0x71,0x100,0x72,0x100,0x73,0x100,0x74,0x100,0x75,0x100,
+0x76,0x100,0x77,0x100,0x78,0x100,0x79,0x100,0x7a,0x100,0x61,0x100,0x62,0x100,0x63,0x100,
+0x64,0x100,0x65,0x100,0x66,0x100,0x67,0x100,0x68,0x100,0x69,0x100,0x6a,0x100,0x6b,0x100,
+0x6c,0x100,0x6d,0x100,0x6e,0x100,0x6f,0x100,0x70,0x100,0x71,0x100,0x72,0x100,0x73,0x100,
+0x74,0x100,0x75,0x100,0x76,0x100,0x77,0x100,0x78,0x100,0x79,0x100,0x7a,0x100,0x131,0x100,
+0x237,0x100,0x2207,0x100,0x3b1,0x100,0x3b2,0x100,0x3b3,0x100,0x3b4,0x100,0x3b5,0x100,0x3b6,0x100,
+0x3b7,0x100,0x3b8,0x100,0x3b9,0x100,0x3ba,0x100,0x3bb,0x100,0x3bc,0x100,0x3bd,0x100,0x3be,0x100,
+0x3bf,0x100,0x3c0,0x100,0x3c1,0x100,0x3c3,0x100,0x3c4,0x100,0x3c5,0x100,0x3c6,0x100,0x3c7,0x100,
+0x3c8,0x100,0x3c9,0x100,0x2202,0x100,0x3b5,0x100,0x3b8,0x100,0x3ba,0x100,0x3c6,0x100,0x3c1,0x100,
+0x3c0,0x100,0x2207,0x100,0x3b1,0x100,0x3b2,0x100,0x3b3,0x100,0x3b4,0x100,0x3b5,0x100,0x3b6,0x100,
+0x3b7,0x100,0x3b8,0x100,0x3b9,0x100,0x3ba,0x100,0x3bb,0x100,0x3bc,0x100,0x3bd,0x100,0x3be,0x100,
+0x3bf,0x100,0x3c0,0x100,0x3c1,0x100,0x3c3,0x100,0x3c4,0x100,0x3c5,0x100,0x3c6,0x100,0x3c7,0x100,
+0x3c8,0x100,0x3c9,0x100,0x2202,0x100,0x3b5,0x100,0x3b8,0x100,0x3ba,0x100,0x3c6,0x100,0x3c1,0x100,
+0x3c0,0x100,0x2207,0x100,0x3b1,0x100,0x3b2,0x100,0x3b3,0x100,0x3b4,0x100,0x3b5,0x100,0x3b6,0x100,
+0x3b7,0x100,0x3b8,0x100,0x3b9,0x100,0x3ba,0x100,0x3bb,0x100,0x3bc,0x100,0x3bd,0x100,0x3be,0x100,
+0x3bf,0x100,0x3c0,0x100,0x3c1,0x100,0x3c3,0x100,0x3c4,0x100,0x3c5,0x100,0x3c6,0x100,0x3c7,0x100,
+0x3c8,0x100,0x3c9,0x100,0x2202,0x100,0x3b5,0x100,0x3b8,0x100,0x3ba,0x100,0x3c6,0x100,0x3c1,0x100,
+0x3c0,0x100,0x2207,0x100,0x3b1,0x100,0x3b2,0x100,0x3b3,0x100,0x3b4,0x100,0x3b5,0x100,0x3b6,0x100,
+0x3b7,0x100,0x3b8,0x100,0x3b9,0x100,0x3ba,0x100,0x3bb,0x100,0x3bc,0x100,0x3bd,0x100,0x3be,0x100,
+0x3bf,0x100,0x3c0,0x100,0x3c1,0x100,0x3c3,0x100,0x3c4,0x100,0x3c5,0x100,0x3c6,0x100,0x3c7,0x100,
+0x3c8,0x100,0x3c9,0x100,0x2202,0x100,0x3b5,0x100,0x3b8,0x100,0x3ba,0x100,0x3c6,0x100,0x3c1,0x100,
+0x3c0,0x100,0x2207,0x100,0x3b1,0x100,0x3b2,0x100,0x3b3,0x100,0x3b4,0x100,0x3b5,0x100,0x3b6,0x100,
+0x3b7,0x100,0x3b8,0x100,0x3b9,0x100,0x3ba,0x100,0x3bb,0x100,0x3bc,0x100,0x3bd,0x100,0x3be,0x100,
+0x3bf,0x100,0x3c0,0x100,0x3c1,0x100,0x3c3,0x100,0x3c4,0x100,0x3c5,0x100,0x3c6,0x100,0x3c7,0x100,
+0x3c8,0x100,0x3c9,0x100,0x2202,0x100,0x3b5,0x100,0x3b8,0x100,0x3ba,0x100,0x3c6,0x100,0x3c1,0x100,
+0x3c0,0x100,0x3dd,0x100,0x30,0x100,0x31,0x100,0x32,0x100,0x33,0x100,0x34,0x100,0x35,0x100,
+0x36,0x100,0x37,0x100,0x38,0x100,0x39,0x100,0x30,0x100,0x31,0x100,0x32,0x100,0x33,0x100,
+0x34,0x100,0x35,0x100,0x36,0x100,0x37,0x100,0x38,0x100,0x39,0x100,0x30,0x100,0x31,0x100,
+0x32,0x100,0x33,0x100,0x34,0x100,0x35,0x100,0x36,0x100,0x37,0x100,0x38,0x100,0x39,0x100,
+0x30,0x100,0x31,0x100,0x32,0x100,0x33,0x100,0x34,0x100,0x35,0x100,0x36,0x100,0x37,0x100,
+0x38,0x100,0x39,0x100,0x30,0x100,0x31,0x100,0x32,0x100,0x33,0x100,0x34,0x100,0x35,0x100,
+0x36,0x100,0x37,0x100,0x38,0x100,0x39,0,0x20,0x2a,0x4c,0x6a,0x7c,0x9c,0xc2,0xd4,
+0xf4,0xfe,0x120,0x13c,0x14e,0x16e,0x194,0x1a8,0x1b4,0x1c0,0x1ce,0x1dc,0x1ea,0x1fa,0x1fc,0x200,
+0x20a,0x214,0x220,0x22c,0x23c,0x24c,0x25a,0x268,0x276,0x286,0x292,0x2a0,0x2ac,0x2d0,0x2d4,0x2dc,
+0x2de,0x2e4,0x2e6,0x302,0x310,0x318,0x322,0x330,0x338,0x344,0x354,0x364,0x36c,0x378,0x38e,0x39e,
+0x3a6,0x3b6,0x3bc,0x3be,0x3c0,0x3c2,0x3ca,0x3d2,0x3da,0x3e0,0x3e2,0x3e4,0x3e6,0x3ee,0x3f0,0x3f2,
+0x3f6,0x3fa,0x3fe,0x402,0x404,0x406,0x408,0x40a,0x40c,0x40e,0x410,0x412,0x414,0x416,0x418,0x41a,
+0x41c,0x41e,0x424,0x426,0x428,0x42a,0x42c,0x42e,0x430,0x432,0x434,0x438,0x43e,0x440,0x444,0x446,
+0x448,0x44a,0x452,0x456,0x458,0x460,0x462,0x464,0x466,0x468,0x46a,0x46c,0x46e,0x470,0x472,0x474,
+0x476,0x478,0x47e,0x494,0x496,0x4a0,0x4a6,0x4b4,0x4b8,0x4d4,0x4d8,0x4dc,0x4e0,0x668,0x66c,0x674,
+0x677,0x67a,0x67d,0x680,0x683,0x686,0x689,0x68c,0x68f,0x692,0x695,0x698,0x69b,0x69e,0x6a1,0x6a4,
+0x6a7,0x6aa,0x6ad,0x6b0,0x6b3,0x6b6,0x6b9,0x6bc,0x6bf,0x6c2,0x6c5,0x6c8,0x6cb,0x6ce,0x6d1,0x6d4,
+0x6d7,0x6da,0x6dd,0x6e0,0x6e3,0x6e6,0x6e9,0x6ec,0x6ef,0x6f2,0x6f5,0x6f8,0x6fb,0x6fe,0x701,0x704,
+0x707,0x70a,0x70d,0x710,0x713,0x716,0x719,0x71c,0x71f,0x722,0x725,0x72b,0x731,0x737,0x73d,0x743,
+0x746,0x749,0x74c,0x74f,0x752,0x755,0x758,0x75b,0x75e,0x761,0x764,0x767,0x76a,0x76d,0x770,0x773,
+0x776,0x77c,0x782,0x788,0x78e,0x794,0x797,0x79a,0x79d,0x7a0,0x7a3
+};
+
+static const uint16_t combiningTable[1959]={
+0x7a6,0xc0,0x7a7,0xc1,0x7a8,0x20c2,0x7a9,0xc3,0x7aa,0x20c4,0x7ab,0x20c5,0x7ad,0x100,0x7ae,0x2102,
+0x7af,0x104,0x7b0,0x2226,0x7b1,0x1cd,0x7b4,0x200,0x7b5,0x202,0x7cd,0x1e00,0x7ce,0x3ea0,0x87d4,0x1ea2,
+0x7a7,0x106,0x7a8,0x108,0x7ac,0x20c7,0x7b0,0x10a,0x87b1,0x10c,0x7a6,0xc8,0x7a7,0xc9,0x7a8,0x20ca,
+0x7a9,0x1ebc,0x7aa,0xcb,0x7ac,0x2228,0x7ad,0x2112,0x7ae,0x114,0x7af,0x118,0x7b0,0x116,0x7b1,0x11a,
+0x7b4,0x204,0x7b5,0x206,0x7ce,0x3eb8,0x7d0,0x1e18,0x7d1,0x1e1a,0x87d4,0x1eba,0x7a6,0xcc,0x7a7,0xcd,
+0x7a8,0xce,0x7a9,0x128,0x7aa,0x20cf,0x7ad,0x12a,0x7ae,0x12c,0x7af,0x12e,0x7b0,0x130,0x7b1,0x1cf,
+0x7b4,0x208,0x7b5,0x20a,0x7ce,0x1eca,0x7d1,0x1e2c,0x87d4,0x1ec8,0x7a6,0x1f8,0x7a7,0x143,0x7a9,0xd1,
+0x7ac,0x145,0x7b0,0x1e44,0x7b1,0x147,0x7ce,0x1e46,0x7cf,0x1e48,0x87d0,0x1e4a,0x7a6,0xd2,0x7a7,0xd3,
+0x7a8,0x20d4,0x7a9,0x20d5,0x7aa,0x20d6,0x7ad,0x214c,0x7ae,0x14e,0x7af,0x21ea,0x7b0,0x222e,0x7b1,0x1d1,
+0x7b2,0x150,0x7b3,0x21a0,0x7b4,0x20c,0x7b5,0x20e,0x7ce,0x3ecc,0x87d4,0x1ece,0x7a6,0xd9,0x7a7,0xda,
+0x7a8,0xdb,0x7a9,0x2168,0x7aa,0x20dc,0x7ab,0x16e,0x7ad,0x216a,0x7ae,0x16c,0x7af,0x172,0x7b1,0x1d3,
+0x7b2,0x170,0x7b3,0x21af,0x7b4,0x214,0x7b5,0x216,0x7ce,0x1ee4,0x7d0,0x1e76,0x7d1,0x1e74,0x7d3,0x1e72,
+0x87d4,0x1ee6,0x7a6,0x1ef2,0x7a7,0xdd,0x7a8,0x176,0x7a9,0x1ef8,0x7aa,0x178,0x7ad,0x232,0x7b0,0x1e8e,
+0x7ce,0x1ef4,0x87d4,0x1ef6,0x7a6,0xe0,0x7a7,0xe1,0x7a8,0x20e2,0x7a9,0xe3,0x7aa,0x20e4,0x7ab,0x20e5,
+0x7ad,0x101,0x7ae,0x2103,0x7af,0x105,0x7b0,0x2227,0x7b1,0x1ce,0x7b4,0x201,0x7b5,0x203,0x7cd,0x1e01,
+0x7ce,0x3ea1,0x87d4,0x1ea3,0x7a7,0x107,0x7a8,0x109,0x7ac,0x20e7,0x7b0,0x10b,0x87b1,0x10d,0x7a6,0xe8,
+0x7a7,0xe9,0x7a8,0x20ea,0x7a9,0x1ebd,0x7aa,0xeb,0x7ac,0x2229,0x7ad,0x2113,0x7ae,0x115,0x7af,0x119,
+0x7b0,0x117,0x7b1,0x11b,0x7b4,0x205,0x7b5,0x207,0x7ce,0x3eb9,0x7d0,0x1e19,0x7d1,0x1e1b,0x87d4,0x1ebb,
+0x7a6,0xec,0x7a7,0xed,0x7a8,0xee,0x7a9,0x129,0x7aa,0x20ef,0x7ad,0x12b,0x7ae,0x12d,0x7af,0x12f,
+0x7b1,0x1d0,0x7b4,0x209,0x7b5,0x20b,0x7ce,0x1ecb,0x7d1,0x1e2d,0x87d4,0x1ec9,0x7a6,0x1f9,0x7a7,0x144,
+0x7a9,0xf1,0x7ac,0x146,0x7b0,0x1e45,0x7b1,0x148,0x7ce,0x1e47,0x7cf,0x1e49,0x87d0,0x1e4b,0x7a6,0xf2,
+0x7a7,0xf3,0x7a8,0x20f4,0x7a9,0x20f5,0x7aa,0x20f6,0x7ad,0x214d,0x7ae,0x14f,0x7af,0x21eb,0x7b0,0x222f,
+0x7b1,0x1d2,0x7b2,0x151,0x7b3,0x21a1,0x7b4,0x20d,0x7b5,0x20f,0x7ce,0x3ecd,0x87d4,0x1ecf,0x7a6,0xf9,
+0x7a7,0xfa,0x7a8,0xfb,0x7a9,0x2169,0x7aa,0x20fc,0x7ab,0x16f,0x7ad,0x216b,0x7ae,0x16d,0x7af,0x173,
+0x7b1,0x1d4,0x7b2,0x171,0x7b3,0x21b0,0x7b4,0x215,0x7b5,0x217,0x7ce,0x1ee5,0x7d0,0x1e77,0x7d1,0x1e75,
+0x7d3,0x1e73,0x87d4,0x1ee7,0x7a6,0x1ef3,0x7a7,0xfd,0x7a8,0x177,0x7a9,0x1ef9,0x7aa,0xff,0x7ab,0x1e99,
+0x7ad,0x233,0x7b0,0x1e8f,0x7ce,0x1ef5,0x87d4,0x1ef7,0x7ac,0x1e10,0x7b0,0x1e0a,0x7b1,0x10e,0x7ce,0x1e0c,
+0x7cf,0x1e0e,0x87d0,0x1e12,0x7ac,0x1e11,0x7b0,0x1e0b,0x7b1,0x10f,0x7ce,0x1e0d,0x7cf,0x1e0f,0x87d0,0x1e13,
+0x7a7,0x1f4,0x7a8,0x11c,0x7ac,0x122,0x7ad,0x1e20,0x7ae,0x11e,0x7b0,0x120,0x87b1,0x1e6,0x7a7,0x1f5,
+0x7a8,0x11d,0x7ac,0x123,0x7ad,0x1e21,0x7ae,0x11f,0x7b0,0x121,0x87b1,0x1e7,0x7a8,0x124,0x7aa,0x1e26,
+0x7ac,0x1e28,0x7b0,0x1e22,0x7b1,0x21e,0x7ce,0x1e24,0x87d2,0x1e2a,0x7a8,0x125,0x7aa,0x1e27,0x7ac,0x1e29,
+0x7b0,0x1e23,0x7b1,0x21f,0x7ce,0x1e25,0x7cf,0x1e96,0x87d2,0x1e2b,0x87a8,0x134,0x7a8,0x135,0x87b1,0x1f0,
+0x7a7,0x1e30,0x7ac,0x136,0x7b1,0x1e8,0x7ce,0x1e32,0x87cf,0x1e34,0x7a7,0x1e31,0x7ac,0x137,0x7b1,0x1e9,
+0x7ce,0x1e33,0x87cf,0x1e35,0x7a7,0x139,0x7ac,0x13b,0x7b1,0x13d,0x7ce,0x3e36,0x7cf,0x1e3a,0x87d0,0x1e3c,
+0x7a7,0x13a,0x7ac,0x13c,0x7b1,0x13e,0x7ce,0x3e37,0x7cf,0x1e3b,0x87d0,0x1e3d,0x7a7,0x154,0x7ac,0x156,
+0x7b0,0x1e58,0x7b1,0x158,0x7b4,0x210,0x7b5,0x212,0x7ce,0x3e5a,0x87cf,0x1e5e,0x7a7,0x155,0x7ac,0x157,
+0x7b0,0x1e59,0x7b1,0x159,0x7b4,0x211,0x7b5,0x213,0x7ce,0x3e5b,0x87cf,0x1e5f,0x7a7,0x215a,0x7a8,0x15c,
+0x7ac,0x15e,0x7b0,0x1e60,0x7b1,0x2160,0x7b6,0x218,0x87ce,0x3e62,0x7a7,0x215b,0x7a8,0x15d,0x7ac,0x15f,
+0x7b0,0x1e61,0x7b1,0x2161,0x7b6,0x219,0x87ce,0x3e63,0x7ac,0x162,0x7b0,0x1e6a,0x7b1,0x164,0x7b6,0x21a,
+0x7ce,0x1e6c,0x7cf,0x1e6e,0x87d0,0x1e70,0x7aa,0x1e97,0x7ac,0x163,0x7b0,0x1e6b,0x7b1,0x165,0x7b6,0x21b,
+0x7ce,0x1e6d,0x7cf,0x1e6f,0x87d0,0x1e71,0x7a6,0x1e80,0x7a7,0x1e82,0x7a8,0x174,0x7aa,0x1e84,0x7b0,0x1e86,
+0x87ce,0x1e88,0x7a6,0x1e81,0x7a7,0x1e83,0x7a8,0x175,0x7aa,0x1e85,0x7ab,0x1e98,0x7b0,0x1e87,0x87ce,0x1e89,
+0x7a7,0x179,0x7a8,0x1e90,0x7b0,0x17b,0x7b1,0x17d,0x7ce,0x1e92,0x87cf,0x1e94,0x7a7,0x17a,0x7a8,0x1e91,
+0x7b0,0x17c,0x7b1,0x17e,0x7ce,0x1e93,0x87cf,0x1e95,0x7a6,0x1db,0x7a7,0x1d7,0x7ad,0x1d5,0x87b1,0x1d9,
+0x7a6,0x1dc,0x7a7,0x1d8,0x7ad,0x1d6,0x87b1,0x1da,0x87ad,0x1de,0x87ad,0x1df,0x87ad,0x1e0,0x87ad,0x1e1,
+0x7a7,0x1fc,0x87ad,0x1e2,0x7a7,0x1fd,0x87ad,0x1e3,0x87ad,0x1ec,0x87ad,0x1ed,0x87b1,0x1ee,0x87b1,0x1ef,
+0x87a7,0x1fa,0x87a7,0x1fb,0x87a7,0x1fe,0x87a7,0x1ff,0x87ad,0x22a,0x87ad,0x22b,0x7a7,0x1e4c,0x7aa,0x1e4e,
+0x87ad,0x22c,0x7a7,0x1e4d,0x7aa,0x1e4f,0x87ad,0x22d,0x87ad,0x230,0x87ad,0x231,0x7a6,0x1fed,0x7a7,0x385,
+0x87d7,0x1fc1,0x7a6,0x1fba,0x7a7,0x386,0x7ad,0x1fb9,0x7ae,0x1fb8,0x7d5,0x3f08,0x7d6,0x3f09,0x87d8,0x1fbc,
+0x7a6,0x1fc8,0x7a7,0x388,0x7d5,0x3f18,0x87d6,0x3f19,0x7a6,0x1fca,0x7a7,0x389,0x7d5,0x3f28,0x7d6,0x3f29,
+0x87d8,0x1fcc,0x7a6,0x1fda,0x7a7,0x38a,0x7aa,0x3aa,0x7ad,0x1fd9,0x7ae,0x1fd8,0x7d5,0x3f38,0x87d6,0x3f39,
+0x7a6,0x1ff8,0x7a7,0x38c,0x7d5,0x3f48,0x87d6,0x3f49,0x7a6,0x1fea,0x7a7,0x38e,0x7aa,0x3ab,0x7ad,0x1fe9,
+0x7ae,0x1fe8,0x87d6,0x3f59,0x7a6,0x1ffa,0x7a7,0x38f,0x7d5,0x3f68,0x7d6,0x3f69,0x87d8,0x1ffc,0x7a6,0x1fd2,
+0x7a7,0x390,0x87d7,0x1fd7,0x7a6,0x3f70,0x7a7,0x23ac,0x7ad,0x1fb1,0x7ae,0x1fb0,0x7d5,0x3f00,0x7d6,0x3f01,
+0x7d7,0x3fb6,0x87d8,0x1fb3,0x7a6,0x1f72,0x7a7,0x3ad,0x7d5,0x3f10,0x87d6,0x3f11,0x7a6,0x3f74,0x7a7,0x23ae,
+0x7d5,0x3f20,0x7d6,0x3f21,0x7d7,0x3fc6,0x87d8,0x1fc3,0x7a6,0x1f76,0x7a7,0x3af,0x7aa,0x23ca,0x7ad,0x1fd1,
+0x7ae,0x1fd0,0x7d5,0x3f30,0x7d6,0x3f31,0x87d7,0x1fd6,0x7a6,0x1fe2,0x7a7,0x3b0,0x87d7,0x1fe7,0x7a6,0x1f7a,
+0x7a7,0x3cd,0x7aa,0x23cb,0x7ad,0x1fe1,0x7ae,0x1fe0,0x7d5,0x3f50,0x7d6,0x3f51,0x87d7,0x1fe6,0x7a6,0x1f78,
+0x7a7,0x3cc,0x7d5,0x3f40,0x87d6,0x3f41,0x7a6,0x3f7c,0x7a7,0x23ce,0x7d5,0x3f60,0x7d6,0x3f61,0x7d7,0x3ff6,
+0x87d8,0x1ff3,0x7a7,0x3d3,0x87aa,0x3d4,0x7a6,0x400,0x7aa,0x401,0x87ae,0x4d6,0x87a7,0x403,0x87aa,0x407,
+0x87a7,0x40c,0x7a6,0x40d,0x7aa,0x4e4,0x7ad,0x4e2,0x87ae,0x419,0x7aa,0x4f0,0x7ad,0x4ee,0x7ae,0x40e,
+0x87b2,0x4f2,0x7a6,0x45d,0x7aa,0x4e5,0x7ad,0x4e3,0x87ae,0x439,0x7a6,0x450,0x7aa,0x451,0x87ae,0x4d7,
+0x87a7,0x453,0x87aa,0x457,0x87a7,0x45c,0x7aa,0x4f1,0x7ad,0x4ef,0x7ae,0x45e,0x87b2,0x4f3,0x87b4,0x476,
+0x87b4,0x477,0x7aa,0x4dc,0x87ae,0x4c1,0x7aa,0x4dd,0x87ae,0x4c2,0x7aa,0x4d2,0x87ae,0x4d0,0x7aa,0x4d3,
+0x87ae,0x4d1,0x87aa,0x4da,0x87aa,0x4db,0x87aa,0x4de,0x87aa,0x4df,0x87aa,0x4e6,0x87aa,0x4e7,0x87aa,0x4ea,
+0x87aa,0x4eb,0x87aa,0x4ec,0x87aa,0x4ed,0x87aa,0x4f4,0x87aa,0x4f5,0x87aa,0x4f8,0x87aa,0x4f9,0x7b7,0x622,
+0x7b8,0x623,0x87b9,0x625,0x87b8,0x624,0x87b8,0x626,0x87b8,0x6c0,0x87b8,0x6c2,0x87b8,0x6d3,0x87ba,0x929,
+0x87ba,0x931,0x87ba,0x934,0x7bb,0x9cb,0x87bc,0x9cc,0x7bd,0xb48,0x7be,0xb4b,0x87bf,0xb4c,0x87c0,0xb94,
+0x7c0,0xbcc,0x87c1,0xbca,0x87c1,0xbcb,0x87c2,0xc48,0x87c3,0xcc0,0x7c3,0xcc7,0x7c4,0xcc8,0x87c5,0x2cca,
+0x87c3,0xccb,0x7c6,0xd4a,0x87c7,0xd4c,0x87c6,0xd4b,0x7c8,0xdda,0x7c9,0x2ddc,0x87ca,0xdde,0x87c8,0xddd,
+0x87cb,0x1026,0x87cc,0x1b06,0x87cc,0x1b08,0x87cc,0x1b0a,0x87cc,0x1b0c,0x87cc,0x1b0e,0x87cc,0x1b12,0x87cc,0x1b3b,
+0x87cc,0x1b3d,0x87cc,0x1b40,0x87cc,0x1b41,0x87cc,0x1b43,0x7b0,0x1e02,0x7ce,0x1e04,0x87cf,0x1e06,0x7b0,0x1e03,
+0x7ce,0x1e05,0x87cf,0x1e07,0x87a7,0x1e08,0x87a7,0x1e09,0x7a6,0x1e14,0x87a7,0x1e16,0x7a6,0x1e15,0x87a7,0x1e17,
+0x87ae,0x1e1c,0x87ae,0x1e1d,0x87b0,0x1e1e,0x87b0,0x1e1f,0x87a7,0x1e2e,0x87a7,0x1e2f,0x87ad,0x1e38,0x87ad,0x1e39,
+0x7a7,0x1e3e,0x7b0,0x1e40,0x87ce,0x1e42,0x7a7,0x1e3f,0x7b0,0x1e41,0x87ce,0x1e43,0x7a6,0x1e50,0x87a7,0x1e52,
+0x7a6,0x1e51,0x87a7,0x1e53,0x7a7,0x1e54,0x87b0,0x1e56,0x7a7,0x1e55,0x87b0,0x1e57,0x87ad,0x1e5c,0x87ad,0x1e5d,
+0x87b0,0x1e64,0x87b0,0x1e65,0x87b0,0x1e66,0x87b0,0x1e67,0x87b0,0x1e68,0x87b0,0x1e69,0x87a7,0x1e78,0x87a7,0x1e79,
+0x87aa,0x1e7a,0x87aa,0x1e7b,0x7a9,0x1e7c,0x87ce,0x1e7e,0x7a9,0x1e7d,0x87ce,0x1e7f,0x7aa,0x1e8c,0x87b0,0x1e8a,
+0x7aa,0x1e8d,0x87b0,0x1e8b,0x87b0,0x1e9b,0x7a6,0x1ea6,0x7a7,0x1ea4,0x7a9,0x1eaa,0x87d4,0x1ea8,0x7a6,0x1ea7,
+0x7a7,0x1ea5,0x7a9,0x1eab,0x87d4,0x1ea9,0x7a8,0x1eac,0x87ae,0x1eb6,0x7a8,0x1ead,0x87ae,0x1eb7,0x7a6,0x1eb0,
+0x7a7,0x1eae,0x7a9,0x1eb4,0x87d4,0x1eb2,0x7a6,0x1eb1,0x7a7,0x1eaf,0x7a9,0x1eb5,0x87d4,0x1eb3,0x7a6,0x1ec0,
+0x7a7,0x1ebe,0x7a9,0x1ec4,0x87d4,0x1ec2,0x7a6,0x1ec1,0x7a7,0x1ebf,0x7a9,0x1ec5,0x87d4,0x1ec3,0x87a8,0x1ec6,
+0x87a8,0x1ec7,0x7a6,0x1ed2,0x7a7,0x1ed0,0x7a9,0x1ed6,0x87d4,0x1ed4,0x7a6,0x1ed3,0x7a7,0x1ed1,0x7a9,0x1ed7,
+0x87d4,0x1ed5,0x87a8,0x1ed8,0x87a8,0x1ed9,0x7a6,0x1edc,0x7a7,0x1eda,0x7a9,0x1ee0,0x7ce,0x1ee2,0x87d4,0x1ede,
+0x7a6,0x1edd,0x7a7,0x1edb,0x7a9,0x1ee1,0x7ce,0x1ee3,0x87d4,0x1edf,0x7a6,0x1eea,0x7a7,0x1ee8,0x7a9,0x1eee,
+0x7ce,0x1ef0,0x87d4,0x1eec,0x7a6,0x1eeb,0x7a7,0x1ee9,0x7a9,0x1eef,0x7ce,0x1ef1,0x87d4,0x1eed,0x7a6,0x3f02,
+0x7a7,0x3f04,0x7d7,0x3f06,0x87d8,0x1f80,0x7a6,0x3f03,0x7a7,0x3f05,0x7d7,0x3f07,0x87d8,0x1f81,0x7a6,0x3f0a,
+0x7a7,0x3f0c,0x7d7,0x3f0e,0x87d8,0x1f88,0x7a6,0x3f0b,0x7a7,0x3f0d,0x7d7,0x3f0f,0x87d8,0x1f89,0x7a6,0x1f12,
+0x87a7,0x1f14,0x7a6,0x1f13,0x87a7,0x1f15,0x7a6,0x1f1a,0x87a7,0x1f1c,0x7a6,0x1f1b,0x87a7,0x1f1d,0x7a6,0x3f22,
+0x7a7,0x3f24,0x7d7,0x3f26,0x87d8,0x1f90,0x7a6,0x3f23,0x7a7,0x3f25,0x7d7,0x3f27,0x87d8,0x1f91,0x7a6,0x3f2a,
+0x7a7,0x3f2c,0x7d7,0x3f2e,0x87d8,0x1f98,0x7a6,0x3f2b,0x7a7,0x3f2d,0x7d7,0x3f2f,0x87d8,0x1f99,0x7a6,0x1f32,
+0x7a7,0x1f34,0x87d7,0x1f36,0x7a6,0x1f33,0x7a7,0x1f35,0x87d7,0x1f37,0x7a6,0x1f3a,0x7a7,0x1f3c,0x87d7,0x1f3e,
+0x7a6,0x1f3b,0x7a7,0x1f3d,0x87d7,0x1f3f,0x7a6,0x1f42,0x87a7,0x1f44,0x7a6,0x1f43,0x87a7,0x1f45,0x7a6,0x1f4a,
+0x87a7,0x1f4c,0x7a6,0x1f4b,0x87a7,0x1f4d,0x7a6,0x1f52,0x7a7,0x1f54,0x87d7,0x1f56,0x7a6,0x1f53,0x7a7,0x1f55,
+0x87d7,0x1f57,0x7a6,0x1f5b,0x7a7,0x1f5d,0x87d7,0x1f5f,0x7a6,0x3f62,0x7a7,0x3f64,0x7d7,0x3f66,0x87d8,0x1fa0,
+0x7a6,0x3f63,0x7a7,0x3f65,0x7d7,0x3f67,0x87d8,0x1fa1,0x7a6,0x3f6a,0x7a7,0x3f6c,0x7d7,0x3f6e,0x87d8,0x1fa8,
+0x7a6,0x3f6b,0x7a7,0x3f6d,0x7d7,0x3f6f,0x87d8,0x1fa9,0x87d8,0x1f82,0x87d8,0x1f83,0x87d8,0x1f84,0x87d8,0x1f85,
+0x87d8,0x1f86,0x87d8,0x1f87,0x87d8,0x1f8a,0x87d8,0x1f8b,0x87d8,0x1f8c,0x87d8,0x1f8d,0x87d8,0x1f8e,0x87d8,0x1f8f,
+0x87d8,0x1f92,0x87d8,0x1f93,0x87d8,0x1f94,0x87d8,0x1f95,0x87d8,0x1f96,0x87d8,0x1f97,0x87d8,0x1f9a,0x87d8,0x1f9b,
+0x87d8,0x1f9c,0x87d8,0x1f9d,0x87d8,0x1f9e,0x87d8,0x1f9f,0x87d8,0x1fa2,0x87d8,0x1fa3,0x87d8,0x1fa4,0x87d8,0x1fa5,
+0x87d8,0x1fa6,0x87d8,0x1fa7,0x87d8,0x1faa,0x87d8,0x1fab,0x87d8,0x1fac,0x87d8,0x1fad,0x87d8,0x1fae,0x87d8,0x1faf,
+0x87d8,0x1fb2,0x87d8,0x1fb4,0x87d8,0x1fb7,0x87d8,0x1fc2,0x87d8,0x1fc4,0x87d8,0x1fc7,0x7a6,0x1fcd,0x7a7,0x1fce,
+0x87d7,0x1fcf,0x7a6,0x1fdd,0x7a7,0x1fde,0x87d7,0x1fdf,0x7d5,0x1fe4,0x87d6,0x1fe5,0x87d6,0x1fec,0x87d8,0x1ff2,
+0x87d8,0x1ff4,0x87d8,0x1ff7,0x87d9,0x8000,0x219a,0x87d9,0x8000,0x219b,0x87d9,0x8000,0x21ae,0x87d9,0x8000,0x21cd,
+0x87d9,0x8000,0x21ce,0x87d9,0x8000,0x21cf,0x87d9,0x8000,0x2204,0x87d9,0x8000,0x2209,0x87d9,0x8000,0x220c,0x87d9,
+0x8000,0x2224,0x87d9,0x8000,0x2226,0x87d9,0x8000,0x2241,0x87d9,0x8000,0x2244,0x87d9,0x8000,0x2247,0x87d9,0x8000,
+0x2249,0x87d9,0x8000,0x2260,0x87d9,0x8000,0x2262,0x87d9,0x8000,0x226d,0x87d9,0x8000,0x226e,0x87d9,0x8000,0x226f,
+0x87d9,0x8000,0x2270,0x87d9,0x8000,0x2271,0x87d9,0x8000,0x2274,0x87d9,0x8000,0x2275,0x87d9,0x8000,0x2278,0x87d9,
+0x8000,0x2279,0x87d9,0x8000,0x2280,0x87d9,0x8000,0x2281,0x87d9,0x8000,0x2284,0x87d9,0x8000,0x2285,0x87d9,0x8000,
+0x2288,0x87d9,0x8000,0x2289,0x87d9,0x8000,0x22ac,0x87d9,0x8000,0x22ad,0x87d9,0x8000,0x22ae,0x87d9,0x8000,0x22af,
+0x87d9,0x8000,0x22e0,0x87d9,0x8000,0x22e1,0x87d9,0x8000,0x22e2,0x87d9,0x8000,0x22e3,0x87d9,0x8000,0x22ea,0x87d9,
+0x8000,0x22eb,0x87d9,0x8000,0x22ec,0x87d9,0x8000,0x22ed,0x87da,0x8000,0x304c,0x87da,0x8000,0x304e,0x87da,0x8000,
+0x3050,0x87da,0x8000,0x3052,0x87da,0x8000,0x3054,0x87da,0x8000,0x3056,0x87da,0x8000,0x3058,0x87da,0x8000,0x305a,
+0x87da,0x8000,0x305c,0x87da,0x8000,0x305e,0x87da,0x8000,0x3060,0x87da,0x8000,0x3062,0x87da,0x8000,0x3065,0x87da,
+0x8000,0x3067,0x87da,0x8000,0x3069,0x7da,0x8000,0x3070,0x87db,0x8000,0x3071,0x7da,0x8000,0x3073,0x87db,0x8000,
+0x3074,0x7da,0x8000,0x3076,0x87db,0x8000,0x3077,0x7da,0x8000,0x3079,0x87db,0x8000,0x307a,0x7da,0x8000,0x307c,
+0x87db,0x8000,0x307d,0x87da,0x8000,0x3094,0x87da,0x8000,0x309e,0x87da,0x8000,0x30ac,0x87da,0x8000,0x30ae,0x87da,
+0x8000,0x30b0,0x87da,0x8000,0x30b2,0x87da,0x8000,0x30b4,0x87da,0x8000,0x30b6,0x87da,0x8000,0x30b8,0x87da,0x8000,
+0x30ba,0x87da,0x8000,0x30bc,0x87da,0x8000,0x30be,0x87da,0x8000,0x30c0,0x87da,0x8000,0x30c2,0x87da,0x8000,0x30c5,
+0x87da,0x8000,0x30c7,0x87da,0x8000,0x30c9,0x7da,0x8000,0x30d0,0x87db,0x8000,0x30d1,0x7da,0x8000,0x30d3,0x87db,
+0x8000,0x30d4,0x7da,0x8000,0x30d6,0x87db,0x8000,0x30d7,0x7da,0x8000,0x30d9,0x87db,0x8000,0x30da,0x7da,0x8000,
+0x30dc,0x87db,0x8000,0x30dd,0x87da,0x8000,0x30f4,0x87da,0x8000,0x30f7,0x87da,0x8000,0x30f8,0x87da,0x8000,0x30f9,
+0x87da,0x8000,0x30fa,0x87da,0x8000,0x30fe,0x1234
+};
+
+#ifndef U_DARWIN
+static const uint16_t fcdTrie_index[5496]={
+#else /* U_DARWIN */
+static const uint16_t fcdTrie_index[5532]={
+#endif /* U_DARWIN */
+0x218,0x218,0x218,0x218,0x218,0x218,0x2d5,0x2dd,0x2e5,0x2ed,0x2f5,0x2fc,0x218,0x304,0x309,0x311,
+0x317,0x31f,0x218,0x218,0x218,0x218,0x218,0x218,0x456,0x45e,0x234,0x220,0x23c,0x325,0x226,0x218,
+0x32d,0x334,0x33b,0x343,0x4ab,0x218,0x34b,0x351,0x218,0x218,0x218,0x218,0x476,0x4b3,0x4bb,0x218,
+0x4bf,0x359,0x466,0x47e,0x218,0x218,0x361,0x4c7,0x4cb,0x4d0,0x4d8,0x218,0x218,0x218,0x218,0x4de,
+0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x369,0x241,0x218,0x218,0x46e,0x249,0x218,
+0x218,0x251,0x259,0x218,0x218,0x46e,0x371,0x218,0x218,0x46e,0x261,0x218,0x218,0x218,0x371,0x218,
+0x218,0x218,0x377,0x218,0x218,0x46e,0x371,0x218,0x218,0x218,0x371,0x218,0x218,0x218,0x37d,0x218,
+0x218,0x483,0x4e4,0x218,0x218,0x48a,0x491,0x218,0x494,0x4e7,0x218,0x269,0x271,0x218,0x4ee,0x218,
+0x218,0x385,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,
+0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x4a4,0x218,0x218,0x218,0x218,0x218,
+0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,
+0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x4f1,0x4f1,0x218,0x218,0x218,0x218,0x4f7,0x218,
+0x218,0x218,0x218,0x218,0x218,0x4ff,0x218,0x218,0x218,0x502,0x218,0x218,0x218,0x218,0x218,0x218,
+0x509,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x38c,0x393,0x510,0x218,0x218,0x218,0x218,
+0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x518,0x51b,
+0x39b,0x3a2,0x3aa,0x3b1,0x3b9,0x3c1,0x3c8,0x3d0,0x3d8,0x3e0,0x3e7,0x279,0x3ef,0x281,0x289,0x291,
+0x218,0x218,0x218,0x218,0x218,0x218,0x523,0x52b,0x218,0x22c,0x218,0x218,0x3f7,0x3fe,0x403,0x218,
+0x40a,0x411,0x419,0x421,0x425,0x42a,0x218,0x432,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,
+0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,
+0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,
+0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,
+0x218,0x218,0x218,0x218,0x218,0x218,0x299,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,
+0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,
+0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,
+0x218,0x49b,0x437,0x43e,0x446,0x437,0x43e,0x44e,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,
+0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,
+0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,
+0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,
+0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,
+0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,
+0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,
+0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,
+0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,
+0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,
+0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,
+0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,
+0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,
+0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,
+0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,
+0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,
+0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,
+0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,
+0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,
+0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,
+0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,
+0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,
+0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,
+0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,
+0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,
+0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,
+0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,
+0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,
+0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,
+0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,
+0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,
+0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,
+0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,
+0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,
+0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,
+0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,
+0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,
+0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,
+0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,
+0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,
+0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,
+0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,
+0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,
+0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,
+0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,
+0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,
+0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,
+0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,
+0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,
+0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,
+0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,
+0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,
+0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,
+0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,
+0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,
+0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,
+0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,
+0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,
+0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,
+0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,
+0x532,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,
+0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,
+0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,
+0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,
+0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,
+0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,
+0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,
+0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,
+0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,
+0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,
+0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,
+0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,
+0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,
+0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,
+0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,
+0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,
+0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,
+0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,
+0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,
+0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,
+0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,
+0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,
+0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,
+0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,
+#ifndef U_DARWIN
+0x553,0x556,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,
+0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,
+#else /* U_DARWIN */
+0x55c,0x55f,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,
+#endif /* U_DARWIN */
+0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,
+0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,
+0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,
+0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,
+0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,
+0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,
+0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,
+0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,
+0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,
+0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,
+0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,
+0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,
+0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,
+0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,
+0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,
+#ifdef U_DARWIN
+0x218,0x218,0x218,0x218,0x538,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,
+#endif /* U_DARWIN */
+0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x2a1,0x2a9,0x2b1,0x218,0x218,0x218,0x218,0x218,
+0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,
+0x218,0x4a3,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,
+0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,
+0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,
+0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,
+#ifndef U_DARWIN
+0x537,0x53b,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,
+0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x2b5,0x2bd,0x543,0x2c5,0x2cd,0x218,
+0x218,0x218,0x54b,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,
+#else /* U_DARWIN */
+0x540,0x544,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,
+0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x2b5,0x2bd,0x54c,0x2c5,0x2cd,0x218,
+0x218,0x218,0x554,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,
+#endif /* U_DARWIN */
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0xeaea,0xeaea,0xe9e9,0xe6e6,0xe6e6,0xe6e6,0xe6e6,0xe6e6,0xe6e6,0xe6e6,0xe6e6,0xe6e6,0xe6e6,0xe6e6,0xe6e6,0xe6e6,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0xe6,0xe6,0xe6,0xe6,0xe6,0,0,0,0,0xe6,0xe6,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0xe6,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0xe6e6,0xe6e6,0xe6e6,0xe6e6,0xe6e6,0xf0f0,0xe6e6,0xdcdc,0xdcdc,0xdcdc,0xe6e6,0xe6e6,0xe6e6,0xdcdc,0xdcdc,0,
+0xe6e6,0xe6e6,0xe6e6,0xdcdc,0xdcdc,0xdcdc,0xdcdc,0xe6e6,0xe8e8,0xdcdc,0xdcdc,0xe6e6,0xe9e9,0xeaea,0xeaea,0xe9e9,
+0,0,0,0,0,0xe6,0xe6,0,0xe6,0xe6,0xe6,0,0xe6,0,0xe6,0xe6,
+0xe6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0x909,0,0,0,0xe6e6,0xdcdc,0xe6e6,0xe6e6,0,0,0,7,7,7,7,
+7,7,7,7,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0x909,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+7,7,0,7,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,7,0,0,7,0,0,0,0,0,
+0x707,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0x909,0,0,0,0,0,0,0,0,0,0,0,7,7,7,
+0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0x909,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0x8181,0x8282,0x8182,0x8484,0x8184,0x82,0,0x82,0,0x8282,0x8282,
+0x8282,0x8282,0,0,0x8282,0x8182,0xe6e6,0xe6e6,0x909,0,0xe6e6,0xe6e6,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,
+0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,
+0xe6,0xe6,0,0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,
+0xf0,0xf0,0xf0,0xf0,0xe6,0xe6,0xf0,0xf0,0xf0,0,0xe6,0xf0,0xe6,0xe6,0xe6,0xe6,
+0xf0,0,0,0,0,0xe6,0xf0,0xf0,0xf0,0,0xe6,0xf0,0xe6,0xe6,0xe6,0xe6,
+0xf0,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0,0,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,
+0,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,
+0xe6,0xe6,0xe6,0,0,0,0xf0,0xf0,0xf0,0,0xe6,0xf0,0xe6,0xe6,0xe6,0xe6,
+0xf0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0xe,0x1a1a,0x11,0,0,0,0,0,0,0,0,0,0,0x18,0x19,
+0x18,0x19,0x11,0x12,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0,0x15,0x15,0x15,0x15,
+0x15,0,0x15,0,0x15,0x15,0,0x15,0x15,0,0x15,0x15,0x15,0x15,0x15,0x13,
+0x17,0x17,0x17,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0xd8,0xd8,0xd8,0xd8,0xd8,0xd8,0xd8,0xd8d8,0xd8d8,0x101,0x101,0x101,0,0,
+0,0xe2e2,0xd8d8,0xd8d8,0xd8d8,0xd8d8,0xd8d8,0,0,0,0,0,0,0,0,0xdcdc,
+0xdcdc,0xdcdc,0xdcdc,0xdcdc,0,0,0,0,0,0,0,0,0,0,0xe6e6,0xe6e6,
+0xe6e6,0xe6e6,0,0,0,0,0,0,0,0,0,0,0,0,0,0xd8,
+0xd8,0xd8,0xd8,0xd8,0xd8,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0,0xca,0xe6,0xe6,0xe6,0xe6,
+0xe6,0xe6,0xe6,0xe6,0,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0,0,0xe6,0xe6,0xe6,
+0xe6,0xe6,0,0,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0,0xca,0xe6,0xe6,0xe6,0xe6,
+0xe6,0xe6,0xe6,0xe6,0,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0,0,0xe6,0xe6,0xe6,
+0xe6,0xe6,0,0xe6,0xe6,0xe6,0xe6,0xe6,0xca,0xca,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,
+0xe6,0xe6,0xe6,0xe6,0,0,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xca,0xca,0xe6,0xe6,
+0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xca,0xca,0xe6,0xe6,0,0,0xe6,0xe6,0xe6,0xe6,
+0xe6,0xe6,0xca,0xca,0xe6,0,0,0,0xe6,0xe6,0xca,0xca,0,0xe6,0xe6,0xca,
+0xca,0xe6,0xe6,0,0,0,0,0xe6,0xe6,0xca,0xca,0xe6,0xe6,0,0,0,
+0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0,0,0xe6,0xe6,0xca,0xca,0xe6,0xe6,0xe6,0xe6,
+0xe6,0xe6,0xca,0xca,0xe6,0xe6,0,0,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,
+0xe6,0xe6,0xca,0xca,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0,
+0xd8,0xd8,0,0,0,0,0,0,0,0,0,0,0,0,0,0xd8,
+0xd8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,
+0xe6,0,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0,0,0xe6,0xe6,0xe6,0xe6,0xca,0xca,
+0xe6,0xe6,0xe6,0xe6,0xe6,0,0,0,0xe6,0xe6,0,0,0xe6,0xe6,0xe6,0xe6,
+0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,
+0xe6,0xe6,0xe6,0xe6,0xdc,0xdc,0xdc,0xdc,0,0,0xe6,0xe6,0,0,0,0,
+0,0,0xe6,0xe6,0xca,0xca,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xe6,0xe6,
+0xe6,0xe6,0xe6,0xe6,0xe6,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0xe6,0xe6,0,0xe6,0,0,0,0xe6,0,0,0,0,
+0xe6,0xe6,0xe6,0,0,0,0,0,0,0,0,0,0,0xe6,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0xe6,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0xe6,0xe6,0,0xe6,
+0,0,0,0xe6,0,0,0,0,0xe6,0xe6,0xe6,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0xe6,0xe6,0,0,0,0,0,0,0,0,0,0xe6,0xe6,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0xe6,0xe6,0xe6,0xe6,
+0,0,0xe6,0xe6,0,0,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0,0,0xe6,0xe6,
+0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0,0,0xe6,0xe6,0,0,
+0,0,0,0,0,0,0xe6,0xe6,0xe6,0xdc,0xe6,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0xe6,0,0xe6,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0xe6,0,0,0xe6e6,0xe6e6,0xe6e6,0xe6e6,0xe6e6,0xe6e6,
+0xe6e6,0,0,0xe6e6,0,0,0,0,0,0,0,0,0,7,0,0,
+0,0,0,0,0,7,0,0,7,0,0,0,0,0,0,0,
+0x707,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0x909,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0x5b,0,0,0,0,0x909,0,0,0,0,0,0,
+0,0x5454,0x5b5b,0,0,0,0,0,0,0,0,0,0,0,0x909,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,0,
+0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0x707,0,0x909,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0x707,0,0,0,0,0,0,0,0,0,0,0,
+0x909,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0xdc,0xdc,0xe6,0xe6,
+0xdc,0xdc,0xdc,0xdc,0xe6,0xe6,0xe6,0xe6,0xdc,0xdc,0xdc,0xdc,0xca,0xca,0xdc,0xdc,
+0xe6,0xe6,0xe6,0xe6,0xdc,0xdc,0xdc,0xdc,0xe6,0xe6,0xe6,0xe6,0xdc,0xdc,0xe6,0xe6,
+0xca,0xca,0xdc,0xdc,0xdc,0xdc,0xe6,0xe6,0xe6,0xe6,0xdc,0xdc,0xdc,0xdc,0xdc,0xdc,
+0xe6,0xe6,0xdc,0xdc,0xdc,0xdc,0xe6,0xe6,0xe6,0xe6,0xdc,0xdc,0xe6,0xe6,0xdc,0xdc,
+0xdc,0xdc,0xdc,0xdc,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,
+0xe6,0xe6,0xdc,0xdc,0xe6,0xe6,0xdc,0xdc,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,
+0xdc,0xdc,0xdc,0xdc,0xdc,0xdc,0xdc,0xdc,0xdc,0xdc,0xdc,0xdc,0xe6,0xe6,0xe6,0xe6,
+0xe6,0xe6,0xdc,0xdc,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xdc,0xdc,0xe6,0xe6,
+0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xdc,0xdc,0xdc,0xdc,0xdc,0xe6,0xe6,0xe6,0,0xe6,
+0,0,0,0,0xdc,0xdc,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,
+0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xdc,0xdc,0xe6,0xe6,
+0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xdc,0xdc,0xdc,0xdc,0xe6,0xe6,
+0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,
+0xe6,0xe6,0xdc,0xdc,0xdc,0xdc,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,
+0xdc,0xdc,0xe6,0xe6,0xdc,0xdc,0xe6,0xe6,0xe6,0xe6,0,0,0,0,0,0,
+0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,
+0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0,0,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0,0,
+0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,
+0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,
+0xe6,0xe6,0,0,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0,0,0xe6,0xe6,0xe6,0xe6,
+0xe6,0xe6,0xe6,0xe6,0,0xe6,0,0xe6,0,0xe6,0,0xe6,0xf0,0xf0,0xf0,0xf0,
+0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,
+0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,
+0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,1,0,0,1,0,0,1,0,1,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,
+0,1,1,1,1,1,0,0,1,1,0,0,1,1,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,
+0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,8,0,8,0,8,0,8,0,
+8,0,8,0,8,0,8,0,8,0,8,0,0,8,0,8,
+0,8,0,0,0,0,0,0,8,8,0,8,8,0,8,8,
+0,8,8,0,8,8,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,
+0,0x808,0x808,0,0,0,8,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,8,
+8,8,8,0,0,0,8,0,0xe6e6,0xe6e6,0xe6e6,0xe6e6,0xe6e6,0xe6e6,0xe6e6,0xe6e6,
+0xe6e6,0xe6e6,0xe6e6,0xe6e6,0xe6e6,0xe6e6,0xe6e6,0xe6e6,0xe6e6,0xe6e6,0xe6e6,0xe6e6,0xe6e6,0xe8e8,0xdcdc,0xdcdc,
+0xdcdc,0xdcdc,0xe8e8,0xd8d8,0xdcdc,0xdcdc,0xdcdc,0xdcdc,0xdcdc,0xcaca,0xcaca,0xdcdc,0xdcdc,0xdcdc,0xdcdc,0xcaca,
+0xcaca,0xdcdc,0xdcdc,0xdcdc,0xdcdc,0xdcdc,0xdcdc,0xdcdc,0xdcdc,0xdcdc,0xdcdc,0xdcdc,0x101,0x101,0x101,0x101,
+0x101,0xdcdc,0xdcdc,0xdcdc,0xdcdc,0xe6e6,0xe6e6,0xe6e6,0,0,0,0,0,0,0,0,
+0,0,0,0x1b1b,0x1c1c,0x1d1d,0x1e1e,0x1f1f,0x2020,0x2121,0x2222,0xe6e6,0xe6e6,0xdcdc,0xdcdc,0xe6e6,
+0xe6e6,0xe6e6,0xe6e6,0xe6e6,0xdcdc,0xe6e6,0xe6e6,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0x707,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0xdcdc,0xe6e6,0xe6e6,0xe6e6,0xe6e6,0xdcdc,0xe6e6,
+0xe6e6,0xe6e6,0xdede,0xdcdc,0xe6e6,0xe6e6,0xe6e6,0xe6e6,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0x2323,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0x6767,0x6767,0x909,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0x7676,0x7676,0,0,0,0,0,0,0,0,0,0,0x7a7a,0x7a7a,0x7a7a,0x7a7a,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0xdcdc,0xdcdc,0,0,0,0,0,0,
+0,0,0,0,0,0,0xdada,0xe4e4,0xe8e8,0xdede,0xe0e0,0xe0e0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0xe6e6,0xe6e6,0xe6e6,0xe6e6,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xe6e6,
+0xe6e6,0xe6e6,0xe6e6,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0xe6e6,0xe6e6,0xdcdc,0xdcdc,
+0xdcdc,0xdcdc,0xdcdc,0xdcdc,0xe6e6,0xe6e6,0xdcdc,0xe6e6,0xe6e6,0xdede,0xe4e4,0xe6e6,0xa0a,0xb0b,0xc0c,0xd0d,
+0xe0e,0xf0f,0x1010,0x1111,0x1212,0x1313,0x1313,0x1414,0x1515,0x1616,0,0x1717,0,0x1818,0x1919,0,
+0xe6e6,0xdcdc,0,0x1212,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0xe6e6,0xe6e6,0xe6e6,0xe6e6,
+0xe6e6,0xe6e6,0,0,0,0,0,0,0,0,0,0,0xe6e6,0xe6e6,0xe6e6,0xdcdc,
+0xe6e6,0,0,0xe6e6,0xe6e6,0,0xdcdc,0xe6e6,0xe6e6,0xdcdc,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0x2424,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0xe6e6,0xdcdc,0xe6e6,0xe6e6,0xdcdc,0xe6e6,0xe6e6,0xdcdc,0xdcdc,0xdcdc,0xe6e6,0xdcdc,0xdcdc,0xe6e6,0xdcdc,0xe6e6,
+0xe6e6,0xe6e6,0xdcdc,0xe6e6,0xdcdc,0xe6e6,0xdcdc,0xe6e6,0xdcdc,0xe6e6,0xe6e6,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0xe6e6,0xe6e6,0xe6e6,0xe6e6,0xe6e6,0xe6e6,0xe6e6,0xdcdc,0xe6e6,0,0,0,0,
+0,0,0,0,0,0,0,0,0x6b6b,0x6b6b,0x6b6b,0x6b6b,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0xdcdc,0,0xdcdc,0,0xd8d8,0,0,0,0,0,0,0,0,0xdcdc,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0x909,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0x909,0,
+0,0,0,0,0,0,0,0,0,0xe6e6,0,0,0,0,0,0,
+0,0,0,0,0,0xe4e4,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0xdede,0xe6e6,0xdcdc,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0xe6e6,0xdcdc,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0xe6e6,0xdcdc,0xe6e6,0xe6e6,0xe6e6,
+0xe6e6,0xe6e6,0xe6e6,0xe6e6,0,0,0,0,0,0,0,0,0,0,0,0,
+0xe6e6,0xe6e6,0xdcdc,0xe6e6,0xe6e6,0xe6e6,0xe6e6,0xe6e6,0xe6e6,0xe6e6,0xdcdc,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0xe6e6,0xdcdc,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0xe6e6,0xe6e6,0x101,0x101,
+0xe6e6,0xe6e6,0xe6e6,0xe6e6,0x101,0x101,0x101,0xe6e6,0xe6e6,0,0,0,0,0xe6e6,0,0,
+0,0x101,0x101,0xe6e6,0xdcdc,0xe6e6,0x101,0x101,0xdcdc,0xdcdc,0xdcdc,0xdcdc,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0x909,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+#ifndef U_DARWIN
+0,0,0,0,0,0,0,0,0,0xdcdc,0,0xe6e6,0,0,0,0,
+#else /* U_DARWIN */
+0,0,0,0,0,0,0,0,0,0,0x6b6b,0x6b6b,0x6b6b,0x6b6b,0x6b6b,0x6b6b,
+0x6b6b,0x6b6b,0x6b6b,0x6b6b,0x6b6b,0x6b6b,0,0,0,0,0,0,0,0,0,0x1212,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0xdcdc,0,0xe6e6,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0xe6e6,0x101,0xdcdc,0,0,0,0,0x909,
+0xdcdc,0xdcdc,0xdcdc,0,0,0xe6e6,0xe6e6,0xe6e6,0xe6e6,0xe6e6,0xdcdc,0xdcdc,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0xe6e6,0xe6e6,0xe6e6,0,0,0,0,0,0,0,0,0,0,0,
+#endif /* U_DARWIN */
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+#ifndef U_DARWIN
+0,0,0,0,0xe6e6,0x101,0xdcdc,0,0,0,0,0x909,0xdcdc,0xdcdc,0xdcdc,0,
+0,0xe6e6,0xe6e6,0xe6e6,0xe6e6,0xe6e6,0xdcdc,0xdcdc,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xe6e6,0xe6e6,
+0xe6e6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0x820,0,
+#else /* U_DARWIN */
+0,0,0x820,0,0,0,0,0,0,0,0,0,0,0,0,0,
+#endif /* U_DARWIN */
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+#ifndef U_DARWIN
+0,0,0,0,0,0,0,0,0,0,0,0,0x840,0,0,0,
+0,0,0,0,0,0,0,0
+#else /* U_DARWIN */
+0x840,0,0,0,0,0,0,0,0,0,0,0
+#endif /* U_DARWIN */
+};
+
+static const UTrie fcdTrie={
+ fcdTrie_index,
+ NULL,
+ utrie_defaultGetFoldingOffset,
+ 2144,
+#ifndef U_DARWIN
+ 3352,
+#else /* U_DARWIN */
+ 3388,
+#endif /* U_DARWIN */
+ 0,
+ FALSE
+};
+
+#ifndef U_DARWIN
+static const uint16_t auxTrie_index[5748]={
+#else /* U_DARWIN */
+static const uint16_t auxTrie_index[5784]={
+#endif /* U_DARWIN */
+0x228,0x228,0x228,0x228,0x228,0x228,0x3ea,0x3f2,0x3fa,0x402,0x40a,0x412,0x228,0x228,0x41a,0x422,
+0x42a,0x432,0x228,0x228,0x228,0x228,0x228,0x228,0x4be,0x4be,0x315,0x230,0x31d,0x228,0x238,0x23e,
+0x228,0x228,0x228,0x228,0x513,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x4ec,0x51b,0x523,0x228,
+0x527,0x43a,0x4c6,0x448,0x228,0x228,0x43d,0x52f,0x533,0x22c,0x4cb,0x228,0x228,0x228,0x228,0x539,
+0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x445,0x322,0x228,0x228,0x4ce,0x32a,0x228,
+0x228,0x332,0x33a,0x228,0x228,0x445,0x53e,0x228,0x228,0x4ce,0x342,0x228,0x228,0x4d6,0x44d,0x228,
+0x228,0x228,0x453,0x228,0x228,0x445,0x45b,0x228,0x228,0x4d6,0x44d,0x228,0x228,0x228,0x461,0x228,
+0x228,0x4f4,0x502,0x228,0x228,0x4fb,0x502,0x228,0x4fb,0x542,0x34a,0x352,0x35a,0x362,0x549,0x228,
+0x228,0x469,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x4de,0x228,0x4e4,0x4cd,0x228,
+0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x50c,0x228,0x228,0x228,0x228,0x228,
+0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,
+0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x447,0x447,0x228,0x228,0x228,0x228,0x54d,0x228,
+0x228,0x228,0x228,0x228,0x228,0x53f,0x228,0x228,0x228,0x555,0x228,0x228,0x228,0x228,0x228,0x228,
+0x55c,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x470,0x477,0x539,0x228,0x228,0x228,0x228,
+0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x245,0x24d,0x228,0x228,0x228,0x4cb,0x43b,
+0x47f,0x487,0x48c,0x492,0x49a,0x4a2,0x4a5,0x4a9,0x228,0x228,0x228,0x369,0x4af,0x371,0x379,0x37f,
+0x387,0x228,0x228,0x228,0x228,0x253,0x563,0x56b,0x25b,0x263,0x26b,0x228,0x228,0x228,0x228,0x228,
+0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x38d,0x228,0x228,0x228,0x228,0x228,0x228,
+0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,
+0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,
+0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,
+0x228,0x228,0x228,0x228,0x228,0x228,0x390,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,
+0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,
+0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,
+0x228,0x508,0x228,0x228,0x4b6,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,
+0x228,0x228,0x26f,0x228,0x228,0x228,0x274,0x228,0x228,0x228,0x228,0x278,0x280,0x286,0x28e,0x228,
+0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,
+0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,
+0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,
+0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,
+0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,
+0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,
+0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,
+0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,
+0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,
+0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,
+0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,
+0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,
+0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,
+0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,
+0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,
+0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,
+0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,
+0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,
+0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,
+0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,
+0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,
+0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,
+0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,
+0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,
+0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,
+0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,
+0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,
+0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,
+0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,
+0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,
+0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,
+0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,
+0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,
+0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,
+0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,
+0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,
+0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,
+0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,
+0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,
+0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,
+0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,
+0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,
+0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,
+0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,
+0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,
+0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,
+0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,
+0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,
+0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,
+0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,
+0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,
+0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,
+0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,
+0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,
+0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,
+0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,
+0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,
+0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,
+0x549,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,
+0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,
+0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,
+0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,
+0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,
+0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,
+0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,
+0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,
+0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,
+0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,
+0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,
+0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,
+0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,
+0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,
+0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,
+0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,
+0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,
+0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,
+0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,
+0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,
+0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,
+0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,
+0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,
+0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,
+#ifndef U_DARWIN
+0x58c,0x58f,0x228,0x595,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,
+#else /* U_DARWIN */
+0x595,0x598,0x228,0x59e,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,
+#endif /* U_DARWIN */
+0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,
+0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,
+0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,
+0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,
+0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,
+0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,
+0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,
+0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,
+0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,
+0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,
+0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,
+0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,
+0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,
+0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,
+0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,
+#ifndef U_DARWIN
+0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x398,0x398,0x398,0x398,0x398,0x398,0x398,0x398,
+#else /* U_DARWIN */
+0x228,0x228,0x228,0x228,0x571,0x228,0x228,0x228,0x398,0x398,0x398,0x398,0x398,0x398,0x398,0x398,
+#endif /* U_DARWIN */
+0x39d,0x3a5,0x398,0x3ab,0x398,0x398,0x3af,0x228,0x3b6,0x3be,0x3c6,0x228,0x228,0x228,0x228,0x228,
+0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,
+0x228,0x50b,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,
+0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,
+0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,
+0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,
+#ifndef U_DARWIN
+0x570,0x574,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,
+0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x3ca,0x3d2,0x57c,0x3da,0x3e2,0x228,
+0x228,0x228,0x584,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,
+#else /* U_DARWIN */
+0x579,0x57d,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,
+0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x3ca,0x3d2,0x585,0x3da,0x3e2,0x228,
+0x228,0x228,0x58d,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,
+#endif /* U_DARWIN */
+0x296,0x29d,0x299,0x2a0,0x2a8,0x2b0,0x29e,0x29a,0x2b7,0x2bf,0x2c7,0x29f,0x2a7,0x296,0x29d,0x299,
+0x2a0,0x2cf,0x297,0x29e,0x29a,0x2d7,0x2df,0x2e7,0x2ee,0x2f6,0x2e2,0x2fe,0x2f1,0x306,0x30d,0x228,
+0x398,0x398,0x398,0x398,0x398,0x398,0x398,0x398,0x398,0x398,0x398,0x398,0x398,0x398,0x398,0x398,
+0x399,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,
+0,0,0,0,0x400,0,0,0,0,0,1,0,0,0,0x400,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,4,6,8,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0xa,0,0,0,0,0,
+0,0xb,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0xc,0xe,0x10,0,0x12,0x14,0x16,0x18,0x1a,0x1c,0x1e,0x20,0x22,0x24,0x26,0,
+0x28,0x2a,0x2c,0x2e,0x30,0x32,0x34,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0x36,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0x39,0x3b,
+0,0,0,0x3e,0,0x40,0,0x1b,0x1b,0x1b,0,0,0x1d,0x1d,0x23,0,
+0,0x27,0x43,0,0,0x2d,0x46,0x2f,0x2f,0x2f,0,0,0x48,0x4b,0x4f,0,
+0x52,0,0x400,0,0x53,0,0x400,0x400,0x11,0x3a,0,0,0x15,0x42,0,0x25,
+0,0,0,0,0,0,0,0x54,0,0,0x58,0x5a,0,0,0,0,
+0,0x13,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0x5c,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0x60,0,0x63,0x66,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0x6a,0,0x6e,0,0x71,0,0,0,0,0x74,0,0,0,0,0,
+0x77,0x7a,0x7d,0x80,0x83,0x86,0x89,0x8c,0,0,0x8f,0x92,0x95,0,0,0,
+0x98,0x9b,0x9f,0xa3,0xa7,0,0,0,0,0,0,0,0,0,0,0,
+0,0xab,0xae,0xb2,0xb6,0,0,0,0,0,0,0,0xba,0xbd,0xc0,0xc3,
+0xc6,0xc9,0xcc,0xcf,0xd2,0xd5,0xd8,0xdb,0xde,0xe1,0,0xe4,0,0,0xe7,0xec,
+0xf0,0xf3,0,0xf6,0,0xf9,0xfc,0,0,0,0,0,0,0,0,0xff,
+0,0x102,0x106,0,0x109,0x10c,0x10f,0x113,0xd,0x11,0x3a,0x13,0x15,0x42,0x19,0x1b,
+0x1d,0x1f,0x21,0x23,0x25,0x27,0x29,0x2d,0x47,0x2f,0x38,0x31,0x33,0x65,0x35,0x57,
+0xf5,0x53,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0xd,0x11,0x3a,0x13,0x15,0x42,0x19,0x1b,
+0x1d,0x1f,0x21,0x23,0x25,0x27,0x29,0x2d,0x47,0x2f,0x38,0x31,0x33,0x65,0x35,0x57,
+0xf5,0x53,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0xd,0,0x3a,0x13,
+0,0,0x19,0,0,0x1f,0x21,0,0,0x27,0x29,0x2d,0x47,0,0x38,0x31,
+0x33,0x65,0x35,0x57,0xf5,0x53,0,0,0,0,0,0,0,0,0,0,
+0xd,0x11,0,0x13,0x15,0x42,0x19,0,0,0x1f,0x21,0x23,0x25,0x27,0x29,0x2d,
+0x47,0,0x38,0x31,0x33,0x65,0x35,0x57,0xf5,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0xd,0x11,0,0x13,0x15,0x42,0x19,0,0x1d,0x1f,0x21,0x23,
+0x25,0,0x29,0,0,0,0x38,0x31,0x33,0x65,0x35,0x57,0xf5,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0xf5,0x53,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0xd,0x11,0x3a,0x13,0,0,0,0,
+0,0,0,0,0x117,0x119,0x59,0x11b,0x11d,0x11f,0x121,0x123,3,0x125,0x127,0x7e,
+0x129,0x12b,0x12d,0x5b,0x12f,0x124,0xb,0x131,5,0x133,0x135,0x137,0xe0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xb,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0x118,0x11a,
+0x59,0x11c,0x11e,0x120,0x122,0x124,3,0x126,0x128,0x7e,0x12a,0x12c,0x12e,0x5b,0x130,0x124,
+0xb,0x132,5,0x134,0x136,0x138,0xe0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0xb,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0x118,0x11a,0x59,0x11c,0x11e,0x120,0x122,0x124,3,0x126,0x128,0x7e,
+0x12a,0x12c,0x12e,0x5b,0x130,0x124,0xb,0x132,5,0x134,0x136,0x138,0xe0,0,0,0,
+0,0,0,0,0,0,0,0,0x128,0x7e,0x12a,0x12c,0x12e,0x5b,0x130,0x124,
+0xb,0x132,5,0x134,0x136,0x138,0xe0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0x130,0x124,0xb,0x132,5,0x134,0x136,0x138,
+0xe0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0xb,0,0,0,0,0,0,0,0,0,0,0x139,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0xc00,0xc00,0x800,0xc00,0xc00,0x800,0x800,0x800,0x800,0x800,0x800,0x800,
+0x800,0x800,0x800,0,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,
+0x800,0x800,0x800,0x800,0,0,0,0,0,0,0,0x400,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0x800,0,0,0,0x800,0x800,0x800,0x800,0,0,0,
+0x400,0x400,0x400,0x400,0x400,0x400,0x400,0x400,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0x800,0,0,0,0,0,0,0,0,0,0x800,
+0,0,0,0,0x400,0x400,0,0x400,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0x400,0,0,0x400,0,
+0,0,0,0,0x800,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0x800,0,0,0,0,0,0,0,0,0,0,
+0,0x400,0x400,0x400,0,0,0x400,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0x800,0,0,0,0,0,0,0,0,0x800,0x800,
+0,0,0,0,0x400,0x400,0,0,0,0,0,0x400,0,0,0,0,
+0,0,0,0,0,0x400,0,0,0,0,0x400,0,0,0,0,0x400,
+0,0,0,0,0x400,0,0,0,0,0,0,0,0,0,0,0,
+0,0x400,0,0,0,0,0,0,0,0x800,0x800,0x400,0x800,0x400,0x400,0,
+0x400,0,0x800,0x800,0x800,0x800,0,0,0x800,0x400,0x800,0x800,0x800,0,0x800,0x800,
+0,0,0,0,0,0,0,0,0,0,0,0x400,0,0,0,0,
+0,0,0,0,0,0x400,0,0,0,0,0x400,0,0,0,0,0x400,
+0,0,0,0,0x400,0,0,0,0,0,0,0,0,0x800,0,0x800,
+0,0x400,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0x400,0,0x400,0,0x400,0,0x400,0,0x400,0,0x400,
+0,0x400,0,0,0x1000,0x1000,0,0,0,0,0,0,0x1000,0x1000,0,0,
+0,0,0,0,0,0,0,0x1000,0,0,0,0,0,0,0,0x400,
+0x1000,0,0x400,0,0,0,0,0x1000,0,0,0,0,0,0x400,0,0x400,
+0x1000,0,0,0,0,0,0,0x400,0,0,0,0,0,0,0,0x400,
+0,0,0,0,0,0,0,0x400,0,0,0x400,0x400,0,0,0,0x1000,
+0,0,0,0,0,0x400,0,0x400,0x1000,0x400,0,0,0x400,0x400,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0x400,0x400,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0x400,0,0,0,
+0x400,0x400,0x400,0x400,0x400,0x400,0x400,0x400,0x400,0x400,0x400,0x400,0x400,0x400,0x400,0x400,
+0x400,0x400,0x400,0x400,0x400,0x400,0x400,0x400,0x400,0x400,0x400,0x400,0x400,0x400,0x400,0x400,
+0x400,0x400,0,0,0x400,0,0x400,0,0,0x400,0x400,0x400,0x400,0x400,0x400,0x400,
+0x400,0x400,0x400,0,0x400,0,0x400,0,0,0x400,0x400,0,0,0,0x400,0x400,
+0x400,0x400,0,0,0x400,0x400,0x400,0x400,0x400,0x400,0x400,0x400,0x400,0x400,0x400,0x400,
+0x400,0x400,0x400,0x400,0x400,0x400,0x400,0,0,0,0,0,0x400,0x400,0x400,0x400,
+0x400,0x400,0x400,0x400,0x400,0x400,0x400,0x400,0x400,0x400,0x400,0x400,0x400,0x400,0x400,0x400,
+0x400,0x400,0x400,0x400,0x400,0x400,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0x400,0x800,0x400,0,0,0,0,0,0,0,0,
+0,0,0x400,0x400,0x400,0x400,0x400,0x400,0x400,0x400,0x400,0x400,0x400,0x400,0x400,0,
+0x400,0x400,0x400,0x400,0x400,0,0x400,0,0x400,0x400,0,0x400,0x400,0,0x400,0x400,
+0x400,0x400,0x400,0x400,0x400,0x400,0x400,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0x400,0x400,0x400,0x400,0x400,0x400,0x400,0x800,0x800,0x800,
+0x800,0x800,0,0,0,0x800,0x800,0x800,0x800,0x800,0x800,0,0,0,0,0,
+0,0,0,0x800,0x800,0x800,0x800,0x800,0,0,0,0,0,0,0,0,
+0,0,0x800,0x800,0x800,0x800,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0x400,0x400,0x400,0x400,0x400,0x400,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0x1000,0x1000,0,0x1000,0,0,0,0,
+0x1000,0x1000,0,0x1000,0x1000,0x1000,0x1000,0,0,0x1000,0x1000,0x1000,0,0,0,0,
+0,0x1000,0x1000,0x1000,0,0x1000,0,0,0x1000,0x1000,0,0x1000,0,0,0,0,
+0x1000,0x1000,0,0x1000,0x1000,0x1000,0x1000,0,0,0x1000,0x1000,0x1000,0,0,0,0,
+0,0x1000,0x1000,0x1000,0,0x1000,0,0x1000,0x1000,0x1000,0,0,0,0,0x1000,0x1000,
+0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0,0,0,0,0x1000,0x1000,0x1000,0x1000,
+0,0,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0,0,0x1000,0x1000,0,0,
+0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0,0,0x1000,0,0,0,0,0,0,0,
+0,0x1000,0x1000,0,0,0x1000,0x1000,0,0,0,0,0x1000,0x1000,0,0,0x1000,
+0x1000,0,0,0,0,0,0x1000,0x1000,0x1000,0x1000,0,0,0x1000,0x1000,0,0,
+0x1000,0x1000,0,0,0x1000,0x1000,0,0,0,0,0,0,0x1000,0x1000,0,0,
+0,0,0,0,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0,0,0x1000,0x1000,0x1000,0x1000,
+0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,
+0x1000,0x1000,0x1000,0x1000,0x1000,0,0x1000,0x1000,0x1000,0x1000,0,0,0,0,0x1000,0x1000,
+0x1000,0x1000,0,0,0,0,0,0,0,0,0,0,0x1000,0x1000,0,0,
+0x1000,0x1000,0x1000,0x1000,0,0,0,0,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,
+0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,
+0x1000,0x1000,0x1000,0x1000,0,0,0x1000,0x1000,0,0,0,0,0,0,0,0,
+0,0,0x1000,0x1000,0x1000,0x1000,0,0,0x1000,0x1000,0x1000,0x1000,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0x1000,0x1000,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0x800,0x800,0x800,0x800,0x800,0x800,
+0x800,0,0,0x800,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0x800,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0x800,0,0,0,0,0,0,0,0,0,0x800,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0x800,0,0,0,0,0,0,
+0,0x800,0x800,0,0,0,0,0,0,0,0,0,0,0,0x800,0,
+0,0,0,0,0,0,0,0,0,0x800,0,0,0,0,0,0,
+0,0x800,0x800,0,0,0,0,0,0,0,0,0,0,0,0x800,0,
+0,0,0,0x800,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0x800,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0x800,0,0,0,0,0,0,0,0,0x800,0,0x800,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0x800,0x800,0,0,0,0,0,0,0,0,0,0,
+0x800,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0x1000,0x1000,0x1000,0x1000,
+0,0,0,0,0,0,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0,0,0x1000,0x1000,
+0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0,0,0,0,0x1000,0x1000,0x1000,0x1000,
+0x1000,0x1000,0x1000,0x1000,0,0,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,
+0x1000,0x1000,0,0,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,
+0x1000,0x1000,0x1000,0x1000,0,0,0,0,0x1000,0x1000,0,0,0x1000,0x1000,0x1000,0x1000,
+0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,
+0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0,0,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,
+0,0,0,0,0,0,0x1000,0x1000,0x1000,0x1000,0,0,0,0,0x1000,0x1000,
+0x1000,0x1000,0,0,0,0,0,0,0,0,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,
+0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,
+0,0,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,
+0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0,0,0x1000,0x1000,0x1000,0x1000,0,0,
+0,0,0,0,0x1000,0x1000,0,0,0,0,0,0,0x1000,0x1000,0,0,
+0,0,0,0,0x1000,0x1000,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0x800,0x800,0,0,0,0,0,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,
+0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,
+0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0,0,0,0,0,0,0,0,
+0,0,0,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,
+0x800,0x800,0x800,0x800,0x800,0x800,0x800,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0x800,0,0x800,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0x800,0,0,0x800,0x800,0x800,0x800,0x800,0x800,0x800,
+0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0,0,
+0,0,0,0,0,0,0,0,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,
+0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0x800,0x800,0x800,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0x800,0x800,0,0,0,0,0,0,0,0,0,0,
+0x800,0x800,0x800,0x800,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0x800,0x800,0x800,0x800,0x800,0x800,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0x800,
+0x800,0x800,0x800,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0x800,0x800,0x800,0x800,
+0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,
+0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0,0x800,0,0x800,0x800,0,
+0x800,0x800,0,0x800,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0x800,0x800,0x800,0x800,
+0x800,0x800,0,0,0,0,0,0,0,0,0,0,0x800,0x800,0x800,0x800,
+0x800,0,0,0x800,0x800,0,0x800,0x800,0x800,0x800,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0x800,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0x800,
+0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0x800,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0x800,0,0x800,
+0,0x800,0,0,0,0,0,0,0,0,0x800,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0x800,0,0,0,0,0,0,0,0,0,
+0,0x800,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0x800,0x800,0x800,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0x800,0x800,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0x800,0x800,0x800,0x800,
+0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0,0,0,0,0x800,0,0,
+0,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0,0,0,0,
+#ifndef U_DARWIN
+0,0,0,0,0,0,0,0,0,0,0,0,0,0x800,0,0x800,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0x800,0x800,0x800,0,0,0,0,0x800,
+0x800,0x800,0x800,0,0,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0,0,0,0,
+#else /* U_DARWIN */
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0x800,0x800,
+0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0,0,0,0,0,0,
+0,0,0,0x800,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0x800,0,0x800,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0x800,0x800,0x800,0,
+0,0,0,0x800,0x800,0x800,0x800,0,0,0x800,0x800,0x800,0x800,0x800,0x800,0x800,
+#endif /* U_DARWIN */
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+#ifndef U_DARWIN
+0,0,0x800,0x800,0x800,0,0,0,0,0,0,0,0,0,0,0,
+#else /* U_DARWIN */
+0,0,0,0,0,0,0x800,0x800,0x800,0,0,0,0,0,0,0,
+#endif /* U_DARWIN */
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+#ifndef U_DARWIN
+0,0,0x841,0,0,0,0,0,0,0,0,0,0,0,0,0,
+#else /* U_DARWIN */
+0,0,0,0,0,0,0x841,0,0,0,0,0,0,0,0,0,
+#endif /* U_DARWIN */
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+#ifndef U_DARWIN
+0xc42,0x43,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+#else /* U_DARWIN */
+0,0,0,0,0xc42,0x43,0,0,0,0,0,0,0,0,0,0,
+#endif /* U_DARWIN */
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+#ifndef U_DARWIN
+0,0,0x444,0
+#else /* U_DARWIN */
+0,0,0,0,0,0,0x444,0
+#endif /* U_DARWIN */
+};
+
+static const UTrie auxTrie={
+ auxTrie_index,
+ NULL,
+ getFoldingAuxOffset,
+ 2208,
+#ifndef U_DARWIN
+ 3540,
+#else /* U_DARWIN */
+ 3576,
+#endif /* U_DARWIN */
+ 0,
+ FALSE
+};
+
+static const uint16_t canonStartSets[7724]={
+0x109b,0x8ae,0x153,0x1a9c,0x1ab4,0x1e2c,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0x32,0xc0,0xc6,0x100,0x101,0x102,0x103,0x104,0x105,0x1cd,0x1ce,0x1de,0x1df,0x1e0,0x1e1,0x1fa,
+0x1fb,0x200,0x201,0x202,0x203,0x226,0x227,0x1e00,0x1e01,0x1ea0,0x1ea1,0x1ea2,0x1ea3,0x1ea4,0x1ea5,0x1ea6,
+0x1ea7,0x1ea8,0x1ea9,0x1eaa,0x1eab,0x1eac,0x1ead,0x1eae,0x1eaf,0x1eb0,0x1eb1,0x1eb2,0x1eb3,0x1eb4,0x1eb5,0x1eb6,
+0x1eb7,0x212b,0x212c,6,0x1e02,0x1e03,0x1e04,0x1e05,0x1e06,0x1e07,0xc,0xc7,0xc8,0x106,0x107,0x108,
+0x109,0x10a,0x10b,0x10c,0x10d,0x1e08,0x1e09,0xc,0x10e,0x10f,0x1e0a,0x1e0b,0x1e0c,0x1e0d,0x1e0e,0x1e0f,
+0x1e10,0x1e11,0x1e12,0x1e13,0x2c,0xc8,0xcc,0x112,0x113,0x114,0x115,0x116,0x117,0x118,0x119,0x11a,
+0x11b,0x204,0x205,0x206,0x207,0x228,0x229,0x1e14,0x1e15,0x1e16,0x1e17,0x1e18,0x1e19,0x1e1a,0x1e1b,0x1e1c,
+0x1e1d,0x1eb8,0x1eb9,0x1eba,0x1ebb,0x1ebc,0x1ebd,0x1ebe,0x1ebf,0x1ec0,0x1ec1,0x1ec2,0x1ec3,0x1ec4,0x1ec5,0x1ec6,
+0x1ec7,0xe,0x11c,0x11d,0x11e,0x11f,0x120,0x121,0x122,0x123,0x1e6,0x1e7,0x1f4,0x1f5,0x1e20,0x1e21,
+0xe,0x124,0x125,0x21e,0x21f,0x1e22,0x1e23,0x1e24,0x1e25,0x1e26,0x1e27,0x1e28,0x1e29,0x1e2a,0x1e2b,0x1a,
+0xcc,0xd0,0x128,0x129,0x12a,0x12b,0x12c,0x12d,0x12e,0x12f,0x130,0x131,0x1cf,0x1d0,0x208,0x209,
+0x20a,0x20b,0x1e2c,0x1e2d,0x1e2e,0x1e2f,0x1ec8,0x1ec9,0x1eca,0x1ecb,0xc,0x136,0x137,0x1e8,0x1e9,0x1e30,
+0x1e31,0x1e32,0x1e33,0x1e34,0x1e35,0x212a,0x212b,0xe,0x139,0x13a,0x13b,0x13c,0x13d,0x13e,0x1e36,0x1e37,
+0x1e38,0x1e39,0x1e3a,0x1e3b,0x1e3c,0x1e3d,6,0x1e3e,0x1e3f,0x1e40,0x1e41,0x1e42,0x1e43,0x12,0xd1,0xd2,
+0x143,0x144,0x145,0x146,0x147,0x148,0x1f8,0x1f9,0x1e44,0x1e45,0x1e46,0x1e47,0x1e48,0x1e49,0x1e4a,0x1e4b,
+0x3c,0xd2,0xd7,0x14c,0x14d,0x14e,0x14f,0x150,0x151,0x1a0,0x1a1,0x1d1,0x1d2,0x1ea,0x1eb,0x1ec,
+0x1ed,0x20c,0x20d,0x20e,0x20f,0x22a,0x22b,0x22c,0x22d,0x22e,0x22f,0x230,0x231,0x1e4c,0x1e4d,0x1e4e,
+0x1e4f,0x1e50,0x1e51,0x1e52,0x1e53,0x1ecc,0x1ecd,0x1ece,0x1ecf,0x1ed0,0x1ed1,0x1ed2,0x1ed3,0x1ed4,0x1ed5,0x1ed6,
+0x1ed7,0x1ed8,0x1ed9,0x1eda,0x1edb,0x1edc,0x1edd,0x1ede,0x1edf,0x1ee0,0x1ee1,0x1ee2,0x1ee3,4,0x1e54,0x1e55,
+0x1e56,0x1e57,0x12,0x154,0x155,0x156,0x157,0x158,0x159,0x210,0x211,0x212,0x213,0x1e58,0x1e59,0x1e5a,
+0x1e5b,0x1e5c,0x1e5d,0x1e5e,0x1e5f,0x14,0x15a,0x15b,0x15c,0x15d,0x15e,0x15f,0x160,0x161,0x218,0x219,
+0x1e60,0x1e61,0x1e62,0x1e63,0x1e64,0x1e65,0x1e66,0x1e67,0x1e68,0x1e69,0xe,0x162,0x163,0x164,0x165,0x21a,
+0x21b,0x1e6a,0x1e6b,0x1e6c,0x1e6d,0x1e6e,0x1e6f,0x1e70,0x1e71,0x36,0xd9,0xdd,0x168,0x169,0x16a,0x16b,
+0x16c,0x16d,0x16e,0x16f,0x170,0x171,0x172,0x173,0x1af,0x1b0,0x1d3,0x1d4,0x1d5,0x1d6,0x1d7,0x1d8,
+0x1d9,0x1da,0x1db,0x1dc,0x214,0x215,0x216,0x217,0x1e72,0x1e73,0x1e74,0x1e75,0x1e76,0x1e77,0x1e78,0x1e79,
+0x1e7a,0x1e7b,0x1ee4,0x1ee5,0x1ee6,0x1ee7,0x1ee8,0x1ee9,0x1eea,0x1eeb,0x1eec,0x1eed,0x1eee,0x1eef,0x1ef0,0x1ef1,
+4,0x1e7c,0x1e7d,0x1e7e,0x1e7f,0xc,0x174,0x175,0x1e80,0x1e81,0x1e82,0x1e83,0x1e84,0x1e85,0x1e86,0x1e87,
+0x1e88,0x1e89,4,0x1e8a,0x1e8b,0x1e8c,0x1e8d,0x12,0xdd,0xde,0x176,0x177,0x178,0x179,0x232,0x233,
+0x1e8e,0x1e8f,0x1ef2,0x1ef3,0x1ef4,0x1ef5,0x1ef6,0x1ef7,0x1ef8,0x1ef9,0xc,0x179,0x17a,0x17b,0x17c,0x17d,
+0x17e,0x1e90,0x1e91,0x1e92,0x1e93,0x1e94,0x1e95,0x30,0xe0,0xe6,0x101,0x102,0x103,0x104,0x105,0x106,
+0x1ce,0x1cf,0x1df,0x1e0,0x1e1,0x1e2,0x1fb,0x1fc,0x201,0x202,0x203,0x204,0x227,0x228,0x1e01,0x1e02,
+0x1ea1,0x1ea2,0x1ea3,0x1ea4,0x1ea5,0x1ea6,0x1ea7,0x1ea8,0x1ea9,0x1eaa,0x1eab,0x1eac,0x1ead,0x1eae,0x1eaf,0x1eb0,
+0x1eb1,0x1eb2,0x1eb3,0x1eb4,0x1eb5,0x1eb6,0x1eb7,0x1eb8,6,0x1e03,0x1e04,0x1e05,0x1e06,0x1e07,0x1e08,0xc,
+0xe7,0xe8,0x107,0x108,0x109,0x10a,0x10b,0x10c,0x10d,0x10e,0x1e09,0x1e0a,0xc,0x10f,0x110,0x1e0b,
+0x1e0c,0x1e0d,0x1e0e,0x1e0f,0x1e10,0x1e11,0x1e12,0x1e13,0x1e14,0x2c,0xe8,0xec,0x113,0x114,0x115,0x116,
+0x117,0x118,0x119,0x11a,0x11b,0x11c,0x205,0x206,0x207,0x208,0x229,0x22a,0x1e15,0x1e16,0x1e17,0x1e18,
+0x1e19,0x1e1a,0x1e1b,0x1e1c,0x1e1d,0x1e1e,0x1eb9,0x1eba,0x1ebb,0x1ebc,0x1ebd,0x1ebe,0x1ebf,0x1ec0,0x1ec1,0x1ec2,
+0x1ec3,0x1ec4,0x1ec5,0x1ec6,0x1ec7,0x1ec8,0xe,0x11d,0x11e,0x11f,0x120,0x121,0x122,0x123,0x124,0x1e7,
+0x1e8,0x1f5,0x1f6,0x1e21,0x1e22,0x10,0x125,0x126,0x21f,0x220,0x1e23,0x1e24,0x1e25,0x1e26,0x1e27,0x1e28,
+0x1e29,0x1e2a,0x1e2b,0x1e2c,0x1e96,0x1e97,0x18,0xec,0xf0,0x129,0x12a,0x12b,0x12c,0x12d,0x12e,0x12f,
+0x130,0x1d0,0x1d1,0x209,0x20a,0x20b,0x20c,0x1e2d,0x1e2e,0x1e2f,0x1e30,0x1ec9,0x1eca,0x1ecb,0x1ecc,4,
+0x135,0x136,0x1f0,0x1f1,0xa,0x137,0x138,0x1e9,0x1ea,0x1e31,0x1e32,0x1e33,0x1e34,0x1e35,0x1e36,0xe,
+0x13a,0x13b,0x13c,0x13d,0x13e,0x13f,0x1e37,0x1e38,0x1e39,0x1e3a,0x1e3b,0x1e3c,0x1e3d,0x1e3e,6,0x1e3f,
+0x1e40,0x1e41,0x1e42,0x1e43,0x1e44,0x12,0xf1,0xf2,0x144,0x145,0x146,0x147,0x148,0x149,0x1f9,0x1fa,
+0x1e45,0x1e46,0x1e47,0x1e48,0x1e49,0x1e4a,0x1e4b,0x1e4c,0x3c,0xf2,0xf7,0x14d,0x14e,0x14f,0x150,0x151,
+0x152,0x1a1,0x1a2,0x1d2,0x1d3,0x1eb,0x1ec,0x1ed,0x1ee,0x20d,0x20e,0x20f,0x210,0x22b,0x22c,0x22d,
+0x22e,0x22f,0x230,0x231,0x232,0x1e4d,0x1e4e,0x1e4f,0x1e50,0x1e51,0x1e52,0x1e53,0x1e54,0x1ecd,0x1ece,0x1ecf,
+0x1ed0,0x1ed1,0x1ed2,0x1ed3,0x1ed4,0x1ed5,0x1ed6,0x1ed7,0x1ed8,0x1ed9,0x1eda,0x1edb,0x1edc,0x1edd,0x1ede,0x1edf,
+0x1ee0,0x1ee1,0x1ee2,0x1ee3,0x1ee4,4,0x1e55,0x1e56,0x1e57,0x1e58,0x12,0x155,0x156,0x157,0x158,0x159,
+0x15a,0x211,0x212,0x213,0x214,0x1e59,0x1e5a,0x1e5b,0x1e5c,0x1e5d,0x1e5e,0x1e5f,0x1e60,0x14,0x15b,0x15c,
+0x15d,0x15e,0x15f,0x160,0x161,0x162,0x219,0x21a,0x1e61,0x1e62,0x1e63,0x1e64,0x1e65,0x1e66,0x1e67,0x1e68,
+0x1e69,0x1e6a,0x10,0x163,0x164,0x165,0x166,0x21b,0x21c,0x1e6b,0x1e6c,0x1e6d,0x1e6e,0x1e6f,0x1e70,0x1e71,
+0x1e72,0x1e97,0x1e98,0x36,0xf9,0xfd,0x169,0x16a,0x16b,0x16c,0x16d,0x16e,0x16f,0x170,0x171,0x172,
+0x173,0x174,0x1b0,0x1b1,0x1d4,0x1d5,0x1d6,0x1d7,0x1d8,0x1d9,0x1da,0x1db,0x1dc,0x1dd,0x215,0x216,
+0x217,0x218,0x1e73,0x1e74,0x1e75,0x1e76,0x1e77,0x1e78,0x1e79,0x1e7a,0x1e7b,0x1e7c,0x1ee5,0x1ee6,0x1ee7,0x1ee8,
+0x1ee9,0x1eea,0x1eeb,0x1eec,0x1eed,0x1eee,0x1eef,0x1ef0,0x1ef1,0x1ef2,4,0x1e7d,0x1e7e,0x1e7f,0x1e80,0xe,
+0x175,0x176,0x1e81,0x1e82,0x1e83,0x1e84,0x1e85,0x1e86,0x1e87,0x1e88,0x1e89,0x1e8a,0x1e98,0x1e99,4,0x1e8b,
+0x1e8c,0x1e8d,0x1e8e,0x14,0xfd,0xfe,0xff,0x100,0x177,0x178,0x233,0x234,0x1e8f,0x1e90,0x1e99,0x1e9a,
+0x1ef3,0x1ef4,0x1ef5,0x1ef6,0x1ef7,0x1ef8,0x1ef9,0x1efa,0xc,0x17a,0x17b,0x17c,0x17d,0x17e,0x17f,0x1e91,
+0x1e92,0x1e93,0x1e94,0x1e95,0x1e96,6,0x385,0x386,0x1fc1,0x1fc2,0x1fed,0x1fef,4,0x1e2,0x1e3,0x1fc,
+0x1fd,4,0x1e3,0x1e4,0x1fd,0x1fe,8,0x386,0x387,0x1f08,0x1f10,0x1f88,0x1f90,0x1fb8,0x1fbd,6,
+0x388,0x389,0x1f18,0x1f1e,0x1fc8,0x1fca,8,0x389,0x38a,0x1f28,0x1f30,0x1f98,0x1fa0,0x1fca,0x1fcd,8,
+0x38a,0x38b,0x3aa,0x3ab,0x1f38,0x1f40,0x1fd8,0x1fdc,6,0x38c,0x38d,0x1f48,0x1f4e,0x1ff8,0x1ffa,0xe,
+0x38e,0x38f,0x3ab,0x3ac,0x1f59,0x1f5a,0x1f5b,0x1f5c,0x1f5d,0x1f5e,0x1f5f,0x1f60,0x1fe8,0x1fec,0xa,0x38f,
+0x390,0x1f68,0x1f70,0x1fa8,0x1fb0,0x1ffa,0x1ffd,0x2126,0x2127,0xc,0x3ac,0x3ad,0x1f00,0x1f08,0x1f70,0x1f72,
+0x1f80,0x1f88,0x1fb0,0x1fb5,0x1fb6,0x1fb8,6,0x3ad,0x3ae,0x1f10,0x1f16,0x1f72,0x1f74,0xc,0x3ae,0x3af,
+0x1f20,0x1f28,0x1f74,0x1f76,0x1f90,0x1f98,0x1fc2,0x1fc5,0x1fc6,0x1fc8,0x10,0x390,0x391,0x3af,0x3b0,0x3ca,
+0x3cb,0x1f30,0x1f38,0x1f76,0x1f78,0x1fbe,0x1fbf,0x1fd0,0x1fd4,0x1fd6,0x1fd8,6,0x3cc,0x3cd,0x1f40,0x1f46,
+0x1f78,0x1f7a,2,0x1fe4,0x1fe6,0xe,0x3b0,0x3b1,0x3cb,0x3cc,0x3cd,0x3ce,0x1f50,0x1f58,0x1f7a,0x1f7c,
+0x1fe0,0x1fe4,0x1fe6,0x1fe8,0xc,0x3ce,0x3cf,0x1f60,0x1f68,0x1f7c,0x1f7e,0x1fa0,0x1fa8,0x1ff2,0x1ff5,0x1ff6,
+0x1ff8,2,0x3d3,0x3d5,4,0x4d0,0x4d1,0x4d2,0x4d3,4,0x400,0x402,0x4d6,0x4d7,4,0x4c1,
+0x4c2,0x4dc,0x4dd,8,0x40d,0x40e,0x419,0x41a,0x4e2,0x4e3,0x4e4,0x4e5,8,0x40e,0x40f,0x4ee,
+0x4ef,0x4f0,0x4f1,0x4f2,0x4f3,4,0x4d1,0x4d2,0x4d3,0x4d4,4,0x450,0x452,0x4d7,0x4d8,4,
+0x4c2,0x4c3,0x4dd,0x4de,8,0x439,0x43a,0x45d,0x45e,0x4e3,0x4e4,0x4e5,0x4e6,8,0x45e,0x45f,
+0x4ef,0x4f0,0x4f1,0x4f2,0x4f3,0x4f4,2,0xfb2e,0xfb31,4,0xfb31,0xfb32,0xfb4c,0xfb4d,4,0xfb35,
+0xfb36,0xfb4b,0xfb4c,4,0xfb1d,0xfb1e,0xfb39,0xfb3a,4,0xfb3b,0xfb3c,0xfb4d,0xfb4e,4,0xfb44,0xfb45,
+0xfb4e,0xfb4f,4,0xfb2a,0xfb2e,0xfb49,0xfb4a,4,0x622,0x624,0x625,0x626,2,0x9cb,0x9cd,4,
+0xb48,0xb49,0xb4b,0xb4d,4,0xbca,0xbcb,0xbcc,0xbcd,4,0xcc7,0xcc9,0xcca,0xccc,4,0xd4a,
+0xd4b,0xd4c,0xd4d,4,0xdda,0xddb,0xddc,0xddf,6,0xf73,0xf74,0xf75,0xf76,0xf81,0xf82,2,
+0xac00,0xae4c,2,0xae4c,0xb098,2,0xb098,0xb2e4,2,0xb2e4,0xb530,2,0xb530,0xb77c,2,0xb77c,
+0xb9c8,2,0xb9c8,0xbc14,2,0xbc14,0xbe60,2,0xbe60,0xc0ac,2,0xc0ac,0xc2f8,2,0xc2f8,0xc544,
+2,0xc544,0xc790,2,0xc790,0xc9dc,2,0xc9dc,0xcc28,2,0xcc28,0xce74,2,0xce74,0xd0c0,2,
+0xd0c0,0xd30c,2,0xd30c,0xd558,2,0xd558,0xd7a4,2,0x1fcd,0x1fd0,2,0x1fdd,0x1fe0,2,0x3070,
+0x3072,2,0x3073,0x3075,2,0x3076,0x3078,2,0x3079,0x307b,2,0x307c,0x307e,2,0x30d0,0x30d2,
+2,0x30d3,0x30d5,2,0x30d6,0x30d8,2,0x30d9,0x30db,2,0x30dc,0x30de,0x8004,0,2,0xf80c,
+2,0xf80d,0x8004,0,2,0xf813,2,0xf814,0x8004,0,2,0xf9ca,2,0xf9cb,0x8004,0,
+2,0xf81f,2,0xf820,0x8004,0,2,0xf824,2,0xf825,0x8004,0,2,0xf867,2,0xf868,
+0x8004,0,2,0xf868,2,0xf869,0x8004,0,2,0xf876,2,0xf877,0x8004,0,2,0xf883,
+2,0xf884,0x8004,0,2,0xf888,2,0xf889,0x8004,0,2,0xf88a,2,0xf88b,0x8004,0,
+2,0xf896,2,0xf897,0x8004,0,2,0xf89b,2,0xf89c,0x8004,0,2,0xf8a2,2,0xf8a3,
+0x8004,0,2,0xf8a1,2,0xf8a2,0x8004,0,2,0xf8c2,2,0xf8c3,0x8004,0,2,0xf8c7,
+2,0xf8c8,0x8004,0,2,0xf8d1,2,0xf8d2,0x8004,0,2,0xf8d0,2,0xf8d1,0x8004,0,
+2,0xf8ce,2,0xf8cf,0x8004,0,2,0xf8de,2,0xf8df,0x8006,2,0xfad2,0xfad3,2,0xf8e7,
+2,0xf8e8,0x8004,0,2,0xf8ee,2,0xf8ef,0x8004,0,2,0xf8f2,2,0xf8f3,0x8004,0,
+2,0xf90a,2,0xf90b,0x8004,0,2,0xf916,2,0xf917,0x8004,0,2,0xf92a,2,0xf92b,
+0x8004,0,2,0xf92c,2,0xf92e,0x8004,0,2,0xf933,2,0xf934,0x8004,0,2,0xf93e,
+2,0xf93f,0x8004,0,2,0xf93f,2,0xf940,0x8006,2,0xfad4,0xfad5,2,0xf949,2,0xf94a,
+0x8004,0,2,0xf94b,2,0xf94c,0x8004,0,2,0xf94c,2,0xf94d,0x8004,0,2,0xf951,
+2,0xf952,0x8004,0,2,0xf958,2,0xf959,0x8004,0,2,0xf960,2,0xf961,0x8004,0,
+2,0xf964,2,0xf965,0x8004,0,2,0xf967,2,0xf968,0x8004,0,2,0xf96d,2,0xf96e,
+0x8004,0,2,0xf971,2,0xf972,0x8004,0,2,0xf974,2,0xf975,0x8004,0,2,0xf981,
+2,0xf982,0x8004,0,2,0xf8d7,2,0xf8d8,0x8004,0,2,0xf984,2,0xf985,0x8004,0,
+2,0xf98e,2,0xf98f,0x8004,0,2,0xf9a7,2,0xf9a8,0x8004,0,2,0xf9ae,2,0xf9af,
+0x8004,0,2,0xf9af,2,0xf9b0,0x8004,0,2,0xf9b2,2,0xf9b3,0x8004,0,2,0xf9bf,
+2,0xf9c0,0x8004,0,2,0xf9c2,2,0xf9c3,0x8004,0,2,0xf9c8,2,0xf9c9,0x8004,0,
+2,0xf9cd,2,0xf9ce,0x8004,0,2,0xf9ce,2,0xf9cf,0x8004,0,2,0xf9ef,2,0xf9f0,
+0x8004,0,2,0xf9f2,2,0xf9f3,0x8004,0,2,0xf9f8,2,0xf9f9,0x8004,0,2,0xf9f9,
+2,0xf9fa,0x8004,0,2,0xf9fc,2,0xf9fd,0x8004,0,2,0xfa03,2,0xfa04,0x8004,0,
+2,0xfa08,2,0xfa09,0x8004,0,2,0xfa0d,2,0xfa0e,0x8004,0,2,0xfa0e,2,0xfa0f,
+0x8004,0,2,0xfa11,2,0xfa12,0x8004,0,2,0xfa16,2,0xfa17,0x8004,0,2,0xf801,
+2,0xf802,0x8004,0,2,0xf800,2,0xf801,0x8004,0,2,0xf802,2,0xf803,0x8004,0,
+2,0xf819,2,0xf81a,0x8004,0,2,0xf804,2,0xf805,0x8006,2,0xfa30,0xfa31,2,0xf805,
+2,0xf806,0x8004,0,2,0xf806,2,0xf807,0x8004,0,2,0xf807,2,0xf808,0x8004,0,
+2,0xf808,2,0xf809,0x8004,0,2,0xf809,2,0xf80a,0x8004,0,2,0xf80b,2,0xf80c,
+0x8006,2,0xfa31,0xfa32,2,0xf80a,2,0xf80b,0x8006,2,0xfa32,0xfa33,2,0xf80e,2,0xf80f,
+0x8004,0,2,0xf80f,2,0xf810,0x8004,0,2,0xf810,2,0xf811,0x8004,0,2,0xf814,
+2,0xf815,0x8004,0,2,0xf811,2,0xf812,0x8004,0,2,0xf815,2,0xf816,0x8004,0,
+2,0xf8d2,2,0xf8d3,0x8004,0,2,0xf8d3,2,0xf8d4,0x8004,0,2,0xf817,2,0xf818,
+0x8004,0,2,0xf818,2,0xf819,0x8004,0,2,0xf81a,2,0xf81b,0x8006,2,0xfa71,0xfa72,
+2,0xf81b,2,0xf81c,0x8004,0,2,0xf81d,2,0xf81e,0x8004,0,2,0xf81e,2,0xf81f,
+0x8006,2,0xfa00,0xfa01,2,0xf850,2,0xf851,0x8004,0,2,0xf820,2,0xf821,0x8004,0,
+2,0xf821,2,0xf822,0x8004,0,2,0xf822,2,0xf823,0x8004,0,2,0xf823,2,0xf824,
+0x8004,0,2,0xf992,2,0xf993,0x8006,2,0xfa76,0xfa77,2,0xf825,2,0xf826,0x8006,2,
+0xfa33,0xfa34,2,0xf826,2,0xf827,0x8006,2,0xfa34,0xfa35,2,0xf827,2,0xf828,0x8006,2,
+0xfa77,0xfa78,2,0xf828,2,0xf829,0x8004,0,2,0xf829,2,0xf82a,0x8004,0,2,0xf82a,
+2,0xf82b,0x8006,2,0xf963,0xf964,2,0xf82b,2,0xf82c,0x8004,0,2,0xf82c,2,0xf82d,
+0x8006,2,0xfa35,0xfa36,2,0xf82d,2,0xf82e,0x8004,0,2,0xf82e,2,0xf82f,0x8004,0,
+2,0xf82f,2,0xf830,0x8004,0,2,0xf830,2,0xf831,0x8004,0,2,0xf831,2,0xf834,
+0x8004,0,2,0xf836,2,0xf837,0x8004,0,2,0xf837,2,0xf838,0x8004,0,2,0xf839,
+2,0xf83a,0x8004,0,2,0xf83a,2,0xf83b,0x8004,0,2,0xf83b,2,0xf83c,0x8004,0,
+2,0xf83d,2,0xf83e,0x8004,0,2,0xf83e,2,0xf83f,0x8004,0,2,0xf83f,2,0xf840,
+0x8004,0,2,0xf83c,2,0xf83d,0x8004,0,2,0xf840,2,0xf841,0x8004,0,2,0xf841,
+2,0xf842,0x8004,0,2,0xf842,2,0xf843,0x8004,0,2,0xf843,2,0xf844,0x8004,0,
+2,0xf844,2,0xf845,0x8004,0,2,0xf845,2,0xf847,0x8006,2,0xfa7a,0xfa7b,2,0xf847,
+2,0xf848,4,0xfa36,0xfa37,0xfa78,0xfa79,0x8004,0,2,0xf848,2,0xf849,0x8004,0,2,
+0xf849,2,0xf84a,0x8004,0,2,0xf84a,2,0xf84b,0x8006,2,0xfa37,0xfa38,2,0xf84c,2,
+0xf84d,0x8004,0,2,0xf84e,2,0xf84f,0x8004,0,2,0xf84f,2,0xf850,0x8004,0,2,
+0xf84b,2,0xf84c,0x8004,0,2,0xf84d,2,0xf84e,0x8004,0,2,0xf855,2,0xf856,0x8004,
+0,2,0xf852,2,0xf853,0x8004,0,2,0xf853,2,0xf854,0x8004,0,2,0xf854,2,
+0xf855,0x8004,0,2,0xf857,2,0xf858,0x8004,0,2,0xf856,2,0xf857,4,0xfa10,0xfa11,
+0xfa7c,0xfa7d,0x8004,0,2,0xf858,2,0xf859,0x8004,0,2,0xf851,2,0xf852,0x8004,0,
+2,0xf85a,2,0xf85b,0x8004,0,2,0xf85b,2,0xf85c,0x8004,0,2,0xf85c,2,0xf85d,
+0x8004,0,2,0xf85d,2,0xf85e,0x8004,0,2,0xf85e,2,0xf85f,0x8004,0,2,0xf85f,
+2,0xf860,0x8004,0,2,0xf865,2,0xf866,0x8004,0,2,0xf862,2,0xf863,0x8004,0,
+2,0xf863,2,0xf864,0x8004,0,2,0xf864,2,0xf865,0x8004,0,2,0xf866,2,0xf867,
+0x8004,0,2,0xf986,2,0xf987,0x8004,0,2,0xf869,2,0xf86a,0x8004,0,2,0xf86a,
+2,0xf86c,0x8004,0,2,0xf86d,2,0xf86e,0x8004,0,2,0xf86e,2,0xf86f,0x8008,4,
+0xf95f,0xf960,0xf9aa,0xf9ab,2,0xf86f,2,0xf870,0x8004,0,2,0xf870,2,0xf871,0x8004,0,
+2,0xf872,2,0xf873,0x8004,0,2,0xf873,2,0xf874,0x8004,0,2,0xf875,2,0xf876,
+0x8004,0,2,0xf877,2,0xf878,0x8006,2,0xfa3c,0xfa3d,2,0xf878,2,0xf879,0x8004,0,
+2,0xf87a,2,0xf87b,0x8004,0,2,0xf879,2,0xf87a,0x8004,0,2,0xf87c,2,0xf87d,
+0x8004,0,2,0xf87f,2,0xf880,0x8004,0,2,0xf87e,2,0xf87f,0x8004,0,2,0xf880,
+2,0xf881,0x8004,0,2,0xf9f4,2,0xf9f5,0x8004,0,2,0xf881,2,0xf882,0x8004,0,
+2,0xf882,2,0xf883,0x8004,0,2,0xf884,2,0xf885,0x8004,0,2,0xf885,2,0xf886,
+0x8004,0,2,0xf886,2,0xf887,0x8004,0,2,0xf887,2,0xf888,0x8004,0,2,0xf88b,
+2,0xf88c,0x8004,0,2,0xf88c,2,0xf88d,0x8004,0,2,0xf88d,2,0xf88e,0x8006,2,
+0xf928,0xf929,2,0xf88e,2,0xf88f,0x8004,0,2,0xf890,2,0xf891,0x8004,0,2,0xf894,
+2,0xf896,0x8004,0,2,0xf874,2,0xf875,0x8004,0,2,0xf899,2,0xf89a,0x8004,0,
+2,0xf89a,2,0xf89b,0x8004,0,2,0xf89c,2,0xf89d,0x8004,0,2,0xf89d,2,0xf89e,
+0x8004,0,2,0xf89e,2,0xf89f,0x8004,0,2,0xf89f,2,0xf8a0,0x8004,0,2,0xf8a0,
+2,0xf8a1,0x8006,2,0xfa3d,0xfa3e,2,0xf8a3,2,0xf8a4,0x8004,0,2,0xf8a5,2,0xf8a6,
+0x8004,0,2,0xf8a6,2,0xf8a7,0x8008,0,2,0xf8a7,2,0xf8a8,2,0xf8a9,2,0xf8aa,
+0x8006,2,0xfa87,0xfa88,2,0xf8a8,2,0xf8a9,0x8004,0,2,0xf8aa,2,0xf8ab,0x8008,4,
+0xfa3f,0xfa40,0xfa89,0xfa8a,2,0xf8ab,2,0xf8ac,0x8004,0,2,0xf8ad,2,0xf8ae,0x8004,0,
+2,0xf8ae,2,0xf8af,0x8004,0,2,0xf8ac,2,0xf8ad,0x8004,0,2,0xf8af,2,0xf8b0,
+0x8008,4,0xfa40,0xfa41,0xfa8b,0xfa8c,2,0xf8b0,2,0xf8b1,0x8006,2,0xf90d,0xf90e,2,0xf8b1,
+2,0xf8b2,0x8004,0,2,0xf8b2,2,0xf8b3,0x8004,0,2,0xf8b3,2,0xf8b4,0x8004,0,
+2,0xf8b4,2,0xf8b5,0x8004,0,2,0xf8b5,2,0xf8b6,0x8004,0,2,0xf8b6,2,0xf8b7,
+0x8004,0,2,0xf8ba,2,0xf8bb,0x8004,0,2,0xf8b9,2,0xf8ba,0x8004,0,2,0xf8b7,
+2,0xf8b8,0x8004,0,2,0xf8bb,2,0xf8bc,0x8004,0,2,0xf8bc,2,0xf8bd,0x8004,0,
+2,0xf8c1,2,0xf8c2,0x8004,0,2,0xf8c0,2,0xf8c1,0x8004,0,2,0xf8bd,2,0xf8be,
+0x8004,0,2,0xf8bf,2,0xf8c0,0x8004,0,2,0xf8c3,2,0xf8c4,0x8004,0,2,0xf8c6,
+2,0xf8c7,0x8004,0,2,0xf8c4,2,0xf8c5,0x8004,0,2,0xf8c5,2,0xf8c6,0x8006,2,
+0xfa41,0xfa42,2,0xf8c8,2,0xf8c9,0x8004,0,2,0xf8c9,2,0xf8ca,0x8004,0,2,0xf8cb,
+2,0xf8cc,0x8004,0,2,0xf8cd,2,0xf8ce,4,0xfa12,0xfa13,0xfa91,0xfa92,0x8006,2,0xfa43,
+0xfa44,2,0xf8cf,2,0xf8d0,0x8004,0,2,0xf8d5,2,0xf8d6,0x8004,0,2,0xf8cc,2,
+0xf8cd,0x8004,0,2,0xf8d4,2,0xf8d5,0x8008,4,0xf929,0xf92a,0xfa92,0xfa93,2,0xf8d8,2,
+0xf8d9,0x8006,2,0xfa93,0xfa94,2,0xf8d9,2,0xf8da,0x8004,0,2,0xf8da,2,0xf8db,0x8004,
+0,2,0xf8dc,2,0xf8dd,0x8004,0,2,0xf8db,2,0xf8dc,0x8004,0,2,0xf8e0,2,
+0xf8e1,0x8004,0,2,0xf8df,2,0xf8e0,0x8004,0,2,0xf8e5,2,0xf8e6,0x8004,0,2,
+0xf8e1,2,0xf8e2,0x8006,2,0xfa44,0xfa45,2,0xf8e2,2,0xf8e3,0x8004,0,2,0xf8e4,2,
+0xf8e5,0x8004,0,2,0xf8e6,2,0xf8e7,0x8004,0,2,0xf8e8,2,0xf8e9,0x8004,0,2,
+0xf8e9,2,0xf8ea,0x8004,0,2,0xf8ea,2,0xf8eb,6,0xf914,0xf915,0xf95c,0xf95d,0xf9bf,0xf9c0,
+0x8004,0,2,0xf8eb,2,0xf8ec,0x8004,0,2,0xf8ed,2,0xf8ee,0x8004,0,2,0xf8ef,
+2,0xf8f0,0x8004,0,2,0xf8f1,2,0xf8f2,0x8004,0,2,0xf8f3,2,0xf8f4,0x8004,0,
+2,0xf8f4,2,0xf8f5,0x8008,4,0xf970,0xf971,0xfa96,0xfa97,2,0xf8f5,2,0xf8f6,0x8004,0,
+2,0xf8f6,2,0xf8f7,0x8004,0,2,0xf8fa,2,0xf8fb,0x8004,0,2,0xf8fe,2,0xf8ff,
+0x8004,0,2,0xf8fc,2,0xf8fd,0x8004,0,2,0xf8fd,2,0xf8fe,0x8004,0,2,0xf8ff,
+2,0xf900,0x8004,0,2,0xf907,2,0xf908,0x8004,0,2,0xf900,2,0xf901,0x8008,4,
+0xf9ca,0xf9cb,0xfa97,0xfa98,2,0xf902,2,0xf903,0x8004,0,2,0xf903,2,0xf904,0x8006,2,
+0xfa45,0xfa46,2,0xf901,2,0xf902,0x8004,0,2,0xf904,2,0xf905,0x8004,0,2,0xf905,
+2,0xf906,0x8004,0,2,0xf90e,2,0xf90f,0x8004,0,2,0xf908,2,0xf909,0x8004,0,
+2,0xf909,2,0xf90a,0x8004,0,2,0xf90c,2,0xf90d,0x8006,2,0xfa99,0xfa9a,2,0xf90b,
+2,0xf90c,4,0xfa47,0xfa48,0xfa9a,0xfa9b,0x8004,0,2,0xf90f,2,0xf910,0x8004,0,2,
+0xf912,2,0xf913,0x8004,0,2,0xf915,2,0xf916,0x8006,2,0xfa9b,0xfa9c,2,0xf914,2,
+0xf915,0x8004,0,2,0xf913,2,0xf914,0x8004,0,2,0xf917,2,0xf918,0x8004,0,2,
+0xf835,2,0xf836,0x8004,0,2,0xf919,2,0xf91a,0x8004,0,2,0xf918,2,0xf919,0x8004,
+0,2,0xf91a,2,0xf91b,0x8004,0,2,0xf91c,2,0xf91d,4,0xfa48,0xfa49,0xfa9c,0xfa9d,
+0x8004,0,2,0xf91e,2,0xf91f,0x8004,0,2,0xf920,2,0xf921,0x8006,2,0xfa9e,0xfa9f,
+2,0xf921,2,0xf922,0x8004,0,2,0xf922,2,0xf923,0x8004,0,2,0xf924,2,0xf925,
+0x8004,0,2,0xf925,2,0xf926,4,0xfa16,0xfa17,0xfaa0,0xfaa1,0x8004,0,2,0xf928,2,
+0xf929,4,0xf961,0xf962,0xf9db,0xf9dc,0x8004,0,2,0xf929,2,0xf92a,0x8004,0,2,0xf92b,
+2,0xf92c,0x8004,0,2,0xf92e,2,0xf92f,0x8004,0,2,0xf92f,2,0xf930,0x8006,2,
+0xfaa1,0xfaa2,2,0xf930,2,0xf931,0x8004,0,2,0xf931,2,0xf932,0x8004,0,2,0xf932,
+2,0xf933,0x8004,0,2,0xf934,2,0xf935,0x8004,0,2,0xf936,2,0xf937,0x8006,2,
+0xf962,0xf963,2,0xf938,2,0xf939,0x8004,0,2,0xf93a,2,0xf93b,4,0xfa17,0xfa18,0xfaa6,
+0xfaa7,0x8006,2,0xfaa8,0xfaa9,2,0xf940,2,0xf941,0x8004,0,2,0xf945,2,0xf946,0x8004,
+0,2,0xf946,2,0xf948,0x8006,2,0xfaa9,0xfaaa,2,0xf948,2,0xf949,0x8004,0,2,
+0xf94a,2,0xf94b,0x8004,0,2,0xf94e,2,0xf94f,0x8006,2,0xf93b,0xf93c,2,0xf94f,2,
+0xf950,0x8006,2,0xfaab,0xfaac,2,0xf950,2,0xf951,0x8006,2,0xfa50,0xfa51,2,0xf953,2,
+0xf954,0x8006,2,0xfa1b,0xfa1c,2,0xf956,2,0xf957,0x8004,0,2,0xf957,2,0xf958,0x8006,
+2,0xfa54,0xfa55,2,0xf959,2,0xf95a,0x8004,0,2,0xf95a,2,0xf95b,0x8004,0,2,
+0xf95b,2,0xf95c,0x8004,0,2,0xf95f,2,0xf960,4,0xfa56,0xfa57,0xfaad,0xfaae,0x8004,0,
+2,0xf962,2,0xf963,0x8004,0,2,0xf963,2,0xf964,0x8004,0,2,0xf966,2,0xf967,
+0x8004,0,2,0xf969,2,0xf96a,0x8004,0,2,0xf968,2,0xf969,0x8004,0,2,0xf96a,
+2,0xf96b,0x8004,0,2,0xf96c,2,0xf96d,0x8004,0,2,0xf96e,2,0xf96f,6,0xf996,
+0xf997,0xfa57,0xfa58,0xfab0,0xfab1,0x8004,0,2,0xf96f,2,0xf970,0x8004,0,2,0xf970,2,
+0xf971,0x8004,0,2,0xf976,2,0xf977,0x8004,0,2,0xf978,2,0xf979,0x8004,0,2,
+0xf979,2,0xf97a,0x8008,4,0xfa5b,0xfa5c,0xfab2,0xfab3,2,0xf97a,2,0xf97b,0x8004,0,2,
+0xf97d,2,0xf97e,0x8004,0,2,0xf97f,2,0xf980,0x8004,0,2,0xf8d6,2,0xf8d7,0x8004,
+0,2,0xf982,2,0xf983,0x8004,0,2,0xf983,2,0xf984,0x8004,0,2,0xf985,2,
+0xf986,0x8008,0,2,0xf893,2,0xf894,2,0xf98b,2,0xf98c,0x8004,0,2,0xf98c,2,
+0xf98d,2,0xfa5d,0xfa5f,0x8004,0,2,0xf990,2,0xf991,0x8004,0,2,0xf98f,2,0xf990,
+0x8004,0,2,0xf991,2,0xf992,0x8004,0,2,0xf993,2,0xf994,0x8004,0,2,0xf994,
+2,0xf995,0x8004,0,2,0xf995,2,0xf996,0x8006,2,0xf974,0xf975,2,0xf998,2,0xf999,
+0x8004,0,2,0xf996,2,0xf997,0x8004,0,2,0xf999,2,0xf99a,0x8004,0,2,0xf99c,
+2,0xf99d,0x8004,0,2,0xf9a0,2,0xf9a1,0x8004,0,2,0xf99a,2,0xf99b,0x8004,0,
+2,0xf99b,2,0xf99c,0x8004,0,2,0xf99d,2,0xf99e,0x8004,0,2,0xf9a1,2,0xf9a2,
+0x8004,0,2,0xf9a2,2,0xf9a3,0x8004,0,2,0xf9a3,2,0xf9a4,0x8004,0,2,0xf99e,
+2,0xf99f,0x8006,2,0xfa5f,0xfa60,2,0xf99f,2,0xf9a0,0x8004,0,2,0xf9a8,2,0xf9a9,
+0x8004,0,2,0xf9a9,2,0xf9aa,0x8004,0,2,0xf9aa,2,0xf9ab,0x8004,0,2,0xf9ac,
+2,0xf9ad,0x8004,0,2,0xf9b3,2,0xf9b4,0x8006,2,0xf936,0xf937,2,0xf9b4,2,0xf9b5,
+0x8004,0,2,0xf9b5,2,0xf9b6,0x8004,0,2,0xf9b6,2,0xf9b7,0x8004,0,2,0xf9b8,
+2,0xf9b9,0x8004,0,2,0xf9b7,2,0xf9b8,0x8004,0,2,0xf9ba,2,0xf9bb,0x8004,0,
+2,0xf9b9,2,0xf9ba,0x8004,0,2,0xf9bc,2,0xf9bd,0x8004,0,2,0xf9bd,2,0xf9be,
+0x8006,2,0xfab5,0xfab6,2,0xf9bb,2,0xf9bc,0x8004,0,2,0xf9be,2,0xf9bf,0x8004,0,
+2,0xf9c0,2,0xf9c1,0x8004,0,2,0xf9c1,2,0xf9c2,0x8004,0,2,0xf9c3,2,0xf9c4,
+0x8004,0,2,0xf9c4,2,0xf9c5,0x8004,0,2,0xf9c6,2,0xf9c7,0x8004,0,2,0xf9c7,
+2,0xf9c8,0x8004,0,2,0xf9c9,2,0xf9ca,4,0xfa61,0xfa62,0xfab8,0xfab9,0x8004,0,2,
+0xf9cf,2,0xf9d0,4,0xf96f,0xf970,0xf9a1,0xf9a2,0x8006,2,0xfabe,0xfabf,2,0xf9d0,2,0xf9d1,
+4,0xfa22,0xfa23,0xfaba,0xfabb,4,0xf95d,0xf95e,0xfabd,0xfabe,4,0xfa62,0xfa63,0xfabc,0xfabd,4,
+0xfa63,0xfa64,0xfabf,0xfac0,0x8006,2,0xfac0,0xfac1,2,0xf9d1,2,0xf9d2,0x8004,0,2,0xf9d2,
+2,0xf9d3,0x8004,0,2,0xf9d4,2,0xf9d5,0x8004,0,2,0xf9d5,2,0xf9d6,4,0xfa65,
+0xfa66,0xfac1,0xfac2,0x8004,0,2,0xf9d6,2,0xf9d7,0x8004,0,2,0xf9d7,2,0xf9d8,0x8004,
+0,2,0xf9db,2,0xf9dc,0x8004,0,2,0xf9da,2,0xf9db,0x8004,0,2,0xf9dc,2,
+0xf9dd,0x8004,0,2,0xf9de,2,0xf9df,0x8006,2,0xfac2,0xfac3,2,0xf9df,2,0xf9e0,0x8004,
+0,2,0xf98d,2,0xf98e,4,0xfa25,0xfa26,0xfa67,0xfa68,0x8004,0,2,0xf9e2,2,0xf9e3,
+0x8004,0,2,0xf9e3,2,0xf9e4,0x8004,0,2,0xf9e4,2,0xf9e5,0x8004,0,2,0xf9e6,
+2,0xf9e7,0x8004,0,2,0xf9e7,2,0xf9e8,0x8004,0,2,0xf9ea,2,0xf9eb,0x8004,0,
+2,0xf9e8,2,0xf9e9,0x8004,0,2,0xf9e9,2,0xf9ea,0x8004,0,2,0xf9eb,2,0xf9ec,
+0x8004,0,2,0xf9ec,2,0xf9ed,0x8004,0,2,0xf9ee,2,0xf9ef,0x8004,0,2,0xf9f0,
+2,0xf9f1,0x8004,0,2,0xf9f3,2,0xf9f4,4,0xfa68,0xfa69,0xfac7,0xfac8,0x8004,0,2,
+0xf9f5,2,0xf9f6,4,0xfa1c,0xfa1d,0xfac8,0xfac9,0x8004,0,2,0xf9fa,2,0xf9fb,4,0xfa69,
+0xfa6a,0xfaca,0xfacb,0x8006,2,0xfacb,0xfacc,2,0xf9fe,2,0xfa00,0x8004,0,2,0xfa00,2,
+0xfa01,4,0xfa6a,0xfa6b,0xfacc,0xfacd,0x8004,0,2,0xfa02,2,0xfa03,0x8004,0,2,0xfa04,
+2,0xfa05,0x8004,0,2,0xfa05,2,0xfa06,0x8004,0,2,0xfa06,2,0xfa07,0x8004,0,
+2,0xfa07,2,0xfa08,0x8006,2,0xfacd,0xface,2,0xfa0a,2,0xfa0b,0x8004,0,2,0xfa0b,
+2,0xfa0c,0x8004,0,2,0xfa0c,2,0xfa0d,0x8004,0,2,0xfa0f,2,0xfa10,0x8004,0,
+2,0xfa15,2,0xfa16,0x8004,0,2,0xfa17,2,0xfa18,0x8004,0,2,0xfa18,2,0xfa19,
+0x8004,0,2,0xfa19,2,0xfa1a,0x8004,0,2,0xfa1a,2,0xfa1b,0x8004,0,2,0xfa1b,
+2,0xfa1c,0x8004,0,2,0xfa1c,2,0xfa1d,4,0xf907,0xf909,0xface,0xfacf,0x8004,0,1,
+0xd15f,1,0xd165,0x800c,0,1,0xd1bb,1,0xd1bc,1,0xd1bd,1,0xd1be,1,0xd1bf,1,
+0xd1c0,0x800c,0,1,0xd1bc,1,0xd1bd,1,0xd1be,1,0xd1bf,1,0xd1c0,1,0xd1c1,0x8004,
+0,2,0xf891,2,0xf893,0x8004,0,2,0xf95d,2,0xf95f,0x3b,0x37e,0x3c,0x226e,0x3d,
+0x2260,0x3e,0x226f,0x41,0x4020,0x42,0x4053,0x43,0x405a,0x44,0x4067,0x45,0x4074,0x46,0x1e1e,0x47,
+0x40a1,0x48,0x40b0,0x49,0x40bf,0x4a,0x134,0x4b,0x40da,0x4c,0x40e7,0x4d,0x40f6,0x4e,0x40fd,0x4f,
+0x4110,0x50,0x414d,0x52,0x4152,0x53,0x4165,0x54,0x417a,0x55,0x4189,0x56,0x41c0,0x57,0x41c5,0x58,
+0x41d2,0x59,0x41d7,0x5a,0x41ea,0x60,0x1fef,0x61,0x41f7,0x62,0x4228,0x63,0x422f,0x64,0x423c,0x65,
+0x4249,0x66,0x1e1f,0x67,0x4276,0x68,0x4285,0x69,0x4296,0x6a,0x42af,0x6b,0x42b4,0x6c,0x42bf,0x6d,
+0x42ce,0x6e,0x42d5,0x6f,0x42e8,0x70,0x4325,0x72,0x432a,0x73,0x433d,0x74,0x4352,0x75,0x4363,0x76,
+0x439a,0x77,0x439f,0x78,0x43ae,0x79,0x43b3,0x7a,0x43c8,0xa8,0x43d5,0xb4,0x1ffd,0xb7,0x387,0xc6,
+0x43dc,0xd8,0x1fe,0xe6,0x43e1,0xf8,0x1ff,0x17f,0x1e9b,0x1b7,0x1ee,0x292,0x1ef,0x2b9,0x374,0x300,
+0x340,0x301,0x341,0x308,0x344,0x313,0x343,0x391,0x43e6,0x395,0x43ef,0x397,0x43f6,0x399,0x43ff,0x39f,
+0x4408,0x3a1,0x1fec,0x3a5,0x440f,0x3a9,0x441e,0x3b1,0x4429,0x3b5,0x4436,0x3b7,0x443d,0x3b9,0x444a,0x3bf,
+0x445b,0x3c1,0x4462,0x3c5,0x4465,0x3c9,0x4474,0x3d2,0x4481,0x406,0x407,0x410,0x4484,0x413,0x403,0x415,
+0x4489,0x416,0x448e,0x417,0x4de,0x418,0x4493,0x41a,0x40c,0x41e,0x4e6,0x423,0x449c,0x427,0x4f4,0x42b,
+0x4f8,0x42d,0x4ec,0x430,0x44a5,0x433,0x453,0x435,0x44aa,0x436,0x44af,0x437,0x4df,0x438,0x44b4,0x43a,
+0x45c,0x43e,0x4e7,0x443,0x44bd,0x447,0x4f5,0x44b,0x4f9,0x44d,0x4ed,0x456,0x457,0x474,0x476,0x475,
+0x477,0x4d8,0x4da,0x4d9,0x4db,0x4e8,0x4ea,0x4e9,0x4eb,0x5d0,0x44c6,0x5d1,0x44c9,0x5d2,0xfb32,0x5d3,
+0xfb33,0x5d4,0xfb34,0x5d5,0x44ce,0x5d6,0xfb36,0x5d8,0xfb38,0x5d9,0x44d3,0x5da,0xfb3a,0x5db,0x44d8,0x5dc,
+0xfb3c,0x5de,0xfb3e,0x5e0,0xfb40,0x5e1,0xfb41,0x5e3,0xfb43,0x5e4,0x44dd,0x5e6,0xfb46,0x5e7,0xfb47,0x5e8,
+0xfb48,0x5e9,0x44e2,0x5ea,0xfb4a,0x5f2,0xfb1f,0x627,0x44e7,0x648,0x624,0x64a,0x626,0x6c1,0x6c2,0x6d2,
+0x6d3,0x6d5,0x6c0,0x915,0x958,0x916,0x959,0x917,0x95a,0x91c,0x95b,0x921,0x95c,0x922,0x95d,0x928,
+0x929,0x92b,0x95e,0x92f,0x95f,0x930,0x931,0x933,0x934,0x9a1,0x9dc,0x9a2,0x9dd,0x9af,0x9df,0x9c7,
+0x44ec,0xa16,0xa59,0xa17,0xa5a,0xa1c,0xa5b,0xa2b,0xa5e,0xa32,0xa33,0xa38,0xa36,0xb21,0xb5c,0xb22,
+0xb5d,0xb47,0x44ef,0xb92,0xb94,0xbc6,0x44f4,0xbc7,0xbcb,0xc46,0xc48,0xcbf,0xcc0,0xcc6,0x44f9,0xd46,
+0x44fe,0xd47,0xd4b,0xdd9,0x4503,0xf40,0xf69,0xf42,0xf43,0xf4c,0xf4d,0xf51,0xf52,0xf56,0xf57,0xf5b,
+0xf5c,0xf71,0x4508,0xf90,0xfb9,0xf92,0xf93,0xf9c,0xf9d,0xfa1,0xfa2,0xfa6,0xfa7,0xfab,0xfac,0xfb2,
+0xf76,0xfb3,0xf78,0x1025,0x1026,0x1100,0x450f,0x1101,0x4512,0x1102,0x4515,0x1103,0x4518,0x1104,0x451b,0x1105,
+0x451e,0x1106,0x4521,0x1107,0x4524,0x1108,0x4527,0x1109,0x452a,0x110a,0x452d,0x110b,0x4530,0x110c,0x4533,0x110d,
+0x4536,0x110e,0x4539,0x110f,0x453c,0x1110,0x453f,0x1111,0x4542,0x1112,0x4545,0x1b05,0x1b06,0x1b07,0x1b08,0x1b09,
+0x1b0a,0x1b0b,0x1b0c,0x1b0d,0x1b0e,0x1b11,0x1b12,0x1b3a,0x1b3b,0x1b3c,0x1b3d,0x1b3e,0x1b40,0x1b3f,0x1b41,0x1b42,
+0x1b43,0x1fbf,0x4548,0x1ffe,0x454b,0x2002,0x2000,0x2003,0x2001,0x2190,0x219a,0x2192,0x219b,0x2194,0x21ae,0x21d0,
+0x21cd,0x21d2,0x21cf,0x21d4,0x21ce,0x2203,0x2204,0x2208,0x2209,0x220b,0x220c,0x2223,0x2224,0x2225,0x2226,0x223c,
+0x2241,0x2243,0x2244,0x2245,0x2247,0x2248,0x2249,0x224d,0x226d,0x2261,0x2262,0x2264,0x2270,0x2265,0x2271,0x2272,
+0x2274,0x2273,0x2275,0x2276,0x2278,0x2277,0x2279,0x227a,0x2280,0x227b,0x2281,0x227c,0x22e0,0x227d,0x22e1,0x2282,
+0x2284,0x2283,0x2285,0x2286,0x2288,0x2287,0x2289,0x2291,0x22e2,0x2292,0x22e3,0x22a2,0x22ac,0x22a8,0x22ad,0x22a9,
+0x22ae,0x22ab,0x22af,0x22b2,0x22ea,0x22b3,0x22eb,0x22b4,0x22ec,0x22b5,0x22ed,0x2add,0x2adc,0x3008,0x2329,0x3009,
+0x232a,0x3046,0x3094,0x304b,0x304c,0x304d,0x304e,0x304f,0x3050,0x3051,0x3052,0x3053,0x3054,0x3055,0x3056,0x3057,
+0x3058,0x3059,0x305a,0x305b,0x305c,0x305d,0x305e,0x305f,0x3060,0x3061,0x3062,0x3064,0x3065,0x3066,0x3067,0x3068,
+0x3069,0x306f,0x454e,0x3072,0x4551,0x3075,0x4554,0x3078,0x4557,0x307b,0x455a,0x309d,0x309e,0x30a6,0x30f4,0x30ab,
+0x30ac,0x30ad,0x30ae,0x30af,0x30b0,0x30b1,0x30b2,0x30b3,0x30b4,0x30b5,0x30b6,0x30b7,0x30b8,0x30b9,0x30ba,0x30bb,
+0x30bc,0x30bd,0x30be,0x30bf,0x30c0,0x30c1,0x30c2,0x30c4,0x30c5,0x30c6,0x30c7,0x30c8,0x30c9,0x30cf,0x455d,0x30d2,
+0x4560,0x30d5,0x4563,0x30d8,0x4566,0x30db,0x4569,0x30ef,0x30f7,0x30f0,0x30f8,0x30f1,0x30f9,0x30f2,0x30fa,0x30fd,
+0x30fe,0x349e,0x456c,0x34b9,0x4572,0x34bb,0x4578,0x34df,0x457e,0x3515,0x4584,0x36ee,0x458a,0x36fc,0x4590,0x3781,
+0x4596,0x382f,0x459c,0x3862,0x45a2,0x387c,0x45a8,0x38c7,0x45ae,0x38e3,0x45b4,0x391c,0x45ba,0x393a,0x45c0,0x3a2e,
+0x45c6,0x3a6c,0x45cc,0x3ae4,0x45d2,0x3b08,0x45d8,0x3b19,0x45de,0x3b49,0x45e4,0x3b9d,0x45ea,0x3c18,0x45f2,0x3c4e,
+0x45f8,0x3d33,0x45fe,0x3d96,0x4604,0x3eac,0x460a,0x3eb8,0x4610,0x3f1b,0x4616,0x3ffc,0x461c,0x4008,0x4622,0x4018,
+0xfad3,0x4039,0x4628,0x4046,0x4630,0x4096,0x4636,0x40e3,0x463c,0x412f,0x4642,0x4202,0x4648,0x4227,0x464e,0x42a0,
+0x4654,0x4301,0x465a,0x4334,0x4660,0x4359,0x4666,0x43d5,0x466c,0x43d9,0x4672,0x440b,0x4678,0x446b,0x467e,0x452b,
+0x4684,0x455d,0x468a,0x4561,0x4690,0x456b,0x4696,0x45d7,0x469c,0x45f9,0x46a2,0x4635,0x46a8,0x46be,0x46ae,0x46c7,
+0x46b4,0x4995,0x46ba,0x49e6,0x46c0,0x4a6e,0x46c6,0x4a76,0x46cc,0x4ab2,0x46d2,0x4b33,0x46d8,0x4bce,0x46de,0x4cce,
+0x46e4,0x4ced,0x46ea,0x4cf8,0x46f0,0x4d56,0x46f6,0x4e0d,0xf967,0x4e26,0xfa70,0x4e32,0xf905,0x4e38,0x46fc,0x4e39,
+0xf95e,0x4e3d,0x4702,0x4e41,0x4708,0x4e82,0xf91b,0x4e86,0xf9ba,0x4eae,0xf977,0x4ec0,0xf9fd,0x4ecc,0x470e,0x4ee4,
+0xf9a8,0x4f60,0x4714,0x4f80,0xfa73,0x4f86,0xf92d,0x4f8b,0xf9b5,0x4fae,0x471a,0x4fbb,0x4722,0x4fbf,0xf965,0x5002,
+0x4728,0x502b,0xf9d4,0x507a,0x472e,0x5099,0x4734,0x50cf,0x473a,0x50da,0xf9bb,0x50e7,0x4740,0x5140,0xfa0c,0x5145,
+0xfa74,0x514d,0x4748,0x5154,0x4750,0x5164,0x4756,0x5167,0x475c,0x5168,0xfa72,0x5169,0xf978,0x516d,0xf9d1,0x5177,
+0x4762,0x5180,0xfa75,0x518d,0x4768,0x5192,0x476e,0x5195,0x4774,0x5197,0x477a,0x51a4,0x4780,0x51ac,0x4786,0x51b5,
+0x478c,0x51b7,0xf92e,0x51c9,0xf979,0x51cc,0xf955,0x51dc,0xf954,0x51de,0xfa15,0x51f5,0x4794,0x5203,0x479a,0x5207,
+0x47a0,0x5217,0xf99c,0x5229,0xf9dd,0x523a,0xf9ff,0x523b,0x47a8,0x5246,0x47ae,0x5272,0x47b4,0x5277,0x47ba,0x5289,
+0xf9c7,0x529b,0xf98a,0x52a3,0xf99d,0x52b3,0x47c0,0x52c7,0x47c6,0x52c9,0x47ce,0x52d2,0xf952,0x52de,0xf92f,0x52e4,
+0x47d6,0x52f5,0xf97f,0x52fa,0x47de,0x5305,0x47e6,0x5306,0x47ec,0x5317,0x47f2,0x533f,0xf9eb,0x5349,0x47fa,0x5351,
+0x4800,0x535a,0x4808,0x5373,0x480e,0x5375,0xf91c,0x537d,0x4814,0x537f,0x481a,0x53c3,0xf96b,0x53ca,0x4820,0x53df,
+0x4826,0x53e5,0xf906,0x53eb,0x482c,0x53f1,0x4832,0x5406,0x4838,0x540f,0xf9de,0x541d,0xf9ed,0x5438,0x483e,0x5442,
+0xf980,0x5448,0x4844,0x5468,0x484a,0x549e,0x4850,0x54a2,0x4856,0x54bd,0xf99e,0x54f6,0x485c,0x5510,0x4862,0x5553,
+0x4868,0x5555,0xfa79,0x5563,0x486e,0x5584,0x4874,0x5587,0xf90b,0x5599,0x487a,0x559d,0x4882,0x55ab,0x4887,0x55b3,
+0x488d,0x55c0,0xfa0d,0x55c2,0x4893,0x55e2,0xfa7b,0x5606,0x4899,0x5651,0x48a1,0x5668,0xfa38,0x5674,0x48a7,0x56f9,
+0xf9a9,0x5716,0x48ad,0x5717,0x48b3,0x578b,0x48b9,0x57ce,0x48bf,0x57f4,0x48c5,0x580d,0x48cb,0x5831,0x48d1,0x5832,
+0x48d7,0x5840,0xfa39,0x585a,0x48dd,0x585e,0xf96c,0x58a8,0xfa3a,0x58ac,0x48e2,0x58b3,0xfa7d,0x58d8,0xf94a,0x58df,
+0xf942,0x58ee,0x48e8,0x58f2,0x48ee,0x58f7,0x48f4,0x5906,0x48fa,0x591a,0x4900,0x5922,0x4906,0x5944,0xfa7e,0x5948,
+0xf90c,0x5951,0xf909,0x5954,0xfa7f,0x5962,0x490c,0x5973,0xf981,0x59d8,0x4912,0x59ec,0x4918,0x5a1b,0x491e,0x5a27,
+0x4924,0x5a62,0xfa80,0x5a66,0x492a,0x5ab5,0x4930,0x5b08,0x4936,0x5b28,0xfa81,0x5b3e,0x493c,0x5b85,0xfa04,0x5bc3,
+0x4942,0x5bd8,0x4948,0x5be7,0x494e,0x5bee,0xf9bc,0x5bf3,0x4958,0x5bff,0x495e,0x5c06,0x4964,0x5c22,0x496a,0x5c3f,
+0xf9bd,0x5c60,0x4970,0x5c62,0xf94b,0x5c64,0xfa3b,0x5c65,0xf9df,0x5c6e,0x4976,0x5c8d,0x497e,0x5cc0,0x4984,0x5d19,
+0xf9d5,0x5d43,0x498a,0x5d50,0xf921,0x5d6b,0x4990,0x5d6e,0x4996,0x5d7c,0x499c,0x5db2,0x49a2,0x5dba,0xf9ab,0x5de1,
+0x49a8,0x5de2,0x49ae,0x5dfd,0x49b4,0x5e28,0x49ba,0x5e3d,0x49c0,0x5e69,0x49c6,0x5e74,0xf98e,0x5ea6,0xfa01,0x5eb0,
+0x49cc,0x5eb3,0x49d2,0x5eb6,0x49d8,0x5ec9,0xf9a2,0x5eca,0x49de,0x5ed2,0xfa82,0x5ed3,0xfa0b,0x5ed9,0xfa83,0x5eec,
+0xf982,0x5efe,0x49e6,0x5f04,0xf943,0x5f22,0x49ec,0x5f53,0x49f2,0x5f62,0x49f8,0x5f69,0xfa84,0x5f6b,0x49fe,0x5f8b,
+0xf9d8,0x5f9a,0x4a04,0x5fa9,0xf966,0x5fad,0xfa85,0x5fcd,0x4a0a,0x5fd7,0x4a10,0x5ff5,0xf9a3,0x5ff9,0x4a16,0x6012,
+0xf960,0x601c,0xf9ac,0x6081,0x4a1c,0x6094,0x4a22,0x60c7,0x4a2a,0x60d8,0xfa86,0x60e1,0xf9b9,0x6108,0xfa88,0x6144,
+0xf9d9,0x6148,0x4a30,0x614c,0x4a36,0x614e,0x4a40,0x6160,0xfa8a,0x6168,0xfa3e,0x617a,0x4a48,0x618e,0x4a4e,0x6190,
+0xf98f,0x61a4,0x4a58,0x61af,0x4a5e,0x61b2,0x4a64,0x61de,0x4a6a,0x61f2,0x4a70,0x61f6,0x4a7a,0x6200,0xf990,0x6210,
+0x4a82,0x621b,0x4a88,0x622e,0xf9d2,0x6234,0xfa8c,0x625d,0x4a8e,0x62b1,0x4a94,0x62c9,0xf925,0x62cf,0xf95b,0x62d3,
+0xfa02,0x62d4,0x4a9a,0x62fc,0x4aa0,0x62fe,0xf973,0x633d,0x4aa6,0x6350,0x4aac,0x6368,0x4ab2,0x637b,0xf9a4,0x6383,
+0x4ab8,0x63a0,0xf975,0x63a9,0x4abe,0x63c4,0xfa8d,0x63c5,0x4ac4,0x63e4,0x4aca,0x641c,0xfa8e,0x6422,0x4ad0,0x6452,
+0xfa8f,0x6469,0x4ad6,0x6477,0x4adc,0x647e,0x4ae2,0x649a,0xf991,0x649d,0x4ae8,0x64c4,0xf930,0x654f,0x4aee,0x6556,
+0xfa90,0x656c,0x4af6,0x6578,0xf969,0x6599,0xf9be,0x65c5,0xf983,0x65e2,0xfa42,0x65e3,0x4afc,0x6613,0xf9e0,0x6649,
+0x4b02,0x6674,0x4b08,0x6688,0xf9c5,0x6691,0x4b0d,0x669c,0x4b15,0x66b4,0xfa06,0x66c6,0xf98b,0x66f4,0xf901,0x66f8,
+0x4b1b,0x6700,0x4b21,0x6717,0x4b27,0x671b,0x4b31,0x6721,0x4b39,0x674e,0xf9e1,0x6753,0x4b3f,0x6756,0xfa94,0x675e,
+0x4b45,0x677b,0xf9c8,0x6785,0x4b4b,0x6797,0xf9f4,0x67f3,0xf9c9,0x67fa,0x4b51,0x6817,0xf9da,0x681f,0x4b57,0x6852,
+0x4b5d,0x6881,0xf97a,0x6885,0x4b63,0x688e,0x4b6b,0x68a8,0xf9e2,0x6914,0x4b71,0x6942,0x4b77,0x69a3,0x4b7d,0x69ea,
+0x4b83,0x6a02,0x4b89,0x6a13,0xf94c,0x6aa8,0x4b90,0x6ad3,0xf931,0x6adb,0x4b96,0x6b04,0xf91d,0x6b21,0x4b9c,0x6b54,
+0x4ba2,0x6b72,0x4ba8,0x6b77,0xf98c,0x6b79,0xfa95,0x6b9f,0x4bae,0x6bae,0xf9a5,0x6bba,0x4bb4,0x6bbb,0x4bbe,0x6c4e,
+0x4bc4,0x6c67,0x4bca,0x6c88,0xf972,0x6cbf,0x4bd0,0x6ccc,0xf968,0x6ccd,0x4bd6,0x6ce5,0xf9e3,0x6d16,0x4bdc,0x6d1b,
+0xf915,0x6d1e,0xfa05,0x6d34,0x4be2,0x6d3e,0x4be8,0x6d41,0x4bee,0x6d69,0x4bf8,0x6d6a,0xf92a,0x6d77,0x4bfe,0x6d78,
+0x4c06,0x6d85,0x4c0c,0x6dcb,0xf9f5,0x6dda,0xf94d,0x6dea,0xf9d6,0x6df9,0x4c12,0x6e1a,0xfa46,0x6e2f,0x4c18,0x6e6e,
+0x4c1e,0x6e9c,0xf9cb,0x6eba,0xf9ec,0x6ec7,0x4c24,0x6ecb,0x4c2a,0x6ed1,0xf904,0x6edb,0xfa98,0x6f0f,0xf94e,0x6f22,
+0x4c32,0x6f23,0xf992,0x6f6e,0x4c37,0x6fc6,0x4c3d,0x6feb,0xf922,0x6ffe,0xf984,0x701b,0x4c43,0x701e,0x4c49,0x7039,
+0x4c51,0x704a,0x4c57,0x7070,0x4c5d,0x7077,0x4c63,0x707d,0x4c69,0x7099,0xf9fb,0x70ad,0x4c6f,0x70c8,0xf99f,0x70d9,
+0xf916,0x7145,0x4c75,0x7149,0xf993,0x716e,0x4c7b,0x719c,0x4c80,0x71ce,0xf9c0,0x71d0,0xf9ee,0x7210,0xf932,0x721b,
+0xf91e,0x7228,0x4c86,0x722b,0xfa49,0x7235,0x4c8c,0x7250,0x4c94,0x7262,0xf946,0x7280,0x4c9a,0x7295,0x4ca0,0x72af,
+0xfa9f,0x72c0,0xf9fa,0x72fc,0xf92b,0x732a,0x4ca6,0x7375,0xf9a7,0x737a,0x4cab,0x7387,0x4cb1,0x738b,0x4cb6,0x73a5,
+0x4cbc,0x73b2,0xf9ad,0x73de,0xf917,0x7406,0xf9e4,0x7409,0xf9cc,0x7422,0xfa4a,0x7447,0x4cc2,0x745c,0x4cc8,0x7469,
+0xf9ae,0x7471,0x4cce,0x7485,0x4cd6,0x7489,0xf994,0x7498,0xf9ef,0x74ca,0x4cdc,0x7506,0xfaa2,0x7524,0x4ce2,0x753b,
+0xfaa3,0x753e,0x4ce8,0x7559,0xf9cd,0x7565,0xf976,0x7570,0x4cee,0x75e2,0xf9e5,0x7610,0x4cf6,0x761d,0xfaa4,0x761f,
+0xfaa5,0x7642,0xf9c1,0x7669,0xf90e,0x76ca,0x4cfc,0x76db,0xfaa7,0x76e7,0xf933,0x76f4,0x4d01,0x7701,0xf96d,0x771e,
+0x4d09,0x771f,0x4d0f,0x7740,0xfaaa,0x774a,0x4d15,0x778b,0x4d1d,0x77a7,0xfa9d,0x784e,0x4d23,0x786b,0xf9ce,0x788c,
+0x4d29,0x7891,0xfa4b,0x78ca,0xf947,0x78cc,0x4d31,0x78fb,0xf964,0x792a,0xf985,0x793c,0xfa18,0x793e,0xfa4c,0x7948,
+0xfa4e,0x7949,0xfa4d,0x7950,0xfa4f,0x7956,0x4d39,0x795d,0xfa51,0x795e,0xfa19,0x7965,0xfa1a,0x797f,0xf93c,0x798d,
+0xfa52,0x798e,0xfa53,0x798f,0x4d41,0x79ae,0xf9b6,0x79ca,0xf995,0x79eb,0x4d49,0x7a1c,0xf956,0x7a40,0x4d4f,0x7a4a,
+0x4d57,0x7a4f,0x4d5d,0x7a81,0xfa55,0x7ab1,0xfaac,0x7acb,0xf9f7,0x7aee,0x4d63,0x7b20,0xf9f8,0x7bc0,0x4d69,0x7bc6,
+0x4d6e,0x7bc9,0x4d74,0x7c3e,0xf9a6,0x7c60,0xf944,0x7c7b,0xfaae,0x7c92,0xf9f9,0x7cbe,0xfa1d,0x7cd2,0x4d7a,0x7cd6,
+0xfa03,0x7ce3,0x4d80,0x7ce7,0xf97b,0x7ce8,0x4d86,0x7d00,0x4d8c,0x7d10,0xf9cf,0x7d22,0xf96a,0x7d2f,0xf94f,0x7d5b,
+0xfaaf,0x7d63,0x4d92,0x7da0,0xf93d,0x7dbe,0xf957,0x7dc7,0x4d98,0x7df4,0x4d9e,0x7e02,0x4da5,0x7e09,0xfa58,0x7e37,
+0xf950,0x7e41,0xfa59,0x7e45,0x4dab,0x7f3e,0xfab1,0x7f72,0xfa5a,0x7f79,0xf9e6,0x7f7a,0x4db1,0x7f85,0xf90f,0x7f95,
+0x4db7,0x7f9a,0xf9af,0x7fbd,0xfa1e,0x7ffa,0x4dbd,0x8001,0xf934,0x8005,0x4dc3,0x8046,0xf9b0,0x8060,0x4dcd,0x806f,
+0xf997,0x8070,0x4dd3,0x807e,0xf945,0x808b,0xf953,0x80ad,0x4dd9,0x80b2,0x4ddf,0x8103,0x4de5,0x813e,0x4deb,0x81d8,
+0xf926,0x81e8,0xf9f6,0x81ed,0xfa5c,0x8201,0x4df1,0x8204,0x4dfb,0x826f,0xf97c,0x8279,0x4e01,0x828b,0x4e04,0x8291,
+0x4e0a,0x829d,0x4e10,0x82b1,0x4e16,0x82b3,0x4e1c,0x82bd,0x4e22,0x82e5,0x4e28,0x82e6,0x4e30,0x831d,0x4e36,0x8323,
+0x4e3c,0x8336,0xf9fe,0x8352,0xfab3,0x8353,0x4e42,0x8363,0x4e48,0x83ad,0x4e4e,0x83bd,0x4e54,0x83c9,0xf93e,0x83ca,
+0x4e5a,0x83cc,0x4e60,0x83dc,0x4e66,0x83e7,0x4e6c,0x83ef,0xfab4,0x83f1,0xf958,0x843d,0xf918,0x8449,0xf96e,0x8457,
+0x4e72,0x84ee,0xf999,0x84f1,0x4e7a,0x84f3,0x4e80,0x84fc,0xf9c2,0x8516,0x4e86,0x8564,0x4e8c,0x85cd,0xf923,0x85fa,
+0xf9f0,0x8606,0xf935,0x8612,0xfa20,0x862d,0xf91f,0x863f,0xf910,0x8650,0x4e92,0x865c,0x4e98,0x8667,0x4ea0,0x8669,
+0x4ea6,0x8688,0x4eac,0x86a9,0x4eb2,0x86e2,0x4eb8,0x870e,0x4ebe,0x8728,0x4ec4,0x876b,0x4eca,0x8779,0x4ed0,0x8786,
+0x4ed8,0x87ba,0xf911,0x87e1,0x4ede,0x8801,0x4ee4,0x881f,0xf927,0x884c,0xfa08,0x8860,0x4eea,0x8863,0x4ef0,0x88c2,
+0xf9a0,0x88cf,0xf9e7,0x88d7,0x4ef6,0x88de,0x4efc,0x88e1,0xf9e8,0x88f8,0xf912,0x88fa,0x4f02,0x8910,0xfa60,0x8941,
+0xfab6,0x8964,0xf924,0x8986,0xfab7,0x898b,0xfa0a,0x8996,0x4f08,0x8aa0,0x4f0d,0x8aaa,0x4f13,0x8abf,0xfab9,0x8acb,
+0xfabb,0x8ad2,0xf97d,0x8ad6,0xf941,0x8aed,0x4f18,0x8af8,0x4f20,0x8afe,0x4f25,0x8b01,0x4f2a,0x8b39,0x4f2f,0x8b58,
+0xf9fc,0x8b80,0xf95a,0x8b8a,0x4f34,0x8c48,0xf900,0x8c55,0x4f3c,0x8cab,0x4f42,0x8cc1,0x4f48,0x8cc2,0xf948,0x8cc8,
+0xf903,0x8cd3,0xfa64,0x8d08,0x4f4e,0x8d1b,0x4f53,0x8d77,0x4f59,0x8dbc,0x4f5f,0x8dcb,0x4f65,0x8def,0xf937,0x8df0,
+0x4f6b,0x8eca,0xf902,0x8ed4,0x4f71,0x8f26,0xf998,0x8f2a,0xf9d7,0x8f38,0x4f77,0x8f3b,0xfa07,0x8f62,0xf98d,0x8f9e,
+0x4f7f,0x8fb0,0xf971,0x8fb6,0xfa66,0x9023,0xf99a,0x9038,0x4f85,0x9072,0xfac3,0x907c,0xf9c3,0x908f,0xf913,0x9094,
+0x4f8a,0x90ce,0xf92c,0x90f1,0x4f90,0x90fd,0xfa26,0x9111,0x4f96,0x911b,0x4f9c,0x916a,0xf919,0x9199,0xfac4,0x91b4,
+0xf9b7,0x91cc,0xf9e9,0x91cf,0xf97e,0x91d1,0xf90a,0x9234,0xf9b1,0x9238,0x4fa2,0x9276,0xfac5,0x927c,0x4fa8,0x92d7,
+0x4fae,0x92d8,0x4fb4,0x9304,0xf93f,0x934a,0xf99b,0x93f9,0x4fba,0x9415,0x4fc0,0x958b,0x4fc6,0x95ad,0xf986,0x95b7,
+0x4fcc,0x962e,0xf9c6,0x964b,0xf951,0x964d,0xfa09,0x9675,0xf959,0x9678,0xf9d3,0x967c,0xfac6,0x9686,0xf9dc,0x96a3,
+0xf9f1,0x96b8,0xf9b8,0x96c3,0x4fd2,0x96e2,0xf9ea,0x96e3,0x4fd8,0x96f6,0xf9b2,0x96f7,0xf949,0x9723,0x4fdd,0x9732,
+0xf938,0x9748,0xf9b3,0x9756,0x4fe3,0x97db,0xfac9,0x97e0,0x4fe8,0x97ff,0x4fee,0x980b,0x4ff3,0x9818,0xf9b4,0x9829,
+0x4ffb,0x983b,0x5001,0x985e,0xf9d0,0x98e2,0x5006,0x98ef,0xfa2a,0x98fc,0xfa2b,0x9928,0xfa2c,0x9929,0x500c,0x99a7,
+0x5012,0x99c2,0x5018,0x99f1,0xf91a,0x99fe,0x501e,0x9a6a,0xf987,0x9b12,0x5024,0x9b6f,0xf939,0x9c40,0x502c,0x9c57,
+0xf9f2,0x9cfd,0x5032,0x9d67,0x5038,0x9db4,0xfa2d,0x9dfa,0xf93a,0x9e1e,0xf920,0x9e7f,0xf940,0x9e97,0xf988,0x9e9f,
+0xf9f3,0x9ebb,0x503e,0x9ece,0xf989,0x9ef9,0x5044,0x9efe,0x504a,0x9f05,0x5050,0x9f0f,0x5056,0x9f16,0x505c,0x9f3b,
+0x5062,0x9f43,0xfad8,0x9f8d,0xf9c4,0x9f8e,0xfad9,0x9f9c,0x5068,0x8101,0xd157,0xd15e,1,0xd158,0x106d,1,
+0xd1b9,0x1073,1,0xd1ba,0x1081,0x8202,0x122,0xf803,0x8202,0x51c,0xf812,0x8202,0x525,0xf91b,0x8202,0x54b,
+0xf816,0x8202,0x63a,0xf80d,0x8202,0x804,0xf9d9,0x8202,0x8de,0xf9dd,0x8202,0xa2c,0xf834,0x8202,0xb63,0xf838,
+0x8202,0x14e4,0xf859,0x8202,0x16a8,0xf860,0x8202,0x16ea,0xf861,0x8202,0x19c8,0xf86c,0x8202,0x1b18,0xf871,0x8202,
+0x1d0b,0xf8f8,0x8202,0x1de4,0xf87b,0x8202,0x1de6,0xf87d,0x8202,0x2183,0xf889,0x8202,0x219f,0xf939,2,0x2331,
+0x108f,0x8202,0x26d4,0xf8a4,0x8002,0x2844,0xfad0,0x8002,0x284a,0xfacf,0x8202,0x2b0c,0xf8b8,0x8202,0x2bf1,0xf8be,
+0x8202,0x300a,0xf8ca,0x8202,0x32b8,0xf897,0x8202,0x335f,0xf980,0x8202,0x3393,0xf989,0x8202,0x339c,0xf98a,0x8202,
+0x33c3,0xf8dd,0x8002,0x33d5,0xfad1,0x8202,0x346d,0xf8e3,0x8202,0x36a3,0xf8ec,0x8202,0x38a7,0xf8f0,0x8202,0x3a8d,
+0xf8f7,0x8202,0x3afa,0xf8f9,0x8202,0x3cbc,0xf8fb,0x8202,0x3d1e,0xf906,0x8202,0x3ed1,0xf90d,0x8202,0x3f5e,0xf910,
+0x8202,0x3f8e,0xf911,0x8202,0x4263,0xf91d,0x8202,0x43ab,0xf91f,0x8202,0x4608,0xf923,0x8202,0x4735,0xf926,0x8202,
+0x4814,0xf927,0x8202,0x4c36,0xf935,0x8202,0x4c92,0xf937,0x8202,0x4fa1,0xf93b,0x8202,0x4fb8,0xf93c,0x8202,0x5044,
+0xf93d,0x8202,0x50f2,0xf942,0x8202,0x50f3,0xf941,0x8202,0x5119,0xf943,0x8202,0x5133,0xf944,0x8002,0x5249,0xfad5,
+0x8202,0x541d,0xf94d,0x8202,0x5626,0xf952,0x8202,0x569a,0xf954,0x8202,0x56c5,0xf955,0x8202,0x597c,0xf95c,2,
+0x5aa7,0x1095,0x8202,0x5bab,0xf961,0x8202,0x5c80,0xf965,0x8002,0x5cd0,0xfad6,0x8202,0x5f86,0xf96b,0x8202,0x61da,
+0xf898,0x8202,0x6228,0xf972,0x8202,0x6247,0xf973,0x8202,0x62d9,0xf975,0x8202,0x633e,0xf977,0x8202,0x64da,0xf97b,
+0x8202,0x6523,0xf97c,0x8202,0x65a8,0xf97e,0x8202,0x67a7,0xf987,0x8202,0x67b5,0xf988,0x8202,0x6b3c,0xf997,0x8202,
+0x6c36,0xf9a4,0x8202,0x6cd5,0xf9a6,0x8202,0x6d6b,0xf9a5,0x8202,0x6f2c,0xf9ad,0x8202,0x6fb1,0xf9b0,0x8202,0x70d2,
+0xf9b1,0x8202,0x73ca,0xf9ab,0x8202,0x7667,0xf9c5,0x8202,0x78ae,0xf9cb,0x8202,0x7966,0xf9cc,0x8202,0x7ca8,0xf9d3,
+0x8002,0x7ed3,0xfad7,0x8202,0x7f2f,0xf9d8,0x8202,0x85d2,0xf9e0,0x8202,0x85ed,0xf9e1,0x8202,0x872e,0xf9e5,0x8202,
+0x8bfa,0xf9ed,0x8202,0x8d77,0xf9f1,0x8202,0x9145,0xf9f6,0x8202,0x91df,0xf81c,0x8202,0x921a,0xf9f7,0x8202,0x940a,
+0xf9fb,0x8202,0x9496,0xf9fd,0x8202,0x95b6,0xfa01,0x8202,0x9b30,0xfa09,0x8202,0xa0ce,0xfa10,0x8202,0xa105,0xfa12,
+0x8202,0xa20e,0xfa13,0x8202,0xa291,0xfa14,0x8202,0xa392,0xf88f,0x8202,0xa600,0xfa1d,0x8016,0x12,0xf900,0xfa0e,
+0xfa10,0xfa11,0xfa12,0xfa13,0xfa15,0xfa1f,0xfa20,0xfa21,0xfa22,0xfa23,0xfa25,0xfa27,0xfa2a,0xfa2e,0xfa70,0xfada,
+2,0xf800,2,0xfa1e,0x8376,0x2ba,0x221,0x222,0x234,0x250,0x2ae,0x2b0,0x2ef,0x300,0x350,0x360,
+0x370,0x374,0x376,0x37a,0x37b,0x37e,0x37f,0x384,0x38b,0x38c,0x38d,0x38e,0x3a2,0x3a3,0x3cf,0x3d0,
+0x3f7,0x400,0x487,0x488,0x4cf,0x4d0,0x4f6,0x4f8,0x4fa,0x500,0x510,0x531,0x557,0x559,0x560,0x561,
+0x588,0x589,0x58b,0x591,0x5a2,0x5a3,0x5ba,0x5bb,0x5c5,0x5d0,0x5eb,0x5f0,0x5f5,0x60c,0x60d,0x61b,
+0x61c,0x61f,0x620,0x621,0x63b,0x640,0x656,0x660,0x6ee,0x6f0,0x6ff,0x700,0x70e,0x70f,0x72d,0x730,
+0x74b,0x780,0x7b2,0x901,0x904,0x905,0x93a,0x93c,0x94e,0x950,0x955,0x958,0x971,0x981,0x984,0x985,
+0x98d,0x98f,0x991,0x993,0x9a9,0x9aa,0x9b1,0x9b2,0x9b3,0x9b6,0x9ba,0x9bc,0x9bd,0x9be,0x9c5,0x9c7,
+0x9c9,0x9cb,0x9ce,0x9d7,0x9d8,0x9dc,0x9de,0x9df,0x9e4,0x9e6,0x9fb,0xa02,0xa03,0xa05,0xa0b,0xa0f,
+0xa11,0xa13,0xa29,0xa2a,0xa31,0xa32,0xa34,0xa35,0xa37,0xa38,0xa3a,0xa3c,0xa3d,0xa3e,0xa43,0xa47,
+0xa49,0xa4b,0xa4e,0xa59,0xa5d,0xa5e,0xa5f,0xa66,0xa75,0xa81,0xa84,0xa85,0xa8c,0xa8d,0xa8e,0xa8f,
+0xa92,0xa93,0xaa9,0xaaa,0xab1,0xab2,0xab4,0xab5,0xaba,0xabc,0xac6,0xac7,0xaca,0xacb,0xace,0xad0,
+0xad1,0xae0,0xae1,0xae6,0xaf0,0xb01,0xb04,0xb05,0xb0d,0xb0f,0xb11,0xb13,0xb29,0xb2a,0xb31,0xb32,
+0xb34,0xb36,0xb3a,0xb3c,0xb44,0xb47,0xb49,0xb4b,0xb4e,0xb56,0xb58,0xb5c,0xb5e,0xb5f,0xb62,0xb66,
+0xb71,0xb82,0xb84,0xb85,0xb8b,0xb8e,0xb91,0xb92,0xb96,0xb99,0xb9b,0xb9c,0xb9d,0xb9e,0xba0,0xba3,
+0xba5,0xba8,0xbab,0xbae,0xbb6,0xbb7,0xbba,0xbbe,0xbc3,0xbc6,0xbc9,0xbca,0xbce,0xbd7,0xbd8,0xbe7,
+0xbf3,0xc01,0xc04,0xc05,0xc0d,0xc0e,0xc11,0xc12,0xc29,0xc2a,0xc34,0xc35,0xc3a,0xc3e,0xc45,0xc46,
+0xc49,0xc4a,0xc4e,0xc55,0xc57,0xc60,0xc62,0xc66,0xc70,0xc82,0xc84,0xc85,0xc8d,0xc8e,0xc91,0xc92,
+0xca9,0xcaa,0xcb4,0xcb5,0xcba,0xcbe,0xcc5,0xcc6,0xcc9,0xcca,0xcce,0xcd5,0xcd7,0xcde,0xcdf,0xce0,
+0xce2,0xce6,0xcf0,0xd02,0xd04,0xd05,0xd0d,0xd0e,0xd11,0xd12,0xd29,0xd2a,0xd3a,0xd3e,0xd44,0xd46,
+0xd49,0xd4a,0xd4e,0xd57,0xd58,0xd60,0xd62,0xd66,0xd70,0xd82,0xd84,0xd85,0xd97,0xd9a,0xdb2,0xdb3,
+0xdbc,0xdbd,0xdbe,0xdc0,0xdc7,0xdca,0xdcb,0xdcf,0xdd5,0xdd6,0xdd7,0xdd8,0xde0,0xdf2,0xdf5,0xe01,
+0xe3b,0xe3f,0xe5c,0xe81,0xe83,0xe84,0xe85,0xe87,0xe89,0xe8a,0xe8b,0xe8d,0xe8e,0xe94,0xe98,0xe99,
+0xea0,0xea1,0xea4,0xea5,0xea6,0xea7,0xea8,0xeaa,0xeac,0xead,0xeba,0xebb,0xebe,0xec0,0xec5,0xec6,
+0xec7,0xec8,0xece,0xed0,0xeda,0xedc,0xede,0xf00,0xf48,0xf49,0xf6b,0xf71,0xf8c,0xf90,0xf98,0xf99,
+0xfbd,0xfbe,0xfcd,0xfcf,0xfd0,0x1000,0x1022,0x1023,0x1028,0x1029,0x102b,0x102c,0x1033,0x1036,0x103a,0x1040,
+0x105a,0x10a0,0x10c6,0x10d0,0x10f9,0x10fb,0x10fc,0x1100,0x115a,0x115f,0x11a3,0x11a8,0x11fa,0x1200,0x1207,0x1208,
+0x1247,0x1248,0x1249,0x124a,0x124e,0x1250,0x1257,0x1258,0x1259,0x125a,0x125e,0x1260,0x1287,0x1288,0x1289,0x128a,
+0x128e,0x1290,0x12af,0x12b0,0x12b1,0x12b2,0x12b6,0x12b8,0x12bf,0x12c0,0x12c1,0x12c2,0x12c6,0x12c8,0x12cf,0x12d0,
+0x12d7,0x12d8,0x12ef,0x12f0,0x130f,0x1310,0x1311,0x1312,0x1316,0x1318,0x131f,0x1320,0x1347,0x1348,0x135b,0x1361,
+0x137d,0x13a0,0x13f5,0x1401,0x1677,0x1680,0x169d,0x16a0,0x16f1,0x1700,0x170d,0x170e,0x1715,0x1720,0x1737,0x1740,
+0x1754,0x1760,0x176d,0x176e,0x1771,0x1772,0x1774,0x1780,0x17dd,0x17e0,0x17ea,0x1800,0x180f,0x1810,0x181a,0x1820,
+0x1878,0x1880,0x18aa,0x1e00,0x1e9c,0x1ea0,0x1efa,0x1f00,0x1f16,0x1f18,0x1f1e,0x1f20,0x1f46,0x1f48,0x1f4e,0x1f50,
+0x1f58,0x1f59,0x1f5a,0x1f5b,0x1f5c,0x1f5d,0x1f5e,0x1f5f,0x1f7e,0x1f80,0x1fb5,0x1fb6,0x1fc5,0x1fc6,0x1fd4,0x1fd6,
+0x1fdc,0x1fdd,0x1ff0,0x1ff2,0x1ff5,0x1ff6,0x1fff,0x2000,0x2053,0x2057,0x2058,0x205f,0x2064,0x206a,0x2072,0x2074,
+0x208f,0x20a0,0x20b2,0x20d0,0x20eb,0x2100,0x213b,0x213d,0x214c,0x2153,0x2184,0x2190,0x23cf,0x2400,0x2427,0x2440,
+0x244b,0x2460,0x24ff,0x2500,0x2614,0x2616,0x2618,0x2619,0x267e,0x2680,0x268a,0x2701,0x2705,0x2706,0x270a,0x270c,
+0x2728,0x2729,0x274c,0x274d,0x274e,0x274f,0x2753,0x2756,0x2757,0x2758,0x275f,0x2761,0x2795,0x2798,0x27b0,0x27b1,
+0x27bf,0x27d0,0x27ec,0x27f0,0x2b00,0x2e80,0x2e9a,0x2e9b,0x2ef4,0x2f00,0x2fd6,0x2ff0,0x2ffc,0x3000,0x3040,0x3041,
+0x3097,0x3099,0x3100,0x3105,0x312d,0x3131,0x318f,0x3190,0x31b8,0x31f0,0x321d,0x3220,0x3244,0x3251,0x327c,0x327f,
+0x32cc,0x32d0,0x32ff,0x3300,0x3377,0x337b,0x33de,0x33e0,0x33ff,0x3400,0x4db6,0x4e00,0x9fa6,0xa000,0xa48d,0xa490,
+0xa4c7,0xac00,0xd7a4,0xd800,0xfa2e,0xfa30,0xfa6b,0xfb00,0xfb07,0xfb13,0xfb18,0xfb1d,0xfb37,0xfb38,0xfb3d,0xfb3e,
+0xfb3f,0xfb40,0xfb42,0xfb43,0xfb45,0xfb46,0xfbb2,0xfbd3,0xfd40,0xfd50,0xfd90,0xfd92,0xfdc8,0xfdd0,0xfdfd,0xfe00,
+0xfe10,0xfe20,0xfe24,0xfe30,0xfe47,0xfe49,0xfe53,0xfe54,0xfe67,0xfe68,0xfe6c,0xfe70,0xfe75,0xfe76,0xfefd,0xfeff,
+0xff00,0xff01,0xffbf,0xffc2,0xffc8,0xffca,0xffd0,0xffd2,0xffd8,0xffda,0xffdd,0xffe0,0xffe7,0xffe8,0xffef,0xfff9,
+1,0,1,0x300,1,0x31f,1,0x320,1,0x324,1,0x330,1,0x34b,1,0x400,
+1,0x426,1,0x428,1,0x44e,1,0xd000,1,0xd0f6,1,0xd100,1,0xd127,1,0xd12a,
+1,0xd1de,1,0xd400,1,0xd455,1,0xd456,1,0xd49d,1,0xd49e,1,0xd4a0,1,0xd4a2,
+1,0xd4a3,1,0xd4a5,1,0xd4a7,1,0xd4a9,1,0xd4ad,1,0xd4ae,1,0xd4ba,1,0xd4bb,
+1,0xd4bc,1,0xd4bd,1,0xd4c1,1,0xd4c2,1,0xd4c4,1,0xd4c5,1,0xd506,1,0xd507,
+1,0xd50b,1,0xd50d,1,0xd515,1,0xd516,1,0xd51d,1,0xd51e,1,0xd53a,1,0xd53b,
+1,0xd53f,1,0xd540,1,0xd545,1,0xd546,1,0xd547,1,0xd54a,1,0xd551,1,0xd552,
+1,0xd6a4,1,0xd6a8,1,0xd7ca,1,0xd7ce,1,0xd800,1,0xfffe,2,0xa6d7,2,0xf800,
+2,0xfa1e,2,0xfffe,3,0,3,0xfffe,4,0,4,0xfffe,5,0,5,0xfffe,
+6,0,6,0xfffe,7,0,7,0xfffe,8,0,8,0xfffe,9,0,9,0xfffe,
+0xa,0,0xa,0xfffe,0xb,0,0xb,0xfffe,0xc,0,0xc,0xfffe,0xd,0,0xd,0xfffe,
+0xe,0,0xe,1,0xe,2,0xe,0x20,0xe,0x80,0xe,0xfffe
+};
+
diff --git a/icuSources/common/unormcmp.cpp b/icuSources/common/unormcmp.cpp
index 106e8399..ded2e730 100644
--- a/icuSources/common/unormcmp.cpp
+++ b/icuSources/common/unormcmp.cpp
@@ -1,7 +1,7 @@
/*
*******************************************************************************
*
-* Copyright (C) 2001-2004, International Business Machines
+* Copyright (C) 2001-2005, International Business Machines
* Corporation and others. All Rights Reserved.
*
*******************************************************************************
@@ -138,7 +138,7 @@ unorm_cmpEquivFold(const UChar *s1, int32_t length1,
const UChar *s2, int32_t length2,
uint32_t options,
UErrorCode *pErrorCode) {
- UCaseProps *csp;
+ const UCaseProps *csp;
/* current-level start/limit - s1/s2 as current */
const UChar *start1, *start2, *limit1, *limit2;
diff --git a/icuSources/common/unormimp.h b/icuSources/common/unormimp.h
index 6be9f303..f7b67806 100644
--- a/icuSources/common/unormimp.h
+++ b/icuSources/common/unormimp.h
@@ -452,7 +452,7 @@ unorm_getNX(int32_t options, UErrorCode *pErrorCode);
* @internal
*/
U_CAPI void U_EXPORT2
-unorm_addPropertyStarts(USetAdder *sa, UErrorCode *pErrorCode);
+unorm_addPropertyStarts(const USetAdder *sa, UErrorCode *pErrorCode);
/**
* Swap unorm.icu. See udataswp.h.
diff --git a/icuSources/common/uobject.cpp b/icuSources/common/uobject.cpp
index 581cd742..5fc54238 100644
--- a/icuSources/common/uobject.cpp
+++ b/icuSources/common/uobject.cpp
@@ -1,7 +1,7 @@
/*
******************************************************************************
*
-* Copyright (C) 2002-2004, International Business Machines
+* Copyright (C) 2002-2005, International Business Machines
* Corporation and others. All Rights Reserved.
*
******************************************************************************
@@ -76,6 +76,17 @@ void U_EXPORT2 UMemory::operator delete[](void *p) {
}
}
+#if U_HAVE_DEBUG_LOCATION_NEW
+void * U_EXPORT2 UMemory::operator new(size_t size, const char* /*file*/, int /*line*/) {
+ return UMemory::operator new(size);
+}
+
+void U_EXPORT2 UMemory::operator delete(void* p, const char* /*file*/, int /*line*/) {
+ UMemory::operator delete(p);
+}
+#endif /* U_HAVE_DEBUG_LOCATION_NEW */
+
+
#endif
UObject::~UObject() {}
diff --git a/icuSources/common/uprops.c b/icuSources/common/uprops.c
index 1abc8729..86464e54 100644
--- a/icuSources/common/uprops.c
+++ b/icuSources/common/uprops.c
@@ -1,7 +1,7 @@
/*
*******************************************************************************
*
-* Copyright (C) 2002-2004, International Business Machines
+* Copyright (C) 2002-2006, International Business Machines
* Corporation and others. All Rights Reserved.
*
*******************************************************************************
@@ -25,12 +25,63 @@
#include "unicode/uchar.h"
#include "unicode/uscript.h"
#include "cstring.h"
+#include "ucln_cmn.h"
+#include "umutex.h"
#include "unormimp.h"
+#include "ubidi_props.h"
#include "uprops.h"
+#include "ucase.h"
#define LENGTHOF(array) (int32_t)(sizeof(array)/sizeof((array)[0]))
-/* API functions ------------------------------------------------------------ */
+/* cleanup ------------------------------------------------------------------ */
+
+static const UBiDiProps *gBdp=NULL;
+
+static UBool U_CALLCONV uprops_cleanup(void) {
+ gBdp=NULL;
+ return TRUE;
+}
+
+/* bidi/shaping properties API ---------------------------------------------- */
+
+/* get the UBiDiProps singleton, or else its dummy, once and for all */
+static const UBiDiProps *
+getBiDiProps() {
+ /*
+ * This lazy intialization with double-checked locking (without mutex protection for
+ * the initial check) is transiently unsafe under certain circumstances.
+ * Check the readme and use u_init() if necessary.
+ */
+
+ /* the initial check is performed by the GET_BIDI_PROPS() macro */
+ const UBiDiProps *bdp;
+ UErrorCode errorCode=U_ZERO_ERROR;
+
+ bdp=ubidi_getSingleton(&errorCode);
+ if(U_FAILURE(errorCode)) {
+ errorCode=U_ZERO_ERROR;
+ bdp=ubidi_getDummy(&errorCode);
+ if(U_FAILURE(errorCode)) {
+ return NULL;
+ }
+ }
+
+ umtx_lock(NULL);
+ if(gBdp==NULL) {
+ gBdp=bdp;
+ bdp=NULL;
+ ucln_common_registerCleanup(UCLN_COMMON_UPROPS, uprops_cleanup);
+ }
+ umtx_unlock(NULL);
+
+ return gBdp;
+}
+
+/* see comment for GET_CASE_PROPS() */
+#define GET_BIDI_PROPS() (gBdp!=NULL ? gBdp : getBiDiProps())
+
+/* general properties API functions ----------------------------------------- */
static const struct {
int32_t column;
@@ -46,8 +97,8 @@ static const struct {
*/
{ 1, U_MASK(UPROPS_ALPHABETIC) },
{ 1, U_MASK(UPROPS_ASCII_HEX_DIGIT) },
- { 1, U_MASK(UPROPS_BIDI_CONTROL) },
- { -1, U_MASK(UPROPS_MIRROR_SHIFT) },
+ { UPROPS_SRC_BIDI, 0 }, /* UCHAR_BIDI_CONTROL */
+ { UPROPS_SRC_BIDI, 0 }, /* UCHAR_BIDI_MIRRORED */
{ 1, U_MASK(UPROPS_DASH) },
{ 1, U_MASK(UPROPS_DEFAULT_IGNORABLE_CODE_POINT) },
{ 1, U_MASK(UPROPS_DEPRECATED) },
@@ -64,7 +115,7 @@ static const struct {
{ 1, U_MASK(UPROPS_IDEOGRAPHIC) },
{ 1, U_MASK(UPROPS_IDS_BINARY_OPERATOR) },
{ 1, U_MASK(UPROPS_IDS_TRINARY_OPERATOR) },
- { 1, U_MASK(UPROPS_JOIN_CONTROL) },
+ { UPROPS_SRC_BIDI, 0 }, /* UCHAR_JOIN_CONTROL */
{ 1, U_MASK(UPROPS_LOGICAL_ORDER_EXCEPTION) },
{ UPROPS_SRC_CASE, 0 }, /* UCHAR_LOWERCASE */
{ 1, U_MASK(UPROPS_MATH) },
@@ -85,7 +136,14 @@ static const struct {
{ UPROPS_SRC_NORM, 0 }, /* UCHAR_NFKD_INERT */
{ UPROPS_SRC_NORM, 0 }, /* UCHAR_NFC_INERT */
{ UPROPS_SRC_NORM, 0 }, /* UCHAR_NFKC_INERT */
- { UPROPS_SRC_NORM, 0 } /* UCHAR_SEGMENT_STARTER */
+ { UPROPS_SRC_NORM, 0 }, /* UCHAR_SEGMENT_STARTER */
+ { 2, U_MASK(UPROPS_V2_PATTERN_SYNTAX) },
+ { 2, U_MASK(UPROPS_V2_PATTERN_WHITE_SPACE) },
+ { UPROPS_SRC_CHAR_AND_PROPSVEC, 0 }, /* UCHAR_POSIX_ALNUM */
+ { UPROPS_SRC_CHAR, 0 }, /* UCHAR_POSIX_BLANK */
+ { UPROPS_SRC_CHAR, 0 }, /* UCHAR_POSIX_GRAPH */
+ { UPROPS_SRC_CHAR, 0 }, /* UCHAR_POSIX_PRINT */
+ { UPROPS_SRC_CHAR, 0 } /* UCHAR_POSIX_XDIGIT */
};
U_CAPI UBool U_EXPORT2
@@ -101,24 +159,7 @@ u_hasBinaryProperty(UChar32 c, UProperty which) {
return (u_getUnicodeProperties(c, column)&mask)!=0;
} else {
if(column==UPROPS_SRC_CASE) {
- /* case mapping properties */
- UErrorCode errorCode=U_ZERO_ERROR;
- UCaseProps *csp=ucase_getSingleton(&errorCode);
- if(U_FAILURE(errorCode)) {
- return FALSE;
- }
- switch(which) {
- case UCHAR_LOWERCASE:
- return (UBool)(UCASE_LOWER==ucase_getType(csp, c));
- case UCHAR_UPPERCASE:
- return (UBool)(UCASE_UPPER==ucase_getType(csp, c));
- case UCHAR_SOFT_DOTTED:
- return ucase_isSoftDotted(csp, c);
- case UCHAR_CASE_SENSITIVE:
- return ucase_isCaseSensitive(csp, c);
- default:
- break;
- }
+ return ucase_hasBinaryProperty(c, which);
} else if(column==UPROPS_SRC_NORM) {
#if !UCONFIG_NO_NORMALIZATION
/* normalization properties from unorm.icu */
@@ -129,13 +170,49 @@ u_hasBinaryProperty(UChar32 c, UProperty which) {
case UCHAR_NFKD_INERT:
case UCHAR_NFC_INERT:
case UCHAR_NFKC_INERT:
- return unorm_isNFSkippable(c, (UNormalizationMode)(which-UCHAR_NFD_INERT)+UNORM_NFD);
+ return unorm_isNFSkippable(c, (UNormalizationMode)(which-UCHAR_NFD_INERT+UNORM_NFD));
case UCHAR_SEGMENT_STARTER:
return unorm_isCanonSafeStart(c);
default:
break;
}
#endif
+ } else if(column==UPROPS_SRC_BIDI) {
+ /* bidi/shaping properties */
+ const UBiDiProps *bdp=GET_BIDI_PROPS();
+ if(bdp!=NULL) {
+ switch(which) {
+ case UCHAR_BIDI_MIRRORED:
+ return ubidi_isMirrored(bdp, c);
+ case UCHAR_BIDI_CONTROL:
+ return ubidi_isBidiControl(bdp, c);
+ case UCHAR_JOIN_CONTROL:
+ return ubidi_isJoinControl(bdp, c);
+ default:
+ break;
+ }
+ }
+ /* else return FALSE below */
+ } else if(column==UPROPS_SRC_CHAR) {
+ switch(which) {
+ case UCHAR_POSIX_BLANK:
+ return u_isblank(c);
+ case UCHAR_POSIX_GRAPH:
+ return u_isgraphPOSIX(c);
+ case UCHAR_POSIX_PRINT:
+ return u_isprintPOSIX(c);
+ case UCHAR_POSIX_XDIGIT:
+ return u_isxdigit(c);
+ default:
+ break;
+ }
+ } else if(column==UPROPS_SRC_CHAR_AND_PROPSVEC) {
+ switch(which) {
+ case UCHAR_POSIX_ALNUM:
+ return u_isalnumPOSIX(c);
+ default:
+ break;
+ }
}
}
}
@@ -145,6 +222,7 @@ u_hasBinaryProperty(UChar32 c, UProperty which) {
U_CAPI int32_t U_EXPORT2
u_getIntPropertyValue(UChar32 c, UProperty which) {
UErrorCode errorCode;
+ int32_t type;
if(which>UPROPS_JG_SHIFT;
+ return ubidi_getJoiningGroup(GET_BIDI_PROPS(), c);
case UCHAR_JOINING_TYPE:
- return (int32_t)(u_getUnicodeProperties(c, 2)&UPROPS_JT_MASK)>>UPROPS_JT_SHIFT;
+ return ubidi_getJoiningType(GET_BIDI_PROPS(), c);
case UCHAR_LINE_BREAK:
return (int32_t)(u_getUnicodeProperties(c, 0)&UPROPS_LB_MASK)>>UPROPS_LB_SHIFT;
case UCHAR_NUMERIC_TYPE:
- return (int32_t)GET_NUMERIC_TYPE(u_getUnicodeProperties(c, -1));
+ type=(int32_t)GET_NUMERIC_TYPE(u_getUnicodeProperties(c, -1));
+ if(type>U_NT_NUMERIC) {
+ /* keep internal variants of U_NT_NUMERIC from becoming visible */
+ type=U_NT_NUMERIC;
+ }
+ return type;
case UCHAR_SCRIPT:
errorCode=U_ZERO_ERROR;
return (int32_t)uscript_getScript(c, &errorCode);
@@ -188,12 +271,18 @@ u_getIntPropertyValue(UChar32 c, UProperty which) {
case UCHAR_NFKD_QUICK_CHECK:
case UCHAR_NFC_QUICK_CHECK:
case UCHAR_NFKC_QUICK_CHECK:
- return (int32_t)unorm_getQuickCheck(c, (UNormalizationMode)(which-UCHAR_NFD_QUICK_CHECK)+UNORM_NFD);
+ return (int32_t)unorm_getQuickCheck(c, (UNormalizationMode)(which-UCHAR_NFD_QUICK_CHECK+UNORM_NFD));
case UCHAR_LEAD_CANONICAL_COMBINING_CLASS:
return unorm_getFCD16FromCodePoint(c)>>8;
case UCHAR_TRAIL_CANONICAL_COMBINING_CLASS:
return unorm_getFCD16FromCodePoint(c)&0xff;
#endif
+ case UCHAR_GRAPHEME_CLUSTER_BREAK:
+ return (int32_t)(u_getUnicodeProperties(c, 2)&UPROPS_GCB_MASK)>>UPROPS_GCB_SHIFT;
+ case UCHAR_SENTENCE_BREAK:
+ return (int32_t)(u_getUnicodeProperties(c, 2)&UPROPS_SB_MASK)>>UPROPS_SB_SHIFT;
+ case UCHAR_WORD_BREAK:
+ return (int32_t)(u_getUnicodeProperties(c, 2)&UPROPS_WB_MASK)>>UPROPS_WB_SHIFT;
default:
return 0; /* undefined */
}
@@ -211,8 +300,6 @@ u_getIntPropertyMinValue(UProperty which) {
U_CAPI int32_t U_EXPORT2
u_getIntPropertyMaxValue(UProperty which) {
- int32_t max;
-
if(which>UPROPS_BLOCK_SHIFT;
- return max!=0 ? max : (int32_t)UBLOCK_COUNT-1;
+ return (uprv_getMaxValues(0)&UPROPS_BLOCK_MASK)>>UPROPS_BLOCK_SHIFT;
case UCHAR_CANONICAL_COMBINING_CLASS:
case UCHAR_LEAD_CANONICAL_COMBINING_CLASS:
case UCHAR_TRAIL_CANONICAL_COMBINING_CLASS:
return 0xff; /* TODO do we need to be more precise, getting the actual maximum? */
case UCHAR_DECOMPOSITION_TYPE:
- max=uprv_getMaxValues(2)&UPROPS_DT_MASK;
- return max!=0 ? max : (int32_t)U_DT_COUNT-1;
+ return uprv_getMaxValues(2)&UPROPS_DT_MASK;
case UCHAR_EAST_ASIAN_WIDTH:
- max=(uprv_getMaxValues(0)&UPROPS_EA_MASK)>>UPROPS_EA_SHIFT;
- return max!=0 ? max : (int32_t)U_EA_COUNT-1;
+ return (uprv_getMaxValues(0)&UPROPS_EA_MASK)>>UPROPS_EA_SHIFT;
case UCHAR_GENERAL_CATEGORY:
return (int32_t)U_CHAR_CATEGORY_COUNT-1;
- case UCHAR_JOINING_GROUP:
- max=(uprv_getMaxValues(2)&UPROPS_JG_MASK)>>UPROPS_JG_SHIFT;
- return max!=0 ? max : (int32_t)U_JG_COUNT-1;
- case UCHAR_JOINING_TYPE:
- max=(uprv_getMaxValues(2)&UPROPS_JT_MASK)>>UPROPS_JT_SHIFT;
- return max!=0 ? max : (int32_t)U_JT_COUNT-1;
case UCHAR_LINE_BREAK:
- max=(uprv_getMaxValues(0)&UPROPS_LB_MASK)>>UPROPS_LB_SHIFT;
- return max!=0 ? max : (int32_t)U_LB_COUNT-1;
+ return (uprv_getMaxValues(0)&UPROPS_LB_MASK)>>UPROPS_LB_SHIFT;
case UCHAR_NUMERIC_TYPE:
return (int32_t)U_NT_COUNT-1;
case UCHAR_SCRIPT:
- max=uprv_getMaxValues(0)&UPROPS_SCRIPT_MASK;
- return max!=0 ? max : (int32_t)USCRIPT_CODE_LIMIT-1;
+ return uprv_getMaxValues(0)&UPROPS_SCRIPT_MASK;
case UCHAR_HANGUL_SYLLABLE_TYPE:
return (int32_t)U_HST_COUNT-1;
#if !UCONFIG_NO_NORMALIZATION
@@ -262,6 +340,12 @@ u_getIntPropertyMaxValue(UProperty which) {
case UCHAR_NFKC_QUICK_CHECK:
return (int32_t)UNORM_MAYBE;
#endif
+ case UCHAR_GRAPHEME_CLUSTER_BREAK:
+ return (uprv_getMaxValues(2)&UPROPS_GCB_MASK)>>UPROPS_GCB_SHIFT;
+ case UCHAR_SENTENCE_BREAK:
+ return (uprv_getMaxValues(2)&UPROPS_SB_MASK)>>UPROPS_SB_SHIFT;
+ case UCHAR_WORD_BREAK:
+ return (uprv_getMaxValues(2)&UPROPS_WB_MASK)>>UPROPS_WB_SHIFT;
default:
return -1; /* undefined */
}
@@ -276,7 +360,7 @@ uprops_getSource(UProperty which) {
return UPROPS_SRC_NONE; /* undefined */
} else if(which>UPROPS_BIDI_SHIFT)&0x1f)
+#define CAT_MASK(props) U_MASK(GET_CATEGORY(props))
+
#define GET_NUMERIC_TYPE(props) (((props)>>UPROPS_NUMERIC_TYPE_SHIFT)&7)
-#define GET_UNSIGNED_VALUE(props) ((props)>>UPROPS_VALUE_SHIFT)
-#define GET_SIGNED_VALUE(props) ((int32_t)(props)>>UPROPS_VALUE_SHIFT)
-#define GET_EXCEPTIONS(props) (exceptionsTable+GET_UNSIGNED_VALUE(props))
+#define GET_NUMERIC_VALUE(props) (((props)>>UPROPS_NUMERIC_VALUE_SHIFT)&0xff)
-#define CAT_MASK(props) U_MASK(GET_CATEGORY(props))
+/* internal numeric pseudo-types for special encodings of numeric values */
+enum {
+ UPROPS_NT_FRACTION=4, /* ==U_NT_COUNT, must not change unless binary format version changes */
+ UPROPS_NT_LARGE,
+ UPROPS_NT_COUNT
+};
+/* encoding of fractional and large numbers */
enum {
- EXC_UPPERCASE,
- EXC_LOWERCASE,
- EXC_TITLECASE,
- EXC_UNUSED,
- EXC_NUMERIC_VALUE,
- EXC_DENOMINATOR_VALUE,
- EXC_MIRROR_MAPPING,
- EXC_SPECIAL_CASING,
- EXC_CASE_FOLDING
+ UPROPS_MAX_SMALL_NUMBER=0xff,
+
+ UPROPS_FRACTION_NUM_SHIFT=3, /* numerator: bits 7..3 */
+ UPROPS_FRACTION_DEN_MASK=7, /* denominator: bits 2..0 */
+
+ UPROPS_FRACTION_MAX_NUM=31,
+ UPROPS_FRACTION_DEN_OFFSET=2, /* denominator values are 2..9 */
+
+ UPROPS_FRACTION_MIN_DEN=UPROPS_FRACTION_DEN_OFFSET,
+ UPROPS_FRACTION_MAX_DEN=UPROPS_FRACTION_MIN_DEN+UPROPS_FRACTION_DEN_MASK,
+
+ UPROPS_LARGE_MANT_SHIFT=4, /* mantissa: bits 7..4 */
+ UPROPS_LARGE_EXP_MASK=0xf, /* exponent: bits 3..0 */
+ UPROPS_LARGE_EXP_OFFSET=2, /* regular exponents 2..17 */
+ UPROPS_LARGE_EXP_OFFSET_EXTRA=18, /* extra large exponents 18..33 */
+
+ UPROPS_LARGE_MIN_EXP=UPROPS_LARGE_EXP_OFFSET,
+ UPROPS_LARGE_MAX_EXP=UPROPS_LARGE_MIN_EXP+UPROPS_LARGE_EXP_MASK,
+ UPROPS_LARGE_MAX_EXP_EXTRA=UPROPS_LARGE_EXP_OFFSET_EXTRA+UPROPS_LARGE_EXP_MASK
};
/* number of properties vector words */
@@ -94,8 +95,7 @@ enum {
* Properties in vector word 0
* Bits
* 31..24 DerivedAge version major/minor one nibble each
- * 23 reserved
- * 22..18 Line Break
+ * 23..18 Line Break
* 17..15 East Asian Width
* 14.. 7 UBlockCode
* 6.. 0 UScriptCode
@@ -105,7 +105,7 @@ enum {
#define UPROPS_AGE_MASK 0xff000000
#define UPROPS_AGE_SHIFT 24
-#define UPROPS_LB_MASK 0x007C0000
+#define UPROPS_LB_MASK 0x00FC0000
#define UPROPS_LB_SHIFT 18
#define UPROPS_EA_MASK 0x00038000
@@ -129,8 +129,8 @@ enum {
*/
enum {
UPROPS_WHITE_SPACE,
- UPROPS_BIDI_CONTROL,
- UPROPS_JOIN_CONTROL,
+ UPROPS_WAS_BIDI_CONTROL, /* reserved, was used in format version 3 */
+ UPROPS_WAS_JOIN_CONTROL,
UPROPS_DASH,
UPROPS_HYPHEN,
UPROPS_QUOTATION_MARK,
@@ -142,8 +142,8 @@ enum {
UPROPS_IDEOGRAPHIC,
UPROPS_DIACRITIC,
UPROPS_EXTENDER,
- UPROPS_LOWERCASE,
- UPROPS_UPPERCASE,
+ UPROPS_WAS_LOWERCASE, /* reserved, was used in format version 3 */
+ UPROPS_WAS_UPPERCASE,
UPROPS_NONCHARACTER_CODE_POINT,
UPROPS_GRAPHEME_EXTEND,
UPROPS_GRAPHEME_LINK,
@@ -153,7 +153,7 @@ enum {
UPROPS_UNIFIED_IDEOGRAPH,
UPROPS_DEFAULT_IGNORABLE_CODE_POINT,
UPROPS_DEPRECATED,
- UPROPS_SOFT_DOTTED,
+ UPROPS_WAS_SOFT_DOTTED, /* reserved, was used in format version 3 */
UPROPS_LOGICAL_ORDER_EXCEPTION,
UPROPS_XID_START,
UPROPS_XID_CONTINUE,
@@ -167,21 +167,28 @@ enum {
* Properties in vector word 2
* Bits
* 31..24 More binary properties
- * 13..11 Joining Type
- * 10.. 5 Joining Group
+ * 23..19 reserved
+ * 18..14 Sentence Break
+ * 13..10 Word Break
+ * 9.. 5 Grapheme Cluster Break
* 4.. 0 Decomposition Type
*/
-#define UPROPS_JT_MASK 0x00003800
-#define UPROPS_JT_SHIFT 11
+#define UPROPS_SB_MASK 0x0007c000
+#define UPROPS_SB_SHIFT 14
+
+#define UPROPS_WB_MASK 0x00003c00
+#define UPROPS_WB_SHIFT 10
-#define UPROPS_JG_MASK 0x000007e0
-#define UPROPS_JG_SHIFT 5
+#define UPROPS_GCB_MASK 0x000003e0
+#define UPROPS_GCB_SHIFT 5
#define UPROPS_DT_MASK 0x0000001f
enum {
UPROPS_V2_S_TERM=24, /* new in ICU 3.0 and Unicode 4.0.1 */
UPROPS_V2_VARIATION_SELECTOR,
+ UPROPS_V2_PATTERN_SYNTAX, /* new in ICU 3.4 and Unicode 4.1 */
+ UPROPS_V2_PATTERN_WHITE_SPACE,
UPROPS_V2_TOP /* must be <=32 */
};
@@ -217,6 +224,31 @@ uprv_getMaxValues(int32_t column);
U_CFUNC UHangulSyllableType
uchar_getHST(UChar32 c);
+/**
+ * Checks if c is alphabetic, or a decimal digit; implements UCHAR_POSIX_ALNUM.
+ * @internal
+ */
+U_CFUNC UBool
+u_isalnumPOSIX(UChar32 c);
+
+/**
+ * Checks if c is in
+ * [^\p{space}\p{gc=Control}\p{gc=Surrogate}\p{gc=Unassigned}]
+ * with space=\p{Whitespace} and Control=Cc.
+ * Implements UCHAR_POSIX_GRAPH.
+ * @internal
+ */
+U_CFUNC UBool
+u_isgraphPOSIX(UChar32 c);
+
+/**
+ * Checks if c is in \p{graph}\p{blank} - \p{cntrl}.
+ * Implements UCHAR_POSIX_PRINT.
+ * @internal
+ */
+U_CFUNC UBool
+u_isprintPOSIX(UChar32 c);
+
/** Turn a bit index into a bit flag. @internal */
#define FLAG(n) ((uint32_t)1<<(n))
@@ -259,8 +291,10 @@ enum {
FF =0x000c,
CR =0x000d,
U_A =0x0041,
+ U_F =0x0046,
U_Z =0x005a,
U_a =0x0061,
+ U_f =0x0066,
U_z =0x007a,
DEL =0x007f,
NL =0x0085,
@@ -275,6 +309,12 @@ enum {
WJ =0x2060,
INHSWAP =0x206a,
NOMDIG =0x206f,
+ U_FW_A =0xff21,
+ U_FW_F =0xff26,
+ U_FW_Z =0xff3a,
+ U_FW_a =0xff41,
+ U_FW_f =0xff46,
+ U_FW_z =0xff5a,
ZWNBSP =0xfeff
};
@@ -285,19 +325,6 @@ enum {
U_CAPI int32_t U_EXPORT2
uprv_getMaxCharNameLength(void);
-#if 0
-/*
-Currently not used but left for future use. Probably by UnicodeSet.
-urename.h and unames.c changed accordingly.
-*/
-/**
- * Get the maximum length of an ISO comment.
- * @return 0 if no ISO comments available.
- */
-U_CAPI int32_t U_EXPORT2
-uprv_getMaxISOCommentLength();
-#endif
-
/**
* Fills set with characters that are used in Unicode character names.
* Includes all characters that are used in regular/Unicode 1.0/extended names.
@@ -305,22 +332,7 @@ uprv_getMaxISOCommentLength();
* @param sa USetAdder to receive characters.
*/
U_CAPI void U_EXPORT2
-uprv_getCharNameCharacters(USetAdder *sa);
-
-#if 0
-/*
-Currently not used but left for future use. Probably by UnicodeSet.
-urename.h and unames.c changed accordingly.
-*/
-/**
- * Fills set with characters that are used in Unicode character names.
- * Just empties the set if no ISO comments are available.
- * @param sa USetAdder to receive characters.
- */
-U_CAPI void U_EXPORT2
-uprv_getISOCommentCharacters(USetAdder *sa);
-*/
-#endif
+uprv_getCharNameCharacters(const USetAdder *sa);
/**
* Constants for which data and implementation files provide which properties.
@@ -330,8 +342,10 @@ uprv_getISOCommentCharacters(USetAdder *sa);
enum UPropertySource {
/** No source, not a supported property. */
UPROPS_SRC_NONE,
- /** From uchar.c/uprops.icu */
+ /** From uchar.c/uprops.icu main trie */
UPROPS_SRC_CHAR,
+ /** From uchar.c/uprops.icu properties vectors trie */
+ UPROPS_SRC_PROPSVEC,
/** Hangul_Syllable_Type, from uchar.c/uprops.icu */
UPROPS_SRC_HST,
/** From unames.c/unames.icu */
@@ -340,9 +354,11 @@ enum UPropertySource {
UPROPS_SRC_NORM,
/** From ucase.c/ucase.icu */
UPROPS_SRC_CASE,
- /** From ubidi.c/ubidi.icu */
+ /** From ubidi_props.c/ubidi.icu */
UPROPS_SRC_BIDI,
- /** One more than the highes UPropertySource (UPROPS_SRC_) constant. */
+ /** From uchar.c/uprops.icu main trie as well as properties vectors trie */
+ UPROPS_SRC_CHAR_AND_PROPSVEC,
+ /** One more than the highest UPropertySource (UPROPS_SRC_) constant. */
UPROPS_SRC_COUNT
};
typedef enum UPropertySource UPropertySource;
@@ -355,19 +371,27 @@ U_CAPI UPropertySource U_EXPORT2
uprops_getSource(UProperty which);
/**
- * Enumerate each core properties data trie and add the
+ * Enumerate uprops.icu's main data trie and add the
+ * start of each range of same properties to the set.
+ * @internal
+ */
+U_CAPI void U_EXPORT2
+uchar_addPropertyStarts(const USetAdder *sa, UErrorCode *pErrorCode);
+
+/**
+ * Enumerate uprops.icu's properties vectors trie and add the
* start of each range of same properties to the set.
* @internal
*/
U_CAPI void U_EXPORT2
-uchar_addPropertyStarts(USetAdder *sa, UErrorCode *pErrorCode);
+upropsvec_addPropertyStarts(const USetAdder *sa, UErrorCode *pErrorCode);
/**
* Same as uchar_addPropertyStarts() but only for Hangul_Syllable_Type.
* @internal
*/
U_CAPI void U_EXPORT2
-uhst_addPropertyStarts(USetAdder *sa, UErrorCode *pErrorCode);
+uhst_addPropertyStarts(const USetAdder *sa, UErrorCode *pErrorCode);
/**
* Return a set of characters for property enumeration.
@@ -378,7 +402,7 @@ uhst_addPropertyStarts(USetAdder *sa, UErrorCode *pErrorCode);
* @internal
*/
U_CAPI void U_EXPORT2
-uprv_getInclusions(USetAdder *sa, UErrorCode *pErrorCode);
+uprv_getInclusions(const USetAdder *sa, UErrorCode *pErrorCode);
/**
* Swap the ICU Unicode properties file. See uchar.c.
diff --git a/icuSources/common/urbtok.cpp b/icuSources/common/urbtok.cpp
new file mode 100644
index 00000000..7c217c9f
--- /dev/null
+++ b/icuSources/common/urbtok.cpp
@@ -0,0 +1,169 @@
+/*
+*****************************************************************************************
+* Copyright (C) 2006, Apple Computer, Inc.
+* All Rights Reserved.
+*****************************************************************************************
+*/
+
+#include "unicode/utypes.h"
+
+#if !UCONFIG_NO_BREAK_ITERATION
+
+#include "unicode/urbtok.h"
+
+#include "rbtok.h"
+#include "unicode/ustring.h"
+#include "rbbidata.h"
+#include "cmemory.h"
+#include "ucmndata.h"
+
+U_NAMESPACE_USE
+
+U_CAPI UBreakIterator* U_EXPORT2
+urbtok_openRules(const UChar *rules,
+ int32_t rulesLength,
+ UParseError *parseErr,
+ UErrorCode *status)
+{
+ if (status == NULL || U_FAILURE(*status)){
+ return 0;
+ }
+
+ BreakIterator *result = 0;
+ UnicodeString ruleString(rules, rulesLength);
+ result = new RuleBasedTokenizer(ruleString, *parseErr, *status);
+ if(U_FAILURE(*status)) {
+ return 0;
+ }
+
+ UBreakIterator *uBI = (UBreakIterator *)result;
+ return uBI;
+}
+
+U_CAPI UBreakIterator* U_EXPORT2
+urbtok_openBinaryRules(const uint8_t *rules,
+ UErrorCode *status)
+{
+ if (status == NULL || U_FAILURE(*status)){
+ return 0;
+ }
+
+ uint32_t length = ((const RBBIDataHeader *)rules)->fLength;
+ uint8_t *ruleCopy = (uint8_t *) uprv_malloc(length);
+ if (ruleCopy == 0)
+ {
+ *status = U_MEMORY_ALLOCATION_ERROR;
+ return 0;
+ }
+ // Copy the rules so they can be adopted by the tokenizer
+ uprv_memcpy(ruleCopy, rules, length);
+ BreakIterator *result = 0;
+ result = new RuleBasedTokenizer(ruleCopy, *status);
+ if(U_FAILURE(*status)) {
+ return 0;
+ }
+
+ UBreakIterator *uBI = (UBreakIterator *)result;
+ return uBI;
+}
+
+U_CAPI uint32_t U_EXPORT2
+urbtok_getBinaryRules(UBreakIterator *bi,
+ uint8_t *buffer,
+ uint32_t buffSize,
+ UErrorCode *status)
+{
+ if (status == NULL || U_FAILURE(*status)){
+ return 0;
+ }
+
+ uint32_t length;
+ const uint8_t *rules = ((RuleBasedBreakIterator *)bi)->getBinaryRules(length);
+ if (buffer != 0)
+ {
+ if (length > buffSize)
+ {
+ *status = U_BUFFER_OVERFLOW_ERROR;
+ }
+ else
+ {
+ uprv_memcpy(buffer, rules, length);
+ }
+ }
+ return length;
+}
+
+U_CAPI int32_t U_EXPORT2
+urbtok_tokenize(UBreakIterator *bi,
+ int32_t maxTokens,
+ RuleBasedTokenRange *outTokens,
+ unsigned long *outTokenFlags)
+{
+ return ((RuleBasedTokenizer *)bi)->tokenize(maxTokens, outTokens, outTokenFlags);
+}
+
+U_CAPI void U_EXPORT2
+urbtok_swapBinaryRules(const uint8_t *rules,
+ uint8_t *buffer,
+ UBool inIsBigEndian,
+ UBool outIsBigEndian,
+ UErrorCode *status)
+{
+ UDataSwapper *ds = udata_openSwapper(inIsBigEndian, U_CHARSET_FAMILY, outIsBigEndian, U_CHARSET_FAMILY, status);
+
+ if (status == NULL || U_FAILURE(*status)){
+ return;
+ }
+
+ uint32_t length = ds->readUInt32(((const RBBIDataHeader *)rules)->fLength);
+ uint32_t totalLength = sizeof(DataHeader) + length;
+
+ DataHeader *dh = (DataHeader *)uprv_malloc(totalLength);
+ if (dh == 0)
+ {
+ *status = U_MEMORY_ALLOCATION_ERROR;
+ goto closeSwapper;
+ }
+ DataHeader *outH = (DataHeader *)uprv_malloc(totalLength);
+ if (outH == 0)
+ {
+ *status = U_MEMORY_ALLOCATION_ERROR;
+ uprv_free(dh);
+ goto closeSwapper;
+ }
+ dh->dataHeader.headerSize = ds->readUInt16(sizeof(DataHeader));
+ dh->dataHeader.magic1 = 0xda;
+ dh->dataHeader.magic2 = 0x27;
+ dh->info.size = ds->readUInt16(sizeof(UDataInfo));
+ dh->info.reservedWord = 0;
+ dh->info.isBigEndian = inIsBigEndian;
+ dh->info.charsetFamily = U_CHARSET_FAMILY;
+ dh->info.sizeofUChar = U_SIZEOF_UCHAR;
+ dh->info.reservedByte = 0;
+ uprv_memcpy(dh->info.dataFormat, "Brk ", sizeof(dh->info.dataFormat));
+ uprv_memcpy(dh->info.formatVersion, ((const RBBIDataHeader *)rules)->fFormatVersion, sizeof(dh->info.formatVersion));
+ dh->info.dataVersion[0] = 4; // Unicode version
+ dh->info.dataVersion[1] = 1;
+ dh->info.dataVersion[2] = 0;
+ dh->info.dataVersion[3] = 0;
+ uprv_memcpy(((uint8_t*)dh) + sizeof(DataHeader), rules, length);
+
+ int32_t outLength = ubrk_swap(ds, dh, totalLength, outH, status);
+ if (U_SUCCESS(*status) && outLength != totalLength) // something went horribly wrong
+ {
+ *status = U_INVALID_FORMAT_ERROR;
+ }
+
+ if (U_SUCCESS(*status))
+ {
+ uprv_memcpy(buffer, ((uint8_t *)outH) + sizeof(DataHeader), length);
+ }
+ uprv_free(outH);
+ uprv_free(dh);
+
+closeSwapper:
+ udata_closeSwapper(ds);
+}
+
+
+#endif /* #if !UCONFIG_NO_BREAK_ITERATION */
diff --git a/icuSources/common/ures_cnv.c b/icuSources/common/ures_cnv.c
index 9326ef12..c9729019 100644
--- a/icuSources/common/ures_cnv.c
+++ b/icuSources/common/ures_cnv.c
@@ -1,7 +1,7 @@
/*
*******************************************************************************
*
-* Copyright (C) 1997-2004, International Business Machines
+* Copyright (C) 1997-2006, International Business Machines
* Corporation and others. All Rights Reserved.
*
*******************************************************************************
@@ -27,51 +27,49 @@
U_CAPI UResourceBundle * U_EXPORT2
ures_openU(const UChar *myPath,
const char *localeID,
- UErrorCode *status) {
- char path[2048];
+ UErrorCode *status)
+{
+ char pathBuffer[1024];
int32_t length;
+ char *path = pathBuffer;
if(status==NULL || U_FAILURE(*status)) {
return NULL;
}
if(myPath==NULL) {
- *status=U_ILLEGAL_ARGUMENT_ERROR;
- return NULL;
+ path = NULL;
}
-
- length=u_strlen(myPath);
- if(length>=sizeof(path)) {
- *status=U_ILLEGAL_ARGUMENT_ERROR;
- return NULL;
- } else if(uprv_isInvariantUString(myPath, length)) {
- /*
- * the invariant converter is sufficient for package and tree names
- * and is more efficient
- */
- u_UCharsToChars(myPath, path, length+1); /* length+1 to include the NUL */
- } else {
-#if !UCONFIG_NO_CONVERSION
- /* use the default converter to support variant-character paths */
- UConverter *cnv=u_getDefaultConverter(status);
- if(U_FAILURE(*status)) {
- return NULL;
- }
-
- length=ucnv_fromUChars(cnv, path, (int32_t)sizeof(path), myPath, length, status);
- u_releaseDefaultConverter(cnv);
- if(U_FAILURE(*status)) {
- return NULL;
- }
- if(length>=sizeof(path)) {
- /* not NUL-terminated - path too long */
+ else {
+ length=u_strlen(myPath);
+ if(length>=sizeof(pathBuffer)) {
*status=U_ILLEGAL_ARGUMENT_ERROR;
return NULL;
- }
+ } else if(uprv_isInvariantUString(myPath, length)) {
+ /*
+ * the invariant converter is sufficient for package and tree names
+ * and is more efficient
+ */
+ u_UCharsToChars(myPath, path, length+1); /* length+1 to include the NUL */
+ } else {
+#if !UCONFIG_NO_CONVERSION
+ /* use the default converter to support variant-character paths */
+ UConverter *cnv=u_getDefaultConverter(status);
+ length=ucnv_fromUChars(cnv, path, (int32_t)sizeof(pathBuffer), myPath, length, status);
+ u_releaseDefaultConverter(cnv);
+ if(U_FAILURE(*status)) {
+ return NULL;
+ }
+ if(length>=sizeof(pathBuffer)) {
+ /* not NUL-terminated - path too long */
+ *status=U_ILLEGAL_ARGUMENT_ERROR;
+ return NULL;
+ }
#else
- /* the default converter is not available */
- *status=U_UNSUPPORTED_ERROR;
- return NULL;
+ /* the default converter is not available */
+ *status=U_UNSUPPORTED_ERROR;
+ return NULL;
#endif
+ }
}
return ures_open(path, localeID, status);
diff --git a/icuSources/common/uresbund.c b/icuSources/common/uresbund.c
index c3a7f0cf..1a99a241 100644
--- a/icuSources/common/uresbund.c
+++ b/icuSources/common/uresbund.c
@@ -1,6 +1,6 @@
/*
******************************************************************************
-* Copyright (C) 1997-2004, International Business Machines Corporation and *
+* Copyright (C) 1997-2006, International Business Machines Corporation and *
* others. All Rights Reserved. *
******************************************************************************
*
@@ -45,7 +45,7 @@ static UHashtable *cache = NULL;
static UMTX resbMutex = NULL;
/* INTERNAL: hashes an entry */
-static int32_t U_EXPORT2 U_CALLCONV hashEntry(const UHashTok parm) {
+static int32_t U_CALLCONV hashEntry(const UHashTok parm) {
UResourceDataEntry *b = (UResourceDataEntry *)parm.pointer;
UHashTok namekey, pathkey;
namekey.pointer = b->fName;
@@ -54,7 +54,7 @@ static int32_t U_EXPORT2 U_CALLCONV hashEntry(const UHashTok parm) {
}
/* INTERNAL: compares two entries */
-static UBool U_EXPORT2 U_CALLCONV compareEntries(const UHashTok p1, const UHashTok p2) {
+static UBool U_CALLCONV compareEntries(const UHashTok p1, const UHashTok p2) {
UResourceDataEntry *b1 = (UResourceDataEntry *)p1.pointer;
UResourceDataEntry *b2 = (UResourceDataEntry *)p2.pointer;
UHashTok name1, name2, path1, path2;
@@ -214,7 +214,7 @@ static void initCache(UErrorCode *status) {
makeCache = (cache == NULL);
umtx_unlock(&resbMutex);
if(makeCache) {
- UHashtable *newCache = uhash_open(hashEntry, compareEntries, status);
+ UHashtable *newCache = uhash_open(hashEntry, compareEntries, NULL, status);
if (U_FAILURE(*status)) {
return;
}
@@ -257,7 +257,7 @@ static UResourceDataEntry *init_entry(const char *localeID, const char *path, UE
const char *myPath = NULL;
char aliasName[100] = { 0 };
int32_t aliasLen = 0;
- UBool isAlias = FALSE;
+ /*UBool isAlias = FALSE;*/
UHashTok hashkey;
if(U_FAILURE(*status)) {
@@ -267,7 +267,7 @@ static UResourceDataEntry *init_entry(const char *localeID, const char *path, UE
/* here we try to deduce the right locale name */
if(localeID == NULL) { /* if localeID is NULL, we're trying to open default locale */
uprv_strcpy(name, uloc_getDefault());
- } else if(uprv_strlen(localeID) == 0) { /* if localeID is "" then we try to open root locale */
+ } else if(*localeID == 0) { /* if localeID is "" then we try to open root locale */
uprv_strcpy(name, kRootLocaleName);
} else { /* otherwise, we'll open what we're given */
uprv_strcpy(name, localeID);
@@ -320,12 +320,10 @@ static UResourceDataEntry *init_entry(const char *localeID, const char *path, UE
r->fHashKey = hashValue;
r->fParent = NULL;
- r->fData.data = NULL;
- r->fData.pRoot = NULL;
- r->fData.rootRes = 0;
+ uprv_memset(&r->fData, 0, sizeof(ResourceData));
r->fBogus = U_ZERO_ERROR;
- /* this is the acutal loading - returns bool true/false */
+ /* this is the actual loading - returns bool true/false */
result = res_load(&(r->fData), r->fPath, r->fName, status);
if (result == FALSE || U_FAILURE(*status)) {
@@ -338,18 +336,20 @@ static UResourceDataEntry *init_entry(const char *localeID, const char *path, UE
/* handle the alias by trying to get out the %%Alias tag.*/
/* We'll try to get alias string from the bundle */
Resource aliasres = res_getResource(&(r->fData), "%%ALIAS");
- const UChar *alias = res_getString(&(r->fData), aliasres, &aliasLen);
- if(alias != NULL && aliasLen > 0) { /* if there is actual alias - unload and load new data */
- u_UCharsToChars(alias, aliasName, aliasLen+1);
- isAlias = TRUE;
- res_unload(&(r->fData));
- result = res_load(&(r->fData), r->fPath, aliasName, status);
- if (result == FALSE || U_FAILURE(*status)) {
- /* we couldn't load aliased data - so we have no data */
- *status = U_USING_FALLBACK_WARNING;
- r->fBogus = U_USING_FALLBACK_WARNING;
+ if (aliasres != RES_BOGUS) {
+ const UChar *alias = res_getString(&(r->fData), aliasres, &aliasLen);
+ if(alias != NULL && aliasLen > 0) { /* if there is actual alias - unload and load new data */
+ u_UCharsToChars(alias, aliasName, aliasLen+1);
+ /*isAlias = TRUE;*/
+ res_unload(&(r->fData));
+ result = res_load(&(r->fData), r->fPath, aliasName, status);
+ if (result == FALSE || U_FAILURE(*status)) {
+ /* we couldn't load aliased data - so we have no data */
+ *status = U_USING_FALLBACK_WARNING;
+ r->fBogus = U_USING_FALLBACK_WARNING;
+ }
+ setEntryName(r, aliasName, status);
}
- setEntryName(r, aliasName, status);
}
}
@@ -459,7 +459,7 @@ static UResourceDataEntry *entryOpen(const char* path, const char* localeID, UEr
if(r != NULL) { /* if there is one real locale, we can look for parents. */
t1 = r;
hasRealData = TRUE;
- while (hasChopped && !isRoot && t1->fParent == NULL) {
+ while (hasChopped && !isRoot && t1->fParent == NULL && !t1->fData.noFallback) {
/* insert regular parents */
t2 = init_entry(name, r->fPath, &parentStatus);
t1->fParent = t2;
@@ -501,7 +501,7 @@ static UResourceDataEntry *entryOpen(const char* path, const char* localeID, UEr
} else { /* we don't even have the root locale */
*status = U_MISSING_RESOURCE_ERROR;
}
- } else if(!isRoot && uprv_strcmp(t1->fName, kRootLocaleName) != 0 && t1->fParent == NULL) {
+ } else if(!isRoot && uprv_strcmp(t1->fName, kRootLocaleName) != 0 && t1->fParent == NULL && !r->fData.noFallback) {
/* insert root locale */
t2 = init_entry(kRootLocaleName, r->fPath, &parentStatus);
if(!hasRealData) {
@@ -580,6 +580,80 @@ static void entryClose(UResourceDataEntry *resB) {
umtx_unlock(&resbMutex);
}
+/*
+U_CFUNC void ures_setResPath(UResourceBundle *resB, const char* toAdd) {
+ if(resB->fResPath == NULL) {
+ resB->fResPath = resB->fResBuf;
+ *(resB->fResPath) = 0;
+ }
+ resB->fResPathLen = uprv_strlen(toAdd);
+ if(RES_BUFSIZE <= resB->fResPathLen+1) {
+ if(resB->fResPath == resB->fResBuf) {
+ resB->fResPath = (char *)uprv_malloc((resB->fResPathLen+1)*sizeof(char));
+ } else {
+ resB->fResPath = (char *)uprv_realloc(resB->fResPath, (resB->fResPathLen+1)*sizeof(char));
+ }
+ }
+ uprv_strcpy(resB->fResPath, toAdd);
+}
+*/
+static void ures_appendResPath(UResourceBundle *resB, const char* toAdd, int32_t lenToAdd) {
+ int32_t resPathLenOrig = resB->fResPathLen;
+ if(resB->fResPath == NULL) {
+ resB->fResPath = resB->fResBuf;
+ *(resB->fResPath) = 0;
+ resB->fResPathLen = 0;
+ }
+ resB->fResPathLen += lenToAdd;
+ if(RES_BUFSIZE <= resB->fResPathLen+1) {
+ if(resB->fResPath == resB->fResBuf) {
+ resB->fResPath = (char *)uprv_malloc((resB->fResPathLen+1)*sizeof(char));
+ uprv_strcpy(resB->fResPath, resB->fResBuf);
+ } else {
+ resB->fResPath = (char *)uprv_realloc(resB->fResPath, (resB->fResPathLen+1)*sizeof(char));
+ }
+ }
+ uprv_strcpy(resB->fResPath + resPathLenOrig, toAdd);
+}
+
+static void ures_freeResPath(UResourceBundle *resB) {
+ if (resB->fResPath && resB->fResPath != resB->fResBuf) {
+ uprv_free(resB->fResPath);
+ }
+ resB->fResPath = NULL;
+ resB->fResPathLen = 0;
+}
+
+static void
+ures_closeBundle(UResourceBundle* resB, UBool freeBundleObj)
+{
+ if(resB != NULL) {
+ if(resB->fData != NULL) {
+ entryClose(resB->fData);
+ }
+ if(resB->fVersion != NULL) {
+ uprv_free(resB->fVersion);
+ }
+ ures_freeResPath(resB);
+
+ if(ures_isStackObject(resB) == FALSE && freeBundleObj) {
+ uprv_free(resB);
+ }
+#if 0 /*U_DEBUG*/
+ else {
+ /* poison the data */
+ uprv_memset(resB, -1, sizeof(UResourceBundle));
+ }
+#endif
+ }
+}
+
+U_CAPI void U_EXPORT2
+ures_close(UResourceBundle* resB)
+{
+ ures_closeBundle(resB, TRUE);
+}
+
static UResourceBundle *init_resb_result(const ResourceData *rdata, Resource r,
const char *key, int32_t index, UResourceDataEntry *realData,
const UResourceBundle *parent, int32_t noAlias,
@@ -613,7 +687,7 @@ static UResourceBundle *init_resb_result(const ResourceData *rdata, Resource r,
*/
++len; /* count the terminating NUL */
if(parent != NULL && parent->fResPath != NULL) {
- capacity = uprv_strlen(parent->fResPath) + 1;
+ capacity = (int32_t)uprv_strlen(parent->fResPath) + 1;
} else {
capacity = 0;
}
@@ -634,28 +708,44 @@ static UResourceBundle *init_resb_result(const ResourceData *rdata, Resource r,
u_UCharsToChars(alias, chAlias, len);
if(*chAlias == RES_PATH_SEPARATOR) {
- /* there is a path included */
- locale = uprv_strchr(chAlias+1, RES_PATH_SEPARATOR);
- if(locale == NULL) {
+ /* there is a path included */
+ locale = uprv_strchr(chAlias+1, RES_PATH_SEPARATOR);
+ if(locale == NULL) {
locale = uprv_strchr(chAlias, 0); /* avoid locale == NULL to make code below work */
- } else {
+ } else {
*locale = 0;
locale++;
- }
- path = chAlias+1;
- if(uprv_strcmp(path, "ICUDATA") == 0) { /* want ICU data */
- path = NULL;
- }
+ }
+ path = chAlias+1;
+ if(uprv_strcmp(path, "LOCALE") == 0) {
+ /* this is an XPath alias, starting with "/LOCALE/" */
+ /* it contains the path to a resource which should be looked up */
+ /* starting in parent */
+ keyPath = locale;
+ locale = parent->fData->fName; /* this is the parent's name */
+ path = realData->fPath; /* we will be looking in the same package */
+ } else {
+ if(uprv_strcmp(path, "ICUDATA") == 0) { /* want ICU data */
+ path = NULL;
+ }
+ keyPath = uprv_strchr(locale, RES_PATH_SEPARATOR);
+ if(keyPath) {
+ *keyPath = 0;
+ keyPath++;
+ }
+ }
} else {
/* no path, start with a locale */
locale = chAlias;
+ keyPath = uprv_strchr(locale, RES_PATH_SEPARATOR);
+ if(keyPath) {
+ *keyPath = 0;
+ keyPath++;
+ }
path = realData->fPath;
}
- keyPath = uprv_strchr(locale, RES_PATH_SEPARATOR);
- if(keyPath) {
- *keyPath = 0;
- keyPath++;
- }
+
+
{
/* got almost everything, let's try to open */
/* first, open the bundle with real data */
@@ -682,9 +772,9 @@ static UResourceBundle *init_resb_result(const ResourceData *rdata, Resource r,
}
if(key) {
/* we need to make keyPath from parent's fResPath and
- * current key, if there is a key associated
- */
- len = uprv_strlen(key) + 1;
+ * current key, if there is a key associated
+ */
+ len = (int32_t)(uprv_strlen(key) + 1);
if(len > capacity) {
capacity = len;
if(chAlias == stackAlias) {
@@ -711,7 +801,7 @@ static UResourceBundle *init_resb_result(const ResourceData *rdata, Resource r,
}
}
if(r != RES_BOGUS) {
- result = init_resb_result(&(mainRes->fResData), r, key, -1, mainRes->fData, parent, noAlias+1, resB, status);
+ result = init_resb_result(&(mainRes->fResData), r, temp, -1, mainRes->fData, mainRes, noAlias+1, resB, status);
} else {
*status = U_MISSING_RESOURCE_ERROR;
result = resB;
@@ -724,17 +814,46 @@ static UResourceBundle *init_resb_result(const ResourceData *rdata, Resource r,
* anotheralias:alias { "/ICUDATA/sh/CollationElements" }
* aliastest resource should finally have the sequence, not collation elements.
*/
+ UResourceDataEntry *dataEntry = mainRes->fData;
+ char stackPath[URES_MAX_BUFFER_SIZE];
+ char *pathBuf = stackPath, *myPath = pathBuf;
+ if(uprv_strlen(keyPath) > URES_MAX_BUFFER_SIZE) {
+ pathBuf = (char *)uprv_malloc((uprv_strlen(keyPath)+1)*sizeof(char));
+ if(pathBuf == NULL) {
+ *status = U_MEMORY_ALLOCATION_ERROR;
+ return NULL;
+ }
+ }
+ uprv_strcpy(pathBuf, keyPath);
result = mainRes;
- while(*keyPath && U_SUCCESS(*status)) {
- r = res_findResource(&(result->fResData), result->fRes, &keyPath, &temp);
- if(r == RES_BOGUS) {
- *status = U_MISSING_RESOURCE_ERROR;
- result = resB;
- break;
+ /* now we have fallback following here */
+ do {
+ r = dataEntry->fData.rootRes;
+ /* this loop handles 'found' resources over several levels */
+ while(*myPath && U_SUCCESS(*status)) {
+ r = res_findResource(&(dataEntry->fData), r, &myPath, &temp);
+ if(r != RES_BOGUS) { /* found a resource, but it might be an indirection */
+ resB = init_resb_result(&(dataEntry->fData), r, temp, -1, dataEntry, result, noAlias+1, resB, status);
+ result = resB;
+ if(result) {
+ r = result->fRes; /* switch to a new resource, possibly a new tree */
+ dataEntry = result->fData;
+ }
+ } else { /* no resource found, we don't really want to look anymore on this level */
+ break;
+ }
}
- resB = init_resb_result(&(result->fResData), r, key, -1, result->fData, parent, noAlias+1, resB, status);
+ dataEntry = dataEntry->fParent;
+ uprv_strcpy(pathBuf, keyPath);
+ myPath = pathBuf;
+ } while(r == RES_BOGUS && dataEntry != NULL);
+ if(r == RES_BOGUS) {
+ *status = U_MISSING_RESOURCE_ERROR;
result = resB;
}
+ if(pathBuf != stackPath) {
+ uprv_free(pathBuf);
+ }
}
} else { /* we failed to open the resource we're aliasing to */
*status = intStatus;
@@ -774,9 +893,17 @@ static UResourceBundle *init_resb_result(const ResourceData *rdata, Resource r,
if(resB->fVersion != NULL) {
uprv_free(resB->fVersion);
}
+ /*
+ weiv: if stack object was passed in, it doesn't really need to be reinited,
+ since the purpose of initing is to remove stack junk. However, at this point
+ we would not do anything to an allocated object, so stack object should be
+ treated the same
+ */
+ /*
if(ures_isStackObject(resB) != FALSE) {
ures_initStackObject(resB);
}
+ */
if(parent != resB) {
ures_freeResPath(resB);
}
@@ -786,28 +913,35 @@ static UResourceBundle *init_resb_result(const ResourceData *rdata, Resource r,
resB->fHasFallback = FALSE;
resB->fIsTopLevel = FALSE;
resB->fIndex = -1;
- resB->fKey = key;
+ resB->fKey = key;
resB->fParentRes = parent;
resB->fTopLevelData = parent->fTopLevelData;
if(parent->fResPath && parent != resB) {
- ures_appendResPath(resB, parent->fResPath, parent->fResPathLen);
+ ures_appendResPath(resB, parent->fResPath, parent->fResPathLen);
}
if(key != NULL) {
- ures_appendResPath(resB, key, uprv_strlen(key));
- ures_appendResPath(resB, RES_PATH_SEPARATOR_S, 1);
- } else {
- char buf[256];
- int32_t len = T_CString_integerToString(buf, index, 10);
- ures_appendResPath(resB, buf, len);
- ures_appendResPath(resB, RES_PATH_SEPARATOR_S, 1);
+ ures_appendResPath(resB, key, (int32_t)uprv_strlen(key));
+ if(resB->fResPath[resB->fResPathLen-1] != RES_PATH_SEPARATOR) {
+ ures_appendResPath(resB, RES_PATH_SEPARATOR_S, 1);
+ }
+ } else if(index >= 0) {
+ char buf[256];
+ int32_t len = T_CString_integerToString(buf, index, 10);
+ ures_appendResPath(resB, buf, len);
+ if(resB->fResPath[resB->fResPathLen-1] != RES_PATH_SEPARATOR) {
+ ures_appendResPath(resB, RES_PATH_SEPARATOR_S, 1);
+ }
+ }
+ /* Make sure that Purify doesn't complain about uninitialized memory copies. */
+ {
+ int32_t usedLen = ((resB->fResBuf == resB->fResPath) ? resB->fResPathLen : 0);
+ uprv_memset(resB->fResBuf + usedLen, 0, sizeof(resB->fResBuf) - usedLen);
}
resB->fVersion = NULL;
resB->fRes = r;
/*resB->fParent = parent->fRes;*/
- resB->fResData.data = rdata->data;
- resB->fResData.pRoot = rdata->pRoot;
- resB->fResData.rootRes = rdata->rootRes;
+ uprv_memcpy(&resB->fResData, rdata, sizeof(ResourceData));
resB->fSize = res_countArrayItems(&(resB->fResData), resB->fRes);
return resB;
}
@@ -828,18 +962,7 @@ UResourceBundle *ures_copyResb(UResourceBundle *r, const UResourceBundle *origin
}
} else {
isStackObject = ures_isStackObject(r);
- if(U_FAILURE(*status)) {
- return r;
- }
- ures_close(r);
- if(isStackObject == FALSE) {
- r = (UResourceBundle *)uprv_malloc(sizeof(UResourceBundle));
- /* test for NULL */
- if (r == NULL) {
- *status = U_MEMORY_ALLOCATION_ERROR;
- return NULL;
- }
- }
+ ures_closeBundle(r, FALSE);
}
uprv_memcpy(r, original, sizeof(UResourceBundle));
r->fResPath = NULL;
@@ -851,10 +974,8 @@ UResourceBundle *ures_copyResb(UResourceBundle *r, const UResourceBundle *origin
if(r->fData != NULL) {
entryIncrease(r->fData);
}
- return r;
- } else {
- return r;
}
+ return r;
}
/**
@@ -887,6 +1008,78 @@ U_CAPI const UChar* U_EXPORT2 ures_getString(const UResourceBundle* resB, int32_
return NULL;
}
+static const char *
+ures_toUTF8String(const UChar *s16, int32_t length16,
+ char *dest, int32_t *pLength,
+ UBool forceCopy,
+ UErrorCode *status) {
+ int32_t capacity;
+
+ if (U_FAILURE(*status)) {
+ return NULL;
+ }
+ if (pLength != NULL) {
+ capacity = *pLength;
+ } else {
+ capacity = 0;
+ }
+ if (capacity < 0 || (capacity > 0 && dest == NULL)) {
+ *status = U_ILLEGAL_ARGUMENT_ERROR;
+ return NULL;
+ }
+
+ if (length16 == 0) {
+ /* empty string, return as read-only pointer */
+ if (pLength != NULL) {
+ *pLength = 0;
+ }
+ if (forceCopy) {
+ u_terminateChars(dest, capacity, 0, status);
+ return dest;
+ } else {
+ return "";
+ }
+ } else {
+ /* We need to transform the string to the destination buffer. */
+ if (capacity < length16) {
+ /* No chance for the string to fit. Pure preflighting. */
+ return u_strToUTF8(NULL, 0, pLength, s16, length16, status);
+ }
+ if (!forceCopy && (length16 <= 0x2aaaaaaa)) {
+ /*
+ * We know the string will fit into dest because each UChar turns
+ * into at most three UTF-8 bytes. Fill the latter part of dest
+ * so that callers do not expect to use dest as a string pointer,
+ * hopefully leading to more robust code for when resource bundles
+ * may store UTF-8 natively.
+ * (In which case dest would not be used at all.)
+ *
+ * We do not do this if forceCopy=TRUE because then the caller
+ * expects the string to start exactly at dest.
+ *
+ * The test above for <= 0x2aaaaaaa prevents overflows.
+ * The +1 is for the NUL terminator.
+ */
+ int32_t maxLength = 3 * length16 + 1;
+ if (capacity > maxLength) {
+ dest += capacity - maxLength;
+ capacity = maxLength;
+ }
+ }
+ return u_strToUTF8(dest, capacity, pLength, s16, length16, status);
+ }
+}
+
+U_DRAFT const char * U_EXPORT2
+ures_getUTF8String(const UResourceBundle *resB,
+ char *dest, int32_t *pLength,
+ UBool forceCopy,
+ UErrorCode *status) {
+ int32_t length16;
+ const UChar *s16 = ures_getString(resB, &length16, status);
+ return ures_toUTF8String(s16, length16, dest, pLength, forceCopy, status);
+}
+
U_CAPI const uint8_t* U_EXPORT2 ures_getBinary(const UResourceBundle* resB, int32_t* len,
UErrorCode* status) {
if (status==NULL || U_FAILURE(*status)) {
@@ -1060,7 +1253,6 @@ U_CAPI const UChar* U_EXPORT2 ures_getNextString(UResourceBundle *resB, int32_t*
case URES_INT_VECTOR:
default:
return NULL;
- break;
}
}
@@ -1203,6 +1395,17 @@ U_CAPI const UChar* U_EXPORT2 ures_getStringByIndex(const UResourceBundle *resB,
return NULL;
}
+U_DRAFT const char * U_EXPORT2
+ures_getUTF8StringByIndex(const UResourceBundle *resB,
+ int32_t index,
+ char *dest, int32_t *pLength,
+ UBool forceCopy,
+ UErrorCode *status) {
+ int32_t length16;
+ const UChar *s16 = ures_getStringByIndex(resB, index, &length16, status);
+ return ures_toUTF8String(s16, length16, dest, pLength, forceCopy, status);
+}
+
/*U_CAPI const char *ures_getResPath(UResourceBundle *resB) {
return resB->fResPath;
}*/
@@ -1213,7 +1416,7 @@ ures_findResource(const char* path, UResourceBundle *fillIn, UErrorCode *status)
UResourceBundle *first = NULL;
UResourceBundle *result = fillIn;
char *packageName = NULL;
- char *pathToResource = NULL;
+ char *pathToResource = NULL, *save = NULL;
char *locale = NULL, *localeEnd = NULL;
int32_t length;
@@ -1221,8 +1424,8 @@ ures_findResource(const char* path, UResourceBundle *fillIn, UErrorCode *status)
return result;
}
- length = uprv_strlen(path)+1;
- pathToResource = (char *)uprv_malloc(length*sizeof(char));
+ length = (int32_t)(uprv_strlen(path)+1);
+ save = pathToResource = (char *)uprv_malloc(length*sizeof(char));
/* test for NULL */
if(pathToResource == NULL) {
*status = U_MEMORY_ALLOCATION_ERROR;
@@ -1258,7 +1461,7 @@ ures_findResource(const char* path, UResourceBundle *fillIn, UErrorCode *status)
}
ures_close(first);
}
- uprv_free(pathToResource);
+ uprv_free(save);
return result;
}
@@ -1285,17 +1488,31 @@ ures_findSubResource(const UResourceBundle *resB, char* path, UResourceBundle *f
*status = U_MISSING_RESOURCE_ERROR;
break;
}
- } while(uprv_strlen(path)); /* there is more stuff in the path */
+ } while(*path); /* there is more stuff in the path */
return result;
}
+U_INTERNAL const UChar* U_EXPORT2
+ures_getStringByKeyWithFallback(const UResourceBundle *resB,
+ const char* inKey,
+ int32_t* len,
+ UErrorCode *status) {
+
+ UResourceBundle stack;
+ const UChar* retVal = NULL;
+ ures_initStackObject(&stack);
+ ures_getByKeyWithFallback(resB, inKey, &stack, status);
+ retVal = ures_getString(&stack, len, status);
+ ures_close(&stack);
+ return retVal;
+}
U_CAPI UResourceBundle* U_EXPORT2
ures_getByKeyWithFallback(const UResourceBundle *resB,
const char* inKey,
UResourceBundle *fillIn,
UErrorCode *status) {
- Resource res = RES_BOGUS;
+ Resource res = RES_BOGUS, rootRes = RES_BOGUS;
/*UResourceDataEntry *realData = NULL;*/
const char *key = inKey;
UResourceBundle *helper = NULL;
@@ -1315,27 +1532,45 @@ ures_getByKeyWithFallback(const UResourceBundle *resB,
UResourceDataEntry *dataEntry = resB->fData;
char path[256];
char* myPath = path;
+ const char* resPath = resB->fResPath;
+ int32_t len = resB->fResPathLen;
while(res == RES_BOGUS && dataEntry->fParent != NULL) { /* Otherwise, we'll look in parents */
dataEntry = dataEntry->fParent;
+ rootRes = dataEntry->fData.rootRes;
if(dataEntry->fBogus == U_ZERO_ERROR) {
- uprv_strncpy(path, resB->fResPath, resB->fResPathLen);
- uprv_strcpy(path+resB->fResPathLen, inKey);
+ uprv_strncpy(path, resPath, len);
+ uprv_strcpy(path+len, inKey);
myPath = path;
key = inKey;
do {
- res = res_findResource(&(dataEntry->fData), dataEntry->fData.rootRes, &myPath, &key);
+ res = res_findResource(&(dataEntry->fData), rootRes, &myPath, &key);
if (RES_GET_TYPE(res) == URES_ALIAS && *myPath) {
/* We hit an alias, but we didn't finish following the path. */
- helper = init_resb_result(&(dataEntry->fData), res, inKey, -1, dataEntry, resB, 0, helper, status);
- dataEntry = helper->fData;
+ helper = init_resb_result(&(dataEntry->fData), res, NULL, -1, dataEntry, resB, 0, helper, status);
+ /*helper = init_resb_result(&(dataEntry->fData), res, inKey, -1, dataEntry, resB, 0, helper, status);*/
+ if(helper) {
+ dataEntry = helper->fData;
+ rootRes = helper->fRes;
+ resPath = helper->fResPath;
+ len = helper->fResPathLen;
+
+ } else {
+ break;
+ }
}
- } while(uprv_strlen(myPath));
+ } while(*myPath); /* Continue until the whole path is consumed */
}
}
/*const ResourceData *rd = getFallbackData(resB, &key, &realData, &res, status);*/
if(res != RES_BOGUS) {
/* check if resB->fResPath gives the right name here */
+ if(uprv_strcmp(dataEntry->fName, uloc_getDefault())==0 || uprv_strcmp(dataEntry->fName, kRootLocaleName)==0) {
+ *status = U_USING_DEFAULT_WARNING;
+ } else {
+ *status = U_USING_FALLBACK_WARNING;
+ }
+
fillIn = init_resb_result(&(dataEntry->fData), res, inKey, -1, dataEntry, resB, 0, fillIn, status);
} else {
*status = U_MISSING_RESOURCE_ERROR;
@@ -1489,6 +1724,16 @@ U_CAPI const UChar* U_EXPORT2 ures_getStringByKey(const UResourceBundle *resB, c
return NULL;
}
+U_DRAFT const char * U_EXPORT2
+ures_getUTF8StringByKey(const UResourceBundle *resB,
+ const char *key,
+ char *dest, int32_t *pLength,
+ UBool forceCopy,
+ UErrorCode *status) {
+ int32_t length16;
+ const UChar *s16 = ures_getStringByKey(resB, key, &length16, status);
+ return ures_toUTF8String(s16, length16, dest, pLength, forceCopy, status);
+}
/* TODO: clean from here down */
@@ -1524,13 +1769,10 @@ ures_getLocaleByType(const UResourceBundle* resourceBundle,
switch(type) {
case ULOC_ACTUAL_LOCALE:
return resourceBundle->fData->fName;
- break;
case ULOC_VALID_LOCALE:
return resourceBundle->fTopLevelData->fName;
- break;
case ULOC_REQUESTED_LOCALE:
return NULL;
- break;
default:
*status = U_ILLEGAL_ARGUMENT_ERROR;
return NULL;
@@ -1538,52 +1780,6 @@ ures_getLocaleByType(const UResourceBundle* resourceBundle,
}
}
-
-/*
-U_CFUNC void ures_setResPath(UResourceBundle *resB, const char* toAdd) {
- if(resB->fResPath == NULL) {
- resB->fResPath = resB->fResBuf;
- *(resB->fResPath) = 0;
- }
- resB->fResPathLen = uprv_strlen(toAdd);
- if(RES_BUFSIZE <= resB->fResPathLen+1) {
- if(resB->fResPath == resB->fResBuf) {
- resB->fResPath = (char *)uprv_malloc((resB->fResPathLen+1)*sizeof(char));
- } else {
- resB->fResPath = (char *)uprv_realloc(resB->fResPath, (resB->fResPathLen+1)*sizeof(char));
- }
- }
- uprv_strcpy(resB->fResPath, toAdd);
-}
-*/
-U_CFUNC void ures_appendResPath(UResourceBundle *resB, const char* toAdd, int32_t lenToAdd) {
- int32_t resPathLenOrig = resB->fResPathLen;
- if(resB->fResPath == NULL) {
- resB->fResPath = resB->fResBuf;
- *(resB->fResPath) = 0;
- resB->fResPathLen = 0;
- }
- resB->fResPathLen += lenToAdd;
- if(RES_BUFSIZE <= resB->fResPathLen+1) {
- if(resB->fResPath == resB->fResBuf) {
- resB->fResPath = (char *)uprv_malloc((resB->fResPathLen+1)*sizeof(char));
- uprv_strcpy(resB->fResPath, resB->fResBuf);
- } else {
- resB->fResPath = (char *)uprv_realloc(resB->fResPath, (resB->fResPathLen+1)*sizeof(char));
- }
- }
- uprv_strcpy(resB->fResPath + resPathLenOrig, toAdd);
-}
-
-U_CFUNC void ures_freeResPath(UResourceBundle *resB) {
- if (resB->fResPath && resB->fResPath != resB->fResBuf) {
- uprv_free(resB->fResPath);
- }
- resB->fResPath = NULL;
- resB->fResPathLen = 0;
-}
-
-
U_CFUNC const char* ures_getName(const UResourceBundle* resB) {
if(resB == NULL) {
return NULL;
@@ -1611,37 +1807,31 @@ U_CAPI void U_EXPORT2
ures_openFillIn(UResourceBundle *r, const char* path,
const char* localeID, UErrorCode* status) {
if(r == NULL) {
- *status = U_INTERNAL_PROGRAM_ERROR;
+ *status = U_ILLEGAL_ARGUMENT_ERROR;
} else {
UResourceDataEntry *firstData;
+ UBool isStackObject = ures_isStackObject(r);
+
+ ures_closeBundle(r, FALSE);
+ uprv_memset(r, 0, sizeof(UResourceBundle));
+ ures_setIsStackObject(r, isStackObject);
r->fHasFallback = TRUE;
r->fIsTopLevel = TRUE;
- r->fKey = NULL;
- r->fVersion = NULL;
r->fIndex = -1;
- if(r->fData != NULL) {
- entryClose(r->fData);
- }
- if(r->fVersion != NULL) {
- uprv_free(r->fVersion);
- }
r->fData = entryOpen(path, localeID, status);
+ if(U_FAILURE(*status)) {
+ return;
+ }
/* this is a quick fix to get regular data in bundle - until construction is cleaned up */
firstData = r->fData;
while(firstData->fBogus != U_ZERO_ERROR && firstData->fParent != NULL) {
firstData = firstData->fParent;
}
- r->fResData.data = firstData->fData.data;
- r->fResData.pRoot = firstData->fData.pRoot;
- r->fResData.rootRes = firstData->fData.rootRes;
+ uprv_memcpy(&r->fResData, &firstData->fData, sizeof(ResourceData));
+ r->fHasFallback=(UBool)!r->fResData.noFallback;
r->fRes = r->fResData.rootRes;
r->fSize = res_countArrayItems(&(r->fResData), r->fRes);
- /*r->fParent = RES_BOGUS;*/
- /*r->fResPath = NULL;*/
- r->fParentRes = NULL;
r->fTopLevelData = r->fData;
-
- ures_freeResPath(r);
}
}
@@ -1653,14 +1843,13 @@ ures_open(const char* path,
char canonLocaleID[100];
UResourceDataEntry *hasData = NULL;
UResourceBundle *r;
- int32_t length;
if(status == NULL || U_FAILURE(*status)) {
return NULL;
}
/* first "canonicalize" the locale ID */
- length = uloc_getBaseName(localeID, canonLocaleID, sizeof(canonLocaleID), status);
+ uloc_getBaseName(localeID, canonLocaleID, sizeof(canonLocaleID), status);
if(U_FAILURE(*status) || *status == U_STRING_NOT_TERMINATED_WARNING) {
*status = U_ILLEGAL_ARGUMENT_ERROR;
return NULL;
@@ -1672,18 +1861,16 @@ ures_open(const char* path,
return NULL;
}
+ uprv_memset(r, 0, sizeof(UResourceBundle));
r->fHasFallback = TRUE;
r->fIsTopLevel = TRUE;
ures_setIsStackObject(r, FALSE);
- r->fKey = NULL;
- r->fVersion = NULL;
r->fIndex = -1;
r->fData = entryOpen(path, canonLocaleID, status);
if(U_FAILURE(*status)) {
uprv_free(r);
return NULL;
}
- r->fParentRes = NULL;
r->fTopLevelData = r->fData;
hasData = r->fData;
@@ -1699,14 +1886,10 @@ ures_open(const char* path,
}
}
- r->fResData.data = hasData->fData.data;
- r->fResData.pRoot = hasData->fData.pRoot;
- r->fResData.rootRes = hasData->fData.rootRes;
+ uprv_memcpy(&r->fResData, &hasData->fData, sizeof(ResourceData));
+ r->fHasFallback=(UBool)!r->fResData.noFallback;
r->fRes = r->fResData.rootRes;
- /*r->fParent = RES_BOGUS;*/
r->fSize = res_countArrayItems(&(r->fResData), r->fRes);
- r->fResPath = NULL;
- r->fResPathLen = 0;
/*
if(r->fData->fPath != NULL) {
ures_setResPath(r, r->fData->fPath);
@@ -1761,9 +1944,8 @@ ures_openDirect(const char* path, const char* localeID, UErrorCode* status) {
r->fKey = NULL;
r->fVersion = NULL;
- r->fResData.data = r->fData->fData.data;
- r->fResData.pRoot = r->fData->fData.pRoot;
- r->fResData.rootRes = r->fData->fData.rootRes;
+ uprv_memcpy(&r->fResData, &r->fData->fData, sizeof(ResourceData));
+ /* r->fHasFallback remains FALSE here in ures_openDirect() */
r->fRes = r->fResData.rootRes;
/*r->fParent = RES_BOGUS;*/
r->fSize = res_countArrayItems(&(r->fResData), r->fRes);
@@ -1806,30 +1988,6 @@ ures_countArrayItems(const UResourceBundle* resourceBundle,
}
}
-U_CAPI void U_EXPORT2
-ures_close(UResourceBundle* resB)
-{
- if(resB != NULL) {
- if(resB->fData != NULL) {
- entryClose(resB->fData);
- }
- if(resB->fVersion != NULL) {
- uprv_free(resB->fVersion);
- }
- ures_freeResPath(resB);
-
- if(ures_isStackObject(resB) == FALSE) {
- uprv_free(resB);
- }
- else {
-#if 0 /*U_DEBUG*/
- /* poison the data */
- uprv_memset(resB, -1, sizeof(UResourceBundle));
-#endif
- }
- }
-}
-
U_CAPI const char* U_EXPORT2
ures_getVersionNumber(const UResourceBundle* resourceBundle)
{
@@ -1863,7 +2021,7 @@ ures_getVersionNumber(const UResourceBundle* resourceBundle)
resourceBundle->fVersion[len] = '\0';
}
else {
- uprv_strcpy(resourceBundle->fVersion, kDefaultMinorVersion);
+ uprv_strcpy(resourceBundle->fVersion, kDefaultMinorVersion);
}
}
@@ -1916,7 +2074,7 @@ ures_loc_nextLocale(UEnumeration* en,
int32_t len = 0;
if(ures_hasNext(res) && (k = ures_getNextResource(res, &ctx->curr, status))) {
result = ures_getKey(k);
- len = uprv_strlen(result);
+ len = (int32_t)uprv_strlen(result);
}
if (resultLength) {
*resultLength = len;
@@ -2266,7 +2424,7 @@ ures_getFunctionalEquivalent(char *result, int32_t resultCapacity,
ures_close(&bund1);
ures_close(&bund2);
- length = uprv_strlen(found);
+ length = (int32_t)uprv_strlen(found);
if(U_SUCCESS(*status)) {
int32_t copyLength = uprv_min(length, resultCapacity);
@@ -2307,8 +2465,8 @@ ures_getKeywordValues(const char *path, const char *keyword, UErrorCode *status)
locs = ures_openAvailableLocales(path, status);
if(U_FAILURE(*status)) {
- ures_close(&item);
- ures_close(&subItem);
+ ures_close(&item);
+ ures_close(&subItem);
return NULL;
}
@@ -2344,7 +2502,7 @@ ures_getKeywordValues(const char *path, const char *keyword, UErrorCode *status)
&& U_SUCCESS(subStatus)) {
const char *k;
int32_t i;
- k = ures_getKey(&subItem);
+ k = ures_getKey(subPtr);
#if defined(URES_TREE_DEBUG)
/* fprintf(stderr, "%s | %s | %s | %s\n", path?path:"", keyword, locale, k); */
@@ -2355,7 +2513,7 @@ ures_getKeywordValues(const char *path, const char *keyword, UErrorCode *status)
}
}
if(k && *k) {
- int32_t kLen = uprv_strlen(k);
+ int32_t kLen = (int32_t)uprv_strlen(k);
if(!uprv_strcmp(k,DEFAULT_TAG)) {
continue; /* don't need 'default'. */
}
@@ -2387,5 +2545,63 @@ ures_getKeywordValues(const char *path, const char *keyword, UErrorCode *status)
#endif
return uloc_openKeywordList(valuesBuf, valuesIndex, status);
}
-
+U_INTERNAL UBool U_EXPORT2
+ures_equal(const UResourceBundle* res1, const UResourceBundle* res2){
+ if(res1==NULL || res2==NULL){
+ return res1==res2; /* pointer comparision */
+ }
+ if(res1->fKey==NULL|| res2->fKey==NULL){
+ return (res1->fKey==res2->fKey);
+ }else{
+ if(uprv_strcmp(res1->fKey, res2->fKey)!=0){
+ return FALSE;
+ }
+ }
+ if(uprv_strcmp(res1->fData->fName, res2->fData->fName)!=0){
+ return FALSE;
+ }
+ if(res1->fData->fPath == NULL|| res2->fData->fPath==NULL){
+ return (res1->fData->fPath == res2->fData->fPath);
+ }else{
+ if(uprv_strcmp(res1->fData->fPath, res2->fData->fPath)!=0){
+ return FALSE;
+ }
+ }
+ if(uprv_strcmp(res1->fData->fParent->fName, res2->fData->fParent->fName)!=0){
+ return FALSE;
+ }
+ if(uprv_strcmp(res1->fData->fParent->fPath, res2->fData->fParent->fPath)!=0){
+ return FALSE;
+ }
+ if(uprv_strncmp(res1->fResPath, res2->fResPath, res1->fResPathLen)!=0){
+ return FALSE;
+ }
+ if(res1->fRes != res2->fRes){
+ return FALSE;
+ }
+ return TRUE;
+}
+U_INTERNAL UResourceBundle* U_EXPORT2
+ures_clone(const UResourceBundle* res, UErrorCode* status){
+ UResourceBundle* bundle = NULL;
+ UResourceBundle* ret = NULL;
+ if(U_FAILURE(*status) || res == NULL){
+ return NULL;
+ }
+ bundle = ures_open(res->fData->fPath, res->fData->fName, status);
+ if(res->fResPath!=NULL){
+ ret = ures_findSubResource(bundle, res->fResPath, NULL, status);
+ ures_close(bundle);
+ }else{
+ ret = bundle;
+ }
+ return ret;
+}
+U_INTERNAL const UResourceBundle* U_EXPORT2
+ures_getParentBundle(const UResourceBundle* res){
+ if(res==NULL){
+ return NULL;
+ }
+ return res->fParentRes;
+}
/* eof */
diff --git a/icuSources/common/uresdata.c b/icuSources/common/uresdata.c
index 4e3136f6..4d947f5b 100644
--- a/icuSources/common/uresdata.c
+++ b/icuSources/common/uresdata.c
@@ -1,7 +1,7 @@
/*
*******************************************************************************
* *
-* Copyright (C) 1999-2004, International Business Machines Corporation *
+* Copyright (C) 1999-2006, International Business Machines Corporation *
* and others. All Rights Reserved. *
* *
*******************************************************************************
@@ -119,72 +119,79 @@ static Resource
_res_findTableItem(const Resource *pRoot, const Resource res, const char *key,
int32_t *index, const char **realKey) {
const uint16_t *p=(const uint16_t *)RES_GET_POINTER(pRoot, res);
- int32_t i, start, limit;
+ uint32_t mid, start, limit;
+ uint32_t lastMid;
+ int result;
limit=*p++; /* number of entries */
- if(limit == 0) { /* this table is empty */
- *index=URESDATA_ITEM_NOT_FOUND;
- return RES_BOGUS;
- }
+ if(limit != 0) {
+ /* do a binary search for the key */
+ start=0;
+ lastMid = UINT32_MAX;
+ for (;;) {
+ mid = (uint32_t)((start + limit) / 2);
+ if (lastMid == mid) { /* Have we moved? */
+ break; /* We haven't moved, and it wasn't found. */
+ }
+ lastMid = mid;
+ result = uprv_strcmp(key, RES_GET_KEY(pRoot, p[mid]));
- /* do a binary search for the key */
- start=0;
- while(start 0) {
+ start = mid;
+ } else {
+ /* We found it! */
+ *index=mid;
+ *realKey=RES_GET_KEY(pRoot, p[mid]);
+ limit=*(p-1); /* itemCount */
+ return ((const Resource *)(p+limit+(~limit&1)))[mid];
+ }
}
}
- /* did we really find it? */
- if(uprv_strcmp(key, RES_GET_KEY(pRoot, p[start]))==0) {
- *index=start;
- *realKey=RES_GET_KEY(pRoot, p[start]);
- limit=*(p-1); /* itemCount */
- return ((const Resource *)(p+limit+(~limit&1)))[start];
- } else {
- *index=URESDATA_ITEM_NOT_FOUND;
- return RES_BOGUS; /* not found */
- }
+ *index=URESDATA_ITEM_NOT_FOUND;
+ return RES_BOGUS; /* not found or table is empty. */
}
static Resource
_res_findTable32Item(const Resource *pRoot, const Resource res, const char *key,
int32_t *index, const char **realKey) {
const int32_t *p=(const int32_t *)RES_GET_POINTER(pRoot, res);
- int32_t i, start, limit;
+ int32_t mid, start, limit;
+ int32_t lastMid;
+ int result;
limit=*p++; /* number of entries */
- if(limit == 0) { /* this table is empty */
- *index=URESDATA_ITEM_NOT_FOUND;
- return RES_BOGUS;
- }
+ if(limit != 0) {
+ /* do a binary search for the key */
+ start=0;
+ lastMid = INT32_MAX;
+ for (;;) {
+ mid = (uint32_t)((start + limit) / 2);
+ if (lastMid == mid) { /* Have we moved? */
+ break; /* We haven't moved, and it wasn't found. */
+ }
+ lastMid = mid;
+ result = uprv_strcmp(key, RES_GET_KEY(pRoot, p[mid]));
- /* do a binary search for the key */
- start=0;
- while(start 0) {
+ start = mid;
+ } else {
+ /* We found it! */
+ *index=mid;
+ *realKey=RES_GET_KEY(pRoot, p[mid]);
+ return ((const Resource *)(p+(*(p-1))))[mid];
+ }
}
}
- /* did we really find it? */
- if(uprv_strcmp(key, RES_GET_KEY(pRoot, p[start]))==0) {
- *index=start;
- *realKey=RES_GET_KEY(pRoot, p[start]);
- limit=*(p-1); /* itemCount */
- return ((const Resource *)(p+limit))[start];
- } else {
- *index=URESDATA_ITEM_NOT_FOUND;
- return RES_BOGUS; /* not found */
- }
+ *index=URESDATA_ITEM_NOT_FOUND;
+ return RES_BOGUS; /* not found or table is empty. */
}
/* helper for res_load() ---------------------------------------------------- */
@@ -193,6 +200,7 @@ static UBool U_CALLCONV
isAcceptable(void *context,
const char *type, const char *name,
const UDataInfo *pInfo) {
+ uprv_memcpy(context, pInfo->formatVersion, 4);
return (UBool)(
pInfo->size>=20 &&
pInfo->isBigEndian==U_IS_BIG_ENDIAN &&
@@ -210,10 +218,11 @@ isAcceptable(void *context,
U_CFUNC UBool
res_load(ResourceData *pResData,
const char *path, const char *name, UErrorCode *errorCode) {
+ UVersionInfo formatVersion;
UResType rootType;
/* load the ResourceBundle file */
- pResData->data=udata_openChoice(path, "res", name, isAcceptable, NULL, errorCode);
+ pResData->data=udata_openChoice(path, "res", name, isAcceptable, formatVersion, errorCode);
if(U_FAILURE(*errorCode)) {
return FALSE;
}
@@ -221,6 +230,7 @@ res_load(ResourceData *pResData,
/* get its memory and root resource */
pResData->pRoot=(Resource *)udata_getMemory(pResData->data);
pResData->rootRes=*pResData->pRoot;
+ pResData->noFallback=FALSE;
/* currently, we accept only resources that have a Table as their roots */
rootType=RES_GET_TYPE(pResData->rootRes);
@@ -231,6 +241,14 @@ res_load(ResourceData *pResData,
return FALSE;
}
+ if(formatVersion[0]>1 || (formatVersion[0]==1 && formatVersion[1]>=1)) {
+ /* bundles with formatVersion 1.1 and later contain an indexes[] array */
+ const int32_t *indexes=(const int32_t *)pResData->pRoot+1;
+ if(indexes[URES_INDEX_LENGTH]>URES_INDEX_ATTRIBUTES) {
+ pResData->noFallback=(UBool)(indexes[URES_INDEX_ATTRIBUTES]&URES_ATT_NO_FALLBACK);
+ }
+ }
+
return TRUE;
}
@@ -244,8 +262,16 @@ res_unload(ResourceData *pResData) {
U_CFUNC const UChar *
res_getString(const ResourceData *pResData, const Resource res, int32_t *pLength) {
+ /*
+ * The data structure is documented as supporting res==0 for empty strings.
+ * Return a fixed pointer in such a case.
+ * This was dropped in uresdata.c 1.17 as part of Jitterbug 1005 work
+ * on code coverage for ICU 2.0.
+ * Re-added for consistency with the design and with other code.
+ */
+ static const int32_t emptyString[2]={ 0, 0 };
if(res!=RES_BOGUS && RES_GET_TYPE(res)==URES_STRING) {
- const int32_t *p=(const int32_t *)RES_GET_POINTER(pResData->pRoot, res);
+ const int32_t *p= res==0 ? emptyString : (const int32_t *)RES_GET_POINTER(pResData->pRoot, res);
if (pLength) {
*pLength=*p;
}
@@ -432,7 +458,7 @@ res_findResource(const ResourceData *pResData, Resource r, char** path, const ch
U_CFUNC Resource
res_getTableItemByKey(const ResourceData *pResData, Resource table,
- int32_t *indexR, const char **key) {
+ int32_t *indexR, const char **key ){
if(key != NULL && *key != NULL) {
if(RES_GET_TYPE(table)==URES_TABLE) {
return _res_findTableItem(pResData->pRoot, table, *key, indexR, key);
@@ -611,8 +637,8 @@ ures_preflightResource(const UDataSwapper *ds,
pBottom, pTop, pMaxTableLength,
pErrorCode);
if(U_FAILURE(*pErrorCode)) {
- udata_printError(ds, "ures_preflightResource(table res=%08x)[%d].recurse(%08x) failed - %s\n",
- res, i, item, u_errorName(*pErrorCode));
+ udata_printError(ds, "ures_preflightResource(table res=%08x)[%d].recurse(%08x) failed\n",
+ res, i, item);
break;
}
}
@@ -636,8 +662,8 @@ ures_preflightResource(const UDataSwapper *ds,
pBottom, pTop, pMaxTableLength,
pErrorCode);
if(U_FAILURE(*pErrorCode)) {
- udata_printError(ds, "ures_preflightResource(array res=%08x)[%d].recurse(%08x) failed - %s\n",
- res, i, item, u_errorName(*pErrorCode));
+ udata_printError(ds, "ures_preflightResource(array res=%08x)[%d].recurse(%08x) failed\n",
+ res, i, item);
break;
}
}
@@ -785,8 +811,8 @@ ures_swapResource(const UDataSwapper *ds,
item=ds->readUInt32(p[i]);
ures_swapResource(ds, inBundle, outBundle, item, specialType, pTempTable, pErrorCode);
if(U_FAILURE(*pErrorCode)) {
- udata_printError(ds, "ures_swapResource(table res=%08x)[%d].recurse(%08x) failed - %s\n",
- res, i, item, u_errorName(*pErrorCode));
+ udata_printError(ds, "ures_swapResource(table res=%08x)[%d].recurse(%08x) failed\n",
+ res, i, item);
return;
}
}
@@ -826,8 +852,8 @@ ures_swapResource(const UDataSwapper *ds,
ures_compareRows, pTempTable->keyChars,
FALSE, pErrorCode);
if(U_FAILURE(*pErrorCode)) {
- udata_printError(ds, "ures_swapResource(table res=%08x).uprv_sortArray(%d items) failed - %s\n",
- res, count, u_errorName(*pErrorCode));
+ udata_printError(ds, "ures_swapResource(table res=%08x).uprv_sortArray(%d items) failed\n",
+ res, count);
return;
}
@@ -905,8 +931,8 @@ ures_swapResource(const UDataSwapper *ds,
item=ds->readUInt32(p[i]);
ures_swapResource(ds, inBundle, outBundle, item, URES_NO_SPECIAL_TYPE, pTempTable, pErrorCode);
if(U_FAILURE(*pErrorCode)) {
- udata_printError(ds, "ures_swapResource(array res=%08x)[%d].recurse(%08x) failed - %s\n",
- res, i, item, u_errorName(*pErrorCode));
+ udata_printError(ds, "ures_swapResource(array res=%08x)[%d].recurse(%08x) failed\n",
+ res, i, item);
return;
}
}
@@ -995,8 +1021,8 @@ ures_swap(const UDataSwapper *ds,
&bottom, &top, &maxTableLength,
pErrorCode);
if(U_FAILURE(*pErrorCode)) {
- udata_printError(ds, "ures_preflightResource(root res=%08x) failed - %s\n",
- rootRes, u_errorName(*pErrorCode));
+ udata_printError(ds, "ures_preflightResource(root res=%08x) failed\n",
+ rootRes);
return 0;
}
} else {
@@ -1030,8 +1056,7 @@ ures_swap(const UDataSwapper *ds,
udata_swapInvStringBlock(ds, inBundle+stringsBottom, 4*(bottom-stringsBottom),
outBundle+stringsBottom, pErrorCode);
if(U_FAILURE(*pErrorCode)) {
- udata_printError(ds, "ures_swap().udata_swapInvStringBlock(keys[%d]) failed - %s\n", 4*(bottom-1),
- u_errorName(*pErrorCode));
+ udata_printError(ds, "ures_swap().udata_swapInvStringBlock(keys[%d]) failed\n", 4*(bottom-1));
return 0;
}
@@ -1054,8 +1079,8 @@ ures_swap(const UDataSwapper *ds,
/* swap the resources */
ures_swapResource(ds, inBundle, outBundle, rootRes, URES_NO_SPECIAL_TYPE, &tempTable, pErrorCode);
if(U_FAILURE(*pErrorCode)) {
- udata_printError(ds, "ures_swapResource(root res=%08x) failed - %s\n",
- rootRes, u_errorName(*pErrorCode));
+ udata_printError(ds, "ures_swapResource(root res=%08x) failed\n",
+ rootRes);
}
if(tempTable.rows!=rows) {
diff --git a/icuSources/common/uresdata.h b/icuSources/common/uresdata.h
index 92a8667d..6b8aa8aa 100644
--- a/icuSources/common/uresdata.h
+++ b/icuSources/common/uresdata.h
@@ -1,7 +1,7 @@
/*
******************************************************************************
* *
-* Copyright (C) 1999-2003, International Business Machines *
+* Copyright (C) 1999-2006, International Business Machines *
* Corporation and others. All Rights Reserved. *
* *
******************************************************************************
@@ -31,7 +31,7 @@ typedef uint32_t Resource;
#define RES_BOGUS 0xffffffff
-#define RES_GET_TYPE(res) ((res)>>28UL)
+#define RES_GET_TYPE(res) ((UResType)((res)>>28UL))
#define RES_GET_OFFSET(res) ((res)&0x0fffffff)
#define RES_GET_POINTER(pRoot, res) ((pRoot)+RES_GET_OFFSET(res))
@@ -48,6 +48,7 @@ enum {
URES_INDEX_BUNDLE_TOP, /* [3] contains the top of the bundle, */
/* in case it were ever different from [2] */
URES_INDEX_MAX_TABLE_LENGTH,/* [4] max. length of any table */
+ URES_INDEX_ATTRIBUTES, /* [5] attributes bit set, see URES_ATT_* (new in formatVersion 1.2) */
URES_INDEX_TOP
};
@@ -57,7 +58,20 @@ enum {
};
/*
- * File format for .res resource bundle files (formatVersion=1.1)
+ * Nofallback attribute, attribute bit 0 in indexes[URES_INDEX_ATTRIBUTES].
+ * New in formatVersion 1.2 (ICU 3.6).
+ *
+ * If set, then this resource bundle is a standalone bundle.
+ * If not set, then the bundle participates in locale fallback, eventually
+ * all the way to the root bundle.
+ * If indexes[] is missing or too short, then the attribute cannot be determined
+ * reliably. Dependency checking should ignore such bundles, and loading should
+ * use fallbacks.
+ */
+#define URES_ATT_NO_FALLBACK 1
+
+/*
+ * File format for .res resource bundle files (formatVersion=1.2)
*
* An ICU4C resource bundle file (.res) is a binary, memory-mappable file
* with nested, hierarchical data structures.
@@ -67,7 +81,7 @@ enum {
* currently, the root item must be a table or table32 resource item
* int32_t indexes[indexes[0]]; -- array of indexes for friendly
* reading and swapping; see URES_INDEX_* above
- * new in formatVersion 1.1
+ * new in formatVersion 1.1 (ICU 2.8)
* char keys[]; -- characters for key strings
* (formatVersion 1.0: up to 65k of characters; 1.1: <2G)
* (minus the space for root and indexes[]),
@@ -156,6 +170,7 @@ typedef struct {
UDataMemory *data;
Resource *pRoot;
Resource rootRes;
+ UBool noFallback; /* see URES_ATT_NO_FALLBACK */
} ResourceData;
/*
diff --git a/icuSources/common/uresimp.h b/icuSources/common/uresimp.h
index 9c5fe665..3e530d9e 100644
--- a/icuSources/common/uresimp.h
+++ b/icuSources/common/uresimp.h
@@ -1,6 +1,6 @@
/*
**********************************************************************
-* Copyright (C) 2000-2004, International Business Machines
+* Copyright (C) 2000-2006, International Business Machines
* Corporation and others. All Rights Reserved.
**********************************************************************
*/
@@ -27,6 +27,7 @@
#define MAGIC2 19641227
#define URES_MAX_ALIAS_LEVEL 256
+#define URES_MAX_BUFFER_SIZE 256
/*
enum UResEntryType {
@@ -83,9 +84,9 @@ U_CAPI void U_EXPORT2 ures_initStackObject(UResourceBundle* resB);
/* Some getters used by the copy constructor */
U_CFUNC const char* ures_getName(const UResourceBundle* resB);
U_CFUNC const char* ures_getPath(const UResourceBundle* resB);
-U_CFUNC void ures_appendResPath(UResourceBundle *resB, const char* toAdd, int32_t lenToAdd);
+/*U_CFUNC void ures_appendResPath(UResourceBundle *resB, const char* toAdd, int32_t lenToAdd);*/
/*U_CFUNC void ures_setResPath(UResourceBundle *resB, const char* toAdd);*/
-U_CFUNC void ures_freeResPath(UResourceBundle *resB);
+/*U_CFUNC void ures_freeResPath(UResourceBundle *resB);*/
/* Candidates for export */
U_CFUNC UResourceBundle *ures_copyResb(UResourceBundle *r, const UResourceBundle *original, UErrorCode *status);
@@ -164,4 +165,77 @@ ures_getFunctionalEquivalent(char *result, int32_t resultCapacity,
U_INTERNAL UEnumeration* U_EXPORT2
ures_getKeywordValues(const char *path, const char *keyword, UErrorCode *status);
+/**
+ * Test if 2 resource bundles are equal
+ * @param res1
+ * @param res2
+ * @param status error code
+ * @internal ICU 3.6
+ */
+U_INTERNAL UBool U_EXPORT2
+ures_equal(const UResourceBundle* res1, const UResourceBundle* res2);
+
+/**
+ * Clones the given resource bundle
+ * @param res
+ * @param status error code
+ * @internal ICU 3.6
+ */
+U_INTERNAL UResourceBundle* U_EXPORT2
+ures_clone(const UResourceBundle* res, UErrorCode* status);
+
+/**
+ * Returns the parent bundle. Internal. DONOT close the returned bundle!!!
+ * @param res
+ * @internal ICU 3.6
+ */
+U_INTERNAL const UResourceBundle* U_EXPORT2
+ures_getParentBundle(const UResourceBundle* res);
+
+
+/**
+ * Get a resource with multi-level fallback. Normally only the top level resources will
+ * fallback to its parent. This performs fallback on subresources. For example, when a table
+ * is defined in a resource bundle and a parent resource bundle, normally no fallback occurs
+ * on the sub-resources because the table is defined in the current resource bundle, but this
+ * function can perform fallback on the sub-resources of the table.
+ * @param resB a resource
+ * @param inKey a key associated with the requested resource
+ * @param fillIn if NULL a new UResourceBundle struct is allocated and must be deleted by the caller.
+ * Alternatively, you can supply a struct to be filled by this function.
+ * @param status: fills in the outgoing error code
+ * could be U_MISSING_RESOURCE_ERROR if the key is not found
+ * could be a non-failing error
+ * e.g.: U_USING_FALLBACK_WARNING,U_USING_DEFAULT_WARNING
+ * @return a pointer to a UResourceBundle struct. If fill in param was NULL, caller must delete it
+ * @internal ICU 3.0
+ */
+U_INTERNAL UResourceBundle* U_EXPORT2
+ures_getByKeyWithFallback(const UResourceBundle *resB,
+ const char* inKey,
+ UResourceBundle *fillIn,
+ UErrorCode *status);
+
+
+/**
+ * Get a String with multi-level fallback. Normally only the top level resources will
+ * fallback to its parent. This performs fallback on subresources. For example, when a table
+ * is defined in a resource bundle and a parent resource bundle, normally no fallback occurs
+ * on the sub-resources because the table is defined in the current resource bundle, but this
+ * function can perform fallback on the sub-resources of the table.
+ * @param resB a resource
+ * @param inKey a key associated with the requested resource
+ * @param status: fills in the outgoing error code
+ * could be U_MISSING_RESOURCE_ERROR if the key is not found
+ * could be a non-failing error
+ * e.g.: U_USING_FALLBACK_WARNING,U_USING_DEFAULT_WARNING
+ * @return a pointer to a UResourceBundle struct. If fill in param was NULL, caller must delete it
+ * @internal ICU 3.4
+ * @draft ICU 3.4
+ */
+U_INTERNAL const UChar* U_EXPORT2
+ures_getStringByKeyWithFallback(const UResourceBundle *resB,
+ const char* inKey,
+ int32_t* len,
+ UErrorCode *status);
#endif /*URESIMP_H*/
diff --git a/icuSources/common/uscript.c b/icuSources/common/uscript.c
index 546d5f88..47ae56da 100644
--- a/icuSources/common/uscript.c
+++ b/icuSources/common/uscript.c
@@ -1,6 +1,6 @@
/*
**********************************************************************
-* Copyright (C) 1997-2004, International Business Machines
+* Copyright (C) 1997-2006, International Business Machines
* Corporation and others. All Rights Reserved.
**********************************************************************
*
@@ -22,7 +22,10 @@
#include "cstring.h"
static const char kLocaleScript[] = "LocaleScript";
+static const char kHyphen = '-';
+static const char kUnderscore = '_';
+/* TODO: this is a bad API should be deprecated */
U_CAPI int32_t U_EXPORT2
uscript_getCode(const char* nameOrAbbrOrLocale,
UScriptCode* fillIn,
@@ -41,12 +44,13 @@ uscript_getCode(const char* nameOrAbbrOrLocale,
return numFilled;
}
- /* try long and abbreviated script names first */
- code = (UScriptCode) u_getPropertyValueEnum(UCHAR_SCRIPT, nameOrAbbrOrLocale);
-
- /* we still haven't found it try locale */
+ if(uprv_strchr(nameOrAbbrOrLocale, kHyphen)==NULL && uprv_strchr(nameOrAbbrOrLocale, kUnderscore)==NULL ){
+ /* try long and abbreviated script names first */
+ code = (UScriptCode) u_getPropertyValueEnum(UCHAR_SCRIPT, nameOrAbbrOrLocale);
+
+ }
if(code==(UScriptCode)UCHAR_INVALID_CODE){
- /* Do not propagate error codes from just not finding a locale bundle. */
+ /* Do not propagate error codes from just not finding a locale bundle. */
UErrorCode localErrorCode = U_ZERO_ERROR;
UResourceBundle* resB = ures_open(NULL,nameOrAbbrOrLocale,&localErrorCode);
if(U_SUCCESS(localErrorCode)&& localErrorCode != U_USING_DEFAULT_WARNING){
@@ -72,11 +76,16 @@ uscript_getCode(const char* nameOrAbbrOrLocale,
}
}
}
- ures_close(resD);
-
+ ures_close(resD);
}
ures_close(resB);
- }else{
+ code = USCRIPT_INVALID_CODE;
+ }
+ if(code==(UScriptCode)UCHAR_INVALID_CODE){
+ /* still not found .. try long and abbreviated script names again */
+ code = (UScriptCode) u_getPropertyValueEnum(UCHAR_SCRIPT, nameOrAbbrOrLocale);
+ }
+ if(code!=(UScriptCode)UCHAR_INVALID_CODE){
/* we found it */
if(numFilled<=capacity){
*(fillIn)++=code;
diff --git a/icuSources/common/uset.cpp b/icuSources/common/uset.cpp
index cd5f323a..8cd25221 100644
--- a/icuSources/common/uset.cpp
+++ b/icuSources/common/uset.cpp
@@ -1,7 +1,7 @@
/*
*******************************************************************************
*
-* Copyright (C) 2002-2004, International Business Machines
+* Copyright (C) 2002-2006, International Business Machines
* Corporation and others. All Rights Reserved.
*
*******************************************************************************
@@ -42,122 +42,134 @@ uset_close(USet* set) {
U_CAPI void U_EXPORT2
uset_set(USet* set,
UChar32 start, UChar32 end) {
- ((UnicodeSet*) set)->set(start, end);
+ ((UnicodeSet*) set)->UnicodeSet::set(start, end);
}
U_CAPI void U_EXPORT2
uset_addAll(USet* set, const USet *additionalSet) {
- ((UnicodeSet*) set)->addAll(*((const UnicodeSet*)additionalSet));
+ ((UnicodeSet*) set)->UnicodeSet::addAll(*((const UnicodeSet*)additionalSet));
}
U_CAPI void U_EXPORT2
uset_add(USet* set, UChar32 c) {
- ((UnicodeSet*) set)->add(c);
+ ((UnicodeSet*) set)->UnicodeSet::add(c);
}
U_CAPI void U_EXPORT2
uset_addRange(USet* set, UChar32 start, UChar32 end) {
- ((UnicodeSet*) set)->add(start, end);
+ ((UnicodeSet*) set)->UnicodeSet::add(start, end);
}
U_CAPI void U_EXPORT2
uset_addString(USet* set, const UChar* str, int32_t strLen) {
- // WRONG! Do not alias, it will stay aliased, even after
- // copying. TODO: do we need a copy ctor that unaliases
+ // WRONG! Do not alias, it will stay aliased, even after
+ // copying. TODO: do we need a copy ctor that unaliases
//UnicodeString s(strLen==-1, str, strLen);
- // We promised -1 for zero terminated
- if(strLen == -1) {
- strLen = u_strlen(str);
- }
+
+ // UnicodeString handles -1 for strLen
+ UnicodeString s(str, strLen);
+ ((UnicodeSet*) set)->UnicodeSet::add(s);
+}
+
+U_CAPI void U_EXPORT2
+uset_addAllCodePoints(USet* set, const UChar *str, int32_t strLen) {
+ // UnicodeString handles -1 for strLen
UnicodeString s(str, strLen);
- ((UnicodeSet*) set)->add(s);
+ ((UnicodeSet*) set)->UnicodeSet::addAll(s);
}
U_CAPI void U_EXPORT2
uset_remove(USet* set, UChar32 c) {
- ((UnicodeSet*) set)->remove(c);
+ ((UnicodeSet*) set)->UnicodeSet::remove(c);
}
U_CAPI void U_EXPORT2
uset_removeRange(USet* set, UChar32 start, UChar32 end) {
- ((UnicodeSet*) set)->remove(start, end);
+ ((UnicodeSet*) set)->UnicodeSet::remove(start, end);
}
U_CAPI void U_EXPORT2
uset_removeString(USet* set, const UChar* str, int32_t strLen) {
UnicodeString s(strLen==-1, str, strLen);
- ((UnicodeSet*) set)->remove(s);
+ ((UnicodeSet*) set)->UnicodeSet::remove(s);
}
U_CAPI void U_EXPORT2
uset_removeAll(USet* set, const USet* remove) {
- ((UnicodeSet*) set)->removeAll(*(const UnicodeSet*)remove);
+ ((UnicodeSet*) set)->UnicodeSet::removeAll(*(const UnicodeSet*)remove);
}
U_CAPI void U_EXPORT2
uset_retain(USet* set, UChar32 start, UChar32 end) {
- ((UnicodeSet*) set)->retain(start, end);
+ ((UnicodeSet*) set)->UnicodeSet::retain(start, end);
}
U_CAPI void U_EXPORT2
uset_retainAll(USet* set, const USet* retain) {
- ((UnicodeSet*) set)->retainAll(*(const UnicodeSet*)retain);
+ ((UnicodeSet*) set)->UnicodeSet::retainAll(*(const UnicodeSet*)retain);
}
U_CAPI void U_EXPORT2
uset_compact(USet* set) {
- ((UnicodeSet*) set)->compact();
+ ((UnicodeSet*) set)->UnicodeSet::compact();
}
U_CAPI void U_EXPORT2
uset_complement(USet* set) {
- ((UnicodeSet*) set)->complement();
+ ((UnicodeSet*) set)->UnicodeSet::complement();
}
U_CAPI void U_EXPORT2
uset_complementAll(USet* set, const USet* complement) {
- ((UnicodeSet*) set)->complementAll(*(const UnicodeSet*)complement);
+ ((UnicodeSet*) set)->UnicodeSet::complementAll(*(const UnicodeSet*)complement);
}
U_CAPI void U_EXPORT2
uset_clear(USet* set) {
- ((UnicodeSet*) set)->clear();
+ ((UnicodeSet*) set)->UnicodeSet::clear();
}
U_CAPI UBool U_EXPORT2
uset_isEmpty(const USet* set) {
- return ((const UnicodeSet*) set)->isEmpty();
+ return ((const UnicodeSet*) set)->UnicodeSet::isEmpty();
}
U_CAPI UBool U_EXPORT2
uset_contains(const USet* set, UChar32 c) {
- return ((const UnicodeSet*) set)->contains(c);
+ return ((const UnicodeSet*) set)->UnicodeSet::contains(c);
}
U_CAPI UBool U_EXPORT2
uset_containsRange(const USet* set, UChar32 start, UChar32 end) {
- return ((const UnicodeSet*) set)->contains(start, end);
+ return ((const UnicodeSet*) set)->UnicodeSet::contains(start, end);
}
U_CAPI UBool U_EXPORT2
uset_containsString(const USet* set, const UChar* str, int32_t strLen) {
UnicodeString s(strLen==-1, str, strLen);
- return ((const UnicodeSet*) set)->contains(s);
+ return ((const UnicodeSet*) set)->UnicodeSet::contains(s);
}
U_CAPI UBool U_EXPORT2
uset_containsAll(const USet* set1, const USet* set2) {
- return ((const UnicodeSet*) set1)->containsAll(* (const UnicodeSet*) set2);
+ return ((const UnicodeSet*) set1)->UnicodeSet::containsAll(* (const UnicodeSet*) set2);
+}
+
+U_CAPI UBool U_EXPORT2
+uset_containsAllCodePoints(const USet* set, const UChar *str, int32_t strLen) {
+ // Create a string alias, since nothing is being added to the set.
+ UnicodeString s(strLen==-1, str, strLen);
+ return ((const UnicodeSet*) set)->UnicodeSet::containsAll(s);
}
U_CAPI UBool U_EXPORT2
uset_containsNone(const USet* set1, const USet* set2) {
- return ((const UnicodeSet*) set1)->containsNone(* (const UnicodeSet*) set2);
+ return ((const UnicodeSet*) set1)->UnicodeSet::containsNone(* (const UnicodeSet*) set2);
}
U_CAPI UBool U_EXPORT2
uset_containsSome(const USet* set1, const USet* set2) {
- return ((const UnicodeSet*) set1)->containsSome(* (const UnicodeSet*) set2);
+ return ((const UnicodeSet*) set1)->UnicodeSet::containsSome(* (const UnicodeSet*) set2);
}
U_CAPI UBool U_EXPORT2
@@ -167,17 +179,17 @@ uset_equals(const USet* set1, const USet* set2) {
U_CAPI int32_t U_EXPORT2
uset_indexOf(const USet* set, UChar32 c) {
- return ((UnicodeSet*) set)->indexOf(c);
+ return ((UnicodeSet*) set)->UnicodeSet::indexOf(c);
}
U_CAPI UChar32 U_EXPORT2
uset_charAt(const USet* set, int32_t index) {
- return ((UnicodeSet*) set)->charAt(index);
+ return ((UnicodeSet*) set)->UnicodeSet::charAt(index);
}
U_CAPI int32_t U_EXPORT2
uset_size(const USet* set) {
- return ((const UnicodeSet*) set)->size();
+ return ((const UnicodeSet*) set)->UnicodeSet::size();
}
U_NAMESPACE_BEGIN
@@ -253,6 +265,18 @@ uset_getItem(const USet* uset, int32_t itemIndex,
// return TRUE;
//}
+U_CAPI USet* U_EXPORT2
+uprv_openRuleWhiteSpaceSet(UErrorCode* ec) {
+ if(U_FAILURE(*ec)) {
+ return NULL;
+ }
+ // create a set with the Pattern_White_Space characters,
+ // without a pattern for fewer code dependencies
+ UnicodeSet *set=new UnicodeSet(9, 0xd);
+ set->UnicodeSet::add(0x20).add(0x85).add(0x200e, 0x200f).add(0x2028, 0x2029);
+ return (USet *)set;
+}
+
/*
* Serialize a USet into 16-bit units.
* Store BMP code points as themselves with one 16-bit unit each.
@@ -277,7 +301,7 @@ uset_serialize(const USet* set, uint16_t* dest, int32_t destCapacity, UErrorCode
return 0;
}
- return ((const UnicodeSet*) set)->serialize(dest, destCapacity,* ec);
+ return ((const UnicodeSet*) set)->UnicodeSet::serialize(dest, destCapacity,* ec);
}
U_CAPI UBool U_EXPORT2
@@ -358,19 +382,50 @@ uset_serializedContains(const USerializedSet* set, UChar32 c) {
array=set->array;
if(c<=0xffff) {
/* find c in the BMP part */
- int32_t i, bmpLength=set->bmpLength;
- for(i=0; i=array[i]; ++i) {}
- return (UBool)(i&1);
+ int32_t lo = 0;
+ int32_t hi = set->bmpLength-1;
+ if (c < array[0]) {
+ hi = 0;
+ } else if (c < array[hi]) {
+ for(;;) {
+ int32_t i = (lo + hi) >> 1;
+ if (i == lo) {
+ break; // Done!
+ } else if (c < array[i]) {
+ hi = i;
+ } else {
+ lo = i;
+ }
+ }
+ } else {
+ hi += 1;
+ }
+ return (UBool)(hi&1);
} else {
/* find c in the supplementary part */
- int32_t i, length=set->length;
uint16_t high=(uint16_t)(c>>16), low=(uint16_t)c;
- for(i=set->bmpLength;
- iarray[i] || (high==array[i] && low>=array[i+1]));
- i+=2) {}
-
+ int32_t base = set->bmpLength;
+ int32_t lo = 0;
+ int32_t hi = set->length - 2 - base;
+ if (high < array[base] || (high==array[base] && low> 1) & ~1; // Guarantee even result
+ int32_t iabs = i + base;
+ if (i == lo) {
+ break; // Done!
+ } else if (high < array[iabs] || (high==array[iabs] && lowbmpLength)&2)!=0);
+ return (UBool)(((hi+(base<<1))&2)!=0);
}
}
diff --git a/icuSources/common/uset_imp.h b/icuSources/common/uset_imp.h
index b5a969e1..c826f49f 100644
--- a/icuSources/common/uset_imp.h
+++ b/icuSources/common/uset_imp.h
@@ -1,7 +1,7 @@
/*
*******************************************************************************
*
-* Copyright (C) 2004, International Business Machines
+* Copyright (C) 2004-2005, International Business Machines
* Corporation and others. All Rights Reserved.
*
*******************************************************************************
@@ -33,6 +33,9 @@ USetAddRange(USet *set, UChar32 start, UChar32 end);
typedef void U_CALLCONV
USetAddString(USet *set, const UChar *str, int32_t length);
+typedef void U_CALLCONV
+USetRemove(USet *set, UChar32 c);
+
/**
* Interface for adding items to a USet, to keep low-level code from
* statically depending on the USet implementation.
@@ -43,6 +46,7 @@ struct USetAdder {
USetAdd *add;
USetAddRange *addRange;
USetAddString *addString;
+ USetRemove *remove;
};
typedef struct USetAdder USetAdder;
@@ -51,6 +55,9 @@ U_CDECL_END
/**
* Get the set of "white space" characters in the sense of ICU rule
* parsers. Caller must close/delete result.
+ * Equivalent to the set of characters with the Pattern_White_Space Unicode property.
+ * Stable set of characters, won't change.
+ * See UAX #31 Identifier and Pattern Syntax: http://www.unicode.org/reports/tr31/
* @internal
*/
U_CAPI USet* U_EXPORT2
diff --git a/icuSources/common/uset_props.cpp b/icuSources/common/uset_props.cpp
index d2f8824d..d36a5250 100644
--- a/icuSources/common/uset_props.cpp
+++ b/icuSources/common/uset_props.cpp
@@ -1,7 +1,7 @@
/*
*******************************************************************************
*
-* Copyright (C) 2002-2004, International Business Machines
+* Copyright (C) 2002-2005, International Business Machines
* Corporation and others. All Rights Reserved.
*
*******************************************************************************
@@ -132,15 +132,3 @@ uset_toPattern(const USet* set,
((const UnicodeSet*) set)->toPattern(pat, escapeUnprintable);
return pat.extract(result, resultCapacity, *ec);
}
-
-U_CAPI USet* U_EXPORT2
-uprv_openRuleWhiteSpaceSet(UErrorCode* ec) {
- static const UChar _PATTERN[] = {
- /* "[[:Cf:][:WSpace:]]" */
- 91, 91, 58, 67, 102, 58, 93, 91, 58, 87,
- 83, 112, 97, 99, 101, 58, 93, 93, 0
- };
- return uset_openPattern(_PATTERN,
- sizeof(_PATTERN)/sizeof(_PATTERN[0])-1, ec);
-}
-
diff --git a/icuSources/common/usetiter.cpp b/icuSources/common/usetiter.cpp
index 75a75de4..44858ed4 100644
--- a/icuSources/common/usetiter.cpp
+++ b/icuSources/common/usetiter.cpp
@@ -1,6 +1,6 @@
/*
**********************************************************************
-* Copyright (c) 2002-2003, International Business Machines
+* Copyright (c) 2002-2006, International Business Machines
* Corporation and others. All Rights Reserved.
**********************************************************************
*/
@@ -18,6 +18,7 @@ UOBJECT_DEFINE_RTTI_IMPLEMENTATION(UnicodeSetIterator)
* @param set set to iterate over
*/
UnicodeSetIterator::UnicodeSetIterator(const UnicodeSet& uSet) {
+ cpString = NULL;
reset(uSet);
}
@@ -26,11 +27,12 @@ UnicodeSetIterator::UnicodeSetIterator(const UnicodeSet& uSet) {
*/
UnicodeSetIterator::UnicodeSetIterator() {
this->set = NULL;
+ cpString = NULL;
reset();
}
UnicodeSetIterator::~UnicodeSetIterator() {
- // Nothing to do
+ delete cpString;
}
/**
@@ -45,11 +47,13 @@ UnicodeSetIterator::~UnicodeSetIterator() {
UBool UnicodeSetIterator::next() {
if (nextElement <= endElement) {
codepoint = codepointEnd = nextElement++;
+ string = NULL;
return TRUE;
}
if (range < endRange) {
loadRange(++range);
codepoint = codepointEnd = nextElement++;
+ string = NULL;
return TRUE;
}
@@ -71,6 +75,7 @@ UBool UnicodeSetIterator::next() {
*
Note also that the codepointEnd is undefined after calling this method.
*/
UBool UnicodeSetIterator::nextRange() {
+ string = NULL;
if (nextElement <= endElement) {
codepointEnd = endElement;
codepoint = nextElement;
@@ -118,6 +123,7 @@ void UnicodeSetIterator::reset() {
loadRange(range);
}
nextString = 0;
+ string = NULL;
}
void UnicodeSetIterator::loadRange(int32_t iRange) {
@@ -125,6 +131,20 @@ void UnicodeSetIterator::loadRange(int32_t iRange) {
endElement = set->getRangeEnd(iRange);
}
+
+const UnicodeString& UnicodeSetIterator::getString() {
+ if (string==NULL && codepoint!=(UChar32)IS_STRING) {
+ if (cpString == NULL) {
+ cpString = new UnicodeString();
+ }
+ if (cpString != NULL) {
+ cpString->setTo((UChar32)codepoint);
+ }
+ string = cpString;
+ }
+ return *string;
+}
+
U_NAMESPACE_END
//eof
diff --git a/icuSources/common/ushape.c b/icuSources/common/ushape.c
index a4f62977..ad0b449d 100644
--- a/icuSources/common/ushape.c
+++ b/icuSources/common/ushape.c
@@ -1,7 +1,7 @@
/*
******************************************************************************
*
-* Copyright (C) 2000-2004, International Business Machines
+* Copyright (C) 2000-2006, International Business Machines
* Corporation and others. All Rights Reserved.
*
******************************************************************************
@@ -23,6 +23,7 @@
#include "cmemory.h"
#include "putilimp.h"
#include "ustr_imp.h"
+#include "ubidi_props.h"
#if UTF_SIZE<16
/*
@@ -224,16 +225,25 @@ static void
_shapeToArabicDigitsWithContext(UChar *s, int32_t length,
UChar digitBase,
UBool isLogical, UBool lastStrongWasAL) {
+ const UBiDiProps *bdp;
+ UErrorCode errorCode;
+
int32_t i;
UChar c;
+ errorCode=U_ZERO_ERROR;
+ bdp=ubidi_getSingleton(&errorCode);
+ if(U_FAILURE(errorCode)) {
+ return;
+ }
+
digitBase-=0x30;
/* the iteration direction depends on the type of input */
if(isLogical) {
for(i=0; i0; /* pre-decrement in the body */) {
c=s[--i];
- switch(u_charDirection(c)) {
+ switch(ubidi_getClass(bdp, c)) {
case U_LEFT_TO_RIGHT: /* L */
case U_RIGHT_TO_LEFT: /* R */
lastStrongWasAL=FALSE;
@@ -304,26 +314,20 @@ invertBuffer(UChar *buffer,int32_t size,uint32_t options,int32_t *spacesCountl,i
* later it'll be converted into the 0xFExx LamAlefs
* in the shaping function.
*/
-static UChar
+static U_INLINE UChar
changeLamAlef(UChar ch) {
switch(ch) {
case 0x0622 :
- return(0x065C);
- break;
+ return 0x065C;
case 0x0623 :
- return(0x065D);
- break;
+ return 0x065D;
case 0x0625 :
- return(0x065E);
- break;
+ return 0x065E;
case 0x0627 :
- return(0x065F);
- break;
- default :
- return(0);
- break;
+ return 0x065F;
}
+ return 0;
}
/*
@@ -338,11 +342,9 @@ specialChar(UChar ch) {
(ch>0x0647 && ch<0x064a)||(ch==0x0629) ) {
return (1);
}
- else
- if( ch>=0x064B && ch<= 0x0652 )
+ else if( ch>=0x064B && ch<= 0x0652 )
return (2);
- else
- if( (ch>=0x0653 && ch<= 0x0655) || ch == 0x0670 ||
+ else if( (ch>=0x0653 && ch<= 0x0655) || ch == 0x0670 ||
(ch>=0xFE70 && ch<= 0xFE7F) )
return (3);
else
@@ -398,39 +400,27 @@ countSpaces(UChar *dest,int32_t size,uint32_t options,int32_t *spacesCountl,int3
*Name : isTashkeelChar
*Function : Returns 1 for Tashkeel characters else return 0
*/
-static int32_t
+static U_INLINE int32_t
isTashkeelChar(UChar ch) {
-
- if( ch>=0x064B && ch<= 0x0652 )
- return (1);
- else
- return (0);
+ return (int32_t)( ch>=0x064B && ch<= 0x0652 );
}
/*
*Name : isAlefChar
*Function : Returns 1 for Alef characters else return 0
*/
-static int32_t
+static U_INLINE int32_t
isAlefChar(UChar ch) {
-
- if( (ch==0x0622)||(ch==0x0623)||(ch==0x0625)||(ch==0x0627) )
- return (1);
- else
- return (0);
+ return (int32_t)( (ch==0x0622)||(ch==0x0623)||(ch==0x0625)||(ch==0x0627) );
}
/*
*Name : isLamAlefChar
*Function : Returns 1 for LamAlef characters else return 0
*/
-static int32_t
+static U_INLINE int32_t
isLamAlefChar(UChar ch) {
-
- if( (ch>=0xFEF5)&&(ch<=0xFEFC) )
- return (1);
- else
- return (0);
+ return (int32_t)( (ch>=0xFEF5)&&(ch<=0xFEFC) );
}
/*
@@ -796,7 +786,7 @@ shapeUnicode(UChar *dest, int32_t sourceLength,
int32_t i, iend;
int32_t step;
- int32_t prevPos, lastPos,Nx, Nw;
+ int32_t lastPos,Nx, Nw;
unsigned int Shape;
int32_t flag;
int32_t lamalef_found = 0;
@@ -830,7 +820,6 @@ shapeUnicode(UChar *dest, int32_t sourceLength,
*/
currLink = getLink(dest[i]);
- prevPos = i;
lastPos = i;
Nx = -2, Nw = 0;
@@ -877,13 +866,14 @@ shapeUnicode(UChar *dest, int32_t sourceLength,
if (flag == 1) {
Shape = (Shape == 1 || Shape == 3) ? 1 : 0;
}
- else
- if(flag == 2) {
+ else if(flag == 2) {
if( (lastLink & LINKL) && (nextLink & LINKR) && (tashkeelFlag == 1) &&
- dest[i] != 0x064C && dest[i] != 0x064D ) {
+ dest[i] != 0x064C && dest[i] != 0x064D )
+ {
Shape = 1;
- if( (nextLink&ALEFTYPE) == ALEFTYPE && (lastLink&LAMTYPE) == LAMTYPE )
+ if( (nextLink&ALEFTYPE) == ALEFTYPE && (lastLink&LAMTYPE) == LAMTYPE ) {
Shape = 0;
+ }
}
else {
Shape = 0;
@@ -901,7 +891,6 @@ shapeUnicode(UChar *dest, int32_t sourceLength,
if ((currLink & IRRELEVANT) == 0) {
prevLink = lastLink;
lastLink = currLink;
- prevPos = lastPos;
lastPos = i;
}
@@ -987,7 +976,7 @@ u_shapeArabic(const UChar *source, int32_t sourceLength,
if(sourceLength==-1) {
sourceLength=u_strlen(source);
}
- if(sourceLength==0) {
+ if(sourceLength<=0) {
return u_terminateUChars(dest, destCapacity, 0, pErrorCode);
}
diff --git a/icuSources/common/usprep.cpp b/icuSources/common/usprep.cpp
index 975a598d..ec98ad01 100644
--- a/icuSources/common/usprep.cpp
+++ b/icuSources/common/usprep.cpp
@@ -1,7 +1,7 @@
/*
*******************************************************************************
*
- * Copyright (C) 2003-2004, International Business Machines
+ * Copyright (C) 2003-2006, International Business Machines
* Corporation and others. All Rights Reserved.
*
*******************************************************************************
@@ -33,6 +33,7 @@
#include "udataswp.h"
#include "ucln_cmn.h"
#include "unormimp.h"
+#include "ubidi_props.h"
U_CDECL_BEGIN
@@ -82,7 +83,7 @@ getSPrepFoldingOffset(uint32_t data) {
}
/* hashes an entry */
-static int32_t U_EXPORT2 U_CALLCONV
+static int32_t U_CALLCONV
hashEntry(const UHashTok parm) {
UStringPrepKey *b = (UStringPrepKey *)parm.pointer;
UHashTok namekey, pathkey;
@@ -92,7 +93,7 @@ hashEntry(const UHashTok parm) {
}
/* compares two entries */
-static UBool U_EXPORT2 U_CALLCONV
+static UBool U_CALLCONV
compareEntries(const UHashTok p1, const UHashTok p2) {
UStringPrepKey *b1 = (UStringPrepKey *)p1.pointer;
UStringPrepKey *b2 = (UStringPrepKey *)p2.pointer;
@@ -196,19 +197,18 @@ initCache(UErrorCode *status) {
makeCache = (SHARED_DATA_HASHTABLE == NULL);
umtx_unlock(&usprepMutex);
if(makeCache) {
- UHashtable *newCache = uhash_open(hashEntry, compareEntries, status);
- if (U_FAILURE(*status)) {
- return;
- }
- umtx_lock(&usprepMutex);
- if(SHARED_DATA_HASHTABLE == NULL) {
- SHARED_DATA_HASHTABLE = newCache;
- ucln_common_registerCleanup(UCLN_COMMON_USPREP, usprep_cleanup);
- newCache = NULL;
- }
- umtx_unlock(&usprepMutex);
- if(newCache != NULL) {
- uhash_close(newCache);
+ UHashtable *newCache = uhash_open(hashEntry, compareEntries, NULL, status);
+ if (U_SUCCESS(*status)) {
+ umtx_lock(&usprepMutex);
+ if(SHARED_DATA_HASHTABLE == NULL) {
+ SHARED_DATA_HASHTABLE = newCache;
+ ucln_common_registerCleanup(UCLN_COMMON_USPREP, usprep_cleanup);
+ newCache = NULL;
+ }
+ umtx_unlock(&usprepMutex);
+ if(newCache != NULL) {
+ uhash_close(newCache);
+ }
}
}
}
@@ -316,7 +316,9 @@ usprep_getProfile(const char* path,
stackKey.path = (char*) path;
/* fetch the data from the cache */
+ umtx_lock(&usprepMutex);
profile = (UStringPrepProfile*) (uhash_get(SHARED_DATA_HASHTABLE,&stackKey));
+ umtx_unlock(&usprepMutex);
if(profile == NULL){
UStringPrepKey* key = (UStringPrepKey*) uprv_malloc(sizeof(UStringPrepKey));
@@ -355,7 +357,7 @@ usprep_getProfile(const char* path,
key->path = (char*) uprv_malloc(uprv_strlen(path)+1);
if(key->path == NULL){
*status = U_MEMORY_ALLOCATION_ERROR;
- uprv_free(key->path);
+ uprv_free(key->name);
uprv_free(key);
uprv_free(profile);
return NULL;
@@ -365,12 +367,30 @@ usprep_getProfile(const char* path,
/* load the data */
if(!loadData(profile, path, name, _SPREP_DATA_TYPE, status) || U_FAILURE(*status) ){
+ uprv_free(key->path);
+ uprv_free(key->name);
+ uprv_free(key);
+ uprv_free(profile);
return NULL;
}
/* get the options */
profile->doNFKC = (UBool)((profile->indexes[_SPREP_OPTIONS] & _SPREP_NORMALIZATION_ON) > 0);
profile->checkBiDi = (UBool)((profile->indexes[_SPREP_OPTIONS] & _SPREP_CHECK_BIDI_ON) > 0);
+
+ if(profile->checkBiDi) {
+ profile->bdp = ubidi_getSingleton(status);
+ if(U_FAILURE(*status)) {
+ usprep_unload(profile);
+ uprv_free(key->path);
+ uprv_free(key->name);
+ uprv_free(key);
+ uprv_free(profile);
+ return NULL;
+ }
+ } else {
+ profile->bdp = NULL;
+ }
umtx_lock(&usprepMutex);
/* add the data object to the cache */
@@ -397,7 +417,7 @@ usprep_open(const char* path,
usprep_init();
/* initialize the profile struct members */
- return usprep_getProfile(path,name,status);;
+ return usprep_getProfile(path,name,status);
}
U_CAPI void U_EXPORT2
@@ -459,8 +479,12 @@ getValues(uint16_t trieWord, int16_t& value, UBool& isIndex){
* the source codepoint is copied to the destination
*/
type = USPREP_TYPE_LIMIT;
+ isIndex =FALSE;
+ value = 0;
}else if(trieWord >= _SPREP_TYPE_THRESHOLD){
type = (UStringPrepType) (trieWord - _SPREP_TYPE_THRESHOLD);
+ isIndex =FALSE;
+ value = 0;
}else{
/* get the type */
type = USPREP_MAP;
@@ -468,12 +492,10 @@ getValues(uint16_t trieWord, int16_t& value, UBool& isIndex){
if(trieWord & 0x02){
isIndex = TRUE;
value = trieWord >> 2; //mask off the lower 2 bits and shift
-
}else{
isIndex = FALSE;
value = (int16_t)trieWord;
value = (value >> 2);
-
}
if((trieWord>>2) == _SPREP_MAX_INDEX_VALUE){
@@ -752,17 +774,19 @@ usprep_prepare( const UStringPrepProfile* profile,
goto CLEANUP;
}
- direction = u_charDirection(ch);
- if(firstCharDir == U_CHAR_DIRECTION_COUNT){
- firstCharDir = direction;
- }
- if(direction == U_LEFT_TO_RIGHT){
- leftToRight = TRUE;
- ltrPos = b2Index-1;
- }
- if(direction == U_RIGHT_TO_LEFT || direction == U_RIGHT_TO_LEFT_ARABIC){
- rightToLeft = TRUE;
- rtlPos = b2Index-1;
+ if(profile->checkBiDi) {
+ direction = ubidi_getClass(profile->bdp, ch);
+ if(firstCharDir == U_CHAR_DIRECTION_COUNT){
+ firstCharDir = direction;
+ }
+ if(direction == U_LEFT_TO_RIGHT){
+ leftToRight = TRUE;
+ ltrPos = b2Index-1;
+ }
+ if(direction == U_RIGHT_TO_LEFT || direction == U_RIGHT_TO_LEFT_ARABIC){
+ rightToLeft = TRUE;
+ rtlPos = b2Index-1;
+ }
}
}
if(profile->checkBiDi == TRUE){
@@ -783,7 +807,7 @@ usprep_prepare( const UStringPrepProfile* profile,
return FALSE;
}
}
- if(b2Len <= destCapacity){
+ if(b2Len>0 && b2Len <= destCapacity){
uprv_memmove(dest,b2, b2Len*U_SIZEOF_UCHAR);
}
diff --git a/icuSources/common/ustack.cpp b/icuSources/common/ustack.cpp
index ef528686..76118bce 100644
--- a/icuSources/common/ustack.cpp
+++ b/icuSources/common/ustack.cpp
@@ -1,6 +1,6 @@
/*
**********************************************************************
-* Copyright (C) 2003-2003, International Business Machines
+* Copyright (C) 2003-2004, International Business Machines
* Corporation and others. All Rights Reserved.
**********************************************************************
*/
@@ -11,4 +11,51 @@ U_NAMESPACE_BEGIN
UOBJECT_DEFINE_RTTI_IMPLEMENTATION(UStack)
+UStack::UStack(UErrorCode &status) :
+ UVector(status)
+{
+}
+
+UStack::UStack(int32_t initialCapacity, UErrorCode &status) :
+ UVector(initialCapacity, status)
+{
+}
+
+UStack::UStack(UObjectDeleter *d, UKeyComparator *c, UErrorCode &status) :
+ UVector(d, c, status)
+{
+}
+
+UStack::UStack(UObjectDeleter *d, UKeyComparator *c, int32_t initialCapacity, UErrorCode &status) :
+ UVector(d, c, initialCapacity, status)
+{
+}
+
+UStack::~UStack() {}
+
+void* UStack::pop(void) {
+ int32_t n = size() - 1;
+ void* result = 0;
+ if (n >= 0) {
+ result = elementAt(n);
+ removeElementAt(n);
+ }
+ return result;
+}
+
+int32_t UStack::popi(void) {
+ int32_t n = size() - 1;
+ int32_t result = 0;
+ if (n >= 0) {
+ result = elementAti(n);
+ removeElementAt(n);
+ }
+ return result;
+}
+
+int32_t UStack::search(void* obj) const {
+ int32_t i = indexOf(obj);
+ return (i >= 0) ? size() - i : i;
+}
+
U_NAMESPACE_END
diff --git a/icuSources/common/ustr_cnv.c b/icuSources/common/ustr_cnv.c
index a0537e60..05d10258 100644
--- a/icuSources/common/ustr_cnv.c
+++ b/icuSources/common/ustr_cnv.c
@@ -145,7 +145,7 @@ u_uastrcpy(UChar *ucs1,
ucs1,
MAX_STRLEN,
s2,
- uprv_strlen(s2),
+ (int32_t)uprv_strlen(s2),
&err);
u_releaseDefaultConverter(cnv);
if(U_FAILURE(err)) {
diff --git a/icuSources/common/ustr_imp.h b/icuSources/common/ustr_imp.h
index 3b162e8a..bfb851d7 100644
--- a/icuSources/common/ustr_imp.h
+++ b/icuSources/common/ustr_imp.h
@@ -1,6 +1,6 @@
/*
**********************************************************************
-* Copyright (C) 1999-2004, International Business Machines
+* Copyright (C) 1999-2006, International Business Machines
* Corporation and others. All Rights Reserved.
**********************************************************************
* file name: ustr_imp.h
@@ -67,8 +67,8 @@ uprv_haveProperties(UErrorCode *pErrorCode);
* NOT thread safe.
* @internal
*/
-U_CFUNC int8_t
-uprv_loadPropsData(UErrorCode *errorCode);
+/*U_CFUNC int8_t
+uprv_loadPropsData(UErrorCode *errorCode);*/
/**
* Type of a function that may be passed to the internal case mapping functions
@@ -102,7 +102,7 @@ u_growBufferFromStatic(void *context,
* @internal
*/
U_CFUNC int32_t
-ustr_toLower(UCaseProps *csp,
+ustr_toLower(const UCaseProps *csp,
UChar *dest, int32_t destCapacity,
const UChar *src, int32_t srcLength,
const char *locale,
@@ -112,7 +112,7 @@ ustr_toLower(UCaseProps *csp,
* @internal
*/
U_CFUNC int32_t
-ustr_toUpper(UCaseProps *csp,
+ustr_toUpper(const UCaseProps *csp,
UChar *dest, int32_t destCapacity,
const UChar *src, int32_t srcLength,
const char *locale,
@@ -124,7 +124,7 @@ ustr_toUpper(UCaseProps *csp,
* @internal
*/
U_CFUNC int32_t
-ustr_toTitle(UCaseProps *csp,
+ustr_toTitle(const UCaseProps *csp,
UChar *dest, int32_t destCapacity,
const UChar *src, int32_t srcLength,
UBreakIterator *titleIter,
@@ -138,7 +138,7 @@ ustr_toTitle(UCaseProps *csp,
* @internal
*/
U_CFUNC int32_t
-ustr_foldCase(UCaseProps *csp,
+ustr_foldCase(const UCaseProps *csp,
UChar *dest, int32_t destCapacity,
const UChar *src, int32_t srcLength,
uint32_t options,
diff --git a/icuSources/common/ustr_wcs.c b/icuSources/common/ustr_wcs.c
index 119c63ad..3b0e4b08 100644
--- a/icuSources/common/ustr_wcs.c
+++ b/icuSources/common/ustr_wcs.c
@@ -1,7 +1,7 @@
/*
*******************************************************************************
*
-* Copyright (C) 2001-2004, International Business Machines
+* Copyright (C) 2001-2006, International Business Machines
* Corporation and others. All Rights Reserved.
*
*******************************************************************************
@@ -25,6 +25,12 @@
#include "ustr_imp.h"
#include "ustr_cnv.h"
+#if defined(U_WCHAR_IS_UTF16) || defined(U_WCHAR_IS_UTF32) || !UCONFIG_NO_CONVERSION
+
+#define _STACK_BUFFER_CAPACITY 1000
+#define _BUFFER_CAPACITY_MULTIPLIER 2
+
+#if !defined(U_WCHAR_IS_UTF16) && !defined(U_WCHAR_IS_UTF32)
static U_INLINE UBool
u_growAnyBufferFromStatic(void *context,
void **pBuffer, int32_t *pCapacity, int32_t reqCapacity,
@@ -49,10 +55,6 @@ u_growAnyBufferFromStatic(void *context,
return (UBool)(newBuffer!=NULL);
}
-#define _STACK_BUFFER_CAPACITY 1000
-#define _BUFFER_CAPACITY_MULTIPLIER 2
-
-#if !defined(U_WCHAR_IS_UTF16) && !defined(U_WCHAR_IS_UTF32)
/* helper function */
static wchar_t*
_strToWCS(wchar_t *dest,
@@ -224,7 +226,7 @@ u_strToWCS(wchar_t *dest,
const UChar *src,
int32_t srcLength,
UErrorCode *pErrorCode){
-
+
/* args check */
if(pErrorCode==NULL || U_FAILURE(*pErrorCode)){
return NULL;
@@ -272,8 +274,8 @@ _strFromWCS( UChar *dest,
int32_t *pDestLength,
const wchar_t *src,
int32_t srcLength,
- UErrorCode *pErrorCode){
-
+ UErrorCode *pErrorCode)
+{
int32_t retVal =0, count =0 ;
UConverter* conv = NULL;
UChar* pTarget = NULL;
@@ -307,7 +309,7 @@ _strFromWCS( UChar *dest,
if(retVal == -1){
*pErrorCode = U_ILLEGAL_CHAR_FOUND;
goto cleanup;
- }else if(retVal == cStackCap){
+ }else if(retVal >= (cStackCap-1)){
/* Should rarely occur */
u_growAnyBufferFromStatic(cStack,(void**)&pCSrc,&cStackCap,
cStackCap * _BUFFER_CAPACITY_MULTIPLIER, 0, sizeof(char));
@@ -516,3 +518,5 @@ u_strFromWCS(UChar *dest,
#endif
}
+
+#endif /* #if !defined(U_WCHAR_IS_UTF16) && !defined(U_WCHAR_IS_UTF32) && !UCONFIG_NO_CONVERSION */
diff --git a/icuSources/common/ustrcase.c b/icuSources/common/ustrcase.c
index d7531f2d..866d7548 100644
--- a/icuSources/common/ustrcase.c
+++ b/icuSources/common/ustrcase.c
@@ -1,7 +1,7 @@
/*
*******************************************************************************
*
-* Copyright (C) 2001-2004, International Business Machines
+* Copyright (C) 2001-2006, International Business Machines
* Corporation and others. All Rights Reserved.
*
*******************************************************************************
@@ -121,18 +121,18 @@ UCaseMapFull(const UCaseProps *csp, UChar32 c,
const char *locale, int32_t *locCache);
/*
- * Lowercases [srcStart..srcLimit[ but takes
+ * Case-maps [srcStart..srcLimit[ but takes
* context [0..srcLength[ into account.
*/
static int32_t
-_caseMap(UCaseProps *csp, UCaseMapFull *map,
+_caseMap(const UCaseProps *csp, UCaseMapFull *map,
UChar *dest, int32_t destCapacity,
const UChar *src, UCaseContext *csc,
int32_t srcStart, int32_t srcLimit,
const char *locale, int32_t *locCache,
UErrorCode *pErrorCode) {
const UChar *s;
- UChar32 c;
+ UChar32 c, c2;
int32_t srcIndex, destIndex;
/* case mapping loop */
@@ -143,7 +143,12 @@ _caseMap(UCaseProps *csp, UCaseMapFull *map,
U16_NEXT(src, srcIndex, srcLimit, c);
csc->cpLimit=srcIndex;
c=map(csp, c, utf16_caseContextIterator, csc, &s, locale, locCache);
- destIndex=appendResult(dest, destIndex, destCapacity, c, s);
+ if((destIndexdestCapacity) {
@@ -160,7 +165,7 @@ _caseMap(UCaseProps *csp, UCaseMapFull *map,
* Must get titleIter!=NULL.
*/
static int32_t
-_toTitle(UCaseProps *csp,
+_toTitle(const UCaseProps *csp,
UChar *dest, int32_t destCapacity,
const UChar *src, UCaseContext *csc,
int32_t srcLength,
@@ -169,7 +174,7 @@ _toTitle(UCaseProps *csp,
UErrorCode *pErrorCode) {
const UChar *s;
UChar32 c;
- int32_t prev, index, destIndex;
+ int32_t prev, titleStart, titleLimit, index, destIndex, length;
UBool isFirstIndex;
/* set up local variables */
@@ -190,29 +195,65 @@ _toTitle(UCaseProps *csp,
index=srcLength;
}
- /* lowercase [prev..index[ */
+ /*
+ * Unicode 4 & 5 section 3.13 Default Case Operations:
+ *
+ * R3 toTitlecase(X): Find the word boundaries based on Unicode Standard Annex
+ * #29, "Text Boundaries." Between each pair of word boundaries, find the first
+ * cased character F. If F exists, map F to default_title(F); then map each
+ * subsequent character C to default_lower(C).
+ *
+ * In this implementation, segment [prev..index[ into 3 parts:
+ * a) uncased characters (copy as-is) [prev..titleStart[
+ * b) first case letter (titlecase) [titleStart..titleLimit[
+ * c) subsequent characters (lowercase) [titleLimit..index[
+ */
if(prev0) {
+ if((destIndex+length)<=destCapacity) {
+ uprv_memcpy(dest+destIndex, src+prev, length*U_SIZEOF_UCHAR);
+ }
+ destIndex+=length;
+ }
- if(index>=srcLength) {
- break;
+ if(titleStartcpStart=titleStart;
+ csc->cpLimit=titleLimit;
+ c=ucase_toFullTitle(csp, c, utf16_caseContextIterator, csc, &s, locale, locCache);
+ destIndex=appendResult(dest, destIndex, destCapacity, c, s);
+
+ /* lowercase [titleLimit..index[ */
+ if(titleLimitcpStart=index;
- U16_NEXT(src, index, srcLength, c);
- csc->cpLimit=index;
- c=ucase_toFullTitle(csp, c, utf16_caseContextIterator, csc, &s, locale, locCache);
- destIndex=appendResult(dest, destIndex, destCapacity, c, s);
-
prev=index;
}
@@ -223,7 +264,7 @@ _toTitle(UCaseProps *csp,
}
U_CFUNC int32_t
-ustr_toTitle(UCaseProps *csp,
+ustr_toTitle(const UCaseProps *csp,
UChar *dest, int32_t destCapacity,
const UChar *src, int32_t srcLength,
UBreakIterator *titleIter,
@@ -247,7 +288,7 @@ ustr_toTitle(UCaseProps *csp,
/* functions available in the common library (for unistr_case.cpp) */
U_CFUNC int32_t
-ustr_toLower(UCaseProps *csp,
+ustr_toLower(const UCaseProps *csp,
UChar *dest, int32_t destCapacity,
const UChar *src, int32_t srcLength,
const char *locale,
@@ -266,7 +307,7 @@ ustr_toLower(UCaseProps *csp,
}
U_CFUNC int32_t
-ustr_toUpper(UCaseProps *csp,
+ustr_toUpper(const UCaseProps *csp,
UChar *dest, int32_t destCapacity,
const UChar *src, int32_t srcLength,
const char *locale,
@@ -285,7 +326,7 @@ ustr_toUpper(UCaseProps *csp,
}
U_CFUNC int32_t
-ustr_foldCase(UCaseProps *csp,
+ustr_foldCase(const UCaseProps *csp,
UChar *dest, int32_t destCapacity,
const UChar *src, int32_t srcLength,
uint32_t options,
@@ -293,14 +334,19 @@ ustr_foldCase(UCaseProps *csp,
int32_t srcIndex, destIndex;
const UChar *s;
- UChar32 c;
+ UChar32 c, c2;
/* case mapping loop */
srcIndex=destIndex=0;
while(srcIndexdestCapacity) {
@@ -333,7 +379,7 @@ caseMap(UChar *dest, int32_t destCapacity,
UChar buffer[300];
UChar *temp;
- UCaseProps *csp;
+ const UCaseProps *csp;
int32_t destLength;
UBool ownTitleIter;
@@ -527,7 +573,7 @@ u_strcmpFold(const UChar *s1, int32_t length1,
const UChar *s2, int32_t length2,
uint32_t options,
UErrorCode *pErrorCode) {
- UCaseProps *csp;
+ const UCaseProps *csp;
/* current-level start/limit - s1/s2 as current */
const UChar *start1, *start2, *limit1, *limit2;
diff --git a/icuSources/common/ustrenum.cpp b/icuSources/common/ustrenum.cpp
index 22db32b8..2a7acf68 100644
--- a/icuSources/common/ustrenum.cpp
+++ b/icuSources/common/ustrenum.cpp
@@ -1,6 +1,6 @@
/*
**********************************************************************
-* Copyright (c) 2002-2004, International Business Machines
+* Copyright (c) 2002-2005, International Business Machines
* Corporation and others. All Rights Reserved.
**********************************************************************
* Author: Alan Liu
@@ -111,6 +111,15 @@ StringEnumeration::setChars(const char *s, int32_t length, UErrorCode &status) {
return NULL;
}
+UBool
+StringEnumeration::operator==(const StringEnumeration& that)const {
+ return getDynamicClassID() == that.getDynamicClassID();
+}
+
+UBool
+StringEnumeration::operator!=(const StringEnumeration& that)const {
+ return !operator==(that);
+}
// UStringEnumeration implementation --------------------------------------- ***
@@ -311,3 +320,4 @@ uenum_openCharStringsEnumeration(const char** strings, int32_t count,
return (UEnumeration*) result;
}
+
diff --git a/icuSources/common/ustrfmt.c b/icuSources/common/ustrfmt.c
index 81b778c1..5e9fb924 100644
--- a/icuSources/common/ustrfmt.c
+++ b/icuSources/common/ustrfmt.c
@@ -1,42 +1,13 @@
/*
**********************************************************************
-* Copyright (C) 2001-2004, International Business Machines
+* Copyright (C) 2001-2006, International Business Machines
* Corporation and others. All Rights Reserved.
**********************************************************************
*/
#include "cstring.h"
#include "ustrfmt.h"
-#include
-U_CAPI char* U_EXPORT2
-uprv_dtostr(double value, char *buffer, int maximumDigits,UBool fixedPoint)
-{
- char *itrPtr = buffer + 1; /* skip '-' or a number before the decimal */
- char *startPtr;
-
- sprintf(buffer,"%f",value);
-
- /* Find the decimal point.
- Some unusal machines use a comma when the system locale changes
- */
- while (isalnum(*itrPtr)) {
- itrPtr++;
- }
- *itrPtr = '.';
-
- /* truncate trailing zeros, except the one after '.' */
- startPtr = itrPtr + 1;
- itrPtr = uprv_strchr(startPtr, 0);
- while(--itrPtr > startPtr){
- if(*itrPtr == '0'){
- *itrPtr = 0;
- }else{
- break;
- }
- }
- return buffer;
-}
/***
* Fills in a UChar* string with the radix-based representation of a
diff --git a/icuSources/common/ustrfmt.h b/icuSources/common/ustrfmt.h
index 814b5373..f1891bda 100644
--- a/icuSources/common/ustrfmt.h
+++ b/icuSources/common/ustrfmt.h
@@ -1,6 +1,6 @@
/*
**********************************************************************
-* Copyright (C) 2001-2004, International Business Machines
+* Copyright (C) 2001-2006, International Business Machines
* Corporation and others. All Rights Reserved.
**********************************************************************
*/
@@ -10,8 +10,6 @@
#include "unicode/utypes.h"
-U_CAPI char* U_EXPORT2
-uprv_dtostr(double value, char *buffer, int maximumDigits,UBool fixedPoint);
U_CAPI int32_t U_EXPORT2
uprv_itou (UChar * buffer, int32_t capacity, uint32_t i, uint32_t radix, int32_t minwidth);
diff --git a/icuSources/common/ustring.c b/icuSources/common/ustring.c
index 8c49959c..cb7fd706 100644
--- a/icuSources/common/ustring.c
+++ b/icuSources/common/ustring.c
@@ -990,7 +990,7 @@ U_CAPI int32_t U_EXPORT2
u_strlen(const UChar *s)
{
#if U_SIZEOF_WCHAR_T == U_SIZEOF_UCHAR
- return uprv_wcslen(s);
+ return (int32_t)uprv_wcslen(s);
#else
const UChar *t = s;
while(*t != 0) {
diff --git a/icuSources/common/ustrtrns.c b/icuSources/common/ustrtrns.c
index a1f2e5ab..1801d8ae 100644
--- a/icuSources/common/ustrtrns.c
+++ b/icuSources/common/ustrtrns.c
@@ -1,7 +1,7 @@
/*
******************************************************************************
*
-* Copyright (C) 2001-2004, International Business Machines
+* Copyright (C) 2001-2006, International Business Machines
* Corporation and others. All Rights Reserved.
*
******************************************************************************
@@ -101,7 +101,7 @@ u_strFromUTF32(UChar *dest,
}
}
- reqLength += pDest - dest;
+ reqLength += (int32_t)(pDest - dest);
if(pDestLength){
*pDestLength = reqLength;
}
@@ -175,7 +175,7 @@ u_strToUTF32(UChar32 *dest,
}
}
- reqLength+=(pDest - (uint32_t *)dest);
+ reqLength+=(int32_t)(pDest - (uint32_t *)dest);
if(pDestLength){
*pDestLength = reqLength;
}
@@ -186,73 +186,691 @@ u_strToUTF32(UChar32 *dest,
return dest;
}
+/* for utf8_nextCharSafeBodyTerminated() */
+static const UChar32
+utf8_minLegal[4]={ 0, 0x80, 0x800, 0x10000 };
+
+/*
+ * Version of utf8_nextCharSafeBody() with the following differences:
+ * - checks for NUL termination instead of length
+ * - works with pointers instead of indexes
+ * - always strict (strict==-1)
+ *
+ * *ps points to after the lead byte and will be moved to after the last trail byte.
+ * c is the lead byte.
+ * @return the code point, or U_SENTINEL
+ */
+static UChar32
+utf8_nextCharSafeBodyTerminated(const uint8_t **ps, UChar32 c) {
+ const uint8_t *s=*ps;
+ uint8_t trail, illegal=0;
+ uint8_t count=UTF8_COUNT_TRAIL_BYTES(c);
+ UTF8_MASK_LEAD_BYTE((c), count);
+ /* count==0 for illegally leading trail bytes and the illegal bytes 0xfe and 0xff */
+ switch(count) {
+ /* each branch falls through to the next one */
+ case 5:
+ case 4:
+ /* count>=4 is always illegal: no more than 3 trail bytes in Unicode's UTF-8 */
+ illegal=1;
+ break;
+ case 3:
+ trail=(uint8_t)(*s++ - 0x80);
+ c=(c<<6)|trail;
+ if(trail>0x3f || c>=0x110) {
+ /* not a trail byte, or code point>0x10ffff (outside Unicode) */
+ illegal=1;
+ break;
+ }
+ case 2:
+ trail=(uint8_t)(*s++ - 0x80);
+ if(trail>0x3f) {
+ /* not a trail byte */
+ illegal=1;
+ break;
+ }
+ c=(c<<6)|trail;
+ case 1:
+ trail=(uint8_t)(*s++ - 0x80);
+ if(trail>0x3f) {
+ /* not a trail byte */
+ illegal=1;
+ }
+ c=(c<<6)|trail;
+ break;
+ case 0:
+ return U_SENTINEL;
+ /* no default branch to optimize switch() - all values are covered */
+ }
+
+ /* correct sequence - all trail bytes have (b7..b6)==(10)? */
+ /* illegal is also set if count>=4 */
+ if(illegal || c0 && UTF8_IS_TRAIL(*s)) {
+ ++s;
+ --count;
+ }
+ c=U_SENTINEL;
+ }
+ *ps=s;
+ return c;
+}
+
+/*
+ * Version of utf8_nextCharSafeBody() with the following differences:
+ * - works with pointers instead of indexes
+ * - always strict (strict==-1)
+ *
+ * *ps points to after the lead byte and will be moved to after the last trail byte.
+ * c is the lead byte.
+ * @return the code point, or U_SENTINEL
+ */
+static UChar32
+utf8_nextCharSafeBodyPointer(const uint8_t **ps, const uint8_t *limit, UChar32 c) {
+ const uint8_t *s=*ps;
+ uint8_t trail, illegal=0;
+ uint8_t count=UTF8_COUNT_TRAIL_BYTES(c);
+ if((limit-s)>=count) {
+ UTF8_MASK_LEAD_BYTE((c), count);
+ /* count==0 for illegally leading trail bytes and the illegal bytes 0xfe and 0xff */
+ switch(count) {
+ /* each branch falls through to the next one */
+ case 5:
+ case 4:
+ /* count>=4 is always illegal: no more than 3 trail bytes in Unicode's UTF-8 */
+ illegal=1;
+ break;
+ case 3:
+ trail=*s++;
+ c=(c<<6)|(trail&0x3f);
+ if(c<0x110) {
+ illegal|=(trail&0xc0)^0x80;
+ } else {
+ /* code point>0x10ffff, outside Unicode */
+ illegal=1;
+ break;
+ }
+ case 2:
+ trail=*s++;
+ c=(c<<6)|(trail&0x3f);
+ illegal|=(trail&0xc0)^0x80;
+ case 1:
+ trail=*s++;
+ c=(c<<6)|(trail&0x3f);
+ illegal|=(trail&0xc0)^0x80;
+ break;
+ case 0:
+ return U_SENTINEL;
+ /* no default branch to optimize switch() - all values are covered */
+ }
+ } else {
+ illegal=1; /* too few bytes left */
+ }
+
+ /* correct sequence - all trail bytes have (b7..b6)==(10)? */
+ /* illegal is also set if count>=4 */
+ if(illegal || c0 && s 0)){
+ if( (src==NULL) || (srcLength < -1) || (destCapacity<0) || (!dest && destCapacity > 0) ||
+ subchar > 0x10ffff || U_IS_SURROGATE(subchar)
+ ) {
*pErrorCode = U_ILLEGAL_ARGUMENT_ERROR;
return NULL;
}
- if(srcLength == -1){
- srcLength = uprv_strlen((char*)pSrc);
- }
-
- while((index < srcLength)&&(pDest 0xe0) {
+ if( /* handle U+1000..U+CFFF inline */
+ ch <= 0xec &&
+ (t1 = (uint8_t)(pSrc[1] - 0x80)) <= 0x3f &&
+ (t2 = (uint8_t)(pSrc[2] - 0x80)) <= 0x3f
+ ) {
+ /* no need for (ch & 0xf) because the upper bits are truncated after <<12 in the cast to (UChar) */
+ *pDest++ = (UChar)((ch << 12) | (t1 << 6) | t2);
+ pSrc += 3;
+ continue;
+ }
+ } else if(ch < 0xe0) {
+ if( /* handle U+0080..U+07FF inline */
+ ch >= 0xc2 &&
+ (t1 = (uint8_t)(pSrc[1] - 0x80)) <= 0x3f
+ ) {
+ *pDest++ = (UChar)(((ch & 0x1f) << 6) | t1);
+ pSrc += 2;
+ continue;
+ }
+ }
+
+ /* function call for "complicated" and error cases */
+ ++pSrc; /* continue after the lead byte */
+ ch=utf8_nextCharSafeBodyTerminated(&pSrc, ch);
+ if(ch<0 && (++numSubstitutions, ch = subchar) < 0) {
+ *pErrorCode = U_INVALID_CHAR_FOUND;
+ return NULL;
+ } else if(ch<=0xFFFF) {
+ *(pDest++)=(UChar)ch;
+ } else {
+ *(pDest++)=UTF16_LEAD(ch);
+ if(pDest 0xe0) {
+ if( /* handle U+1000..U+CFFF inline */
+ ch <= 0xec &&
+ (uint8_t)(pSrc[1] - 0x80) <= 0x3f &&
+ (uint8_t)(pSrc[2] - 0x80) <= 0x3f
+ ) {
+ ++reqLength;
+ pSrc += 3;
+ continue;
+ }
+ } else if(ch < 0xe0) {
+ if( /* handle U+0080..U+07FF inline */
+ ch >= 0xc2 &&
+ (uint8_t)(pSrc[1] - 0x80) <= 0x3f
+ ) {
+ ++reqLength;
+ pSrc += 2;
+ continue;
+ }
+ }
+
+ /* function call for "complicated" and error cases */
+ ++pSrc; /* continue after the lead byte */
+ ch=utf8_nextCharSafeBodyTerminated(&pSrc, ch);
+ if(ch<0 && (++numSubstitutions, ch = subchar) < 0) {
+ *pErrorCode = U_INVALID_CHAR_FOUND;
+ return NULL;
+ }
+ reqLength += U16_LENGTH(ch);
+ }
+ }
+ } else /* srcLength >= 0 */ {
+ const uint8_t *pSrcLimit = pSrc + srcLength;
+ int32_t count;
+
+ /* Faster loop without ongoing checking for pSrcLimit and pDestLimit. */
+ for(;;) {
+ /*
+ * Each iteration of the inner loop progresses by at most 3 UTF-8
+ * bytes and one UChar, for most characters.
+ * For supplementary code points (4 & 2), which are rare,
+ * there is an additional adjustment.
+ */
+ count = (int32_t)(pDestLimit - pDest);
+ srcLength = (int32_t)((pSrcLimit - pSrc) / 3);
+ if(count > srcLength) {
+ count = srcLength; /* min(remaining dest, remaining src/3) */
+ }
+ if(count < 3) {
+ /*
+ * Too much overhead if we get near the end of the string,
+ * continue with the next loop.
+ */
+ break;
+ }
+
+ do {
+ ch = *pSrc;
+ if(ch <= 0x7f){
+ *pDest++=(UChar)ch;
+ ++pSrc;
+ } else {
+ if(ch > 0xe0) {
+ if( /* handle U+1000..U+CFFF inline */
+ ch <= 0xec &&
+ (t1 = (uint8_t)(pSrc[1] - 0x80)) <= 0x3f &&
+ (t2 = (uint8_t)(pSrc[2] - 0x80)) <= 0x3f
+ ) {
+ /* no need for (ch & 0xf) because the upper bits are truncated after <<12 in the cast to (UChar) */
+ *pDest++ = (UChar)((ch << 12) | (t1 << 6) | t2);
+ pSrc += 3;
+ continue;
+ }
+ } else if(ch < 0xe0) {
+ if( /* handle U+0080..U+07FF inline */
+ ch >= 0xc2 &&
+ (t1 = (uint8_t)(pSrc[1] - 0x80)) <= 0x3f
+ ) {
+ *pDest++ = (UChar)(((ch & 0x1f) << 6) | t1);
+ pSrc += 2;
+ continue;
+ }
+ }
+
+ if(ch >= 0xf0 || subchar > 0xffff) {
+ /*
+ * We may read up to six bytes and write up to two UChars,
+ * which we didn't account for with computing count,
+ * so we adjust it here.
+ */
+ if(--count == 0) {
+ break;
+ }
+ }
+
+ /* function call for "complicated" and error cases */
+ ++pSrc; /* continue after the lead byte */
+ ch=utf8_nextCharSafeBodyPointer(&pSrc, pSrcLimit, ch);
+ if(ch<0 && (++numSubstitutions, ch = subchar) < 0){
+ *pErrorCode = U_INVALID_CHAR_FOUND;
+ return NULL;
+ }else if(ch<=0xFFFF){
+ *(pDest++)=(UChar)ch;
+ }else{
+ *(pDest++)=UTF16_LEAD(ch);
+ if(pDest 0);
+ }
+
+ while((pSrc 0xe0) {
+ if( /* handle U+1000..U+CFFF inline */
+ ch <= 0xec &&
+ ((pSrcLimit - pSrc) >= 3) &&
+ (t1 = (uint8_t)(pSrc[1] - 0x80)) <= 0x3f &&
+ (t2 = (uint8_t)(pSrc[2] - 0x80)) <= 0x3f
+ ) {
+ /* no need for (ch & 0xf) because the upper bits are truncated after <<12 in the cast to (UChar) */
+ *pDest++ = (UChar)((ch << 12) | (t1 << 6) | t2);
+ pSrc += 3;
+ continue;
+ }
+ } else if(ch < 0xe0) {
+ if( /* handle U+0080..U+07FF inline */
+ ch >= 0xc2 &&
+ ((pSrcLimit - pSrc) >= 2) &&
+ (t1 = (uint8_t)(pSrc[1] - 0x80)) <= 0x3f
+ ) {
+ *pDest++ = (UChar)(((ch & 0x1f) << 6) | t1);
+ pSrc += 2;
+ continue;
+ }
+ }
+
+ /* function call for "complicated" and error cases */
+ ++pSrc; /* continue after the lead byte */
+ ch=utf8_nextCharSafeBodyPointer(&pSrc, pSrcLimit, ch);
+ if(ch<0 && (++numSubstitutions, ch = subchar) < 0){
+ *pErrorCode = U_INVALID_CHAR_FOUND;
+ return NULL;
+ }else if(ch<=0xFFFF){
+ *(pDest++)=(UChar)ch;
}else{
- reqLength++;
- break;
+ *(pDest++)=UTF16_LEAD(ch);
+ if(pDest 0xe0) {
+ if( /* handle U+1000..U+CFFF inline */
+ ch <= 0xec &&
+ ((pSrcLimit - pSrc) >= 3) &&
+ (uint8_t)(pSrc[1] - 0x80) <= 0x3f &&
+ (uint8_t)(pSrc[2] - 0x80) <= 0x3f
+ ) {
+ reqLength++;
+ pSrc += 3;
+ continue;
+ }
+ } else if(ch < 0xe0) {
+ if( /* handle U+0080..U+07FF inline */
+ ch >= 0xc2 &&
+ ((pSrcLimit - pSrc) >= 2) &&
+ (uint8_t)(pSrc[1] - 0x80) <= 0x3f
+ ) {
+ reqLength++;
+ pSrc += 2;
+ continue;
+ }
}
+
+ /* function call for "complicated" and error cases */
+ ++pSrc; /* continue after the lead byte */
+ ch=utf8_nextCharSafeBodyPointer(&pSrc, pSrcLimit, ch);
+ if(ch<0 && (++numSubstitutions, ch = subchar) < 0){
+ *pErrorCode = U_INVALID_CHAR_FOUND;
+ return NULL;
+ }
+ reqLength+=UTF_CHAR_LENGTH(ch);
}
}
}
- /* donot fill the dest buffer just count the UChars needed */
- while(index < srcLength){
- ch = pSrc[index++];
- if(ch <= 0x7f){
- reqLength++;
- }else{
- ch=utf8_nextCharSafeBody(pSrc, &index, srcLength, ch, -1);
- if(ch<0){
- *pErrorCode = U_INVALID_CHAR_FOUND;
- return NULL;
+
+ reqLength+=(int32_t)(pDest - dest);
+
+ if(pNumSubstitutions!=NULL) {
+ *pNumSubstitutions=numSubstitutions;
+ }
+
+ if(pDestLength){
+ *pDestLength = reqLength;
+ }
+
+ /* Terminate the buffer */
+ u_terminateUChars(dest,destCapacity,reqLength,pErrorCode);
+
+ return dest;
+}
+
+U_CAPI UChar* U_EXPORT2
+u_strFromUTF8(UChar *dest,
+ int32_t destCapacity,
+ int32_t *pDestLength,
+ const char* src,
+ int32_t srcLength,
+ UErrorCode *pErrorCode){
+ return u_strFromUTF8WithSub(
+ dest, destCapacity, pDestLength,
+ src, srcLength,
+ U_SENTINEL, NULL,
+ pErrorCode);
+}
+
+U_CAPI UChar * U_EXPORT2
+u_strFromUTF8Lenient(UChar *dest,
+ int32_t destCapacity,
+ int32_t *pDestLength,
+ const char *src,
+ int32_t srcLength,
+ UErrorCode *pErrorCode) {
+
+ UChar *pDest = dest;
+ UChar32 ch;
+ int32_t reqLength = 0;
+ uint8_t* pSrc = (uint8_t*) src;
+
+ /* args check */
+ if(pErrorCode==NULL || U_FAILURE(*pErrorCode)){
+ return NULL;
+ }
+
+ if((src==NULL) || (srcLength < -1) || (destCapacity<0) || (!dest && destCapacity > 0)) {
+ *pErrorCode = U_ILLEGAL_ARGUMENT_ERROR;
+ return NULL;
+ }
+
+ if(srcLength < 0) {
+ /* Transform a NUL-terminated string. */
+ UChar *pDestLimit = dest+destCapacity;
+ uint8_t t1, t2, t3; /* trail bytes */
+
+ while(((ch = *pSrc) != 0) && (pDest < pDestLimit)) {
+ if(ch < 0xc0) {
+ /*
+ * ASCII, or a trail byte in lead position which is treated like
+ * a single-byte sequence for better character boundary
+ * resynchronization after illegal sequences.
+ */
+ *pDest++=(UChar)ch;
+ ++pSrc;
+ continue;
+ } else if(ch < 0xe0) { /* U+0080..U+07FF */
+ if((t1 = pSrc[1]) != 0) {
+ /* 0x3080 = (0xc0 << 6) + 0x80 */
+ *pDest++ = (UChar)((ch << 6) + t1 - 0x3080);
+ pSrc += 2;
+ continue;
+ }
+ } else if(ch < 0xf0) { /* U+0800..U+FFFF */
+ if((t1 = pSrc[1]) != 0 && (t2 = pSrc[2]) != 0) {
+ /* no need for (ch & 0xf) because the upper bits are truncated after <<12 in the cast to (UChar) */
+ /* 0x2080 = (0x80 << 6) + 0x80 */
+ *pDest++ = (UChar)((ch << 12) + (t1 << 6) + t2 - 0x2080);
+ pSrc += 3;
+ continue;
+ }
+ } else /* f0..f4 */ { /* U+10000..U+10FFFF */
+ if((t1 = pSrc[1]) != 0 && (t2 = pSrc[2]) != 0 && (t3 = pSrc[3]) != 0) {
+ pSrc += 4;
+ /* 0x3c82080 = (0xf0 << 18) + (0x80 << 12) + (0x80 << 6) + 0x80 */
+ ch = (ch << 18) + (t1 << 12) + (t2 << 6) + t3 - 0x3c82080;
+ *(pDest++) = U16_LEAD(ch);
+ if(pDest < pDestLimit) {
+ *(pDest++) = U16_TRAIL(ch);
+ } else {
+ reqLength = 1;
+ break;
+ }
+ continue;
+ }
}
- reqLength+=UTF_CHAR_LENGTH(ch);
+
+ /* truncated character at the end */
+ *pDest++ = 0xfffd;
+ while(*++pSrc != 0) {}
+ break;
+ }
+
+ /* Pre-flight the rest of the string. */
+ while((ch = *pSrc) != 0) {
+ if(ch < 0xc0) {
+ /*
+ * ASCII, or a trail byte in lead position which is treated like
+ * a single-byte sequence for better character boundary
+ * resynchronization after illegal sequences.
+ */
+ ++reqLength;
+ ++pSrc;
+ continue;
+ } else if(ch < 0xe0) { /* U+0080..U+07FF */
+ if(pSrc[1] != 0) {
+ ++reqLength;
+ pSrc += 2;
+ continue;
+ }
+ } else if(ch < 0xf0) { /* U+0800..U+FFFF */
+ if(pSrc[1] != 0 && pSrc[2] != 0) {
+ ++reqLength;
+ pSrc += 3;
+ continue;
+ }
+ } else /* f0..f4 */ { /* U+10000..U+10FFFF */
+ if(pSrc[1] != 0 && pSrc[2] != 0 && pSrc[3] != 0) {
+ reqLength += 2;
+ pSrc += 4;
+ continue;
+ }
+ }
+
+ /* truncated character at the end */
+ ++reqLength;
+ break;
+ }
+ } else /* srcLength >= 0 */ {
+ const uint8_t *pSrcLimit = pSrc + srcLength;
+
+ /*
+ * This function requires that if srcLength is given, then it must be
+ * destCapatity >= srcLength so that we need not check for
+ * destination buffer overflow in the loop.
+ */
+ if(destCapacity < srcLength) {
+ if(pDestLength != NULL) {
+ *pDestLength = srcLength; /* this likely overestimates the true destLength! */
+ }
+ *pErrorCode = U_BUFFER_OVERFLOW_ERROR;
+ return NULL;
+ }
+
+ if((pSrcLimit - pSrc) >= 4) {
+ pSrcLimit -= 3; /* temporarily reduce pSrcLimit */
+
+ /* in this loop, we can always access at least 4 bytes, up to pSrc+3 */
+ do {
+ ch = *pSrc++;
+ if(ch < 0xc0) {
+ /*
+ * ASCII, or a trail byte in lead position which is treated like
+ * a single-byte sequence for better character boundary
+ * resynchronization after illegal sequences.
+ */
+ *pDest++=(UChar)ch;
+ } else if(ch < 0xe0) { /* U+0080..U+07FF */
+ /* 0x3080 = (0xc0 << 6) + 0x80 */
+ *pDest++ = (UChar)((ch << 6) + *pSrc++ - 0x3080);
+ } else if(ch < 0xf0) { /* U+0800..U+FFFF */
+ /* no need for (ch & 0xf) because the upper bits are truncated after <<12 in the cast to (UChar) */
+ /* 0x2080 = (0x80 << 6) + 0x80 */
+ ch = (ch << 12) + (*pSrc++ << 6);
+ *pDest++ = (UChar)(ch + *pSrc++ - 0x2080);
+ } else /* f0..f4 */ { /* U+10000..U+10FFFF */
+ /* 0x3c82080 = (0xf0 << 18) + (0x80 << 12) + (0x80 << 6) + 0x80 */
+ ch = (ch << 18) + (*pSrc++ << 12);
+ ch += *pSrc++ << 6;
+ ch += *pSrc++ - 0x3c82080;
+ *(pDest++) = U16_LEAD(ch);
+ *(pDest++) = U16_TRAIL(ch);
+ }
+ } while(pSrc < pSrcLimit);
+
+ pSrcLimit += 3; /* restore original pSrcLimit */
+ }
+
+ while(pSrc < pSrcLimit) {
+ ch = *pSrc++;
+ if(ch < 0xc0) {
+ /*
+ * ASCII, or a trail byte in lead position which is treated like
+ * a single-byte sequence for better character boundary
+ * resynchronization after illegal sequences.
+ */
+ *pDest++=(UChar)ch;
+ continue;
+ } else if(ch < 0xe0) { /* U+0080..U+07FF */
+ if(pSrc < pSrcLimit) {
+ /* 0x3080 = (0xc0 << 6) + 0x80 */
+ *pDest++ = (UChar)(((ch & 0x1f) << 6) + *pSrc++ - 0x3080);
+ continue;
+ }
+ } else if(ch < 0xf0) { /* U+0800..U+FFFF */
+ if((pSrcLimit - pSrc) >= 2) {
+ /* no need for (ch & 0xf) because the upper bits are truncated after <<12 in the cast to (UChar) */
+ /* 0x2080 = (0x80 << 6) + 0x80 */
+ ch = (ch << 12) + (*pSrc++ << 6);
+ *pDest++ = (UChar)(ch + *pSrc++ - 0x2080);
+ pSrc += 3;
+ continue;
+ }
+ } else /* f0..f4 */ { /* U+10000..U+10FFFF */
+ if((pSrcLimit - pSrc) >= 3) {
+ /* 0x3c82080 = (0xf0 << 18) + (0x80 << 12) + (0x80 << 6) + 0x80 */
+ ch = (ch << 18) + (*pSrc++ << 12);
+ ch += *pSrc++ << 6;
+ ch += *pSrc++ - 0x3c82080;
+ *(pDest++) = U16_LEAD(ch);
+ *(pDest++) = U16_TRAIL(ch);
+ pSrc += 4;
+ continue;
+ }
+ }
+
+ /* truncated character at the end */
+ *pDest++ = 0xfffd;
+ break;
}
}
- reqLength+=(pDest - dest);
+ reqLength+=(int32_t)(pDest - dest);
if(pDestLength){
*pDestLength = reqLength;
@@ -266,11 +884,13 @@ u_strFromUTF8(UChar *dest,
static U_INLINE uint8_t *
_appendUTF8(uint8_t *pDest, UChar32 c) {
- /* c<=0x7f is handled by the caller, here it is 0x80<=c<=0x10ffff */
- if((c)<=0x7ff) {
+ /* it is 0<=c<=0x10ffff and not a surrogate if called by a validating function */
+ if((c)<=0x7f) {
+ *pDest++=(uint8_t)c;
+ } else if(c<=0x7ff) {
*pDest++=(uint8_t)((c>>6)|0xc0);
*pDest++=(uint8_t)((c&0x3f)|0x80);
- } else if((uint32_t)(c)<=0xffff) {
+ } else if(c<=0xffff) {
*pDest++=(uint8_t)((c>>12)|0xe0);
*pDest++=(uint8_t)(((c>>6)&0x3f)|0x80);
*pDest++=(uint8_t)(((c)&0x3f)|0x80);
@@ -285,57 +905,86 @@ _appendUTF8(uint8_t *pDest, UChar32 c) {
U_CAPI char* U_EXPORT2
-u_strToUTF8(char *dest,
+u_strToUTF8WithSub(char *dest,
int32_t destCapacity,
int32_t *pDestLength,
- const UChar *pSrc,
+ const UChar *pSrc,
int32_t srcLength,
+ UChar32 subchar, int32_t *pNumSubstitutions,
UErrorCode *pErrorCode){
int32_t reqLength=0;
- const UChar *pSrcLimit;
uint32_t ch=0,ch2=0;
uint8_t *pDest = (uint8_t *)dest;
uint8_t *pDestLimit = pDest + destCapacity;
-
+ int32_t numSubstitutions;
/* args check */
if(pErrorCode==NULL || U_FAILURE(*pErrorCode)){
return NULL;
}
- if((pSrc==NULL) || (srcLength < -1) || (destCapacity<0) || (!dest && destCapacity > 0)){
+ if( (pSrc==NULL) || (srcLength < -1) || (destCapacity<0) || (!dest && destCapacity > 0) ||
+ subchar > 0x10ffff || U_IS_SURROGATE(subchar)
+ ) {
*pErrorCode = U_ILLEGAL_ARGUMENT_ERROR;
return NULL;
}
+ numSubstitutions=0;
+
if(srcLength==-1) {
- while((ch=*pSrc)!=0 && pDest!=pDestLimit) {
+ while((ch=*pSrc)!=0) {
++pSrc;
if(ch <= 0x7f) {
- *pDest++ = (char)ch;
- ++reqLength;
- continue;
- }
+ if(pDest= 2) {
+ *pDest++=(uint8_t)((ch>>6)|0xc0);
+ *pDest++=(uint8_t)((ch&0x3f)|0x80);
+ } else {
+ reqLength = 2;
+ break;
+ }
+ } else if(ch <= 0xd7ff || ch >= 0xe000) {
+ if((pDestLimit - pDest) >= 3) {
+ *pDest++=(uint8_t)((ch>>12)|0xe0);
+ *pDest++=(uint8_t)(((ch>>6)&0x3f)|0x80);
+ *pDest++=(uint8_t)((ch&0x3f)|0x80);
+ } else {
+ reqLength = 3;
+ break;
+ }
+ } else /* ch is a surrogate */ {
+ int32_t length;
- /*need not check for NUL because NUL fails UTF_IS_TRAIL() anyway*/
- if(UTF_IS_SURROGATE(ch)) {
+ /*need not check for NUL because NUL fails UTF_IS_TRAIL() anyway*/
if(UTF_IS_SURROGATE_FIRST(ch) && UTF_IS_TRAIL(ch2=*pSrc)) {
++pSrc;
ch=UTF16_GET_PAIR_VALUE(ch, ch2);
+ } else if(subchar>=0) {
+ ch=subchar;
+ ++numSubstitutions;
} else {
/* Unicode 3.2 forbids surrogate code points in UTF-8 */
*pErrorCode = U_INVALID_CHAR_FOUND;
return NULL;
}
+
+ length = U8_LENGTH(ch);
+ if((pDestLimit - pDest) >= length) {
+ /* convert and append*/
+ pDest=_appendUTF8(pDest, ch);
+ } else {
+ reqLength = length;
+ break;
+ }
}
- reqLength += UTF8_CHAR_LENGTH(ch);
- /* do we have enough room in destination? */
- if(destCapacity< reqLength){
- break;
- }
- /* convert and append*/
- pDest=_appendUTF8(pDest, ch);
}
while((ch=*pSrc++)!=0) {
if(ch<=0x7f) {
@@ -347,6 +996,9 @@ u_strToUTF8(char *dest,
} else if(UTF_IS_SURROGATE_FIRST(ch) && UTF_IS_TRAIL(ch2=*pSrc)) {
++pSrc;
reqLength+=4;
+ } else if(subchar>=0) {
+ reqLength+=U8_LENGTH(subchar);
+ ++numSubstitutions;
} else {
/* Unicode 3.2 forbids surrogate code points in UTF-8 */
*pErrorCode = U_INVALID_CHAR_FOUND;
@@ -354,32 +1006,127 @@ u_strToUTF8(char *dest,
}
}
} else {
- pSrcLimit = pSrc+srcLength;
- while(pSrc srcLength) {
+ count = srcLength; /* min(remaining dest/3, remaining src) */
+ }
+ if(count < 3) {
+ /*
+ * Too much overhead if we get near the end of the string,
+ * continue with the next loop.
+ */
+ break;
+ }
+ do {
+ ch=*pSrc++;
+ if(ch <= 0x7f) {
+ *pDest++ = (char)ch;
+ } else if(ch <= 0x7ff) {
+ *pDest++=(uint8_t)((ch>>6)|0xc0);
+ *pDest++=(uint8_t)((ch&0x3f)|0x80);
+ } else if(ch <= 0xd7ff || ch >= 0xe000) {
+ *pDest++=(uint8_t)((ch>>12)|0xe0);
+ *pDest++=(uint8_t)(((ch>>6)&0x3f)|0x80);
+ *pDest++=(uint8_t)((ch&0x3f)|0x80);
+ } else /* ch is a surrogate */ {
+ /*
+ * We will read two UChars and probably output four bytes,
+ * which we didn't account for with computing count,
+ * so we adjust it here.
+ */
+ if(--count == 0) {
+ --pSrc; /* undo ch=*pSrc++ for the lead surrogate */
+ break; /* recompute count */
+ }
+
+ if(UTF_IS_SURROGATE_FIRST(ch) && UTF_IS_TRAIL(ch2=*pSrc)) {
+ ++pSrc;
+ ch=UTF16_GET_PAIR_VALUE(ch, ch2);
+
+ /* writing 4 bytes per 2 UChars is ok */
+ *pDest++=(uint8_t)((ch>>18)|0xf0);
+ *pDest++=(uint8_t)(((ch>>12)&0x3f)|0x80);
+ *pDest++=(uint8_t)(((ch>>6)&0x3f)|0x80);
+ *pDest++=(uint8_t)((ch&0x3f)|0x80);
+ } else {
+ /* Unicode 3.2 forbids surrogate code points in UTF-8 */
+ if(subchar>=0) {
+ ch=subchar;
+ ++numSubstitutions;
+ } else {
+ *pErrorCode = U_INVALID_CHAR_FOUND;
+ return NULL;
+ }
+
+ /* convert and append*/
+ pDest=_appendUTF8(pDest, ch);
+ }
+ }
+ } while(--count > 0);
+ }
+
+ while(pSrc= 2) {
+ *pDest++=(uint8_t)((ch>>6)|0xc0);
+ *pDest++=(uint8_t)((ch&0x3f)|0x80);
+ } else {
+ reqLength = 2;
+ break;
+ }
+ } else if(ch <= 0xd7ff || ch >= 0xe000) {
+ if((pDestLimit - pDest) >= 3) {
+ *pDest++=(uint8_t)((ch>>12)|0xe0);
+ *pDest++=(uint8_t)(((ch>>6)&0x3f)|0x80);
+ *pDest++=(uint8_t)((ch&0x3f)|0x80);
+ } else {
+ reqLength = 3;
+ break;
+ }
+ } else /* ch is a surrogate */ {
+ int32_t length;
- if(UTF_IS_SURROGATE(ch)) {
if(UTF_IS_SURROGATE_FIRST(ch) && pSrc=0) {
+ ch=subchar;
+ ++numSubstitutions;
} else {
/* Unicode 3.2 forbids surrogate code points in UTF-8 */
*pErrorCode = U_INVALID_CHAR_FOUND;
return NULL;
}
+
+ length = U8_LENGTH(ch);
+ if((pDestLimit - pDest) >= length) {
+ /* convert and append*/
+ pDest=_appendUTF8(pDest, ch);
+ } else {
+ reqLength = length;
+ break;
+ }
}
- reqLength += UTF8_CHAR_LENGTH(ch);
- /* do we have enough room in destination? */
- if(destCapacity< reqLength){
- break;
- }
- /* convert and append*/
- pDest=_appendUTF8(pDest, ch);
}
while(pSrc=0) {
+ reqLength+=U8_LENGTH(subchar);
+ ++numSubstitutions;
} else {
/* Unicode 3.2 forbids surrogate code points in UTF-8 */
*pErrorCode = U_INVALID_CHAR_FOUND;
@@ -400,6 +1150,12 @@ u_strToUTF8(char *dest,
}
}
+ reqLength+=(int32_t)(pDest - (uint8_t *)dest);
+
+ if(pNumSubstitutions!=NULL) {
+ *pNumSubstitutions=numSubstitutions;
+ }
+
if(pDestLength){
*pDestLength = reqLength;
}
@@ -409,3 +1165,17 @@ u_strToUTF8(char *dest,
return (char*)dest;
}
+
+U_CAPI char* U_EXPORT2
+u_strToUTF8(char *dest,
+ int32_t destCapacity,
+ int32_t *pDestLength,
+ const UChar *pSrc,
+ int32_t srcLength,
+ UErrorCode *pErrorCode){
+ return u_strToUTF8WithSub(
+ dest, destCapacity, pDestLength,
+ pSrc, srcLength,
+ U_SENTINEL, NULL,
+ pErrorCode);
+}
diff --git a/icuSources/common/utext.cpp b/icuSources/common/utext.cpp
new file mode 100644
index 00000000..da496cd0
--- /dev/null
+++ b/icuSources/common/utext.cpp
@@ -0,0 +1,2820 @@
+/*
+*******************************************************************************
+*
+* Copyright (C) 2005-2006, International Business Machines
+* Corporation and others. All Rights Reserved.
+*
+*******************************************************************************
+* file name: utext.cpp
+* encoding: US-ASCII
+* tab size: 8 (not used)
+* indentation:4
+*
+* created on: 2005apr12
+* created by: Markus W. Scherer
+*/
+
+#include "unicode/utypes.h"
+#include "unicode/ustring.h"
+#include "unicode/unistr.h"
+#include "unicode/chariter.h"
+#include "unicode/utext.h"
+#include "ustr_imp.h"
+#include "cmemory.h"
+#include "cstring.h"
+#include "uassert.h"
+
+
+#define I32_FLAG(bitIndex) ((int32_t)1<<(bitIndex))
+
+
+static UBool
+utext_access(UText *ut, int64_t index, UBool forward) {
+ return ut->pFuncs->access(ut, index, forward);
+}
+
+
+
+U_DRAFT UBool U_EXPORT2
+utext_moveIndex32(UText *ut, int32_t delta) {
+ UChar32 c;
+ if (delta > 0) {
+ do {
+ if(ut->chunkOffset>=ut->chunkLength && !utext_access(ut, ut->chunkNativeLimit, TRUE)) {
+ return FALSE;
+ }
+ c = ut->chunkContents[ut->chunkOffset];
+ if (U16_IS_SURROGATE(c)) {
+ c = utext_next32(ut);
+ if (c == U_SENTINEL) {
+ return FALSE;
+ }
+ } else {
+ ut->chunkOffset++;
+ }
+ } while(--delta>0);
+
+ } else if (delta<0) {
+ do {
+ if(ut->chunkOffset<=0 && !utext_access(ut, ut->chunkNativeStart, FALSE)) {
+ return FALSE;
+ }
+ c = ut->chunkContents[ut->chunkOffset-1];
+ if (U16_IS_SURROGATE(c)) {
+ c = utext_previous32(ut);
+ if (c == U_SENTINEL) {
+ return FALSE;
+ }
+ } else {
+ ut->chunkOffset--;
+ }
+ } while(++delta<0);
+ }
+
+ return TRUE;
+}
+
+
+U_DRAFT int64_t U_EXPORT2
+utext_nativeLength(UText *ut) {
+ return ut->pFuncs->nativeLength(ut);
+}
+
+
+U_DRAFT UBool U_EXPORT2
+utext_isLengthExpensive(const UText *ut) {
+ UBool r = (ut->providerProperties & I32_FLAG(UTEXT_PROVIDER_LENGTH_IS_EXPENSIVE)) != 0;
+ return r;
+}
+
+
+U_DRAFT int64_t U_EXPORT2
+utext_getNativeIndex(const UText *ut) {
+ if(ut->chunkOffset <= ut->nativeIndexingLimit) {
+ return ut->chunkNativeStart+ut->chunkOffset;
+ } else {
+ return ut->pFuncs->mapOffsetToNative(ut);
+ }
+}
+
+
+U_DRAFT void U_EXPORT2
+utext_setNativeIndex(UText *ut, int64_t index) {
+ if(indexchunkNativeStart || index>=ut->chunkNativeLimit) {
+ // The desired position is outside of the current chunk.
+ // Access the new position. Assume a forward iteration from here,
+ // which will also be optimimum for a single random access.
+ // Reverse iterations may suffer slightly.
+ ut->pFuncs->access(ut, index, TRUE);
+ } else if((int32_t)(index - ut->chunkNativeStart) <= ut->nativeIndexingLimit) {
+ // utf-16 indexing.
+ ut->chunkOffset=(int32_t)(index-ut->chunkNativeStart);
+ } else {
+ ut->chunkOffset=ut->pFuncs->mapNativeIndexToUTF16(ut, index);
+ }
+ // The convention is that the index must always be on a code point boundary.
+ // Adjust the index position if it is in the middle of a surrogate pair.
+ if (ut->chunkOffsetchunkLength) {
+ UChar c= ut->chunkContents[ut->chunkOffset];
+ if (UTF16_IS_TRAIL(c)) {
+ if (ut->chunkOffset==0) {
+ ut->pFuncs->access(ut, ut->chunkNativeStart, FALSE);
+ }
+ if (ut->chunkOffset>0) {
+ UChar lead = ut->chunkContents[ut->chunkOffset-1];
+ if (UTF16_IS_LEAD(lead)) {
+ ut->chunkOffset--;
+ }
+ }
+ }
+ }
+}
+
+
+
+U_DRAFT int64_t U_EXPORT2
+utext_getPreviousNativeIndex(UText *ut) {
+ //
+ // Fast-path the common case.
+ // Common means current position is not at the beginning of a chunk
+ // and the preceding character is not supplementary.
+ //
+ int32_t i = ut->chunkOffset - 1;
+ int64_t result;
+ if (i >= 0) {
+ UChar c = ut->chunkContents[i];
+ if (U16_IS_TRAIL(c) == FALSE) {
+ if (i <= ut->nativeIndexingLimit) {
+ result = ut->chunkNativeStart + i;
+ } else {
+ ut->chunkOffset = i;
+ result = ut->pFuncs->mapOffsetToNative(ut);
+ ut->chunkOffset++;
+ }
+ return result;
+ }
+ }
+
+ // If at the start of text, simply return 0.
+ if (ut->chunkOffset==0 && ut->chunkNativeStart==0) {
+ return 0;
+ }
+
+ // Harder, less common cases. We are at a chunk boundary, or on a surrogate.
+ // Keep it simple, use other functions to handle the edges.
+ //
+ utext_previous32(ut);
+ result = UTEXT_GETNATIVEINDEX(ut);
+ utext_next32(ut);
+ return result;
+}
+
+
+//
+// utext_current32. Get the UChar32 at the current position.
+// UText iteration position is always on a code point boundary,
+// never on the trail half of a surrogate pair.
+//
+U_DRAFT UChar32 U_EXPORT2
+utext_current32(UText *ut) {
+ UChar32 c;
+ if (ut->chunkOffset==ut->chunkLength) {
+ // Current position is just off the end of the chunk.
+ if (ut->pFuncs->access(ut, ut->chunkNativeLimit, TRUE) == FALSE) {
+ // Off the end of the text.
+ return U_SENTINEL;
+ }
+ }
+
+ c = ut->chunkContents[ut->chunkOffset];
+ if (U16_IS_LEAD(c) == FALSE) {
+ // Normal, non-supplementary case.
+ return c;
+ }
+
+ //
+ // Possible supplementary char.
+ //
+ UChar32 trail = 0;
+ UChar32 supplementaryC = c;
+ if ((ut->chunkOffset+1) < ut->chunkLength) {
+ // The trail surrogate is in the same chunk.
+ trail = ut->chunkContents[ut->chunkOffset+1];
+ } else {
+ // The trail surrogate is in a different chunk.
+ // Because we must maintain the iteration position, we need to switch forward
+ // into the new chunk, get the trail surrogate, then revert the chunk back to the
+ // original one.
+ // An edge case to be careful of: the entire text may end with an unpaired
+ // leading surrogate. The attempt to access the trail will fail, but
+ // the original position before the unpaired lead still needs to be restored.
+ int64_t nativePosition = ut->chunkNativeLimit;
+ int32_t originalOffset = ut->chunkOffset;
+ if (ut->pFuncs->access(ut, nativePosition, TRUE)) {
+ trail = ut->chunkContents[ut->chunkOffset];
+ }
+ UBool r = ut->pFuncs->access(ut, nativePosition, FALSE); // reverse iteration flag loads preceding chunk
+ U_ASSERT(r==TRUE);
+ ut->chunkOffset = originalOffset;
+ if(!r) {
+ return U_SENTINEL;
+ }
+ }
+
+ if (U16_IS_TRAIL(trail)) {
+ supplementaryC = U16_GET_SUPPLEMENTARY(c, trail);
+ }
+ return supplementaryC;
+
+}
+
+
+U_DRAFT UChar32 U_EXPORT2
+utext_char32At(UText *ut, int64_t nativeIndex) {
+ UChar32 c = U_SENTINEL;
+
+ // Fast path the common case.
+ if (nativeIndex>=ut->chunkNativeStart && nativeIndex < ut->chunkNativeStart + ut->nativeIndexingLimit) {
+ ut->chunkOffset = (int32_t)(nativeIndex - ut->chunkNativeStart);
+ c = ut->chunkContents[ut->chunkOffset];
+ if (U16_IS_SURROGATE(c) == FALSE) {
+ return c;
+ }
+ }
+
+
+ utext_setNativeIndex(ut, nativeIndex);
+ if (nativeIndex>=ut->chunkNativeStart && ut->chunkOffsetchunkLength) {
+ c = ut->chunkContents[ut->chunkOffset];
+ if (U16_IS_SURROGATE(c)) {
+ // For surrogates, let current32() deal with the complications
+ // of supplementaries that may span chunk boundaries.
+ c = utext_current32(ut);
+ }
+ }
+ return c;
+}
+
+
+U_DRAFT UChar32 U_EXPORT2
+utext_next32(UText *ut) {
+ UChar32 c;
+
+ if (ut->chunkOffset >= ut->chunkLength) {
+ if (ut->pFuncs->access(ut, ut->chunkNativeLimit, TRUE) == FALSE) {
+ return U_SENTINEL;
+ }
+ }
+
+ c = ut->chunkContents[ut->chunkOffset++];
+ if (U16_IS_LEAD(c) == FALSE) {
+ // Normal case, not supplementary.
+ // (A trail surrogate seen here is just returned as is, as a surrogate value.
+ // It cannot be part of a pair.)
+ return c;
+ }
+
+ if (ut->chunkOffset >= ut->chunkLength) {
+ if (ut->pFuncs->access(ut, ut->chunkNativeLimit, TRUE) == FALSE) {
+ // c is an unpaired lead surrogate at the end of the text.
+ // return it as it is.
+ return c;
+ }
+ }
+ UChar32 trail = ut->chunkContents[ut->chunkOffset];
+ if (U16_IS_TRAIL(trail) == FALSE) {
+ // c was an unpaired lead surrogate, not at the end of the text.
+ // return it as it is (unpaired). Iteration position is on the
+ // following character, possibly in the next chunk, where the
+ // trail surrogate would have been if it had existed.
+ return c;
+ }
+
+ UChar32 supplementary = U16_GET_SUPPLEMENTARY(c, trail);
+ ut->chunkOffset++; // move iteration position over the trail surrogate.
+ return supplementary;
+ }
+
+
+U_DRAFT UChar32 U_EXPORT2
+utext_previous32(UText *ut) {
+ UChar32 c;
+
+ if (ut->chunkOffset <= 0) {
+ if (ut->pFuncs->access(ut, ut->chunkNativeStart, FALSE) == FALSE) {
+ return U_SENTINEL;
+ }
+ }
+ ut->chunkOffset--;
+ c = ut->chunkContents[ut->chunkOffset];
+ if (U16_IS_TRAIL(c) == FALSE) {
+ // Normal case, not supplementary.
+ // (A lead surrogate seen here is just returned as is, as a surrogate value.
+ // It cannot be part of a pair.)
+ return c;
+ }
+
+ if (ut->chunkOffset <= 0) {
+ if (ut->pFuncs->access(ut, ut->chunkNativeStart, FALSE) == FALSE) {
+ // c is an unpaired trail surrogate at the start of the text.
+ // return it as it is.
+ return c;
+ }
+ }
+
+ UChar32 lead = ut->chunkContents[ut->chunkOffset-1];
+ if (U16_IS_LEAD(lead) == FALSE) {
+ // c was an unpaired trail surrogate, not at the end of the text.
+ // return it as it is (unpaired). Iteration position is at c
+ return c;
+ }
+
+ UChar32 supplementary = U16_GET_SUPPLEMENTARY(lead, c);
+ ut->chunkOffset--; // move iteration position over the lead surrogate.
+ return supplementary;
+}
+
+
+
+U_DRAFT UChar32 U_EXPORT2
+utext_next32From(UText *ut, int64_t index) {
+ UChar32 c = U_SENTINEL;
+
+ if(indexchunkNativeStart || index>=ut->chunkNativeLimit) {
+ // Desired position is outside of the current chunk.
+ if(!ut->pFuncs->access(ut, index, TRUE)) {
+ // no chunk available here
+ return U_SENTINEL;
+ }
+ } else if (index - ut->chunkNativeStart <= (int64_t)ut->nativeIndexingLimit) {
+ // Desired position is in chunk, with direct 1:1 native to UTF16 indexing
+ ut->chunkOffset = (int32_t)(index - ut->chunkNativeStart);
+ } else {
+ // Desired position is in chunk, with non-UTF16 indexing.
+ ut->chunkOffset = ut->pFuncs->mapNativeIndexToUTF16(ut, index);
+ }
+
+ c = ut->chunkContents[ut->chunkOffset++];
+ if (U16_IS_SURROGATE(c)) {
+ // Surrogates. Many edge cases. Use other functions that already
+ // deal with the problems.
+ utext_setNativeIndex(ut, index);
+ c = utext_next32(ut);
+ }
+ return c;
+}
+
+
+U_DRAFT UChar32 U_EXPORT2
+utext_previous32From(UText *ut, int64_t index) {
+ //
+ // Return the character preceding the specified index.
+ // Leave the iteration position at the start of the character that was returned.
+ //
+ UChar32 cPrev; // The character preceding cCurr, which is what we will return.
+
+ // Address the chunk containg the position preceding the incoming index
+ // A tricky edge case:
+ // We try to test the requested native index against the chunkNativeStart to determine
+ // whether the character preceding the one at the index is in the current chunk.
+ // BUT, this test can fail with UTF-8 (or any other multibyte encoding), when the
+ // requested index is on something other than the first position of the first char.
+ //
+ if(index<=ut->chunkNativeStart || index>ut->chunkNativeLimit) {
+ // Requested native index is outside of the current chunk.
+ if(!ut->pFuncs->access(ut, index, FALSE)) {
+ // no chunk available here
+ return U_SENTINEL;
+ }
+ } else if(index - ut->chunkNativeStart <= (int64_t)ut->nativeIndexingLimit) {
+ // Direct UTF-16 indexing.
+ ut->chunkOffset = (int32_t)(index - ut->chunkNativeStart);
+ } else {
+ ut->chunkOffset=ut->pFuncs->mapNativeIndexToUTF16(ut, index);
+ if (ut->chunkOffset==0 && !ut->pFuncs->access(ut, index, FALSE)) {
+ // no chunk available here
+ return U_SENTINEL;
+ }
+ }
+
+ //
+ // Simple case with no surrogates.
+ //
+ ut->chunkOffset--;
+ cPrev = ut->chunkContents[ut->chunkOffset];
+
+ if (U16_IS_SURROGATE(cPrev)) {
+ // Possible supplementary. Many edge cases.
+ // Let other functions do the heavy lifting.
+ utext_setNativeIndex(ut, index);
+ cPrev = utext_previous32(ut);
+ }
+ return cPrev;
+}
+
+
+U_DRAFT int32_t U_EXPORT2
+utext_extract(UText *ut,
+ int64_t start, int64_t limit,
+ UChar *dest, int32_t destCapacity,
+ UErrorCode *status) {
+ return ut->pFuncs->extract(ut, start, limit, dest, destCapacity, status);
+ }
+
+
+
+U_DRAFT UBool U_EXPORT2
+utext_equals(const UText *a, const UText *b) {
+ if (a==NULL || b==NULL ||
+ a->magic != UTEXT_MAGIC ||
+ b->magic != UTEXT_MAGIC) {
+ // Null or invalid arguments don't compare equal to anything.
+ return FALSE;
+ }
+
+ if (a->pFuncs != b->pFuncs) {
+ // Different types of text providers.
+ return FALSE;
+ }
+
+ if (a->context != b->context) {
+ // Different sources (different strings)
+ return FALSE;
+ }
+ if (utext_getNativeIndex(a) != utext_getNativeIndex(b)) {
+ // Different current position in the string.
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+U_DRAFT UBool U_EXPORT2
+utext_isWritable(const UText *ut)
+{
+ UBool b = (ut->providerProperties & I32_FLAG(UTEXT_PROVIDER_WRITABLE)) != 0;
+ return b;
+}
+
+
+U_DRAFT void U_EXPORT2
+utext_freeze(UText *ut) {
+ // Zero out the WRITABLE flag.
+ ut->providerProperties &= ~(I32_FLAG(UTEXT_PROVIDER_WRITABLE));
+}
+
+
+U_DRAFT UBool U_EXPORT2
+utext_hasMetaData(const UText *ut)
+{
+ UBool b = (ut->providerProperties & I32_FLAG(UTEXT_PROVIDER_HAS_META_DATA)) != 0;
+ return b;
+}
+
+
+
+U_DRAFT int32_t U_EXPORT2
+utext_replace(UText *ut,
+ int64_t nativeStart, int64_t nativeLimit,
+ const UChar *replacementText, int32_t replacementLength,
+ UErrorCode *status)
+{
+ if (U_FAILURE(*status)) {
+ return 0;
+ }
+ if ((ut->providerProperties & I32_FLAG(UTEXT_PROVIDER_WRITABLE)) == 0) {
+ *status = U_NO_WRITE_PERMISSION;
+ return 0;
+ }
+ int32_t i = ut->pFuncs->replace(ut, nativeStart, nativeLimit, replacementText, replacementLength, status);
+ return i;
+}
+
+U_DRAFT void U_EXPORT2
+utext_copy(UText *ut,
+ int64_t nativeStart, int64_t nativeLimit,
+ int64_t destIndex,
+ UBool move,
+ UErrorCode *status)
+{
+ if (U_FAILURE(*status)) {
+ return;
+ }
+ if ((ut->providerProperties & I32_FLAG(UTEXT_PROVIDER_WRITABLE)) == 0) {
+ *status = U_NO_WRITE_PERMISSION;
+ return;
+ }
+ ut->pFuncs->copy(ut, nativeStart, nativeLimit, destIndex, move, status);
+}
+
+
+
+U_DRAFT UText * U_EXPORT2
+utext_clone(UText *dest, const UText *src, UBool deep, UBool readOnly, UErrorCode *status) {
+ UText *result;
+ result = src->pFuncs->clone(dest, src, deep, status);
+ if (readOnly) {
+ utext_freeze(result);
+ }
+ return result;
+}
+
+
+
+//------------------------------------------------------------------------------
+//
+// UText common functions implementation
+//
+//------------------------------------------------------------------------------
+
+//
+// UText.flags bit definitions
+//
+enum {
+ UTEXT_HEAP_ALLOCATED = 1, // 1 if ICU has allocated this UText struct on the heap.
+ // 0 if caller provided storage for the UText.
+
+ UTEXT_EXTRA_HEAP_ALLOCATED = 2, // 1 if ICU has allocated extra storage as a separate
+ // heap block.
+ // 0 if there is no separate allocation. Either no extra
+ // storage was requested, or it is appended to the end
+ // of the main UText storage.
+
+ UTEXT_OPEN = 4 // 1 if this UText is currently open
+ // 0 if this UText is not open.
+};
+
+
+//
+// Extended form of a UText. The purpose is to aid in computing the total size required
+// when a provider asks for a UText to be allocated with extra storage.
+
+struct ExtendedUText {
+ UText ut;
+ UAlignedMemory extension;
+};
+
+static const UText emptyText = UTEXT_INITIALIZER;
+
+U_DRAFT UText * U_EXPORT2
+utext_setup(UText *ut, int32_t extraSpace, UErrorCode *status) {
+ if (U_FAILURE(*status)) {
+ return ut;
+ }
+
+ if (ut == NULL) {
+ // We need to heap-allocate storage for the new UText
+ int32_t spaceRequired = sizeof(UText);
+ if (extraSpace > 0) {
+ spaceRequired = sizeof(ExtendedUText) + extraSpace - sizeof(UAlignedMemory);
+ }
+ ut = (UText *)uprv_malloc(spaceRequired);
+ if (ut == NULL) {
+ *status = U_MEMORY_ALLOCATION_ERROR;
+ } else {
+ *ut = emptyText;
+ ut->flags |= UTEXT_HEAP_ALLOCATED;
+ if (spaceRequired>0) {
+ ut->extraSize = extraSpace;
+ ut->pExtra = &((ExtendedUText *)ut)->extension;
+ uprv_memset(ut->pExtra, 0, extraSpace); // Purify whines about copying untouched extra [buffer]
+ // space when cloning, so init it now.
+ }
+ }
+ } else {
+ // We have been supplied with an already existing UText.
+ // Verify that it really appears to be a UText.
+ if (ut->magic != UTEXT_MAGIC) {
+ *status = U_ILLEGAL_ARGUMENT_ERROR;
+ return ut;
+ }
+ // If the ut is already open and there's a provider supplied close
+ // function, call it.
+ if ((ut->flags & UTEXT_OPEN) && ut->pFuncs->close != NULL) {
+ ut->pFuncs->close(ut);
+ }
+ ut->flags &= ~UTEXT_OPEN;
+
+ // If extra space was requested by our caller, check whether
+ // sufficient already exists, and allocate new if needed.
+ if (extraSpace > ut->extraSize) {
+ // Need more space. If there is existing separately allocated space,
+ // delete it first, then allocate new space.
+ if (ut->flags & UTEXT_EXTRA_HEAP_ALLOCATED) {
+ uprv_free(ut->pExtra);
+ ut->extraSize = 0;
+ }
+ ut->pExtra = uprv_malloc(extraSpace);
+ if (ut->pExtra == NULL) {
+ *status = U_MEMORY_ALLOCATION_ERROR;
+ } else {
+ ut->extraSize = extraSpace;
+ ut->flags |= UTEXT_EXTRA_HEAP_ALLOCATED;
+ uprv_memset(ut->pExtra, 0, extraSpace);
+ }
+ }
+ }
+ if (U_SUCCESS(*status)) {
+ ut->flags |= UTEXT_OPEN;
+
+ // Initialize all remaining fields of the UText.
+ //
+ ut->context = NULL;
+ ut->chunkContents = NULL;
+ ut->p = NULL;
+ ut->q = NULL;
+ ut->r = NULL;
+ ut->a = 0;
+ ut->b = 0;
+ ut->c = 0;
+ ut->chunkOffset = 0;
+ ut->chunkLength = 0;
+ ut->chunkNativeStart = 0;
+ ut->chunkNativeLimit = 0;
+ ut->nativeIndexingLimit = 0;
+ ut->providerProperties = 0;
+ ut->privA = 0;
+ ut->privB = 0;
+ ut->privC = 0;
+ ut->privP = NULL;
+ }
+ return ut;
+}
+
+
+U_DRAFT UText * U_EXPORT2
+utext_close(UText *ut) {
+ if (ut==NULL ||
+ ut->magic != UTEXT_MAGIC ||
+ (ut->flags & UTEXT_OPEN) == 0)
+ {
+ // The supplied ut is not an open UText.
+ // Do nothing.
+ return ut;
+ }
+
+ // If the provider gave us a close function, call it now.
+ // This will clean up anything allocated specifically by the provider.
+ if (ut->pFuncs->close != NULL) {
+ ut->pFuncs->close(ut);
+ }
+ ut->flags &= ~UTEXT_OPEN;
+
+ // If we (the framework) allocated the UText or subsidiary storage,
+ // delete it.
+ if (ut->flags & UTEXT_EXTRA_HEAP_ALLOCATED) {
+ uprv_free(ut->pExtra);
+ ut->pExtra = NULL;
+ ut->flags &= ~UTEXT_EXTRA_HEAP_ALLOCATED;
+ ut->extraSize = 0;
+ }
+
+ // Zero out function table of the closed UText. This is a defensive move,
+ // inteded to cause applications that inadvertantly use a closed
+ // utext to crash with null pointer errors.
+ ut->pFuncs = NULL;
+
+ if (ut->flags & UTEXT_HEAP_ALLOCATED) {
+ // This UText was allocated by UText setup. We need to free it.
+ // Clear magic, so we can detect if the user messes up and immediately
+ // tries to reopen another UText using the deleted storage.
+ ut->magic = 0;
+ uprv_free(ut);
+ ut = NULL;
+ }
+ return ut;
+}
+
+
+
+
+//
+// invalidateChunk Reset a chunk to have no contents, so that the next call
+// to access will cause new data to load.
+// This is needed when copy/move/replace operate directly on the
+// backing text, potentially putting it out of sync with the
+// contents in the chunk.
+//
+static void
+invalidateChunk(UText *ut) {
+ ut->chunkLength = 0;
+ ut->chunkNativeLimit = 0;
+ ut->chunkNativeStart = 0;
+ ut->chunkOffset = 0;
+ ut->nativeIndexingLimit = 0;
+}
+
+//
+// pinIndex Do range pinning on a native index parameter.
+// 64 bit pinning is done in place.
+// 32 bit truncated result is returned as a convenience for
+// use in providers that don't need 64 bits.
+static int32_t
+pinIndex(int64_t &index, int64_t limit) {
+ if (index<0) {
+ index = 0;
+ } else if (index > limit) {
+ index = limit;
+ }
+ return (int32_t)index;
+}
+
+
+U_CDECL_BEGIN
+
+//
+// Pointer relocation function,
+// a utility used by shallow clone.
+// Adjust a pointer that refers to something within one UText (the source)
+// to refer to the same relative offset within a another UText (the target)
+//
+static void adjustPointer(UText *dest, const void **destPtr, const UText *src) {
+ // convert all pointers to (char *) so that byte address arithmetic will work.
+ char *dptr = (char *)*destPtr;
+ char *dUText = (char *)dest;
+ char *sUText = (char *)src;
+
+ if (dptr >= (char *)src->pExtra && dptr < ((char*)src->pExtra)+src->extraSize) {
+ // target ptr was to something within the src UText's pExtra storage.
+ // relocate it into the target UText's pExtra region.
+ *destPtr = ((char *)dest->pExtra) + (dptr - (char *)src->pExtra);
+ } else if (dptr>=sUText && dptr < sUText+src->sizeOfStruct) {
+ // target ptr was pointing to somewhere within the source UText itself.
+ // Move it to the same offset within the target UText.
+ *destPtr = dUText + (dptr-sUText);
+ }
+}
+
+
+//
+// Clone. This is a generic copy-the-utext-by-value clone function that can be
+// used as-is with some utext types, and as a helper by other clones.
+//
+static UText * U_CALLCONV
+shallowTextClone(UText * dest, const UText * src, UErrorCode * status) {
+ if (U_FAILURE(*status)) {
+ return NULL;
+ }
+ int32_t srcExtraSize = src->extraSize;
+
+ //
+ // Use the generic text_setup to allocate storage if required.
+ //
+ dest = utext_setup(dest, srcExtraSize, status);
+ if (U_FAILURE(*status)) {
+ return dest;
+ }
+
+ //
+ // flags (how the UText was allocated) and the pointer to the
+ // extra storage must retain the values in the cloned utext that
+ // were set up by utext_setup. Save them separately before
+ // copying the whole struct.
+ //
+ void *destExtra = dest->pExtra;
+ int32_t flags = dest->flags;
+
+
+ //
+ // Copy the whole UText struct by value.
+ // Any "Extra" storage is copied also.
+ //
+ int sizeToCopy = src->sizeOfStruct;
+ if (sizeToCopy > dest->sizeOfStruct) {
+ sizeToCopy = dest->sizeOfStruct;
+ }
+ uprv_memcpy(dest, src, sizeToCopy);
+ dest->pExtra = destExtra;
+ dest->flags = flags;
+ if (srcExtraSize > 0) {
+ uprv_memcpy(dest->pExtra, src->pExtra, srcExtraSize);
+ }
+
+ //
+ // Relocate any pointers in the target that refer to the UText itself
+ // to point to the cloned copy rather than the original source.
+ //
+ adjustPointer(dest, &dest->context, src);
+ adjustPointer(dest, &dest->p, src);
+ adjustPointer(dest, &dest->q, src);
+ adjustPointer(dest, &dest->r, src);
+
+ return dest;
+}
+
+
+U_CDECL_END
+
+
+
+//------------------------------------------------------------------------------
+//
+// UText implementation for UTF-8 char * strings (read-only)
+// Limitation: string length must be <= 0x7fffffff in length.
+// (length must for in an int32_t variable)
+//
+// Use of UText data members:
+// context pointer to UTF-8 string
+// utext.b is the input string length (bytes).
+// utext.c Length scanned so far in string
+// (for optimizing finding length of zero terminated strings.)
+// utext.p pointer to the current buffer
+// utext.q pointer to the other buffer.
+//
+//------------------------------------------------------------------------------
+
+// Chunk size.
+// Must be less than 85, because of byte mapping from UChar indexes to native indexes.
+// Worst case is three native bytes to one UChar. (Supplemenaries are 4 native bytes
+// to two UChars.)
+//
+enum { UTF8_TEXT_CHUNK_SIZE=32 };
+
+//
+// UTF8Buf Two of these structs will be set up in the UText's extra allocated space.
+// Each contains the UChar chunk buffer, the to and from native maps, and
+// header info.
+//
+// because backwards iteration fills the buffers starting at the end and
+// working towards the front, the filled part of the buffers may not begin
+// at the start of the available storage for the buffers.
+//
+// Buffer size is one bigger than the specified UTF8_TEXT_CHUNK_SIZE to allow for
+// the last character added being a supplementary, and thus requiring a surrogate
+// pair. Doing this is simpler than checking for the edge case.
+//
+
+struct UTF8Buf {
+ int32_t bufNativeStart; // Native index of first char in UChar buf
+ int32_t bufNativeLimit; // Native index following last char in buf.
+ int32_t bufStartIdx; // First filled position in buf.
+ int32_t bufLimitIdx; // Limit of filled range in buf.
+ int32_t bufNILimit; // Limit of native indexing part of buf
+ int32_t toUCharsMapStart; // Native index corresponding to
+ // mapToUChars[0].
+ // Set to bufNativeStart when filling forwards.
+ // Set to computed value when filling backwards.
+
+ UChar buf[UTF8_TEXT_CHUNK_SIZE+4]; // The UChar buffer. Requires one extra position beyond the
+ // the chunk size, to allow for surrogate at the end.
+ // Length must be identical to mapToNative array, below,
+ // because of the way indexing works when the array is
+ // filled backwards during a reverse iteration. Thus,
+ // the additional extra size.
+ uint8_t mapToNative[UTF8_TEXT_CHUNK_SIZE+4]; // map UChar index in buf to
+ // native offset from bufNativeStart.
+ // Requires two extra slots,
+ // one for a supplementary starting in the last normal position,
+ // and one for an entry for the buffer limit position.
+ uint8_t mapToUChars[UTF8_TEXT_CHUNK_SIZE*3+6]; // Map native offset from bufNativeStart to
+ // correspoding offset in filled part of buf.
+ int32_t align;
+};
+
+U_CDECL_BEGIN
+
+//
+// utf8TextLength
+//
+// Get the length of the string. If we don't already know it,
+// we'll need to scan for the trailing nul.
+//
+static int64_t U_CALLCONV
+utf8TextLength(UText *ut) {
+ if (ut->b < 0) {
+ // Zero terminated string, and we haven't scanned to the end yet.
+ // Scan it now.
+ const char *r = (const char *)ut->context + ut->c;
+ while (*r != 0) {
+ r++;
+ }
+ if ((r - (const char *)ut->context) < 0x7fffffff) {
+ ut->b = (int32_t)(r - (const char *)ut->context);
+ } else {
+ // Actual string was bigger (more than 2 gig) than we
+ // can handle. Clip it to 2 GB.
+ ut->b = 0x7fffffff;
+ }
+ ut->providerProperties &= ~I32_FLAG(UTEXT_PROVIDER_LENGTH_IS_EXPENSIVE);
+ }
+ return ut->b;
+}
+
+
+
+
+
+
+static UBool U_CALLCONV
+utf8TextAccess(UText *ut, int64_t index, UBool forward) {
+ //
+ // Apologies to those who are allergic to goto statements.
+ // Consider each goto to a labelled block to be the equivalent of
+ // call the named block as if it were a function();
+ // return;
+ //
+ const uint8_t *s8=(const uint8_t *)ut->context;
+ UTF8Buf *u8b = NULL;
+ int32_t length = ut->b; // Length of original utf-8
+ int32_t ix= (int32_t)index; // Requested index, trimmed to 32 bits.
+ int32_t mapIndex = 0;
+ if (index<0) {
+ ix=0;
+ } else if (index > 0x7fffffff) {
+ // Strings with 64 bit lengths not supported by this UTF-8 provider.
+ ix = 0x7fffffff;
+ }
+
+ // Pin requested index to the string length.
+ if (ix>length) {
+ if (length>=0) {
+ ix=length;
+ } else if (ix>ut->c) {
+ // Zero terminated string, and requested index is beyond
+ // the region that has already been scanned.
+ // Scan up to either the end of the string or to the
+ // requested position, whichever comes first.
+ while (ut->cc]!=0) {
+ ut->c++;
+ }
+ // TODO: support for null terminated string length > 32 bits.
+ if (s8[ut->c] == 0) {
+ // We just found the actual length of the string.
+ // Trim the requested index back to that.
+ ix = ut->c;
+ ut->b = ut->c;
+ length = ut->c;
+ ut->providerProperties &= ~I32_FLAG(UTEXT_PROVIDER_LENGTH_IS_EXPENSIVE);
+ }
+ }
+ }
+
+ //
+ // Dispatch to the appropriate action for a forward iteration request.
+ //
+ if (forward) {
+ if (ix==ut->chunkNativeLimit) {
+ // Check for normal sequential iteration cases first.
+ if (ix==length) {
+ // Just reached end of string
+ // Don't swap buffers, but do set the
+ // current buffer position.
+ ut->chunkOffset = ut->chunkLength;
+ return FALSE;
+ } else {
+ // End of current buffer.
+ // check whether other buffer already has what we need.
+ UTF8Buf *altB = (UTF8Buf *)ut->q;
+ if (ix>=altB->bufNativeStart && ixbufNativeLimit) {
+ goto swapBuffers;
+ }
+ }
+ }
+
+ // A random access. Desired index could be in either or niether buf.
+ // For optimizing the order of testing, first check for the index
+ // being in the other buffer. This will be the case for uses that
+ // move back and forth over a fairly limited range
+ {
+ u8b = (UTF8Buf *)ut->q; // the alternate buffer
+ if (ix>=u8b->bufNativeStart && ixbufNativeLimit) {
+ // Requested index is in the other buffer.
+ goto swapBuffers;
+ }
+ if (ix == length) {
+ // Requested index is end-of-string.
+ // (this is the case of randomly seeking to the end.
+ // The case of iterating off the end is handled earlier.)
+ if (ix == ut->chunkNativeLimit) {
+ // Current buffer extends up to the end of the string.
+ // Leave it as the current buffer.
+ ut->chunkOffset = ut->chunkLength;
+ return FALSE;
+ }
+ if (ix == u8b->bufNativeLimit) {
+ // Alternate buffer extends to the end of string.
+ // Swap it in as the current buffer.
+ goto swapBuffersAndFail;
+ }
+
+ // Neither existing buffer extends to the end of the string.
+ goto makeStubBuffer;
+ }
+
+ if (ixchunkNativeStart || ix>=ut->chunkNativeLimit) {
+ // Requested index is in neither buffer.
+ goto fillForward;
+ }
+
+ // Requested index is in this buffer.
+ u8b = (UTF8Buf *)ut->p; // the current buffer
+ mapIndex = ix - u8b->toUCharsMapStart;
+ ut->chunkOffset = u8b->mapToUChars[mapIndex] - u8b->bufStartIdx;
+ return TRUE;
+
+ }
+ }
+
+
+ //
+ // Dispatch to the appropriate action for a
+ // Backwards Diretion iteration request.
+ //
+ if (ix==ut->chunkNativeStart) {
+ // Check for normal sequential iteration cases first.
+ if (ix==0) {
+ // Just reached the start of string
+ // Don't swap buffers, but do set the
+ // current buffer position.
+ ut->chunkOffset = 0;
+ return FALSE;
+ } else {
+ // Start of current buffer.
+ // check whether other buffer already has what we need.
+ UTF8Buf *altB = (UTF8Buf *)ut->q;
+ if (ix>altB->bufNativeStart && ix<=altB->bufNativeLimit) {
+ goto swapBuffers;
+ }
+ }
+ }
+
+ // A random access. Desired index could be in either or niether buf.
+ // For optimizing the order of testing,
+ // Most likely case: in the other buffer.
+ // Second most likely: in neither buffer.
+ // Unlikely, but must work: in the current buffer.
+ u8b = (UTF8Buf *)ut->q; // the alternate buffer
+ if (ix>u8b->bufNativeStart && ix<=u8b->bufNativeLimit) {
+ // Requested index is in the other buffer.
+ goto swapBuffers;
+ }
+ // Requested index is start-of-string.
+ // (this is the case of randomly seeking to the start.
+ // The case of iterating off the start is handled earlier.)
+ if (ix==0) {
+ if (u8b->bufNativeStart==0) {
+ // Alternate buffer contains the data for the start string.
+ // Make it be the current buffer.
+ goto swapBuffersAndFail;
+ } else {
+ // Request for data before the start of string,
+ // neither buffer is usable.
+ // set up a zero-length buffer.
+ goto makeStubBuffer;
+ }
+ }
+
+ if (ix<=ut->chunkNativeStart || ix>ut->chunkNativeLimit) {
+ // Requested index is in neither buffer.
+ goto fillReverse;
+ }
+
+ // Requested index is in this buffer.
+ // Set the utf16 buffer index.
+ u8b = (UTF8Buf *)ut->p;
+ mapIndex = ix - u8b->toUCharsMapStart;
+ ut->chunkOffset = u8b->mapToUChars[mapIndex] - u8b->bufStartIdx;
+ if (ut->chunkOffset==0) {
+ // This occurs when the first character in the text is
+ // a multi-byte UTF-8 char, and the requested index is to
+ // one of the trailing bytes. Because there is no preceding ,
+ // character, this access fails. We can't pick up on the
+ // situation sooner because the requested index is not zero.
+ return FALSE;
+ } else {
+ return TRUE;
+ }
+
+
+
+swapBuffers:
+ // The alternate buffer (ut->q) has the string data that was requested.
+ // Swap the primary and alternate buffers, and set the
+ // chunk index into the new primary buffer.
+ {
+ u8b = (UTF8Buf *)ut->q;
+ ut->q = ut->p;
+ ut->p = u8b;
+ ut->chunkContents = &u8b->buf[u8b->bufStartIdx];
+ ut->chunkLength = u8b->bufLimitIdx - u8b->bufStartIdx;
+ ut->chunkNativeStart = u8b->bufNativeStart;
+ ut->chunkNativeLimit = u8b->bufNativeLimit;
+ ut->nativeIndexingLimit = u8b->bufNILimit;
+
+ // Index into the (now current) chunk
+ // Use the map to set the chunk index. It's more trouble than it's worth
+ // to check whether native indexing can be used.
+ U_ASSERT(ix>=u8b->bufNativeStart);
+ U_ASSERT(ix<=u8b->bufNativeLimit);
+ mapIndex = ix - u8b->toUCharsMapStart;
+ U_ASSERT(mapIndex>=0);
+ U_ASSERT(mapIndex<(int32_t)sizeof(u8b->mapToUChars));
+ ut->chunkOffset = u8b->mapToUChars[mapIndex] - u8b->bufStartIdx;
+
+ return TRUE;
+ }
+
+
+ swapBuffersAndFail:
+ // We got a request for either the start or end of the string,
+ // with iteration continuing in the out-of-bounds direction.
+ // The alternate buffer already contains the data up to the
+ // start/end.
+ // Swap the buffers, then return failure, indicating that we couldn't
+ // make things correct for continuing the iteration in the requested
+ // direction. The position & buffer are correct should the
+ // user decide to iterate in the opposite direction.
+ u8b = (UTF8Buf *)ut->q;
+ ut->q = ut->p;
+ ut->p = u8b;
+ ut->chunkContents = &u8b->buf[u8b->bufStartIdx];
+ ut->chunkLength = u8b->bufLimitIdx - u8b->bufStartIdx;
+ ut->chunkNativeStart = u8b->bufNativeStart;
+ ut->chunkNativeLimit = u8b->bufNativeLimit;
+ ut->nativeIndexingLimit = u8b->bufNILimit;
+
+ // Index into the (now current) chunk
+ // For this function (swapBuffersAndFail), the requested index
+ // will always be at either the start or end of the chunk.
+ if (ix==u8b->bufNativeLimit) {
+ ut->chunkOffset = ut->chunkLength;
+ } else {
+ ut->chunkOffset = 0;
+ U_ASSERT(ix == u8b->bufNativeStart);
+ }
+ return FALSE;
+
+makeStubBuffer:
+ // The user has done a seek/access past the start or end
+ // of the string. Rather than loading data that is likely
+ // to never be used, just set up a zero-length buffer at
+ // the position.
+ u8b = (UTF8Buf *)ut->q;
+ u8b->bufNativeStart = ix;
+ u8b->bufNativeLimit = ix;
+ u8b->bufStartIdx = 0;
+ u8b->bufLimitIdx = 0;
+ u8b->bufNILimit = 0;
+ u8b->toUCharsMapStart = ix;
+ u8b->mapToNative[0] = 0;
+ u8b->mapToUChars[0] = 0;
+ goto swapBuffersAndFail;
+
+
+
+fillForward:
+ {
+ // Move the incoming index to a code point boundary.
+ U8_SET_CP_START(s8, 0, ix);
+
+ // Swap the UText buffers.
+ // We want to fill what was previously the alternate buffer,
+ // and make what was the current buffer be the new alternate.
+ UTF8Buf *u8b = (UTF8Buf *)ut->q;
+ ut->q = ut->p;
+ ut->p = u8b;
+
+ int32_t strLen = ut->b;
+ UBool nulTerminated = FALSE;
+ if (strLen < 0) {
+ strLen = 0x7fffffff;
+ nulTerminated = TRUE;
+ }
+
+ UChar *buf = u8b->buf;
+ uint8_t *mapToNative = u8b->mapToNative;
+ uint8_t *mapToUChars = u8b->mapToUChars;
+ int32_t destIx = 0;
+ int32_t srcIx = ix;
+ UBool seenNonAscii = FALSE;
+ UChar32 c;
+
+ // Fill the chunk buffer and mapping arrays.
+ while (destIx0 && c<0x80) {
+ // Special case ASCII range for speed.
+ // zero is excluded to simplify bounds checking.
+ buf[destIx] = c;
+ mapToNative[destIx] = srcIx - ix;
+ mapToUChars[srcIx-ix] = destIx;
+ srcIx++;
+ destIx++;
+ } else {
+ // General case, handle everything.
+ if (seenNonAscii == FALSE) {
+ seenNonAscii = TRUE;
+ u8b->bufNILimit = destIx;
+ }
+
+ int32_t cIx = srcIx;
+ int32_t dIx = destIx;
+ int32_t dIxSaved = destIx;
+ U8_NEXT(s8, srcIx, strLen, c);
+ if (c==0 && nulTerminated) {
+ srcIx--;
+ break;
+ }
+ if (c<0) {
+ // Illegal UTF-8. Replace with sub character.
+ c = 0x0fffd;
+ }
+
+ U16_APPEND_UNSAFE(buf, destIx, c);
+ do {
+ mapToNative[dIx++] = cIx - ix;
+ } while (dIx < destIx);
+
+ do {
+ mapToUChars[cIx++ - ix] = dIxSaved;
+ } while (cIx < srcIx);
+ }
+ if (srcIx>=strLen) {
+ break;
+ }
+
+ }
+
+ // store Native <--> Chunk Map entries for the end of the buffer.
+ // There is no actual character here, but the index position is valid.
+ mapToNative[destIx] = srcIx - ix;
+ mapToUChars[srcIx - ix] = destIx;
+
+ // fill in Buffer descriptor
+ u8b->bufNativeStart = ix;
+ u8b->bufNativeLimit = srcIx;
+ u8b->bufStartIdx = 0;
+ u8b->bufLimitIdx = destIx;
+ if (seenNonAscii == FALSE) {
+ u8b->bufNILimit = destIx;
+ }
+ u8b->toUCharsMapStart = u8b->bufNativeStart;
+
+ // Set UText chunk to refer to this buffer.
+ ut->chunkContents = buf;
+ ut->chunkOffset = 0;
+ ut->chunkLength = u8b->bufLimitIdx;
+ ut->chunkNativeStart = u8b->bufNativeStart;
+ ut->chunkNativeLimit = u8b->bufNativeLimit;
+ ut->nativeIndexingLimit = u8b->bufNILimit;
+
+ // For zero terminated strings, keep track of the maximum point
+ // scanned so far.
+ if (nulTerminated && srcIx>ut->c) {
+ ut->c = srcIx;
+ if (c==0) {
+ // We scanned to the end.
+ // Remember the actual length.
+ ut->b = srcIx;
+ ut->providerProperties &= ~I32_FLAG(UTEXT_PROVIDER_LENGTH_IS_EXPENSIVE);
+ }
+ }
+ return TRUE;
+ }
+
+
+fillReverse:
+ {
+ // Move the incoming index to a code point boundary.
+ // Can only do this if the incoming index is somewhere in the interior of the string.
+ // If index is at the end, there is no character there to look at.
+ if (ix != ut->b) {
+ U8_SET_CP_START(s8, 0, ix);
+ }
+
+ // Swap the UText buffers.
+ // We want to fill what was previously the alternate buffer,
+ // and make what was the current buffer be the new alternate.
+ UTF8Buf *u8b = (UTF8Buf *)ut->q;
+ ut->q = ut->p;
+ ut->p = u8b;
+
+ UChar *buf = u8b->buf;
+ uint8_t *mapToNative = u8b->mapToNative;
+ uint8_t *mapToUChars = u8b->mapToUChars;
+ int32_t toUCharsMapStart = ix - (UTF8_TEXT_CHUNK_SIZE*3 + 1);
+ int32_t destIx = UTF8_TEXT_CHUNK_SIZE+2; // Start in the overflow region
+ // at end of buffer to leave room
+ // for a surrogate pair at the
+ // buffer start.
+ int32_t srcIx = ix;
+ int32_t bufNILimit = destIx;
+ UChar32 c;
+
+ // Map to/from Native Indexes, fill in for the position at the end of
+ // the buffer.
+ //
+ mapToNative[destIx] = srcIx - toUCharsMapStart;
+ mapToUChars[srcIx - toUCharsMapStart] = destIx;
+
+ // Fill the chunk buffer
+ // Work backwards, filling from the end of the buffer towards the front.
+ //
+ while (destIx>2 && (srcIx - toUCharsMapStart > 5) && (srcIx > 0)) {
+ srcIx--;
+ destIx--;
+
+ // Get last byte of the UTF-8 character
+ c = s8[srcIx];
+ if (c<0x80) {
+ // Special case ASCII range for speed.
+ buf[destIx] = c;
+ mapToUChars[srcIx - toUCharsMapStart] = destIx;
+ mapToNative[destIx] = srcIx - toUCharsMapStart;
+ } else {
+ // General case, handle everything non-ASCII.
+
+ int32_t sIx = srcIx; // ix of last byte of multi-byte u8 char
+
+ // Get the full character from the UTF8 string.
+ // use code derived from tbe macros in utf.8
+ // Leaves srcIx pointing at the first byte of the UTF-8 char.
+ //
+ if (c<=0xbf) {
+ c=utf8_prevCharSafeBody(s8, 0, &srcIx, c, -1);
+ // leaves srcIx at first byte of the multi-byte char.
+ } else {
+ c=0x0fffd;
+ }
+
+ // Store the character in UTF-16 buffer.
+ if (c<0x10000) {
+ buf[destIx] = c;
+ mapToNative[destIx] = srcIx - toUCharsMapStart;
+ } else {
+ buf[destIx] = U16_TRAIL(c);
+ mapToNative[destIx] = srcIx - toUCharsMapStart;
+ buf[--destIx] = U16_LEAD(c);
+ mapToNative[destIx] = srcIx - toUCharsMapStart;
+ }
+
+ // Fill in the map from native indexes to UChars buf index.
+ do {
+ mapToUChars[sIx-- - toUCharsMapStart] = destIx;
+ } while (sIx >= srcIx);
+
+ // Set native indexing limit to be the current position.
+ // We are processing a non-ascii, non-native-indexing char now;
+ // the limit will be here if the rest of the chars to be
+ // added to this buffer are ascii.
+ bufNILimit = destIx;
+ }
+ }
+ u8b->bufNativeStart = srcIx;
+ u8b->bufNativeLimit = ix;
+ u8b->bufStartIdx = destIx;
+ u8b->bufLimitIdx = UTF8_TEXT_CHUNK_SIZE+2;
+ u8b->bufNILimit = bufNILimit - u8b->bufStartIdx;
+ u8b->toUCharsMapStart = toUCharsMapStart;
+
+ ut->chunkContents = &buf[u8b->bufStartIdx];
+ ut->chunkLength = u8b->bufLimitIdx - u8b->bufStartIdx;
+ ut->chunkOffset = ut->chunkLength;
+ ut->chunkNativeStart = u8b->bufNativeStart;
+ ut->chunkNativeLimit = u8b->bufNativeLimit;
+ ut->nativeIndexingLimit = u8b->bufNILimit;
+ return TRUE;
+ }
+
+}
+
+
+
+//
+// This is a slightly modified copy of u_strFromUTF8,
+// Inserts a Replacement Char rather than failing on invalid UTF-8
+// Removes unnecessary features.
+//
+static UChar*
+utext_strFromUTF8(UChar *dest,
+ int32_t destCapacity,
+ int32_t *pDestLength,
+ const char* src,
+ int32_t srcLength, // required. NUL terminated not supported.
+ UErrorCode *pErrorCode
+ )
+{
+
+ UChar *pDest = dest;
+ UChar *pDestLimit = dest+destCapacity;
+ UChar32 ch=0;
+ int32_t index = 0;
+ int32_t reqLength = 0;
+ uint8_t* pSrc = (uint8_t*) src;
+
+
+ while((index < srcLength)&&(pDest0)) {
+ *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR;
+ return 0;
+ }
+ int32_t length = ut->b;
+ int32_t start32 = pinIndex(start, length);
+ int32_t limit32 = pinIndex(limit, length);
+
+ if(start32>limit32) {
+ *pErrorCode=U_INDEX_OUTOFBOUNDS_ERROR;
+ return 0;
+ }
+
+
+ // adjust the incoming indexes to land on code point boundaries if needed.
+ // adjust by no more than three, because that is the largest number of trail bytes
+ // in a well formed UTF8 character.
+ const uint8_t *buf = (const uint8_t *)ut->context;
+ int i;
+ if (start32 < ut->chunkNativeLimit) {
+ for (i=0; i<3; i++) {
+ if (U8_IS_LEAD(buf[start32]) || start32==0) {
+ break;
+ }
+ start32--;
+ }
+ }
+
+ if (limit32 < ut->chunkNativeLimit) {
+ for (i=0; i<3; i++) {
+ if (U8_IS_LEAD(buf[limit32]) || limit32==0) {
+ break;
+ }
+ limit32--;
+ }
+ }
+
+ // Do the actual extract.
+ int32_t destLength=0;
+ utext_strFromUTF8(dest, destCapacity, &destLength,
+ (const char *)ut->context+start32, limit32-start32,
+ pErrorCode);
+ return destLength;
+}
+
+//
+// utf8TextMapOffsetToNative
+//
+// Map a chunk (UTF-16) offset to a native index.
+static int64_t U_CALLCONV
+utf8TextMapOffsetToNative(const UText *ut) {
+ //
+ UTF8Buf *u8b = (UTF8Buf *)ut->p;
+ U_ASSERT(ut->chunkOffset>ut->nativeIndexingLimit && ut->chunkOffset<=ut->chunkLength);
+ int32_t nativeOffset = u8b->mapToNative[ut->chunkOffset + u8b->bufStartIdx] + u8b->toUCharsMapStart;
+ U_ASSERT(nativeOffset >= ut->chunkNativeStart && nativeOffset <= ut->chunkNativeLimit);
+ return nativeOffset;
+}
+
+//
+// Map a native index to the corrsponding chunk offset
+//
+static int32_t U_CALLCONV
+utf8TextMapIndexToUTF16(const UText *ut, int64_t index64) {
+ U_ASSERT(index64 <= 0x7fffffff);
+ int32_t index = (int32_t)index64;
+ UTF8Buf *u8b = (UTF8Buf *)ut->p;
+ U_ASSERT(index>=ut->chunkNativeStart+ut->nativeIndexingLimit);
+ U_ASSERT(index<=ut->chunkNativeLimit);
+ int32_t mapIndex = index - u8b->toUCharsMapStart;
+ int32_t offset = u8b->mapToUChars[mapIndex] - u8b->bufStartIdx;
+ U_ASSERT(offset>=0 && offset<=ut->chunkLength);
+ return offset;
+}
+
+static UText * U_CALLCONV
+utf8TextClone(UText *dest, const UText *src, UBool deep, UErrorCode *status)
+{
+ // First do a generic shallow clone. Does everything needed for the UText struct itself.
+ dest = shallowTextClone(dest, src, status);
+
+ // For deep clones, make a copy of the string.
+ // The copied storage is owned by the newly created clone.
+ //
+ // TODO: There is an isssue with using utext_nativeLength().
+ // That function is non-const in cases where the input was NUL terminated
+ // and the length has not yet been determined.
+ // This function (clone()) is const.
+ // There potentially a thread safety issue lurking here.
+ //
+ if (deep && U_SUCCESS(*status)) {
+ int32_t len = (int32_t)utext_nativeLength((UText *)src);
+ char *copyStr = (char *)uprv_malloc(len+1);
+ if (copyStr == NULL) {
+ *status = U_MEMORY_ALLOCATION_ERROR;
+ } else {
+ uprv_memcpy(copyStr, src->context, len+1);
+ dest->context = copyStr;
+ dest->providerProperties |= I32_FLAG(UTEXT_PROVIDER_OWNS_TEXT);
+ }
+ }
+ return dest;
+}
+
+
+static void U_CALLCONV
+utf8TextClose(UText *ut) {
+ // Most of the work of close is done by the generic UText framework close.
+ // All that needs to be done here is to delete the UTF8 string if the UText
+ // owns it. This occurs if the UText was created by cloning.
+ if (ut->providerProperties & I32_FLAG(UTEXT_PROVIDER_OWNS_TEXT)) {
+ char *s = (char *)ut->context;
+ uprv_free(s);
+ ut->context = NULL;
+ }
+}
+
+U_CDECL_END
+
+
+static struct UTextFuncs utf8Funcs =
+{
+ sizeof(UTextFuncs),
+ 0, 0, 0, // Reserved alignment padding
+ utf8TextClone,
+ utf8TextLength,
+ utf8TextAccess,
+ utf8TextExtract,
+ NULL, /* replace*/
+ NULL, /* copy */
+ utf8TextMapOffsetToNative,
+ utf8TextMapIndexToUTF16,
+ utf8TextClose,
+ NULL, // spare 1
+ NULL, // spare 2
+ NULL // spare 3
+};
+
+
+U_DRAFT UText * U_EXPORT2
+utext_openUTF8(UText *ut, const char *s, int64_t length, UErrorCode *status) {
+ if(U_FAILURE(*status)) {
+ return NULL;
+ }
+ if(s==NULL || length<-1 || length>INT32_MAX) {
+ *status=U_ILLEGAL_ARGUMENT_ERROR;
+ return NULL;
+ }
+
+ ut = utext_setup(ut, sizeof(UTF8Buf) * 2, status);
+ if (U_FAILURE(*status)) {
+ return ut;
+ }
+
+ ut->pFuncs = &utf8Funcs;
+ ut->context = s;
+ ut->b = (int32_t)length;
+ ut->c = (int32_t)length;
+ if (ut->c < 0) {
+ ut->c = 0;
+ ut->providerProperties |= I32_FLAG(UTEXT_PROVIDER_LENGTH_IS_EXPENSIVE);
+ }
+ ut->p = ut->pExtra;
+ ut->q = (char *)ut->pExtra + sizeof(UTF8Buf);
+ return ut;
+
+}
+
+
+
+
+
+
+
+
+//------------------------------------------------------------------------------
+//
+// UText implementation wrapper for Replaceable (read/write)
+//
+// Use of UText data members:
+// context pointer to Replaceable.
+// p pointer to Replaceable if it is owned by the UText.
+//
+//------------------------------------------------------------------------------
+
+
+
+// minimum chunk size for this implementation: 3
+// to allow for possible trimming for code point boundaries
+enum { REP_TEXT_CHUNK_SIZE=10 };
+
+struct ReplExtra {
+ /*
+ * Chunk UChars.
+ * +1 to simplify filling with surrogate pair at the end.
+ */
+ UChar s[REP_TEXT_CHUNK_SIZE+1];
+};
+
+
+U_CDECL_BEGIN
+
+static UText * U_CALLCONV
+repTextClone(UText *dest, const UText *src, UBool deep, UErrorCode *status) {
+ // First do a generic shallow clone. Does everything needed for the UText struct itself.
+ dest = shallowTextClone(dest, src, status);
+
+ // For deep clones, make a copy of the Replaceable.
+ // The copied Replaceable storage is owned by the newly created UText clone.
+ // A non-NULL pointer in UText.p is the signal to the close() function to delete
+ // it.
+ //
+ if (deep && U_SUCCESS(*status)) {
+ const Replaceable *replSrc = (const Replaceable *)src->context;
+ dest->context = replSrc->clone();
+ dest->providerProperties |= I32_FLAG(UTEXT_PROVIDER_OWNS_TEXT);
+
+ // with deep clone, the copy is writable, even when the source is not.
+ dest->providerProperties |= I32_FLAG(UTEXT_PROVIDER_WRITABLE);
+ }
+ return dest;
+}
+
+
+static void U_CALLCONV
+repTextClose(UText *ut) {
+ // Most of the work of close is done by the generic UText framework close.
+ // All that needs to be done here is delete the Replaceable if the UText
+ // owns it. This occurs if the UText was created by cloning.
+ if (ut->providerProperties & I32_FLAG(UTEXT_PROVIDER_OWNS_TEXT)) {
+ Replaceable *rep = (Replaceable *)ut->context;
+ delete rep;
+ ut->context = NULL;
+ }
+}
+
+
+static int64_t U_CALLCONV
+repTextLength(UText *ut) {
+ const Replaceable *replSrc = (const Replaceable *)ut->context;
+ int32_t len = replSrc->length();
+ return len;
+}
+
+
+static UBool U_CALLCONV
+repTextAccess(UText *ut, int64_t index, UBool forward) {
+ const Replaceable *rep=(const Replaceable *)ut->context;
+ int32_t length=rep->length(); // Full length of the input text (bigger than a chunk)
+
+ // clip the requested index to the limits of the text.
+ int32_t index32 = pinIndex(index, length);
+ U_ASSERT(index<=INT32_MAX);
+
+
+ /*
+ * Compute start/limit boundaries around index, for a segment of text
+ * to be extracted.
+ * To allow for the possibility that our user gave an index to the trailing
+ * half of a surrogate pair, we must request one extra preceding UChar when
+ * going in the forward direction. This will ensure that the buffer has the
+ * entire code point at the specified index.
+ */
+ if(forward) {
+
+ if (index32>=ut->chunkNativeStart && index32chunkNativeLimit) {
+ // Buffer already contains the requested position.
+ ut->chunkOffset = (int32_t)(index - ut->chunkNativeStart);
+ return TRUE;
+ }
+ if (index32>=length && ut->chunkNativeLimit==length) {
+ // Request for end of string, and buffer already extends up to it.
+ // Can't get the data, but don't change the buffer.
+ ut->chunkOffset = length - (int32_t)ut->chunkNativeStart;
+ return FALSE;
+ }
+
+ ut->chunkNativeLimit = index + REP_TEXT_CHUNK_SIZE - 1;
+ // Going forward, so we want to have the buffer with stuff at and beyond
+ // the requested index. The -1 gets us one code point before the
+ // requested index also, to handle the case of the index being on
+ // a trail surrogate of a surrogate pair.
+ if(ut->chunkNativeLimit > length) {
+ ut->chunkNativeLimit = length;
+ }
+ // unless buffer ran off end, start is index-1.
+ ut->chunkNativeStart = ut->chunkNativeLimit - REP_TEXT_CHUNK_SIZE;
+ if(ut->chunkNativeStart < 0) {
+ ut->chunkNativeStart = 0;
+ }
+ } else {
+ // Reverse iteration. Fill buffer with data preceding the requested index.
+ if (index32>ut->chunkNativeStart && index32<=ut->chunkNativeLimit) {
+ // Requested position already in buffer.
+ ut->chunkOffset = index32 - (int32_t)ut->chunkNativeStart;
+ return TRUE;
+ }
+ if (index32==0 && ut->chunkNativeStart==0) {
+ // Request for start, buffer already begins at start.
+ // No data, but keep the buffer as is.
+ ut->chunkOffset = 0;
+ return FALSE;
+ }
+
+ // Figure out the bounds of the chunk to extract for reverse iteration.
+ // Need to worry about chunk not splitting surrogate pairs, and while still
+ // containing the data we need.
+ // Fix by requesting a chunk that includes an extra UChar at the end.
+ // If this turns out to be a lead surrogate, we can lop it off and still have
+ // the data we wanted.
+ ut->chunkNativeStart = index32 + 1 - REP_TEXT_CHUNK_SIZE;
+ if (ut->chunkNativeStart < 0) {
+ ut->chunkNativeStart = 0;
+ }
+
+ ut->chunkNativeLimit = index32 + 1;
+ if (ut->chunkNativeLimit > length) {
+ ut->chunkNativeLimit = length;
+ }
+ }
+
+ // Extract the new chunk of text from the Replaceable source.
+ ReplExtra *ex = (ReplExtra *)ut->pExtra;
+ // UnicodeString with its buffer a writable alias to the chunk buffer
+ UnicodeString buffer(ex->s, 0 /*buffer length*/, REP_TEXT_CHUNK_SIZE /*buffer capacity*/);
+ rep->extractBetween((int32_t)ut->chunkNativeStart, (int32_t)ut->chunkNativeLimit, buffer);
+
+ ut->chunkContents = ex->s;
+ ut->chunkLength = (int32_t)(ut->chunkNativeLimit - ut->chunkNativeStart);
+ ut->chunkOffset = (int32_t)(index32 - ut->chunkNativeStart);
+
+ // Surrogate pairs from the input text must not span chunk boundaries.
+ // If end of chunk could be the start of a surrogate, trim it off.
+ if (ut->chunkNativeLimit < length &&
+ U16_IS_LEAD(ex->s[ut->chunkLength-1])) {
+ ut->chunkLength--;
+ ut->chunkNativeLimit--;
+ if (ut->chunkOffset > ut->chunkLength) {
+ ut->chunkOffset = ut->chunkLength;
+ }
+ }
+
+ // if the first UChar in the chunk could be the trailing half of a surrogate pair,
+ // trim it off.
+ if(ut->chunkNativeStart>0 && U16_IS_TRAIL(ex->s[0])) {
+ ++(ut->chunkContents);
+ ++(ut->chunkNativeStart);
+ --(ut->chunkLength);
+ --(ut->chunkOffset);
+ }
+
+ // adjust the index/chunkOffset to a code point boundary
+ U16_SET_CP_START(ut->chunkContents, 0, ut->chunkOffset);
+
+ // Use fast indexing for get/setNativeIndex()
+ ut->nativeIndexingLimit = ut->chunkLength;
+
+ return TRUE;
+}
+
+
+
+static int32_t U_CALLCONV
+repTextExtract(UText *ut,
+ int64_t start, int64_t limit,
+ UChar *dest, int32_t destCapacity,
+ UErrorCode *status) {
+ const Replaceable *rep=(const Replaceable *)ut->context;
+ int32_t length=rep->length();
+
+ if(U_FAILURE(*status)) {
+ return 0;
+ }
+ if(destCapacity<0 || (dest==NULL && destCapacity>0)) {
+ *status=U_ILLEGAL_ARGUMENT_ERROR;
+ }
+ if(start>limit) {
+ *status=U_INDEX_OUTOFBOUNDS_ERROR;
+ return 0;
+ }
+
+ int32_t start32 = pinIndex(start, length);
+ int32_t limit32 = pinIndex(limit, length);
+
+ // adjust start, limit if they point to trail half of surrogates
+ if (start32charAt(start32)) &&
+ U_IS_SUPPLEMENTARY(rep->char32At(start32))){
+ start32--;
+ }
+ if (limit32charAt(limit32)) &&
+ U_IS_SUPPLEMENTARY(rep->char32At(limit32))){
+ limit32--;
+ }
+
+ length=limit32-start32;
+ if(length>destCapacity) {
+ limit32 = start32 + destCapacity;
+ }
+ UnicodeString buffer(dest, 0, destCapacity); // writable alias
+ rep->extractBetween(start32, limit32, buffer);
+ return u_terminateUChars(dest, destCapacity, length, status);
+}
+
+static int32_t U_CALLCONV
+repTextReplace(UText *ut,
+ int64_t start, int64_t limit,
+ const UChar *src, int32_t length,
+ UErrorCode *status) {
+ Replaceable *rep=(Replaceable *)ut->context;
+ int32_t oldLength;
+
+ if(U_FAILURE(*status)) {
+ return 0;
+ }
+ if(src==NULL && length!=0) {
+ *status=U_ILLEGAL_ARGUMENT_ERROR;
+ return 0;
+ }
+ oldLength=rep->length(); // will subtract from new length
+ if(start>limit ) {
+ *status=U_INDEX_OUTOFBOUNDS_ERROR;
+ return 0;
+ }
+
+ int32_t start32 = pinIndex(start, oldLength);
+ int32_t limit32 = pinIndex(limit, oldLength);
+
+ // Snap start & limit to code point boundaries.
+ if (start32charAt(start32)) &&
+ start32>0 && U16_IS_LEAD(rep->charAt(start32-1)))
+ {
+ start32--;
+ }
+ if (limit32charAt(limit32-1)) &&
+ U16_IS_TRAIL(rep->charAt(limit32)))
+ {
+ limit32++;
+ }
+
+ // Do the actual replace operation using methods of the Replaceable class
+ UnicodeString replStr((UBool)(length<0), src, length); // read-only alias
+ rep->handleReplaceBetween(start32, limit32, replStr);
+ int32_t newLength = rep->length();
+ int32_t lengthDelta = newLength - oldLength;
+
+ // Is the UText chunk buffer OK?
+ if (ut->chunkNativeLimit > start32) {
+ // this replace operation may have impacted the current chunk.
+ // invalidate it, which will force a reload on the next access.
+ invalidateChunk(ut);
+ }
+
+ // set the iteration position to the end of the newly inserted replacement text.
+ int32_t newIndexPos = limit32 + lengthDelta;
+ repTextAccess(ut, newIndexPos, TRUE);
+
+ return lengthDelta;
+}
+
+
+static void U_CALLCONV
+repTextCopy(UText *ut,
+ int64_t start, int64_t limit,
+ int64_t destIndex,
+ UBool move,
+ UErrorCode *status)
+{
+ Replaceable *rep=(Replaceable *)ut->context;
+ int32_t length=rep->length();
+
+ if(U_FAILURE(*status)) {
+ return;
+ }
+ if (start>limit || (startcopy(start32, limit32, destIndex32);
+ if(destIndex32handleReplaceBetween(start32, limit32, UnicodeString());
+ } else {
+ // copy
+ rep->copy(start32, limit32, destIndex32);
+ }
+
+ // If the change to the text touched the region in the chunk buffer,
+ // invalidate the buffer.
+ int32_t firstAffectedIndex = destIndex32;
+ if (move && start32chunkNativeLimit) {
+ // changes may have affected range covered by the chunk
+ invalidateChunk(ut);
+ }
+
+ // Put iteration position at the newly inserted (moved) block,
+ int32_t nativeIterIndex = destIndex32 + limit32 - start32;
+ if (move && destIndex32>start32) {
+ // moved a block of text towards the end of the string.
+ nativeIterIndex = destIndex32;
+ }
+
+ // Set position, reload chunk if needed.
+ repTextAccess(ut, nativeIterIndex, TRUE);
+}
+
+static struct UTextFuncs repFuncs =
+{
+ sizeof(UTextFuncs),
+ 0, 0, 0, // Reserved alignment padding
+ repTextClone,
+ repTextLength,
+ repTextAccess,
+ repTextExtract,
+ repTextReplace,
+ repTextCopy,
+ NULL, // MapOffsetToNative,
+ NULL, // MapIndexToUTF16,
+ repTextClose,
+ NULL, // spare 1
+ NULL, // spare 2
+ NULL // spare 3
+};
+
+
+U_DRAFT UText * U_EXPORT2
+utext_openReplaceable(UText *ut, Replaceable *rep, UErrorCode *status)
+{
+ if(U_FAILURE(*status)) {
+ return NULL;
+ }
+ if(rep==NULL) {
+ *status=U_ILLEGAL_ARGUMENT_ERROR;
+ return NULL;
+ }
+ ut = utext_setup(ut, sizeof(ReplExtra), status);
+
+ ut->providerProperties = I32_FLAG(UTEXT_PROVIDER_WRITABLE);
+ if(rep->hasMetaData()) {
+ ut->providerProperties |=I32_FLAG(UTEXT_PROVIDER_HAS_META_DATA);
+ }
+
+ ut->pFuncs = &repFuncs;
+ ut->context = rep;
+ return ut;
+}
+
+U_CDECL_END
+
+
+
+
+
+
+
+
+//------------------------------------------------------------------------------
+//
+// UText implementation for UnicodeString (read/write) and
+// for const UnicodeString (read only)
+// (same implementation, only the flags are different)
+//
+// Use of UText data members:
+// context pointer to UnicodeString
+// p pointer to UnicodeString IF this UText owns the string
+// and it must be deleted on close(). NULL otherwise.
+//
+//------------------------------------------------------------------------------
+
+U_CDECL_BEGIN
+
+
+static UText * U_CALLCONV
+unistrTextClone(UText *dest, const UText *src, UBool deep, UErrorCode *status) {
+ // First do a generic shallow clone. Does everything needed for the UText struct itself.
+ dest = shallowTextClone(dest, src, status);
+
+ // For deep clones, make a copy of the UnicodeSring.
+ // The copied UnicodeString storage is owned by the newly created UText clone.
+ // A non-NULL pointer in UText.p is the signal to the close() function to delete
+ // the UText.
+ //
+ if (deep && U_SUCCESS(*status)) {
+ const UnicodeString *srcString = (const UnicodeString *)src->context;
+ dest->context = new UnicodeString(*srcString);
+ dest->providerProperties |= I32_FLAG(UTEXT_PROVIDER_OWNS_TEXT);
+
+ // with deep clone, the copy is writable, even when the source is not.
+ dest->providerProperties |= I32_FLAG(UTEXT_PROVIDER_WRITABLE);
+ }
+ return dest;
+}
+
+static void U_CALLCONV
+unistrTextClose(UText *ut) {
+ // Most of the work of close is done by the generic UText framework close.
+ // All that needs to be done here is delete the UnicodeString if the UText
+ // owns it. This occurs if the UText was created by cloning.
+ if (ut->providerProperties & I32_FLAG(UTEXT_PROVIDER_OWNS_TEXT)) {
+ UnicodeString *str = (UnicodeString *)ut->context;
+ delete str;
+ ut->context = NULL;
+ }
+}
+
+
+static int64_t U_CALLCONV
+unistrTextLength(UText *t) {
+ return ((const UnicodeString *)t->context)->length();
+}
+
+
+static UBool U_CALLCONV
+unistrTextAccess(UText *ut, int64_t index, UBool forward) {
+ int32_t length = ut->chunkLength;
+ ut->chunkOffset = pinIndex(index, length);
+
+ // Check whether request is at the start or end
+ UBool retVal = (forward && index0);
+ return retVal;
+}
+
+
+
+static int32_t U_CALLCONV
+unistrTextExtract(UText *t,
+ int64_t start, int64_t limit,
+ UChar *dest, int32_t destCapacity,
+ UErrorCode *pErrorCode) {
+ const UnicodeString *us=(const UnicodeString *)t->context;
+ int32_t length=us->length();
+
+ if(U_FAILURE(*pErrorCode)) {
+ return 0;
+ }
+ if(destCapacity<0 || (dest==NULL && destCapacity>0)) {
+ *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR;
+ }
+ if(start<0 || start>limit) {
+ *pErrorCode=U_INDEX_OUTOFBOUNDS_ERROR;
+ return 0;
+ }
+
+ int32_t start32 = startgetChar32Start((int32_t)start) : length;
+ int32_t limit32 = limitgetChar32Start((int32_t)limit) : length;
+
+ length=limit32-start32;
+ if (destCapacity>0 && dest!=NULL) {
+ int32_t trimmedLength = length;
+ if(trimmedLength>destCapacity) {
+ trimmedLength=destCapacity;
+ }
+ us->extract(start32, trimmedLength, dest);
+ }
+ u_terminateUChars(dest, destCapacity, length, pErrorCode);
+ return length;
+}
+
+static int32_t U_CALLCONV
+unistrTextReplace(UText *ut,
+ int64_t start, int64_t limit,
+ const UChar *src, int32_t length,
+ UErrorCode *pErrorCode) {
+ UnicodeString *us=(UnicodeString *)ut->context;
+ int32_t oldLength;
+
+ if(U_FAILURE(*pErrorCode)) {
+ return 0;
+ }
+ if(src==NULL && length!=0) {
+ *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR;
+ }
+ if(start>limit) {
+ *pErrorCode=U_INDEX_OUTOFBOUNDS_ERROR;
+ return 0;
+ }
+ oldLength=us->length();
+ int32_t start32 = pinIndex(start, oldLength);
+ int32_t limit32 = pinIndex(limit, oldLength);
+ if (start32 < oldLength) {
+ start32 = us->getChar32Start(start32);
+ }
+ if (limit32 < oldLength) {
+ limit32 = us->getChar32Start(limit32);
+ }
+
+ // replace
+ us->replace(start32, limit32-start32, src, length);
+ int32_t newLength = us->length();
+
+ // Update the chunk description.
+ ut->chunkContents = us->getBuffer();
+ ut->chunkLength = newLength;
+ ut->chunkNativeLimit = newLength;
+ ut->nativeIndexingLimit = newLength;
+
+ // Set iteration position to the point just following the newly inserted text.
+ int32_t lengthDelta = newLength - oldLength;
+ ut->chunkOffset = limit32 + lengthDelta;
+
+ return lengthDelta;
+}
+
+static void U_CALLCONV
+unistrTextCopy(UText *ut,
+ int64_t start, int64_t limit,
+ int64_t destIndex,
+ UBool move,
+ UErrorCode *pErrorCode) {
+ UnicodeString *us=(UnicodeString *)ut->context;
+ int32_t length=us->length();
+
+ if(U_FAILURE(*pErrorCode)) {
+ return;
+ }
+ int32_t start32 = pinIndex(start, length);
+ int32_t limit32 = pinIndex(limit, length);
+ int32_t destIndex32 = pinIndex(destIndex, length);
+
+ if( start32>limit32 || (start32copy(start32, limit32, destIndex32);
+ if(destIndex32replace(start32, segLength, NULL, 0);
+ } else {
+ // copy
+ us->copy(start32, limit32, destIndex32);
+ }
+
+ // update chunk description, set iteration position.
+ ut->chunkContents = us->getBuffer();
+ if (move==FALSE) {
+ // copy operation, string length grows
+ ut->chunkLength += limit32-start32;
+ ut->chunkNativeLimit = ut->chunkLength;
+ ut->nativeIndexingLimit = ut->chunkLength;
+ }
+
+ // Iteration position to end of the newly inserted text.
+ ut->chunkOffset = destIndex32+limit32-start32;
+ if (move && destIndex32>start32) {
+ ut->chunkOffset = destIndex32;
+ }
+
+}
+
+static struct UTextFuncs unistrFuncs =
+{
+ sizeof(UTextFuncs),
+ 0, 0, 0, // Reserved alignment padding
+ unistrTextClone,
+ unistrTextLength,
+ unistrTextAccess,
+ unistrTextExtract,
+ unistrTextReplace,
+ unistrTextCopy,
+ NULL, // MapOffsetToNative,
+ NULL, // MapIndexToUTF16,
+ unistrTextClose,
+ NULL, // spare 1
+ NULL, // spare 2
+ NULL // spare 3
+};
+
+
+
+U_CDECL_END
+
+
+U_DRAFT UText * U_EXPORT2
+utext_openUnicodeString(UText *ut, UnicodeString *s, UErrorCode *status) {
+ // TODO: use openConstUnicodeString, then add in the differences.
+ //
+ ut = utext_setup(ut, 0, status);
+ if (U_SUCCESS(*status)) {
+ ut->pFuncs = &unistrFuncs;
+ ut->context = s;
+ ut->providerProperties = I32_FLAG(UTEXT_PROVIDER_STABLE_CHUNKS)|
+ I32_FLAG(UTEXT_PROVIDER_WRITABLE);
+
+ ut->chunkContents = s->getBuffer();
+ ut->chunkLength = s->length();
+ ut->chunkNativeStart = 0;
+ ut->chunkNativeLimit = ut->chunkLength;
+ ut->nativeIndexingLimit = ut->chunkLength;
+ }
+ return ut;
+}
+
+
+
+U_DRAFT UText * U_EXPORT2
+utext_openConstUnicodeString(UText *ut, const UnicodeString *s, UErrorCode *status) {
+ ut = utext_setup(ut, 0, status);
+ // note: use the standard (writable) function table for UnicodeString.
+ // The flag settings disable writing, so having the functions in
+ // the table is harmless.
+ if (U_SUCCESS(*status)) {
+ ut->pFuncs = &unistrFuncs;
+ ut->context = s;
+ ut->providerProperties = I32_FLAG(UTEXT_PROVIDER_STABLE_CHUNKS);
+ ut->chunkContents = s->getBuffer();
+ ut->chunkLength = s->length();
+ ut->chunkNativeStart = 0;
+ ut->chunkNativeLimit = ut->chunkLength;
+ ut->nativeIndexingLimit = ut->chunkLength;
+ }
+ return ut;
+}
+
+//------------------------------------------------------------------------------
+//
+// UText implementation for const UChar * strings
+//
+// Use of UText data members:
+// context pointer to UnicodeString
+// a length. -1 if not yet known.
+//
+// TODO: support 64 bit lengths.
+//
+//------------------------------------------------------------------------------
+
+U_CDECL_BEGIN
+
+
+static UText * U_CALLCONV
+ucstrTextClone(UText *dest, const UText * src, UBool deep, UErrorCode * status) {
+ // First do a generic shallow clone.
+ dest = shallowTextClone(dest, src, status);
+
+ // For deep clones, make a copy of the string.
+ // The copied storage is owned by the newly created clone.
+ // A non-NULL pointer in UText.p is the signal to the close() function to delete
+ // it.
+ //
+ if (deep && U_SUCCESS(*status)) {
+ U_ASSERT(utext_nativeLength(dest) < INT32_MAX);
+ int32_t len = (int32_t)utext_nativeLength(dest);
+
+ // The cloned string IS going to be NUL terminated, whether or not the original was.
+ const UChar *srcStr = (const UChar *)src->context;
+ UChar *copyStr = (UChar *)uprv_malloc((len+1) * sizeof(UChar));
+ if (copyStr == NULL) {
+ *status = U_MEMORY_ALLOCATION_ERROR;
+ } else {
+ int64_t i;
+ for (i=0; icontext = copyStr;
+ dest->providerProperties |= I32_FLAG(UTEXT_PROVIDER_OWNS_TEXT);
+ }
+ }
+ return dest;
+}
+
+
+static void U_CALLCONV
+ucstrTextClose(UText *ut) {
+ // Most of the work of close is done by the generic UText framework close.
+ // All that needs to be done here is delete the string if the UText
+ // owns it. This occurs if the UText was created by cloning.
+ if (ut->providerProperties & I32_FLAG(UTEXT_PROVIDER_OWNS_TEXT)) {
+ UChar *s = (UChar *)ut->context;
+ uprv_free(s);
+ ut->context = NULL;
+ }
+}
+
+
+
+static int64_t U_CALLCONV
+ucstrTextLength(UText *ut) {
+ if (ut->a < 0) {
+ // null terminated, we don't yet know the length. Scan for it.
+ // Access is not convenient for doing this
+ // because the current interation postion can't be changed.
+ const UChar *str = (const UChar *)ut->context;
+ for (;;) {
+ if (str[ut->chunkNativeLimit] == 0) {
+ break;
+ }
+ ut->chunkNativeLimit++;
+ }
+ ut->a = ut->chunkNativeLimit;
+ ut->chunkLength = (int32_t)ut->chunkNativeLimit;
+ ut->nativeIndexingLimit = ut->chunkLength;
+ ut->providerProperties &= ~I32_FLAG(UTEXT_PROVIDER_LENGTH_IS_EXPENSIVE);
+ }
+ return ut->a;
+}
+
+
+static UBool U_CALLCONV
+ucstrTextAccess(UText *ut, int64_t index, UBool forward) {
+ const UChar *str = (const UChar *)ut->context;
+
+ // pin the requested index to the bounds of the string,
+ // and set current iteration position.
+ if (index<0) {
+ index = 0;
+ } else if (index < ut->chunkNativeLimit) {
+ // The request data is within the chunk as it is known so far.
+ // Put index on a code point boundary.
+ U16_SET_CP_START(str, 0, index);
+ } else if (ut->a >= 0) {
+ // We know the length of this string, and the user is requesting something
+ // at or beyond the length. Pin the requested index to the length.
+ index = ut->a;
+ } else {
+ // Null terminated string, length not yet known, and the requested index
+ // is beyond where we have scanned so far.
+ // Scan to 32 UChars beyond the requested index. The strategy here is
+ // to avoid fully scanning a long string when the caller only wants to
+ // see a few characters at its beginning.
+ int32_t scanLimit = (int32_t)index + 32;
+ if ((index + 32)>INT32_MAX || (index + 32)<0 ) { // note: int64 expression
+ scanLimit = INT32_MAX;
+ }
+
+ int32_t chunkLimit = (int32_t)ut->chunkNativeLimit;
+ for (; chunkLimita = chunkLimit;
+ ut->chunkLength = chunkLimit;
+ ut->nativeIndexingLimit = chunkLimit;
+ if (index >= chunkLimit) {
+ index = chunkLimit;
+ } else {
+ U16_SET_CP_START(str, 0, index);
+ }
+
+ ut->chunkNativeLimit = chunkLimit;
+ ut->providerProperties &= ~I32_FLAG(UTEXT_PROVIDER_LENGTH_IS_EXPENSIVE);
+ goto breakout;
+ }
+ }
+ // We scanned through the next batch of UChars without finding the end.
+ U16_SET_CP_START(str, 0, index);
+ if (chunkLimit == INT32_MAX) {
+ // Scanned to the limit of a 32 bit length.
+ // Forceably trim the overlength string back so length fits in int32
+ // TODO: add support for 64 bit strings.
+ ut->a = chunkLimit;
+ ut->chunkLength = chunkLimit;
+ ut->nativeIndexingLimit = chunkLimit;
+ if (index > chunkLimit) {
+ index = chunkLimit;
+ }
+ ut->chunkNativeLimit = chunkLimit;
+ ut->providerProperties &= ~I32_FLAG(UTEXT_PROVIDER_LENGTH_IS_EXPENSIVE);
+ } else {
+ // The endpoint of a chunk must not be left in the middle of a surrogate pair.
+ // If the current end is on a lead surrogate, back the end up by one.
+ // It doesn't matter if the end char happens to be an unpaired surrogate,
+ // and it's simpler not to worry about it.
+ if (U16_IS_LEAD(str[chunkLimit-1])) {
+ --chunkLimit;
+ }
+ ut->chunkNativeLimit = chunkLimit;
+ }
+
+ }
+breakout:
+ U_ASSERT(index<=INT32_MAX);
+ ut->chunkOffset = (int32_t)index;
+
+ // Check whether request is at the start or end
+ UBool retVal = (forward && indexchunkNativeLimit) || (!forward && index>0);
+ return retVal;
+}
+
+
+
+static int32_t U_CALLCONV
+ucstrTextExtract(UText *ut,
+ int64_t start, int64_t limit,
+ UChar *dest, int32_t destCapacity,
+ UErrorCode *pErrorCode)
+{
+ if(U_FAILURE(*pErrorCode)) {
+ return 0;
+ }
+ if(destCapacity<0 || (dest==NULL && destCapacity>0) || start>limit) {
+ *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR;
+ return 0;
+ }
+
+ const UChar *s=(const UChar *)ut->context;
+ int32_t si, di;
+
+ int32_t start32;
+ int32_t limit32;
+
+ // Access the start. Does two things we need:
+ // Pins 'start' to the length of the string, if it came in out-of-bounds.
+ // Snaps 'start' to the beginning of a code point.
+ ucstrTextAccess(ut, start, TRUE);
+ U_ASSERT(start <= INT32_MAX);
+ start32 = (int32_t)start;
+
+ int32_t strLength=(int32_t)ut->a;
+ if (strLength >= 0) {
+ limit32 = pinIndex(limit, strLength);
+ } else {
+ limit32 = pinIndex(limit, INT32_MAX);
+ }
+
+ di = 0;
+ for (si=start32; sia = si; // set string length for this UText
+ ut->chunkNativeLimit = si;
+ ut->chunkLength = si;
+ ut->nativeIndexingLimit = si;
+ strLength = si;
+ break;
+ }
+ if (di=0) {
+ // We have filled the destination buffer, and the string length is known.
+ // Cut the loop short. There is no need to scan string termination.
+ di = strLength;
+ si = limit32;
+ break;
+ }
+ }
+ di++;
+ }
+
+ // If the limit index points to a lead surrogate of a pair,
+ // add the corresponding trail surrogate to the destination.
+ if (si>0 && U16_IS_LEAD(s[si-1]) &&
+ ((sichunkOffset = si;
+
+ // Add a terminating NUL if space in the buffer permits,
+ // and set the error status as required.
+ u_terminateUChars(dest, destCapacity, di, pErrorCode);
+ return di;
+}
+
+static struct UTextFuncs ucstrFuncs =
+{
+ sizeof(UTextFuncs),
+ 0, 0, 0, // Reserved alignment padding
+ ucstrTextClone,
+ ucstrTextLength,
+ ucstrTextAccess,
+ ucstrTextExtract,
+ NULL, // Replace
+ NULL, // Copy
+ NULL, // MapOffsetToNative,
+ NULL, // MapIndexToUTF16,
+ ucstrTextClose,
+ NULL, // spare 1
+ NULL, // spare 2
+ NULL, // spare 3
+};
+
+U_CDECL_END
+
+
+U_DRAFT UText * U_EXPORT2
+utext_openUChars(UText *ut, const UChar *s, int64_t length, UErrorCode *status) {
+ if (U_FAILURE(*status)) {
+ return NULL;
+ }
+ if (length < -1 || length>INT32_MAX) {
+ *status = U_ILLEGAL_ARGUMENT_ERROR;
+ return NULL;
+ }
+ ut = utext_setup(ut, 0, status);
+ if (U_SUCCESS(*status)) {
+ ut->pFuncs = &ucstrFuncs;
+ ut->context = s;
+ ut->providerProperties = I32_FLAG(UTEXT_PROVIDER_STABLE_CHUNKS);
+ if (length==-1) {
+ ut->providerProperties |= I32_FLAG(UTEXT_PROVIDER_LENGTH_IS_EXPENSIVE);
+ }
+ ut->a = length;
+ ut->chunkContents = s;
+ ut->chunkNativeStart = 0;
+ ut->chunkNativeLimit = length>=0? length : 0;
+ ut->chunkLength = (int32_t)ut->chunkNativeLimit;
+ ut->chunkOffset = 0;
+ ut->nativeIndexingLimit = ut->chunkLength;
+ }
+ return ut;
+}
+
+
+//------------------------------------------------------------------------------
+//
+// UText implementation for text from ICU CharacterIterators
+//
+// Use of UText data members:
+// context pointer to the CharacterIterator
+// a length of the full text.
+// p pointer to buffer 1
+// b start index of local buffer 1 contents
+// q pointer to buffer 2
+// c start index of local buffer 2 contents
+// r pointer to the character iterator if the UText owns it.
+// Null otherwise.
+//
+//------------------------------------------------------------------------------
+#define CIBufSize 16
+
+U_CDECL_BEGIN
+static void U_CALLCONV
+charIterTextClose(UText *ut) {
+ // Most of the work of close is done by the generic UText framework close.
+ // All that needs to be done here is delete the CharacterIterator if the UText
+ // owns it. This occurs if the UText was created by cloning.
+ CharacterIterator *ci = (CharacterIterator *)ut->r;
+ delete ci;
+ ut->r = NULL;
+}
+
+static int64_t U_CALLCONV
+charIterTextLength(UText *ut) {
+ return (int32_t)ut->a;
+}
+
+static UBool U_CALLCONV
+charIterTextAccess(UText *ut, int64_t index, UBool forward) {
+ CharacterIterator *ci = (CharacterIterator *)ut->context;
+
+ int32_t clippedIndex = (int32_t)index;
+ if (clippedIndex<0) {
+ clippedIndex=0;
+ } else if (clippedIndex>=ut->a) {
+ clippedIndex=(int32_t)ut->a;
+ }
+ int32_t neededIndex = clippedIndex;
+ if (!forward && neededIndex>0) {
+ // reverse iteration, want the position just before what was asked for.
+ neededIndex--;
+ } else if (forward && neededIndex==ut->a && neededIndex>0) {
+ // Forward iteration, don't ask for something past the end of the text.
+ neededIndex--;
+ }
+
+ // Find the native index of the start of the buffer containing what we want.
+ neededIndex -= neededIndex % CIBufSize;
+
+ UChar *buf = NULL;
+ UBool needChunkSetup = TRUE;
+ int i;
+ if (ut->chunkNativeStart == neededIndex) {
+ // The buffer we want is already the current chunk.
+ needChunkSetup = FALSE;
+ } else if (ut->b == neededIndex) {
+ // The first buffer (buffer p) has what we need.
+ buf = (UChar *)ut->p;
+ } else if (ut->c == neededIndex) {
+ // The second buffer (buffer q) has what we need.
+ buf = (UChar *)ut->q;
+ } else {
+ // Neither buffer already has what we need.
+ // Load new data from the character iterator.
+ // Use the buf that is not the current buffer.
+ buf = (UChar *)ut->p;
+ if (ut->p == ut->chunkContents) {
+ buf = (UChar *)ut->q;
+ }
+ ci->setIndex(neededIndex);
+ for (i=0; inextPostInc();
+ if (i+neededIndex > ut->a) {
+ break;
+ }
+ }
+ }
+
+ // We have a buffer with the data we need.
+ // Set it up as the current chunk, if it wasn't already.
+ if (needChunkSetup) {
+ ut->chunkContents = buf;
+ ut->chunkLength = CIBufSize;
+ ut->chunkNativeStart = neededIndex;
+ ut->chunkNativeLimit = neededIndex + CIBufSize;
+ if (ut->chunkNativeLimit > ut->a) {
+ ut->chunkNativeLimit = ut->a;
+ ut->chunkLength = (int32_t)(ut->chunkNativeLimit)-(int32_t)(ut->chunkNativeStart);
+ }
+ ut->nativeIndexingLimit = ut->chunkLength;
+ U_ASSERT(ut->chunkOffset>=0 && ut->chunkOffset<=CIBufSize);
+ }
+ ut->chunkOffset = clippedIndex - (int32_t)ut->chunkNativeStart;
+ UBool success = (forward? ut->chunkOffsetchunkLength : ut->chunkOffset>0);
+ return success;
+}
+
+static UText * U_CALLCONV
+charIterTextClone(UText *dest, const UText *src, UBool deep, UErrorCode * status) {
+ if (U_FAILURE(*status)) {
+ return NULL;
+ }
+
+ if (deep) {
+ // There is no CharacterIterator API for cloning the underlying text storage.
+ *status = U_UNSUPPORTED_ERROR;
+ return NULL;
+ } else {
+ CharacterIterator *srcCI =(CharacterIterator *)src->context;
+ srcCI = srcCI->clone();
+ dest = utext_openCharacterIterator(dest, srcCI, status);
+ // cast off const on getNativeIndex.
+ // For CharacterIterator based UTexts, this is safe, the operation is const.
+ int64_t ix = utext_getNativeIndex((UText *)src);
+ utext_setNativeIndex(dest, ix);
+ dest->r = srcCI; // flags that this UText owns the CharacterIterator
+ }
+ return dest;
+}
+
+static int32_t U_CALLCONV
+charIterTextExtract(UText *ut,
+ int64_t start, int64_t limit,
+ UChar *dest, int32_t destCapacity,
+ UErrorCode *status)
+{
+ if(U_FAILURE(*status)) {
+ return 0;
+ }
+ if(destCapacity<0 || (dest==NULL && destCapacity>0) || start>limit) {
+ *status=U_ILLEGAL_ARGUMENT_ERROR;
+ return 0;
+ }
+ int32_t length = (int32_t)ut->a;
+ int32_t start32 = pinIndex(start, length);
+ int32_t limit32 = pinIndex(limit, length);
+ int32_t desti = 0;
+ int32_t srci;
+
+ CharacterIterator *ci = (CharacterIterator *)ut->context;
+ ci->setIndex32(start32); // Moves ix to lead of surrogate pair, if needed.
+ srci = ci->getIndex();
+ while (srcinext32PostInc();
+ int32_t len = U16_LENGTH(c);
+ if (desti+len <= destCapacity) {
+ U16_APPEND_UNSAFE(dest, desti, c);
+ } else {
+ desti += len;
+ *status = U_BUFFER_OVERFLOW_ERROR;
+ }
+ srci += len;
+ }
+
+ u_terminateUChars(dest, destCapacity, desti, status);
+ return desti;
+}
+
+static struct UTextFuncs charIterFuncs =
+{
+ sizeof(UTextFuncs),
+ 0, 0, 0, // Reserved alignment padding
+ charIterTextClone,
+ charIterTextLength,
+ charIterTextAccess,
+ charIterTextExtract,
+ NULL, // Replace
+ NULL, // Copy
+ NULL, // MapOffsetToNative,
+ NULL, // MapIndexToUTF16,
+ charIterTextClose,
+ NULL, // spare 1
+ NULL, // spare 2
+ NULL // spare 3
+};
+U_CDECL_END
+
+
+U_DRAFT UText * U_EXPORT2
+utext_openCharacterIterator(UText *ut, CharacterIterator *ci, UErrorCode *status) {
+ if (U_FAILURE(*status)) {
+ return NULL;
+ }
+
+ if (ci->startIndex() > 0) {
+ // No support for CharacterIterators that do not start indexing from zero.
+ *status = U_UNSUPPORTED_ERROR;
+ return NULL;
+ }
+
+ // Extra space in UText for 2 buffers of CIBufSize UChars each.
+ int32_t extraSpace = 2 * CIBufSize * sizeof(UChar);
+ ut = utext_setup(ut, extraSpace, status);
+ if (U_SUCCESS(*status)) {
+ ut->pFuncs = &charIterFuncs;
+ ut->context = ci;
+ ut->providerProperties = 0;
+ ut->a = ci->endIndex(); // Length of text
+ ut->p = ut->pExtra; // First buffer
+ ut->b = -1; // Native index of first buffer contents
+ ut->q = (UChar*)ut->pExtra+CIBufSize; // Second buffer
+ ut->c = -1; // Native index of second buffer contents
+
+ // Initialize current chunk contents to be empty.
+ // First access will fault something in.
+ // Note: The initial nativeStart and chunkOffset must sum to zero
+ // so that getNativeIndex() will correctly compute to zero
+ // if no call to Access() has ever been made. They can't be both
+ // zero without Access() thinking that the chunk is valid.
+ ut->chunkContents = (UChar *)ut->p;
+ ut->chunkNativeStart = -1;
+ ut->chunkOffset = 1;
+ ut->chunkNativeLimit = 0;
+ ut->chunkLength = 0;
+ ut->nativeIndexingLimit = ut->chunkOffset; // enables native indexing
+ }
+ return ut;
+}
+
+
+
diff --git a/icuSources/common/utf_impl.c b/icuSources/common/utf_impl.c
index 431b0eb5..8f45546b 100644
--- a/icuSources/common/utf_impl.c
+++ b/icuSources/common/utf_impl.c
@@ -1,7 +1,7 @@
/*
******************************************************************************
*
-* Copyright (C) 1999-2003, International Business Machines
+* Copyright (C) 1999-2006, International Business Machines
* Corporation and others. All Rights Reserved.
*
******************************************************************************
@@ -82,6 +82,28 @@ utf8_errorValue[6]={
0x3ffffff, 0x7fffffff
};
+/*
+ * Handle the non-inline part of the U8_NEXT() macro and its obsolete sibling
+ * UTF8_NEXT_CHAR_SAFE().
+ *
+ * The "strict" parameter controls the error behavior:
+ * <0 "Safe" behavior of U8_NEXT(): All illegal byte sequences yield a negative
+ * code point result.
+ * 0 Obsolete "safe" behavior of UTF8_NEXT_CHAR_SAFE(..., FALSE):
+ * All illegal byte sequences yield a positive code point such that this
+ * result code point would be encoded with the same number of bytes as
+ * the illegal sequence.
+ * >0 Obsolete "strict" behavior of UTF8_NEXT_CHAR_SAFE(..., TRUE):
+ * Same as the obsolete "safe" behavior, but non-characters are also treated
+ * like illegal sequences.
+ *
+ * The special negative (<0) value -2 is used for lenient treatment of surrogate
+ * code points as legal. Some implementations use this for roundtripping of
+ * Unicode 16-bit strings that are not well-formed UTF-16, that is, they
+ * contain unpaired surrogates.
+ *
+ * Note that a UBool is the same as an int8_t.
+ */
U_CAPI UChar32 U_EXPORT2
utf8_nextCharSafeBody(const uint8_t *s, int32_t *pi, int32_t length, UChar32 c, UBool strict) {
int32_t i=*pi;
@@ -139,7 +161,7 @@ utf8_nextCharSafeBody(const uint8_t *s, int32_t *pi, int32_t length, UChar32 c,
/* correct sequence - all trail bytes have (b7..b6)==(10)? */
/* illegal is also set if count>=4 */
- if(illegal || (c)=4 || c>0x10ffff || c0 && UTF_IS_UNICODE_NONCHAR(c))) {
+ if(count>=4 || c>0x10ffff || c0 && UTF_IS_UNICODE_NONCHAR(c))) {
/* illegal sequence or (strict and non-character) */
if(count>=4) {
count=3;
diff --git a/icuSources/common/util.cpp b/icuSources/common/util.cpp
index 203fde51..7a588b5a 100644
--- a/icuSources/common/util.cpp
+++ b/icuSources/common/util.cpp
@@ -1,6 +1,6 @@
/*
**********************************************************************
-* Copyright (c) 2001-2004, International Business Machines
+* Copyright (c) 2001-2006, International Business Machines
* Corporation and others. All Rights Reserved.
**********************************************************************
* Date Name Description
@@ -9,9 +9,7 @@
*/
#include "util.h"
-#include "unicode/uchar.h"
#include "unicode/unimatch.h"
-#include "uprops.h"
// Define UChar constants using hex for EBCDIC compatibility
@@ -29,6 +27,8 @@ static const UChar DIGITS[] = {
85,86,87,88,89,90
};
+U_NAMESPACE_BEGIN
+
UnicodeString& ICU_Utility::appendNumber(UnicodeString& result, int32_t n,
int32_t radix, int32_t minDigits) {
if (radix < 2 || radix > 36) {
@@ -214,69 +214,6 @@ UBool ICU_Utility::parseChar(const UnicodeString& id, int32_t& pos, UChar ch) {
return TRUE;
}
-/**
- * Parse a pattern string starting at offset pos. Keywords are
- * matched case-insensitively. Spaces may be skipped and may be
- * optional or required. Integer values may be parsed, and if
- * they are, they will be returned in the given array. If
- * successful, the offset of the next non-space character is
- * returned. On failure, -1 is returned.
- * @param pattern must only contain lowercase characters, which
- * will match their uppercase equivalents as well. A space
- * character matches one or more required spaces. A '~' character
- * matches zero or more optional spaces. A '#' character matches
- * an integer and stores it in parsedInts, which the caller must
- * ensure has enough capacity.
- * @param parsedInts array to receive parsed integers. Caller
- * must ensure that parsedInts.length is >= the number of '#'
- * signs in 'pattern'.
- * @return the position after the last character parsed, or -1 if
- * the parse failed
- */
-int32_t ICU_Utility::parsePattern(const UnicodeString& rule, int32_t pos, int32_t limit,
- const UnicodeString& pattern, int32_t* parsedInts) {
- // TODO Update this to handle surrogates
- int32_t p;
- int32_t intCount = 0; // number of integers parsed
- for (int32_t i=0; i= limit) {
- return -1;
- }
- c = rule.charAt(pos++);
- if (!uprv_isRuleWhiteSpace(c)) {
- return -1;
- }
- // FALL THROUGH to skipWhitespace
- case 126 /*'~'*/:
- pos = skipWhitespace(rule, pos);
- break;
- case 35 /*'#'*/:
- p = pos;
- parsedInts[intCount++] = parseInteger(rule, p, limit);
- if (p == pos) {
- // Syntax error; failed to parse integer
- return -1;
- }
- pos = p;
- break;
- default:
- if (pos >= limit) {
- return -1;
- }
- c = (UChar) u_tolower(rule.charAt(pos++));
- if (c != cpat) {
- return -1;
- }
- break;
- }
- }
- return pos;
-}
-
/**
* Parse a pattern string within the given Replaceable and a parsing
* pattern. Characters are matched literally and case-sensitively
@@ -343,140 +280,6 @@ int32_t ICU_Utility::parsePattern(const UnicodeString& pat,
return -1; // text ended before end of pat
}
-/**
- * Parse an integer at pos, either of the form \d+ or of the form
- * 0x[0-9A-Fa-f]+ or 0[0-7]+, that is, in standard decimal, hex,
- * or octal format.
- * @param pos INPUT-OUTPUT parameter. On input, the first
- * character to parse. On output, the character after the last
- * parsed character.
- */
-int32_t ICU_Utility::parseInteger(const UnicodeString& rule, int32_t& pos, int32_t limit) {
- int32_t count = 0;
- int32_t value = 0;
- int32_t p = pos;
- int8_t radix = 10;
-
- if (p < limit && rule.charAt(p) == 48 /*0*/) {
- if (p+1 < limit && (rule.charAt(p+1) == 0x78 /*x*/ || rule.charAt(p+1) == 0x58 /*X*/)) {
- p += 2;
- radix = 16;
- }
- else {
- p++;
- count = 1;
- radix = 8;
- }
- }
-
- while (p < limit) {
- int32_t d = u_digit(rule.charAt(p++), radix);
- if (d < 0) {
- --p;
- break;
- }
- ++count;
- int32_t v = (value * radix) + d;
- if (v <= value) {
- // If there are too many input digits, at some point
- // the value will go negative, e.g., if we have seen
- // "0x8000000" already and there is another '0', when
- // we parse the next 0 the value will go negative.
- return 0;
- }
- value = v;
- }
- if (count > 0) {
- pos = p;
- }
- return value;
-}
-
-/**
- * Parse a Unicode identifier from the given string at the given
- * position. Return the identifier, or an empty string if there
- * is no identifier.
- * @param str the string to parse
- * @param pos INPUT-OUPUT parameter. On INPUT, pos is the
- * first character to examine. It must be less than str.length(),
- * and it must not point to a whitespace character. That is, must
- * have pos < str.length() and
- * !uprv_isRuleWhiteSpace(str.char32At(pos)). On
- * OUTPUT, the position after the last parsed character.
- * @return the Unicode identifier, or an empty string if there is
- * no valid identifier at pos.
- */
-UnicodeString ICU_Utility::parseUnicodeIdentifier(const UnicodeString& str, int32_t& pos) {
- // assert(pos < str.length());
- // assert(!uprv_isRuleWhiteSpace(str.char32At(pos)));
- UnicodeString buf;
- int p = pos;
- while (p < str.length()) {
- UChar32 ch = str.char32At(p);
- if (buf.length() == 0) {
- if (u_isIDStart(ch)) {
- buf.append(ch);
- } else {
- buf.truncate(0);
- return buf;
- }
- } else {
- if (u_isIDPart(ch)) {
- buf.append(ch);
- } else {
- break;
- }
- }
- p += UTF_CHAR_LENGTH(ch);
- }
- pos = p;
- return buf;
-}
-
-/**
- * Parse an unsigned 31-bit integer at the given offset. Use
- * UCharacter.digit() to parse individual characters into digits.
- * @param text the text to be parsed
- * @param pos INPUT-OUTPUT parameter. On entry, pos[0] is the
- * offset within text at which to start parsing; it should point
- * to a valid digit. On exit, pos[0] is the offset after the last
- * parsed character. If the parse failed, it will be unchanged on
- * exit. Must be >= 0 on entry.
- * @param radix the radix in which to parse; must be >= 2 and <=
- * 36.
- * @return a non-negative parsed number, or -1 upon parse failure.
- * Parse fails if there are no digits, that is, if pos[0] does not
- * point to a valid digit on entry, or if the number to be parsed
- * does not fit into a 31-bit unsigned integer.
- */
-int32_t ICU_Utility::parseNumber(const UnicodeString& text,
- int32_t& pos, int8_t radix) {
- // assert(pos[0] >= 0);
- // assert(radix >= 2);
- // assert(radix <= 36);
- int32_t n = 0;
- int32_t p = pos;
- while (p < text.length()) {
- UChar32 ch = text.char32At(p);
- int32_t d = u_digit(ch, radix);
- if (d < 0) {
- break;
- }
- n = radix*n + d;
- // ASSUME that when a 32-bit integer overflows it becomes
- // negative. E.g., 214748364 * 10 + 8 => negative value.
- if (n < 0) {
- return -1;
- }
- ++p;
- }
- if (p == pos) {
- return -1;
- }
- pos = p;
- return n;
-}
-
/**
* Append a character to a rule that is being built up. To flush
* the quoteBuf to rule, make one final call with isLiteral == TRUE.
@@ -609,12 +412,15 @@ void ICU_Utility::appendToRule(UnicodeString& rule,
}
}
+U_NAMESPACE_END
+
U_CAPI UBool U_EXPORT2
uprv_isRuleWhiteSpace(UChar32 c) {
/* "white space" in the sense of ICU rule parsers
This is a FIXED LIST that is NOT DEPENDENT ON UNICODE PROPERTIES.
- See UTR #31: http://www.unicode.org/reports/tr31/.
+ See UAX #31 Identifier and Pattern Syntax: http://www.unicode.org/reports/tr31/
U+0009..U+000D, U+0020, U+0085, U+200E..U+200F, and U+2028..U+2029
+ Equivalent to test for Pattern_White_Space Unicode property.
*/
return (c >= 0x0009 && c <= 0x2029 &&
(c <= 0x000D || c == 0x0020 || c == 0x0085 ||
diff --git a/icuSources/common/util.h b/icuSources/common/util.h
index a5841dc9..6af528b0 100644
--- a/icuSources/common/util.h
+++ b/icuSources/common/util.h
@@ -1,6 +1,6 @@
/*
**********************************************************************
-* Copyright (c) 2001-2004, International Business Machines
+* Copyright (c) 2001-2005, International Business Machines
* Corporation and others. All Rights Reserved.
**********************************************************************
* Date Name Description
@@ -236,6 +236,9 @@ U_NAMESPACE_END
/**
* Is this character a "white space" in the sense of ICU rule parsers?
+ * Equivalent to test for Pattern_White_Space Unicode property.
+ * Stable set of characters, won't change.
+ * See UAX #31 Identifier and Pattern Syntax: http://www.unicode.org/reports/tr31/
* @internal
*/
U_CAPI UBool U_EXPORT2
diff --git a/icuSources/common/util_props.cpp b/icuSources/common/util_props.cpp
new file mode 100644
index 00000000..f91666b4
--- /dev/null
+++ b/icuSources/common/util_props.cpp
@@ -0,0 +1,214 @@
+/*
+**********************************************************************
+* Copyright (c) 2001-2006, International Business Machines
+* Corporation and others. All Rights Reserved.
+**********************************************************************
+* Date Name Description
+* 11/19/2001 aliu Creation.
+**********************************************************************
+*/
+
+#include "util.h"
+#include "unicode/uchar.h"
+
+U_NAMESPACE_BEGIN
+
+/**
+ * Parse an integer at pos, either of the form \d+ or of the form
+ * 0x[0-9A-Fa-f]+ or 0[0-7]+, that is, in standard decimal, hex,
+ * or octal format.
+ * @param pos INPUT-OUTPUT parameter. On input, the first
+ * character to parse. On output, the character after the last
+ * parsed character.
+ */
+int32_t ICU_Utility::parseInteger(const UnicodeString& rule, int32_t& pos, int32_t limit) {
+ int32_t count = 0;
+ int32_t value = 0;
+ int32_t p = pos;
+ int8_t radix = 10;
+
+ if (p < limit && rule.charAt(p) == 48 /*0*/) {
+ if (p+1 < limit && (rule.charAt(p+1) == 0x78 /*x*/ || rule.charAt(p+1) == 0x58 /*X*/)) {
+ p += 2;
+ radix = 16;
+ }
+ else {
+ p++;
+ count = 1;
+ radix = 8;
+ }
+ }
+
+ while (p < limit) {
+ int32_t d = u_digit(rule.charAt(p++), radix);
+ if (d < 0) {
+ --p;
+ break;
+ }
+ ++count;
+ int32_t v = (value * radix) + d;
+ if (v <= value) {
+ // If there are too many input digits, at some point
+ // the value will go negative, e.g., if we have seen
+ // "0x8000000" already and there is another '0', when
+ // we parse the next 0 the value will go negative.
+ return 0;
+ }
+ value = v;
+ }
+ if (count > 0) {
+ pos = p;
+ }
+ return value;
+}
+
+/**
+ * Parse a pattern string starting at offset pos. Keywords are
+ * matched case-insensitively. Spaces may be skipped and may be
+ * optional or required. Integer values may be parsed, and if
+ * they are, they will be returned in the given array. If
+ * successful, the offset of the next non-space character is
+ * returned. On failure, -1 is returned.
+ * @param pattern must only contain lowercase characters, which
+ * will match their uppercase equivalents as well. A space
+ * character matches one or more required spaces. A '~' character
+ * matches zero or more optional spaces. A '#' character matches
+ * an integer and stores it in parsedInts, which the caller must
+ * ensure has enough capacity.
+ * @param parsedInts array to receive parsed integers. Caller
+ * must ensure that parsedInts.length is >= the number of '#'
+ * signs in 'pattern'.
+ * @return the position after the last character parsed, or -1 if
+ * the parse failed
+ */
+int32_t ICU_Utility::parsePattern(const UnicodeString& rule, int32_t pos, int32_t limit,
+ const UnicodeString& pattern, int32_t* parsedInts) {
+ // TODO Update this to handle surrogates
+ int32_t p;
+ int32_t intCount = 0; // number of integers parsed
+ for (int32_t i=0; i= limit) {
+ return -1;
+ }
+ c = rule.charAt(pos++);
+ if (!uprv_isRuleWhiteSpace(c)) {
+ return -1;
+ }
+ // FALL THROUGH to skipWhitespace
+ case 126 /*'~'*/:
+ pos = skipWhitespace(rule, pos);
+ break;
+ case 35 /*'#'*/:
+ p = pos;
+ parsedInts[intCount++] = parseInteger(rule, p, limit);
+ if (p == pos) {
+ // Syntax error; failed to parse integer
+ return -1;
+ }
+ pos = p;
+ break;
+ default:
+ if (pos >= limit) {
+ return -1;
+ }
+ c = (UChar) u_tolower(rule.charAt(pos++));
+ if (c != cpat) {
+ return -1;
+ }
+ break;
+ }
+ }
+ return pos;
+}
+
+/**
+ * Parse a Unicode identifier from the given string at the given
+ * position. Return the identifier, or an empty string if there
+ * is no identifier.
+ * @param str the string to parse
+ * @param pos INPUT-OUPUT parameter. On INPUT, pos is the
+ * first character to examine. It must be less than str.length(),
+ * and it must not point to a whitespace character. That is, must
+ * have pos < str.length() and
+ * !uprv_isRuleWhiteSpace(str.char32At(pos)). On
+ * OUTPUT, the position after the last parsed character.
+ * @return the Unicode identifier, or an empty string if there is
+ * no valid identifier at pos.
+ */
+UnicodeString ICU_Utility::parseUnicodeIdentifier(const UnicodeString& str, int32_t& pos) {
+ // assert(pos < str.length());
+ // assert(!uprv_isRuleWhiteSpace(str.char32At(pos)));
+ UnicodeString buf;
+ int p = pos;
+ while (p < str.length()) {
+ UChar32 ch = str.char32At(p);
+ if (buf.length() == 0) {
+ if (u_isIDStart(ch)) {
+ buf.append(ch);
+ } else {
+ buf.truncate(0);
+ return buf;
+ }
+ } else {
+ if (u_isIDPart(ch)) {
+ buf.append(ch);
+ } else {
+ break;
+ }
+ }
+ p += UTF_CHAR_LENGTH(ch);
+ }
+ pos = p;
+ return buf;
+}
+
+/**
+ * Parse an unsigned 31-bit integer at the given offset. Use
+ * UCharacter.digit() to parse individual characters into digits.
+ * @param text the text to be parsed
+ * @param pos INPUT-OUTPUT parameter. On entry, pos[0] is the
+ * offset within text at which to start parsing; it should point
+ * to a valid digit. On exit, pos[0] is the offset after the last
+ * parsed character. If the parse failed, it will be unchanged on
+ * exit. Must be >= 0 on entry.
+ * @param radix the radix in which to parse; must be >= 2 and <=
+ * 36.
+ * @return a non-negative parsed number, or -1 upon parse failure.
+ * Parse fails if there are no digits, that is, if pos[0] does not
+ * point to a valid digit on entry, or if the number to be parsed
+ * does not fit into a 31-bit unsigned integer.
+ */
+int32_t ICU_Utility::parseNumber(const UnicodeString& text,
+ int32_t& pos, int8_t radix) {
+ // assert(pos[0] >= 0);
+ // assert(radix >= 2);
+ // assert(radix <= 36);
+ int32_t n = 0;
+ int32_t p = pos;
+ while (p < text.length()) {
+ UChar32 ch = text.char32At(p);
+ int32_t d = u_digit(ch, radix);
+ if (d < 0) {
+ break;
+ }
+ n = radix*n + d;
+ // ASSUME that when a 32-bit integer overflows it becomes
+ // negative. E.g., 214748364 * 10 + 8 => negative value.
+ if (n < 0) {
+ return -1;
+ }
+ ++p;
+ }
+ if (p == pos) {
+ return -1;
+ }
+ pos = p;
+ return n;
+}
+
+U_NAMESPACE_END
+
diff --git a/icuSources/common/utrace.c b/icuSources/common/utrace.c
index eca15036..b2526bb2 100644
--- a/icuSources/common/utrace.c
+++ b/icuSources/common/utrace.c
@@ -1,6 +1,6 @@
/*
*******************************************************************************
-* Copyright (C) 2003-2004, International Business Machines
+* Copyright (C) 2003-2005, International Business Machines
* Corporation and others. All Rights Reserved.
*******************************************************************************
* file name: utrace.c
@@ -230,7 +230,7 @@ utrace_vformat(char *outBuf, int32_t capacity, int32_t indent, const char *fmt,
/* UChar * string, with length, len==-1 for null terminated. */
ptrArg = va_arg(args, void *); /* Ptr */
intArg =(int32_t)va_arg(args, int32_t); /* Length */
- outputUString((const unsigned short *)ptrArg, intArg, outBuf, &outIx, capacity, indent);
+ outputUString((const UChar *)ptrArg, intArg, outBuf, &outIx, capacity, indent);
break;
case 'b':
@@ -338,7 +338,7 @@ utrace_vformat(char *outBuf, int32_t capacity, int32_t indent, const char *fmt,
case 'S':
charsToOutput = 0;
- outputUString((const unsigned short *)*ptrPtr, -1, outBuf, &outIx, capacity, indent);
+ outputUString((const UChar *)*ptrPtr, -1, outBuf, &outIx, capacity, indent);
outputChar('\n', outBuf, &outIx, capacity, indent);
longArg = *ptrPtr==NULL? 0: 1; /* for test for null term. array. */
ptrPtr++;
diff --git a/icuSources/common/utrie.c b/icuSources/common/utrie.c
index b6b72c88..812c89db 100644
--- a/icuSources/common/utrie.c
+++ b/icuSources/common/utrie.c
@@ -1,7 +1,7 @@
/*
******************************************************************************
*
-* Copyright (C) 2001-2004, International Business Machines
+* Copyright (C) 2001-2006, International Business Machines
* Corporation and others. All Rights Reserved.
*
******************************************************************************
@@ -23,13 +23,24 @@
#endif
#include "unicode/utypes.h"
-#include "udataswp.h"
#include "cmemory.h"
#include "utrie.h"
+/* miscellaneous ------------------------------------------------------------ */
+
#undef ABS
#define ABS(x) ((x)>=0 ? (x) : -(x))
+static U_INLINE UBool
+equal_uint32(const uint32_t *s, const uint32_t *t, int32_t length) {
+ while(length>0 && *s==*t) {
+ ++s;
+ ++t;
+ --length;
+ }
+ return (UBool)(length==0);
+}
+
/* Building a trie ----------------------------------------------------------*/
U_CAPI UNewTrie * U_EXPORT2
@@ -539,18 +550,13 @@ _findUnusedBlocks(UNewTrie *trie) {
static int32_t
_findSameDataBlock(const uint32_t *data, int32_t dataLength,
int32_t otherBlock, int32_t step) {
- int32_t block, i;
+ int32_t block;
/* ensure that we do not even partially get past dataLength */
dataLength-=UTRIE_DATA_BLOCK_LENGTH;
for(block=0; block<=dataLength; block+=step) {
- for(i=0; idataLength;) {
/*
* start: index of first entry of current block
- * prevEnd: index to last entry of previous block
* newStart: index where the current block is to be moved
+ * (right after current end of already-compacted data)
*/
/* skip blocks that are not used */
@@ -613,7 +617,7 @@ utrie_compact(UNewTrie *trie, UBool overlap, UErrorCode *pErrorCode) {
/* advance start to the next block */
start+=UTRIE_DATA_BLOCK_LENGTH;
- /* leave prevEnd and newStart with the previous block! */
+ /* leave newStart with the previous block! */
continue;
}
@@ -629,19 +633,16 @@ utrie_compact(UNewTrie *trie, UBool overlap, UErrorCode *pErrorCode) {
/* advance start to the next block */
start+=UTRIE_DATA_BLOCK_LENGTH;
- /* leave prevEnd and newStart with the previous block! */
+ /* leave newStart with the previous block! */
continue;
}
/* see if the beginning of this block can be overlapped with the end of the previous block */
- /* x: first value in the current block */
- x=trie->data[start];
- if(x==trie->data[prevEnd] && overlap && start>=overlapStart) {
- /* overlap by at least one */
- for(i=1; idata[start+i] && x==trie->data[prevEnd-i]; ++i) {}
-
- /* overlap by i, rounded down for the data block granularity */
- i&=~(UTRIE_DATA_GRANULARITY-1);
+ if(overlap && start>=overlapStart) {
+ /* look for maximum overlap (modulo granularity) with the previous, adjacent block */
+ for(i=UTRIE_DATA_BLOCK_LENGTH-UTRIE_DATA_GRANULARITY;
+ i>0 && !equal_uint32(trie->data+(newStart-i), trie->data+start, i);
+ i-=UTRIE_DATA_GRANULARITY) {}
} else {
i=0;
}
@@ -666,8 +667,6 @@ utrie_compact(UNewTrie *trie, UBool overlap, UErrorCode *pErrorCode) {
newStart+=UTRIE_DATA_BLOCK_LENGTH;
start=newStart;
}
-
- prevEnd=newStart-1;
}
/* now adjust the index (stage 1) table */
@@ -686,55 +685,6 @@ utrie_compact(UNewTrie *trie, UBool overlap, UErrorCode *pErrorCode) {
/* serialization ------------------------------------------------------------ */
-/**
- * Trie data structure in serialized form:
- *
- * UTrieHeader header;
- * uint16_t index[header.indexLength];
- * uint16_t data[header.dataLength];
- */
-struct UTrieHeader {
- /** "Trie" in big-endian US-ASCII (0x54726965) */
- uint32_t signature;
-
- /**
- * options bit field:
- * 9 1=Latin-1 data is stored linearly at data+UTRIE_DATA_BLOCK_LENGTH
- * 8 0=16-bit data, 1=32-bit data
- * 7..4 UTRIE_INDEX_SHIFT // 0..UTRIE_SHIFT
- * 3..0 UTRIE_SHIFT // 1..9
- */
- uint32_t options;
-
- /** indexLength is a multiple of UTRIE_SURROGATE_BLOCK_COUNT */
- int32_t indexLength;
-
- /** dataLength>=UTRIE_DATA_BLOCK_LENGTH */
- int32_t dataLength;
-};
-
-typedef struct UTrieHeader UTrieHeader;
-
-/**
- * Constants for use with UTrieHeader.options.
- */
-enum {
- /** Mask to get the UTRIE_SHIFT value from options. */
- UTRIE_OPTIONS_SHIFT_MASK=0xf,
-
- /** Shift options right this much to get the UTRIE_INDEX_SHIFT value. */
- UTRIE_OPTIONS_INDEX_SHIFT=4,
-
- /** If set, then the data (stage 2) array is 32 bits wide. */
- UTRIE_OPTIONS_DATA_IS_32_BIT=0x100,
-
- /**
- * If set, then Latin-1 data (for U+0000..U+00ff) is stored in the data (stage 2) array
- * as a simple, linear array at data+UTRIE_DATA_BLOCK_LENGTH.
- */
- UTRIE_OPTIONS_LATIN1_IS_LINEAR=0x200
-};
-
/*
* Default function for the folding value:
* Just store the offset (16 bits) if there is any non-initial-value entry.
@@ -882,15 +832,15 @@ utrie_serialize(UNewTrie *trie, void *dt, int32_t capacity,
}
/* inverse to defaultGetFoldedValue() */
-static int32_t U_CALLCONV
-defaultGetFoldingOffset(uint32_t data) {
+U_CAPI int32_t U_EXPORT2
+utrie_defaultGetFoldingOffset(uint32_t data) {
return (int32_t)data;
}
U_CAPI int32_t U_EXPORT2
utrie_unserialize(UTrie *trie, const void *data, int32_t length, UErrorCode *pErrorCode) {
- UTrieHeader *header;
- uint16_t *p16;
+ const UTrieHeader *header;
+ const uint16_t *p16;
uint32_t options;
if(pErrorCode==NULL || U_FAILURE(*pErrorCode)) {
@@ -904,7 +854,7 @@ utrie_unserialize(UTrie *trie, const void *data, int32_t length, UErrorCode *pEr
}
/* check the signature */
- header=(UTrieHeader *)data;
+ header=(const UTrieHeader *)data;
if(header->signature!=0x54726965) {
*pErrorCode=U_INVALID_FORMAT_ERROR;
return -1;
@@ -931,7 +881,7 @@ utrie_unserialize(UTrie *trie, const void *data, int32_t length, UErrorCode *pEr
*pErrorCode=U_INVALID_FORMAT_ERROR;
return -1;
}
- p16=(uint16_t *)(header+1);
+ p16=(const uint16_t *)(header+1);
trie->index=p16;
p16+=trie->indexLength;
length-=2*trie->indexLength;
@@ -957,82 +907,124 @@ utrie_unserialize(UTrie *trie, const void *data, int32_t length, UErrorCode *pEr
length=(int32_t)sizeof(UTrieHeader)+2*trie->indexLength+2*trie->dataLength;
}
- trie->getFoldingOffset=defaultGetFoldingOffset;
+ trie->getFoldingOffset=utrie_defaultGetFoldingOffset;
return length;
}
-/* swapping ----------------------------------------------------------------- */
-
U_CAPI int32_t U_EXPORT2
-utrie_swap(const UDataSwapper *ds,
- const void *inData, int32_t length, void *outData,
- UErrorCode *pErrorCode) {
- const UTrieHeader *inTrie;
- UTrieHeader trie;
- int32_t size;
- UBool dataIs32;
+utrie_unserializeDummy(UTrie *trie,
+ void *data, int32_t length,
+ uint32_t initialValue, uint32_t leadUnitValue,
+ UBool make16BitTrie,
+ UErrorCode *pErrorCode) {
+ uint16_t *p16;
+ int32_t actualLength, latin1Length, i, limit;
+ uint16_t block;
if(pErrorCode==NULL || U_FAILURE(*pErrorCode)) {
- return 0;
+ return -1;
}
- if(ds==NULL || inData==NULL || (length>=0 && outData==NULL)) {
- *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR;
- return 0;
+
+ /* calculate the actual size of the dummy trie data */
+
+ /* max(Latin-1, block 0) */
+ latin1Length= UTRIE_SHIFT<=8 ? 256 : UTRIE_DATA_BLOCK_LENGTH;
+
+ trie->indexLength=UTRIE_BMP_INDEX_LENGTH+UTRIE_SURROGATE_BLOCK_COUNT;
+ trie->dataLength=latin1Length;
+ if(leadUnitValue!=initialValue) {
+ trie->dataLength+=UTRIE_DATA_BLOCK_LENGTH;
}
- /* setup and swapping */
- if(length>=0 && lengthindexLength*2;
+ if(make16BitTrie) {
+ actualLength+=trie->dataLength*2;
+ } else {
+ actualLength+=trie->dataLength*4;
}
- inTrie=(const UTrieHeader *)inData;
- trie.signature=ds->readUInt32(inTrie->signature);
- trie.options=ds->readUInt32(inTrie->options);
- trie.indexLength=udata_readInt32(ds, inTrie->indexLength);
- trie.dataLength=udata_readInt32(ds, inTrie->dataLength);
-
- if( trie.signature!=0x54726965 ||
- (trie.options&UTRIE_OPTIONS_SHIFT_MASK)!=UTRIE_SHIFT ||
- ((trie.options>>UTRIE_OPTIONS_INDEX_SHIFT)&UTRIE_OPTIONS_SHIFT_MASK)!=UTRIE_INDEX_SHIFT ||
- trie.indexLengthisLatin1Linear=TRUE;
+ trie->initialValue=initialValue;
- if(length>=0) {
- UTrieHeader *outTrie;
+ /* fill the index and data arrays */
+ p16=(uint16_t *)data;
+ trie->index=p16;
- if(lengthindexLength>>UTRIE_INDEX_SHIFT);
+ limit=trie->indexLength;
+ for(i=0; i>UTRIE_INDEX_SHIFT);
+ i=0xd800>>UTRIE_SHIFT;
+ limit=0xdc00>>UTRIE_SHIFT;
+ for(; iswapArray32(ds, inTrie, sizeof(UTrieHeader), outTrie, pErrorCode);
+ trie->data32=NULL;
- /* swap the index and the data */
- if(dataIs32) {
- ds->swapArray16(ds, inTrie+1, trie.indexLength*2, outTrie+1, pErrorCode);
- ds->swapArray32(ds, (const uint16_t *)(inTrie+1)+trie.indexLength, trie.dataLength*4,
- (uint16_t *)(outTrie+1)+trie.indexLength, pErrorCode);
- } else {
- ds->swapArray16(ds, inTrie+1, (trie.indexLength+trie.dataLength)*2, outTrie+1, pErrorCode);
+ /* Latin-1 data */
+ p16+=trie->indexLength;
+ for(i=0; iindexLength*2);
+
+ if(leadUnitValue!=initialValue) {
+ /* indexes for lead surrogate code units to the block after Latin-1 */
+ block=(uint16_t)(latin1Length>>UTRIE_INDEX_SHIFT);
+ i=0xd800>>UTRIE_SHIFT;
+ limit=0xdc00>>UTRIE_SHIFT;
+ for(; idata32=p32=(uint32_t *)(p16+trie->indexLength);
+
+ /* Latin-1 data */
+ for(i=0; igetFoldingOffset=utrie_defaultGetFoldingOffset;
+
+ return actualLength;
}
/* enumeration -------------------------------------------------------------- */
diff --git a/icuSources/common/utrie.h b/icuSources/common/utrie.h
index 0492f0f0..d8d77ac4 100644
--- a/icuSources/common/utrie.h
+++ b/icuSources/common/utrie.h
@@ -1,7 +1,7 @@
/*
******************************************************************************
*
-* Copyright (C) 2001-2004, International Business Machines
+* Copyright (C) 2001-2006, International Business Machines
* Corporation and others. All Rights Reserved.
*
******************************************************************************
@@ -110,6 +110,23 @@ enum {
*/
#define UTRIE_MAX_BUILD_TIME_DATA_LENGTH (0x110000+UTRIE_DATA_BLOCK_LENGTH+0x400)
+/**
+ * Number of bytes for a dummy trie.
+ * A dummy trie is an empty runtime trie, used when a real data trie cannot
+ * be loaded.
+ * The number of bytes works for Latin-1-linear tries with 32-bit data
+ * (worst case).
+ *
+ * Calculation:
+ * BMP index + 1 index block for lead surrogate code points +
+ * Latin-1-linear array + 1 data block for lead surrogate code points
+ *
+ * Latin-1: if(UTRIE_SHIFT<=8) { 256 } else { included in first data block }
+ *
+ * @see utrie_unserializeDummy
+ */
+#define UTRIE_DUMMY_SIZE ((UTRIE_BMP_INDEX_LENGTH+UTRIE_SURROGATE_BLOCK_COUNT)*2+(UTRIE_SHIFT<=8?256:UTRIE_DATA_BLOCK_LENGTH)*4+UTRIE_DATA_BLOCK_LENGTH*4)
+
/**
* Runtime UTrie callback function.
* Extract from a lead surrogate's data the
@@ -483,6 +500,45 @@ utrie_enum(const UTrie *trie,
U_CAPI int32_t U_EXPORT2
utrie_unserialize(UTrie *trie, const void *data, int32_t length, UErrorCode *pErrorCode);
+/**
+ * "Unserialize" a dummy trie.
+ * A dummy trie is an empty runtime trie, used when a real data trie cannot
+ * be loaded.
+ *
+ * The input memory is filled so that the trie always returns the initialValue,
+ * or the leadUnitValue for lead surrogate code points.
+ * The Latin-1 part is always set up to be linear.
+ *
+ * @param trie a pointer to the runtime trie structure
+ * @param data a pointer to 32-bit-aligned memory to be filled with the dummy trie data
+ * @param length the number of bytes available at data (recommended to use UTRIE_DUMMY_SIZE)
+ * @param initialValue the initial value that is set for all code points
+ * @param leadUnitValue the value for lead surrogate code _units_ that do not
+ * have associated supplementary data
+ * @param pErrorCode an in/out ICU UErrorCode
+ *
+ * @see UTRIE_DUMMY_SIZE
+ * @see utrie_open
+ */
+U_CAPI int32_t U_EXPORT2
+utrie_unserializeDummy(UTrie *trie,
+ void *data, int32_t length,
+ uint32_t initialValue, uint32_t leadUnitValue,
+ UBool make16BitTrie,
+ UErrorCode *pErrorCode);
+
+/**
+ * Default implementation for UTrie.getFoldingOffset, set automatically by
+ * utrie_unserialize().
+ * Simply returns the lead surrogate's value itself - which is the inverse
+ * of the default folding function used by utrie_serialize().
+ * Exported for static const UTrie structures.
+ *
+ * @see UTrieGetFoldingOffset
+ */
+U_CAPI int32_t U_EXPORT2
+utrie_defaultGetFoldingOffset(uint32_t data);
+
/* Building a trie ----------------------------------------------------------*/
/**
@@ -680,6 +736,57 @@ utrie_swap(const UDataSwapper *ds,
const void *inData, int32_t length, void *outData,
UErrorCode *pErrorCode);
+/* serialization ------------------------------------------------------------ */
+
+/**
+ * Trie data structure in serialized form:
+ *
+ * UTrieHeader header;
+ * uint16_t index[header.indexLength];
+ * uint16_t data[header.dataLength];
+ * @internal
+ */
+typedef struct UTrieHeader {
+ /** "Trie" in big-endian US-ASCII (0x54726965) */
+ uint32_t signature;
+
+ /**
+ * options bit field:
+ * 9 1=Latin-1 data is stored linearly at data+UTRIE_DATA_BLOCK_LENGTH
+ * 8 0=16-bit data, 1=32-bit data
+ * 7..4 UTRIE_INDEX_SHIFT // 0..UTRIE_SHIFT
+ * 3..0 UTRIE_SHIFT // 1..9
+ */
+ uint32_t options;
+
+ /** indexLength is a multiple of UTRIE_SURROGATE_BLOCK_COUNT */
+ int32_t indexLength;
+
+ /** dataLength>=UTRIE_DATA_BLOCK_LENGTH */
+ int32_t dataLength;
+} UTrieHeader;
+
+/**
+ * Constants for use with UTrieHeader.options.
+ * @internal
+ */
+enum {
+ /** Mask to get the UTRIE_SHIFT value from options. */
+ UTRIE_OPTIONS_SHIFT_MASK=0xf,
+
+ /** Shift options right this much to get the UTRIE_INDEX_SHIFT value. */
+ UTRIE_OPTIONS_INDEX_SHIFT=4,
+
+ /** If set, then the data (stage 2) array is 32 bits wide. */
+ UTRIE_OPTIONS_DATA_IS_32_BIT=0x100,
+
+ /**
+ * If set, then Latin-1 data (for U+0000..U+00ff) is stored in the data (stage 2) array
+ * as a simple, linear array at data+UTRIE_DATA_BLOCK_LENGTH.
+ */
+ UTRIE_OPTIONS_LATIN1_IS_LINEAR=0x200
+};
+
U_CDECL_END
#endif
diff --git a/icuSources/common/utypes.c b/icuSources/common/utypes.c
index 02f5f006..2255b0c1 100644
--- a/icuSources/common/utypes.c
+++ b/icuSources/common/utypes.c
@@ -1,7 +1,7 @@
/*
******************************************************************************
*
-* Copyright (C) 1997-2004, International Business Machines
+* Copyright (C) 1997-2006, International Business Machines
* Corporation and others. All Rights Reserved.
*
******************************************************************************
@@ -100,7 +100,8 @@ _uErrorName[U_STANDARD_ERROR_LIMIT]={
"U_INVARIANT_CONVERSION_ERROR",
"U_INVALID_STATE_ERROR",
"U_COLLATOR_VERSION_MISMATCH",
- "U_USELESS_COLLATOR_ERROR"
+ "U_USELESS_COLLATOR_ERROR",
+ "U_NO_WRITE_PERMISSION"
};
static const char * const
_uFmtErrorName[U_FMT_PARSE_ERROR_LIMIT - U_FMT_PARSE_ERROR_START] = {
@@ -120,7 +121,6 @@ _uFmtErrorName[U_FMT_PARSE_ERROR_LIMIT - U_FMT_PARSE_ERROR_START] = {
static const char * const
_uBrkErrorName[U_BRK_ERROR_LIMIT - U_BRK_ERROR_START] = {
- "U_BRK_ERROR_START",
"U_BRK_INTERNAL_ERROR",
"U_BRK_HEX_DIGITS_EXPECTED",
"U_BRK_SEMICOLON_EXPECTED",
@@ -139,7 +139,6 @@ _uBrkErrorName[U_BRK_ERROR_LIMIT - U_BRK_ERROR_START] = {
static const char * const
_uRegexErrorName[U_REGEX_ERROR_LIMIT - U_REGEX_ERROR_START] = {
- "U_REGEX_ERROR_START",
"U_REGEX_INTERNAL_ERROR",
"U_REGEX_RULE_SYNTAX",
"U_REGEX_INVALID_STATE",
@@ -158,14 +157,14 @@ _uRegexErrorName[U_REGEX_ERROR_LIMIT - U_REGEX_ERROR_START] = {
static const char * const
_uIDNAErrorName[U_IDNA_ERROR_LIMIT - U_IDNA_ERROR_START] = {
- "U_IDNA_ERROR_START",
- "U_IDNA_PROHIBITED_ERROR",
- "U_IDNA_UNASSIGNED_ERROR",
- "U_IDNA_CHECK_BIDI_ERROR",
- "U_IDNA_STD3_ASCII_RULES_ERROR",
- "U_IDNA_ACE_PREFIX_ERROR",
- "U_IDNA_VERIFICATION_ERROR",
- "U_IDNA_LABEL_TOO_LONG_ERROR"
+ "U_STRINGPREP_PROHIBITED_ERROR",
+ "U_STRINGPREP_UNASSIGNED_ERROR",
+ "U_STRINGPREP_CHECK_BIDI_ERROR",
+ "U_IDNA_STD3_ASCII_RULES_ERROR",
+ "U_IDNA_ACE_PREFIX_ERROR",
+ "U_IDNA_VERIFICATION_ERROR",
+ "U_IDNA_LABEL_TOO_LONG_ERROR",
+ "U_IDNA_ZERO_LENGTH_LABEL_ERROR"
};
U_CAPI const char * U_EXPORT2
@@ -182,7 +181,7 @@ u_errorName(UErrorCode code) {
return _uBrkErrorName[code - U_BRK_ERROR_START];
} else if (U_REGEX_ERROR_START <= code && code < U_REGEX_ERROR_LIMIT) {
return _uRegexErrorName[code - U_REGEX_ERROR_START];
- } else if( U_IDNA_ERROR_START <= code && code <= U_IDNA_ERROR_LIMIT) {
+ } else if(U_IDNA_ERROR_START <= code && code < U_IDNA_ERROR_LIMIT) {
return _uIDNAErrorName[code - U_IDNA_ERROR_START];
} else {
return "[BOGUS UErrorCode]";
diff --git a/icuSources/common/uvector.cpp b/icuSources/common/uvector.cpp
index ca76a709..028ef39f 100644
--- a/icuSources/common/uvector.cpp
+++ b/icuSources/common/uvector.cpp
@@ -468,52 +468,5 @@ void UVector::sortedInsert(UHashTok tok, USortComparator *compare, UErrorCode& e
}
}
-UStack::UStack(UErrorCode &status) :
- UVector(status)
-{
-}
-
-UStack::UStack(int32_t initialCapacity, UErrorCode &status) :
- UVector(initialCapacity, status)
-{
-}
-
-UStack::UStack(UObjectDeleter *d, UKeyComparator *c, UErrorCode &status) :
- UVector(d, c, status)
-{
-}
-
-UStack::UStack(UObjectDeleter *d, UKeyComparator *c, int32_t initialCapacity, UErrorCode &status) :
- UVector(d, c, initialCapacity, status)
-{
-}
-
-UStack::~UStack() {}
-
-void* UStack::pop(void) {
- int32_t n = size() - 1;
- void* result = 0;
- if (n >= 0) {
- result = elementAt(n);
- removeElementAt(n);
- }
- return result;
-}
-
-int32_t UStack::popi(void) {
- int32_t n = size() - 1;
- int32_t result = 0;
- if (n >= 0) {
- result = elementAti(n);
- removeElementAt(n);
- }
- return result;
-}
-
-int32_t UStack::search(void* obj) const {
- int32_t i = indexOf(obj);
- return (i >= 0) ? size() - i : i;
-}
-
U_NAMESPACE_END
diff --git a/icuSources/common/uvector.h b/icuSources/common/uvector.h
index 7cc8f916..710f0dbc 100644
--- a/icuSources/common/uvector.h
+++ b/icuSources/common/uvector.h
@@ -1,6 +1,6 @@
/*
**********************************************************************
-* Copyright (C) 1999-2004, International Business Machines
+* Copyright (C) 1999-2006, International Business Machines
* Corporation and others. All Rights Reserved.
**********************************************************************
* Date Name Description
@@ -247,15 +247,11 @@ public:
/**
* ICU "poor man's RTTI", returns a UClassID for this class.
- *
- * @draft ICU 2.2
*/
static UClassID U_EXPORT2 getStaticClassID();
/**
* ICU "poor man's RTTI", returns a UClassID for the actual class.
- *
- * @draft ICU 2.2
*/
virtual UClassID getDynamicClassID() const;
@@ -320,19 +316,19 @@ public:
int32_t push(int32_t i, UErrorCode &status);
+ /*
+ If the object o occurs as an item in this stack,
+ this method returns the 1-based distance from the top of the stack.
+ */
int32_t search(void* obj) const;
/**
* ICU "poor man's RTTI", returns a UClassID for this class.
- *
- * @draft ICU 2.2
*/
static UClassID U_EXPORT2 getStaticClassID();
/**
* ICU "poor man's RTTI", returns a UClassID for the actual class.
- *
- * @draft ICU 2.2
*/
virtual UClassID getDynamicClassID() const;
diff --git a/icuSources/common/uvectr32.h b/icuSources/common/uvectr32.h
index 7d73e220..68a3ee2e 100644
--- a/icuSources/common/uvectr32.h
+++ b/icuSources/common/uvectr32.h
@@ -1,6 +1,6 @@
/*
**********************************************************************
-* Copyright (C) 1999-2004, International Business Machines
+* Copyright (C) 1999-2006, International Business Machines
* Corporation and others. All Rights Reserved.
**********************************************************************
*/
@@ -69,7 +69,7 @@ public:
UVector32(int32_t initialCapacity, UErrorCode &status);
- ~UVector32();
+ virtual ~UVector32();
/**
* Assign this object to another (make this a copy of 'other').
@@ -163,15 +163,11 @@ public:
/**
* ICU "poor man's RTTI", returns a UClassID for this class.
- *
- * @draft ICU 2.2
*/
static UClassID U_EXPORT2 getStaticClassID();
/**
* ICU "poor man's RTTI", returns a UClassID for the actual class.
- *
- * @draft ICU 2.2
*/
virtual UClassID getDynamicClassID() const;
@@ -264,7 +260,7 @@ inline UBool UVector32::operator!=(const UVector32& other) {
inline int32_t *UVector32::getBuffer() const {
return elements;
-};
+}
// UStack inlines
diff --git a/icuSources/common/wintz.c b/icuSources/common/wintz.c
new file mode 100644
index 00000000..136eba9e
--- /dev/null
+++ b/icuSources/common/wintz.c
@@ -0,0 +1,581 @@
+/*
+********************************************************************************
+* Copyright (C) 2005-2006, International Business Machines
+* Corporation and others. All Rights Reserved.
+********************************************************************************
+*
+* File WINTZ.CPP
+*
+********************************************************************************
+*/
+
+#include "unicode/utypes.h"
+
+#ifdef U_WINDOWS
+
+#include "wintz.h"
+
+#include "cmemory.h"
+#include "cstring.h"
+
+#include "unicode/ustring.h"
+
+# define WIN32_LEAN_AND_MEAN
+# define VC_EXTRALEAN
+# define NOUSER
+# define NOSERVICE
+# define NOIME
+# define NOMCX
+#include
+
+#define ARRAY_SIZE(array) (sizeof array / sizeof array[0])
+#define NEW_ARRAY(type,count) (type *) uprv_malloc((count) * sizeof(type))
+#define DELETE_ARRAY(array) uprv_free((void *) (array))
+
+#define ICUID_STACK_BUFFER_SIZE 32
+
+/* The layout of the Tzi value in the registry */
+typedef struct
+{
+ int32_t bias;
+ int32_t standardBias;
+ int32_t daylightBias;
+ SYSTEMTIME standardDate;
+ SYSTEMTIME daylightDate;
+} TZI;
+
+typedef struct
+{
+ const char *icuid;
+ const char *winid;
+} WindowsICUMap;
+
+typedef struct {
+ const char* winid;
+ const char* altwinid;
+} WindowsZoneRemap;
+
+/**
+ * Various registry keys and key fragments.
+ */
+static const char CURRENT_ZONE_REGKEY[] = "SYSTEM\\CurrentControlSet\\Control\\TimeZoneInformation\\";
+static const char STANDARD_NAME_REGKEY[] = "StandardName";
+static const char STANDARD_TIME_REGKEY[] = " Standard Time";
+static const char TZI_REGKEY[] = "TZI";
+static const char STD_REGKEY[] = "Std";
+
+/**
+ * HKLM subkeys used to probe for the flavor of Windows. Note that we
+ * specifically check for the "GMT" zone subkey; this is present on
+ * NT, but on XP has become "GMT Standard Time". We need to
+ * discriminate between these cases.
+ */
+static const char* const WIN_TYPE_PROBE_REGKEY[] = {
+ /* WIN_9X_ME_TYPE */
+ "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Time Zones",
+
+ /* WIN_NT_TYPE */
+ "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Time Zones\\GMT"
+
+ /* otherwise: WIN_2K_XP_TYPE */
+};
+
+/**
+ * The time zone root subkeys (under HKLM) for different flavors of
+ * Windows.
+ */
+static const char* const TZ_REGKEY[] = {
+ /* WIN_9X_ME_TYPE */
+ "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Time Zones\\",
+
+ /* WIN_NT_TYPE | WIN_2K_XP_TYPE */
+ "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Time Zones\\"
+};
+
+/**
+ * Flavor of Windows, from our perspective. Not a real OS version,
+ * but rather the flavor of the layout of the time zone information in
+ * the registry.
+ */
+enum {
+ WIN_9X_ME_TYPE = 0,
+ WIN_NT_TYPE = 1,
+ WIN_2K_XP_TYPE = 2
+};
+
+/*
+ * TODO: Sort on ICU ID?
+ * TODO: This data should come from ICU/CLDR...
+ */
+static const WindowsICUMap ZONE_MAP[] = {
+ {"Etc/GMT+12", "Dateline"}, /* S (GMT-12:00) International Date Line West */
+
+ {"Pacific/Apia", "Samoa"}, /* S (GMT-11:00) Midway Island, Samoa */
+
+ {"Pacific/Honolulu", "Hawaiian"}, /* S (GMT-10:00) Hawaii */
+
+ {"America/Anchorage", "Alaskan"}, /* D (GMT-09:00) Alaska */
+
+ {"America/Los_Angeles", "Pacific"}, /* D (GMT-08:00) Pacific Time (US & Canada); Tijuana */
+
+ {"America/Phoenix", "US Mountain"}, /* S (GMT-07:00) Arizona */
+ {"America/Denver", "Mountain"}, /* D (GMT-07:00) Mountain Time (US & Canada) */
+ {"America/Chihuahua", "Mexico Standard Time 2"}, /* D (GMT-07:00) Chihuahua, La Paz, Mazatlan */
+
+ {"America/Managua", "Central America"}, /* S (GMT-06:00) Central America */
+ {"America/Regina", "Canada Central"}, /* S (GMT-06:00) Saskatchewan */
+ {"America/Mexico_City", "Mexico"}, /* D (GMT-06:00) Guadalajara, Mexico City, Monterrey */
+ {"America/Chicago", "Central"}, /* D (GMT-06:00) Central Time (US & Canada) */
+
+ {"America/Indianapolis", "US Eastern"}, /* S (GMT-05:00) Indiana (East) */
+ {"America/Bogota", "SA Pacific"}, /* S (GMT-05:00) Bogota, Lima, Quito */
+ {"America/New_York", "Eastern"}, /* D (GMT-05:00) Eastern Time (US & Canada) */
+
+ {"America/Caracas", "SA Western"}, /* S (GMT-04:00) Caracas, La Paz */
+ {"America/Santiago", "Pacific SA"}, /* D (GMT-04:00) Santiago */
+ {"America/Halifax", "Atlantic"}, /* D (GMT-04:00) Atlantic Time (Canada) */
+
+ {"America/St_Johns", "Newfoundland"}, /* D (GMT-03:30) Newfoundland */
+
+ {"America/Buenos_Aires", "SA Eastern"}, /* S (GMT-03:00) Buenos Aires, Georgetown */
+ {"America/Godthab", "Greenland"}, /* D (GMT-03:00) Greenland */
+ {"America/Sao_Paulo", "E. South America"}, /* D (GMT-03:00) Brasilia */
+
+ {"America/Noronha", "Mid-Atlantic"}, /* D (GMT-02:00) Mid-Atlantic */
+
+ {"Atlantic/Cape_Verde", "Cape Verde"}, /* S (GMT-01:00) Cape Verde Is. */
+ {"Atlantic/Azores", "Azores"}, /* D (GMT-01:00) Azores */
+
+ {"Africa/Casablanca", "Greenwich"}, /* S (GMT) Casablanca, Monrovia */
+ {"Europe/London", "GMT"}, /* D (GMT) Greenwich Mean Time : Dublin, Edinburgh, Lisbon, London */
+
+ {"Africa/Lagos", "W. Central Africa"}, /* S (GMT+01:00) West Central Africa */
+ {"Europe/Berlin", "W. Europe"}, /* D (GMT+01:00) Amsterdam, Berlin, Bern, Rome, Stockholm, Vienna */
+ {"Europe/Paris", "Romance"}, /* D (GMT+01:00) Brussels, Copenhagen, Madrid, Paris */
+ {"Europe/Sarajevo", "Central European"}, /* D (GMT+01:00) Sarajevo, Skopje, Warsaw, Zagreb */
+ {"Europe/Belgrade", "Central Europe"}, /* D (GMT+01:00) Belgrade, Bratislava, Budapest, Ljubljana, Prague */
+
+ {"Africa/Johannesburg", "South Africa"}, /* S (GMT+02:00) Harare, Pretoria */
+ {"Asia/Jerusalem", "Israel"}, /* S (GMT+02:00) Jerusalem */
+ {"Europe/Istanbul", "GTB"}, /* D (GMT+02:00) Athens, Istanbul, Minsk */
+ {"Europe/Helsinki", "FLE"}, /* D (GMT+02:00) Helsinki, Kyiv, Riga, Sofia, Tallinn, Vilnius */
+ {"Africa/Cairo", "Egypt"}, /* D (GMT+02:00) Cairo */
+ {"Europe/Bucharest", "E. Europe"}, /* D (GMT+02:00) Bucharest */
+
+ {"Africa/Nairobi", "E. Africa"}, /* S (GMT+03:00) Nairobi */
+ {"Asia/Riyadh", "Arab"}, /* S (GMT+03:00) Kuwait, Riyadh */
+ {"Europe/Moscow", "Russian"}, /* D (GMT+03:00) Moscow, St. Petersburg, Volgograd */
+ {"Asia/Baghdad", "Arabic"}, /* D (GMT+03:00) Baghdad */
+
+ {"Asia/Tehran", "Iran"}, /* D (GMT+03:30) Tehran */
+
+ {"Asia/Muscat", "Arabian"}, /* S (GMT+04:00) Abu Dhabi, Muscat */
+ {"Asia/Tbilisi", "Caucasus"}, /* D (GMT+04:00) Baku, Tbilisi, Yerevan */
+
+ {"Asia/Kabul", "Afghanistan"}, /* S (GMT+04:30) Kabul */
+
+ {"Asia/Karachi", "West Asia"}, /* S (GMT+05:00) Islamabad, Karachi, Tashkent */
+ {"Asia/Yekaterinburg", "Ekaterinburg"}, /* D (GMT+05:00) Ekaterinburg */
+
+ {"Asia/Calcutta", "India"}, /* S (GMT+05:30) Chennai, Kolkata, Mumbai, New Delhi */
+
+ {"Asia/Katmandu", "Nepal"}, /* S (GMT+05:45) Kathmandu */
+
+ {"Asia/Colombo", "Sri Lanka"}, /* S (GMT+06:00) Sri Jayawardenepura */
+ {"Asia/Dhaka", "Central Asia"}, /* S (GMT+06:00) Astana, Dhaka */
+ {"Asia/Novosibirsk", "N. Central Asia"}, /* D (GMT+06:00) Almaty, Novosibirsk */
+
+ {"Asia/Rangoon", "Myanmar"}, /* S (GMT+06:30) Rangoon */
+
+ {"Asia/Bangkok", "SE Asia"}, /* S (GMT+07:00) Bangkok, Hanoi, Jakarta */
+ {"Asia/Krasnoyarsk", "North Asia"}, /* D (GMT+07:00) Krasnoyarsk */
+
+ {"Australia/Perth", "W. Australia"}, /* S (GMT+08:00) Perth */
+ {"Asia/Taipei", "Taipei"}, /* S (GMT+08:00) Taipei */
+ {"Asia/Singapore", "Singapore"}, /* S (GMT+08:00) Kuala Lumpur, Singapore */
+ {"Asia/Hong_Kong", "China"}, /* S (GMT+08:00) Beijing, Chongqing, Hong Kong, Urumqi */
+ {"Asia/Irkutsk", "North Asia East"}, /* D (GMT+08:00) Irkutsk, Ulaan Bataar */
+
+ {"Asia/Tokyo", "Tokyo"}, /* S (GMT+09:00) Osaka, Sapporo, Tokyo */
+ {"Asia/Seoul", "Korea"}, /* S (GMT+09:00) Seoul */
+ {"Asia/Yakutsk", "Yakutsk"}, /* D (GMT+09:00) Yakutsk */
+
+ {"Australia/Darwin", "AUS Central"}, /* S (GMT+09:30) Darwin */
+ {"Australia/Adelaide", "Cen. Australia"}, /* D (GMT+09:30) Adelaide */
+
+ {"Pacific/Guam", "West Pacific"}, /* S (GMT+10:00) Guam, Port Moresby */
+ {"Australia/Brisbane", "E. Australia"}, /* S (GMT+10:00) Brisbane */
+ {"Asia/Vladivostok", "Vladivostok"}, /* D (GMT+10:00) Vladivostok */
+ {"Australia/Hobart", "Tasmania"}, /* D (GMT+10:00) Hobart */
+ {"Australia/Sydney", "AUS Eastern"}, /* D (GMT+10:00) Canberra, Melbourne, Sydney */
+
+ {"Asia/Magadan", "Central Pacific"}, /* S (GMT+11:00) Magadan, Solomon Is., New Caledonia */
+
+ {"Pacific/Fiji", "Fiji"}, /* S (GMT+12:00) Fiji, Kamchatka, Marshall Is. */
+ {"Pacific/Auckland", "New Zealand"}, /* D (GMT+12:00) Auckland, Wellington */
+
+ {"Pacific/Tongatapu", "Tonga"}, /* S (GMT+13:00) Nuku'alofa */
+ NULL, NULL
+};
+
+/**
+ * If a lookup fails, we attempt to remap certain Windows ids to
+ * alternate Windows ids. If the alternate listed here begins with
+ * '-', we use it as is (without the '-'). If it begins with '+', we
+ * append a " Standard Time" if appropriate.
+ */
+static const WindowsZoneRemap ZONE_REMAP[] = {
+ "Central European", "-Warsaw",
+ "Central Europe", "-Prague Bratislava",
+ "China", "-Beijing",
+
+ "Greenwich", "+GMT",
+ "GTB", "+GFT",
+ "Arab", "+Saudi Arabia",
+ "SE Asia", "+Bangkok",
+ "AUS Eastern", "+Sydney",
+ NULL, NULL,
+};
+
+static int32_t fWinType = -1;
+
+static int32_t detectWindowsType()
+{
+ int32_t winType;
+ LONG result;
+ HKEY hkey;
+
+ /* Detect the version of windows by trying to open a sequence of
+ probe keys. We don't use the OS version API because what we
+ really want to know is how the registry is laid out.
+ Specifically, is it 9x/Me or not, and is it "GMT" or "GMT
+ Standard Time". */
+ for (winType = 0; winType < 2; winType += 1) {
+ result = RegOpenKeyEx(HKEY_LOCAL_MACHINE,
+ WIN_TYPE_PROBE_REGKEY[winType],
+ 0,
+ KEY_QUERY_VALUE,
+ &hkey);
+ RegCloseKey(hkey);
+
+ if (result == ERROR_SUCCESS) {
+ break;
+ }
+ }
+
+ return winType;
+}
+
+/*
+ * TODO: Binary search sorted ZONE_MAP...
+ * (u_detectWindowsTimeZone() needs them sorted by offset...)
+ */
+static const char *findWindowsZoneID(const UChar *icuid, int32_t length)
+{
+ char stackBuffer[ICUID_STACK_BUFFER_SIZE];
+ char *buffer = stackBuffer;
+ const char *result = NULL;
+ int i;
+
+ /*
+ * NOTE: >= because length doesn't include
+ * trailing null.
+ */
+ if (length >= ICUID_STACK_BUFFER_SIZE) {
+ buffer = NEW_ARRAY(char, length + 1);
+ }
+
+ u_UCharsToChars(icuid, buffer, length);
+ buffer[length] = '\0';
+
+ for (i = 0; ZONE_MAP[i].icuid != NULL; i += 1) {
+ if (uprv_strcmp(buffer, ZONE_MAP[i].icuid) == 0) {
+ result = ZONE_MAP[i].winid;
+ break;
+ }
+ }
+
+ if (buffer != stackBuffer) {
+ DELETE_ARRAY(buffer);
+ }
+
+ return result;
+}
+
+static LONG openTZRegKey(HKEY *hkey, const char *winid)
+{
+ char subKeyName[96]; /* TODO: why 96?? */
+ char *name;
+ LONG result;
+
+ /* TODO: This isn't thread safe, but it's probably good enough. */
+ if (fWinType < 0) {
+ fWinType = detectWindowsType();
+ }
+
+ uprv_strcpy(subKeyName, TZ_REGKEY[(fWinType == WIN_9X_ME_TYPE) ? 0 : 1]);
+ name = &subKeyName[strlen(subKeyName)];
+ uprv_strcat(subKeyName, winid);
+
+ if (fWinType != WIN_9X_ME_TYPE &&
+ (winid[strlen(winid) - 1] != '2') &&
+ !(fWinType == WIN_NT_TYPE && strcmp(winid, "GMT") == 0)) {
+ uprv_strcat(subKeyName, STANDARD_TIME_REGKEY);
+ }
+
+ result = RegOpenKeyEx(HKEY_LOCAL_MACHINE,
+ subKeyName,
+ 0,
+ KEY_QUERY_VALUE,
+ hkey);
+
+ if (result != ERROR_SUCCESS) {
+ int i;
+
+ /* If the primary lookup fails, try to remap the Windows zone
+ ID, according to the remapping table. */
+ for (i=0; ZONE_REMAP[i].winid; i++) {
+ if (uprv_strcmp(winid, ZONE_REMAP[i].winid) == 0) {
+ uprv_strcpy(name, ZONE_REMAP[i].altwinid + 1);
+ if (*(ZONE_REMAP[i].altwinid) == '+' && fWinType != WIN_9X_ME_TYPE) {
+ uprv_strcat(subKeyName, STANDARD_TIME_REGKEY);
+ }
+ return RegOpenKeyEx(HKEY_LOCAL_MACHINE,
+ subKeyName,
+ 0,
+ KEY_QUERY_VALUE,
+ hkey);
+ }
+ }
+ }
+
+ return result;
+}
+
+static LONG getTZI(const char *winid, TZI *tzi)
+{
+ DWORD cbData = sizeof(TZI);
+ LONG result;
+ HKEY hkey;
+
+ result = openTZRegKey(&hkey, winid);
+
+ if (result == ERROR_SUCCESS) {
+ result = RegQueryValueEx(hkey,
+ TZI_REGKEY,
+ NULL,
+ NULL,
+ (LPBYTE)tzi,
+ &cbData);
+
+ }
+
+ RegCloseKey(hkey);
+
+ return result;
+}
+
+U_CAPI UBool U_EXPORT2
+uprv_getWindowsTimeZoneInfo(TIME_ZONE_INFORMATION *zoneInfo, const UChar *icuid, int32_t length)
+{
+ const char *winid;
+ TZI tzi;
+ LONG result;
+
+ winid = findWindowsZoneID(icuid, length);
+
+ if (winid != NULL) {
+ result = getTZI(winid, &tzi);
+
+ if (result == ERROR_SUCCESS) {
+ zoneInfo->Bias = tzi.bias;
+ zoneInfo->DaylightBias = tzi.daylightBias;
+ zoneInfo->StandardBias = tzi.standardBias;
+ zoneInfo->DaylightDate = tzi.daylightDate;
+ zoneInfo->StandardDate = tzi.standardDate;
+
+ return TRUE;
+ }
+ }
+
+ return FALSE;
+}
+
+/*
+ This code attempts to detect the Windows time zone, as set in the
+ Windows Date and Time control panel. It attempts to work on
+ multiple flavors of Windows (9x, Me, NT, 2000, XP) and on localized
+ installs. It works by directly interrogating the registry and
+ comparing the data there with the data returned by the
+ GetTimeZoneInformation API, along with some other strategies. The
+ registry contains time zone data under one of two keys (depending on
+ the flavor of Windows):
+
+ HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Time Zones\
+ HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones\
+
+ Under this key are several subkeys, one for each time zone. These
+ subkeys are named "Pacific" on Win9x/Me and "Pacific Standard Time"
+ on WinNT/2k/XP. There are some other wrinkles; see the code for
+ details. The subkey name is NOT LOCALIZED, allowing us to support
+ localized installs.
+
+ Under the subkey are data values. We care about:
+
+ Std Standard time display name, localized
+ TZI Binary block of data
+
+ The TZI data is of particular interest. It contains the offset, two
+ more offsets for standard and daylight time, and the start and end
+ rules. This is the same data returned by the GetTimeZoneInformation
+ API. The API may modify the data on the way out, so we have to be
+ careful, but essentially we do a binary comparison against the TZI
+ blocks of various registry keys. When we find a match, we know what
+ time zone Windows is set to. Since the registry key is not
+ localized, we can then translate the key through a simple table
+ lookup into the corresponding ICU time zone.
+
+ This strategy doesn't always work because there are zones which
+ share an offset and rules, so more than one TZI block will match.
+ For example, both Tokyo and Seoul are at GMT+9 with no DST rules;
+ their TZI blocks are identical. For these cases, we fall back to a
+ name lookup. We attempt to match the display name as stored in the
+ registry for the current zone to the display name stored in the
+ registry for various Windows zones. By comparing the registry data
+ directly we avoid conversion complications.
+
+ Author: Alan Liu
+ Since: ICU 2.6
+ Based on original code by Carl Brown
+*/
+
+/**
+ * Main Windows time zone detection function. Returns the Windows
+ * time zone, translated to an ICU time zone, or NULL upon failure.
+ */
+U_CAPI const char* U_EXPORT2
+uprv_detectWindowsTimeZone() {
+ LONG result;
+ HKEY hkey;
+ TZI tziKey;
+ TZI tziReg;
+ TIME_ZONE_INFORMATION apiTZI;
+ int firstMatch, lastMatch;
+ int j;
+
+ /* Obtain TIME_ZONE_INFORMATION from the API, and then convert it
+ to TZI. We could also interrogate the registry directly; we do
+ this below if needed. */
+ uprv_memset(&apiTZI, 0, sizeof(apiTZI));
+ uprv_memset(&tziKey, 0, sizeof(tziKey));
+ uprv_memset(&tziReg, 0, sizeof(tziReg));
+ GetTimeZoneInformation(&apiTZI);
+ tziKey.bias = apiTZI.Bias;
+ uprv_memcpy((char *)&tziKey.standardDate, (char*)&apiTZI.StandardDate,
+ sizeof(apiTZI.StandardDate));
+ uprv_memcpy((char *)&tziKey.daylightDate, (char*)&apiTZI.DaylightDate,
+ sizeof(apiTZI.DaylightDate));
+
+ /* For each zone that can be identified by Offset+Rules, see if we
+ have a match. Continue scanning after finding a match,
+ recording the index of the first and the last match. We have
+ to do this because some zones are not unique under
+ Offset+Rules. */
+ firstMatch = -1;
+ lastMatch = -1;
+ for (j=0; ZONE_MAP[j].icuid; j++) {
+ result = getTZI(ZONE_MAP[j].winid, &tziReg);
+
+ if (result == ERROR_SUCCESS) {
+ /* Assume that offsets are grouped together, and bail out
+ when we've scanned everything with a matching
+ offset. */
+ if (firstMatch >= 0 && tziKey.bias != tziReg.bias) {
+ break;
+ }
+
+ /* Windows alters the DaylightBias in some situations.
+ Using the bias and the rules suffices, so overwrite
+ these unreliable fields. */
+ tziKey.standardBias = tziReg.standardBias;
+ tziKey.daylightBias = tziReg.daylightBias;
+
+ if (uprv_memcmp((char *)&tziKey, (char*)&tziReg, sizeof(tziKey)) == 0) {
+ if (firstMatch < 0) {
+ firstMatch = j;
+ }
+
+ lastMatch = j;
+ }
+ }
+ }
+
+ /* This should never happen; if it does it means our table doesn't
+ match Windows AT ALL, perhaps because this is post-XP? */
+ if (firstMatch < 0) {
+ return NULL;
+ }
+
+ if (firstMatch != lastMatch) {
+ char stdName[32];
+ DWORD stdNameSize;
+ char stdRegName[64];
+ DWORD stdRegNameSize;
+
+ /* Offset+Rules lookup yielded >= 2 matches. Try to match the
+ localized display name. Get the name from the registry
+ (not the API). This avoids conversion issues. Use the
+ standard name, since Windows modifies the daylight name to
+ match the standard name if there is no DST. */
+ if (RegOpenKeyEx(HKEY_LOCAL_MACHINE,
+ CURRENT_ZONE_REGKEY,
+ 0,
+ KEY_QUERY_VALUE,
+ &hkey) == ERROR_SUCCESS)
+ {
+ stdNameSize = sizeof(stdName);
+ result = RegQueryValueEx(hkey,
+ (LPTSTR)STANDARD_NAME_REGKEY,
+ NULL,
+ NULL,
+ (LPBYTE)stdName,
+ &stdNameSize);
+ RegCloseKey(hkey);
+
+ /*
+ * Scan through the Windows time zone data in the registry
+ * again (just the range of zones with matching TZIs) and
+ * look for a standard display name match.
+ */
+ for (j = firstMatch; j <= lastMatch; j += 1) {
+ stdRegNameSize = sizeof(stdRegName);
+ result = openTZRegKey(&hkey, ZONE_MAP[j].winid);
+
+ if (result == ERROR_SUCCESS) {
+ result = RegQueryValueEx(hkey,
+ (LPTSTR)STD_REGKEY,
+ NULL,
+ NULL,
+ (LPBYTE)stdRegName,
+ &stdRegNameSize);
+ }
+
+ RegCloseKey(hkey);
+
+ if (result == ERROR_SUCCESS &&
+ stdRegNameSize == stdNameSize &&
+ uprv_memcmp(stdName, stdRegName, stdNameSize) == 0)
+ {
+ firstMatch = j; /* record the match */
+ break;
+ }
+ }
+ } else {
+ RegCloseKey(hkey); /* should never get here */
+ }
+ }
+
+ return ZONE_MAP[firstMatch].icuid;
+}
+
+#endif /* #ifdef U_WINDOWS */
diff --git a/icuSources/common/wintz.h b/icuSources/common/wintz.h
new file mode 100644
index 00000000..b8af862f
--- /dev/null
+++ b/icuSources/common/wintz.h
@@ -0,0 +1,37 @@
+/*
+********************************************************************************
+* Copyright (C) 2005-2006, International Business Machines
+* Corporation and others. All Rights Reserved.
+********************************************************************************
+*
+* File WINTZ.H
+*
+********************************************************************************
+*/
+
+#ifndef __WINTZ
+#define __WINTZ
+
+#include "unicode/utypes.h"
+
+#ifdef U_WINDOWS
+
+/**
+ * \file
+ * \brief C API: Utilities for dealing w/ Windows time zones.
+ */
+
+U_CDECL_BEGIN
+/* Forward declarations for Windows types... */
+typedef struct _TIME_ZONE_INFORMATION TIME_ZONE_INFORMATION;
+U_CDECL_END
+
+U_CAPI UBool U_EXPORT2
+uprv_getWindowsTimeZoneInfo(TIME_ZONE_INFORMATION *zoneInfo, const UChar *icuid, int32_t length);
+
+U_CAPI const char* U_EXPORT2
+uprv_detectWindowsTimeZone();
+
+#endif /* #ifdef U_WINDOWS */
+
+#endif /* __WINTZ */
diff --git a/icuSources/config.guess b/icuSources/config.guess
index dff9e481..7924ac07 100644
--- a/icuSources/config.guess
+++ b/icuSources/config.guess
@@ -1,9 +1,10 @@
#! /bin/sh
# Attempt to guess a canonical system name.
-# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001
-# Free Software Foundation, Inc.
+# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
+# 2000, 2001, 2002, 2003, 2004, 2005, 2006 Free Software Foundation,
+# Inc.
-timestamp='2001-09-04'
+timestamp='2006-06-06'
# This file is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License as published by
@@ -17,15 +18,18 @@ timestamp='2001-09-04'
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
-# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
+# 02110-1301, USA.
#
# As a special exception to the GNU General Public License, if you
# distribute this file as part of a program that contains a
# configuration script generated by Autoconf, you may include it under
# the same distribution terms that you use for the rest of that program.
-# Written by Per Bothner .
-# Please send patches to .
+
+# Originally written by Per Bothner .
+# Please send patches to . Submit a context
+# diff and a properly formatted ChangeLog entry.
#
# This script attempts to guess a canonical system name similar to
# config.sub. If it succeeds, it prints the system name on stdout, and
@@ -52,7 +56,7 @@ version="\
GNU config.guess ($timestamp)
Originally written by Per Bothner.
-Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001
+Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005
Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
@@ -65,11 +69,11 @@ Try \`$me --help' for more information."
while test $# -gt 0 ; do
case $1 in
--time-stamp | --time* | -t )
- echo "$timestamp" ; exit 0 ;;
+ echo "$timestamp" ; exit ;;
--version | -v )
- echo "$version" ; exit 0 ;;
+ echo "$version" ; exit ;;
--help | --h* | -h )
- echo "$usage"; exit 0 ;;
+ echo "$usage"; exit ;;
-- ) # Stop option processing
shift; break ;;
- ) # Use stdin as input.
@@ -87,30 +91,42 @@ if test $# != 0; then
exit 1
fi
+trap 'exit 1' 1 2 15
-dummy=dummy-$$
-trap 'rm -f $dummy.c $dummy.o $dummy.rel $dummy; exit 1' 1 2 15
+# CC_FOR_BUILD -- compiler used by this script. Note that the use of a
+# compiler to aid in system detection is discouraged as it requires
+# temporary files to be created and, as you can see below, it is a
+# headache to deal with in a portable fashion.
-# CC_FOR_BUILD -- compiler used by this script.
# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still
# use `HOST_CC' if defined, but it is deprecated.
-set_cc_for_build='case $CC_FOR_BUILD,$HOST_CC,$CC in
- ,,) echo "int dummy(){}" > $dummy.c ;
- for c in cc gcc c89 ; do
- ($c $dummy.c -c -o $dummy.o) >/dev/null 2>&1 ;
- if test $? = 0 ; then
+# Portable tmp directory creation inspired by the Autoconf team.
+
+set_cc_for_build='
+trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ;
+trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ;
+: ${TMPDIR=/tmp} ;
+ { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } ||
+ { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } ||
+ { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } ||
+ { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ;
+dummy=$tmp/dummy ;
+tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ;
+case $CC_FOR_BUILD,$HOST_CC,$CC in
+ ,,) echo "int x;" > $dummy.c ;
+ for c in cc gcc c89 c99 ; do
+ if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then
CC_FOR_BUILD="$c"; break ;
fi ;
done ;
- rm -f $dummy.c $dummy.o $dummy.rel ;
if test x"$CC_FOR_BUILD" = x ; then
CC_FOR_BUILD=no_compiler_found ;
fi
;;
,,*) CC_FOR_BUILD=$CC ;;
,*,*) CC_FOR_BUILD=$HOST_CC ;;
-esac'
+esac ; set_cc_for_build= ;'
# This is needed to find uname on a Pyramid OSx when run in the BSD universe.
# (ghazi@noc.rutgers.edu 1994-08-24)
@@ -127,29 +143,30 @@ UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown
case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
*:NetBSD:*:*)
- # Netbsd (nbsd) targets should (where applicable) match one or
+ # NetBSD (nbsd) targets should (where applicable) match one or
# more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*,
# *-*-netbsdecoff* and *-*-netbsd*. For targets that recently
# switched to ELF, *-*-netbsd* would select the old
# object file format. This provides both forward
# compatibility and a consistent mechanism for selecting the
# object file format.
- # Determine the machine/vendor (is the vendor relevant).
- case "${UNAME_MACHINE}" in
- amiga) machine=m68k-unknown ;;
- arm32) machine=arm-unknown ;;
- atari*) machine=m68k-atari ;;
- sun3*) machine=m68k-sun ;;
- mac68k) machine=m68k-apple ;;
- macppc) machine=powerpc-apple ;;
- hp3[0-9][05]) machine=m68k-hp ;;
- ibmrt|romp-ibm) machine=romp-ibm ;;
- *) machine=${UNAME_MACHINE}-unknown ;;
+ #
+ # Note: NetBSD doesn't particularly care about the vendor
+ # portion of the name. We always set it to "unknown".
+ sysctl="sysctl -n hw.machine_arch"
+ UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \
+ /usr/sbin/$sysctl 2>/dev/null || echo unknown)`
+ case "${UNAME_MACHINE_ARCH}" in
+ armeb) machine=armeb-unknown ;;
+ arm*) machine=arm-unknown ;;
+ sh3el) machine=shl-unknown ;;
+ sh3eb) machine=sh-unknown ;;
+ *) machine=${UNAME_MACHINE_ARCH}-unknown ;;
esac
# The Operating System including object format, if it has switched
# to ELF recently, or will in the future.
- case "${UNAME_MACHINE}" in
- i386|sparc|amiga|arm*|hp300|mvme68k|vax|atari|luna68k|mac68k|news68k|next68k|pc532|sun3*|x68k)
+ case "${UNAME_MACHINE_ARCH}" in
+ arm*|i386|m68k|ns32k|sh3*|sparc|vax)
eval $set_cc_for_build
if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \
| grep __ELF__ >/dev/null
@@ -166,120 +183,128 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
;;
esac
# The OS release
- release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'`
+ # Debian GNU/NetBSD machines have a different userland, and
+ # thus, need a distinct triplet. However, they do not need
+ # kernel version information, so it can be replaced with a
+ # suitable tag, in the style of linux-gnu.
+ case "${UNAME_VERSION}" in
+ Debian*)
+ release='-gnu'
+ ;;
+ *)
+ release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'`
+ ;;
+ esac
# Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM:
# contains redundant information, the shorter form:
# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used.
echo "${machine}-${os}${release}"
- exit 0 ;;
+ exit ;;
+ *:OpenBSD:*:*)
+ UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'`
+ echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE}
+ exit ;;
+ *:ekkoBSD:*:*)
+ echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE}
+ exit ;;
+ *:SolidBSD:*:*)
+ echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE}
+ exit ;;
+ macppc:MirBSD:*:*)
+ echo powerppc-unknown-mirbsd${UNAME_RELEASE}
+ exit ;;
+ *:MirBSD:*:*)
+ echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE}
+ exit ;;
alpha:OSF1:*:*)
- if test $UNAME_RELEASE = "V4.0"; then
+ case $UNAME_RELEASE in
+ *4.0)
UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'`
- fi
+ ;;
+ *5.*)
+ UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'`
+ ;;
+ esac
+ # According to Compaq, /usr/sbin/psrinfo has been available on
+ # OSF/1 and Tru64 systems produced since 1995. I hope that
+ # covers most systems running today. This code pipes the CPU
+ # types through head -n 1, so we only detect the type of CPU 0.
+ ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1`
+ case "$ALPHA_CPU_TYPE" in
+ "EV4 (21064)")
+ UNAME_MACHINE="alpha" ;;
+ "EV4.5 (21064)")
+ UNAME_MACHINE="alpha" ;;
+ "LCA4 (21066/21068)")
+ UNAME_MACHINE="alpha" ;;
+ "EV5 (21164)")
+ UNAME_MACHINE="alphaev5" ;;
+ "EV5.6 (21164A)")
+ UNAME_MACHINE="alphaev56" ;;
+ "EV5.6 (21164PC)")
+ UNAME_MACHINE="alphapca56" ;;
+ "EV5.7 (21164PC)")
+ UNAME_MACHINE="alphapca57" ;;
+ "EV6 (21264)")
+ UNAME_MACHINE="alphaev6" ;;
+ "EV6.7 (21264A)")
+ UNAME_MACHINE="alphaev67" ;;
+ "EV6.8CB (21264C)")
+ UNAME_MACHINE="alphaev68" ;;
+ "EV6.8AL (21264B)")
+ UNAME_MACHINE="alphaev68" ;;
+ "EV6.8CX (21264D)")
+ UNAME_MACHINE="alphaev68" ;;
+ "EV6.9A (21264/EV69A)")
+ UNAME_MACHINE="alphaev69" ;;
+ "EV7 (21364)")
+ UNAME_MACHINE="alphaev7" ;;
+ "EV7.9 (21364A)")
+ UNAME_MACHINE="alphaev79" ;;
+ esac
+ # A Pn.n version is a patched version.
# A Vn.n version is a released version.
# A Tn.n version is a released field test version.
# A Xn.n version is an unreleased experimental baselevel.
# 1.2 uses "1.2" for uname -r.
- cat <$dummy.s
- .data
-\$Lformat:
- .byte 37,100,45,37,120,10,0 # "%d-%x\n"
-
- .text
- .globl main
- .align 4
- .ent main
-main:
- .frame \$30,16,\$26,0
- ldgp \$29,0(\$27)
- .prologue 1
- .long 0x47e03d80 # implver \$0
- lda \$2,-1
- .long 0x47e20c21 # amask \$2,\$1
- lda \$16,\$Lformat
- mov \$0,\$17
- not \$1,\$18
- jsr \$26,printf
- ldgp \$29,0(\$26)
- mov 0,\$16
- jsr \$26,exit
- .end main
-EOF
- eval $set_cc_for_build
- $CC_FOR_BUILD $dummy.s -o $dummy 2>/dev/null
- if test "$?" = 0 ; then
- case `./$dummy` in
- 0-0)
- UNAME_MACHINE="alpha"
- ;;
- 1-0)
- UNAME_MACHINE="alphaev5"
- ;;
- 1-1)
- UNAME_MACHINE="alphaev56"
- ;;
- 1-101)
- UNAME_MACHINE="alphapca56"
- ;;
- 2-303)
- UNAME_MACHINE="alphaev6"
- ;;
- 2-307)
- UNAME_MACHINE="alphaev67"
- ;;
- 2-1307)
- UNAME_MACHINE="alphaev68"
- ;;
- esac
- fi
- rm -f $dummy.s $dummy
- echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[VTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
- exit 0 ;;
+ echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
+ exit ;;
Alpha\ *:Windows_NT*:*)
# How do we know it's Interix rather than the generic POSIX subsystem?
# Should we change UNAME_MACHINE based on the output of uname instead
# of the specific Alpha model?
echo alpha-pc-interix
- exit 0 ;;
+ exit ;;
21064:Windows_NT:50:3)
echo alpha-dec-winnt3.5
- exit 0 ;;
+ exit ;;
Amiga*:UNIX_System_V:4.0:*)
echo m68k-unknown-sysv4
- exit 0;;
- amiga:OpenBSD:*:*)
- echo m68k-unknown-openbsd${UNAME_RELEASE}
- exit 0 ;;
+ exit ;;
*:[Aa]miga[Oo][Ss]:*:*)
echo ${UNAME_MACHINE}-unknown-amigaos
- exit 0 ;;
- arc64:OpenBSD:*:*)
- echo mips64el-unknown-openbsd${UNAME_RELEASE}
- exit 0 ;;
- arc:OpenBSD:*:*)
- echo mipsel-unknown-openbsd${UNAME_RELEASE}
- exit 0 ;;
- hkmips:OpenBSD:*:*)
- echo mips-unknown-openbsd${UNAME_RELEASE}
- exit 0 ;;
- pmax:OpenBSD:*:*)
- echo mipsel-unknown-openbsd${UNAME_RELEASE}
- exit 0 ;;
- sgi:OpenBSD:*:*)
- echo mips-unknown-openbsd${UNAME_RELEASE}
- exit 0 ;;
- wgrisc:OpenBSD:*:*)
- echo mipsel-unknown-openbsd${UNAME_RELEASE}
- exit 0 ;;
+ exit ;;
+ *:[Mm]orph[Oo][Ss]:*:*)
+ echo ${UNAME_MACHINE}-unknown-morphos
+ exit ;;
*:OS/390:*:*)
echo i370-ibm-openedition
- exit 0 ;;
+ exit ;;
+ *:z/VM:*:*)
+ echo s390-ibm-zvmoe
+ exit ;;
+ *:OS400:*:*)
+ echo powerpc-ibm-os400
+ exit ;;
arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*)
echo arm-acorn-riscix${UNAME_RELEASE}
- exit 0;;
+ exit ;;
+ arm:riscos:*:*|arm:RISCOS:*:*)
+ echo arm-unknown-riscos
+ exit ;;
SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*)
echo hppa1.1-hitachi-hiuxmpp
- exit 0;;
+ exit ;;
Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*)
# akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE.
if test "`(/bin/universe) 2>/dev/null`" = att ; then
@@ -287,25 +312,32 @@ EOF
else
echo pyramid-pyramid-bsd
fi
- exit 0 ;;
+ exit ;;
NILE*:*:*:dcosx)
echo pyramid-pyramid-svr4
- exit 0 ;;
+ exit ;;
+ DRS?6000:unix:4.0:6*)
+ echo sparc-icl-nx6
+ exit ;;
+ DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*)
+ case `/usr/bin/uname -p` in
+ sparc) echo sparc-icl-nx7; exit ;;
+ esac ;;
sun4H:SunOS:5.*:*)
echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
- exit 0 ;;
+ exit ;;
sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*)
echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
- exit 0 ;;
+ exit ;;
i86pc:SunOS:5.*:*)
echo i386-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
- exit 0 ;;
+ exit ;;
sun4*:SunOS:6*:*)
# According to config.sub, this is the proper way to canonicalize
# SunOS6. Hard to guess exactly what SunOS6 will be like, but
# it's likely to be more like Solaris than SunOS4.
echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
- exit 0 ;;
+ exit ;;
sun4*:SunOS:*:*)
case "`/usr/bin/arch -k`" in
Series*|S4*)
@@ -314,12 +346,12 @@ EOF
esac
# Japanese Language versions have a version number like `4.1.3-JL'.
echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'`
- exit 0 ;;
+ exit ;;
sun3*:SunOS:*:*)
echo m68k-sun-sunos${UNAME_RELEASE}
- exit 0 ;;
+ exit ;;
sun*:*:4.2BSD:*)
- UNAME_RELEASE=`(head -1 /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null`
+ UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null`
test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3
case "`/bin/arch`" in
sun3)
@@ -329,16 +361,10 @@ EOF
echo sparc-sun-sunos${UNAME_RELEASE}
;;
esac
- exit 0 ;;
+ exit ;;
aushp:SunOS:*:*)
echo sparc-auspex-sunos${UNAME_RELEASE}
- exit 0 ;;
- sparc*:NetBSD:*)
- echo `uname -p`-unknown-netbsd${UNAME_RELEASE}
- exit 0 ;;
- atari*:OpenBSD:*:*)
- echo m68k-unknown-openbsd${UNAME_RELEASE}
- exit 0 ;;
+ exit ;;
# The situation for MiNT is a little confusing. The machine name
# can be virtually everything (everything which is not
# "atarist" or "atariste" at least should have a processor
@@ -349,49 +375,40 @@ EOF
# be no problem.
atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*)
echo m68k-atari-mint${UNAME_RELEASE}
- exit 0 ;;
+ exit ;;
atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*)
echo m68k-atari-mint${UNAME_RELEASE}
- exit 0 ;;
+ exit ;;
*falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*)
echo m68k-atari-mint${UNAME_RELEASE}
- exit 0 ;;
+ exit ;;
milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*)
echo m68k-milan-mint${UNAME_RELEASE}
- exit 0 ;;
+ exit ;;
hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*)
echo m68k-hades-mint${UNAME_RELEASE}
- exit 0 ;;
+ exit ;;
*:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*)
echo m68k-unknown-mint${UNAME_RELEASE}
- exit 0 ;;
- sun3*:OpenBSD:*:*)
- echo m68k-unknown-openbsd${UNAME_RELEASE}
- exit 0 ;;
- mac68k:OpenBSD:*:*)
- echo m68k-unknown-openbsd${UNAME_RELEASE}
- exit 0 ;;
- mvme68k:OpenBSD:*:*)
- echo m68k-unknown-openbsd${UNAME_RELEASE}
- exit 0 ;;
- mvme88k:OpenBSD:*:*)
- echo m88k-unknown-openbsd${UNAME_RELEASE}
- exit 0 ;;
+ exit ;;
+ m68k:machten:*:*)
+ echo m68k-apple-machten${UNAME_RELEASE}
+ exit ;;
powerpc:machten:*:*)
echo powerpc-apple-machten${UNAME_RELEASE}
- exit 0 ;;
+ exit ;;
RISC*:Mach:*:*)
echo mips-dec-mach_bsd4.3
- exit 0 ;;
+ exit ;;
RISC*:ULTRIX:*:*)
echo mips-dec-ultrix${UNAME_RELEASE}
- exit 0 ;;
+ exit ;;
VAX*:ULTRIX*:*:*)
echo vax-dec-ultrix${UNAME_RELEASE}
- exit 0 ;;
+ exit ;;
2020:CLIX:*:* | 2430:CLIX:*:*)
echo clipper-intergraph-clix${UNAME_RELEASE}
- exit 0 ;;
+ exit ;;
mips:*:*:UMIPS | mips:*:*:RISCos)
eval $set_cc_for_build
sed 's/^ //' << EOF >$dummy.c
@@ -415,27 +432,33 @@ EOF
exit (-1);
}
EOF
- $CC_FOR_BUILD $dummy.c -o $dummy \
- && ./$dummy `echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` \
- && rm -f $dummy.c $dummy && exit 0
- rm -f $dummy.c $dummy
+ $CC_FOR_BUILD -o $dummy $dummy.c &&
+ dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` &&
+ SYSTEM_NAME=`$dummy $dummyarg` &&
+ { echo "$SYSTEM_NAME"; exit; }
echo mips-mips-riscos${UNAME_RELEASE}
- exit 0 ;;
+ exit ;;
Motorola:PowerMAX_OS:*:*)
echo powerpc-motorola-powermax
- exit 0 ;;
+ exit ;;
+ Motorola:*:4.3:PL8-*)
+ echo powerpc-harris-powermax
+ exit ;;
+ Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*)
+ echo powerpc-harris-powermax
+ exit ;;
Night_Hawk:Power_UNIX:*:*)
echo powerpc-harris-powerunix
- exit 0 ;;
+ exit ;;
m88k:CX/UX:7*:*)
echo m88k-harris-cxux7
- exit 0 ;;
+ exit ;;
m88k:*:4*:R4*)
echo m88k-motorola-sysv4
- exit 0 ;;
+ exit ;;
m88k:*:3*:R3*)
echo m88k-motorola-sysv3
- exit 0 ;;
+ exit ;;
AViiON:dgux:*:*)
# DG/UX returns AViiON for all architectures
UNAME_PROCESSOR=`/usr/bin/uname -p`
@@ -451,29 +474,29 @@ EOF
else
echo i586-dg-dgux${UNAME_RELEASE}
fi
- exit 0 ;;
+ exit ;;
M88*:DolphinOS:*:*) # DolphinOS (SVR3)
echo m88k-dolphin-sysv3
- exit 0 ;;
+ exit ;;
M88*:*:R3*:*)
# Delta 88k system running SVR3
echo m88k-motorola-sysv3
- exit 0 ;;
+ exit ;;
XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3)
echo m88k-tektronix-sysv3
- exit 0 ;;
+ exit ;;
Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD)
echo m68k-tektronix-bsd
- exit 0 ;;
+ exit ;;
*:IRIX*:*:*)
echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'`
- exit 0 ;;
+ exit ;;
????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX.
- echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id
- exit 0 ;; # Note that: echo "'`uname -s`'" gives 'AIX '
+ echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id
+ exit ;; # Note that: echo "'`uname -s`'" gives 'AIX '
i*86:AIX:*:*)
echo i386-ibm-aix
- exit 0 ;;
+ exit ;;
ia64:AIX:*:*)
if [ -x /usr/bin/oslevel ] ; then
IBM_REV=`/usr/bin/oslevel`
@@ -481,7 +504,7 @@ EOF
IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
fi
echo ${UNAME_MACHINE}-ibm-aix${IBM_REV}
- exit 0 ;;
+ exit ;;
*:AIX:2:3)
if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then
eval $set_cc_for_build
@@ -496,17 +519,20 @@ EOF
exit(0);
}
EOF
- $CC_FOR_BUILD $dummy.c -o $dummy && ./$dummy && rm -f $dummy.c $dummy && exit 0
- rm -f $dummy.c $dummy
- echo rs6000-ibm-aix3.2.5
+ if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy`
+ then
+ echo "$SYSTEM_NAME"
+ else
+ echo rs6000-ibm-aix3.2.5
+ fi
elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then
echo rs6000-ibm-aix3.2.4
else
echo rs6000-ibm-aix3.2
fi
- exit 0 ;;
+ exit ;;
*:AIX:*:[45])
- IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | head -1 | awk '{ print $1 }'`
+ IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'`
if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then
IBM_ARCH=rs6000
else
@@ -518,38 +544,36 @@ EOF
IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
fi
echo ${IBM_ARCH}-ibm-aix${IBM_REV}
- exit 0 ;;
+ exit ;;
*:AIX:*:*)
echo rs6000-ibm-aix
- exit 0 ;;
+ exit ;;
ibmrt:4.4BSD:*|romp-ibm:BSD:*)
echo romp-ibm-bsd4.4
- exit 0 ;;
+ exit ;;
ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and
echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to
- exit 0 ;; # report: romp-ibm BSD 4.3
+ exit ;; # report: romp-ibm BSD 4.3
*:BOSX:*:*)
echo rs6000-bull-bosx
- exit 0 ;;
+ exit ;;
DPX/2?00:B.O.S.:*:*)
echo m68k-bull-sysv3
- exit 0 ;;
+ exit ;;
9000/[34]??:4.3bsd:1.*:*)
echo m68k-hp-bsd
- exit 0 ;;
+ exit ;;
hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*)
echo m68k-hp-bsd4.4
- exit 0 ;;
+ exit ;;
9000/[34678]??:HP-UX:*:*)
HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
case "${UNAME_MACHINE}" in
9000/31? ) HP_ARCH=m68000 ;;
9000/[34]?? ) HP_ARCH=m68k ;;
9000/[678][0-9][0-9])
- case "${HPUX_REV}" in
- 11.[0-9][0-9])
- if [ -x /usr/bin/getconf ]; then
- sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null`
+ if [ -x /usr/bin/getconf ]; then
+ sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null`
sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null`
case "${sc_cpu_version}" in
523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0
@@ -558,13 +582,13 @@ EOF
case "${sc_kernel_bits}" in
32) HP_ARCH="hppa2.0n" ;;
64) HP_ARCH="hppa2.0w" ;;
+ '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20
esac ;;
esac
- fi ;;
- esac
- if [ "${HP_ARCH}" = "" ]; then
- eval $set_cc_for_build
- sed 's/^ //' << EOF >$dummy.c
+ fi
+ if [ "${HP_ARCH}" = "" ]; then
+ eval $set_cc_for_build
+ sed 's/^ //' << EOF >$dummy.c
#define _HPUX_SOURCE
#include
@@ -597,17 +621,37 @@ EOF
exit (0);
}
EOF
- (CCOPTS= $CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null ) && HP_ARCH=`./$dummy`
- if test -z "$HP_ARCH"; then HP_ARCH=hppa; fi
- rm -f $dummy.c $dummy
- fi ;;
+ (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy`
+ test -z "$HP_ARCH" && HP_ARCH=hppa
+ fi ;;
esac
+ if [ ${HP_ARCH} = "hppa2.0w" ]
+ then
+ eval $set_cc_for_build
+
+ # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating
+ # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler
+ # generating 64-bit code. GNU and HP use different nomenclature:
+ #
+ # $ CC_FOR_BUILD=cc ./config.guess
+ # => hppa2.0w-hp-hpux11.23
+ # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess
+ # => hppa64-hp-hpux11.23
+
+ if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) |
+ grep __LP64__ >/dev/null
+ then
+ HP_ARCH="hppa2.0w"
+ else
+ HP_ARCH="hppa64"
+ fi
+ fi
echo ${HP_ARCH}-hp-hpux${HPUX_REV}
- exit 0 ;;
+ exit ;;
ia64:HP-UX:*:*)
HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
echo ia64-hp-hpux${HPUX_REV}
- exit 0 ;;
+ exit ;;
3050*:HI-UX:*:*)
eval $set_cc_for_build
sed 's/^ //' << EOF >$dummy.c
@@ -635,158 +679,234 @@ EOF
exit (0);
}
EOF
- $CC_FOR_BUILD $dummy.c -o $dummy && ./$dummy && rm -f $dummy.c $dummy && exit 0
- rm -f $dummy.c $dummy
+ $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` &&
+ { echo "$SYSTEM_NAME"; exit; }
echo unknown-hitachi-hiuxwe2
- exit 0 ;;
+ exit ;;
9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* )
echo hppa1.1-hp-bsd
- exit 0 ;;
+ exit ;;
9000/8??:4.3bsd:*:*)
echo hppa1.0-hp-bsd
- exit 0 ;;
+ exit ;;
*9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*)
echo hppa1.0-hp-mpeix
- exit 0 ;;
+ exit ;;
hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* )
echo hppa1.1-hp-osf
- exit 0 ;;
+ exit ;;
hp8??:OSF1:*:*)
echo hppa1.0-hp-osf
- exit 0 ;;
+ exit ;;
i*86:OSF1:*:*)
if [ -x /usr/sbin/sysversion ] ; then
echo ${UNAME_MACHINE}-unknown-osf1mk
else
echo ${UNAME_MACHINE}-unknown-osf1
fi
- exit 0 ;;
+ exit ;;
parisc*:Lites*:*:*)
echo hppa1.1-hp-lites
- exit 0 ;;
- hppa*:OpenBSD:*:*)
- echo hppa-unknown-openbsd
- exit 0 ;;
+ exit ;;
C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*)
echo c1-convex-bsd
- exit 0 ;;
+ exit ;;
C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*)
if getsysinfo -f scalar_acc
then echo c32-convex-bsd
else echo c2-convex-bsd
fi
- exit 0 ;;
+ exit ;;
C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*)
echo c34-convex-bsd
- exit 0 ;;
+ exit ;;
C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*)
echo c38-convex-bsd
- exit 0 ;;
+ exit ;;
C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*)
echo c4-convex-bsd
- exit 0 ;;
- CRAY*X-MP:*:*:*)
- echo xmp-cray-unicos
- exit 0 ;;
+ exit ;;
CRAY*Y-MP:*:*:*)
echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
- exit 0 ;;
+ exit ;;
CRAY*[A-Z]90:*:*:*)
echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \
| sed -e 's/CRAY.*\([A-Z]90\)/\1/' \
-e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \
-e 's/\.[^.]*$/.X/'
- exit 0 ;;
+ exit ;;
CRAY*TS:*:*:*)
echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
- exit 0 ;;
- CRAY*T3D:*:*:*)
- echo alpha-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
- exit 0 ;;
+ exit ;;
CRAY*T3E:*:*:*)
echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
- exit 0 ;;
+ exit ;;
CRAY*SV1:*:*:*)
echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
- exit 0 ;;
- CRAY-2:*:*:*)
- echo cray2-cray-unicos
- exit 0 ;;
+ exit ;;
+ *:UNICOS/mp:*:*)
+ echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+ exit ;;
F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*)
FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'`
echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
- exit 0 ;;
- hp300:OpenBSD:*:*)
- echo m68k-unknown-openbsd${UNAME_RELEASE}
- exit 0 ;;
+ exit ;;
+ 5000:UNIX_System_V:4.*:*)
+ FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
+ FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'`
+ echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
+ exit ;;
i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*)
echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE}
- exit 0 ;;
+ exit ;;
sparc*:BSD/OS:*:*)
echo sparc-unknown-bsdi${UNAME_RELEASE}
- exit 0 ;;
+ exit ;;
*:BSD/OS:*:*)
echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE}
- exit 0 ;;
+ exit ;;
*:FreeBSD:*:*)
- echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`
- exit 0 ;;
- *:OpenBSD:*:*)
- echo ${UNAME_MACHINE}-unknown-openbsd`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'`
- exit 0 ;;
+ case ${UNAME_MACHINE} in
+ pc98)
+ echo i386-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
+ amd64)
+ echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
+ *)
+ echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
+ esac
+ exit ;;
i*:CYGWIN*:*)
echo ${UNAME_MACHINE}-pc-cygwin
- exit 0 ;;
+ exit ;;
i*:MINGW*:*)
echo ${UNAME_MACHINE}-pc-mingw32
- exit 0 ;;
+ exit ;;
+ i*:windows32*:*)
+ # uname -m includes "-pc" on this system.
+ echo ${UNAME_MACHINE}-mingw32
+ exit ;;
i*:PW*:*)
echo ${UNAME_MACHINE}-pc-pw32
- exit 0 ;;
+ exit ;;
+ x86:Interix*:[345]*)
+ echo i586-pc-interix${UNAME_RELEASE}
+ exit ;;
+ EM64T:Interix*:[345]*)
+ echo x86_64-unknown-interix${UNAME_RELEASE}
+ exit ;;
+ [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*)
+ echo i${UNAME_MACHINE}-pc-mks
+ exit ;;
i*:Windows_NT*:* | Pentium*:Windows_NT*:*)
# How do we know it's Interix rather than the generic POSIX subsystem?
# It also conflicts with pre-2.0 versions of AT&T UWIN. Should we
# UNAME_MACHINE based on the output of uname instead of i386?
- echo i386-pc-interix
- exit 0 ;;
+ echo i586-pc-interix
+ exit ;;
i*:UWIN*:*)
echo ${UNAME_MACHINE}-pc-uwin
- exit 0 ;;
+ exit ;;
+ amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*)
+ echo x86_64-unknown-cygwin
+ exit ;;
p*:CYGWIN*:*)
echo powerpcle-unknown-cygwin
- exit 0 ;;
+ exit ;;
prep*:SunOS:5.*:*)
echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
- exit 0 ;;
+ exit ;;
*:GNU:*:*)
+ # the GNU system
echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'`
- exit 0 ;;
+ exit ;;
+ *:GNU/*:*:*)
+ # other systems with GNU libc and userland
+ echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu
+ exit ;;
i*86:Minix:*:*)
echo ${UNAME_MACHINE}-pc-minix
- exit 0 ;;
+ exit ;;
arm*:Linux:*:*)
echo ${UNAME_MACHINE}-unknown-linux-gnu
- exit 0 ;;
+ exit ;;
+ avr32*:Linux:*:*)
+ echo ${UNAME_MACHINE}-unknown-linux-gnu
+ exit ;;
+ cris:Linux:*:*)
+ echo cris-axis-linux-gnu
+ exit ;;
+ crisv32:Linux:*:*)
+ echo crisv32-axis-linux-gnu
+ exit ;;
+ frv:Linux:*:*)
+ echo frv-unknown-linux-gnu
+ exit ;;
ia64:Linux:*:*)
- echo ${UNAME_MACHINE}-unknown-linux
- exit 0 ;;
+ echo ${UNAME_MACHINE}-unknown-linux-gnu
+ exit ;;
+ m32r*:Linux:*:*)
+ echo ${UNAME_MACHINE}-unknown-linux-gnu
+ exit ;;
m68*:Linux:*:*)
echo ${UNAME_MACHINE}-unknown-linux-gnu
- exit 0 ;;
+ exit ;;
mips:Linux:*:*)
- case `sed -n '/^byte/s/^.*: \(.*\) endian/\1/p' < /proc/cpuinfo` in
- big) echo mips-unknown-linux-gnu && exit 0 ;;
- little) echo mipsel-unknown-linux-gnu && exit 0 ;;
- esac
+ eval $set_cc_for_build
+ sed 's/^ //' << EOF >$dummy.c
+ #undef CPU
+ #undef mips
+ #undef mipsel
+ #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL)
+ CPU=mipsel
+ #else
+ #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB)
+ CPU=mips
+ #else
+ CPU=
+ #endif
+ #endif
+EOF
+ eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n '
+ /^CPU/{
+ s: ::g
+ p
+ }'`"
+ test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; }
;;
+ mips64:Linux:*:*)
+ eval $set_cc_for_build
+ sed 's/^ //' << EOF >$dummy.c
+ #undef CPU
+ #undef mips64
+ #undef mips64el
+ #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL)
+ CPU=mips64el
+ #else
+ #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB)
+ CPU=mips64
+ #else
+ CPU=
+ #endif
+ #endif
+EOF
+ eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n '
+ /^CPU/{
+ s: ::g
+ p
+ }'`"
+ test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; }
+ ;;
+ or32:Linux:*:*)
+ echo or32-unknown-linux-gnu
+ exit ;;
ppc:Linux:*:*)
echo powerpc-unknown-linux-gnu
- exit 0 ;;
+ exit ;;
ppc64:Linux:*:*)
echo powerpc64-unknown-linux-gnu
- exit 0 ;;
+ exit ;;
alpha:Linux:*:*)
case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in
EV5) UNAME_MACHINE=alphaev5 ;;
@@ -800,7 +920,7 @@ EOF
objdump --private-headers /bin/sh | grep ld.so.1 >/dev/null
if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi
echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC}
- exit 0 ;;
+ exit ;;
parisc:Linux:*:* | hppa:Linux:*:*)
# Look for CPU level
case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in
@@ -808,27 +928,34 @@ EOF
PA8*) echo hppa2.0-unknown-linux-gnu ;;
*) echo hppa-unknown-linux-gnu ;;
esac
- exit 0 ;;
+ exit ;;
parisc64:Linux:*:* | hppa64:Linux:*:*)
echo hppa64-unknown-linux-gnu
- exit 0 ;;
+ exit ;;
s390:Linux:*:* | s390x:Linux:*:*)
echo ${UNAME_MACHINE}-ibm-linux
- exit 0 ;;
+ exit ;;
+ sh64*:Linux:*:*)
+ echo ${UNAME_MACHINE}-unknown-linux-gnu
+ exit ;;
sh*:Linux:*:*)
echo ${UNAME_MACHINE}-unknown-linux-gnu
- exit 0 ;;
+ exit ;;
sparc:Linux:*:* | sparc64:Linux:*:*)
echo ${UNAME_MACHINE}-unknown-linux-gnu
- exit 0 ;;
+ exit ;;
+ vax:Linux:*:*)
+ echo ${UNAME_MACHINE}-dec-linux-gnu
+ exit ;;
x86_64:Linux:*:*)
echo x86_64-unknown-linux-gnu
- exit 0 ;;
+ exit ;;
i*86:Linux:*:*)
# The BFD linker knows what the default object file format is, so
# first see if it will tell us. cd to the root directory to prevent
# problems with other programs or directories called `ld' in the path.
- ld_supported_targets=`cd /; ld --help 2>&1 \
+ # Set LC_ALL=C to ensure ld outputs messages in English.
+ ld_supported_targets=`cd /; LC_ALL=C ld --help 2>&1 \
| sed -ne '/supported targets:/!d
s/[ ][ ]*/ /g
s/.*supported targets: *//
@@ -840,52 +967,58 @@ EOF
;;
a.out-i386-linux)
echo "${UNAME_MACHINE}-pc-linux-gnuaout"
- exit 0 ;;
+ exit ;;
coff-i386)
echo "${UNAME_MACHINE}-pc-linux-gnucoff"
- exit 0 ;;
+ exit ;;
"")
# Either a pre-BFD a.out linker (linux-gnuoldld) or
# one that does not give us useful --help.
echo "${UNAME_MACHINE}-pc-linux-gnuoldld"
- exit 0 ;;
+ exit ;;
esac
# Determine whether the default compiler is a.out or elf
eval $set_cc_for_build
- cat >$dummy.c <
-#ifdef __cplusplus
-#include /* for printf() prototype */
- int main (int argc, char *argv[]) {
-#else
- int main (argc, argv) int argc; char *argv[]; {
-#endif
-#ifdef __ELF__
-# ifdef __GLIBC__
-# if __GLIBC__ >= 2
- printf ("%s-pc-linux-gnu\n", argv[1]);
-# else
- printf ("%s-pc-linux-gnulibc1\n", argv[1]);
-# endif
-# else
- printf ("%s-pc-linux-gnulibc1\n", argv[1]);
-# endif
-#else
- printf ("%s-pc-linux-gnuaout\n", argv[1]);
-#endif
- return 0;
-}
+ sed 's/^ //' << EOF >$dummy.c
+ #include
+ #ifdef __ELF__
+ # ifdef __GLIBC__
+ # if __GLIBC__ >= 2
+ LIBC=gnu
+ # else
+ LIBC=gnulibc1
+ # endif
+ # else
+ LIBC=gnulibc1
+ # endif
+ #else
+ #if defined(__INTEL_COMPILER) || defined(__PGI) || defined(__SUNPRO_C) || defined(__SUNPRO_CC)
+ LIBC=gnu
+ #else
+ LIBC=gnuaout
+ #endif
+ #endif
+ #ifdef __dietlibc__
+ LIBC=dietlibc
+ #endif
EOF
- $CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null && ./$dummy "${UNAME_MACHINE}" && rm -f $dummy.c $dummy && exit 0
- rm -f $dummy.c $dummy
- test x"${TENTATIVE}" != x && echo "${TENTATIVE}" && exit 0
+ eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n '
+ /^LIBC/{
+ s: ::g
+ p
+ }'`"
+ test x"${LIBC}" != x && {
+ echo "${UNAME_MACHINE}-pc-linux-${LIBC}"
+ exit
+ }
+ test x"${TENTATIVE}" != x && { echo "${TENTATIVE}"; exit; }
;;
i*86:DYNIX/ptx:4*:*)
# ptx 4.0 does uname -s correctly, with DYNIX/ptx in there.
# earlier versions are messed up and put the nodename in both
# sysname and nodename.
echo i386-sequent-sysv4
- exit 0 ;;
+ exit ;;
i*86:UNIX_SV:4.2MP:2.*)
# Unixware is an offshoot of SVR4, but it has its own version
# number series starting with 2...
@@ -893,7 +1026,27 @@ EOF
# I just have to hope. -- rms.
# Use sysv4.2uw... so that sysv4* matches it.
echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION}
- exit 0 ;;
+ exit ;;
+ i*86:OS/2:*:*)
+ # If we were able to find `uname', then EMX Unix compatibility
+ # is probably installed.
+ echo ${UNAME_MACHINE}-pc-os2-emx
+ exit ;;
+ i*86:XTS-300:*:STOP)
+ echo ${UNAME_MACHINE}-unknown-stop
+ exit ;;
+ i*86:atheos:*:*)
+ echo ${UNAME_MACHINE}-unknown-atheos
+ exit ;;
+ i*86:syllable:*:*)
+ echo ${UNAME_MACHINE}-pc-syllable
+ exit ;;
+ i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.0*:*)
+ echo i386-unknown-lynxos${UNAME_RELEASE}
+ exit ;;
+ i*86:*DOS:*:*)
+ echo ${UNAME_MACHINE}-pc-msdosdjgpp
+ exit ;;
i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*)
UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'`
if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then
@@ -901,99 +1054,100 @@ EOF
else
echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL}
fi
- exit 0 ;;
- i*86:*:5:[78]*)
+ exit ;;
+ i*86:*:5:[678]*)
+ # UnixWare 7.x, OpenUNIX and OpenServer 6.
case `/bin/uname -X | grep "^Machine"` in
*486*) UNAME_MACHINE=i486 ;;
*Pentium) UNAME_MACHINE=i586 ;;
*Pent*|*Celeron) UNAME_MACHINE=i686 ;;
esac
echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION}
- exit 0 ;;
+ exit ;;
i*86:*:3.2:*)
if test -f /usr/options/cb.name; then
UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then
- UNAME_REL=`(/bin/uname -X|egrep Release|sed -e 's/.*= //')`
- (/bin/uname -X|egrep i80486 >/dev/null) && UNAME_MACHINE=i486
- (/bin/uname -X|egrep '^Machine.*Pentium' >/dev/null) \
+ UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')`
+ (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486
+ (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \
&& UNAME_MACHINE=i586
- (/bin/uname -X|egrep '^Machine.*Pent ?II' >/dev/null) \
+ (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \
&& UNAME_MACHINE=i686
- (/bin/uname -X|egrep '^Machine.*Pentium Pro' >/dev/null) \
+ (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \
&& UNAME_MACHINE=i686
echo ${UNAME_MACHINE}-pc-sco$UNAME_REL
else
echo ${UNAME_MACHINE}-pc-sysv32
fi
- exit 0 ;;
- i*86:*DOS:*:*)
- echo ${UNAME_MACHINE}-pc-msdosdjgpp
- exit 0 ;;
+ exit ;;
pc:*:*:*)
# Left here for compatibility:
# uname -m prints for DJGPP always 'pc', but it prints nothing about
# the processor, so we play safe by assuming i386.
echo i386-pc-msdosdjgpp
- exit 0 ;;
+ exit ;;
Intel:Mach:3*:*)
echo i386-pc-mach3
- exit 0 ;;
+ exit ;;
paragon:*:*:*)
echo i860-intel-osf1
- exit 0 ;;
+ exit ;;
i860:*:4.*:*) # i860-SVR4
if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then
echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4
else # Add other i860-SVR4 vendors below as they are discovered.
echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4
fi
- exit 0 ;;
+ exit ;;
mini*:CTIX:SYS*5:*)
# "miniframe"
echo m68010-convergent-sysv
- exit 0 ;;
- M68*:*:R3V[567]*:*)
- test -r /sysV68 && echo 'm68k-motorola-sysv' && exit 0 ;;
- 3[34]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 4850:*:4.0:3.0)
+ exit ;;
+ mc68k:UNIX:SYSTEM5:3.51m)
+ echo m68k-convergent-sysv
+ exit ;;
+ M680?0:D-NIX:5.3:*)
+ echo m68k-diab-dnix
+ exit ;;
+ M68*:*:R3V[5678]*:*)
+ test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;;
+ 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0)
OS_REL=''
test -r /etc/.relid \
&& OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid`
/bin/uname -p 2>/dev/null | grep 86 >/dev/null \
- && echo i486-ncr-sysv4.3${OS_REL} && exit 0
+ && { echo i486-ncr-sysv4.3${OS_REL}; exit; }
/bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
- && echo i586-ncr-sysv4.3${OS_REL} && exit 0 ;;
+ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;;
3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*)
/bin/uname -p 2>/dev/null | grep 86 >/dev/null \
- && echo i486-ncr-sysv4 && exit 0 ;;
+ && { echo i486-ncr-sysv4; exit; } ;;
m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*)
echo m68k-unknown-lynxos${UNAME_RELEASE}
- exit 0 ;;
+ exit ;;
mc68030:UNIX_System_V:4.*:*)
echo m68k-atari-sysv4
- exit 0 ;;
- i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.0*:*)
- echo i386-unknown-lynxos${UNAME_RELEASE}
- exit 0 ;;
+ exit ;;
TSUNAMI:LynxOS:2.*:*)
echo sparc-unknown-lynxos${UNAME_RELEASE}
- exit 0 ;;
+ exit ;;
rs6000:LynxOS:2.*:*)
echo rs6000-unknown-lynxos${UNAME_RELEASE}
- exit 0 ;;
+ exit ;;
PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.0*:*)
echo powerpc-unknown-lynxos${UNAME_RELEASE}
- exit 0 ;;
+ exit ;;
SM[BE]S:UNIX_SV:*:*)
echo mips-dde-sysv${UNAME_RELEASE}
- exit 0 ;;
+ exit ;;
RM*:ReliantUNIX-*:*:*)
echo mips-sni-sysv4
- exit 0 ;;
+ exit ;;
RM*:SINIX-*:*:*)
echo mips-sni-sysv4
- exit 0 ;;
+ exit ;;
*:SINIX-*:*:*)
if uname -p 2>/dev/null >/dev/null ; then
UNAME_MACHINE=`(uname -p) 2>/dev/null`
@@ -1001,82 +1155,98 @@ EOF
else
echo ns32k-sni-sysv
fi
- exit 0 ;;
+ exit ;;
PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort
# says
echo i586-unisys-sysv4
- exit 0 ;;
+ exit ;;
*:UNIX_System_V:4*:FTX*)
# From Gerald Hewes .
# How about differentiating between stratus architectures? -djm
echo hppa1.1-stratus-sysv4
- exit 0 ;;
+ exit ;;
*:*:*:FTX*)
# From seanf@swdc.stratus.com.
echo i860-stratus-sysv4
- exit 0 ;;
+ exit ;;
+ i*86:VOS:*:*)
+ # From Paul.Green@stratus.com.
+ echo ${UNAME_MACHINE}-stratus-vos
+ exit ;;
*:VOS:*:*)
# From Paul.Green@stratus.com.
echo hppa1.1-stratus-vos
- exit 0 ;;
+ exit ;;
mc68*:A/UX:*:*)
echo m68k-apple-aux${UNAME_RELEASE}
- exit 0 ;;
+ exit ;;
news*:NEWS-OS:6*:*)
echo mips-sony-newsos6
- exit 0 ;;
+ exit ;;
R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*)
if [ -d /usr/nec ]; then
echo mips-nec-sysv${UNAME_RELEASE}
else
echo mips-unknown-sysv${UNAME_RELEASE}
fi
- exit 0 ;;
+ exit ;;
BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only.
echo powerpc-be-beos
- exit 0 ;;
+ exit ;;
BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only.
echo powerpc-apple-beos
- exit 0 ;;
+ exit ;;
BePC:BeOS:*:*) # BeOS running on Intel PC compatible.
echo i586-pc-beos
- exit 0 ;;
+ exit ;;
SX-4:SUPER-UX:*:*)
echo sx4-nec-superux${UNAME_RELEASE}
- exit 0 ;;
+ exit ;;
SX-5:SUPER-UX:*:*)
echo sx5-nec-superux${UNAME_RELEASE}
- exit 0 ;;
+ exit ;;
+ SX-6:SUPER-UX:*:*)
+ echo sx6-nec-superux${UNAME_RELEASE}
+ exit ;;
Power*:Rhapsody:*:*)
echo powerpc-apple-rhapsody${UNAME_RELEASE}
- exit 0 ;;
+ exit ;;
*:Rhapsody:*:*)
echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE}
- exit 0 ;;
+ exit ;;
*:Darwin:*:*)
- echo `uname -p`-apple-darwin${UNAME_RELEASE}
- exit 0 ;;
+ UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown
+ case $UNAME_PROCESSOR in
+ unknown) UNAME_PROCESSOR=powerpc ;;
+ esac
+ echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE}
+ exit ;;
*:procnto*:*:* | *:QNX:[0123456789]*:*)
- if test "${UNAME_MACHINE}" = "x86pc"; then
+ UNAME_PROCESSOR=`uname -p`
+ if test "$UNAME_PROCESSOR" = "x86"; then
+ UNAME_PROCESSOR=i386
UNAME_MACHINE=pc
fi
- echo `uname -p`-${UNAME_MACHINE}-nto-qnx
- exit 0 ;;
+ echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE}
+ exit ;;
*:QNX:*:4*)
echo i386-pc-qnx
- exit 0 ;;
- NSR-[KW]:NONSTOP_KERNEL:*:*)
+ exit ;;
+ NSE-?:NONSTOP_KERNEL:*:*)
+ echo nse-tandem-nsk${UNAME_RELEASE}
+ exit ;;
+ NSR-?:NONSTOP_KERNEL:*:*)
echo nsr-tandem-nsk${UNAME_RELEASE}
- exit 0 ;;
+ exit ;;
*:NonStop-UX:*:*)
echo mips-compaq-nonstopux
- exit 0 ;;
+ exit ;;
BS2000:POSIX*:*:*)
echo bs2000-siemens-sysv
- exit 0 ;;
+ exit ;;
DS/*:UNIX_System_V:*:*)
echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE}
- exit 0 ;;
+ exit ;;
*:Plan9:*:*)
# "uname -m" is not consistent, so use $cputype instead. 386
# is converted to i386 for consistency with other x86
@@ -1087,36 +1257,47 @@ EOF
UNAME_MACHINE="$cputype"
fi
echo ${UNAME_MACHINE}-unknown-plan9
- exit 0 ;;
- i*86:OS/2:*:*)
- # If we were able to find `uname', then EMX Unix compatibility
- # is probably installed.
- echo ${UNAME_MACHINE}-pc-os2-emx
- exit 0 ;;
+ exit ;;
*:TOPS-10:*:*)
echo pdp10-unknown-tops10
- exit 0 ;;
+ exit ;;
*:TENEX:*:*)
echo pdp10-unknown-tenex
- exit 0 ;;
+ exit ;;
KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*)
echo pdp10-dec-tops20
- exit 0 ;;
+ exit ;;
XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*)
echo pdp10-xkl-tops20
- exit 0 ;;
+ exit ;;
*:TOPS-20:*:*)
echo pdp10-unknown-tops20
- exit 0 ;;
+ exit ;;
*:ITS:*:*)
echo pdp10-unknown-its
- exit 0 ;;
- i*86:XTS-300:*:STOP)
- echo ${UNAME_MACHINE}-unknown-stop
- exit 0 ;;
- i*86:atheos:*:*)
- echo ${UNAME_MACHINE}-unknown-atheos
- exit 0 ;;
+ exit ;;
+ SEI:*:*:SEIUX)
+ echo mips-sei-seiux${UNAME_RELEASE}
+ exit ;;
+ *:DragonFly:*:*)
+ echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`
+ exit ;;
+ *:*VMS:*:*)
+ UNAME_MACHINE=`(uname -p) 2>/dev/null`
+ case "${UNAME_MACHINE}" in
+ A*) echo alpha-dec-vms ; exit ;;
+ I*) echo ia64-dec-vms ; exit ;;
+ V*) echo vax-dec-vms ; exit ;;
+ esac ;;
+ *:XENIX:*:SysV)
+ echo i386-pc-xenix
+ exit ;;
+ i*86:skyos:*:*)
+ echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//'
+ exit ;;
+ i*86:rdos:*:*)
+ echo ${UNAME_MACHINE}-pc-rdos
+ exit ;;
esac
#echo '(No uname command or uname output not recognized.)' 1>&2
@@ -1148,7 +1329,7 @@ main ()
#endif
#if defined (__arm) && defined (__acorn) && defined (__unix)
- printf ("arm-acorn-riscix"); exit (0);
+ printf ("arm-acorn-riscix\n"); exit (0);
#endif
#if defined (hp300) && !defined (hpux)
@@ -1237,12 +1418,12 @@ main ()
}
EOF
-$CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null && ./$dummy && rm -f $dummy.c $dummy && exit 0
-rm -f $dummy.c $dummy
+$CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` &&
+ { echo "$SYSTEM_NAME"; exit; }
# Apollos put the system type in the environment.
-test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit 0; }
+test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; }
# Convex versions that predate uname can use getsysinfo(1)
@@ -1251,22 +1432,22 @@ then
case `getsysinfo -f cpu_type` in
c1*)
echo c1-convex-bsd
- exit 0 ;;
+ exit ;;
c2*)
if getsysinfo -f scalar_acc
then echo c32-convex-bsd
else echo c2-convex-bsd
fi
- exit 0 ;;
+ exit ;;
c34*)
echo c34-convex-bsd
- exit 0 ;;
+ exit ;;
c38*)
echo c38-convex-bsd
- exit 0 ;;
+ exit ;;
c4*)
echo c4-convex-bsd
- exit 0 ;;
+ exit ;;
esac
fi
@@ -1277,7 +1458,9 @@ This script, last modified $timestamp, has failed to recognize
the operating system you are using. It is advised that you
download the most up to date version of the config scripts from
- ftp://ftp.gnu.org/pub/gnu/config/
+ http://savannah.gnu.org/cgi-bin/viewcvs/*checkout*/config/config/config.guess
+and
+ http://savannah.gnu.org/cgi-bin/viewcvs/*checkout*/config/config/config.sub
If the version you run ($0) is already up to date, please
send the following data and any information you think might be
diff --git a/icuSources/config.sub b/icuSources/config.sub
index 0e77b384..70584b00 100644
--- a/icuSources/config.sub
+++ b/icuSources/config.sub
@@ -1,9 +1,10 @@
#! /bin/sh
# Configuration validation subroutine script.
-# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001
-# Free Software Foundation, Inc.
+# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
+# 2000, 2001, 2002, 2003, 2004, 2005, 2006 Free Software Foundation,
+# Inc.
-timestamp='2001-09-07'
+timestamp='2006-06-06'
# This file is (in principle) common to ALL GNU software.
# The presence of a machine in this file suggests that SOME GNU software
@@ -21,15 +22,17 @@ timestamp='2001-09-07'
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
-# Foundation, Inc., 59 Temple Place - Suite 330,
-# Boston, MA 02111-1307, USA.
-
+# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
+# 02110-1301, USA.
+#
# As a special exception to the GNU General Public License, if you
# distribute this file as part of a program that contains a
# configuration script generated by Autoconf, you may include it under
# the same distribution terms that you use for the rest of that program.
-# Please send patches to .
+
+# Please send patches to . Submit a context
+# diff and a properly formatted ChangeLog entry.
#
# Configuration subroutine to validate and canonicalize a configuration type.
# Supply the specified configuration type as an argument.
@@ -69,7 +72,7 @@ Report bugs and patches to ."
version="\
GNU config.sub ($timestamp)
-Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001
+Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005
Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
@@ -82,11 +85,11 @@ Try \`$me --help' for more information."
while test $# -gt 0 ; do
case $1 in
--time-stamp | --time* | -t )
- echo "$timestamp" ; exit 0 ;;
+ echo "$timestamp" ; exit ;;
--version | -v )
- echo "$version" ; exit 0 ;;
+ echo "$version" ; exit ;;
--help | --h* | -h )
- echo "$usage"; exit 0 ;;
+ echo "$usage"; exit ;;
-- ) # Stop option processing
shift; break ;;
- ) # Use stdin as input.
@@ -98,7 +101,7 @@ while test $# -gt 0 ; do
*local*)
# First pass through any local machine types.
echo $1
- exit 0;;
+ exit ;;
* )
break ;;
@@ -117,7 +120,9 @@ esac
# Here we must recognize all the valid KERNEL-OS combinations.
maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'`
case $maybe_os in
- nto-qnx* | linux-gnu* | storm-chaos* | os2-emx* | windows32-*)
+ nto-qnx* | linux-gnu* | linux-dietlibc | linux-newlib* | linux-uclibc* | \
+ uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* | \
+ storm-chaos* | os2-emx* | rtmk-nova*)
os=-$maybe_os
basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`
;;
@@ -143,7 +148,7 @@ case $os in
-convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\
-c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \
-harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \
- -apple | -axis)
+ -apple | -axis | -knuth | -cray)
os=
basic_machine=$1
;;
@@ -168,6 +173,10 @@ case $os in
-hiux*)
os=-hiuxwe2
;;
+ -sco6)
+ os=-sco5v6
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
-sco5)
os=-sco3.2v5
basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
@@ -184,6 +193,10 @@ case $os in
# Don't forget version if it is 3.2v4 or newer.
basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
;;
+ -sco5v6*)
+ # Don't forget version if it is 3.2v4 or newer.
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
-sco*)
os=-sco3.2v2
basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
@@ -217,10 +230,6 @@ case $os in
basic_machine=m68k-atari
os=-mint
;;
- -as400*)
- os=
- basic_machine=as400
- ;;
esac
# Decode aliases for certain CPU-COMPANY combinations.
@@ -230,32 +239,52 @@ case $basic_machine in
1750a | 580 \
| a29k \
| alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \
- | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr \
+ | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \
+ | am33_2.0 \
+ | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr | avr32 \
+ | bfin \
| c4x | clipper \
- | d10v | d30v | dsp16xx \
- | fr30 \
+ | d10v | d30v | dlx | dsp16xx \
+ | fr30 | frv \
| h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \
| i370 | i860 | i960 | ia64 \
- | m32r | m68000 | m68k | m88k | mcore \
- | mips16 | mips64 | mips64el | mips64orion | mips64orionel \
- | mips64vr4100 | mips64vr4100el | mips64vr4300 \
- | mips64vr4300el | mips64vr5000 | mips64vr5000el \
- | mipsbe | mipseb | mipsel | mipsle | mipstx39 | mipstx39el \
- | mipsisa32 \
+ | ip2k | iq2000 \
+ | m32c | m32r | m32rle | m68000 | m68k | m88k \
+ | maxq | mb | microblaze | mcore \
+ | mips | mipsbe | mipseb | mipsel | mipsle \
+ | mips16 \
+ | mips64 | mips64el \
+ | mips64vr | mips64vrel \
+ | mips64orion | mips64orionel \
+ | mips64vr4100 | mips64vr4100el \
+ | mips64vr4300 | mips64vr4300el \
+ | mips64vr5000 | mips64vr5000el \
+ | mips64vr5900 | mips64vr5900el \
+ | mipsisa32 | mipsisa32el \
+ | mipsisa32r2 | mipsisa32r2el \
+ | mipsisa64 | mipsisa64el \
+ | mipsisa64r2 | mipsisa64r2el \
+ | mipsisa64sb1 | mipsisa64sb1el \
+ | mipsisa64sr71k | mipsisa64sr71kel \
+ | mipstx39 | mipstx39el \
| mn10200 | mn10300 \
+ | mt \
+ | msp430 \
+ | nios | nios2 \
| ns16k | ns32k \
- | openrisc \
+ | or32 \
| pdp10 | pdp11 | pj | pjl \
| powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \
| pyramid \
- | s390 | s390x | as400 \
- | sh | sh[34] | sh[34]eb | shbe | shle \
- | sparc | sparc64 | sparclet | sparclite | sparcv9 | sparcv9b \
- | stormy16 | strongarm \
- | tahoe | thumb | tic80 | tron \
- | v850 \
+ | sh | sh[1234] | sh[24]a | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \
+ | sh64 | sh64le \
+ | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \
+ | sparcv8 | sparcv9 | sparcv9b | sparcv9v \
+ | spu | strongarm \
+ | tahoe | thumb | tic4x | tic80 | tron \
+ | v850 | v850e \
| we32k \
- | x86 | xscale \
+ | x86 | xscale | xscalee[bl] | xstormy16 | xtensa \
| z8k)
basic_machine=$basic_machine-unknown
;;
@@ -266,6 +295,9 @@ case $basic_machine in
;;
m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k)
;;
+ ms1)
+ basic_machine=mt-unknown
+ ;;
# We use `pc' rather than `unknown'
# because (1) that's what they normally are, and
@@ -282,38 +314,61 @@ case $basic_machine in
580-* \
| a29k-* \
| alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \
- | alphapca5[67]-* | arc-* \
- | arm-* | armbe-* | armle-* | armv*-* \
- | bs2000-* \
- | c[123]* | c30-* | [cjt]90-* | c54x-* \
- | clipper-* | cray2-* | cydra-* \
- | d10v-* | d30v-* \
+ | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \
+ | alphapca5[67]-* | alpha64pca5[67]-* | arc-* \
+ | arm-* | armbe-* | armle-* | armeb-* | armv*-* \
+ | avr-* | avr32-* \
+ | bfin-* | bs2000-* \
+ | c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* | c55x-* | c6x-* \
+ | clipper-* | craynv-* | cydra-* \
+ | d10v-* | d30v-* | dlx-* \
| elxsi-* \
- | f30[01]-* | f700-* | fr30-* | fx80-* \
+ | f30[01]-* | f700-* | fr30-* | frv-* | fx80-* \
| h8300-* | h8500-* \
| hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \
| i*86-* | i860-* | i960-* | ia64-* \
- | m32r-* \
- | m68000-* | m680[01234]0-* | m68360-* | m683?2-* | m68k-* \
- | m88110-* | m88k-* | mcore-* \
- | mips-* | mips16-* | mips64-* | mips64el-* | mips64orion-* \
- | mips64orionel-* | mips64vr4100-* | mips64vr4100el-* \
- | mips64vr4300-* | mips64vr4300el-* | mipsbe-* | mipseb-* \
- | mipsle-* | mipsel-* | mipstx39-* | mipstx39el-* \
+ | ip2k-* | iq2000-* \
+ | m32c-* | m32r-* | m32rle-* \
+ | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \
+ | m88110-* | m88k-* | maxq-* | mcore-* \
+ | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \
+ | mips16-* \
+ | mips64-* | mips64el-* \
+ | mips64vr-* | mips64vrel-* \
+ | mips64orion-* | mips64orionel-* \
+ | mips64vr4100-* | mips64vr4100el-* \
+ | mips64vr4300-* | mips64vr4300el-* \
+ | mips64vr5000-* | mips64vr5000el-* \
+ | mips64vr5900-* | mips64vr5900el-* \
+ | mipsisa32-* | mipsisa32el-* \
+ | mipsisa32r2-* | mipsisa32r2el-* \
+ | mipsisa64-* | mipsisa64el-* \
+ | mipsisa64r2-* | mipsisa64r2el-* \
+ | mipsisa64sb1-* | mipsisa64sb1el-* \
+ | mipsisa64sr71k-* | mipsisa64sr71kel-* \
+ | mipstx39-* | mipstx39el-* \
+ | mmix-* \
+ | mt-* \
+ | msp430-* \
+ | nios-* | nios2-* \
| none-* | np1-* | ns16k-* | ns32k-* \
| orion-* \
| pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \
| powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \
| pyramid-* \
| romp-* | rs6000-* \
- | s390-* | s390x-* | os400-* \
- | sh-* | sh[34]-* | sh[34]eb-* | shbe-* | shle-* \
- | sparc-* | sparc64-* | sparc86x-* | sparclite-* \
- | sparcv9-* | sparcv9b-* | stormy16-* | strongarm-* | sv1-* \
- | t3e-* | tahoe-* | thumb-* | tic30-* | tic54x-* | tic80-* | tron-* \
- | v850-* | vax-* \
+ | sh-* | sh[1234]-* | sh[24]a-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \
+ | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \
+ | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \
+ | sparclite-* \
+ | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | strongarm-* | sv1-* | sx?-* \
+ | tahoe-* | thumb-* \
+ | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \
+ | tron-* \
+ | v850-* | v850e-* | vax-* \
| we32k-* \
- | x86-* | x86_64-* | xmp-* | xps100-* | xscale-* \
+ | x86-* | x86_64-* | xps100-* | xscale-* | xscalee[bl]-* \
+ | xstormy16-* | xtensa-* \
| ymp-* \
| z8k-*)
;;
@@ -333,6 +388,9 @@ case $basic_machine in
basic_machine=a29k-amd
os=-udi
;;
+ abacus)
+ basic_machine=abacus-unknown
+ ;;
adobe68k)
basic_machine=m68010-adobe
os=-scout
@@ -347,6 +405,12 @@ case $basic_machine in
basic_machine=a29k-none
os=-bsd
;;
+ amd64)
+ basic_machine=x86_64-pc
+ ;;
+ amd64-*)
+ basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
amdahl)
basic_machine=580-amdahl
os=-sysv
@@ -378,6 +442,10 @@ case $basic_machine in
basic_machine=ns32k-sequent
os=-dynix
;;
+ c90)
+ basic_machine=c90-cray
+ os=-unicos
+ ;;
convex-c1)
basic_machine=c1-convex
os=-bsd
@@ -398,30 +466,45 @@ case $basic_machine in
basic_machine=c38-convex
os=-bsd
;;
- cray | ymp)
- basic_machine=ymp-cray
+ cray | j90)
+ basic_machine=j90-cray
os=-unicos
;;
- cray2)
- basic_machine=cray2-cray
- os=-unicos
+ craynv)
+ basic_machine=craynv-cray
+ os=-unicosmp
;;
- [cjt]90)
- basic_machine=${basic_machine}-cray
- os=-unicos
+ cr16c)
+ basic_machine=cr16c-unknown
+ os=-elf
;;
crds | unos)
basic_machine=m68k-crds
;;
+ crisv32 | crisv32-* | etraxfs*)
+ basic_machine=crisv32-axis
+ ;;
cris | cris-* | etrax*)
basic_machine=cris-axis
;;
+ crx)
+ basic_machine=crx-unknown
+ os=-elf
+ ;;
da30 | da30-*)
basic_machine=m68k-da30
;;
decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn)
basic_machine=mips-dec
;;
+ decsystem10* | dec10*)
+ basic_machine=pdp10-dec
+ os=-tops10
+ ;;
+ decsystem20* | dec20*)
+ basic_machine=pdp10-dec
+ os=-tops20
+ ;;
delta | 3300 | motorola-3300 | motorola-delta \
| 3300-motorola | delta-motorola)
basic_machine=m68k-motorola
@@ -430,6 +513,10 @@ case $basic_machine in
basic_machine=m88k-motorola
os=-sysv3
;;
+ djgpp)
+ basic_machine=i586-pc
+ os=-msdosdjgpp
+ ;;
dpx20 | dpx20-*)
basic_machine=rs6000-bull
os=-bosx
@@ -602,32 +689,27 @@ case $basic_machine in
basic_machine=m68k-atari
os=-mint
;;
- mipsel*-linux*)
- basic_machine=mipsel-unknown
- os=-linux-gnu
- ;;
- mips*-linux*)
- basic_machine=mips-unknown
- os=-linux-gnu
- ;;
mips3*-*)
basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`
;;
mips3*)
basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown
;;
- mmix*)
- basic_machine=mmix-knuth
- os=-mmixware
- ;;
monitor)
basic_machine=m68k-rom68k
os=-coff
;;
+ morphos)
+ basic_machine=powerpc-unknown
+ os=-morphos
+ ;;
msdos)
basic_machine=i386-pc
os=-msdos
;;
+ ms1-*)
+ basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'`
+ ;;
mvs)
basic_machine=i370-ibm
os=-mvs
@@ -703,6 +785,13 @@ case $basic_machine in
basic_machine=hppa1.1-oki
os=-proelf
;;
+ openrisc | openrisc-*)
+ basic_machine=or32-unknown
+ ;;
+ os400)
+ basic_machine=powerpc-ibm
+ os=-os400
+ ;;
OSE68000 | ose68000)
basic_machine=m68000-ericsson
os=-ose
@@ -725,49 +814,61 @@ case $basic_machine in
pbb)
basic_machine=m68k-tti
;;
- pc532 | pc532-*)
+ pc532 | pc532-*)
basic_machine=ns32k-pc532
;;
- pentium | p5 | k5 | k6 | nexgen)
+ pc98)
+ basic_machine=i386-pc
+ ;;
+ pc98-*)
+ basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ pentium | p5 | k5 | k6 | nexgen | viac3)
basic_machine=i586-pc
;;
- pentiumpro | p6 | 6x86 | athlon)
+ pentiumpro | p6 | 6x86 | athlon | athlon_*)
basic_machine=i686-pc
;;
- pentiumii | pentium2)
+ pentiumii | pentium2 | pentiumiii | pentium3)
basic_machine=i686-pc
;;
- pentium-* | p5-* | k5-* | k6-* | nexgen-*)
+ pentium4)
+ basic_machine=i786-pc
+ ;;
+ pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*)
basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'`
;;
pentiumpro-* | p6-* | 6x86-* | athlon-*)
basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
;;
- pentiumii-* | pentium2-*)
+ pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*)
basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
;;
+ pentium4-*)
+ basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
pn)
basic_machine=pn-gould
;;
power) basic_machine=power-ibm
;;
ppc) basic_machine=powerpc-unknown
- ;;
+ ;;
ppc-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'`
;;
ppcle | powerpclittle | ppc-le | powerpc-little)
basic_machine=powerpcle-unknown
- ;;
+ ;;
ppcle-* | powerpclittle-*)
basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'`
;;
ppc64) basic_machine=powerpc64-unknown
- ;;
+ ;;
ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'`
;;
ppc64le | powerpc64little | ppc64-le | powerpc64-little)
basic_machine=powerpc64le-unknown
- ;;
+ ;;
ppc64le-* | powerpc64little-*)
basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'`
;;
@@ -778,6 +879,10 @@ case $basic_machine in
basic_machine=i586-unknown
os=-pw32
;;
+ rdos)
+ basic_machine=i386-pc
+ os=-rdos
+ ;;
rom68k)
basic_machine=m68k-rom68k
os=-coff
@@ -788,10 +893,26 @@ case $basic_machine in
rtpc | rtpc-*)
basic_machine=romp-ibm
;;
+ s390 | s390-*)
+ basic_machine=s390-ibm
+ ;;
+ s390x | s390x-*)
+ basic_machine=s390x-ibm
+ ;;
sa29200)
basic_machine=a29k-amd
os=-udi
;;
+ sb1)
+ basic_machine=mipsisa64sb1-unknown
+ ;;
+ sb1el)
+ basic_machine=mipsisa64sb1el-unknown
+ ;;
+ sei)
+ basic_machine=mips-sei
+ os=-seiux
+ ;;
sequent)
basic_machine=i386-sequent
;;
@@ -799,7 +920,10 @@ case $basic_machine in
basic_machine=sh-hitachi
os=-hms
;;
- sparclite-wrs)
+ sh64)
+ basic_machine=sh64-unknown
+ ;;
+ sparclite-wrs | simso-wrs)
basic_machine=sparclite-wrs
os=-vxworks
;;
@@ -866,22 +990,42 @@ case $basic_machine in
os=-dynix
;;
t3e)
- basic_machine=t3e-cray
+ basic_machine=alphaev5-cray
+ os=-unicos
+ ;;
+ t90)
+ basic_machine=t90-cray
os=-unicos
;;
tic54x | c54x*)
basic_machine=tic54x-unknown
os=-coff
;;
+ tic55x | c55x*)
+ basic_machine=tic55x-unknown
+ os=-coff
+ ;;
+ tic6x | c6x*)
+ basic_machine=tic6x-unknown
+ os=-coff
+ ;;
tx39)
basic_machine=mipstx39-unknown
;;
tx39el)
basic_machine=mipstx39el-unknown
;;
+ toad1)
+ basic_machine=pdp10-xkl
+ os=-tops20
+ ;;
tower | tower-32)
basic_machine=m68k-ncr
;;
+ tpf)
+ basic_machine=s390x-ibm
+ os=-tpf
+ ;;
udi29k)
basic_machine=a29k-amd
os=-udi
@@ -903,8 +1047,8 @@ case $basic_machine in
os=-vms
;;
vpp*|vx|vx-*)
- basic_machine=f301-fujitsu
- ;;
+ basic_machine=f301-fujitsu
+ ;;
vxworks960)
basic_machine=i960-wrs
os=-vxworks
@@ -925,25 +1069,21 @@ case $basic_machine in
basic_machine=hppa1.1-winbond
os=-proelf
;;
- windows32)
- basic_machine=i386-pc
- os=-windows32-msvcrt
- ;;
- xmp)
- basic_machine=xmp-cray
- os=-unicos
+ xbox)
+ basic_machine=i686-pc
+ os=-mingw32
;;
- xps | xps100)
+ xps | xps100)
basic_machine=xps100-honeywell
;;
+ ymp)
+ basic_machine=ymp-cray
+ os=-unicos
+ ;;
z8k-*-coff)
basic_machine=z8k-unknown
os=-sim
;;
- as400)
- basic_machine=as400
- os=-os400
- ;;
none)
basic_machine=none-none
os=-none
@@ -960,16 +1100,12 @@ case $basic_machine in
op60c)
basic_machine=hppa1.1-oki
;;
- mips)
- if [ x$os = x-linux-gnu ]; then
- basic_machine=mips-unknown
- else
- basic_machine=mips-mips
- fi
- ;;
romp)
basic_machine=romp-ibm
;;
+ mmix)
+ basic_machine=mmix-knuth
+ ;;
rs6000)
basic_machine=rs6000-ibm
;;
@@ -986,13 +1122,13 @@ case $basic_machine in
we32k)
basic_machine=we32k-att
;;
- sh3 | sh4 | sh3eb | sh4eb)
+ sh[1234] | sh[24]a | sh[34]eb | sh[1234]le | sh[23]ele)
basic_machine=sh-unknown
;;
- sparc | sparcv9 | sparcv9b)
+ sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v)
basic_machine=sparc-sun
;;
- cydra)
+ cydra)
basic_machine=cydra-cydrome
;;
orion)
@@ -1007,14 +1143,6 @@ case $basic_machine in
pmac | pmac-mpw)
basic_machine=powerpc-apple
;;
- c4x*)
- basic_machine=c4x-none
- os=-coff
- ;;
- as400*)
- basic_machine=as400
- os=-os400
- ;;
*-unknown)
# Make sure to match an already-canonicalized machine name.
;;
@@ -1070,17 +1198,23 @@ case $os in
| -aos* \
| -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \
| -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \
- | -hiux* | -386bsd* | -netbsd* | -openbsd* | -freebsd* | -riscix* \
- | -lynxos* | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \
+ | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \
+ | -openbsd* | -solidbsd* \
+ | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \
+ | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \
| -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \
| -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \
| -chorusos* | -chorusrdb* \
| -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
- | -mingw32* | -linux-gnu* | -uxpv* | -beos* | -mpeix* | -udk* \
- | -interix* | -uwin* | -rhapsody* | -darwin* | -opened* \
+ | -mingw32* | -linux-gnu* | -linux-newlib* | -linux-uclibc* \
+ | -uxpv* | -beos* | -mpeix* | -udk* \
+ | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \
| -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \
| -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \
- | -os2* | -vos*)
+ | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \
+ | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \
+ | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \
+ | -skyos* | -haiku* | -rdos*)
# Remember, each alternative MUST END IN *, to match a version number.
;;
-qnx*)
@@ -1092,16 +1226,21 @@ case $os in
;;
esac
;;
+ -nto-qnx*)
+ ;;
-nto*)
- os=-nto-qnx
+ os=`echo $os | sed -e 's|nto|nto-qnx|'`
;;
-sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \
- | -windows* | -osx | -abug | -netware* | -os9* | -beos* \
+ | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \
| -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*)
;;
-mac*)
os=`echo $os | sed -e 's|mac|macos|'`
;;
+ -linux-dietlibc)
+ os=-linux-dietlibc
+ ;;
-linux*)
os=`echo $os | sed -e 's|linux|linux-gnu|'`
;;
@@ -1114,6 +1253,9 @@ case $os in
-opened*)
os=-openedition
;;
+ -os400*)
+ os=-os400
+ ;;
-wince*)
os=-wince
;;
@@ -1123,9 +1265,6 @@ case $os in
-osf*)
os=-osf
;;
- -os400*)
- os=-os400
- ;;
-utek*)
os=-bsd
;;
@@ -1135,14 +1274,23 @@ case $os in
-acis*)
os=-aos
;;
+ -atheos*)
+ os=-atheos
+ ;;
+ -syllable*)
+ os=-syllable
+ ;;
-386bsd)
os=-bsd
;;
-ctix* | -uts*)
os=-sysv
;;
+ -nova*)
+ os=-rtmk-nova
+ ;;
-ns2 )
- os=-nextstep2
+ os=-nextstep2
;;
-nsk*)
os=-nsk
@@ -1154,6 +1302,9 @@ case $os in
-sinix*)
os=-sysv4
;;
+ -tpf*)
+ os=-tpf
+ ;;
-triton*)
os=-sysv3
;;
@@ -1181,8 +1332,17 @@ case $os in
-xenix)
os=-xenix
;;
- -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
- os=-mint
+ -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
+ os=-mint
+ ;;
+ -aros*)
+ os=-aros
+ ;;
+ -kaos*)
+ os=-kaos
+ ;;
+ -zvmoe)
+ os=-zvmoe
;;
-none)
;;
@@ -1206,6 +1366,9 @@ else
# system, and we'll never get to this point.
case $basic_machine in
+ spu-*)
+ os=-elf
+ ;;
*-acorn)
os=-riscix1.2
;;
@@ -1215,10 +1378,14 @@ case $basic_machine in
arm*-semi)
os=-aout
;;
+ c4x-* | tic4x-*)
+ os=-coff
+ ;;
+ # This must come before the *-dec entry.
pdp10-*)
os=-tops20
;;
- pdp11-*)
+ pdp11-*)
os=-none
;;
*-dec | vax-*)
@@ -1245,6 +1412,9 @@ case $basic_machine in
mips*-*)
os=-elf
;;
+ or32-*)
+ os=-coff
+ ;;
*-tti) # must be before sparc entry or we get the wrong os.
os=-sysv3
;;
@@ -1254,9 +1424,15 @@ case $basic_machine in
*-be)
os=-beos
;;
+ *-haiku)
+ os=-haiku
+ ;;
*-ibm)
os=-aix
;;
+ *-knuth)
+ os=-mmixware
+ ;;
*-wec)
os=-proelf
;;
@@ -1308,19 +1484,19 @@ case $basic_machine in
*-next)
os=-nextstep3
;;
- *-gould)
+ *-gould)
os=-sysv
;;
- *-highlevel)
+ *-highlevel)
os=-bsd
;;
*-encore)
os=-bsd
;;
- *-sgi)
+ *-sgi)
os=-irix
;;
- *-siemens)
+ *-siemens)
os=-sysv4
;;
*-masscomp)
@@ -1389,10 +1565,16 @@ case $basic_machine in
-mvs* | -opened*)
vendor=ibm
;;
+ -os400*)
+ vendor=ibm
+ ;;
-ptx*)
vendor=sequent
;;
- -vxsim* | -vxworks*)
+ -tpf*)
+ vendor=ibm
+ ;;
+ -vxsim* | -vxworks* | -windiss*)
vendor=wrs
;;
-aux*)
@@ -1416,7 +1598,7 @@ case $basic_machine in
esac
echo $basic_machine$os
-exit 0
+exit
# Local variables:
# eval: (add-hook 'write-file-hooks 'time-stamp)
diff --git a/icuSources/config/Makefile.inc.in b/icuSources/config/Makefile.inc.in
index b8ce6a53..172ff20e 100644
--- a/icuSources/config/Makefile.inc.in
+++ b/icuSources/config/Makefile.inc.in
@@ -1,6 +1,6 @@
## -*-makefile-*-
#******************************************************************************
-# Copyright (C) 1999-2004, International Business Machines
+# Copyright (C) 1999-2005, International Business Machines
# Corporation and others. All Rights Reserved.
#******************************************************************************
# This Makefile.inc is designed to be included into projects which make use
@@ -79,6 +79,18 @@ endif
#SH# ;;
#SH#esac
+# Name flexibility for the library naming scheme. Any modifications should
+# be made in the mh- file for the specific platform.
+DATA_STUBNAME = data
+COMMON_STUBNAME = uc
+I18N_STUBNAME = i18n
+LAYOUT_STUBNAME = le
+LAYOUTEX_STUBNAME = lx
+IO_STUBNAME = io
+TOOLUTIL_STUBNAME = tu
+CTESTFW_STUBNAME = test
+
+
### To link your application with ICU:
# 1. use LDFLAGS, CFLAGS, etc from above
@@ -89,8 +101,8 @@ endif
# - $(ICULIBS_ICUIO) - ICU stdio equivalent library
ICULIBS_COMMON = -l$(ICUPREFIX)uc$(ICULIBSUFFIX)$(ICULIBSUFFIX_VERSION)
-ICULIBS_DATA = -l$(ICUPREFIX)data$(ICULIBSUFFIX)$(ICULIBSUFFIX_VERSION)
-ICULIBS_I18N = -l$(ICUPREFIX)i18n$(ICULIBSUFFIX)$(ICULIBSUFFIX_VERSION)
+ICULIBS_DATA = -l$(ICUPREFIX)$(DATA_STUBNAME)$(ICULIBSUFFIX)$(ICULIBSUFFIX_VERSION)
+ICULIBS_I18N = -l$(ICUPREFIX)$(I18N_STUBNAME)$(ICULIBSUFFIX)$(ICULIBSUFFIX_VERSION)
ICULIBS_TOOLUTIL = -l$(ICUPREFIX)tu$(ICULIBSUFFIX)$(ICULIBSUFFIX_VERSION)
ICULIBS_CTESTFW = -l$(ICUPREFIX)ctestfw$(ICULIBSUFFIX)$(ICULIBSUFFIX_VERSION)
ICULIBS_ICUIO = -l$(ICUPREFIX)io$(ICULIBSUFFIX)$(ICULIBSUFFIX_VERSION)
@@ -153,6 +165,9 @@ platform = @platform@
##################################################################
AIX_SHLIB = @AIX_SHLIB@
AR = @AR@
+# initial tab keeps it out of the shell version.
+ ARFLAGS := @ARFLAGS@ $(ARFLAGS)
+#SH#ARFLAGS="@ARFLAGS@ ${ARFLAGS}"
CC = @CC@
CFLAGS = @CFLAGS@
CPP = @CPP@
@@ -203,6 +218,7 @@ pkgdatadir = $(datadir)/$(PACKAGE)$(ICULIBSUFFIX)/$(VERSION)
pkglibdir = $(libdir)/$(PACKAGE)$(ICULIBSUFFIX)/$(VERSION)
# The basename of the ICU data file (i.e. icudt21b )
+ICUDATA_CHAR = @ICUDATA_CHAR@
ICUDATA_NAME = icudt@LIB_VERSION_MAJOR@@ICUDATA_CHAR@
# Defaults for pkgdata's mode and directories
diff --git a/icuSources/config/icu-config-bottom b/icuSources/config/icu-config-bottom
index 2f88eab0..fa1dcd54 100644
--- a/icuSources/config/icu-config-bottom
+++ b/icuSources/config/icu-config-bottom
@@ -1,6 +1,6 @@
## -*-sh-*-
## BEGIN of icu-config-bottom.
-## Copyright (c) 2002-2004, International Business Machines Corporation and
+## Copyright (c) 2002-2005, International Business Machines Corporation and
## others. All Rights Reserved.
ICUUC_FILE=${libdir}/${ICULIBS_COMMON_LIB_NAME}
@@ -14,7 +14,7 @@ fi
## The actual code of icu-config goes here.
-ME=`basename $0`
+ME=`basename "$0"`
allflags()
{
diff --git a/icuSources/config/make2sh.sed b/icuSources/config/make2sh.sed
index 92a9a833..b9cd370b 100644
--- a/icuSources/config/make2sh.sed
+++ b/icuSources/config/make2sh.sed
@@ -1,6 +1,7 @@
-# Copyright (C) 1999-2004, International Business Machines Corporation and others. All Rights Reserved.
+# Copyright (C) 1999-2006, International Business Machines Corporation and others. All Rights Reserved.
s%^\([a-zA-Z\._-]*\)[ ]*+=%\1=$(\1) %
s%^[A-Z]*_SO_TARG*%## &%
+s%^SHARED_OBJECT.*%## &%
s%^LD_SONAME.*%## &%
s%$(\([^\)]*\))%${\1}%g
s%^ %#M# %
diff --git a/icuSources/config/mh-aix b/icuSources/config/mh-aix
index c09e2082..755a8a53 100644
--- a/icuSources/config/mh-aix
+++ b/icuSources/config/mh-aix
@@ -1,6 +1,6 @@
## -*-makefile-*-
## Aix-specific setup (for xlC)
-## Copyright (c) 1999-2004, International Business Machines Corporation and
+## Copyright (c) 1999-2006, International Business Machines Corporation and
## others. All Rights Reserved.
##
## Please note: AIX does NOT have library versioning per se (there is no 'SONAME' capability).
@@ -109,7 +109,6 @@ STATIC_O = o
## BIR - bind with internal references [so app data and icu data doesn't collide]
BIR_LDFLAGS= -E$(NAME).map -bnoexpall
-BIR_CPPFLAGS= -DU_HAVE_BIND_INTERNAL_REFERENCES
BIR_DEPS= $(NAME).map
diff --git a/icuSources/config/mh-aix-gcc b/icuSources/config/mh-aix-gcc
index a5d4e911..79e68072 100644
--- a/icuSources/config/mh-aix-gcc
+++ b/icuSources/config/mh-aix-gcc
@@ -1,5 +1,5 @@
## -*-makefile-*-
-## Copyright (c) 2003-2004 IBM, Ken Foskey, and others. All rights reserved.
+## Copyright (c) 2003-2006 IBM, Ken Foskey, and others. All rights reserved.
##
## Aix-specific setup (for gcc)
##
@@ -29,6 +29,9 @@ LD_RPATH_PRE=
## enable the shared lib loader
LDFLAGS += -Wl,-bbigtoc
+## These are the library specific LDFLAGS
+LDFLAGSICUDT=-nodefaultlibs -nostdlib
+
## We need to delete things prior to linking, or else we'll get
## SEVERE ERROR: output file in use .. on AIX.
## But, shell script version should NOT delete target as we don't
@@ -54,6 +57,9 @@ endif
## Compiler switch to embed a library name. Not present on AIX.
LD_SONAME =
+## The type of assembly needed when pkgdata is used for generating shared libraries.
+GENCCODE_ASSEMBLY=-a xlc
+
## Shared object suffix
SO= a
A= a
@@ -108,9 +114,6 @@ STATIC_O = o
# LDflags that pkgdata will use
BIR_LDFLAGS= -Wl,-bE:$(NAME).map,-bnoexpall
-# CPPflags for genccode/gencmn
-BIR_CPPFLAGS= -DU_HAVE_BIND_INTERNAL_REFERENCES
-
# Dependencies [i.e. map files] for the final library
BIR_DEPS= $(NAME).map
diff --git a/icuSources/config/mh-aix-va b/icuSources/config/mh-aix-va
index c39ccee9..39faf459 100644
--- a/icuSources/config/mh-aix-va
+++ b/icuSources/config/mh-aix-va
@@ -1,6 +1,6 @@
## -*-makefile-*-
## Aix-specific setup (for Visual Age 5+)
-## Copyright (c) 1999-2004, International Business Machines Corporation and
+## Copyright (c) 1999-2005, International Business Machines Corporation and
## others. All Rights Reserved.
## Commands to generate dependency files
@@ -43,10 +43,6 @@ LD_RPATH_PRE=
## Environment variable to set a runtime search path
LDLIBRARYPATH_ENVVAR = LIBPATH
-## Override Versioned target for a shared library.
-FINAL_SO_TARGET= $(basename $(SO_TARGET))$(SO_TARGET_VERSION).$(SO)
-MIDDLE_SO_TARGET= $(basename $(SO_TARGET))$(SO_TARGET_VERSION_MAJOR).$(SO)
-
# The following is for Makefile.inc's use.
ICULIBSUFFIX_VERSION = $(LIB_VERSION_MAJOR)
@@ -61,15 +57,22 @@ LD_SONAME =
GENCCODE_ASSEMBLY=-a xlc
## Shared object suffix
-#SO= so
+SOBJ= so
# without the -brtl option, the library names use .a. AIX is funny that way.
SO= a
## Non-shared intermediate object suffix
STATIC_O = o
+## Override Versioned target for a shared library.
+FINAL_SO_TARGET= $(basename $(SO_TARGET))$(SO_TARGET_VERSION).$(SO)
+MIDDLE_SO_TARGET= $(basename $(SO_TARGET))$(SO_TARGET_VERSION_MAJOR).$(SO)
+SHARED_OBJECT = $(notdir $(FINAL_SO_TARGET:.$(SO)=.$(SOBJ)))
+
## Build archive from shared object
%.a : %.so
$(AR) $(ARFLAGS) $@ $<
+$(LIBDIR)/%.a : %.so
+ $(AR) $(ARFLAGS) $@ $<
## Build import list from export list
%.e : %.exp
diff --git a/icuSources/config/mh-alpha-linux-cc b/icuSources/config/mh-alpha-linux-cc
index 5020add6..f05632ed 100644
--- a/icuSources/config/mh-alpha-linux-cc
+++ b/icuSources/config/mh-alpha-linux-cc
@@ -1,6 +1,6 @@
## -*-makefile-*-
## Alpha-Linux-specific setup
-## Copyright (c) 1999-2004, International Business Machines Corporation and
+## Copyright (c) 1999-2006, International Business Machines Corporation and
## others. All Rights Reserved.
## Commands to generate dependency files
@@ -13,8 +13,8 @@ SHAREDLIBCXXFLAGS = -fPIC
SHAREDLIBCPPFLAGS = -DPIC
## Additional flags when building libraries and with threads
-LIBCPPFLAGS = -D_REENTRANT
THREADSCPPFLAGS = -D_REENTRANT
+LIBCPPFLAGS =
# The tests need complete IEEE floating point support
CFLAGS += -ieee
@@ -78,9 +78,6 @@ STATIC_O = ao
# LDflags that pkgdata will use
BIR_LDFLAGS= -Wl,-Bsymbolic
-# CPPflags for genccode/gencmn
-BIR_CPPFLAGS= -DU_HAVE_BIND_INTERNAL_REFERENCES
-
# Dependencies [i.e. map files] for the final library
BIR_DEPS=
diff --git a/icuSources/config/mh-alpha-linux-gcc b/icuSources/config/mh-alpha-linux-gcc
index b2133103..ee5f9094 100644
--- a/icuSources/config/mh-alpha-linux-gcc
+++ b/icuSources/config/mh-alpha-linux-gcc
@@ -1,6 +1,6 @@
## -*-makefile-*-
## Linux-specific setup
-## Copyright (c) 1999-2004, International Business Machines Corporation and
+## Copyright (c) 1999-2006, International Business Machines Corporation and
## others. All Rights Reserved.
## Commands to generate dependency files
@@ -13,8 +13,8 @@ SHAREDLIBCXXFLAGS = -fPIC
SHAREDLIBCPPFLAGS = -DPIC
## Additional flags when building libraries and with threads
-LIBCPPFLAGS = -D_REENTRANT
THREADSCPPFLAGS = -D_REENTRANT
+LIBCPPFLAGS =
# The tests need complete IEEE floating point support
CFLAGS += -mieee
@@ -72,9 +72,6 @@ GENCCODE_ASSEMBLY=-a gcc
# LDflags that pkgdata will use
BIR_LDFLAGS= -Wl,-Bsymbolic
-# CPPflags for genccode/gencmn
-BIR_CPPFLAGS= -DU_HAVE_BIND_INTERNAL_REFERENCES
-
# Dependencies [i.e. map files] for the final library
BIR_DEPS=
diff --git a/icuSources/config/mh-alpha-osf b/icuSources/config/mh-alpha-osf
index 5ec4c83c..bf632591 100644
--- a/icuSources/config/mh-alpha-osf
+++ b/icuSources/config/mh-alpha-osf
@@ -1,6 +1,6 @@
## -*-makefile-*-
## Alpha-OSF-specific setup
-## Copyright (c) 1999-2004, International Business Machines Corporation and
+## Copyright (c) 1999-2006, International Business Machines Corporation and
## others. All Rights Reserved.
## Commands to generate dependency files
@@ -13,8 +13,8 @@ SHAREDLIBCXXFLAGS =
SHAREDLIBCPPFLAGS =
## Additional flags when building libraries and with threads
-LIBCPPFLAGS = -D_REENTRANT
THREADSCPPFLAGS = -D_REENTRANT -pthread
+LIBCPPFLAGS =
# The tests need complete IEEE floating point support
CFLAGS += -ieee
@@ -78,9 +78,6 @@ STATIC_O = ao
# LDflags that pkgdata will use
BIR_LDFLAGS= -Wl,-Bsymbolic
-# CPPflags for genccode/gencmn
-BIR_CPPFLAGS= -DU_HAVE_BIND_INTERNAL_REFERENCES
-
# Dependencies [i.e. map files] for the final library
BIR_DEPS=
diff --git a/icuSources/config/mh-beos b/icuSources/config/mh-beos
index b32e2b3b..0e5691be 100644
--- a/icuSources/config/mh-beos
+++ b/icuSources/config/mh-beos
@@ -1,6 +1,6 @@
## -*-makefile-*-
## BeOS-specific setup
-## Copyright (c) 2003-2004, International Business Machines Corporation and
+## Copyright (c) 2003-2006, International Business Machines Corporation and
## others. All Rights Reserved.
##
## Original author: Andrew Bachmann
@@ -96,9 +96,6 @@ STATIC_O = ao
# LDflags that pkgdata will use
BIR_LDFLAGS= -Wl,-Bsymbolic
-# CPPflags for genccode/gencmn
-BIR_CPPFLAGS= -DU_HAVE_BIND_INTERNAL_REFERENCES
-
# Dependencies [i.e. map files] for the final library
BIR_DEPS=
diff --git a/icuSources/config/mh-bsd-gcc b/icuSources/config/mh-bsd-gcc
index 10e55870..8745b115 100644
--- a/icuSources/config/mh-bsd-gcc
+++ b/icuSources/config/mh-bsd-gcc
@@ -1,6 +1,6 @@
## -*-makefile-*-
-## FreeBSD-specific setup
-## Copyright (c) 1999-2004, International Business Machines Corporation and
+## BSD-specific setup (FreeBSD, OpenBSD, NetBSD, *BSD)
+## Copyright (c) 1999-2006, International Business Machines Corporation and
## others. All Rights Reserved.
## Commands to generate dependency files
@@ -12,6 +12,10 @@ SHAREDLIBCFLAGS = -fPIC
SHAREDLIBCXXFLAGS = -fPIC
SHAREDLIBCPPFLAGS = -DPIC
+## Additional flags when building libraries and with threads
+THREADSCPPFLAGS = -D_REENTRANT
+LIBCPPFLAGS =
+
## Compiler switch to embed a runtime search path
LD_RPATH=
LD_RPATH_PRE= -Wl,-rpath,
diff --git a/icuSources/config/mh-cygwin b/icuSources/config/mh-cygwin
index c06b7974..aa58e0e9 100644
--- a/icuSources/config/mh-cygwin
+++ b/icuSources/config/mh-cygwin
@@ -1,6 +1,6 @@
## -*-makefile-*-
## Cygwin-specific setup
-## Copyright (c) 2001-2004, International Business Machines Corporation and
+## Copyright (c) 2001-2006, International Business Machines Corporation and
## others. All Rights Reserved.
## Commands to generate dependency files
@@ -22,8 +22,8 @@ SHAREDLIBCXXFLAGS =
SHAREDLIBCPPFLAGS = -DPIC
## Additional flags when building libraries and with threads
-LIBCPPFLAGS = -D_REENTRANT
THREADSCPPFLAGS = -D_REENTRANT
+LIBCPPFLAGS =
# Commands to link. Link with C++ in case static libraries are used.
LINK.c= $(CXX) $(CXXFLAGS) $(LDFLAGS)
@@ -67,12 +67,12 @@ I18N_STUBNAME = in
%.d: $(srcdir)/%.c
@echo "generating dependency information for $<"
@echo -n "$@ " > $@
- @$(SHELL) -ec '$(GEN_DEPS.c) $< >> $@; [ -s $@ ] || rm -f $@'
+ @$(GEN_DEPS.c) $< >> $@ || (rm -f $@ && FALSE)
%.d: $(srcdir)/%.cpp
@echo "generating dependency information for $<"
@echo -n "$@ " > $@
- @$(SHELL) -ec '$(GEN_DEPS.cc) $< >> $@; [ -s $@ ] || rm -f $@'
+ @$(GEN_DEPS.cc) $< >> $@ || (rm -f $@ && FALSE)
## Versioned target for a shared library.
## Since symbolic links don't work the same way on Windows,
@@ -81,20 +81,23 @@ I18N_STUBNAME = in
FINAL_SO_TARGET=$(basename $(SO_TARGET))$(SO_TARGET_VERSION_MAJOR).$(SO)
MIDDLE_SO_TARGET=$(FINAL_SO_TARGET)
+# The following is for Makefile.inc's use.
+ICULIBSUFFIX_VERSION = $(LIB_VERSION_MAJOR)
+
## Versioned libraries rules
#%$(SO_TARGET_VERSION_MAJOR).$(SO): %$(SO_TARGET_VERSION).$(SO)
# $(RM) $@ && cp ${ /dev/null
@mv $@ $@~
- @echo -n "$@ " > $@
+ @printf "%s" "$@ " > $@
@cat < $@~ >> $@
@-rm $@~
@@ -66,7 +66,7 @@ STATIC_O = ao
@echo "generating dependency information for $<"
@$(GEN_DEPS.cc) $< >/dev/null
@mv $@ $@~
- @echo -n "$@ " > $@
+ @printf "%s" "$@ " > $@
@cat < $@~ >> $@
@-rm $@~
diff --git a/icuSources/config/mh-hpux-acc b/icuSources/config/mh-hpux-acc
index f4c3e02c..a2961602 100644
--- a/icuSources/config/mh-hpux-acc
+++ b/icuSources/config/mh-hpux-acc
@@ -1,6 +1,6 @@
## -*-makefile-*-
## HP/UX-specific setup using aCC
-## Copyright (c) 1999-2004, International Business Machines Corporation and
+## Copyright (c) 1999-2006, International Business Machines Corporation and
## others. All Rights Reserved.
## Commands to generate dependency files
@@ -34,7 +34,7 @@ COMPILE.cc= $(CXX) $(DEFS) $(CPPFLAGS) $(CXXFLAGS) -c
## Common 'default' path to ensure the sanity of users. Search the current
## directory, at least.
-LD_DEFAULTPATH= -Wl,+b,.:'$$'ORIGIN/
+LD_DEFAULTPATH= -Wl,+b,'$$'ORIGIN/
# Use SHLIB_PATH and LD_LIBRARY_PATH to locate shared libraries
LDFLAGS += -Wl,+s $(LD_DEFAULTPATH)
diff --git a/icuSources/config/mh-irix b/icuSources/config/mh-irix
index dff288c9..59d4aaf6 100644
--- a/icuSources/config/mh-irix
+++ b/icuSources/config/mh-irix
@@ -1,6 +1,6 @@
## -*-makefile-*-
## IRIX-specific setup (for CC)
-## Copyright (c) 1999-2004, International Business Machines Corporation and
+## Copyright (c) 1999-2006, International Business Machines Corporation and
## others. All Rights Reserved.
## Flags for position independent code
@@ -24,8 +24,8 @@ SHLIB.c= $(CC) -shared $(DEFS) $(CPPFLAGS) $(CXXFLAGS) $(LDFLAGS)
SHLIB.cc= $(CXX) -shared $(DEFS) $(CPPFLAGS) $(CXXFLAGS) $(LDFLAGS)
## Additional flags when building libraries with thread safety
-LIBCPPFLAGS = -D_REENTRANT
THREADSCPPFLAGS = -D_REENTRANT -D_PTHREADS
+LIBCPPFLAGS =
## Compiler switch to embed a runtime search path
LD_RPATH=
diff --git a/icuSources/config/mh-linux b/icuSources/config/mh-linux
index 58d76f43..056789eb 100644
--- a/icuSources/config/mh-linux
+++ b/icuSources/config/mh-linux
@@ -1,6 +1,6 @@
## -*-makefile-*-
## Linux-specific setup
-## Copyright (c) 1999-2004, International Business Machines Corporation and
+## Copyright (c) 1999-2006, International Business Machines Corporation and
## others. All Rights Reserved.
## Commands to generate dependency files
@@ -13,13 +13,16 @@ SHAREDLIBCXXFLAGS = -fPIC
SHAREDLIBCPPFLAGS = -DPIC
## Additional flags when building libraries and with threads
-LIBCPPFLAGS = -D_REENTRANT
THREADSCPPFLAGS = -D_REENTRANT
+LIBCPPFLAGS =
## Compiler switch to embed a runtime search path
LD_RPATH=
LD_RPATH_PRE = -Wl,-rpath,
+## These are the library specific LDFLAGS
+LDFLAGSICUDT=-nodefaultlibs -nostdlib
+
## Compiler switch to embed a library name
# The initial tab in the next line is to prevent icu-config from reading it.
LD_SONAME = -Wl,-soname -Wl,$(notdir $(MIDDLE_SO_TARGET))
@@ -68,9 +71,6 @@ STATIC_O = ao
# LDflags that pkgdata will use
BIR_LDFLAGS= -Wl,-Bsymbolic
-# CPPflags for genccode/gencmn
-BIR_CPPFLAGS= -DU_HAVE_BIND_INTERNAL_REFERENCES
-
# Dependencies [i.e. map files] for the final library
BIR_DEPS=
diff --git a/icuSources/config/mh-linux-va b/icuSources/config/mh-linux-va
index 6d954c27..5d0730cb 100644
--- a/icuSources/config/mh-linux-va
+++ b/icuSources/config/mh-linux-va
@@ -1,6 +1,6 @@
## -*-makefile-*-
## Linux-specific setup for Visual Age
-## Copyright (c) 2003-2004, International Business Machines Corporation and
+## Copyright (c) 2003-2006, International Business Machines Corporation and
## others. All Rights Reserved.
## Commands to generate dependency files
@@ -20,14 +20,18 @@ SHAREDLIBCXXFLAGS = -qpic=large
SHAREDLIBCPPFLAGS = -DPIC
## Additional flags when building libraries and with threads
-LIBCPPFLAGS = -D_REENTRANT
THREADSCPPFLAGS = -D_REENTRANT
+LIBCPPFLAGS =
## Compiler switch to embed a runtime search path
LD_RPATH= -I
#LD_RPATH_PRE = -Wl,-rpath,
-#LD_SONAME =
+## Compiler switch to embed a library name
+# The initial tab in the next line is to prevent icu-config from reading it.
+ LD_SONAME = -Wl,-soname -Wl,$(notdir $(MIDDLE_SO_TARGET))
+#SH# # We can't depend on MIDDLE_SO_TARGET being set.
+#SH# LD_SONAME=
## The type of assembly needed when pkgdata is used for generating shared libraries.
GENCCODE_ASSEMBLY=-a gcc
diff --git a/icuSources/config/mh-mingw b/icuSources/config/mh-mingw
index e8e46a87..18937e0e 100644
--- a/icuSources/config/mh-mingw
+++ b/icuSources/config/mh-mingw
@@ -1,6 +1,6 @@
## -*-makefile-*-
## Cygwin/MinGW specific setup
-## Copyright (c) 2001-2004, International Business Machines Corporation and
+## Copyright (c) 2001-2006, International Business Machines Corporation and
## others. All Rights Reserved.
# TODO: Finish the rest of this port. This platform port is incomplete.
@@ -29,8 +29,9 @@ SHAREDLIBCXXFLAGS =
SHAREDLIBCPPFLAGS = -DPIC
## Additional flags when building libraries and with threads
-LIBCPPFLAGS = -D_REENTRANT
-THREADSCPPFLAGS = -D_REENTRANT
+THREADSCFLAGS = -mthreads
+THREADSCXXFLAGS = -mthreads
+LIBCPPFLAGS =
# Commands to link. Link with C++ in case static libraries are used.
LINK.c= $(CXX) $(CXXFLAGS) $(LDFLAGS)
@@ -58,7 +59,7 @@ LIBSICU = $(STATIC_PREFIX)$(ICUPREFIX)
A = lib
## An import library is needed for z/OS and MSVC
-IMPORT_LIB_EXT = .lib
+#IMPORT_LIB_EXT = .lib
LIBPREFIX=
@@ -70,9 +71,9 @@ LIBICU = $(STATIC_PREFIX_WHEN_USED)$(ICUPREFIX)
# The #M# is used to delete lines for icu-config
# Current full path directory.
-CURR_FULL_DIR=$(shell cygpath -dma .)#M#
+CURR_FULL_DIR=$(shell pwd -W)#M#
# Current full path directory for use in source code in a -D compiler option.
-CURR_SRCCODE_FULL_DIR=$(subst \,\\\\,$(shell cygpath -da .))#M#
+CURR_SRCCODE_FULL_DIR=$(subst /,\\\\,$(shell pwd -W))#M#
## Compilation rules
%.$(STATIC_O): $(srcdir)/%.c
@@ -90,12 +91,12 @@ CURR_SRCCODE_FULL_DIR=$(subst \,\\\\,$(shell cygpath -da .))#M#
%.d: $(srcdir)/%.c
@echo "generating dependency information for $<"
@echo -n "$@ " > $@
- @$(SHELL) -ec '$(GEN_DEPS.c) $< >> $@; [ -s $@ ] || rm -f $@'
+ @$(GEN_DEPS.c) $< >> $@ || (rm -f $@ && FALSE)
%.d: $(srcdir)/%.cpp
@echo "generating dependency information for $<"
@echo -n "$@ " > $@
- @$(SHELL) -ec '$(GEN_DEPS.cc) $< >> $@; [ -s $@ ] || rm -f $@'
+ @$(GEN_DEPS.cc) $< >> $@ || (rm -f $@ && FALSE)
## Versioned target for a shared library.
## Since symbolic links don't work the same way on Windows,
@@ -106,8 +107,8 @@ MIDDLE_SO_TARGET=$(FINAL_SO_TARGET)
## Special pkgdata information that is needed
PKGDATA_VERSIONING = -r $(SO_TARGET_VERSION_MAJOR)
-ICUPKGDATA_INSTALL_DIR = $(shell cygpath -dma $(DESTDIR)$(ICUPKGDATA_DIR))#M#
-ICUPKGDATA_INSTALL_LIBDIR = $(shell cygpath -dma $(DESTDIR)$(libdir))#M#
+#ICUPKGDATA_INSTALL_DIR = $(shell cygpath -dma $(DESTDIR)$(ICUPKGDATA_DIR))#M#
+#ICUPKGDATA_INSTALL_LIBDIR = $(shell cygpath -dma $(DESTDIR)$(libdir))#M#
## Versioned libraries rules
#%$(SO_TARGET_VERSION_MAJOR).$(SO): %$(SO_TARGET_VERSION).$(SO)
diff --git a/icuSources/config/mh-os390 b/icuSources/config/mh-os390
index c4a6913f..201e22e7 100644
--- a/icuSources/config/mh-os390
+++ b/icuSources/config/mh-os390
@@ -1,6 +1,6 @@
## -*-makefile-*-
-## 390-specific setup
-## Copyright (c) 1999-2004, International Business Machines Corporation and
+## os/390, z/OS specific setup
+## Copyright (c) 1999-2006, International Business Machines Corporation and
## others. All Rights Reserved.
###################################################################
@@ -30,43 +30,53 @@
# #
###################################################################
+# TODO: Fix this configuration so that icu-config will work!
+# If statements don't work well when icu-config is generated.
ifeq (${IEEE390},)
-IEEE390=1
+IEEE390=1#M#
endif
ifeq (${IEEE390}, 1)
-ICU_IEEE = -Wc,"float(ieee)" -DIEEE_754=1
+ICU_IEEE = -Wc,'float(ieee)'
else
-ICU_IEEE = -DIEEE_754=0
+ICU_IEEE = -DIEEE_754=0#M#
endif
+# For a dynamically called DLL module to share access to the POSIX external
+# variables, with its caller, the DLL module must define these _SHR_* macros.
+SHAREDLIBCPPFLAGS = -D_SHR_TZNAME -D_SHR_TIMEZONE
+
+## Additional flags when building libraries and with threads
+THREADSCPPFLAGS = -D_OPEN_THREADS
+
+# -Wc,expo is used to export all functions
+SHAREDLIBCFLAGS = -Wc,expo
+SHAREDLIBCXXFLAGS = -Wc,expo
+
# TODO: Consider using -Wc,roc,ros for making the data and strings readonly
# -Wc,"ros" seems to work, but not the "roc"
-CFLAGS += -Wc,"langlvl(extended),spill(2000)" -Wc,"ros" $(ICU_BUILD_OPTIONS) $(ICU_IEEE) -Wc,dll,expo
-CXXFLAGS += -Wc,"langlvl(extended),spill(2000)" -Wc,"ros" $(ICU_BUILD_OPTIONS) $(ICU_IEEE) -Wc,dll,expo
-DEFS += -D_OPEN_THREADS -D_XOPEN_SOURCE_EXTENDED -D_MSE_PROTOS -D_SHR_TZNAME -D_SHR_TIMEZONE -DU_LIBICUDATA_NAME=\"$(ICUPREFIX)$(DATA_STUBNAME)$(ICULIBSUFFIX)\"
+# -+ means accept any file extension as a C++ file. By default only .C is accepted.
+CFLAGS += -Wc,'langlvl(extended),spill(2000),ros,dll' $(ICU_IEEE)
+CXXFLAGS += -Wc,'langlvl(extended),spill(2000),ros,dll' $(ICU_IEEE) -+
+DEFS += -D_XOPEN_SOURCE_EXTENDED -D_MSE_PROTOS
ARFLAGS = -cr
-# TODO: Fix this configuration so that icu-config will work!
-# This means we shouldn't be using so many of these special case defines.
ifeq (${OS390_XPLINK}, 1)
+#SH# if [ "x$OS390_XPLINK" = "x1" ]; then
# Note: The following options require the PTF for PQ69418 on z/OS 1.2
# and later.
# These lines must be the last options specified.
-ICU_XPLINK_C = -Wc,"xplink(backchain,storeargs)" -Wc,"GOFF,NOCSECT,RENT,SSCOMM" -Wc,"inline(auto,noreport,500,2500)"
-ICU_XPLINK_CPP = -Wc,"xplink(backchain,storeargs)" -Wc,"GOFF,NOCSECT,NOTEMPINC" -Wc,"inline(auto,noreport,300,2500)"
+ICU_XPLINK_C = -Wc,'xplink(backchain,storeargs)' -Wc,'GOFF,NOCSECT,RENT'
+ICU_XPLINK_CPP = -Wc,'xplink(backchain,storeargs)' -Wc,'GOFF,NOCSECT,NOTEMPINC'
ICU_XPLINK_L = -Wl,dll,xplink -Wl,EDIT=NO
+#SH# fi
endif
## OS390BATCH
ifeq (${OS390BATCH},1)
-DEFS += -DOS390BATCH
+DEFS += -DOS390BATCH#M#
endif
-# Uncomment this line or do "gmake OS390_STUBDATA=1" to enable dual common library support
-#OS390_STUBDATA=1
-
-
## Commands to generate dependency files
GEN_DEPS.c= makedep
GEN_DEPS.cc= makedep
@@ -75,7 +85,7 @@ GEN_DEPS.cc= makedep
# _CXX_STEPS="-1" is a prelink step when compiling C and C++, and
# it's only needed for long function names
COMPILE.c = $(COMPILE_LINK_ENVVAR) $(CXX) $(DEFS) $(CPPFLAGS) $(CFLAGS) $(ICU_XPLINK_C) -c
-COMPILE.cc = _CXX_CXXSUFFIX="cpp" $(COMPILE_LINK_ENVVAR) $(CXX) $(DEFS) $(CPPFLAGS) $(CXXFLAGS) $(ICU_XPLINK_CPP) -c
+COMPILE.cc = $(COMPILE_LINK_ENVVAR) $(CXX) $(DEFS) $(CPPFLAGS) $(CXXFLAGS) $(ICU_XPLINK_CPP) -c
# Commands to link
LINK.c= $(COMPILE_LINK_ENVVAR) $(CC) $(CFLAGS) -Wl,dll $(LDFLAGS) $(ICU_XPLINK_L)
@@ -99,19 +109,17 @@ FINAL_SO_TARGET= $(basename $(SO_TARGET))$(SO_TARGET_VERSION).$(SO)
MIDDLE_SO_TARGET= $(basename $(SO_TARGET))$(SO_TARGET_VERSION_MAJOR).$(SO)
## Versioned import library names.
-IMPORT_LIB = $(basename $(notdir $(SO_TARGET)))$(IMPORT_LIB_EXT)
-MIDDLE_IMPORT_LIB = $(basename $(notdir $(MIDDLE_SO_TARGET)))$(IMPORT_LIB_EXT)
-FINAL_IMPORT_LIB = $(basename $(notdir $(FINAL_SO_TARGET)))$(IMPORT_LIB_EXT)
+IMPORT_LIB = $(basename $(notdir $(SO_TARGET)))$(IMPORT_LIB_EXT)#M#
+MIDDLE_IMPORT_LIB = $(basename $(notdir $(MIDDLE_SO_TARGET)))$(IMPORT_LIB_EXT)#M#
+FINAL_IMPORT_LIB = $(basename $(notdir $(FINAL_SO_TARGET)))$(IMPORT_LIB_EXT)#M#
-## Shared object suffix (switch to dll for shared library build)
-SO = dll
## Non-shared intermediate object suffix
STATIC_O = o
ifeq ($(OS390_STUBDATA),1)
## Suffix of the subset data library for dual common library support
-STUB_SUFFIX=_stub
-DEFS += -DOS390_STUBDATA
+STUB_SUFFIX=_stub#M#
+DEFS += -DOS390_STUBDATA -DU_LIBICUDATA_NAME=\"$(ICUPREFIX)$(DATA_STUBNAME)$(ICULIBSUFFIX)\"#M#
endif
ifeq ($(OS390BATCH),1)
@@ -121,6 +129,7 @@ BATCH_LIBICUDT= "//'${LOADEXP}(IXMI${SO_TARGET_VERSION_MAJOR}D1)'"
else
BATCH_STUB_TARGET= "//'${LOADMOD}(IXMI${SO_TARGET_VERSION_MAJOR}DA)'"
BATCH_LIBICUDT= "//'${LOADEXP}(IXMI${SO_TARGET_VERSION_MAJOR}DA)'"
+PKGDATA_DEFS += -DU_LIBICUDATA_NAME=\"$(ICUPREFIX)$(DATA_STUBNAME)$(ICULIBSUFFIX)\"
endif
BATCH_COMMON_TARGET="//'${LOADMOD}(IXMI${SO_TARGET_VERSION_MAJOR}UC)'"
@@ -146,6 +155,20 @@ LIBICUIO= $(top_builddir)/io/$(LIBICU)io$(ICULIBSUFFIX)$(SO_TARGET_VERSION).x
LIBCTESTFW= $(top_builddir)/tools/ctestfw/$(LIBICU)test$(ICULIBSUFFIX)$(SO_TARGET_VERSION).x
LIBICUTOOLUTIL= $(top_builddir)/tools/toolutil/$(LIBICU)tu$(ICULIBSUFFIX)$(SO_TARGET_VERSION).x
+ifneq (${ICUDATA_CHAR},e)
+#SH# if [ "$ICUDATA_CHAR" != "e" ]; then
+## We're in ASCII mode.
+CFLAGS += -Wc,'ascii'
+CXXFLAGS += -Wc,'ascii'
+SO = so
+else
+#SH# else
+## We're in EBCDIC mode.
+## Shared object suffix
+SO = dll
+endif
+#SH# fi
+
## Special 390 rules
## Build archive from object
diff --git a/icuSources/config/mh-os400 b/icuSources/config/mh-os400
index 8d25e420..b4a8e092 100644
--- a/icuSources/config/mh-os400
+++ b/icuSources/config/mh-os400
@@ -1,12 +1,11 @@
## -*-makefile-*-
## OS400-specific setup (for cross build)
-## Copyright (c) 1999-2004, International Business Machines Corporation and
+## Copyright (c) 1999-2005, International Business Machines Corporation and
## others. All Rights Reserved.
GEN_DEPS.c= $(CC1) -E -M $(DEFS) $(CPPFLAGS)
GEN_DEPS.cc= $(CXX1) -E -M $(DEFS) $(CPPFLAGS)
-DEFS+=-DOS400
THREADSCPPFLAGS = -D_MULTI_THREADED
## Commands to compile
diff --git a/icuSources/config/mh-ptx b/icuSources/config/mh-ptx
deleted file mode 100644
index 0cba7dd6..00000000
--- a/icuSources/config/mh-ptx
+++ /dev/null
@@ -1,65 +0,0 @@
-## -*-makefile-*-
-## PTX-specific setup
-## Copyright (c) 1999-2004, International Business Machines Corporation and
-## others. All Rights Reserved.
-
-## Flags for position independent code
-SHAREDLIBCFLAGS = -KPIC
-SHAREDLIBCXXFLAGS = -KPIC
-SHAREDLIBCPPFLAGS = -DPIC
-
-## Commands to generate dependency files
-GEN_DEPS.c= $(CC) -Kthread -DPTX -c $(DEFS) $(CPPFLAGS)
-GEN_DEPS.cc= $(CXX) -M -DPTX $(DEFS) $(CPPFLAGS)
-
-## Commands to compile
-COMPILE.c= $(CC) -Kthread -DPTX $(DEFS) $(CPPFLAGS) $(CFLAGS) -c
-COMPILE.cc= $(CXX) -Kthread -DPTX $(DEFS) $(CPPFLAGS) $(CXXFLAGS) -c
-
-## Commands to link
-#LINK.c= $(CC) $(DEFS) $(CPPFLAGS) $(CFLAGS) $(LDFLAGS)
-LINK.c= $(CXX) $(DEFS) $(CPPFLAGS) $(CFLAGS) $(LDFLAGS) -lm -lgen
-LINK.cc= $(CXX) $(DEFS) $(CPPFLAGS) $(CXXFLAGS) $(LDFLAGS) -lm -lgen
-
-## Commands to make a shared library
-SHLIB.c= $(CC) $(DEFS) $(CPPFLAGS) $(CFLAGS) $(LDFLAGS) -DPTX -G
-SHLIB.cc= $(CXX) $(DEFS) $(CPPFLAGS) $(CXXFLAGS) $(LDFLAGS) -DPTX -G
-
-## Compiler switch to embed a runtime search path
-LD_RPATH= -R
-LD_RPATH_PRE=
-
-## Versioned target for a shared library.
-FINAL_SO_TARGET = $(SO_TARGET)
-MIDDLE_SO_TARGET =
-
-## Shared object suffix
-SO= so
-## Non-shared intermediate object suffix
-STATIC_O = ao
-
-## Compilation rules
-%.$(STATIC_O): $(srcdir)/%.c
- $(COMPILE.c) $(STATICCPPFLAGS) $(STATICCFLAGS) -o $@ $<
-%.o: $(srcdir)/%.c
- $(COMPILE.c) $(DYNAMICCPPFLAGS) $(DYNAMICCFLAGS) -o $@ $<
-
-%.$(STATIC_O): $(srcdir)/%.cpp
- $(COMPILE.cc) $(STATICCPPFLAGS) $(STATICCXXFLAGS) -o $@ $<
-%.o: $(srcdir)/%.cpp
- $(COMPILE.cc) $(DYNAMICCPPFLAGS) $(DYNAMICCXXFLAGS) -o $@ $<
-
-## Dependency rules
-%.d : $(srcdir)/%.c
- @echo "generating dependency information for $<"
- @$(SHELL) -ec '$(GEN_DEPS.c) $< \
- | sed '\''s/\($*\)\.o[ :]*/\1.o $@ : /g'\'' > $@; \
- [ -s $@ ] || rm -f $@'
-
-%.d : $(srcdir)/%.cpp
- @echo "generating dependency information for $<"
- @$(SHELL) -ec '$(GEN_DEPS.cc) -o $@ $< \
- | sed '\''s/\($*\)\.o[ :]*/\1.o $@ : /g'\'' > $@; \
- [ -s $@ ] || rm -f $@'
-
-## End Ptx-specific setup
diff --git a/icuSources/config/mh-qnx b/icuSources/config/mh-qnx
index 213f9d25..3d2b350d 100644
--- a/icuSources/config/mh-qnx
+++ b/icuSources/config/mh-qnx
@@ -1,6 +1,6 @@
## -*-makefile-*-
## QNX-specific setup
-## Copyright (c) 1999-2004, International Business Machines Corporation and
+## Copyright (c) 1999-2006, International Business Machines Corporation and
## others. All Rights Reserved.
##
## Provided By: Chris McKillop
@@ -85,9 +85,6 @@ FINAL_SO_TARGET = $(MIDDLE_SO_TARGET)
# LDflags that pkgdata will use
BIR_LDFLAGS= -Wl,-Bsymbolic
-# CPPflags for genccode/gencmn
-BIR_CPPFLAGS= -DU_HAVE_BIND_INTERNAL_REFERENCES
-
# Dependencies [i.e. map files] for the final library
BIR_DEPS=
diff --git a/icuSources/config/mh-solaris b/icuSources/config/mh-solaris
index 8f5d3043..25bd8214 100644
--- a/icuSources/config/mh-solaris
+++ b/icuSources/config/mh-solaris
@@ -1,6 +1,6 @@
## -*-makefile-*-
-## Solaris-specific setup using Sun's workshop compilers
-## Copyright (c) 1999-2004, International Business Machines Corporation and
+## Solaris-specific setup using Sun's compilers
+## Copyright (c) 1999-2006, International Business Machines Corporation and
## others. All Rights Reserved.
## Flags for position independent code
@@ -12,9 +12,6 @@ SHAREDLIBCPPFLAGS = -DPIC
GEN_DEPS.c= $(CC) -xM $(DEFS) $(CPPFLAGS)
GEN_DEPS.cc= $(CXX) -xM $(DEFS) $(CPPFLAGS)
-# -libmil means use the intrinsic library functions like strlen
-CPPFLAGS += -libmil
-
# -mt means 'compiles and links a multithreaded program'
THREADSCFLAGS += -mt
THREADSCXXFLAGS += -mt
@@ -32,12 +29,11 @@ SHLIB.cc= $(CXX) $(CXXFLAGS) $(LDFLAGS) -G
LD_RPATH= -R
LD_RPATH_PRE=
+#LIBRARY_PATH_PREFIX=/usr/lib/lwp:
+
## Compiler switch to embed a library name
LD_SONAME = -h $(notdir $(MIDDLE_SO_TARGET))
-## The type of assembly needed when pkgdata is used for generating shared libraries.
-GENCCODE_ASSEMBLY=-a sun
-
## Shared object suffix
SO= so
## Non-shared intermediate object suffix
@@ -74,7 +70,6 @@ STATIC_O = o
#
ifeq (strip $(GENCCODE_ASSEMBLY),)
BIR_LDFLAGS= -Wl,-M,$(NAME).map -Wl,-B,symbolic -Wl,-B,eliminate
-BIR_CPPFLAGS= -DU_HAVE_BIND_INTERNAL_REFERENCES
BIR_DEPS= $(NAME).map
endif
diff --git a/icuSources/config/mh-solaris-gcc b/icuSources/config/mh-solaris-gcc
index 6b822b15..e59e5c58 100644
--- a/icuSources/config/mh-solaris-gcc
+++ b/icuSources/config/mh-solaris-gcc
@@ -1,6 +1,6 @@
## -*-makefile-*-
## Solaris-specific setup using gcc
-## Copyright (c) 1999-2004, International Business Machines Corporation and
+## Copyright (c) 1999-2006, International Business Machines Corporation and
## others. All Rights Reserved.
## Flags for position independent code
@@ -12,6 +12,12 @@ SHAREDLIBCPPFLAGS = -DPIC
GEN_DEPS.c= $(CC) -E -MM $(DEFS) $(CPPFLAGS)
GEN_DEPS.cc= $(CXX) -E -MM $(DEFS) $(CPPFLAGS)
+## These are the library specific LDFLAGS
+LDFLAGSICUDT=-nodefaultlibs -nostdlib
+
+## Additional flags when building libraries and with threads
+THREADSCPPFLAGS = -D_REENTRANT
+
## Compiler switch to embed a runtime search path
LD_RPATH= -R
LD_RPATH_PRE=
@@ -20,7 +26,10 @@ LD_RPATH_PRE=
LD_SONAME = -h $(notdir $(MIDDLE_SO_TARGET))
## The type of assembly needed when pkgdata is used for generating shared libraries.
+## Only use this when not on x86 Solaris.
+ifeq (strip $(GENCCODE_ASSEMBLY),)
GENCCODE_ASSEMBLY=-a sun
+endif
## Shared object suffix
SO= so
diff --git a/icuSources/configure b/icuSources/configure
index 932ed338..058d53a6 100755
--- a/icuSources/configure
+++ b/icuSources/configure
@@ -1,65 +1,325 @@
#! /bin/sh
-
# Guess values for system-dependent variables and create Makefiles.
-# Generated automatically using autoconf version 2.13
-# Copyright (C) 1992, 93, 94, 95, 96 Free Software Foundation, Inc.
+# Generated by GNU Autoconf 2.59.
#
+# Copyright (C) 2003 Free Software Foundation, Inc.
# This configure script is free software; the Free Software Foundation
# gives unlimited permission to copy, distribute and modify it.
+## --------------------- ##
+## M4sh Initialization. ##
+## --------------------- ##
+
+# Be Bourne compatible
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+ emulate sh
+ NULLCMD=:
+ # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
+ # is contrary to our usage. Disable this feature.
+ alias -g '${1+"$@"}'='"$@"'
+elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then
+ set -o posix
+fi
+DUALCASE=1; export DUALCASE # for MKS sh
+
+# Support unset when possible.
+if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
+ as_unset=unset
+else
+ as_unset=false
+fi
+
+
+# Work around bugs in pre-3.0 UWIN ksh.
+$as_unset ENV MAIL MAILPATH
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+for as_var in \
+ LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \
+ LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \
+ LC_TELEPHONE LC_TIME
+do
+ if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then
+ eval $as_var=C; export $as_var
+ else
+ $as_unset $as_var
+ fi
+done
+
+# Required to use basename.
+if expr a : '\(a\)' >/dev/null 2>&1; then
+ as_expr=expr
+else
+ as_expr=false
+fi
+
+if (basename /) >/dev/null 2>&1 && test "X`basename / 2>&1`" = "X/"; then
+ as_basename=basename
+else
+ as_basename=false
+fi
+
+
+# Name of the executable.
+as_me=`$as_basename "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+ X"$0" : 'X\(//\)$' \| \
+ X"$0" : 'X\(/\)$' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X/"$0" |
+ sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; }
+ /^X\/\(\/\/\)$/{ s//\1/; q; }
+ /^X\/\(\/\).*/{ s//\1/; q; }
+ s/.*/./; q'`
+
+
+# PATH needs CR, and LINENO needs CR and PATH.
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+ echo "#! /bin/sh" >conf$$.sh
+ echo "exit 0" >>conf$$.sh
+ chmod +x conf$$.sh
+ if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then
+ PATH_SEPARATOR=';'
+ else
+ PATH_SEPARATOR=:
+ fi
+ rm -f conf$$.sh
+fi
+
+
+ as_lineno_1=$LINENO
+ as_lineno_2=$LINENO
+ as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`
+ test "x$as_lineno_1" != "x$as_lineno_2" &&
+ test "x$as_lineno_3" = "x$as_lineno_2" || {
+ # Find who we are. Look in the path if we contain no path at all
+ # relative or not.
+ case $0 in
+ *[\\/]* ) as_myself=$0 ;;
+ *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+done
+
+ ;;
+ esac
+ # We did not find ourselves, most probably we were run as `sh COMMAND'
+ # in which case we are not to be found in the path.
+ if test "x$as_myself" = x; then
+ as_myself=$0
+ fi
+ if test ! -f "$as_myself"; then
+ { echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2
+ { (exit 1); exit 1; }; }
+ fi
+ case $CONFIG_SHELL in
+ '')
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for as_base in sh bash ksh sh5; do
+ case $as_dir in
+ /*)
+ if ("$as_dir/$as_base" -c '
+ as_lineno_1=$LINENO
+ as_lineno_2=$LINENO
+ as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`
+ test "x$as_lineno_1" != "x$as_lineno_2" &&
+ test "x$as_lineno_3" = "x$as_lineno_2" ') 2>/dev/null; then
+ $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; }
+ $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; }
+ CONFIG_SHELL=$as_dir/$as_base
+ export CONFIG_SHELL
+ exec "$CONFIG_SHELL" "$0" ${1+"$@"}
+ fi;;
+ esac
+ done
+done
+;;
+ esac
+
+ # Create $as_me.lineno as a copy of $as_myself, but with $LINENO
+ # uniformly replaced by the line number. The first 'sed' inserts a
+ # line-number line before each line; the second 'sed' does the real
+ # work. The second script uses 'N' to pair each line-number line
+ # with the numbered line, and appends trailing '-' during
+ # substitution so that $LINENO is not a special case at line end.
+ # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the
+ # second 'sed' script. Blame Lee E. McMahon for sed's syntax. :-)
+ sed '=' <$as_myself |
+ sed '
+ N
+ s,$,-,
+ : loop
+ s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3,
+ t loop
+ s,-$,,
+ s,^['$as_cr_digits']*\n,,
+ ' >$as_me.lineno &&
+ chmod +x $as_me.lineno ||
+ { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2
+ { (exit 1); exit 1; }; }
+
+ # Don't try to exec as it changes $[0], causing all sort of problems
+ # (the dirname of $[0] is not the place where we might find the
+ # original and so on. Autoconf is especially sensible to this).
+ . ./$as_me.lineno
+ # Exit status is that of the last command.
+ exit
+}
+
+
+case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in
+ *c*,-n*) ECHO_N= ECHO_C='
+' ECHO_T=' ' ;;
+ *c*,* ) ECHO_N=-n ECHO_C= ECHO_T= ;;
+ *) ECHO_N= ECHO_C='\c' ECHO_T= ;;
+esac
+
+if expr a : '\(a\)' >/dev/null 2>&1; then
+ as_expr=expr
+else
+ as_expr=false
+fi
+
+rm -f conf$$ conf$$.exe conf$$.file
+echo >conf$$.file
+if ln -s conf$$.file conf$$ 2>/dev/null; then
+ # We could just check for DJGPP; but this test a) works b) is more generic
+ # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04).
+ if test -f conf$$.exe; then
+ # Don't use ln at all; we don't have any links
+ as_ln_s='cp -p'
+ else
+ as_ln_s='ln -s'
+ fi
+elif ln conf$$.file conf$$ 2>/dev/null; then
+ as_ln_s=ln
+else
+ as_ln_s='cp -p'
+fi
+rm -f conf$$ conf$$.exe conf$$.file
+
+if mkdir -p . 2>/dev/null; then
+ as_mkdir_p=:
+else
+ test -d ./-p && rmdir ./-p
+ as_mkdir_p=false
+fi
+
+as_executable_p="test -f"
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+
+
+# IFS
+# We need space, tab and new line, in precisely that order.
+as_nl='
+'
+IFS=" $as_nl"
+
+# CDPATH.
+$as_unset CDPATH
+
+
+# Name of the host.
+# hostname on some systems (SVR3.2, Linux) returns a bogus exit status,
+# so uname gets run too.
+ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q`
-# Defaults:
-ac_help=
+exec 6>&1
+
+#
+# Initializations.
+#
ac_default_prefix=/usr/local
-# Any additions from configure.in:
-ac_help="$ac_help
- --enable-strict compile with strict compiler options [default=no]"
-ac_help="$ac_help
- --enable-64bit-libs build 64-bit libraries [default=yes]"
-ac_help="$ac_help
- --enable-shared build shared libraries [default=yes]"
-ac_help="$ac_help
- --enable-static build static libraries [default=no]"
-ac_help="$ac_help
- --enable-debug build debug libraries [default=no]"
-ac_help="$ac_help
- --enable-release build release libraries [default=yes]"
-ac_help="$ac_help
- --enable-renaming add a version suffix to symbols [default=yes]"
-ac_help="$ac_help
- --enable-tracing enable function and data tracing [default=yes]"
-ac_help="$ac_help
- --enable-rpath use rpath when linking [default is only if necessary]"
-ac_help="$ac_help
- --enable-threads build ICU with thread safety [default=yes]"
-ac_help="$ac_help
- --with-iostream=version specify the version of iostream to use (none, old, std, auto) [default=auto]"
-ac_help="$ac_help
- --enable-extras build ICU extras [default=yes]"
-ac_help="$ac_help
- --enable-icuio build ICU's icuio library [default=yes]"
-ac_help="$ac_help
- --enable-layout build ICU's layout library [default=yes]"
-ac_help="$ac_help
- --with-data-packaging=type specify how to package ICU data (files, archive, library, auto) [default=auto]"
-ac_help="$ac_help
-"
-ac_help="$ac_help
- --with-library-suffix=suffix tag a suffix to the library names [default=]"
-ac_help="$ac_help
- --enable-tests build ICU tests [default=yes]"
-ac_help="$ac_help
- --enable-samples build ICU samples [default=yes]
-Additionally, the variable FORCE_LIBS may be set before calling configure. If set, it will REPLACE any automatic list of libraries."
+ac_config_libobj_dir=.
+cross_compiling=no
+subdirs=
+MFLAGS=
+MAKEFLAGS=
+SHELL=${CONFIG_SHELL-/bin/sh}
+
+# Maximum number of lines to put in a shell here document.
+# This variable seems obsolete. It should probably be removed, and
+# only ac_max_sed_lines should be used.
+: ${ac_max_here_lines=38}
+
+# Identity of this package.
+PACKAGE_NAME=
+PACKAGE_TARNAME=
+PACKAGE_VERSION=
+PACKAGE_STRING=
+PACKAGE_BUGREPORT=
+
+ac_unique_file="common/unicode/utypes.h"
+# Factoring default headers for most tests.
+ac_includes_default="\
+#include
+#if HAVE_SYS_TYPES_H
+# include
+#endif
+#if HAVE_SYS_STAT_H
+# include
+#endif
+#if STDC_HEADERS
+# include
+# include
+#else
+# if HAVE_STDLIB_H
+# include
+# endif
+#endif
+#if HAVE_STRING_H
+# if !STDC_HEADERS && HAVE_MEMORY_H
+# include
+# endif
+# include
+#endif
+#if HAVE_STRINGS_H
+# include
+#endif
+#if HAVE_INTTYPES_H
+# include
+#else
+# if HAVE_STDINT_H
+# include
+# endif
+#endif
+#if HAVE_UNISTD_H
+# include
+#endif"
+
+ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS PACKAGE VERSION LIB_VERSION LIB_VERSION_MAJOR UNICODE_VERSION build build_cpu build_vendor build_os host host_cpu host_vendor host_os CPPFLAGS CC CFLAGS LDFLAGS ac_ct_CC EXEEXT OBJEXT CXX CXXFLAGS ac_ct_CXX INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA U_MAKE DOXYGEN ARFLAGS COMPILE_LINK_ENVVAR LIB_M ENABLE_SHARED ENABLE_STATIC ENABLE_DEBUG ENABLE_RELEASE U_DEFAULT_SHOW_DRAFT RANLIB ac_ct_RANLIB AR U_DISABLE_RENAMING U_ENABLE_TRACING ENABLE_RPATH U_INLINE THREADS_TRUE ICU_USE_THREADS HAVE_MMAP GENCCODE_ASSEMBLY CPP EGREP U_HAVE_INTTYPES_H U_IOSTREAM_SOURCE U_IS_BIG_ENDIAN U_HAVE_NL_LANGINFO U_HAVE_NL_LANGINFO_CODESET U_NL_LANGINFO_CODESET U_HAVE_NAMESPACE U_OVERRIDE_CXX_ALLOCATION U_HAVE_PLACEMENT_NEW U_HAVE_POPEN U_HAVE_TZSET U_TZSET U_HAVE_TZNAME U_TZNAME U_HAVE_TIMEZONE U_TIMEZONE HAVE_INT8_T HAVE_UINT8_T HAVE_INT16_T HAVE_UINT16_T HAVE_INT32_T HAVE_UINT32_T HAVE_INT64_T HAVE_UINT64_T U_HAVE_WCHAR_H U_HAVE_WCSCPY U_SIZEOF_WCHAR_T EXTRAS_TRUE ICUIO_TRUE LAYOUT_TRUE thedatadir pkgicudatadir thepkgicudatadir DATA_PACKAGING_MODE ICULIBSUFFIX U_HAVE_LIB_SUFFIX ICULIBSUFFIXCNAME TESTS_TRUE SAMPLES_TRUE ICUDATA_CHAR platform platform_make_fragment_name platform_make_fragment ld_rpath_suf AIX_SHLIB LIBOBJS LTLIBOBJS'
+ac_subst_files=''
# Initialize some variables set by options.
+ac_init_help=
+ac_init_version=false
# The variables have the same names as the options, with
# dashes changed to underlines.
-build=NONE
-cache_file=./config.cache
+cache_file=/dev/null
exec_prefix=NONE
-host=NONE
no_create=
-nonopt=NONE
no_recursion=
prefix=NONE
program_prefix=NONE
@@ -68,10 +328,15 @@ program_transform_name=s,x,x,
silent=
site=
srcdir=
-target=NONE
verbose=
x_includes=NONE
x_libraries=NONE
+
+# Installation directory options.
+# These are left unexpanded so users can "make install exec_prefix=/foo"
+# and all the variables that are supposed to be based on exec_prefix
+# by default will actually change.
+# Use braces instead of parens because sh, perl, etc. also accept them.
bindir='${exec_prefix}/bin'
sbindir='${exec_prefix}/sbin'
libexecdir='${exec_prefix}/libexec'
@@ -85,17 +350,9 @@ oldincludedir='/usr/include'
infodir='${prefix}/info'
mandir='${prefix}/man'
-# Initialize some other variables.
-subdirs=
-MFLAGS= MAKEFLAGS=
-SHELL=${CONFIG_SHELL-/bin/sh}
-# Maximum number of lines to put in a shell here document.
-ac_max_here_lines=12
-
ac_prev=
for ac_option
do
-
# If the previous option needs an argument, assign it.
if test -n "$ac_prev"; then
eval "$ac_prev=\$ac_option"
@@ -103,59 +360,59 @@ do
continue
fi
- case "$ac_option" in
- -*=*) ac_optarg=`echo "$ac_option" | sed 's/[-_a-zA-Z0-9]*=//'` ;;
- *) ac_optarg= ;;
- esac
+ ac_optarg=`expr "x$ac_option" : 'x[^=]*=\(.*\)'`
# Accept the important Cygnus configure options, so we can diagnose typos.
- case "$ac_option" in
+ case $ac_option in
-bindir | --bindir | --bindi | --bind | --bin | --bi)
ac_prev=bindir ;;
-bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)
- bindir="$ac_optarg" ;;
+ bindir=$ac_optarg ;;
-build | --build | --buil | --bui | --bu)
- ac_prev=build ;;
+ ac_prev=build_alias ;;
-build=* | --build=* | --buil=* | --bui=* | --bu=*)
- build="$ac_optarg" ;;
+ build_alias=$ac_optarg ;;
-cache-file | --cache-file | --cache-fil | --cache-fi \
| --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
ac_prev=cache_file ;;
-cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
| --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)
- cache_file="$ac_optarg" ;;
+ cache_file=$ac_optarg ;;
+
+ --config-cache | -C)
+ cache_file=config.cache ;;
-datadir | --datadir | --datadi | --datad | --data | --dat | --da)
ac_prev=datadir ;;
-datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \
| --da=*)
- datadir="$ac_optarg" ;;
+ datadir=$ac_optarg ;;
-disable-* | --disable-*)
- ac_feature=`echo $ac_option|sed -e 's/-*disable-//'`
+ ac_feature=`expr "x$ac_option" : 'x-*disable-\(.*\)'`
# Reject names that are not valid shell variable names.
- if test -n "`echo $ac_feature| sed 's/[-a-zA-Z0-9_]//g'`"; then
- { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; }
- fi
- ac_feature=`echo $ac_feature| sed 's/-/_/g'`
- eval "enable_${ac_feature}=no" ;;
+ expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null &&
+ { echo "$as_me: error: invalid feature name: $ac_feature" >&2
+ { (exit 1); exit 1; }; }
+ ac_feature=`echo $ac_feature | sed 's/-/_/g'`
+ eval "enable_$ac_feature=no" ;;
-enable-* | --enable-*)
- ac_feature=`echo $ac_option|sed -e 's/-*enable-//' -e 's/=.*//'`
+ ac_feature=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'`
# Reject names that are not valid shell variable names.
- if test -n "`echo $ac_feature| sed 's/[-_a-zA-Z0-9]//g'`"; then
- { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; }
- fi
- ac_feature=`echo $ac_feature| sed 's/-/_/g'`
- case "$ac_option" in
- *=*) ;;
+ expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null &&
+ { echo "$as_me: error: invalid feature name: $ac_feature" >&2
+ { (exit 1); exit 1; }; }
+ ac_feature=`echo $ac_feature | sed 's/-/_/g'`
+ case $ac_option in
+ *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;;
*) ac_optarg=yes ;;
esac
- eval "enable_${ac_feature}='$ac_optarg'" ;;
+ eval "enable_$ac_feature='$ac_optarg'" ;;
-exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
| --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
@@ -164,95 +421,47 @@ do
-exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \
| --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \
| --exec=* | --exe=* | --ex=*)
- exec_prefix="$ac_optarg" ;;
+ exec_prefix=$ac_optarg ;;
-gas | --gas | --ga | --g)
# Obsolete; use --with-gas.
with_gas=yes ;;
- -help | --help | --hel | --he)
- # Omit some internal or obsolete options to make the list less imposing.
- # This message is too long to be a string in the A/UX 3.1 sh.
- cat << EOF
-Usage: configure [options] [host]
-Options: [defaults in brackets after descriptions]
-Configuration:
- --cache-file=FILE cache test results in FILE
- --help print this message
- --no-create do not create output files
- --quiet, --silent do not print \`checking...' messages
- --version print the version of autoconf that created configure
-Directory and file names:
- --prefix=PREFIX install architecture-independent files in PREFIX
- [$ac_default_prefix]
- --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX
- [same as prefix]
- --bindir=DIR user executables in DIR [EPREFIX/bin]
- --sbindir=DIR system admin executables in DIR [EPREFIX/sbin]
- --libexecdir=DIR program executables in DIR [EPREFIX/libexec]
- --datadir=DIR read-only architecture-independent data in DIR
- [PREFIX/share]
- --sysconfdir=DIR read-only single-machine data in DIR [PREFIX/etc]
- --sharedstatedir=DIR modifiable architecture-independent data in DIR
- [PREFIX/com]
- --localstatedir=DIR modifiable single-machine data in DIR [PREFIX/var]
- --libdir=DIR object code libraries in DIR [EPREFIX/lib]
- --includedir=DIR C header files in DIR [PREFIX/include]
- --oldincludedir=DIR C header files for non-gcc in DIR [/usr/include]
- --infodir=DIR info documentation in DIR [PREFIX/info]
- --mandir=DIR man documentation in DIR [PREFIX/man]
- --srcdir=DIR find the sources in DIR [configure dir or ..]
- --program-prefix=PREFIX prepend PREFIX to installed program names
- --program-suffix=SUFFIX append SUFFIX to installed program names
- --program-transform-name=PROGRAM
- run sed PROGRAM on installed program names
-EOF
- cat << EOF
-Host type:
- --build=BUILD configure for building on BUILD [BUILD=HOST]
- --host=HOST configure for HOST [guessed]
- --target=TARGET configure for TARGET [TARGET=HOST]
-Features and packages:
- --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no)
- --enable-FEATURE[=ARG] include FEATURE [ARG=yes]
- --with-PACKAGE[=ARG] use PACKAGE [ARG=yes]
- --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no)
- --x-includes=DIR X include files are in DIR
- --x-libraries=DIR X library files are in DIR
-EOF
- if test -n "$ac_help"; then
- echo "--enable and --with options recognized:$ac_help"
- fi
- exit 0 ;;
+ -help | --help | --hel | --he | -h)
+ ac_init_help=long ;;
+ -help=r* | --help=r* | --hel=r* | --he=r* | -hr*)
+ ac_init_help=recursive ;;
+ -help=s* | --help=s* | --hel=s* | --he=s* | -hs*)
+ ac_init_help=short ;;
-host | --host | --hos | --ho)
- ac_prev=host ;;
+ ac_prev=host_alias ;;
-host=* | --host=* | --hos=* | --ho=*)
- host="$ac_optarg" ;;
+ host_alias=$ac_optarg ;;
-includedir | --includedir | --includedi | --included | --include \
| --includ | --inclu | --incl | --inc)
ac_prev=includedir ;;
-includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \
| --includ=* | --inclu=* | --incl=* | --inc=*)
- includedir="$ac_optarg" ;;
+ includedir=$ac_optarg ;;
-infodir | --infodir | --infodi | --infod | --info | --inf)
ac_prev=infodir ;;
-infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)
- infodir="$ac_optarg" ;;
+ infodir=$ac_optarg ;;
-libdir | --libdir | --libdi | --libd)
ac_prev=libdir ;;
-libdir=* | --libdir=* | --libdi=* | --libd=*)
- libdir="$ac_optarg" ;;
+ libdir=$ac_optarg ;;
-libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \
| --libexe | --libex | --libe)
ac_prev=libexecdir ;;
-libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \
| --libexe=* | --libex=* | --libe=*)
- libexecdir="$ac_optarg" ;;
+ libexecdir=$ac_optarg ;;
-localstatedir | --localstatedir | --localstatedi | --localstated \
| --localstate | --localstat | --localsta | --localst \
@@ -261,19 +470,19 @@ EOF
-localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
| --localstate=* | --localstat=* | --localsta=* | --localst=* \
| --locals=* | --local=* | --loca=* | --loc=* | --lo=*)
- localstatedir="$ac_optarg" ;;
+ localstatedir=$ac_optarg ;;
-mandir | --mandir | --mandi | --mand | --man | --ma | --m)
ac_prev=mandir ;;
-mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)
- mandir="$ac_optarg" ;;
+ mandir=$ac_optarg ;;
-nfp | --nfp | --nf)
# Obsolete; use --without-fp.
with_fp=no ;;
-no-create | --no-create | --no-creat | --no-crea | --no-cre \
- | --no-cr | --no-c)
+ | --no-cr | --no-c | -n)
no_create=yes ;;
-no-recursion | --no-recursion | --no-recursio | --no-recursi \
@@ -287,26 +496,26 @@ EOF
-oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \
| --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \
| --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)
- oldincludedir="$ac_optarg" ;;
+ oldincludedir=$ac_optarg ;;
-prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
ac_prev=prefix ;;
-prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
- prefix="$ac_optarg" ;;
+ prefix=$ac_optarg ;;
-program-prefix | --program-prefix | --program-prefi | --program-pref \
| --program-pre | --program-pr | --program-p)
ac_prev=program_prefix ;;
-program-prefix=* | --program-prefix=* | --program-prefi=* \
| --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)
- program_prefix="$ac_optarg" ;;
+ program_prefix=$ac_optarg ;;
-program-suffix | --program-suffix | --program-suffi | --program-suff \
| --program-suf | --program-su | --program-s)
ac_prev=program_suffix ;;
-program-suffix=* | --program-suffix=* | --program-suffi=* \
| --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)
- program_suffix="$ac_optarg" ;;
+ program_suffix=$ac_optarg ;;
-program-transform-name | --program-transform-name \
| --program-transform-nam | --program-transform-na \
@@ -323,7 +532,7 @@ EOF
| --program-transfo=* | --program-transf=* \
| --program-trans=* | --program-tran=* \
| --progr-tra=* | --program-tr=* | --program-t=*)
- program_transform_name="$ac_optarg" ;;
+ program_transform_name=$ac_optarg ;;
-q | -quiet | --quiet | --quie | --qui | --qu | --q \
| -silent | --silent | --silen | --sile | --sil)
@@ -333,7 +542,7 @@ EOF
ac_prev=sbindir ;;
-sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
| --sbi=* | --sb=*)
- sbindir="$ac_optarg" ;;
+ sbindir=$ac_optarg ;;
-sharedstatedir | --sharedstatedir | --sharedstatedi \
| --sharedstated | --sharedstate | --sharedstat | --sharedsta \
@@ -344,58 +553,57 @@ EOF
| --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \
| --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \
| --sha=* | --sh=*)
- sharedstatedir="$ac_optarg" ;;
+ sharedstatedir=$ac_optarg ;;
-site | --site | --sit)
ac_prev=site ;;
-site=* | --site=* | --sit=*)
- site="$ac_optarg" ;;
+ site=$ac_optarg ;;
-srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
ac_prev=srcdir ;;
-srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
- srcdir="$ac_optarg" ;;
+ srcdir=$ac_optarg ;;
-sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \
| --syscon | --sysco | --sysc | --sys | --sy)
ac_prev=sysconfdir ;;
-sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \
| --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)
- sysconfdir="$ac_optarg" ;;
+ sysconfdir=$ac_optarg ;;
-target | --target | --targe | --targ | --tar | --ta | --t)
- ac_prev=target ;;
+ ac_prev=target_alias ;;
-target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
- target="$ac_optarg" ;;
+ target_alias=$ac_optarg ;;
-v | -verbose | --verbose | --verbos | --verbo | --verb)
verbose=yes ;;
- -version | --version | --versio | --versi | --vers)
- echo "configure generated by autoconf version 2.13"
- exit 0 ;;
+ -version | --version | --versio | --versi | --vers | -V)
+ ac_init_version=: ;;
-with-* | --with-*)
- ac_package=`echo $ac_option|sed -e 's/-*with-//' -e 's/=.*//'`
+ ac_package=`expr "x$ac_option" : 'x-*with-\([^=]*\)'`
# Reject names that are not valid shell variable names.
- if test -n "`echo $ac_package| sed 's/[-_a-zA-Z0-9]//g'`"; then
- { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; }
- fi
+ expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null &&
+ { echo "$as_me: error: invalid package name: $ac_package" >&2
+ { (exit 1); exit 1; }; }
ac_package=`echo $ac_package| sed 's/-/_/g'`
- case "$ac_option" in
- *=*) ;;
+ case $ac_option in
+ *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;;
*) ac_optarg=yes ;;
esac
- eval "with_${ac_package}='$ac_optarg'" ;;
+ eval "with_$ac_package='$ac_optarg'" ;;
-without-* | --without-*)
- ac_package=`echo $ac_option|sed -e 's/-*without-//'`
+ ac_package=`expr "x$ac_option" : 'x-*without-\(.*\)'`
# Reject names that are not valid shell variable names.
- if test -n "`echo $ac_package| sed 's/[-a-zA-Z0-9_]//g'`"; then
- { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; }
- fi
- ac_package=`echo $ac_package| sed 's/-/_/g'`
- eval "with_${ac_package}=no" ;;
+ expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null &&
+ { echo "$as_me: error: invalid package name: $ac_package" >&2
+ { (exit 1); exit 1; }; }
+ ac_package=`echo $ac_package | sed 's/-/_/g'`
+ eval "with_$ac_package=no" ;;
--x)
# Obsolete; use --with-x.
@@ -406,99 +614,110 @@ EOF
ac_prev=x_includes ;;
-x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \
| --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)
- x_includes="$ac_optarg" ;;
+ x_includes=$ac_optarg ;;
-x-libraries | --x-libraries | --x-librarie | --x-librari \
| --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)
ac_prev=x_libraries ;;
-x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \
| --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
- x_libraries="$ac_optarg" ;;
+ x_libraries=$ac_optarg ;;
- -*) { echo "configure: error: $ac_option: invalid option; use --help to show usage" 1>&2; exit 1; }
+ -*) { echo "$as_me: error: unrecognized option: $ac_option
+Try \`$0 --help' for more information." >&2
+ { (exit 1); exit 1; }; }
;;
+ *=*)
+ ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_envvar" : ".*[^_$as_cr_alnum]" >/dev/null &&
+ { echo "$as_me: error: invalid variable name: $ac_envvar" >&2
+ { (exit 1); exit 1; }; }
+ ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`
+ eval "$ac_envvar='$ac_optarg'"
+ export $ac_envvar ;;
+
*)
- if test -n "`echo $ac_option| sed 's/[-a-z0-9.]//g'`"; then
- echo "configure: warning: $ac_option: invalid host type" 1>&2
- fi
- if test "x$nonopt" != xNONE; then
- { echo "configure: error: can only configure for one host and one target at a time" 1>&2; exit 1; }
- fi
- nonopt="$ac_option"
+ # FIXME: should be removed in autoconf 3.0.
+ echo "$as_me: WARNING: you should use --build, --host, --target" >&2
+ expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null &&
+ echo "$as_me: WARNING: invalid host type: $ac_option" >&2
+ : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}
;;
esac
done
if test -n "$ac_prev"; then
- { echo "configure: error: missing argument to --`echo $ac_prev | sed 's/_/-/g'`" 1>&2; exit 1; }
-fi
-
-trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15
-
-# File descriptor usage:
-# 0 standard input
-# 1 file creation
-# 2 errors and warnings
-# 3 some systems may open it to /dev/tty
-# 4 used on the Kubota Titan
-# 6 checking for... messages and results
-# 5 compiler messages saved in config.log
-if test "$silent" = yes; then
- exec 6>/dev/null
-else
- exec 6>&1
+ ac_option=--`echo $ac_prev | sed 's/_/-/g'`
+ { echo "$as_me: error: missing argument to $ac_option" >&2
+ { (exit 1); exit 1; }; }
fi
-exec 5>./config.log
-echo "\
-This file contains any messages produced by compilers while
-running configure, to aid debugging if configure makes a mistake.
-" 1>&5
+# Be sure to have absolute paths.
+for ac_var in exec_prefix prefix
+do
+ eval ac_val=$`echo $ac_var`
+ case $ac_val in
+ [\\/$]* | ?:[\\/]* | NONE | '' ) ;;
+ *) { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2
+ { (exit 1); exit 1; }; };;
+ esac
+done
-# Strip out --no-create and --no-recursion so they do not pile up.
-# Also quote any args containing shell metacharacters.
-ac_configure_args=
-for ac_arg
+# Be sure to have absolute paths.
+for ac_var in bindir sbindir libexecdir datadir sysconfdir sharedstatedir \
+ localstatedir libdir includedir oldincludedir infodir mandir
do
- case "$ac_arg" in
- -no-create | --no-create | --no-creat | --no-crea | --no-cre \
- | --no-cr | --no-c) ;;
- -no-recursion | --no-recursion | --no-recursio | --no-recursi \
- | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) ;;
- *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?]*)
- ac_configure_args="$ac_configure_args '$ac_arg'" ;;
- *) ac_configure_args="$ac_configure_args $ac_arg" ;;
+ eval ac_val=$`echo $ac_var`
+ case $ac_val in
+ [\\/$]* | ?:[\\/]* ) ;;
+ *) { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2
+ { (exit 1); exit 1; }; };;
esac
done
-# NLS nuisances.
-# Only set these to C if already set. These must not be set unconditionally
-# because not all systems understand e.g. LANG=C (notably SCO).
-# Fixing LC_MESSAGES prevents Solaris sh from translating var values in `set'!
-# Non-C LC_CTYPE values break the ctype check.
-if test "${LANG+set}" = set; then LANG=C; export LANG; fi
-if test "${LC_ALL+set}" = set; then LC_ALL=C; export LC_ALL; fi
-if test "${LC_MESSAGES+set}" = set; then LC_MESSAGES=C; export LC_MESSAGES; fi
-if test "${LC_CTYPE+set}" = set; then LC_CTYPE=C; export LC_CTYPE; fi
+# There might be people who depend on the old broken behavior: `$host'
+# used to hold the argument of --host etc.
+# FIXME: To remove some day.
+build=$build_alias
+host=$host_alias
+target=$target_alias
+
+# FIXME: To remove some day.
+if test "x$host_alias" != x; then
+ if test "x$build_alias" = x; then
+ cross_compiling=maybe
+ echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host.
+ If a cross compiler is detected then cross compile mode will be used." >&2
+ elif test "x$build_alias" != "x$host_alias"; then
+ cross_compiling=yes
+ fi
+fi
-# confdefs.h avoids OS command line length limits that DEFS can exceed.
-rm -rf conftest* confdefs.h
-# AIX cpp loses on an empty file, so make sure it contains at least a newline.
-echo > confdefs.h
+ac_tool_prefix=
+test -n "$host_alias" && ac_tool_prefix=$host_alias-
+
+test "$silent" = yes && exec 6>/dev/null
-# A filename unique to this package, relative to the directory that
-# configure is in, which we can look for to find out if srcdir is correct.
-ac_unique_file=common/unicode/utypes.h
# Find the source files, if location was not specified.
if test -z "$srcdir"; then
ac_srcdir_defaulted=yes
# Try the directory containing this script, then its parent.
- ac_prog=$0
- ac_confdir=`echo $ac_prog|sed 's%/[^/][^/]*$%%'`
- test "x$ac_confdir" = "x$ac_prog" && ac_confdir=.
+ ac_confdir=`(dirname "$0") 2>/dev/null ||
+$as_expr X"$0" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$0" : 'X\(//\)[^/]' \| \
+ X"$0" : 'X\(//\)$' \| \
+ X"$0" : 'X\(/\)' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X"$0" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+ /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+ /^X\(\/\/\)$/{ s//\1/; q; }
+ /^X\(\/\).*/{ s//\1/; q; }
+ s/.*/./; q'`
srcdir=$ac_confdir
if test ! -r $srcdir/$ac_unique_file; then
srcdir=..
@@ -508,13 +727,496 @@ else
fi
if test ! -r $srcdir/$ac_unique_file; then
if test "$ac_srcdir_defaulted" = yes; then
- { echo "configure: error: can not find sources in $ac_confdir or .." 1>&2; exit 1; }
+ { echo "$as_me: error: cannot find sources ($ac_unique_file) in $ac_confdir or .." >&2
+ { (exit 1); exit 1; }; }
else
- { echo "configure: error: can not find sources in $srcdir" 1>&2; exit 1; }
+ { echo "$as_me: error: cannot find sources ($ac_unique_file) in $srcdir" >&2
+ { (exit 1); exit 1; }; }
fi
fi
-srcdir=`echo "${srcdir}" | sed 's%\([^/]\)/*$%\1%'`
+(cd $srcdir && test -r ./$ac_unique_file) 2>/dev/null ||
+ { echo "$as_me: error: sources are in $srcdir, but \`cd $srcdir' does not work" >&2
+ { (exit 1); exit 1; }; }
+srcdir=`echo "$srcdir" | sed 's%\([^\\/]\)[\\/]*$%\1%'`
+ac_env_build_alias_set=${build_alias+set}
+ac_env_build_alias_value=$build_alias
+ac_cv_env_build_alias_set=${build_alias+set}
+ac_cv_env_build_alias_value=$build_alias
+ac_env_host_alias_set=${host_alias+set}
+ac_env_host_alias_value=$host_alias
+ac_cv_env_host_alias_set=${host_alias+set}
+ac_cv_env_host_alias_value=$host_alias
+ac_env_target_alias_set=${target_alias+set}
+ac_env_target_alias_value=$target_alias
+ac_cv_env_target_alias_set=${target_alias+set}
+ac_cv_env_target_alias_value=$target_alias
+ac_env_CC_set=${CC+set}
+ac_env_CC_value=$CC
+ac_cv_env_CC_set=${CC+set}
+ac_cv_env_CC_value=$CC
+ac_env_CFLAGS_set=${CFLAGS+set}
+ac_env_CFLAGS_value=$CFLAGS
+ac_cv_env_CFLAGS_set=${CFLAGS+set}
+ac_cv_env_CFLAGS_value=$CFLAGS
+ac_env_LDFLAGS_set=${LDFLAGS+set}
+ac_env_LDFLAGS_value=$LDFLAGS
+ac_cv_env_LDFLAGS_set=${LDFLAGS+set}
+ac_cv_env_LDFLAGS_value=$LDFLAGS
+ac_env_CPPFLAGS_set=${CPPFLAGS+set}
+ac_env_CPPFLAGS_value=$CPPFLAGS
+ac_cv_env_CPPFLAGS_set=${CPPFLAGS+set}
+ac_cv_env_CPPFLAGS_value=$CPPFLAGS
+ac_env_CXX_set=${CXX+set}
+ac_env_CXX_value=$CXX
+ac_cv_env_CXX_set=${CXX+set}
+ac_cv_env_CXX_value=$CXX
+ac_env_CXXFLAGS_set=${CXXFLAGS+set}
+ac_env_CXXFLAGS_value=$CXXFLAGS
+ac_cv_env_CXXFLAGS_set=${CXXFLAGS+set}
+ac_cv_env_CXXFLAGS_value=$CXXFLAGS
+ac_env_CPP_set=${CPP+set}
+ac_env_CPP_value=$CPP
+ac_cv_env_CPP_set=${CPP+set}
+ac_cv_env_CPP_value=$CPP
+#
+# Report the --help message.
+#
+if test "$ac_init_help" = "long"; then
+ # Omit some internal or obsolete options to make the list less imposing.
+ # This message is too long to be a string in the A/UX 3.1 sh.
+ cat <<_ACEOF
+\`configure' configures this package to adapt to many kinds of systems.
+
+Usage: $0 [OPTION]... [VAR=VALUE]...
+
+To assign environment variables (e.g., CC, CFLAGS...), specify them as
+VAR=VALUE. See below for descriptions of some of the useful variables.
+
+Defaults for the options are specified in brackets.
+
+Configuration:
+ -h, --help display this help and exit
+ --help=short display options specific to this package
+ --help=recursive display the short help of all the included packages
+ -V, --version display version information and exit
+ -q, --quiet, --silent do not print \`checking...' messages
+ --cache-file=FILE cache test results in FILE [disabled]
+ -C, --config-cache alias for \`--cache-file=config.cache'
+ -n, --no-create do not create output files
+ --srcdir=DIR find the sources in DIR [configure dir or \`..']
+
+_ACEOF
+
+ cat <<_ACEOF
+Installation directories:
+ --prefix=PREFIX install architecture-independent files in PREFIX
+ [$ac_default_prefix]
+ --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX
+ [PREFIX]
+
+By default, \`make install' will install all the files in
+\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify
+an installation prefix other than \`$ac_default_prefix' using \`--prefix',
+for instance \`--prefix=\$HOME'.
+
+For better control, use the options below.
+
+Fine tuning of the installation directories:
+ --bindir=DIR user executables [EPREFIX/bin]
+ --sbindir=DIR system admin executables [EPREFIX/sbin]
+ --libexecdir=DIR program executables [EPREFIX/libexec]
+ --datadir=DIR read-only architecture-independent data [PREFIX/share]
+ --sysconfdir=DIR read-only single-machine data [PREFIX/etc]
+ --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com]
+ --localstatedir=DIR modifiable single-machine data [PREFIX/var]
+ --libdir=DIR object code libraries [EPREFIX/lib]
+ --includedir=DIR C header files [PREFIX/include]
+ --oldincludedir=DIR C header files for non-gcc [/usr/include]
+ --infodir=DIR info documentation [PREFIX/info]
+ --mandir=DIR man documentation [PREFIX/man]
+_ACEOF
+
+ cat <<\_ACEOF
+
+System types:
+ --build=BUILD configure for building on BUILD [guessed]
+ --host=HOST cross-compile to build programs to run on HOST [BUILD]
+_ACEOF
+fi
+
+if test -n "$ac_init_help"; then
+
+ cat <<\_ACEOF
+
+Optional Features:
+ --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no)
+ --enable-FEATURE[=ARG] include FEATURE [ARG=yes]
+ --enable-strict compile with strict compiler options default=no
+ --enable-64bit-libs build 64-bit libraries default=yes
+ --enable-shared build shared libraries default=yes
+ --enable-static build static libraries default=no
+ --enable-debug build debug libraries default=no
+ --enable-release build release libraries default=yes
+ --enable-draft enable draft APIs default=yes
+ --enable-renaming add a version suffix to symbols default=yes
+ --enable-tracing enable function and data tracing default=yes
+ --enable-rpath use rpath when linking default is only if necessary
+ --enable-threads build ICU with thread safety default=yes
+ --enable-extras build ICU extras default=yes
+ --enable-icuio build ICU's icuio library default=yes
+ --enable-layout build ICU's layout library default=yes
+ --enable-tests build ICU tests default=yes
+ --enable-samples build ICU samples default=yes
+Additionally, the variable FORCE_LIBS may be set before calling configure. If set, it will REPLACE any automatic list of libraries.
+
+Optional Packages:
+ --with-PACKAGE[=ARG] use PACKAGE [ARG=yes]
+ --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no)
+ --with-iostream=version specify the version of iostream to use (none, old, std, auto) default=auto
+ --with-data-packaging=type specify how to package ICU data (files, archive, library, auto) default=auto
+ --with-library-suffix=suffix tag a suffix to the library names default=
+
+Some influential environment variables:
+ CC C compiler command
+ CFLAGS C compiler flags
+ LDFLAGS linker flags, e.g. -L if you have libraries in a
+ nonstandard directory
+ CPPFLAGS C/C++ preprocessor flags, e.g. -I if you have
+ headers in a nonstandard directory
+ CXX C++ compiler command
+ CXXFLAGS C++ compiler flags
+ CPP C preprocessor
+
+Use these variables to override the choices made by `configure' or to help
+it to find libraries and programs with nonstandard names/locations.
+
+_ACEOF
+fi
+
+if test "$ac_init_help" = "recursive"; then
+ # If there are subdirs, report their specific --help.
+ ac_popdir=`pwd`
+ for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue
+ test -d $ac_dir || continue
+ ac_builddir=.
+
+if test "$ac_dir" != .; then
+ ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'`
+ # A "../" for each directory in $ac_dir_suffix.
+ ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'`
+else
+ ac_dir_suffix= ac_top_builddir=
+fi
+
+case $srcdir in
+ .) # No --srcdir option. We are building in place.
+ ac_srcdir=.
+ if test -z "$ac_top_builddir"; then
+ ac_top_srcdir=.
+ else
+ ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'`
+ fi ;;
+ [\\/]* | ?:[\\/]* ) # Absolute path.
+ ac_srcdir=$srcdir$ac_dir_suffix;
+ ac_top_srcdir=$srcdir ;;
+ *) # Relative path.
+ ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix
+ ac_top_srcdir=$ac_top_builddir$srcdir ;;
+esac
+
+# Do not use `cd foo && pwd` to compute absolute paths, because
+# the directories may not exist.
+case `pwd` in
+.) ac_abs_builddir="$ac_dir";;
+*)
+ case "$ac_dir" in
+ .) ac_abs_builddir=`pwd`;;
+ [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";;
+ *) ac_abs_builddir=`pwd`/"$ac_dir";;
+ esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_top_builddir=${ac_top_builddir}.;;
+*)
+ case ${ac_top_builddir}. in
+ .) ac_abs_top_builddir=$ac_abs_builddir;;
+ [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;;
+ *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;;
+ esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_srcdir=$ac_srcdir;;
+*)
+ case $ac_srcdir in
+ .) ac_abs_srcdir=$ac_abs_builddir;;
+ [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;;
+ *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;;
+ esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_top_srcdir=$ac_top_srcdir;;
+*)
+ case $ac_top_srcdir in
+ .) ac_abs_top_srcdir=$ac_abs_builddir;;
+ [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;;
+ *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;;
+ esac;;
+esac
+
+ cd $ac_dir
+ # Check for guested configure; otherwise get Cygnus style configure.
+ if test -f $ac_srcdir/configure.gnu; then
+ echo
+ $SHELL $ac_srcdir/configure.gnu --help=recursive
+ elif test -f $ac_srcdir/configure; then
+ echo
+ $SHELL $ac_srcdir/configure --help=recursive
+ elif test -f $ac_srcdir/configure.ac ||
+ test -f $ac_srcdir/configure.in; then
+ echo
+ $ac_configure --help
+ else
+ echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2
+ fi
+ cd $ac_popdir
+ done
+fi
+
+test -n "$ac_init_help" && exit 0
+if $ac_init_version; then
+ cat <<\_ACEOF
+
+Copyright (C) 2003 Free Software Foundation, Inc.
+This configure script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it.
+_ACEOF
+ exit 0
+fi
+exec 5>config.log
+cat >&5 <<_ACEOF
+This file contains any messages produced by compilers while
+running configure, to aid debugging if configure makes a mistake.
+
+It was created by $as_me, which was
+generated by GNU Autoconf 2.59. Invocation command line was
+
+ $ $0 $@
+
+_ACEOF
+{
+cat <<_ASUNAME
+## --------- ##
+## Platform. ##
+## --------- ##
+
+hostname = `(hostname || uname -n) 2>/dev/null | sed 1q`
+uname -m = `(uname -m) 2>/dev/null || echo unknown`
+uname -r = `(uname -r) 2>/dev/null || echo unknown`
+uname -s = `(uname -s) 2>/dev/null || echo unknown`
+uname -v = `(uname -v) 2>/dev/null || echo unknown`
+
+/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown`
+/bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown`
+
+/bin/arch = `(/bin/arch) 2>/dev/null || echo unknown`
+/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown`
+/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown`
+hostinfo = `(hostinfo) 2>/dev/null || echo unknown`
+/bin/machine = `(/bin/machine) 2>/dev/null || echo unknown`
+/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown`
+/bin/universe = `(/bin/universe) 2>/dev/null || echo unknown`
+
+_ASUNAME
+
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ echo "PATH: $as_dir"
+done
+
+} >&5
+
+cat >&5 <<_ACEOF
+
+
+## ----------- ##
+## Core tests. ##
+## ----------- ##
+
+_ACEOF
+
+
+# Keep a trace of the command line.
+# Strip out --no-create and --no-recursion so they do not pile up.
+# Strip out --silent because we don't want to record it for future runs.
+# Also quote any args containing shell meta-characters.
+# Make two passes to allow for proper duplicate-argument suppression.
+ac_configure_args=
+ac_configure_args0=
+ac_configure_args1=
+ac_sep=
+ac_must_keep_next=false
+for ac_pass in 1 2
+do
+ for ac_arg
+ do
+ case $ac_arg in
+ -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;;
+ -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+ | -silent | --silent | --silen | --sile | --sil)
+ continue ;;
+ *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*)
+ ac_arg=`echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
+ esac
+ case $ac_pass in
+ 1) ac_configure_args0="$ac_configure_args0 '$ac_arg'" ;;
+ 2)
+ ac_configure_args1="$ac_configure_args1 '$ac_arg'"
+ if test $ac_must_keep_next = true; then
+ ac_must_keep_next=false # Got value, back to normal.
+ else
+ case $ac_arg in
+ *=* | --config-cache | -C | -disable-* | --disable-* \
+ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \
+ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \
+ | -with-* | --with-* | -without-* | --without-* | --x)
+ case "$ac_configure_args0 " in
+ "$ac_configure_args1"*" '$ac_arg' "* ) continue ;;
+ esac
+ ;;
+ -* ) ac_must_keep_next=true ;;
+ esac
+ fi
+ ac_configure_args="$ac_configure_args$ac_sep'$ac_arg'"
+ # Get rid of the leading space.
+ ac_sep=" "
+ ;;
+ esac
+ done
+done
+$as_unset ac_configure_args0 || test "${ac_configure_args0+set}" != set || { ac_configure_args0=; export ac_configure_args0; }
+$as_unset ac_configure_args1 || test "${ac_configure_args1+set}" != set || { ac_configure_args1=; export ac_configure_args1; }
+
+# When interrupted or exit'd, cleanup temporary files, and complete
+# config.log. We remove comments because anyway the quotes in there
+# would cause problems or look ugly.
+# WARNING: Be sure not to use single quotes in there, as some shells,
+# such as our DU 5.0 friend, will then `close' the trap.
+trap 'exit_status=$?
+ # Save into config.log some information that might help in debugging.
+ {
+ echo
+
+ cat <<\_ASBOX
+## ---------------- ##
+## Cache variables. ##
+## ---------------- ##
+_ASBOX
+ echo
+ # The following way of writing the cache mishandles newlines in values,
+{
+ (set) 2>&1 |
+ case `(ac_space='"'"' '"'"'; set | grep ac_space) 2>&1` in
+ *ac_space=\ *)
+ sed -n \
+ "s/'"'"'/'"'"'\\\\'"'"''"'"'/g;
+ s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='"'"'\\2'"'"'/p"
+ ;;
+ *)
+ sed -n \
+ "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p"
+ ;;
+ esac;
+}
+ echo
+
+ cat <<\_ASBOX
+## ----------------- ##
+## Output variables. ##
+## ----------------- ##
+_ASBOX
+ echo
+ for ac_var in $ac_subst_vars
+ do
+ eval ac_val=$`echo $ac_var`
+ echo "$ac_var='"'"'$ac_val'"'"'"
+ done | sort
+ echo
+
+ if test -n "$ac_subst_files"; then
+ cat <<\_ASBOX
+## ------------- ##
+## Output files. ##
+## ------------- ##
+_ASBOX
+ echo
+ for ac_var in $ac_subst_files
+ do
+ eval ac_val=$`echo $ac_var`
+ echo "$ac_var='"'"'$ac_val'"'"'"
+ done | sort
+ echo
+ fi
+
+ if test -s confdefs.h; then
+ cat <<\_ASBOX
+## ----------- ##
+## confdefs.h. ##
+## ----------- ##
+_ASBOX
+ echo
+ sed "/^$/d" confdefs.h | sort
+ echo
+ fi
+ test "$ac_signal" != 0 &&
+ echo "$as_me: caught signal $ac_signal"
+ echo "$as_me: exit $exit_status"
+ } >&5
+ rm -f core *.core &&
+ rm -rf conftest* confdefs* conf$$* $ac_clean_files &&
+ exit $exit_status
+ ' 0
+for ac_signal in 1 2 13 15; do
+ trap 'ac_signal='$ac_signal'; { (exit 1); exit 1; }' $ac_signal
+done
+ac_signal=0
+
+# confdefs.h avoids OS command line length limits that DEFS can exceed.
+rm -rf conftest* confdefs.h
+# AIX cpp loses on an empty file, so make sure it contains at least a newline.
+echo >confdefs.h
+
+# Predefined preprocessor variables.
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_NAME "$PACKAGE_NAME"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_TARNAME "$PACKAGE_TARNAME"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_VERSION "$PACKAGE_VERSION"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_STRING "$PACKAGE_STRING"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT"
+_ACEOF
+
+
+# Let the site file select an alternate cache file if it wants to.
# Prefer explicitly selected file to automatically selected ones.
if test -z "$CONFIG_SITE"; then
if test "x$prefix" != xNONE; then
@@ -525,48 +1227,113 @@ if test -z "$CONFIG_SITE"; then
fi
for ac_site_file in $CONFIG_SITE; do
if test -r "$ac_site_file"; then
- echo "loading site script $ac_site_file"
+ { echo "$as_me:$LINENO: loading site script $ac_site_file" >&5
+echo "$as_me: loading site script $ac_site_file" >&6;}
+ sed 's/^/| /' "$ac_site_file" >&5
. "$ac_site_file"
fi
done
if test -r "$cache_file"; then
- echo "loading cache $cache_file"
- . $cache_file
+ # Some versions of bash will fail to source /dev/null (special
+ # files actually), so we avoid doing that.
+ if test -f "$cache_file"; then
+ { echo "$as_me:$LINENO: loading cache $cache_file" >&5
+echo "$as_me: loading cache $cache_file" >&6;}
+ case $cache_file in
+ [\\/]* | ?:[\\/]* ) . $cache_file;;
+ *) . ./$cache_file;;
+ esac
+ fi
else
- echo "creating cache $cache_file"
- > $cache_file
+ { echo "$as_me:$LINENO: creating cache $cache_file" >&5
+echo "$as_me: creating cache $cache_file" >&6;}
+ >$cache_file
+fi
+
+# Check that the precious variables saved in the cache have kept the same
+# value.
+ac_cache_corrupted=false
+for ac_var in `(set) 2>&1 |
+ sed -n 's/^ac_env_\([a-zA-Z_0-9]*\)_set=.*/\1/p'`; do
+ eval ac_old_set=\$ac_cv_env_${ac_var}_set
+ eval ac_new_set=\$ac_env_${ac_var}_set
+ eval ac_old_val="\$ac_cv_env_${ac_var}_value"
+ eval ac_new_val="\$ac_env_${ac_var}_value"
+ case $ac_old_set,$ac_new_set in
+ set,)
+ { echo "$as_me:$LINENO: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5
+echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;}
+ ac_cache_corrupted=: ;;
+ ,set)
+ { echo "$as_me:$LINENO: error: \`$ac_var' was not set in the previous run" >&5
+echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;}
+ ac_cache_corrupted=: ;;
+ ,);;
+ *)
+ if test "x$ac_old_val" != "x$ac_new_val"; then
+ { echo "$as_me:$LINENO: error: \`$ac_var' has changed since the previous run:" >&5
+echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;}
+ { echo "$as_me:$LINENO: former value: $ac_old_val" >&5
+echo "$as_me: former value: $ac_old_val" >&2;}
+ { echo "$as_me:$LINENO: current value: $ac_new_val" >&5
+echo "$as_me: current value: $ac_new_val" >&2;}
+ ac_cache_corrupted=:
+ fi;;
+ esac
+ # Pass precious variables to config.status.
+ if test "$ac_new_set" = set; then
+ case $ac_new_val in
+ *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*)
+ ac_arg=$ac_var=`echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;;
+ *) ac_arg=$ac_var=$ac_new_val ;;
+ esac
+ case " $ac_configure_args " in
+ *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy.
+ *) ac_configure_args="$ac_configure_args '$ac_arg'" ;;
+ esac
+ fi
+done
+if $ac_cache_corrupted; then
+ { echo "$as_me:$LINENO: error: changes in the environment can compromise the build" >&5
+echo "$as_me: error: changes in the environment can compromise the build" >&2;}
+ { { echo "$as_me:$LINENO: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&5
+echo "$as_me: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&2;}
+ { (exit 1); exit 1; }; }
fi
ac_ext=c
-# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
ac_cpp='$CPP $CPPFLAGS'
-ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
-ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
-cross_compiling=$ac_cv_prog_cc_cross
-
-ac_exeext=
-ac_objext=o
-if (echo "testing\c"; echo 1,2,3) | grep c >/dev/null; then
- # Stardent Vistra SVR4 grep lacks -e, says ghazi@caip.rutgers.edu.
- if (echo -n testing; echo 1,2,3) | sed s/-n/xn/ | grep xn >/dev/null; then
- ac_n= ac_c='
-' ac_t=' '
- else
- ac_n=-n ac_c= ac_t=
- fi
-else
- ac_n= ac_c='\c' ac_t=
-fi
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ac_config_headers="$ac_config_headers common/icucfg.h"
+
PACKAGE="icu"
-echo $ac_n "checking for ICU version numbers""... $ac_c" 1>&6
-echo "configure:570: checking for ICU version numbers" >&5
+echo "$as_me:$LINENO: checking for ICU version numbers" >&5
+echo $ECHO_N "checking for ICU version numbers... $ECHO_C" >&6
geticuversion() {
sed -n 's/^[ ]*#[ ]*define[ ]*U_ICU_VERSION[ ]*"\([^"]*\)".*/\1/p' "$@"
@@ -575,7 +1342,9 @@ VERSION=`geticuversion $srcdir/common/unicode/uversion.h`
if test x"$VERSION" = x; then
VERSION=`geticuversion $srcdir/common/unicode/*.h`
if test x"$VERSION" = x; then
- { echo "configure: error: Cannot determine ICU version number from header files" 1>&2; exit 1; }
+ { { echo "$as_me:$LINENO: error: Cannot determine ICU version number from header files" >&5
+echo "$as_me: error: Cannot determine ICU version number from header files" >&2;}
+ { (exit 1); exit 1; }; }
fi
fi
LIB_VERSION=`echo $VERSION | sed -e 's/\.//' -e 's/^\([^.]*\)$/\1.0/'`
@@ -583,222 +1352,749 @@ LIB_VERSION_MAJOR=`echo $LIB_VERSION | sed 's/\..*//'`
-echo "$ac_t""release $VERSION, library $LIB_VERSION" 1>&6
+echo "$as_me:$LINENO: result: release $VERSION, library $LIB_VERSION" >&5
+echo "${ECHO_T}release $VERSION, library $LIB_VERSION" >&6
-UNICODE_VERSION="4.0.1"
+UNICODE_VERSION="5.0"
-
-#AC_SUBST(CINTLTST_CPPFLAGS)
-
-# Extract the first word of "gcc", so it can be a program name with args.
-set dummy gcc; ac_word=$2
-echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:598: checking for $ac_word" >&5
-if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
- echo $ac_n "(cached) $ac_c" 1>&6
-else
- if test -n "$CC"; then
- ac_cv_prog_CC="$CC" # Let the user override the test.
-else
- IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
- ac_dummy="$PATH"
- for ac_dir in $ac_dummy; do
- test -z "$ac_dir" && ac_dir=.
- if test -f $ac_dir/$ac_word; then
- ac_cv_prog_CC="gcc"
- break
- fi
- done
- IFS="$ac_save_ifs"
+ac_aux_dir=
+for ac_dir in $srcdir $srcdir/.. $srcdir/../..; do
+ if test -f $ac_dir/install-sh; then
+ ac_aux_dir=$ac_dir
+ ac_install_sh="$ac_aux_dir/install-sh -c"
+ break
+ elif test -f $ac_dir/install.sh; then
+ ac_aux_dir=$ac_dir
+ ac_install_sh="$ac_aux_dir/install.sh -c"
+ break
+ elif test -f $ac_dir/shtool; then
+ ac_aux_dir=$ac_dir
+ ac_install_sh="$ac_aux_dir/shtool install -c"
+ break
+ fi
+done
+if test -z "$ac_aux_dir"; then
+ { { echo "$as_me:$LINENO: error: cannot find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." >&5
+echo "$as_me: error: cannot find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." >&2;}
+ { (exit 1); exit 1; }; }
fi
+ac_config_guess="$SHELL $ac_aux_dir/config.guess"
+ac_config_sub="$SHELL $ac_aux_dir/config.sub"
+ac_configure="$SHELL $ac_aux_dir/configure" # This should be Cygnus configure.
+
+# Make sure we can run config.sub.
+$ac_config_sub sun4 >/dev/null 2>&1 ||
+ { { echo "$as_me:$LINENO: error: cannot run $ac_config_sub" >&5
+echo "$as_me: error: cannot run $ac_config_sub" >&2;}
+ { (exit 1); exit 1; }; }
+
+echo "$as_me:$LINENO: checking build system type" >&5
+echo $ECHO_N "checking build system type... $ECHO_C" >&6
+if test "${ac_cv_build+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_cv_build_alias=$build_alias
+test -z "$ac_cv_build_alias" &&
+ ac_cv_build_alias=`$ac_config_guess`
+test -z "$ac_cv_build_alias" &&
+ { { echo "$as_me:$LINENO: error: cannot guess build type; you must specify one" >&5
+echo "$as_me: error: cannot guess build type; you must specify one" >&2;}
+ { (exit 1); exit 1; }; }
+ac_cv_build=`$ac_config_sub $ac_cv_build_alias` ||
+ { { echo "$as_me:$LINENO: error: $ac_config_sub $ac_cv_build_alias failed" >&5
+echo "$as_me: error: $ac_config_sub $ac_cv_build_alias failed" >&2;}
+ { (exit 1); exit 1; }; }
+
fi
-CC="$ac_cv_prog_CC"
+echo "$as_me:$LINENO: result: $ac_cv_build" >&5
+echo "${ECHO_T}$ac_cv_build" >&6
+build=$ac_cv_build
+build_cpu=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
+build_vendor=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
+build_os=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
+
+
+echo "$as_me:$LINENO: checking host system type" >&5
+echo $ECHO_N "checking host system type... $ECHO_C" >&6
+if test "${ac_cv_host+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_cv_host_alias=$host_alias
+test -z "$ac_cv_host_alias" &&
+ ac_cv_host_alias=$ac_cv_build_alias
+ac_cv_host=`$ac_config_sub $ac_cv_host_alias` ||
+ { { echo "$as_me:$LINENO: error: $ac_config_sub $ac_cv_host_alias failed" >&5
+echo "$as_me: error: $ac_config_sub $ac_cv_host_alias failed" >&2;}
+ { (exit 1); exit 1; }; }
+
+fi
+echo "$as_me:$LINENO: result: $ac_cv_host" >&5
+echo "${ECHO_T}$ac_cv_host" >&6
+host=$ac_cv_host
+host_cpu=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
+host_vendor=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
+host_os=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
+
+
+
+
+
+_CXX_CXXSUFFIX=cc
+export _CXX_CXXSUFFIX
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}gcc; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_CC+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_CC="${ac_tool_prefix}gcc"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+fi
+fi
+CC=$ac_cv_prog_CC
if test -n "$CC"; then
- echo "$ac_t""$CC" 1>&6
+ echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6
else
- echo "$ac_t""no" 1>&6
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
fi
+fi
+if test -z "$ac_cv_prog_CC"; then
+ ac_ct_CC=$CC
+ # Extract the first word of "gcc", so it can be a program name with args.
+set dummy gcc; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$ac_ct_CC"; then
+ ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_CC="gcc"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+ echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
+echo "${ECHO_T}$ac_ct_CC" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ CC=$ac_ct_CC
+else
+ CC="$ac_cv_prog_CC"
+fi
+
+if test -z "$CC"; then
+ if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}cc; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_CC+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_CC="${ac_tool_prefix}cc"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+ echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+fi
+if test -z "$ac_cv_prog_CC"; then
+ ac_ct_CC=$CC
+ # Extract the first word of "cc", so it can be a program name with args.
+set dummy cc; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$ac_ct_CC"; then
+ ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_CC="cc"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+ echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
+echo "${ECHO_T}$ac_ct_CC" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ CC=$ac_ct_CC
+else
+ CC="$ac_cv_prog_CC"
+fi
+
+fi
if test -z "$CC"; then
# Extract the first word of "cc", so it can be a program name with args.
set dummy cc; ac_word=$2
-echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:628: checking for $ac_word" >&5
-if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
- echo $ac_n "(cached) $ac_c" 1>&6
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_CC+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
else
if test -n "$CC"; then
ac_cv_prog_CC="$CC" # Let the user override the test.
else
- IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
ac_prog_rejected=no
- ac_dummy="$PATH"
- for ac_dir in $ac_dummy; do
- test -z "$ac_dir" && ac_dir=.
- if test -f $ac_dir/$ac_word; then
- if test "$ac_dir/$ac_word" = "/usr/ucb/cc"; then
- ac_prog_rejected=yes
- continue
- fi
- ac_cv_prog_CC="cc"
- break
- fi
- done
- IFS="$ac_save_ifs"
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then
+ ac_prog_rejected=yes
+ continue
+ fi
+ ac_cv_prog_CC="cc"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
if test $ac_prog_rejected = yes; then
# We found a bogon in the path, so make sure we never use it.
set dummy $ac_cv_prog_CC
shift
- if test $# -gt 0; then
+ if test $# != 0; then
# We chose a different compiler from the bogus one.
# However, it has the same basename, so the bogon will be chosen
# first if we set CC to just the basename; use the full file name.
shift
- set dummy "$ac_dir/$ac_word" "$@"
- shift
- ac_cv_prog_CC="$@"
+ ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@"
fi
fi
fi
fi
-CC="$ac_cv_prog_CC"
+CC=$ac_cv_prog_CC
if test -n "$CC"; then
- echo "$ac_t""$CC" 1>&6
+ echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6
else
- echo "$ac_t""no" 1>&6
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
fi
- if test -z "$CC"; then
- case "`uname -s`" in
- *win32* | *WIN32*)
- # Extract the first word of "cl", so it can be a program name with args.
-set dummy cl; ac_word=$2
-echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:679: checking for $ac_word" >&5
-if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
- echo $ac_n "(cached) $ac_c" 1>&6
+fi
+if test -z "$CC"; then
+ if test -n "$ac_tool_prefix"; then
+ for ac_prog in cl
+ do
+ # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_CC+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
else
if test -n "$CC"; then
ac_cv_prog_CC="$CC" # Let the user override the test.
else
- IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
- ac_dummy="$PATH"
- for ac_dir in $ac_dummy; do
- test -z "$ac_dir" && ac_dir=.
- if test -f $ac_dir/$ac_word; then
- ac_cv_prog_CC="cl"
- break
- fi
- done
- IFS="$ac_save_ifs"
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_CC="$ac_tool_prefix$ac_prog"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
fi
fi
-CC="$ac_cv_prog_CC"
+CC=$ac_cv_prog_CC
if test -n "$CC"; then
- echo "$ac_t""$CC" 1>&6
+ echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6
else
- echo "$ac_t""no" 1>&6
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
fi
- ;;
- esac
+
+ test -n "$CC" && break
+ done
+fi
+if test -z "$CC"; then
+ ac_ct_CC=$CC
+ for ac_prog in cl
+do
+ # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$ac_ct_CC"; then
+ ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_CC="$ac_prog"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
fi
- test -z "$CC" && { echo "configure: error: no acceptable cc found in \$PATH" 1>&2; exit 1; }
+done
+done
+
+fi
fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+ echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
+echo "${ECHO_T}$ac_ct_CC" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ test -n "$ac_ct_CC" && break
+done
-echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works""... $ac_c" 1>&6
-echo "configure:711: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5
+ CC=$ac_ct_CC
+fi
+
+fi
+
+
+test -z "$CC" && { { echo "$as_me:$LINENO: error: no acceptable C compiler found in \$PATH
+See \`config.log' for more details." >&5
+echo "$as_me: error: no acceptable C compiler found in \$PATH
+See \`config.log' for more details." >&2;}
+ { (exit 1); exit 1; }; }
+
+# Provide some information about the compiler.
+echo "$as_me:$LINENO:" \
+ "checking for C compiler version" >&5
+ac_compiler=`set X $ac_compile; echo $2`
+{ (eval echo "$as_me:$LINENO: \"$ac_compiler --version &5\"") >&5
+ (eval $ac_compiler --version &5) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }
+{ (eval echo "$as_me:$LINENO: \"$ac_compiler -v &5\"") >&5
+ (eval $ac_compiler -v &5) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }
+{ (eval echo "$as_me:$LINENO: \"$ac_compiler -V &5\"") >&5
+ (eval $ac_compiler -V &5) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }
+
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+int
+main ()
+{
-ac_ext=c
-# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
-ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
-cross_compiling=$ac_cv_prog_cc_cross
-
-cat > conftest.$ac_ext << EOF
-
-#line 722 "configure"
-#include "confdefs.h"
-
-main(){return(0);}
-EOF
-if { (eval echo configure:727: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
- ac_cv_prog_cc_works=yes
- # If we can't run a trivial program, we are probably using a cross compiler.
- if (./conftest; exit) 2>/dev/null; then
- ac_cv_prog_cc_cross=no
+ ;
+ return 0;
+}
+_ACEOF
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files a.out a.exe b.out"
+# Try to create an executable without -o first, disregard a.out.
+# It will help us diagnose broken compilers, and finding out an intuition
+# of exeext.
+echo "$as_me:$LINENO: checking for C compiler default output file name" >&5
+echo $ECHO_N "checking for C compiler default output file name... $ECHO_C" >&6
+ac_link_default=`echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'`
+if { (eval echo "$as_me:$LINENO: \"$ac_link_default\"") >&5
+ (eval $ac_link_default) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; then
+ # Find the output, starting from the most likely. This scheme is
+# not robust to junk in `.', hence go to wildcards (a.*) only as a last
+# resort.
+
+# Be careful to initialize this variable, since it used to be cached.
+# Otherwise an old cache value of `no' led to `EXEEXT = no' in a Makefile.
+ac_cv_exeext=
+# b.out is created by i960 compilers.
+for ac_file in a_out.exe a.exe conftest.exe a.out conftest a.* conftest.* b.out
+do
+ test -f "$ac_file" || continue
+ case $ac_file in
+ *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.o | *.obj )
+ ;;
+ conftest.$ac_ext )
+ # This is the source file.
+ ;;
+ [ab].out )
+ # We found the default executable, but exeext='' is most
+ # certainly right.
+ break;;
+ *.* )
+ ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+ # FIXME: I believe we export ac_cv_exeext for Libtool,
+ # but it would be cool to find out if it's true. Does anybody
+ # maintain Libtool? --akim.
+ export ac_cv_exeext
+ break;;
+ * )
+ break;;
+ esac
+done
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+{ { echo "$as_me:$LINENO: error: C compiler cannot create executables
+See \`config.log' for more details." >&5
+echo "$as_me: error: C compiler cannot create executables
+See \`config.log' for more details." >&2;}
+ { (exit 77); exit 77; }; }
+fi
+
+ac_exeext=$ac_cv_exeext
+echo "$as_me:$LINENO: result: $ac_file" >&5
+echo "${ECHO_T}$ac_file" >&6
+
+# Check the compiler produces executables we can run. If not, either
+# the compiler is broken, or we cross compile.
+echo "$as_me:$LINENO: checking whether the C compiler works" >&5
+echo $ECHO_N "checking whether the C compiler works... $ECHO_C" >&6
+# FIXME: These cross compiler hacks should be removed for Autoconf 3.0
+# If not cross compiling, check that we can run a simple program.
+if test "$cross_compiling" != yes; then
+ if { ac_try='./$ac_file'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ cross_compiling=no
else
- ac_cv_prog_cc_cross=yes
+ if test "$cross_compiling" = maybe; then
+ cross_compiling=yes
+ else
+ { { echo "$as_me:$LINENO: error: cannot run C compiled programs.
+If you meant to cross compile, use \`--host'.
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot run C compiled programs.
+If you meant to cross compile, use \`--host'.
+See \`config.log' for more details." >&2;}
+ { (exit 1); exit 1; }; }
+ fi
fi
-else
- echo "configure: failed program was:" >&5
- cat conftest.$ac_ext >&5
- ac_cv_prog_cc_works=no
fi
-rm -fr conftest*
-ac_ext=c
-# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
-ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
-cross_compiling=$ac_cv_prog_cc_cross
-
-echo "$ac_t""$ac_cv_prog_cc_works" 1>&6
-if test $ac_cv_prog_cc_works = no; then
- { echo "configure: error: installation or configuration problem: C compiler cannot create executables." 1>&2; exit 1; }
-fi
-echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6
-echo "configure:753: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5
-echo "$ac_t""$ac_cv_prog_cc_cross" 1>&6
-cross_compiling=$ac_cv_prog_cc_cross
-
-echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6
-echo "configure:758: checking whether we are using GNU C" >&5
-if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then
- echo $ac_n "(cached) $ac_c" 1>&6
-else
- cat > conftest.c <&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then
- ac_cv_prog_gcc=yes
+echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+
+rm -f a.out a.exe conftest$ac_cv_exeext b.out
+ac_clean_files=$ac_clean_files_save
+# Check the compiler produces executables we can run. If not, either
+# the compiler is broken, or we cross compile.
+echo "$as_me:$LINENO: checking whether we are cross compiling" >&5
+echo $ECHO_N "checking whether we are cross compiling... $ECHO_C" >&6
+echo "$as_me:$LINENO: result: $cross_compiling" >&5
+echo "${ECHO_T}$cross_compiling" >&6
+
+echo "$as_me:$LINENO: checking for suffix of executables" >&5
+echo $ECHO_N "checking for suffix of executables... $ECHO_C" >&6
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; then
+ # If both `conftest.exe' and `conftest' are `present' (well, observable)
+# catch `conftest.exe'. For instance with Cygwin, `ls conftest' will
+# work properly (i.e., refer to `conftest.exe'), while it won't with
+# `rm'.
+for ac_file in conftest.exe conftest conftest.*; do
+ test -f "$ac_file" || continue
+ case $ac_file in
+ *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.o | *.obj ) ;;
+ *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+ export ac_cv_exeext
+ break;;
+ * ) break;;
+ esac
+done
else
- ac_cv_prog_gcc=no
-fi
+ { { echo "$as_me:$LINENO: error: cannot compute suffix of executables: cannot compile and link
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot compute suffix of executables: cannot compile and link
+See \`config.log' for more details." >&2;}
+ { (exit 1); exit 1; }; }
fi
-echo "$ac_t""$ac_cv_prog_gcc" 1>&6
+rm -f conftest$ac_cv_exeext
+echo "$as_me:$LINENO: result: $ac_cv_exeext" >&5
+echo "${ECHO_T}$ac_cv_exeext" >&6
+
+rm -f conftest.$ac_ext
+EXEEXT=$ac_cv_exeext
+ac_exeext=$EXEEXT
+echo "$as_me:$LINENO: checking for suffix of object files" >&5
+echo $ECHO_N "checking for suffix of object files... $ECHO_C" >&6
+if test "${ac_cv_objext+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+int
+main ()
+{
-if test $ac_cv_prog_gcc = yes; then
- GCC=yes
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.o conftest.obj
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; then
+ for ac_file in `(ls conftest.o conftest.obj; ls conftest.*) 2>/dev/null`; do
+ case $ac_file in
+ *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg ) ;;
+ *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'`
+ break;;
+ esac
+done
else
- GCC=
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+{ { echo "$as_me:$LINENO: error: cannot compute suffix of object files: cannot compile
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot compute suffix of object files: cannot compile
+See \`config.log' for more details." >&2;}
+ { (exit 1); exit 1; }; }
fi
-ac_test_CFLAGS="${CFLAGS+set}"
-ac_save_CFLAGS="$CFLAGS"
-CFLAGS=
-echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6
-echo "configure:786: checking whether ${CC-cc} accepts -g" >&5
-if eval "test \"`echo '$''{'ac_cv_prog_cc_g'+set}'`\" = set"; then
- echo $ac_n "(cached) $ac_c" 1>&6
+rm -f conftest.$ac_cv_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_objext" >&5
+echo "${ECHO_T}$ac_cv_objext" >&6
+OBJEXT=$ac_cv_objext
+ac_objext=$OBJEXT
+echo "$as_me:$LINENO: checking whether we are using the GNU C compiler" >&5
+echo $ECHO_N "checking whether we are using the GNU C compiler... $ECHO_C" >&6
+if test "${ac_cv_c_compiler_gnu+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
else
- echo 'void f(){}' > conftest.c
-if test -z "`${CC-cc} -g -c conftest.c 2>&1`"; then
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+int
+main ()
+{
+#ifndef __GNUC__
+ choke me
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_compiler_gnu=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_compiler_gnu=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+ac_cv_c_compiler_gnu=$ac_compiler_gnu
+
+fi
+echo "$as_me:$LINENO: result: $ac_cv_c_compiler_gnu" >&5
+echo "${ECHO_T}$ac_cv_c_compiler_gnu" >&6
+GCC=`test $ac_compiler_gnu = yes && echo yes`
+ac_test_CFLAGS=${CFLAGS+set}
+ac_save_CFLAGS=$CFLAGS
+CFLAGS="-g"
+echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5
+echo $ECHO_N "checking whether $CC accepts -g... $ECHO_C" >&6
+if test "${ac_cv_prog_cc_g+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
ac_cv_prog_cc_g=yes
else
- ac_cv_prog_cc_g=no
-fi
-rm -f conftest*
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+ac_cv_prog_cc_g=no
fi
-
-echo "$ac_t""$ac_cv_prog_cc_g" 1>&6
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5
+echo "${ECHO_T}$ac_cv_prog_cc_g" >&6
if test "$ac_test_CFLAGS" = set; then
- CFLAGS="$ac_save_CFLAGS"
+ CFLAGS=$ac_save_CFLAGS
elif test $ac_cv_prog_cc_g = yes; then
if test "$GCC" = yes; then
CFLAGS="-g -O2"
@@ -812,136 +2108,500 @@ else
CFLAGS=
fi
fi
+echo "$as_me:$LINENO: checking for $CC option to accept ANSI C" >&5
+echo $ECHO_N "checking for $CC option to accept ANSI C... $ECHO_C" >&6
+if test "${ac_cv_prog_cc_stdc+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_cv_prog_cc_stdc=no
+ac_save_CC=$CC
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include
+#include
+#include
+#include
+/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */
+struct buf { int x; };
+FILE * (*rcsopen) (struct buf *, struct stat *, int);
+static char *e (p, i)
+ char **p;
+ int i;
+{
+ return p[i];
+}
+static char *f (char * (*g) (char **, int), char **p, ...)
+{
+ char *s;
+ va_list v;
+ va_start (v,p);
+ s = g (p, va_arg (v,int));
+ va_end (v);
+ return s;
+}
-for ac_prog in $CCC c++ g++ gcc CC cxx cc++ cl
+/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has
+ function prototypes and stuff, but not '\xHH' hex character constants.
+ These don't provoke an error unfortunately, instead are silently treated
+ as 'x'. The following induces an error, until -std1 is added to get
+ proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an
+ array size at least. It's necessary to write '\x00'==0 to get something
+ that's true only with -std1. */
+int osf4_cc_array ['\x00' == 0 ? 1 : -1];
+
+int test (int i, double x);
+struct s1 {int (*f) (int a);};
+struct s2 {int (*f) (double a);};
+int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int);
+int argc;
+char **argv;
+int
+main ()
+{
+return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1];
+ ;
+ return 0;
+}
+_ACEOF
+# Don't try gcc -ansi; that turns off useful extensions and
+# breaks some systems' header files.
+# AIX -qlanglvl=ansi
+# Ultrix and OSF/1 -std1
+# HP-UX 10.20 and later -Ae
+# HP-UX older versions -Aa -D_HPUX_SOURCE
+# SVR4 -Xc -D__EXTENSIONS__
+for ac_arg in "" -qlanglvl=ansi -std1 -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
do
-# Extract the first word of "$ac_prog", so it can be a program name with args.
-set dummy $ac_prog; ac_word=$2
-echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:822: checking for $ac_word" >&5
-if eval "test \"`echo '$''{'ac_cv_prog_CXX'+set}'`\" = set"; then
- echo $ac_n "(cached) $ac_c" 1>&6
-else
- if test -n "$CXX"; then
- ac_cv_prog_CXX="$CXX" # Let the user override the test.
-else
- IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
- ac_dummy="$PATH"
- for ac_dir in $ac_dummy; do
- test -z "$ac_dir" && ac_dir=.
- if test -f $ac_dir/$ac_word; then
- ac_cv_prog_CXX="$ac_prog"
- break
- fi
- done
- IFS="$ac_save_ifs"
-fi
-fi
-CXX="$ac_cv_prog_CXX"
-if test -n "$CXX"; then
- echo "$ac_t""$CXX" 1>&6
+ CC="$ac_save_CC $ac_arg"
+ rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_prog_cc_stdc=$ac_arg
+break
else
- echo "$ac_t""no" 1>&6
-fi
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
-test -n "$CXX" && break
+fi
+rm -f conftest.err conftest.$ac_objext
done
-test -n "$CXX" || CXX="gcc"
+rm -f conftest.$ac_ext conftest.$ac_objext
+CC=$ac_save_CC
+fi
-echo $ac_n "checking whether the C++ compiler ($CXX $CXXFLAGS $LDFLAGS) works""... $ac_c" 1>&6
-echo "configure:854: checking whether the C++ compiler ($CXX $CXXFLAGS $LDFLAGS) works" >&5
+case "x$ac_cv_prog_cc_stdc" in
+ x|xno)
+ echo "$as_me:$LINENO: result: none needed" >&5
+echo "${ECHO_T}none needed" >&6 ;;
+ *)
+ echo "$as_me:$LINENO: result: $ac_cv_prog_cc_stdc" >&5
+echo "${ECHO_T}$ac_cv_prog_cc_stdc" >&6
+ CC="$CC $ac_cv_prog_cc_stdc" ;;
+esac
-ac_ext=C
-# CXXFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
-ac_cpp='$CXXCPP $CPPFLAGS'
-ac_compile='${CXX-g++} -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
-ac_link='${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
-cross_compiling=$ac_cv_prog_cxx_cross
-
-cat > conftest.$ac_ext << EOF
-
-#line 865 "configure"
-#include "confdefs.h"
-
-int main(){return(0);}
-EOF
-if { (eval echo configure:870: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
- ac_cv_prog_cxx_works=yes
- # If we can't run a trivial program, we are probably using a cross compiler.
- if (./conftest; exit) 2>/dev/null; then
- ac_cv_prog_cxx_cross=no
- else
- ac_cv_prog_cxx_cross=yes
- fi
+# Some people use a C++ compiler to compile C. Since we use `exit',
+# in C++ we need to declare it. In case someone uses the same compiler
+# for both compiling C and C++ we need to have the C++ compiler decide
+# the declaration of exit, since it's the most demanding environment.
+cat >conftest.$ac_ext <<_ACEOF
+#ifndef __cplusplus
+ choke me
+#endif
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ for ac_declaration in \
+ '' \
+ 'extern "C" void std::exit (int) throw (); using std::exit;' \
+ 'extern "C" void std::exit (int); using std::exit;' \
+ 'extern "C" void exit (int) throw ();' \
+ 'extern "C" void exit (int);' \
+ 'void exit (int);'
+do
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_declaration
+#include
+int
+main ()
+{
+exit (42);
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ :
else
- echo "configure: failed program was:" >&5
- cat conftest.$ac_ext >&5
- ac_cv_prog_cxx_works=no
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+continue
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_declaration
+int
+main ()
+{
+exit (42);
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ break
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+done
+rm -f conftest*
+if test -n "$ac_declaration"; then
+ echo '#ifdef __cplusplus' >>confdefs.h
+ echo $ac_declaration >>confdefs.h
+ echo '#endif' >>confdefs.h
fi
-rm -fr conftest*
+
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
ac_ext=c
-# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
ac_cpp='$CPP $CPPFLAGS'
-ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
-ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
-cross_compiling=$ac_cv_prog_cc_cross
-
-echo "$ac_t""$ac_cv_prog_cxx_works" 1>&6
-if test $ac_cv_prog_cxx_works = no; then
- { echo "configure: error: installation or configuration problem: C++ compiler cannot create executables." 1>&2; exit 1; }
-fi
-echo $ac_n "checking whether the C++ compiler ($CXX $CXXFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6
-echo "configure:896: checking whether the C++ compiler ($CXX $CXXFLAGS $LDFLAGS) is a cross-compiler" >&5
-echo "$ac_t""$ac_cv_prog_cxx_cross" 1>&6
-cross_compiling=$ac_cv_prog_cxx_cross
-
-echo $ac_n "checking whether we are using GNU C++""... $ac_c" 1>&6
-echo "configure:901: checking whether we are using GNU C++" >&5
-if eval "test \"`echo '$''{'ac_cv_prog_gxx'+set}'`\" = set"; then
- echo $ac_n "(cached) $ac_c" 1>&6
-else
- cat > conftest.C <&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then
- ac_cv_prog_gxx=yes
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+ac_ext=cc
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+if test -n "$ac_tool_prefix"; then
+ for ac_prog in $CCC g++ c++ gpp aCC CC cxx cc++ cl FCC KCC RCC xlC_r xlC
+ do
+ # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_CXX+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
else
- ac_cv_prog_gxx=no
+ if test -n "$CXX"; then
+ ac_cv_prog_CXX="$CXX" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_CXX="$ac_tool_prefix$ac_prog"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+fi
fi
+CXX=$ac_cv_prog_CXX
+if test -n "$CXX"; then
+ echo "$as_me:$LINENO: result: $CXX" >&5
+echo "${ECHO_T}$CXX" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
fi
-echo "$ac_t""$ac_cv_prog_gxx" 1>&6
+ test -n "$CXX" && break
+ done
+fi
+if test -z "$CXX"; then
+ ac_ct_CXX=$CXX
+ for ac_prog in $CCC g++ c++ gpp aCC CC cxx cc++ cl FCC KCC RCC xlC_r xlC
+do
+ # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_CXX+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$ac_ct_CXX"; then
+ ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_CXX="$ac_prog"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
-if test $ac_cv_prog_gxx = yes; then
- GXX=yes
+fi
+fi
+ac_ct_CXX=$ac_cv_prog_ac_ct_CXX
+if test -n "$ac_ct_CXX"; then
+ echo "$as_me:$LINENO: result: $ac_ct_CXX" >&5
+echo "${ECHO_T}$ac_ct_CXX" >&6
else
- GXX=
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
fi
-ac_test_CXXFLAGS="${CXXFLAGS+set}"
-ac_save_CXXFLAGS="$CXXFLAGS"
-CXXFLAGS=
-echo $ac_n "checking whether ${CXX-g++} accepts -g""... $ac_c" 1>&6
-echo "configure:929: checking whether ${CXX-g++} accepts -g" >&5
-if eval "test \"`echo '$''{'ac_cv_prog_cxx_g'+set}'`\" = set"; then
- echo $ac_n "(cached) $ac_c" 1>&6
-else
- echo 'void f(){}' > conftest.cc
-if test -z "`${CXX-g++} -g -c conftest.cc 2>&1`"; then
+ test -n "$ac_ct_CXX" && break
+done
+test -n "$ac_ct_CXX" || ac_ct_CXX="g++"
+
+ CXX=$ac_ct_CXX
+fi
+
+
+# Provide some information about the compiler.
+echo "$as_me:$LINENO:" \
+ "checking for C++ compiler version" >&5
+ac_compiler=`set X $ac_compile; echo $2`
+{ (eval echo "$as_me:$LINENO: \"$ac_compiler --version &5\"") >&5
+ (eval $ac_compiler --version &5) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }
+{ (eval echo "$as_me:$LINENO: \"$ac_compiler -v &5\"") >&5
+ (eval $ac_compiler -v &5) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }
+{ (eval echo "$as_me:$LINENO: \"$ac_compiler -V &5\"") >&5
+ (eval $ac_compiler -V &5) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }
+
+echo "$as_me:$LINENO: checking whether we are using the GNU C++ compiler" >&5
+echo $ECHO_N "checking whether we are using the GNU C++ compiler... $ECHO_C" >&6
+if test "${ac_cv_cxx_compiler_gnu+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+int
+main ()
+{
+#ifndef __GNUC__
+ choke me
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_cxx_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_compiler_gnu=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_compiler_gnu=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+ac_cv_cxx_compiler_gnu=$ac_compiler_gnu
+
+fi
+echo "$as_me:$LINENO: result: $ac_cv_cxx_compiler_gnu" >&5
+echo "${ECHO_T}$ac_cv_cxx_compiler_gnu" >&6
+GXX=`test $ac_compiler_gnu = yes && echo yes`
+ac_test_CXXFLAGS=${CXXFLAGS+set}
+ac_save_CXXFLAGS=$CXXFLAGS
+CXXFLAGS="-g"
+echo "$as_me:$LINENO: checking whether $CXX accepts -g" >&5
+echo $ECHO_N "checking whether $CXX accepts -g... $ECHO_C" >&6
+if test "${ac_cv_prog_cxx_g+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_cxx_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
ac_cv_prog_cxx_g=yes
else
- ac_cv_prog_cxx_g=no
-fi
-rm -f conftest*
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+ac_cv_prog_cxx_g=no
fi
-
-echo "$ac_t""$ac_cv_prog_cxx_g" 1>&6
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_prog_cxx_g" >&5
+echo "${ECHO_T}$ac_cv_prog_cxx_g" >&6
if test "$ac_test_CXXFLAGS" = set; then
- CXXFLAGS="$ac_save_CXXFLAGS"
+ CXXFLAGS=$ac_save_CXXFLAGS
elif test $ac_cv_prog_cxx_g = yes; then
if test "$GXX" = yes; then
CXXFLAGS="-g -O2"
@@ -955,25 +2615,117 @@ else
CXXFLAGS=
fi
fi
-
-ac_aux_dir=
-for ac_dir in $srcdir $srcdir/.. $srcdir/../..; do
- if test -f $ac_dir/install-sh; then
- ac_aux_dir=$ac_dir
- ac_install_sh="$ac_aux_dir/install-sh -c"
- break
- elif test -f $ac_dir/install.sh; then
- ac_aux_dir=$ac_dir
- ac_install_sh="$ac_aux_dir/install.sh -c"
- break
- fi
+for ac_declaration in \
+ '' \
+ 'extern "C" void std::exit (int) throw (); using std::exit;' \
+ 'extern "C" void std::exit (int); using std::exit;' \
+ 'extern "C" void exit (int) throw ();' \
+ 'extern "C" void exit (int);' \
+ 'void exit (int);'
+do
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_declaration
+#include
+int
+main ()
+{
+exit (42);
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_cxx_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ :
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+continue
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_declaration
+int
+main ()
+{
+exit (42);
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_cxx_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ break
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
done
-if test -z "$ac_aux_dir"; then
- { echo "configure: error: can not find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." 1>&2; exit 1; }
+rm -f conftest*
+if test -n "$ac_declaration"; then
+ echo '#ifdef __cplusplus' >>confdefs.h
+ echo $ac_declaration >>confdefs.h
+ echo '#endif' >>confdefs.h
fi
-ac_config_guess=$ac_aux_dir/config.guess
-ac_config_sub=$ac_aux_dir/config.sub
-ac_configure=$ac_aux_dir/configure # This should be Cygnus configure.
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
# Find a good install program. We prefer a C program (faster),
# so one script is as good as another. But avoid the broken or
@@ -982,60 +2734,75 @@ ac_configure=$ac_aux_dir/configure # This should be Cygnus configure.
# SunOS /usr/etc/install
# IRIX /sbin/install
# AIX /bin/install
+# AmigaOS /C/install, which installs bootblocks on floppy discs
# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag
# AFS /usr/afsws/bin/install, which mishandles nonexistent args
# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
+# OS/2's system install, which has a completely different semantic
# ./install, which can be erroneously created by make from ./install.sh.
-echo $ac_n "checking for a BSD compatible install""... $ac_c" 1>&6
-echo "configure:991: checking for a BSD compatible install" >&5
+echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5
+echo $ECHO_N "checking for a BSD-compatible install... $ECHO_C" >&6
if test -z "$INSTALL"; then
-if eval "test \"`echo '$''{'ac_cv_path_install'+set}'`\" = set"; then
- echo $ac_n "(cached) $ac_c" 1>&6
-else
- IFS="${IFS= }"; ac_save_IFS="$IFS"; IFS=":"
- for ac_dir in $PATH; do
- # Account for people who put trailing slashes in PATH elements.
- case "$ac_dir/" in
- /|./|.//|/etc/*|/usr/sbin/*|/usr/etc/*|/sbin/*|/usr/afsws/bin/*|/usr/ucb/*) ;;
- *)
- # OSF1 and SCO ODT 3.0 have their own names for install.
- # Don't use installbsd from OSF since it installs stuff as root
- # by default.
- for ac_prog in ginstall scoinst install; do
- if test -f $ac_dir/$ac_prog; then
+if test "${ac_cv_path_install+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ # Account for people who put trailing slashes in PATH elements.
+case $as_dir/ in
+ ./ | .// | /cC/* | \
+ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \
+ ?:\\/os2\\/install\\/* | ?:\\/OS2\\/INSTALL\\/* | \
+ /usr/ucb/* ) ;;
+ *)
+ # OSF1 and SCO ODT 3.0 have their own names for install.
+ # Don't use installbsd from OSF since it installs stuff as root
+ # by default.
+ for ac_prog in ginstall scoinst install; do
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then
if test $ac_prog = install &&
- grep dspmsg $ac_dir/$ac_prog >/dev/null 2>&1; then
+ grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
# AIX install. It has an incompatible calling convention.
:
+ elif test $ac_prog = install &&
+ grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+ # program-specific install script used by HP pwplus--don't use.
+ :
else
- ac_cv_path_install="$ac_dir/$ac_prog -c"
- break 2
+ ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c"
+ break 3
fi
fi
done
- ;;
- esac
- done
- IFS="$ac_save_IFS"
+ done
+ ;;
+esac
+done
+
fi
if test "${ac_cv_path_install+set}" = set; then
- INSTALL="$ac_cv_path_install"
+ INSTALL=$ac_cv_path_install
else
# As a last resort, use the slow shell script. We don't cache a
# path for INSTALL within a source directory, because that will
# break other packages using the cache if that directory is
# removed, or if the path is relative.
- INSTALL="$ac_install_sh"
+ INSTALL=$ac_install_sh
fi
fi
-echo "$ac_t""$INSTALL" 1>&6
+echo "$as_me:$LINENO: result: $INSTALL" >&5
+echo "${ECHO_T}$INSTALL" >&6
# Use test -z because SunOS4 sh mishandles braces in ${var-val}.
# It thinks the first close brace ends the variable substitution.
test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}'
-test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL_PROGRAM}'
+test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}'
test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
@@ -1049,75 +2816,50 @@ if test "$srcdir" = "."; then
fi
#AC_CHECK_PROG(AUTOCONF, autoconf, autoconf, true)
-# Extract the first word of "strip", so it can be a program name with args.
-set dummy strip; ac_word=$2
-echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:1056: checking for $ac_word" >&5
-if eval "test \"`echo '$''{'ac_cv_prog_STRIP'+set}'`\" = set"; then
- echo $ac_n "(cached) $ac_c" 1>&6
-else
- if test -n "$STRIP"; then
- ac_cv_prog_STRIP="$STRIP" # Let the user override the test.
-else
- IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
- ac_dummy="$PATH"
- for ac_dir in $ac_dummy; do
- test -z "$ac_dir" && ac_dir=.
- if test -f $ac_dir/$ac_word; then
- ac_cv_prog_STRIP="strip"
- break
- fi
- done
- IFS="$ac_save_ifs"
- test -z "$ac_cv_prog_STRIP" && ac_cv_prog_STRIP="true"
-fi
-fi
-STRIP="$ac_cv_prog_STRIP"
-if test -n "$STRIP"; then
- echo "$ac_t""$STRIP" 1>&6
-else
- echo "$ac_t""no" 1>&6
-fi
-
+#AC_CHECK_PROG(STRIP, strip, strip, true)
for ac_prog in gmake gnumake
do
-# Extract the first word of "$ac_prog", so it can be a program name with args.
+ # Extract the first word of "$ac_prog", so it can be a program name with args.
set dummy $ac_prog; ac_word=$2
-echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:1089: checking for $ac_word" >&5
-if eval "test \"`echo '$''{'ac_cv_path_U_MAKE'+set}'`\" = set"; then
- echo $ac_n "(cached) $ac_c" 1>&6
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_path_U_MAKE+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
else
- case "$U_MAKE" in
- /*)
+ case $U_MAKE in
+ [\\/]* | ?:[\\/]*)
ac_cv_path_U_MAKE="$U_MAKE" # Let the user override the test with a path.
;;
- ?:/*)
- ac_cv_path_U_MAKE="$U_MAKE" # Let the user override the test with a dos path.
- ;;
*)
- IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
- ac_dummy="$PATH"
- for ac_dir in $ac_dummy; do
- test -z "$ac_dir" && ac_dir=.
- if test -f $ac_dir/$ac_word; then
- ac_cv_path_U_MAKE="$ac_dir/$ac_word"
- break
- fi
- done
- IFS="$ac_save_ifs"
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_path_U_MAKE="$as_dir/$ac_word$ac_exec_ext"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
;;
esac
fi
-U_MAKE="$ac_cv_path_U_MAKE"
+U_MAKE=$ac_cv_path_U_MAKE
+
if test -n "$U_MAKE"; then
- echo "$ac_t""$U_MAKE" 1>&6
+ echo "$as_me:$LINENO: result: $U_MAKE" >&5
+echo "${ECHO_T}$U_MAKE" >&6
else
- echo "$ac_t""no" 1>&6
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
fi
-test -n "$U_MAKE" && break
+ test -n "$U_MAKE" && break
done
test -n "$U_MAKE" || U_MAKE="make"
@@ -1125,188 +2867,94 @@ test -n "$U_MAKE" || U_MAKE="make"
# Extract the first word of "doxygen", so it can be a program name with args.
set dummy doxygen; ac_word=$2
-echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:1130: checking for $ac_word" >&5
-if eval "test \"`echo '$''{'ac_cv_path_DOXYGEN'+set}'`\" = set"; then
- echo $ac_n "(cached) $ac_c" 1>&6
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_path_DOXYGEN+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
else
- case "$DOXYGEN" in
- /*)
+ case $DOXYGEN in
+ [\\/]* | ?:[\\/]*)
ac_cv_path_DOXYGEN="$DOXYGEN" # Let the user override the test with a path.
;;
- ?:/*)
- ac_cv_path_DOXYGEN="$DOXYGEN" # Let the user override the test with a dos path.
- ;;
*)
- IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
- ac_dummy="$PATH:/usr/local/bin:/usr/bin"
- for ac_dir in $ac_dummy; do
- test -z "$ac_dir" && ac_dir=.
- if test -f $ac_dir/$ac_word; then
- ac_cv_path_DOXYGEN="$ac_dir/$ac_word"
- break
- fi
- done
- IFS="$ac_save_ifs"
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+as_dummy="$PATH:/usr/local/bin:/usr/bin"
+for as_dir in $as_dummy
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_path_DOXYGEN="$as_dir/$ac_word$ac_exec_ext"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
;;
esac
fi
-DOXYGEN="$ac_cv_path_DOXYGEN"
+DOXYGEN=$ac_cv_path_DOXYGEN
+
if test -n "$DOXYGEN"; then
- echo "$ac_t""$DOXYGEN" 1>&6
+ echo "$as_me:$LINENO: result: $DOXYGEN" >&5
+echo "${ECHO_T}$DOXYGEN" >&6
else
- echo "$ac_t""no" 1>&6
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
fi
-# Make sure we can run config.sub.
-if ${CONFIG_SHELL-/bin/sh} $ac_config_sub sun4 >/dev/null 2>&1; then :
-else { echo "configure: error: can not run $ac_config_sub" 1>&2; exit 1; }
-fi
-
-echo $ac_n "checking host system type""... $ac_c" 1>&6
-echo "configure:1170: checking host system type" >&5
-
-host_alias=$host
-case "$host_alias" in
-NONE)
- case $nonopt in
- NONE)
- if host_alias=`${CONFIG_SHELL-/bin/sh} $ac_config_guess`; then :
- else { echo "configure: error: can not guess host type; you must specify one" 1>&2; exit 1; }
- fi ;;
- *) host_alias=$nonopt ;;
- esac ;;
+case "${host}" in
+ *-*-cygwin*|*-*-mingw*)
+ if test "$GCC" != yes && test -n "`link --version 2>&1 | grep 'GNU coreutils'`"; then
+ { { echo "$as_me:$LINENO: error: link.exe is not a valid linker. Your PATH is incorrect.
+ Please follow the directions in ICU's readme." >&5
+echo "$as_me: error: link.exe is not a valid linker. Your PATH is incorrect.
+ Please follow the directions in ICU's readme." >&2;}
+ { (exit 1); exit 1; }; }
+ fi;;
+ *);;
esac
-host=`${CONFIG_SHELL-/bin/sh} $ac_config_sub $host_alias`
-host_cpu=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
-host_vendor=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
-host_os=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
-echo "$ac_t""$host" 1>&6
-
-echo $ac_n "checking for Cygwin environment""... $ac_c" 1>&6
-echo "configure:1191: checking for Cygwin environment" >&5
-if eval "test \"`echo '$''{'ac_cv_cygwin'+set}'`\" = set"; then
- echo $ac_n "(cached) $ac_c" 1>&6
-else
- cat > conftest.$ac_ext <&5; (eval $ac_compile) 2>&5; }; then
- rm -rf conftest*
- ac_cv_cygwin=yes
-else
- echo "configure: failed program was:" >&5
- cat conftest.$ac_ext >&5
- rm -rf conftest*
- ac_cv_cygwin=no
-fi
-rm -f conftest*
-rm -f conftest*
-fi
-
-echo "$ac_t""$ac_cv_cygwin" 1>&6
-CYGWIN=
-test "$ac_cv_cygwin" = yes && CYGWIN=yes
-echo $ac_n "checking for mingw32 environment""... $ac_c" 1>&6
-echo "configure:1224: checking for mingw32 environment" >&5
-if eval "test \"`echo '$''{'ac_cv_mingw32'+set}'`\" = set"; then
- echo $ac_n "(cached) $ac_c" 1>&6
-else
- cat > conftest.$ac_ext <&5; (eval $ac_compile) 2>&5; }; then
- rm -rf conftest*
- ac_cv_mingw32=yes
-else
- echo "configure: failed program was:" >&5
- cat conftest.$ac_ext >&5
- rm -rf conftest*
- ac_cv_mingw32=no
-fi
-rm -f conftest*
-rm -f conftest*
-fi
-
-echo "$ac_t""$ac_cv_mingw32" 1>&6
-MINGW32=
-test "$ac_cv_mingw32" = yes && MINGW32=yes
-
-
-echo $ac_n "checking for executable suffix""... $ac_c" 1>&6
-echo "configure:1255: checking for executable suffix" >&5
-if eval "test \"`echo '$''{'ac_cv_exeext'+set}'`\" = set"; then
- echo $ac_n "(cached) $ac_c" 1>&6
-else
- if test "$CYGWIN" = yes || test "$MINGW32" = yes; then
- ac_cv_exeext=.exe
-else
- rm -f conftest*
- echo 'int main () { return 0; }' > conftest.$ac_ext
- ac_cv_exeext=
- if { (eval echo configure:1265: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then
- for file in conftest.*; do
- case $file in
- *.c | *.o | *.obj) ;;
- *) ac_cv_exeext=`echo $file | sed -e s/conftest//` ;;
- esac
- done
- else
- { echo "configure: error: installation or configuration problem: compiler cannot create executables." 1>&2; exit 1; }
- fi
- rm -f conftest*
- test x"${ac_cv_exeext}" = x && ac_cv_exeext=no
-fi
-fi
-
-EXEEXT=""
-test x"${ac_cv_exeext}" != xno && EXEEXT=${ac_cv_exeext}
-echo "$ac_t""${ac_cv_exeext}" 1>&6
+echo "$as_me:$LINENO: checking checking for executable suffix" >&5
+echo $ECHO_N "checking checking for executable suffix... $ECHO_C" >&6
+case "${host}" in
+ *-*-cygwin*|*-*-mingw*) EXEEXT=.exe ;;
+ *) EXEEXT="" ;;
+esac
ac_exeext=$EXEEXT
+echo "$as_me:$LINENO: result: $EXEEXT" >&5
+echo "${ECHO_T}$EXEEXT" >&6
- echo $ac_n "checking whether strict compiling is on""... $ac_c" 1>&6
-echo "configure:1288: checking whether strict compiling is on" >&5
+ echo "$as_me:$LINENO: checking whether strict compiling is on" >&5
+echo $ECHO_N "checking whether strict compiling is on... $ECHO_C" >&6
# Check whether --enable-strict or --disable-strict was given.
if test "${enable_strict+set}" = set; then
enableval="$enable_strict"
-
+
if test "$enableval" = no
then
ac_use_strict_options=no
else
ac_use_strict_options=yes
fi
-
+
else
ac_use_strict_options=no
-fi
-
- echo "$ac_t""$ac_use_strict_options" 1>&6
+fi;
+ echo "$as_me:$LINENO: result: $ac_use_strict_options" >&5
+echo "${ECHO_T}$ac_use_strict_options" >&6
if test "$ac_use_strict_options" = yes
then
if test "$GCC" = yes
then
- CFLAGS="$CFLAGS -Wall -ansi -pedantic -Wshadow -Wpointer-arith -Wmissing-prototypes -Wwrite-strings -Winline -Wno-long-long"
+ CFLAGS="$CFLAGS -Wall -ansi -pedantic -Wshadow -Wpointer-arith -Wmissing-prototypes -Wwrite-strings -Wno-long-long"
case "${host}" in
*-*-solaris*)
CFLAGS="$CFLAGS -D__STDC__=0";;
@@ -1322,7 +2970,7 @@ fi
fi
if test "$GXX" = yes
then
- CXXFLAGS="$CXXFLAGS -W -Wall -ansi -pedantic -Wpointer-arith -Wmissing-prototypes -Wwrite-strings -Winline -Wno-long-long"
+ CXXFLAGS="$CXXFLAGS -W -Wall -ansi -pedantic -Wpointer-arith -Wwrite-strings -Wno-long-long"
case "${host}" in
*-*-solaris*)
CXXFLAGS="$CXXFLAGS -D__STDC__=0";;
@@ -1340,17 +2988,17 @@ fi
+
# Check whether --enable-64bit-libs or --disable-64bit-libs was given.
if test "${enable_64bit_libs+set}" = set; then
enableval="$enable_64bit_libs"
ENABLE_64BIT_LIBS=${enableval}
else
ENABLE_64BIT_LIBS=yes
-
-fi
- echo $ac_n "checking for 64-bit executable support""... $ac_c" 1>&6
-echo "configure:1354: checking for 64-bit executable support" >&5
+fi;
+ echo "$as_me:$LINENO: checking for 64-bit executable support" >&5
+echo $ECHO_N "checking for 64-bit executable support... $ECHO_C" >&6
if test "$ENABLE_64BIT_LIBS" != no; then
case "${host}" in
*-*-solaris*)
@@ -1404,8 +3052,60 @@ echo "configure:1354: checking for 64-bit executable support" >&5
ENABLE_64BIT_LIBS=no
fi
;;
+ x86_64-*-cygwin)
+ if test "$GCC" = yes; then
+ if test -n "`$CXX -dumpspecs 2>&1 && $CC -dumpspecs 2>&1 | grep -v __LP64__`"; then
+ ENABLE_64BIT_LIBS=yes
+ else
+ ENABLE_64BIT_LIBS=no
+ fi
+ else
+ ENABLE_64BIT_LIBS=no
+ OLD_CPPFLAGS="${CPPFLAGS}"
+ OLD_LDFLAGS="${LDFLAGS}"
+ CPPFLAGS="${CPPFLAGS} /DWIN64"
+ LDFLAGS="${LDFLAGS} /MACHINE:AMD64"
+ if test "$cross_compiling" = yes; then
+ ENABLE_64BIT_LIBS=no
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+int main(void) {return 0;}
+_ACEOF
+rm -f conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ENABLE_64BIT_LIBS=yes
+else
+ echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+( exit $ac_status )
+ENABLE_64BIT_LIBS=no
+fi
+rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+ if test "$ENABLE_64BIT_LIBS" = no; then
+ CPPFLAGS="${OLD_CPPFLAGS}"
+ LDFLAGS="${OLD_LDFLAGS}"
+ fi
+ fi
+ ;;
*-*-aix*|powerpc64-*-linux*)
- if test "$ac_cv_prog_gcc" = no; then
+ if test "$ac_cv_c_compiler_gnu" = no; then
# Note: Have not tested 64-bitness with gcc.
# Maybe the flag "-maix64" could be used with gcc?
OLD_CFLAGS="${CFLAGS}"
@@ -1417,23 +3117,36 @@ echo "configure:1354: checking for 64-bit executable support" >&5
if test "$cross_compiling" = yes; then
ENABLE_64BIT_LIBS=no
else
- cat > conftest.$ac_ext <conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
int main(void) {return 0;}
-EOF
-if { (eval echo configure:1426: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
-then
+_ACEOF
+rm -f conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
ENABLE_64BIT_LIBS=yes
else
- echo "configure: failed program was:" >&5
- cat conftest.$ac_ext >&5
- rm -fr conftest*
- ENABLE_64BIT_LIBS=no
+ echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+( exit $ac_status )
+ENABLE_64BIT_LIBS=no
fi
-rm -fr conftest*
+rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
fi
-
if test "$ENABLE_64BIT_LIBS" = no; then
CFLAGS="${OLD_CFLAGS}"
CXXFLAGS="${OLD_CXXFLAGS}"
@@ -1447,7 +3160,7 @@ fi
fi
;;
*-*-hpux*)
-
+
OLD_CFLAGS="${CFLAGS}"
OLD_CXXFLAGS="${CXXFLAGS}"
CFLAGS="${CFLAGS} +DD64"
@@ -1455,23 +3168,36 @@ fi
if test "$cross_compiling" = yes; then
ENABLE_64BIT_LIBS=no
else
- cat > conftest.$ac_ext <conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
int main(void) {return 0;}
-EOF
-if { (eval echo configure:1464: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
-then
+_ACEOF
+rm -f conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
ENABLE_64BIT_LIBS=yes
else
- echo "configure: failed program was:" >&5
- cat conftest.$ac_ext >&5
- rm -fr conftest*
- ENABLE_64BIT_LIBS=no
+ echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+( exit $ac_status )
+ENABLE_64BIT_LIBS=no
fi
-rm -fr conftest*
+rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
fi
-
if test "$ENABLE_64BIT_LIBS" = no; then
CFLAGS="${OLD_CFLAGS}"
CXXFLAGS="${OLD_CXXFLAGS}"
@@ -1480,57 +3206,161 @@ fi
if test "$cross_compiling" = yes; then
ENABLE_64BIT_LIBS=no
else
- cat > conftest.$ac_ext <conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
int main(void) {return 0;}
-EOF
-if { (eval echo configure:1489: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
-then
+_ACEOF
+rm -f conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
ENABLE_64BIT_LIBS=yes
else
- echo "configure: failed program was:" >&5
- cat conftest.$ac_ext >&5
- rm -fr conftest*
- ENABLE_64BIT_LIBS=no
+ echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+( exit $ac_status )
+ENABLE_64BIT_LIBS=no
fi
-rm -fr conftest*
+rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
fi
-
if test "$ENABLE_64BIT_LIBS" = no; then
CFLAGS="${OLD_CFLAGS}"
CXXFLAGS="${OLD_CXXFLAGS}"
fi
fi
;;
+ *-*ibm-openedition*|*-*-os390*)
+ OLD_CFLAGS="${CFLAGS}"
+ OLD_CXXFLAGS="${CXXFLAGS}"
+ OLD_LDFLAGS="${LDFLAGS}"
+ CFLAGS="${CFLAGS} -Wc,lp64"
+ CXXFLAGS="${CXXFLAGS} -Wc,lp64"
+ LDFLAGS="${LDFLAGS} -Wl,lp64"
+ if test "$cross_compiling" = yes; then
+ ENABLE_64BIT_LIBS=no
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+int main(void) {return 0;}
+_ACEOF
+rm -f conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ENABLE_64BIT_LIBS=yes
+else
+ echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+( exit $ac_status )
+ENABLE_64BIT_LIBS=no
+fi
+rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+ if test "$ENABLE_64BIT_LIBS" = no; then
+ CFLAGS="${OLD_CFLAGS}"
+ CXXFLAGS="${OLD_CXXFLAGS}"
+ LDFLAGS="${OLD_LDFLAGS}"
+ fi
+ ;;
*)
ENABLE_64BIT_LIBS=no
;;
esac
+ else
+ if test "$GCC" = yes; then
+ OLD_CFLAGS="${CFLAGS}"
+ OLD_CXXFLAGS="${CXXFLAGS}"
+ CFLAGS="${CFLAGS} -m32"
+ CXXFLAGS="${CXXFLAGS} -m32"
+ if test "$cross_compiling" = yes; then
+ ENABLE_64BIT_LIBS=yes
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+int main(void) {return 0;}
+_ACEOF
+rm -f conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ENABLE_64BIT_LIBS=no
+else
+ echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+( exit $ac_status )
+ENABLE_64BIT_LIBS=yes
+fi
+rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+ if test "$ENABLE_64BIT_LIBS" = yes; then
+ CFLAGS="${OLD_CFLAGS}"
+ CXXFLAGS="${OLD_CXXFLAGS}"
+ fi
+ fi
fi
- echo "$ac_t""$ENABLE_64BIT_LIBS" 1>&6
+ echo "$as_me:$LINENO: result: $ENABLE_64BIT_LIBS" >&5
+echo "${ECHO_T}$ENABLE_64BIT_LIBS" >&6
- echo $ac_n "checking which Makefile fragment to use""... $ac_c" 1>&6
-echo "configure:1519: checking which Makefile fragment to use" >&5
-if eval "test \"`echo '$''{'icu_cv_host_frag'+set}'`\" = set"; then
- echo $ac_n "(cached) $ac_c" 1>&6
+ echo "$as_me:$LINENO: checking which Makefile fragment to use" >&5
+echo $ECHO_N "checking which Makefile fragment to use... $ECHO_C" >&6
+if test "${icu_cv_host_frag+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
else
-
+
case "${host}" in
*-*-solaris*)
- if test "$GCC" = yes; then
- icu_cv_host_frag=mh-solaris-gcc
+ if test "$GCC" = yes; then
+ icu_cv_host_frag=mh-solaris-gcc
else
icu_cv_host_frag=mh-solaris
fi ;;
alpha*-*-linux-gnu)
if test "$GCC" = yes; then
icu_cv_host_frag=mh-alpha-linux-gcc
- else
+ else
icu_cv_host_frag=mh-alpha-linux-cc
fi ;;
powerpc*-*-linux*)
@@ -1552,7 +3382,7 @@ powerpc*-*-linux*)
else
icu_cv_host_frag=mh-cygwin-msvc
fi ;;
-*-*-*bsd*) icu_cv_host_frag=mh-bsd-gcc ;;
+*-*-*bsd*|*-*-dragonfly*) icu_cv_host_frag=mh-bsd-gcc ;;
*-*-aix*)
if test "$GCC" = yes; then
icu_cv_host_frag=mh-aix-gcc
@@ -1581,111 +3411,165 @@ powerpc*-*-linux*)
*-dec-osf*) icu_cv_host_frag=mh-alpha-osf ;;
*-*-nto*) icu_cv_host_frag=mh-qnx ;;
*-ncr-*) icu_cv_host_frag=mh-mpras ;;
-*-sequent-*) icu_cv_host_frag=mh-ptx ;;
*) icu_cv_host_frag=mh-unknown ;;
esac
-
-
-fi
-echo "$ac_t""$icu_cv_host_frag" 1>&6
+
+fi
+echo "$as_me:$LINENO: result: $icu_cv_host_frag" >&5
+echo "${ECHO_T}$icu_cv_host_frag" >&6
case "${host}" in
- *-*-hpux*) echo $ac_n "checking for floor in -lm""... $ac_c" 1>&6
-echo "configure:1597: checking for floor in -lm" >&5
-ac_lib_var=`echo m'_'floor | sed 'y%./+-%__p_%'`
-if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
- echo $ac_n "(cached) $ac_c" 1>&6
+ *-*-hpux*) echo "$as_me:$LINENO: checking for floor in -lm" >&5
+echo $ECHO_N "checking for floor in -lm... $ECHO_C" >&6
+if test "${ac_cv_lib_m_floor+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
else
- ac_save_LIBS="$LIBS"
+ ac_check_lib_save_LIBS=$LIBS
LIBS="-lm $LIBS"
-cat > conftest.$ac_ext <conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+#endif
/* We use char because int might match the return type of a gcc2
- builtin and then its argument prototype would still apply. */
-char floor();
-
-int main() {
-floor()
-; return 0; }
-EOF
-if { (eval echo configure:1616: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
- rm -rf conftest*
- eval "ac_cv_lib_$ac_lib_var=yes"
-else
- echo "configure: failed program was:" >&5
- cat conftest.$ac_ext >&5
- rm -rf conftest*
- eval "ac_cv_lib_$ac_lib_var=no"
-fi
-rm -f conftest*
-LIBS="$ac_save_LIBS"
-
-fi
-if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
- echo "$ac_t""yes" 1>&6
+ builtin and then its argument prototype would still apply. */
+char floor ();
+int
+main ()
+{
+floor ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_lib_m_floor=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_lib_m_floor=no
+fi
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:$LINENO: result: $ac_cv_lib_m_floor" >&5
+echo "${ECHO_T}$ac_cv_lib_m_floor" >&6
+if test $ac_cv_lib_m_floor = yes; then
LIB_M="-lm"
-else
- echo "$ac_t""no" 1>&6
fi
;;
-
- *) echo $ac_n "checking for floor in -lm""... $ac_c" 1>&6
-echo "configure:1638: checking for floor in -lm" >&5
-ac_lib_var=`echo m'_'floor | sed 'y%./+-%__p_%'`
-if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
- echo $ac_n "(cached) $ac_c" 1>&6
-else
- ac_save_LIBS="$LIBS"
+
+ *)
+echo "$as_me:$LINENO: checking for floor in -lm" >&5
+echo $ECHO_N "checking for floor in -lm... $ECHO_C" >&6
+if test "${ac_cv_lib_m_floor+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
LIBS="-lm $LIBS"
-cat > conftest.$ac_ext <conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+#endif
/* We use char because int might match the return type of a gcc2
- builtin and then its argument prototype would still apply. */
-char floor();
-
-int main() {
-floor()
-; return 0; }
-EOF
-if { (eval echo configure:1657: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
- rm -rf conftest*
- eval "ac_cv_lib_$ac_lib_var=yes"
-else
- echo "configure: failed program was:" >&5
- cat conftest.$ac_ext >&5
- rm -rf conftest*
- eval "ac_cv_lib_$ac_lib_var=no"
-fi
-rm -f conftest*
-LIBS="$ac_save_LIBS"
-
-fi
-if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
- echo "$ac_t""yes" 1>&6
- ac_tr_lib=HAVE_LIB`echo m | sed -e 's/[^a-zA-Z0-9_]/_/g' \
- -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'`
- cat >> confdefs.h <&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_lib_m_floor=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_lib_m_floor=no
+fi
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:$LINENO: result: $ac_cv_lib_m_floor" >&5
+echo "${ECHO_T}$ac_cv_lib_m_floor" >&6
+if test $ac_cv_lib_m_floor = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_LIBM 1
+_ACEOF
LIBS="-lm $LIBS"
-else
- echo "$ac_t""no" 1>&6
fi
-
+
LIB_M="" ;;
esac
-echo $ac_n "checking whether to build shared libraries""... $ac_c" 1>&6
-echo "configure:1689: checking whether to build shared libraries" >&5
+echo "$as_me:$LINENO: checking whether to build shared libraries" >&5
+echo $ECHO_N "checking whether to build shared libraries... $ECHO_C" >&6
enabled=no
# Check whether --enable-shared or --disable-shared was given.
if test "${enable_shared+set}" = set; then
@@ -1698,13 +3582,13 @@ if test "${enable_shared+set}" = set; then
else
enabled=yes; ENABLE_SHARED=YES
-fi
-
-echo "$ac_t""$enabled" 1>&6
+fi;
+echo "$as_me:$LINENO: result: $enabled" >&5
+echo "${ECHO_T}$enabled" >&6
-echo $ac_n "checking whether to build static libraries""... $ac_c" 1>&6
-echo "configure:1708: checking whether to build static libraries" >&5
+echo "$as_me:$LINENO: checking whether to build static libraries" >&5
+echo $ECHO_N "checking whether to build static libraries... $ECHO_C" >&6
enabled=no
# Check whether --enable-static or --disable-static was given.
if test "${enable_static+set}" = set; then
@@ -1714,13 +3598,13 @@ if test "${enable_static+set}" = set; then
no) ;;
*) ;;
esac
-fi
-
-echo "$ac_t""$enabled" 1>&6
+fi;
+echo "$as_me:$LINENO: result: $enabled" >&5
+echo "${ECHO_T}$enabled" >&6
-echo $ac_n "checking whether to build debug libraries""... $ac_c" 1>&6
-echo "configure:1724: checking whether to build debug libraries" >&5
+echo "$as_me:$LINENO: checking whether to build debug libraries" >&5
+echo $ECHO_N "checking whether to build debug libraries... $ECHO_C" >&6
enabled=no
ENABLE_DEBUG=0
# Check whether --enable-debug or --disable-debug was given.
@@ -1730,96 +3614,170 @@ if test "${enable_debug+set}" = set; then
yes|"") enabled=yes; ENABLE_DEBUG=1 ;;
*) ;;
esac
-fi
+fi;
+echo "$as_me:$LINENO: result: $enabled" >&5
+echo "${ECHO_T}$enabled" >&6
-echo "$ac_t""$enabled" 1>&6
-
-echo $ac_n "checking whether to build release libraries""... $ac_c" 1>&6
-echo "configure:1740: checking whether to build release libraries" >&5
+echo "$as_me:$LINENO: checking whether to build release libraries" >&5
+echo $ECHO_N "checking whether to build release libraries... $ECHO_C" >&6
enabled=yes
ENABLE_RELEASE=1
# Check whether --enable-release or --disable-release was given.
if test "${enable_release+set}" = set; then
enableval="$enable_release"
case "${enableval}" in
- no) enabled=no; ENABLE_RELEASE=0 ;;
+ no) enabled=no; ENABLE_RELEASE=0 ;;
+ *) ;;
+ esac
+fi;
+echo "$as_me:$LINENO: result: $enabled" >&5
+echo "${ECHO_T}$enabled" >&6
+
+
+echo "$as_me:$LINENO: checking whether to enable draft APIs" >&5
+echo $ECHO_N "checking whether to enable draft APIs... $ECHO_C" >&6
+enabled=yes
+U_DEFAULT_SHOW_DRAFT=1
+# Check whether --enable-draft or --disable-draft was given.
+if test "${enable_draft+set}" = set; then
+ enableval="$enable_draft"
+ case "${enableval}" in
+ no) enabled=no; U_DEFAULT_SHOW_DRAFT=0 ;;
*) ;;
esac
+fi;
+echo "$as_me:$LINENO: result: $enabled" >&5
+echo "${ECHO_T}$enabled" >&6
+if test "$U_DEFAULT_SHOW_DRAFT" = 0; then
+ CPPFLAGS="$CPPFLAGS -DU_SHOW_DRAFT_API"
fi
-echo "$ac_t""$enabled" 1>&6
-
-# Extract the first word of "ranlib", so it can be a program name with args.
-set dummy ranlib; ac_word=$2
-echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:1758: checking for $ac_word" >&5
-if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then
- echo $ac_n "(cached) $ac_c" 1>&6
+if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args.
+set dummy ${ac_tool_prefix}ranlib; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_RANLIB+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
else
if test -n "$RANLIB"; then
ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test.
else
- IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
- ac_dummy="$PATH"
- for ac_dir in $ac_dummy; do
- test -z "$ac_dir" && ac_dir=.
- if test -f $ac_dir/$ac_word; then
- ac_cv_prog_RANLIB="ranlib"
- break
- fi
- done
- IFS="$ac_save_ifs"
- test -z "$ac_cv_prog_RANLIB" && ac_cv_prog_RANLIB=":"
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
fi
fi
-RANLIB="$ac_cv_prog_RANLIB"
+RANLIB=$ac_cv_prog_RANLIB
if test -n "$RANLIB"; then
- echo "$ac_t""$RANLIB" 1>&6
+ echo "$as_me:$LINENO: result: $RANLIB" >&5
+echo "${ECHO_T}$RANLIB" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+fi
+if test -z "$ac_cv_prog_RANLIB"; then
+ ac_ct_RANLIB=$RANLIB
+ # Extract the first word of "ranlib", so it can be a program name with args.
+set dummy ranlib; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_RANLIB+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
else
- echo "$ac_t""no" 1>&6
+ if test -n "$ac_ct_RANLIB"; then
+ ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_RANLIB="ranlib"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+ test -z "$ac_cv_prog_ac_ct_RANLIB" && ac_cv_prog_ac_ct_RANLIB=":"
+fi
+fi
+ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB
+if test -n "$ac_ct_RANLIB"; then
+ echo "$as_me:$LINENO: result: $ac_ct_RANLIB" >&5
+echo "${ECHO_T}$ac_ct_RANLIB" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ RANLIB=$ac_ct_RANLIB
+else
+ RANLIB="$ac_cv_prog_RANLIB"
fi
# Extract the first word of "ar", so it can be a program name with args.
set dummy ar; ac_word=$2
-echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:1788: checking for $ac_word" >&5
-if eval "test \"`echo '$''{'ac_cv_path_AR'+set}'`\" = set"; then
- echo $ac_n "(cached) $ac_c" 1>&6
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_path_AR+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
else
- case "$AR" in
- /*)
+ case $AR in
+ [\\/]* | ?:[\\/]*)
ac_cv_path_AR="$AR" # Let the user override the test with a path.
;;
- ?:/*)
- ac_cv_path_AR="$AR" # Let the user override the test with a dos path.
- ;;
*)
- IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
- ac_dummy="$PATH:/bin:/usr/bin:/usr/ccs/bin"
- for ac_dir in $ac_dummy; do
- test -z "$ac_dir" && ac_dir=.
- if test -f $ac_dir/$ac_word; then
- ac_cv_path_AR="$ac_dir/$ac_word"
- break
- fi
- done
- IFS="$ac_save_ifs"
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+as_dummy="$PATH:/bin:/usr/bin:/usr/ccs/bin"
+for as_dir in $as_dummy
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_path_AR="$as_dir/$ac_word$ac_exec_ext"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
test -z "$ac_cv_path_AR" && ac_cv_path_AR="echo archiver ar not found re-run configure ; false"
;;
esac
fi
-AR="$ac_cv_path_AR"
+AR=$ac_cv_path_AR
+
if test -n "$AR"; then
- echo "$ac_t""$AR" 1>&6
+ echo "$as_me:$LINENO: result: $AR" >&5
+echo "${ECHO_T}$AR" >&6
else
- echo "$ac_t""no" 1>&6
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
fi
-echo $ac_n "checking whether to enable renaming of symbols""... $ac_c" 1>&6
-echo "configure:1823: checking whether to enable renaming of symbols" >&5
+echo "$as_me:$LINENO: checking whether to enable renaming of symbols" >&5
+echo $ECHO_N "checking whether to enable renaming of symbols... $ECHO_C" >&6
enabled=yes
U_DISABLE_RENAMING=0
# Check whether --enable-renaming or --disable-renaming was given.
@@ -1830,13 +3788,13 @@ if test "${enable_renaming+set}" = set; then
no) enabled=no; U_DISABLE_RENAMING=1 ;;
*) ;;
esac
-fi
+fi;
+echo "$as_me:$LINENO: result: $enabled" >&5
+echo "${ECHO_T}$enabled" >&6
-echo "$ac_t""$enabled" 1>&6
-
-echo $ac_n "checking whether to enable function and data tracing""... $ac_c" 1>&6
-echo "configure:1840: checking whether to enable function and data tracing" >&5
+echo "$as_me:$LINENO: checking whether to enable function and data tracing" >&5
+echo $ECHO_N "checking whether to enable function and data tracing... $ECHO_C" >&6
enabled=yes
U_ENABLE_TRACING=1
# Check whether --enable-tracing or --disable-tracing was given.
@@ -1847,9 +3805,9 @@ if test "${enable_tracing+set}" = set; then
no) enabled=no; U_ENABLE_TRACING=0 ;;
*) ;;
esac
-fi
-
-echo "$ac_t""$enabled" 1>&6
+fi;
+echo "$as_me:$LINENO: result: $enabled" >&5
+echo "${ECHO_T}$enabled" >&6
# Check whether --enable-rpath or --disable-rpath was given.
@@ -1863,39 +3821,66 @@ if test "${enable_rpath+set}" = set; then
else
ENABLE_RPATH=NO
-fi
-
+fi;
-echo $ac_n "checking for definition of U_INLINE for C""... $ac_c" 1>&6
-echo "configure:1873: checking for definition of U_INLINE for C" >&5
-if eval "test \"`echo '$''{'ac_cv_c_inline'+set}'`\" = set"; then
- echo $ac_n "(cached) $ac_c" 1>&6
+echo "$as_me:$LINENO: checking for definition of U_INLINE for C" >&5
+echo $ECHO_N "checking for definition of U_INLINE for C... $ECHO_C" >&6
+if test "${ac_cv_c_inline+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
else
ac_cv_c_inline=no
for ac_kw in inline __inline__ __inline; do
- cat > conftest.$ac_ext <conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+int
+main ()
+{
return 0;} $ac_kw int foo() {
-; return 0; }
-EOF
-if { (eval echo configure:1887: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
- rm -rf conftest*
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
ac_cv_c_inline=$ac_kw; break
else
- echo "configure: failed program was:" >&5
- cat conftest.$ac_ext >&5
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
fi
-rm -f conftest*
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
done
-
-fi
-echo "$ac_t""$ac_cv_c_inline" 1>&6
+fi
+echo "$as_me:$LINENO: result: $ac_cv_c_inline" >&5
+echo "${ECHO_T}$ac_cv_c_inline" >&6
case "$ac_cv_c_inline" in
yes) U_INLINE= "inline" ;;
no ) U_INLINE= ;;
@@ -1911,12 +3896,13 @@ if test "${enable_threads+set}" = set; then
case "${enableval}" in
yes) threads=true ;;
no) threads=false ;;
- *) { echo "configure: error: bad value ${enableval} for --enable-threads" 1>&2; exit 1; } ;;
+ *) { { echo "$as_me:$LINENO: error: bad value ${enableval} for --enable-threads" >&5
+echo "$as_me: error: bad value ${enableval} for --enable-threads" >&2;}
+ { (exit 1); exit 1; }; } ;;
esac
else
threads=true
-fi
-
+fi;
if test "$threads" = true; then
THREADS_TRUE=
@@ -1927,421 +3913,1140 @@ fi
ICU_USE_THREADS=0
if test $threads = true; then
-
- echo $ac_n "checking for pthread_attr_init in -lpthread""... $ac_c" 1>&6
-echo "configure:1933: checking for pthread_attr_init in -lpthread" >&5
-ac_lib_var=`echo pthread'_'pthread_attr_init | sed 'y%./+-%__p_%'`
-if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
- echo $ac_n "(cached) $ac_c" 1>&6
-else
- ac_save_LIBS="$LIBS"
+
+
+echo "$as_me:$LINENO: checking for pthread_attr_init in -lpthread" >&5
+echo $ECHO_N "checking for pthread_attr_init in -lpthread... $ECHO_C" >&6
+if test "${ac_cv_lib_pthread_pthread_attr_init+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
LIBS="-lpthread $LIBS"
-cat > conftest.$ac_ext <conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+#endif
/* We use char because int might match the return type of a gcc2
- builtin and then its argument prototype would still apply. */
-char pthread_attr_init();
-
-int main() {
-pthread_attr_init()
-; return 0; }
-EOF
-if { (eval echo configure:1952: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
- rm -rf conftest*
- eval "ac_cv_lib_$ac_lib_var=yes"
-else
- echo "configure: failed program was:" >&5
- cat conftest.$ac_ext >&5
- rm -rf conftest*
- eval "ac_cv_lib_$ac_lib_var=no"
-fi
-rm -f conftest*
-LIBS="$ac_save_LIBS"
-
-fi
-if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
- echo "$ac_t""yes" 1>&6
- ac_tr_lib=HAVE_LIB`echo pthread | sed -e 's/[^a-zA-Z0-9_]/_/g' \
- -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'`
- cat >> confdefs.h <&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_lib_pthread_pthread_attr_init=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_lib_pthread_pthread_attr_init=no
+fi
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:$LINENO: result: $ac_cv_lib_pthread_pthread_attr_init" >&5
+echo "${ECHO_T}$ac_cv_lib_pthread_pthread_attr_init" >&6
+if test $ac_cv_lib_pthread_pthread_attr_init = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_LIBPTHREAD 1
+_ACEOF
LIBS="-lpthread $LIBS"
-else
- echo "$ac_t""no" 1>&6
fi
if test $ac_cv_lib_pthread_pthread_attr_init = yes; then
- ICU_USE_THREADS=1
+ ICU_USE_THREADS=1
else
-
-
-echo $ac_n "checking for library containing pthread_mutex_destroy""... $ac_c" 1>&6
-echo "configure:1985: checking for library containing pthread_mutex_destroy" >&5
-if eval "test \"`echo '$''{'ac_cv_search_pthread_mutex_destroy'+set}'`\" = set"; then
- echo $ac_n "(cached) $ac_c" 1>&6
+
+
+echo "$as_me:$LINENO: checking for library containing pthread_mutex_destroy" >&5
+echo $ECHO_N "checking for library containing pthread_mutex_destroy... $ECHO_C" >&6
+if test "${ac_cv_search_pthread_mutex_destroy+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
else
ac_func_search_save_LIBS="$LIBS"
ac_cv_search_pthread_mutex_destroy="no"
for i in pthread pthreads c_r ; do
LIBS="-l$i $ac_func_search_save_LIBS"
-cat > conftest.$ac_ext <conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+#endif
/* We use char because int might match the return type of a gcc2
- builtin and then its argument prototype would still apply. */
-char pthread_mutex_destroy();
-
-int main() {
-pthread_mutex_destroy()
-; return 0; }
-EOF
-if { (eval echo configure:2005: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
- rm -rf conftest*
+ builtin and then its argument prototype would still apply. */
+char pthread_mutex_destroy ();
+int
+main ()
+{
+pthread_mutex_destroy ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
ac_cv_search_pthread_mutex_destroy="-l$i"
break
else
- echo "configure: failed program was:" >&5
- cat conftest.$ac_ext >&5
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
fi
-rm -f conftest*
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
done
if test "$ac_cv_search_pthread_mutex_destroy" = "no"; then
-cat > conftest.$ac_ext <conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+#endif
/* We use char because int might match the return type of a gcc2
- builtin and then its argument prototype would still apply. */
-char pthread_mutex_destroy();
-
-int main() {
-pthread_mutex_destroy()
-; return 0; }
-EOF
-if { (eval echo configure:2028: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
- rm -rf conftest*
+ builtin and then its argument prototype would still apply. */
+char pthread_mutex_destroy ();
+int
+main ()
+{
+pthread_mutex_destroy ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
ac_cv_search_pthread_mutex_destroy="none required"
else
- echo "configure: failed program was:" >&5
- cat conftest.$ac_ext >&5
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
fi
-rm -f conftest*
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
fi
LIBS="$ac_func_search_save_LIBS"
fi
-
-echo "$ac_t""$ac_cv_search_pthread_mutex_destroy" 1>&6
+echo "$as_me:$LINENO: result: $ac_cv_search_pthread_mutex_destroy" >&5
+echo "${ECHO_T}$ac_cv_search_pthread_mutex_destroy" >&6
if test "$ac_cv_search_pthread_mutex_destroy" != "no"; then
test "$ac_cv_search_pthread_mutex_destroy" = "none required" || LIBS="$ac_cv_search_pthread_mutex_destroy $LIBS"
-
+
else :
-
+
fi
- if test "$ac_cv_search_pthread_mutex_destroy" != no; then
- ICU_USE_THREADS=1
- else
- echo $ac_n "checking for pthread_mutex_init in -lpthread""... $ac_c" 1>&6
-echo "configure:2052: checking for pthread_mutex_init in -lpthread" >&5
-ac_lib_var=`echo pthread'_'pthread_mutex_init | sed 'y%./+-%__p_%'`
-if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
- echo $ac_n "(cached) $ac_c" 1>&6
-else
- ac_save_LIBS="$LIBS"
+ if test "$ac_cv_search_pthread_mutex_destroy" != no; then
+ ICU_USE_THREADS=1
+ else
+
+echo "$as_me:$LINENO: checking for pthread_mutex_init in -lpthread" >&5
+echo $ECHO_N "checking for pthread_mutex_init in -lpthread... $ECHO_C" >&6
+if test "${ac_cv_lib_pthread_pthread_mutex_init+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
LIBS="-lpthread $LIBS"
-cat > conftest.$ac_ext <conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char pthread_mutex_init ();
+int
+main ()
+{
+pthread_mutex_init ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_lib_pthread_pthread_mutex_init=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_lib_pthread_pthread_mutex_init=no
+fi
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:$LINENO: result: $ac_cv_lib_pthread_pthread_mutex_init" >&5
+echo "${ECHO_T}$ac_cv_lib_pthread_pthread_mutex_init" >&6
+if test $ac_cv_lib_pthread_pthread_mutex_init = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_LIBPTHREAD 1
+_ACEOF
+
+ LIBS="-lpthread $LIBS"
+
+fi
+
+ if test $ac_cv_lib_pthread_pthread_mutex_init = yes; then
+ ICU_USE_THREADS=1
+ fi
+ fi
+
+ echo "$as_me:$LINENO: checking for pthread_mutex_lock" >&5
+echo $ECHO_N "checking for pthread_mutex_lock... $ECHO_C" >&6
+if test "${ac_cv_func_pthread_mutex_lock+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+/* Define pthread_mutex_lock to an innocuous variant, in case declares pthread_mutex_lock.
+ For example, HP-UX 11i declares gettimeofday. */
+#define pthread_mutex_lock innocuous_pthread_mutex_lock
+
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char pthread_mutex_lock (); below.
+ Prefer to if __STDC__ is defined, since
+ exists even on freestanding compilers. */
+
+#ifdef __STDC__
+# include
+#else
+# include
+#endif
+
+#undef pthread_mutex_lock
+
/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+{
+#endif
/* We use char because int might match the return type of a gcc2
- builtin and then its argument prototype would still apply. */
-char pthread_mutex_init();
-
-int main() {
-pthread_mutex_init()
-; return 0; }
-EOF
-if { (eval echo configure:2071: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
- rm -rf conftest*
- eval "ac_cv_lib_$ac_lib_var=yes"
-else
- echo "configure: failed program was:" >&5
- cat conftest.$ac_ext >&5
- rm -rf conftest*
- eval "ac_cv_lib_$ac_lib_var=no"
+ builtin and then its argument prototype would still apply. */
+char pthread_mutex_lock ();
+/* The GNU C library defines this for functions which it implements
+ to always fail with ENOSYS. Some functions are actually named
+ something starting with __ and the normal name is an alias. */
+#if defined (__stub_pthread_mutex_lock) || defined (__stub___pthread_mutex_lock)
+choke me
+#else
+char (*f) () = pthread_mutex_lock;
+#endif
+#ifdef __cplusplus
+}
+#endif
+
+int
+main ()
+{
+return f != pthread_mutex_lock;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_func_pthread_mutex_lock=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_func_pthread_mutex_lock=no
+fi
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_func_pthread_mutex_lock" >&5
+echo "${ECHO_T}$ac_cv_func_pthread_mutex_lock" >&6
+
+
+ if test $ac_cv_func_pthread_mutex_lock = yes; then
+ ICU_USE_THREADS=1
+ fi
+ fi
+ case "${host}" in
+ *-pc-cygwin*|*-pc-mingw*)
+ ICU_USE_THREADS=1
+ if test "$ac_cv_c_compiler_gnu" = no; then
+ ICU_USE_THREADS=1
+ if test $ENABLE_DEBUG = 1; then
+ CFLAGS="${CFLAGS} /MDd"
+ CXXFLAGS="${CXXFLAGS} /MDd"
+ else
+ CFLAGS="${CFLAGS} /MD"
+ CXXFLAGS="${CXXFLAGS} /MD"
+ fi
+ fi ;;
+ *-*-hpux*)
+ case "${icu_cv_host_frag}" in
+ mh-hpux-acc)
+ OLD_CXXFLAGS="${CXXFLAGS}"
+ CXXFLAGS="${CXXFLAGS} -mt"
+ if test x"`${CXX} ${CXXFLAGS} 2>&1`" != x""; then
+ CXXFLAGS="${OLD_CXXFLAGS}"
+ fi
+ ;;
+ esac
+ ;;
+ esac
+fi
+
+
+
+
+# The AC_FUNC_MMAP macro doesn't work properly. It seems to be too specific.
+# Do this check instead.
+HAVE_MMAP=0
+echo "$as_me:$LINENO: checking for mmap" >&5
+echo $ECHO_N "checking for mmap... $ECHO_C" >&6
+if test "${ac_cv_func_mmap_ok+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+#include
+#include
+#include
+#include
+
+int
+main ()
+{
+ mmap((void *)0, 0, PROT_READ, 0, 0, 0);
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_func_mmap_ok=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_func_mmap_ok=no
+fi
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+
+echo "$as_me:$LINENO: result: $ac_cv_func_mmap_ok" >&5
+echo "${ECHO_T}$ac_cv_func_mmap_ok" >&6
+if test $ac_cv_func_mmap_ok = yes
+then
+ HAVE_MMAP=1
+fi
+
+
+GENCCODE_ASSEMBLY=
+case "${host}" in
+i*86-*-linux*|x86_64-*-linux*|powerpc*-*-linux*|i*86-*-*bsd*|i*86-*-solaris*)
+ if test "$GCC" = yes; then
+ GENCCODE_ASSEMBLY="-a gcc"
+ fi ;;
+sparc-*-solaris*)
+ GENCCODE_ASSEMBLY="-a sun"
+ ;;
+esac
+
+
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+echo "$as_me:$LINENO: checking how to run the C preprocessor" >&5
+echo $ECHO_N "checking how to run the C preprocessor... $ECHO_C" >&6
+# On Suns, sometimes $CPP names a directory.
+if test -n "$CPP" && test -d "$CPP"; then
+ CPP=
+fi
+if test -z "$CPP"; then
+ if test "${ac_cv_prog_CPP+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ # Double quotes because CPP needs to be expanded
+ for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp"
+ do
+ ac_preproc_ok=false
+for ac_c_preproc_warn_flag in '' yes
+do
+ # Use a header file that comes with gcc, so configuring glibc
+ # with a fresh cross-compiler works.
+ # Prefer to if __STDC__ is defined, since
+ # exists even on freestanding compilers.
+ # On the NeXT, cc -E runs the code through the compiler's parser,
+ # not just through cpp. "Syntax error" is here to catch this case.
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#ifdef __STDC__
+# include
+#else
+# include
+#endif
+ Syntax error
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+ (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_c_preproc_warn_flag
+ ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ :
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.$ac_ext
+
+ # OK, works on sane cases. Now check whether non-existent headers
+ # can be detected and how.
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+ (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_c_preproc_warn_flag
+ ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ # Broken: success on invalid input.
+continue
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then
+ break
+fi
+
+ done
+ ac_cv_prog_CPP=$CPP
+
+fi
+ CPP=$ac_cv_prog_CPP
+else
+ ac_cv_prog_CPP=$CPP
+fi
+echo "$as_me:$LINENO: result: $CPP" >&5
+echo "${ECHO_T}$CPP" >&6
+ac_preproc_ok=false
+for ac_c_preproc_warn_flag in '' yes
+do
+ # Use a header file that comes with gcc, so configuring glibc
+ # with a fresh cross-compiler works.
+ # Prefer to if __STDC__ is defined, since
+ # exists even on freestanding compilers.
+ # On the NeXT, cc -E runs the code through the compiler's parser,
+ # not just through cpp. "Syntax error" is here to catch this case.
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#ifdef __STDC__
+# include
+#else
+# include
+#endif
+ Syntax error
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+ (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_c_preproc_warn_flag
+ ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ :
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.$ac_ext
+
+ # OK, works on sane cases. Now check whether non-existent headers
+ # can be detected and how.
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+ (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_c_preproc_warn_flag
+ ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ # Broken: success on invalid input.
+continue
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then
+ :
+else
+ { { echo "$as_me:$LINENO: error: C preprocessor \"$CPP\" fails sanity check
+See \`config.log' for more details." >&5
+echo "$as_me: error: C preprocessor \"$CPP\" fails sanity check
+See \`config.log' for more details." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+echo "$as_me:$LINENO: checking for egrep" >&5
+echo $ECHO_N "checking for egrep... $ECHO_C" >&6
+if test "${ac_cv_prog_egrep+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if echo a | (grep -E '(a|b)') >/dev/null 2>&1
+ then ac_cv_prog_egrep='grep -E'
+ else ac_cv_prog_egrep='egrep'
+ fi
+fi
+echo "$as_me:$LINENO: result: $ac_cv_prog_egrep" >&5
+echo "${ECHO_T}$ac_cv_prog_egrep" >&6
+ EGREP=$ac_cv_prog_egrep
+
+
+echo "$as_me:$LINENO: checking for ANSI C header files" >&5
+echo $ECHO_N "checking for ANSI C header files... $ECHO_C" >&6
+if test "${ac_cv_header_stdc+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include
+#include
+#include
+#include
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_header_stdc=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_header_stdc=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+if test $ac_cv_header_stdc = yes; then
+ # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "memchr" >/dev/null 2>&1; then
+ :
+else
+ ac_cv_header_stdc=no
fi
rm -f conftest*
-LIBS="$ac_save_LIBS"
fi
-if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
- echo "$ac_t""yes" 1>&6
- ac_tr_lib=HAVE_LIB`echo pthread | sed -e 's/[^a-zA-Z0-9_]/_/g' \
- -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'`
- cat >> confdefs.h <conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "free" >/dev/null 2>&1; then
+ :
else
- echo "$ac_t""no" 1>&6
+ ac_cv_header_stdc=no
fi
+rm -f conftest*
- if test $ac_cv_lib_pthread_pthread_mutex_init = yes; then
- ICU_USE_THREADS=1
- fi
- fi
+fi
- echo $ac_n "checking for pthread_mutex_lock""... $ac_c" 1>&6
-echo "configure:2104: checking for pthread_mutex_lock" >&5
-if eval "test \"`echo '$''{'ac_cv_func_pthread_mutex_lock'+set}'`\" = set"; then
- echo $ac_n "(cached) $ac_c" 1>&6
+if test $ac_cv_header_stdc = yes; then
+ # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.
+ if test "$cross_compiling" = yes; then
+ :
else
- cat > conftest.$ac_ext <
-/* Override any gcc2 internal prototype to avoid an error. */
-/* We use char because int might match the return type of a gcc2
- builtin and then its argument prototype would still apply. */
-char pthread_mutex_lock();
-
-int main() {
-
-/* The GNU C library defines this for functions which it implements
- to always fail with ENOSYS. Some functions are actually named
- something starting with __ and the normal name is an alias. */
-#if defined (__stub_pthread_mutex_lock) || defined (__stub___pthread_mutex_lock)
-choke me
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include
+#if ((' ' & 0x0FF) == 0x020)
+# define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
+# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))
#else
-pthread_mutex_lock();
+# define ISLOWER(c) \
+ (('a' <= (c) && (c) <= 'i') \
+ || ('j' <= (c) && (c) <= 'r') \
+ || ('s' <= (c) && (c) <= 'z'))
+# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c))
#endif
-; return 0; }
-EOF
-if { (eval echo configure:2132: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
- rm -rf conftest*
- eval "ac_cv_func_pthread_mutex_lock=yes"
+#define XOR(e, f) (((e) && !(f)) || (!(e) && (f)))
+int
+main ()
+{
+ int i;
+ for (i = 0; i < 256; i++)
+ if (XOR (islower (i), ISLOWER (i))
+ || toupper (i) != TOUPPER (i))
+ exit(2);
+ exit (0);
+}
+_ACEOF
+rm -f conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ :
else
- echo "configure: failed program was:" >&5
- cat conftest.$ac_ext >&5
- rm -rf conftest*
- eval "ac_cv_func_pthread_mutex_lock=no"
+ echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+( exit $ac_status )
+ac_cv_header_stdc=no
+fi
+rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
fi
-rm -f conftest*
fi
-
-if eval "test \"`echo '$ac_cv_func_'pthread_mutex_lock`\" = yes"; then
- echo "$ac_t""yes" 1>&6
- :
-else
- echo "$ac_t""no" 1>&6
fi
+echo "$as_me:$LINENO: result: $ac_cv_header_stdc" >&5
+echo "${ECHO_T}$ac_cv_header_stdc" >&6
+if test $ac_cv_header_stdc = yes; then
+cat >>confdefs.h <<\_ACEOF
+#define STDC_HEADERS 1
+_ACEOF
- if test $ac_cv_func_pthread_mutex_lock = yes; then
- ICU_USE_THREADS=1
- fi
- case "${host}" in
- *-pc-cygwin*|*-pc-mingw*)
- if test "$ac_cv_prog_gcc" = no; then
- ICU_USE_THREADS=1
- fi ;;
- *-*-hpux*)
- case "${icu_cv_host_frag}" in
- mh-hpux-acc)
- OLD_CXXFLAGS="${CXXFLAGS}"
- CXXFLAGS="${CXXFLAGS} -mt"
- if test x"`${CXX} ${CXXFLAGS} 2>&1`" != x""; then
- CXXFLAGS="${OLD_CXXFLAGS}"
- fi
- ;;
- esac
- ;;
- esac
- fi
fi
+# On IRIX 5.3, sys/types and inttypes.h are conflicting.
-# The AC_FUNC_MMAP macro doesn't work properly. It seems to be too specific.
-# Do this check instead.
-HAVE_MMAP=0
-echo $ac_n "checking for mmap""... $ac_c" 1>&6
-echo "configure:2182: checking for mmap" >&5
-if eval "test \"`echo '$''{'ac_cv_func_mmap_ok'+set}'`\" = set"; then
- echo $ac_n "(cached) $ac_c" 1>&6
-else
- cat > conftest.$ac_ext <
-#include
-#include
-#include
-
-int main() {
- mmap((void *)0, 0, PROT_READ, 0, 0, 0);
-; return 0; }
-EOF
-if { (eval echo configure:2199: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
- rm -rf conftest*
- ac_cv_func_mmap_ok=yes
-else
- echo "configure: failed program was:" >&5
- cat conftest.$ac_ext >&5
- rm -rf conftest*
- ac_cv_func_mmap_ok=no
-fi
-rm -f conftest*
-fi
-echo "$ac_t""$ac_cv_func_mmap_ok" 1>&6
-if test $ac_cv_func_mmap_ok = yes
-then
- HAVE_MMAP=1
-fi
-GENCCODE_ASSEMBLY=
-case "${host}" in
-i*86-*-*bsd*|i*86-*-linux*|x86_64-*-linux*|powerpc*-*-linux*)
- if test "$GCC" = yes; then
- GENCCODE_ASSEMBLY="-a gcc"
- fi ;;
-esac
-echo $ac_n "checking how to run the C preprocessor""... $ac_c" 1>&6
-echo "configure:2229: checking how to run the C preprocessor" >&5
-# On Suns, sometimes $CPP names a directory.
-if test -n "$CPP" && test -d "$CPP"; then
- CPP=
+for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \
+ inttypes.h stdint.h unistd.h
+do
+as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
+echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+
+#include <$ac_header>
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ eval "$as_ac_Header=yes"
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+eval "$as_ac_Header=no"
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
+echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
+if test `eval echo '${'$as_ac_Header'}'` = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
fi
-if test -z "$CPP"; then
-if eval "test \"`echo '$''{'ac_cv_prog_CPP'+set}'`\" = set"; then
- echo $ac_n "(cached) $ac_c" 1>&6
-else
- # This must be in double quotes, not single quotes, because CPP may get
- # substituted into the Makefile and "${CC-cc}" will confuse make.
- CPP="${CC-cc} -E"
- # On the NeXT, cc -E runs the code through the compiler's parser,
- # not just through cpp.
- cat > conftest.$ac_ext <
-Syntax Error
-EOF
-ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:2250: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
-ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
-if test -z "$ac_err"; then
- :
-else
- echo "$ac_err" >&5
- echo "configure: failed program was:" >&5
- cat conftest.$ac_ext >&5
- rm -rf conftest*
- CPP="${CC-cc} -E -traditional-cpp"
- cat > conftest.$ac_ext <
-Syntax Error
-EOF
-ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:2267: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
-ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
-if test -z "$ac_err"; then
- :
-else
- echo "$ac_err" >&5
- echo "configure: failed program was:" >&5
- cat conftest.$ac_ext >&5
- rm -rf conftest*
- CPP="${CC-cc} -nologo -E"
- cat > conftest.$ac_ext <
-Syntax Error
-EOF
-ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:2284: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
-ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
-if test -z "$ac_err"; then
- :
+
+done
+
+
+
+for ac_header in inttypes.h
+do
+as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+ echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+fi
+echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
+echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
+else
+ # Is the header compilable?
+echo "$as_me:$LINENO: checking $ac_header usability" >&5
+echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+#include <$ac_header>
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_header_compiler=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_header_compiler=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
+echo "${ECHO_T}$ac_header_compiler" >&6
+
+# Is the header present?
+echo "$as_me:$LINENO: checking $ac_header presence" >&5
+echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <$ac_header>
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+ (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_c_preproc_warn_flag
+ ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
+ else
+ ac_cpp_err=
+ fi
else
- echo "$ac_err" >&5
- echo "configure: failed program was:" >&5
- cat conftest.$ac_ext >&5
- rm -rf conftest*
- CPP=/lib/cpp
-fi
-rm -f conftest*
-fi
-rm -f conftest*
-fi
-rm -f conftest*
- ac_cv_prog_CPP="$CPP"
+ ac_cpp_err=yes
fi
- CPP="$ac_cv_prog_CPP"
+if test -z "$ac_cpp_err"; then
+ ac_header_preproc=yes
else
- ac_cv_prog_CPP="$CPP"
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_header_preproc=no
fi
-echo "$ac_t""$CPP" 1>&6
+rm -f conftest.err conftest.$ac_ext
+echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
+echo "${ECHO_T}$ac_header_preproc" >&6
-for ac_hdr in inttypes.h
-do
-ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
-echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
-echo "configure:2312: checking for $ac_hdr" >&5
-if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
- echo $ac_n "(cached) $ac_c" 1>&6
-else
- cat > conftest.$ac_ext <
-EOF
-ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:2322: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
-ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
-if test -z "$ac_err"; then
- rm -rf conftest*
- eval "ac_cv_header_$ac_safe=yes"
-else
- echo "$ac_err" >&5
- echo "configure: failed program was:" >&5
- cat conftest.$ac_ext >&5
- rm -rf conftest*
- eval "ac_cv_header_$ac_safe=no"
+# So? What about this header?
+case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in
+ yes:no: )
+ { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5
+echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5
+echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;}
+ ac_header_preproc=yes
+ ;;
+ no:yes:* )
+ { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5
+echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5
+echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5
+echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5
+echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5
+echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5
+echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;}
+ (
+ cat <<\_ASBOX
+## ------------------------------------------ ##
+## Report this to the AC_PACKAGE_NAME lists. ##
+## ------------------------------------------ ##
+_ASBOX
+ ) |
+ sed "s/^/$as_me: WARNING: /" >&2
+ ;;
+esac
+echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ eval "$as_ac_Header=\$ac_header_preproc"
fi
-rm -f conftest*
+echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
+echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
+
fi
-if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
- echo "$ac_t""yes" 1>&6
- ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'`
- cat >> confdefs.h <&6
+if test `eval echo '${'$as_ac_Header'}'` = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
fi
+
done
if test $ac_cv_header_inttypes_h = no; then
@@ -2350,7 +5055,8 @@ else
U_HAVE_INTTYPES_H=1
fi
if test "$CC" = ccc; then
- echo "$ac_t"""C compiler set to CCC ${CC}" " 1>&6
+ echo "$as_me:$LINENO: result: \"C compiler set to CCC ${CC}\" " >&5
+echo "${ECHO_T}\"C compiler set to CCC ${CC}\" " >&6
case "${host}" in
alpha*-*-*) U_HAVE_INTTYPES_H=0;
esac
@@ -2358,6 +5064,7 @@ fi
+
# Check whether --with-iostream or --without-iostream was given.
if test "${with_iostream+set}" = set; then
withval="$with_iostream"
@@ -2366,23 +5073,24 @@ if test "${with_iostream+set}" = set; then
old) streams=198506 ;;
std) streams=199711 ;;
auto) streams= ;;
- *) { echo "configure: error: bad value ${withval} for --with-iostream" 1>&2; exit 1; } ;;
+ *) { { echo "$as_me:$LINENO: error: bad value ${withval} for --with-iostream" >&5
+echo "$as_me: error: bad value ${withval} for --with-iostream" >&2;}
+ { (exit 1); exit 1; }; } ;;
esac
else
streams=
-fi
-
+fi;
U_IOSTREAM_SOURCE=0
if test x$streams != xnone
then
-
- ac_ext=C
-# CXXFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
+
+
+ ac_ext=cc
ac_cpp='$CXXCPP $CPPFLAGS'
-ac_compile='${CXX-g++} -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
-ac_link='${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
-cross_compiling=$ac_cv_prog_cxx_cross
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
OLD_CXXFLAGS="${CXXFLAGS}"
case "${icu_cv_host_frag}" in
@@ -2390,143 +5098,123 @@ cross_compiling=$ac_cv_prog_cxx_cross
CXXFLAGS="${CXXFLAGS} -AA"
;;
esac
- echo $ac_n "checking iostream usability""... $ac_c" 1>&6
-echo "configure:2395: checking iostream usability" >&5
- cat > conftest.$ac_ext <&5
+echo $ECHO_N "checking for iostream usability... $ECHO_C" >&6
+
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
#include
-int main() {
+int
+main ()
+{
-; return 0; }
-EOF
-if { (eval echo configure:2404: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
- rm -rf conftest*
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_cxx_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
ac_cv_header_iostream=yes
else
- echo "configure: failed program was:" >&5
- cat conftest.$ac_ext >&5
- rm -rf conftest*
- ac_cv_header_iostream=no
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_header_iostream=no
fi
-rm -f conftest*
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
if test $icu_cv_host_frag = mh-cygwin-msvc
then
ac_cv_header_iostream=yes
fi
- echo "$ac_t""$ac_cv_header_iostream" 1>&6
+ echo "$as_me:$LINENO: result: $ac_cv_header_iostream" >&5
+echo "${ECHO_T}$ac_cv_header_iostream" >&6
if test $ac_cv_header_iostream = yes
then
U_IOSTREAM_SOURCE=199711
else
CXXFLAGS="${OLD_CXXFLAGS}"
- echo $ac_n "checking how to run the C++ preprocessor""... $ac_c" 1>&6
-echo "configure:2425: checking how to run the C++ preprocessor" >&5
-if test -z "$CXXCPP"; then
-if eval "test \"`echo '$''{'ac_cv_prog_CXXCPP'+set}'`\" = set"; then
- echo $ac_n "(cached) $ac_c" 1>&6
-else
- ac_ext=C
-# CXXFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
-ac_cpp='$CXXCPP $CPPFLAGS'
-ac_compile='${CXX-g++} -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
-ac_link='${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
-cross_compiling=$ac_cv_prog_cxx_cross
- CXXCPP="${CXX-g++} -E"
- cat > conftest.$ac_ext <
-EOF
-ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:2443: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
-ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
-if test -z "$ac_err"; then
- :
-else
- echo "$ac_err" >&5
- echo "configure: failed program was:" >&5
- cat conftest.$ac_ext >&5
- rm -rf conftest*
- CXXCPP=/lib/cpp
-fi
-rm -f conftest*
- ac_cv_prog_CXXCPP="$CXXCPP"
-ac_ext=C
-# CXXFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
-ac_cpp='$CXXCPP $CPPFLAGS'
-ac_compile='${CXX-g++} -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
-ac_link='${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
-cross_compiling=$ac_cv_prog_cxx_cross
-fi
-fi
-CXXCPP="$ac_cv_prog_CXXCPP"
-echo "$ac_t""$CXXCPP" 1>&6
-
-ac_safe=`echo "iostream.h" | sed 'y%./+-%__p_%'`
-echo $ac_n "checking for iostream.h""... $ac_c" 1>&6
-echo "configure:2469: checking for iostream.h" >&5
-if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
- echo $ac_n "(cached) $ac_c" 1>&6
-else
- cat > conftest.$ac_ext <
-EOF
-ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:2479: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
-ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
-if test -z "$ac_err"; then
- rm -rf conftest*
- eval "ac_cv_header_$ac_safe=yes"
-else
- echo "$ac_err" >&5
- echo "configure: failed program was:" >&5
- cat conftest.$ac_ext >&5
- rm -rf conftest*
- eval "ac_cv_header_$ac_safe=no"
-fi
-rm -f conftest*
-fi
-if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
- echo "$ac_t""yes" 1>&6
- :
-else
- echo "$ac_t""no" 1>&6
-fi
-
- if test $ac_cv_header_iostream_h = yes; then
- echo $ac_n "checking whether ostream is really defined""... $ac_c" 1>&6
-echo "configure:2502: checking whether ostream is really defined" >&5
- if eval "test \"`echo '$''{'ac_cv_iostream_ok'+set}'`\" = set"; then
- echo $ac_n "(cached) $ac_c" 1>&6
-else
- cat > conftest.$ac_ext <&5
+echo $ECHO_N "checking whether ostream in iostream.h is really defined... $ECHO_C" >&6
+ if test "${ac_cv_iostream_ok+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
#include
-int main() {
+int
+main ()
+{
ostream &testout = cout; testout << "test" << endl;
-; return 0; }
-EOF
-if { (eval echo configure:2514: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
- rm -rf conftest*
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_cxx_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
ac_cv_iostream_ok=yes
else
- echo "configure: failed program was:" >&5
- cat conftest.$ac_ext >&5
- rm -rf conftest*
- ac_cv_iostream_ok=no
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_iostream_ok=no
fi
-rm -f conftest*
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
fi
- echo "$ac_t""$ac_cv_iostream_ok" 1>&6
- if test $ac_cv_iostream_ok = yes
- then
- U_IOSTREAM_SOURCE=198506
- fi
+ echo "$as_me:$LINENO: result: $ac_cv_iostream_ok" >&5
+echo "${ECHO_T}$ac_cv_iostream_ok" >&6
+ if test $ac_cv_iostream_ok = yes
+ then
+ U_IOSTREAM_SOURCE=198506
fi
fi
if test x$streams != x
@@ -2542,76 +5230,196 @@ fi
;;
esac
else
- { echo "configure: error: ${withval} iostream is not available" 1>&2; exit 1; }
+ { { echo "$as_me:$LINENO: error: ${withval} iostream is not available" >&5
+echo "$as_me: error: ${withval} iostream is not available" >&2;}
+ { (exit 1); exit 1; }; }
fi
fi
fi
ac_ext=c
-# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
ac_cpp='$CPP $CPPFLAGS'
-ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
-ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
-cross_compiling=$ac_cv_prog_cc_cross
-
-
-echo $ac_n "checking whether byte ordering is bigendian""... $ac_c" 1>&6
-echo "configure:2560: checking whether byte ordering is bigendian" >&5
-if eval "test \"`echo '$''{'ac_cv_c_bigendian'+set}'`\" = set"; then
- echo $ac_n "(cached) $ac_c" 1>&6
-else
- ac_cv_c_bigendian=unknown
-# See if sys/param.h defines the BYTE_ORDER macro.
-cat > conftest.$ac_ext <&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+echo "$as_me:$LINENO: checking whether byte ordering is bigendian" >&5
+echo $ECHO_N "checking whether byte ordering is bigendian... $ECHO_C" >&6
+if test "${ac_cv_c_bigendian+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ # See if sys/param.h defines the BYTE_ORDER macro.
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
#include
#include
-int main() {
+int
+main ()
+{
#if !BYTE_ORDER || !BIG_ENDIAN || !LITTLE_ENDIAN
bogus endian macros
#endif
-; return 0; }
-EOF
-if { (eval echo configure:2578: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
- rm -rf conftest*
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
# It does; now see whether it defined to BIG_ENDIAN or not.
-cat > conftest.$ac_ext <conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
#include
#include
-int main() {
+int
+main ()
+{
#if BYTE_ORDER != BIG_ENDIAN
not big endian
#endif
-; return 0; }
-EOF
-if { (eval echo configure:2593: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
- rm -rf conftest*
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
ac_cv_c_bigendian=yes
else
- echo "configure: failed program was:" >&5
- cat conftest.$ac_ext >&5
- rm -rf conftest*
- ac_cv_c_bigendian=no
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_c_bigendian=no
fi
-rm -f conftest*
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
else
- echo "configure: failed program was:" >&5
- cat conftest.$ac_ext >&5
-fi
-rm -f conftest*
-if test $ac_cv_c_bigendian = unknown; then
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+# It does not; compile a test program.
if test "$cross_compiling" = yes; then
- { echo "configure: error: can not run test program while cross compiling" 1>&2; exit 1; }
+ # try to guess the endianness by grepping values into an object file
+ ac_cv_c_bigendian=unknown
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+short ascii_mm[] = { 0x4249, 0x4765, 0x6E44, 0x6961, 0x6E53, 0x7953, 0 };
+short ascii_ii[] = { 0x694C, 0x5454, 0x656C, 0x6E45, 0x6944, 0x6E61, 0 };
+void _ascii () { char *s = (char *) ascii_mm; s = (char *) ascii_ii; }
+short ebcdic_ii[] = { 0x89D3, 0xE3E3, 0x8593, 0x95C5, 0x89C4, 0x9581, 0 };
+short ebcdic_mm[] = { 0xC2C9, 0xC785, 0x95C4, 0x8981, 0x95E2, 0xA8E2, 0 };
+void _ebcdic () { char *s = (char *) ebcdic_mm; s = (char *) ebcdic_ii; }
+int
+main ()
+{
+ _ascii (); _ebcdic ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ if grep BIGenDianSyS conftest.$ac_objext >/dev/null ; then
+ ac_cv_c_bigendian=yes
+fi
+if grep LiTTleEnDian conftest.$ac_objext >/dev/null ; then
+ if test "$ac_cv_c_bigendian" = unknown; then
+ ac_cv_c_bigendian=no
+ else
+ # finding both strings is unlikely to happen, but who knows?
+ ac_cv_c_bigendian=unknown
+ fi
+fi
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
else
- cat > conftest.$ac_ext <conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+int
+main ()
+{
/* Are we little or big endian? From Harbison&Steele. */
union
{
@@ -2621,29 +5429,50 @@ main () {
u.l = 1;
exit (u.c[sizeof (long) - 1] == 1);
}
-EOF
-if { (eval echo configure:2626: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
-then
+_ACEOF
+rm -f conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
ac_cv_c_bigendian=no
else
- echo "configure: failed program was:" >&5
- cat conftest.$ac_ext >&5
- rm -fr conftest*
- ac_cv_c_bigendian=yes
+ echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+( exit $ac_status )
+ac_cv_c_bigendian=yes
fi
-rm -fr conftest*
+rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
fi
-
fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
fi
+echo "$as_me:$LINENO: result: $ac_cv_c_bigendian" >&5
+echo "${ECHO_T}$ac_cv_c_bigendian" >&6
+case $ac_cv_c_bigendian in
+ yes)
-echo "$ac_t""$ac_cv_c_bigendian" 1>&6
-if test $ac_cv_c_bigendian = yes; then
- cat >> confdefs.h <<\EOF
+cat >>confdefs.h <<\_ACEOF
#define WORDS_BIGENDIAN 1
-EOF
-
-fi
+_ACEOF
+ ;;
+ no)
+ ;;
+ *)
+ { { echo "$as_me:$LINENO: error: unknown endianness
+presetting ac_cv_c_bigendian=no (or yes) will help" >&5
+echo "$as_me: error: unknown endianness
+presetting ac_cv_c_bigendian=no (or yes) will help" >&2;}
+ { (exit 1); exit 1; }; } ;;
+esac
if test $ac_cv_c_bigendian = no; then
U_IS_BIG_ENDIAN=0
@@ -2656,84 +5485,160 @@ fi
U_HAVE_NL_LANGINFO_CODESET=0
U_NL_LANGINFO_CODESET=-1
-echo $ac_n "checking for nl_langinfo""... $ac_c" 1>&6
-echo "configure:2661: checking for nl_langinfo" >&5
-if eval "test \"`echo '$''{'ac_cv_func_nl_langinfo'+set}'`\" = set"; then
- echo $ac_n "(cached) $ac_c" 1>&6
-else
- cat > conftest.$ac_ext <&5
+echo $ECHO_N "checking for nl_langinfo... $ECHO_C" >&6
+if test "${ac_cv_func_nl_langinfo+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+/* Define nl_langinfo to an innocuous variant, in case declares nl_langinfo.
+ For example, HP-UX 11i declares gettimeofday. */
+#define nl_langinfo innocuous_nl_langinfo
+
/* System header to define __stub macros and hopefully few prototypes,
- which can conflict with char nl_langinfo(); below. */
-#include
-/* Override any gcc2 internal prototype to avoid an error. */
-/* We use char because int might match the return type of a gcc2
- builtin and then its argument prototype would still apply. */
-char nl_langinfo();
+ which can conflict with char nl_langinfo (); below.
+ Prefer to if __STDC__ is defined, since
+ exists even on freestanding compilers. */
+
+#ifdef __STDC__
+# include
+#else
+# include
+#endif
-int main() {
+#undef nl_langinfo
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char nl_langinfo ();
/* The GNU C library defines this for functions which it implements
to always fail with ENOSYS. Some functions are actually named
something starting with __ and the normal name is an alias. */
#if defined (__stub_nl_langinfo) || defined (__stub___nl_langinfo)
choke me
#else
-nl_langinfo();
+char (*f) () = nl_langinfo;
+#endif
+#ifdef __cplusplus
+}
#endif
-; return 0; }
-EOF
-if { (eval echo configure:2689: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
- rm -rf conftest*
- eval "ac_cv_func_nl_langinfo=yes"
-else
- echo "configure: failed program was:" >&5
- cat conftest.$ac_ext >&5
- rm -rf conftest*
- eval "ac_cv_func_nl_langinfo=no"
-fi
-rm -f conftest*
-fi
-
-if eval "test \"`echo '$ac_cv_func_'nl_langinfo`\" = yes"; then
- echo "$ac_t""yes" 1>&6
+int
+main ()
+{
+return f != nl_langinfo;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_func_nl_langinfo=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_func_nl_langinfo=no
+fi
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_func_nl_langinfo" >&5
+echo "${ECHO_T}$ac_cv_func_nl_langinfo" >&6
+if test $ac_cv_func_nl_langinfo = yes; then
U_HAVE_NL_LANGINFO=1
else
- echo "$ac_t""no" 1>&6
-U_HAVE_NL_LANGINFO=0
+ U_HAVE_NL_LANGINFO=0
fi
if test $U_HAVE_NL_LANGINFO -eq 1; then
- echo $ac_n "checking for nl_langinfo's argument to obtain the codeset""... $ac_c" 1>&6
-echo "configure:2712: checking for nl_langinfo's argument to obtain the codeset" >&5
-if eval "test \"`echo '$''{'ac_cv_nl_langinfo_codeset'+set}'`\" = set"; then
- echo $ac_n "(cached) $ac_c" 1>&6
+ echo "$as_me:$LINENO: checking for nl_langinfo's argument to obtain the codeset" >&5
+echo $ECHO_N "checking for nl_langinfo's argument to obtain the codeset... $ECHO_C" >&6
+if test "${ac_cv_nl_langinfo_codeset+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
else
ac_cv_nl_langinfo_codeset="unknown"
for a in CODESET _NL_CTYPE_CODESET_NAME; do
- cat > conftest.$ac_ext <conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
#include
-int main() {
+int
+main ()
+{
nl_langinfo($a);
-; return 0; }
-EOF
-if { (eval echo configure:2726: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
- rm -rf conftest*
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
ac_cv_nl_langinfo_codeset="$a"; break
else
- echo "configure: failed program was:" >&5
- cat conftest.$ac_ext >&5
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
fi
-rm -f conftest*
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
done
fi
-
-echo "$ac_t""$ac_cv_nl_langinfo_codeset" 1>&6
+echo "$as_me:$LINENO: result: $ac_cv_nl_langinfo_codeset" >&5
+echo "${ECHO_T}$ac_cv_nl_langinfo_codeset" >&6
if test x$ac_cv_nl_langinfo_codeset != xunknown
then
U_HAVE_NL_LANGINFO_CODESET=1
@@ -2743,42 +5648,70 @@ fi
-ac_ext=C
-# CXXFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
+ac_ext=cc
ac_cpp='$CXXCPP $CPPFLAGS'
-ac_compile='${CXX-g++} -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
-ac_link='${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
-cross_compiling=$ac_cv_prog_cxx_cross
-
-echo $ac_n "checking for namespace support""... $ac_c" 1>&6
-echo "configure:2755: checking for namespace support" >&5
-if eval "test \"`echo '$''{'ac_cv_namespace_ok'+set}'`\" = set"; then
- echo $ac_n "(cached) $ac_c" 1>&6
-else
- cat > conftest.$ac_ext <&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+echo "$as_me:$LINENO: checking for namespace support" >&5
+echo $ECHO_N "checking for namespace support... $ECHO_C" >&6
+if test "${ac_cv_namespace_ok+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+ namespace x_version {void f(){}}
namespace x = x_version;
using namespace x_version;
-
-int main() {
+
+int
+main ()
+{
f();
-; return 0; }
-EOF
-if { (eval echo configure:2770: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
- rm -rf conftest*
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_cxx_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
ac_cv_namespace_ok=yes
else
- echo "configure: failed program was:" >&5
- cat conftest.$ac_ext >&5
- rm -rf conftest*
- ac_cv_namespace_ok=no
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_namespace_ok=no
fi
-rm -f conftest*
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
fi
-echo "$ac_t""$ac_cv_namespace_ok" 1>&6
+echo "$as_me:$LINENO: result: $ac_cv_namespace_ok" >&5
+echo "${ECHO_T}$ac_cv_namespace_ok" >&6
U_HAVE_NAMESPACE=1
if test $ac_cv_namespace_ok = no
then
@@ -2786,16 +5719,19 @@ then
fi
-echo $ac_n "checking for properly overriding new and delete""... $ac_c" 1>&6
-echo "configure:2791: checking for properly overriding new and delete" >&5
+echo "$as_me:$LINENO: checking for properly overriding new and delete" >&5
+echo $ECHO_N "checking for properly overriding new and delete... $ECHO_C" >&6
U_OVERRIDE_CXX_ALLOCATION=0
U_HAVE_PLACEMENT_NEW=0
-if eval "test \"`echo '$''{'ac_cv_override_cxx_allocation_ok'+set}'`\" = set"; then
- echo $ac_n "(cached) $ac_c" 1>&6
-else
- cat > conftest.$ac_ext <&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
#include
class UMemory {
public:
@@ -2804,35 +5740,64 @@ else
void operator delete(void *p) {free(p);}
void operator delete[](void *p) {free(p);}
};
-
-int main() {
-
-; return 0; }
-EOF
-if { (eval echo configure:2813: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
- rm -rf conftest*
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_cxx_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
ac_cv_override_cxx_allocation_ok=yes
else
- echo "configure: failed program was:" >&5
- cat conftest.$ac_ext >&5
- rm -rf conftest*
- ac_cv_override_cxx_allocation_ok=no
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_override_cxx_allocation_ok=no
fi
-rm -f conftest*
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
fi
-echo "$ac_t""$ac_cv_override_cxx_allocation_ok" 1>&6
+echo "$as_me:$LINENO: result: $ac_cv_override_cxx_allocation_ok" >&5
+echo "${ECHO_T}$ac_cv_override_cxx_allocation_ok" >&6
if test $ac_cv_override_cxx_allocation_ok = yes
then
U_OVERRIDE_CXX_ALLOCATION=1
- echo $ac_n "checking for placement new and delete""... $ac_c" 1>&6
-echo "configure:2830: checking for placement new and delete" >&5
- if eval "test \"`echo '$''{'ac_cv_override_placement_new_ok'+set}'`\" = set"; then
- echo $ac_n "(cached) $ac_c" 1>&6
-else
- cat > conftest.$ac_ext <&5
+echo $ECHO_N "checking for placement new and delete... $ECHO_C" >&6
+ if test "${ac_cv_override_placement_new_ok+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
#include
class UMemory {
public:
@@ -2843,24 +5808,50 @@ else
void * operator new(size_t, void *ptr) { return ptr; }
void operator delete(void *, void *) {}
};
-
-int main() {
-
-; return 0; }
-EOF
-if { (eval echo configure:2852: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
- rm -rf conftest*
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_cxx_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
ac_cv_override_placement_new_ok=yes
else
- echo "configure: failed program was:" >&5
- cat conftest.$ac_ext >&5
- rm -rf conftest*
- ac_cv_override_placement_new_ok=no
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_override_placement_new_ok=no
fi
-rm -f conftest*
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
fi
- echo "$ac_t""$ac_cv_override_placement_new_ok" 1>&6
+ echo "$as_me:$LINENO: result: $ac_cv_override_placement_new_ok" >&5
+echo "${ECHO_T}$ac_cv_override_placement_new_ok" >&6
if test $ac_cv_override_placement_new_ok = yes
then
U_HAVE_PLACEMENT_NEW=1
@@ -2870,59 +5861,101 @@ fi
ac_ext=c
-# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
ac_cpp='$CPP $CPPFLAGS'
-ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
-ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
-cross_compiling=$ac_cv_prog_cc_cross
-
-echo $ac_n "checking for popen""... $ac_c" 1>&6
-echo "configure:2881: checking for popen" >&5
-if eval "test \"`echo '$''{'ac_cv_func_popen'+set}'`\" = set"; then
- echo $ac_n "(cached) $ac_c" 1>&6
-else
- cat > conftest.$ac_ext <&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+echo "$as_me:$LINENO: checking for popen" >&5
+echo $ECHO_N "checking for popen... $ECHO_C" >&6
+if test "${ac_cv_func_popen+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+/* Define popen to an innocuous variant, in case declares popen.
+ For example, HP-UX 11i declares gettimeofday. */
+#define popen innocuous_popen
+
/* System header to define __stub macros and hopefully few prototypes,
- which can conflict with char popen(); below. */
-#include
-/* Override any gcc2 internal prototype to avoid an error. */
-/* We use char because int might match the return type of a gcc2
- builtin and then its argument prototype would still apply. */
-char popen();
+ which can conflict with char popen (); below.
+ Prefer to if __STDC__ is defined, since
+ exists even on freestanding compilers. */
+
+#ifdef __STDC__
+# include
+#else
+# include
+#endif
-int main() {
+#undef popen
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char popen ();
/* The GNU C library defines this for functions which it implements
to always fail with ENOSYS. Some functions are actually named
something starting with __ and the normal name is an alias. */
#if defined (__stub_popen) || defined (__stub___popen)
choke me
#else
-popen();
+char (*f) () = popen;
+#endif
+#ifdef __cplusplus
+}
#endif
-; return 0; }
-EOF
-if { (eval echo configure:2909: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
- rm -rf conftest*
- eval "ac_cv_func_popen=yes"
-else
- echo "configure: failed program was:" >&5
- cat conftest.$ac_ext >&5
- rm -rf conftest*
- eval "ac_cv_func_popen=no"
-fi
-rm -f conftest*
-fi
-
-if eval "test \"`echo '$ac_cv_func_'popen`\" = yes"; then
- echo "$ac_t""yes" 1>&6
- :
-else
- echo "$ac_t""no" 1>&6
-fi
+int
+main ()
+{
+return f != popen;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_func_popen=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_func_popen=no
+fi
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_func_popen" >&5
+echo "${ECHO_T}$ac_cv_func_popen" >&6
if test x$ac_cv_func_popen = xyes
then
@@ -2932,53 +5965,96 @@ else
fi
-echo $ac_n "checking for tzset""... $ac_c" 1>&6
-echo "configure:2937: checking for tzset" >&5
-if eval "test \"`echo '$''{'ac_cv_func_tzset'+set}'`\" = set"; then
- echo $ac_n "(cached) $ac_c" 1>&6
+echo "$as_me:$LINENO: checking for tzset" >&5
+echo $ECHO_N "checking for tzset... $ECHO_C" >&6
+if test "${ac_cv_func_tzset+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
else
- cat > conftest.$ac_ext <conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+/* Define tzset to an innocuous variant, in case declares tzset.
+ For example, HP-UX 11i declares gettimeofday. */
+#define tzset innocuous_tzset
+
/* System header to define __stub macros and hopefully few prototypes,
- which can conflict with char tzset(); below. */
-#include
-/* Override any gcc2 internal prototype to avoid an error. */
-/* We use char because int might match the return type of a gcc2
- builtin and then its argument prototype would still apply. */
-char tzset();
+ which can conflict with char tzset (); below.
+ Prefer to if __STDC__ is defined, since
+ exists even on freestanding compilers. */
+
+#ifdef __STDC__
+# include
+#else
+# include
+#endif
-int main() {
+#undef tzset
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char tzset ();
/* The GNU C library defines this for functions which it implements
to always fail with ENOSYS. Some functions are actually named
something starting with __ and the normal name is an alias. */
#if defined (__stub_tzset) || defined (__stub___tzset)
choke me
#else
-tzset();
+char (*f) () = tzset;
+#endif
+#ifdef __cplusplus
+}
#endif
-; return 0; }
-EOF
-if { (eval echo configure:2965: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
- rm -rf conftest*
- eval "ac_cv_func_tzset=yes"
-else
- echo "configure: failed program was:" >&5
- cat conftest.$ac_ext >&5
- rm -rf conftest*
- eval "ac_cv_func_tzset=no"
-fi
-rm -f conftest*
-fi
-
-if eval "test \"`echo '$ac_cv_func_'tzset`\" = yes"; then
- echo "$ac_t""yes" 1>&6
- :
-else
- echo "$ac_t""no" 1>&6
-fi
+int
+main ()
+{
+return f != tzset;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_func_tzset=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_func_tzset=no
+fi
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_func_tzset" >&5
+echo "${ECHO_T}$ac_cv_func_tzset" >&6
U_HAVE_TZSET=0
if test x$ac_cv_func_tzset = xyes
@@ -2986,53 +6062,96 @@ then
U_TZSET=tzset
U_HAVE_TZSET=1
else
- echo $ac_n "checking for _tzset""... $ac_c" 1>&6
-echo "configure:2991: checking for _tzset" >&5
-if eval "test \"`echo '$''{'ac_cv_func__tzset'+set}'`\" = set"; then
- echo $ac_n "(cached) $ac_c" 1>&6
-else
- cat > conftest.$ac_ext <&5
+echo $ECHO_N "checking for _tzset... $ECHO_C" >&6
+if test "${ac_cv_func__tzset+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+/* Define _tzset to an innocuous variant, in case declares _tzset.
+ For example, HP-UX 11i declares gettimeofday. */
+#define _tzset innocuous__tzset
+
/* System header to define __stub macros and hopefully few prototypes,
- which can conflict with char _tzset(); below. */
-#include
-/* Override any gcc2 internal prototype to avoid an error. */
-/* We use char because int might match the return type of a gcc2
- builtin and then its argument prototype would still apply. */
-char _tzset();
+ which can conflict with char _tzset (); below.
+ Prefer to if __STDC__ is defined, since
+ exists even on freestanding compilers. */
+
+#ifdef __STDC__
+# include
+#else
+# include
+#endif
-int main() {
+#undef _tzset
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char _tzset ();
/* The GNU C library defines this for functions which it implements
to always fail with ENOSYS. Some functions are actually named
something starting with __ and the normal name is an alias. */
#if defined (__stub__tzset) || defined (__stub____tzset)
choke me
#else
-_tzset();
+char (*f) () = _tzset;
+#endif
+#ifdef __cplusplus
+}
#endif
-; return 0; }
-EOF
-if { (eval echo configure:3019: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
- rm -rf conftest*
- eval "ac_cv_func__tzset=yes"
-else
- echo "configure: failed program was:" >&5
- cat conftest.$ac_ext >&5
- rm -rf conftest*
- eval "ac_cv_func__tzset=no"
-fi
-rm -f conftest*
-fi
-
-if eval "test \"`echo '$ac_cv_func_'_tzset`\" = yes"; then
- echo "$ac_t""yes" 1>&6
- :
-else
- echo "$ac_t""no" 1>&6
-fi
+int
+main ()
+{
+return f != _tzset;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_func__tzset=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_func__tzset=no
+fi
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_func__tzset" >&5
+echo "${ECHO_T}$ac_cv_func__tzset" >&6
if test x$ac_cv_func__tzset = xyes
then
@@ -3044,14 +6163,17 @@ fi
U_HAVE_TZNAME=0
-echo $ac_n "checking for tzname""... $ac_c" 1>&6
-echo "configure:3049: checking for tzname" >&5
-if eval "test \"`echo '$''{'ac_cv_var_tzname'+set}'`\" = set"; then
- echo $ac_n "(cached) $ac_c" 1>&6
-else
- cat > conftest.$ac_ext <&5
+echo $ECHO_N "checking for tzname... $ECHO_C" >&6
+if test "${ac_cv_var_tzname+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
#ifndef __USE_POSIX
#define __USE_POSIX
#endif
@@ -3060,56 +6182,109 @@ else
#ifndef tzname /* For SGI. */
extern char *tzname[]; /* RS6000 and others reject char **tzname. */
#endif
-int main() {
+int
+main ()
+{
atoi(*tzname);
-; return 0; }
-EOF
-if { (eval echo configure:3068: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
- rm -rf conftest*
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
ac_cv_var_tzname=yes
else
- echo "configure: failed program was:" >&5
- cat conftest.$ac_ext >&5
- rm -rf conftest*
- ac_cv_var_tzname=no
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_var_tzname=no
fi
-rm -f conftest*
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
fi
-
-echo "$ac_t""$ac_cv_var_tzname" 1>&6
+echo "$as_me:$LINENO: result: $ac_cv_var_tzname" >&5
+echo "${ECHO_T}$ac_cv_var_tzname" >&6
if test $ac_cv_var_tzname = yes; then
U_TZNAME=tzname
U_HAVE_TZNAME=1
else
- echo $ac_n "checking for _tzname""... $ac_c" 1>&6
-echo "configure:3086: checking for _tzname" >&5
-if eval "test \"`echo '$''{'ac_cv_var__tzname'+set}'`\" = set"; then
- echo $ac_n "(cached) $ac_c" 1>&6
-else
- cat > conftest.$ac_ext <&5
+echo $ECHO_N "checking for _tzname... $ECHO_C" >&6
+if test "${ac_cv_var__tzname+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
#include