This commit was manufactured by cvs2svn to create tag
'release-3-6-d02'.
X-SVN-Rev: 20052
diff --git a/.cvsignore b/.cvsignore
new file mode 100644
index 0000000..9f8d6b5
--- /dev/null
+++ b/.cvsignore
@@ -0,0 +1,3 @@
+bin
+include
+lib
diff --git a/.gitattributes b/.gitattributes
new file mode 100644
index 0000000..bf35691
--- /dev/null
+++ b/.gitattributes
@@ -0,0 +1,66 @@
+* text=auto !eol
+
+*.c text !eol
+*.cc text !eol
+*.classpath text !eol
+*.cpp text !eol
+*.css text !eol
+*.dsp text !eol
+*.dsw text !eol
+*.filters text !eol
+*.h text !eol
+*.htm text !eol
+*.html text !eol
+*.in text !eol
+*.java text !eol
+*.launch text !eol
+*.mak text !eol
+*.md text !eol
+*.MF text !eol
+*.mk text !eol
+*.pl text !eol
+*.pm text !eol
+*.project text !eol
+*.properties text !eol
+*.py text !eol
+*.rc text !eol
+*.sh text eol=lf
+*.sln text !eol
+*.stub text !eol
+*.txt text !eol
+*.ucm text !eol
+*.vcproj text !eol
+*.vcxproj text !eol
+*.xml text !eol
+*.xsl text !eol
+*.xslt text !eol
+Makefile text !eol
+configure text !eol
+LICENSE text !eol
+README text !eol
+
+*.bin -text
+*.brk -text
+*.cnv -text
+*.icu -text
+*.res -text
+*.nrm -text
+*.spp -text
+*.tri2 -text
+
+source/data/unidata/UCARules.txt -text
+source/samples/ucnv/data02.bin -text
+source/test/testdata/icu26_testtypes.res -text
+source/test/testdata/icu26e_testtypes.res -text
+source/test/testdata/importtest.bin -text
+source/test/testdata/iscii.bin -text
+source/test/testdata/uni-text.bin -text
+
+# The following file types are stored in Git-LFS.
+*.jar filter=lfs diff=lfs merge=lfs -text
+*.dat filter=lfs diff=lfs merge=lfs -text
+*.zip filter=lfs diff=lfs merge=lfs -text
+*.gz filter=lfs diff=lfs merge=lfs -text
+*.bz2 filter=lfs diff=lfs merge=lfs -text
+*.gif filter=lfs diff=lfs merge=lfs -text
+
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..0eac161
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,422 @@
+/bin
+debian/*.debhelper
+debian/*.substvars
+debian/*files
+debian/*libicu[0-9]*
+debian/control
+debian/docs
+debian/icu
+debian/icu-data
+debian/icu-doc
+debian/icu-i18ndata
+debian/icu-locales
+debian/icu.postinst
+debian/icu.prerm
+debian/libicu-dev
+debian/postinst
+debian/prerm
+debian/tmp
+/include
+/lib
+source/Doxyfile
+source/Makefile
+source/README
+source/allinone/*.ncb
+source/allinone/*.opt
+source/allinone/*.suo
+source/bin
+source/common/*.ao
+source/common/*.d
+source/common/*.o
+source/common/*.plg
+source/common/Debug
+source/common/Makefile
+source/common/Release
+source/common/icucfg.h
+source/common/libicu*.*
+source/common/svchook.mk
+source/common/unicode/platform.h
+source/config.cache
+source/config.log
+source/config.status
+source/config/Makefile.inc
+source/config/icu-config
+source/config/icu-config.1
+source/data/*.plg
+source/data/Makefile
+source/data/icupkg.inc
+source/data/in
+source/data/out
+source/extra/Makefile
+source/extra/scrptrun/Makefile
+source/extra/uconv/*.d
+source/extra/uconv/*.o
+source/extra/uconv/Debug
+source/extra/uconv/Makefile
+source/extra/uconv/Release
+source/extra/uconv/pkgdata.inc
+source/extra/uconv/pkgdatain.txt
+source/extra/uconv/resources/*.res
+source/extra/uconv/uconv
+source/extra/uconv/uconv.1
+source/extra/uconv/uconv.plg
+source/extra/uconv/uconvmsg
+source/i18n/*.ao
+source/i18n/*.d
+source/i18n/*.o
+source/i18n/*.plg
+source/i18n/Debug
+source/i18n/Makefile
+source/i18n/Release
+source/icudefs.mk
+source/io/*.ao
+source/io/*.d
+source/io/*.o
+source/io/Debug
+source/io/Makefile
+source/io/Release
+source/layout/*.ao
+source/layout/*.d
+source/layout/*.o
+source/layout/*.pdb
+source/layout/Debug
+source/layout/Makefile
+source/layout/Release
+source/layoutex/*.ao
+source/layoutex/*.d
+source/layoutex/*.o
+source/layoutex/*.pdb
+source/layoutex/Debug
+source/layoutex/Makefile
+source/layoutex/Release
+source/lib
+source/samples/Makefile
+source/samples/cal/*.d
+source/samples/cal/*.pdb
+source/samples/cal/Debug
+source/samples/cal/Makefile
+source/samples/cal/Release
+source/samples/cal/icucal
+source/samples/date/*.d
+source/samples/date/*.pdb
+source/samples/date/Debug
+source/samples/date/Makefile
+source/samples/date/Release
+source/samples/date/icudate
+source/samples/layout/*.d
+source/samples/layout/*.pdb
+source/samples/layout/.#*
+source/samples/layout/Debug
+source/samples/layout/Makefile
+source/samples/layout/Release
+source/samples/layout/tmp
+source/stubdata/*.ao
+source/stubdata/*.d
+source/stubdata/*.o
+source/stubdata/*.plg
+source/stubdata/Debug
+source/stubdata/Makefile
+source/stubdata/Release
+source/stubdata/libicu*.*
+source/stubdata/stubdatabuilt.txt
+source/test/Makefile
+source/test/cintltst/*.d
+source/test/cintltst/*.o
+source/test/cintltst/*.plg
+source/test/cintltst/Debug
+source/test/cintltst/Makefile
+source/test/cintltst/Release
+source/test/cintltst/cintltst
+source/test/cintltst/cintltst.exe
+source/test/hdrtst/Makefile
+source/test/intltest/*.d
+source/test/intltest/*.o
+source/test/intltest/*.plg
+source/test/intltest/Debug
+source/test/intltest/Makefile
+source/test/intltest/Release
+source/test/intltest/intltest
+source/test/intltest/intltest.exe
+source/test/iotest/*.d
+source/test/iotest/*.o
+source/test/iotest/Debug
+source/test/iotest/Makefile
+source/test/iotest/Release
+source/test/iotest/iotest
+source/test/iotest/iotest.exe
+source/test/letest/*.d
+source/test/letest/*.o
+source/test/letest/Debug
+source/test/letest/Makefile
+source/test/letest/Release
+source/test/letest/letest
+source/test/letest/letest.exe
+source/test/perf/charperf/*.d
+source/test/perf/charperf/*.o
+source/test/perf/charperf/Debug
+source/test/perf/charperf/Makefile
+source/test/perf/charperf/Release
+source/test/perf/charperf/charperf
+source/test/perf/collperf/*.d
+source/test/perf/collperf/*.o
+source/test/perf/collperf/Debug
+source/test/perf/collperf/Makefile
+source/test/perf/collperf/Release
+source/test/perf/collperf/collperf
+source/test/perf/normperf/*.d
+source/test/perf/normperf/*.o
+source/test/perf/normperf/Debug
+source/test/perf/normperf/Makefile
+source/test/perf/normperf/Release
+source/test/perf/normperf/normperf
+source/test/perf/ubrkperf/*.d
+source/test/perf/ubrkperf/*.o
+source/test/perf/ubrkperf/Debug
+source/test/perf/ubrkperf/Makefile
+source/test/perf/ubrkperf/Release
+source/test/perf/ubrkperf/ubrkperf
+source/test/perf/usetperf/*.d
+source/test/perf/usetperf/*.o
+source/test/perf/usetperf/Debug
+source/test/perf/usetperf/Makefile
+source/test/perf/usetperf/Release
+source/test/perf/usetperf/usetperf
+source/test/perf/ustrperf/*.d
+source/test/perf/ustrperf/*.o
+source/test/perf/ustrperf/Debug
+source/test/perf/ustrperf/Makefile
+source/test/perf/ustrperf/Release
+source/test/perf/ustrperf/charperf
+source/test/perf/utfperf/*.d
+source/test/perf/utfperf/*.o
+source/test/perf/utfperf/Debug
+source/test/perf/utfperf/Makefile
+source/test/perf/utfperf/Release
+source/test/perf/utfperf/utfperf
+source/test/testdata/Makefile
+source/test/testdata/out
+source/test/testdata/pkgdata.inc
+source/test/testmap/*.d
+source/test/testmap/Debug
+source/test/testmap/Makefile
+source/test/testmap/Release
+source/test/testmap/testmap
+source/test/testmap/testmap.plg
+source/test/thaitest/Makefile
+source/test/threadtest/Makefile
+source/tools/Makefile
+source/tools/ctestfw/*.ao
+source/tools/ctestfw/*.d
+source/tools/ctestfw/*.o
+source/tools/ctestfw/*.pdb
+source/tools/ctestfw/*icutest*.dll
+source/tools/ctestfw/*icutest*.exp
+source/tools/ctestfw/*icutest*.lib
+source/tools/ctestfw/Debug
+source/tools/ctestfw/Makefile
+source/tools/ctestfw/Release
+source/tools/ctestfw/libicutest*
+source/tools/dumpce/*.css
+source/tools/dumpce/*.d
+source/tools/dumpce/*.html
+source/tools/dumpce/*.o
+source/tools/dumpce/Makefile
+source/tools/dumpce/dumpce
+source/tools/genbidi/*.d
+source/tools/genbidi/*.o
+source/tools/genbidi/*.pdb
+source/tools/genbidi/*.plg
+source/tools/genbidi/Debug
+source/tools/genbidi/Makefile
+source/tools/genbidi/Release
+source/tools/genbidi/genbidi
+source/tools/genbidi/genbidi.[0-9]
+source/tools/genbrk/*.d
+source/tools/genbrk/*.o
+source/tools/genbrk/*.pdb
+source/tools/genbrk/*.plg
+source/tools/genbrk/Debug
+source/tools/genbrk/Makefile
+source/tools/genbrk/Release
+source/tools/genbrk/genbrk
+source/tools/genbrk/genbrk.1
+source/tools/gencase/*.d
+source/tools/gencase/*.ncb
+source/tools/gencase/*.o
+source/tools/gencase/*.opt
+source/tools/gencase/*.pdb
+source/tools/gencase/*.plg
+source/tools/gencase/Debug
+source/tools/gencase/Makefile
+source/tools/gencase/Release
+source/tools/gencase/gencase
+source/tools/gencase/gencase.[0-9]
+source/tools/genccode/*.d
+source/tools/genccode/*.o
+source/tools/genccode/*.pdb
+source/tools/genccode/*.plg
+source/tools/genccode/Debug
+source/tools/genccode/Makefile
+source/tools/genccode/Release
+source/tools/genccode/genccode
+source/tools/genccode/genccode.8
+source/tools/gencmn/*.d
+source/tools/gencmn/*.o
+source/tools/gencmn/*.pdb
+source/tools/gencmn/*.plg
+source/tools/gencmn/Debug
+source/tools/gencmn/Makefile
+source/tools/gencmn/Release
+source/tools/gencmn/gencmn
+source/tools/gencmn/gencmn.[0-9]
+source/tools/gencnval/*.d
+source/tools/gencnval/*.ncb
+source/tools/gencnval/*.o
+source/tools/gencnval/*.opt
+source/tools/gencnval/*.pdb
+source/tools/gencnval/*.plg
+source/tools/gencnval/Debug
+source/tools/gencnval/Makefile
+source/tools/gencnval/Release
+source/tools/gencnval/gencnval
+source/tools/gencnval/gencnval.[0-9]
+source/tools/genctd/*.d
+source/tools/genctd/*.o
+source/tools/genctd/*.pdb
+source/tools/genctd/*.plg
+source/tools/genctd/Debug
+source/tools/genctd/Makefile
+source/tools/genctd/Release
+source/tools/genctd/genctd
+source/tools/genctd/genctd.1
+source/tools/gennames/*.d
+source/tools/gennames/*.ncb
+source/tools/gennames/*.o
+source/tools/gennames/*.opt
+source/tools/gennames/*.pdb
+source/tools/gennames/*.plg
+source/tools/gennames/Debug
+source/tools/gennames/Makefile
+source/tools/gennames/Release
+source/tools/gennames/gennames
+source/tools/gennames/gennames.[0-9]
+source/tools/gennorm/*.d
+source/tools/gennorm/*.o
+source/tools/gennorm/*.pdb
+source/tools/gennorm/*.plg
+source/tools/gennorm/Debug
+source/tools/gennorm/Makefile
+source/tools/gennorm/Release
+source/tools/gennorm/gennorm
+source/tools/gennorm/gennorm.[0-9]
+source/tools/genpname/*.d
+source/tools/genpname/*.o
+source/tools/genpname/*.pdb
+source/tools/genpname/*.plg
+source/tools/genpname/Debug
+source/tools/genpname/Makefile
+source/tools/genpname/Release
+source/tools/genpname/genpname
+source/tools/genprops/*.d
+source/tools/genprops/*.ncb
+source/tools/genprops/*.o
+source/tools/genprops/*.opt
+source/tools/genprops/*.pdb
+source/tools/genprops/*.plg
+source/tools/genprops/Debug
+source/tools/genprops/Makefile
+source/tools/genprops/Release
+source/tools/genprops/genprops
+source/tools/genprops/genprops.[0-9]
+source/tools/genrb/*.d
+source/tools/genrb/*.o
+source/tools/genrb/*.pdb
+source/tools/genrb/*.plg
+source/tools/genrb/Debug
+source/tools/genrb/Makefile
+source/tools/genrb/Release
+source/tools/genrb/derb
+source/tools/genrb/derb.[0-9]
+source/tools/genrb/derb_*
+source/tools/genrb/genrb
+source/tools/genrb/genrb.[0-9]
+source/tools/gensprep/*.d
+source/tools/gensprep/*.o
+source/tools/gensprep/*.pdb
+source/tools/gensprep/Debug
+source/tools/gensprep/Makefile
+source/tools/gensprep/Release
+source/tools/gensprep/gensprep
+source/tools/gensprep/gensprep.8
+source/tools/gensprep/gensprep.plg
+source/tools/gentest/*.d
+source/tools/gentest/*.o
+source/tools/gentest/*.pdb
+source/tools/gentest/Debug
+source/tools/gentest/Makefile
+source/tools/gentest/Release
+source/tools/gentest/gentest
+source/tools/gentest/gentest.exe
+source/tools/genuca/*.d
+source/tools/genuca/*.o
+source/tools/genuca/*.pdb
+source/tools/genuca/Debug
+source/tools/genuca/Makefile
+source/tools/genuca/Release
+source/tools/genuca/genuca
+source/tools/genuca/genuca.8
+source/tools/icupkg/*.d
+source/tools/icupkg/*.ncb
+source/tools/icupkg/*.o
+source/tools/icupkg/*.opt
+source/tools/icupkg/*.pdb
+source/tools/icupkg/*.plg
+source/tools/icupkg/Debug
+source/tools/icupkg/Makefile
+source/tools/icupkg/Release
+source/tools/icupkg/icupkg
+source/tools/icupkg/icupkg.[0-9]
+source/tools/icuswap/*.d
+source/tools/icuswap/*.ncb
+source/tools/icuswap/*.o
+source/tools/icuswap/*.opt
+source/tools/icuswap/*.pdb
+source/tools/icuswap/*.plg
+source/tools/icuswap/Debug
+source/tools/icuswap/Makefile
+source/tools/icuswap/Release
+source/tools/icuswap/icuswap
+source/tools/icuswap/icuswap.[0-9]
+source/tools/makeconv/*.d
+source/tools/makeconv/*.o
+source/tools/makeconv/*.pdb
+source/tools/makeconv/*.plg
+source/tools/makeconv/Debug
+source/tools/makeconv/Makefile
+source/tools/makeconv/Release
+source/tools/makeconv/makeconv
+source/tools/makeconv/makeconv.[0-9]
+source/tools/pkgdata/*.d
+source/tools/pkgdata/*.ncb
+source/tools/pkgdata/*.o
+source/tools/pkgdata/*.opt
+source/tools/pkgdata/*.pdb
+source/tools/pkgdata/Debug
+source/tools/pkgdata/Makefile
+source/tools/pkgdata/Release
+source/tools/pkgdata/icupkg.inc
+source/tools/pkgdata/pkgdata
+source/tools/pkgdata/pkgdata.[0-9]
+source/tools/toolutil/*.d
+source/tools/toolutil/*.ncb
+source/tools/toolutil/*.o
+source/tools/toolutil/*.opt
+source/tools/toolutil/*.pdb
+source/tools/toolutil/*.plg
+source/tools/toolutil/Debug
+source/tools/toolutil/Makefile
+source/tools/toolutil/Release
+source/tools/toolutil/libicu*
+source/tools/tzcode/Makefile
+source/tools/tzcode/tz2icu
+source/tools/tzcode/zic
diff --git a/as_is/os390/unpax-icu.sh b/as_is/os390/unpax-icu.sh
new file mode 100755
index 0000000..91d1852
--- /dev/null
+++ b/as_is/os390/unpax-icu.sh
@@ -0,0 +1,99 @@
+#!/bin/sh
+# Copyright (C) 2001-2006, International Business Machines
+# Corporation and others. All Rights Reserved.
+#
+# Authors:
+# Ami Fixler
+# Steven R. Loomis
+# George Rhoten
+#
+# Shell script to unpax ICU and convert the files to an EBCDIC codepage.
+# After extracting to EBCDIC, binary files are re-extracted without the
+# EBCDIC conversion, thus restoring them to original codepage.
+#
+# Set the following variable to the list of binary file suffixes (extensions)
+
+#binary_suffixes='ico ICO bmp BMP jpg JPG gif GIF brk BRK'
+#ICU specific binary files
+binary_suffixes='brk BRK bin BIN res RES cnv CNV dat DAT icu ICU spp SPP xml XML'
+
+usage()
+{
+ echo "Enter archive filename as a parameter: $0 icu-archive.tar"
+}
+# first make sure we at least one arg and it's a file we can read
+if [ $# -eq 0 ]; then
+ usage
+ exit
+fi
+tar_file=$1
+if [ ! -r $tar_file ]; then
+ echo "$tar_file does not exist or cannot be read."
+ usage
+ exit
+fi
+
+echo ""
+echo "Extracting from $tar_file ..."
+echo ""
+# extract files while converting them to EBCDIC
+pax -rvf $tar_file -o to=IBM-1047,from=ISO8859-1
+
+echo ""
+echo "Determining binary files ..."
+echo ""
+
+# When building in ASCII mode, text files are converted as ASCII
+if [ ${ICU_ENABLE_ASCII_STRINGS} -eq 1 ]; then
+ binary_suffixes="$binary_suffixes txt TXT ucm UCM"
+else
+ for file in `find ./icu \( -name \*.txt -print \)`; do
+ bom8=`head -c 3 $file|\
+ od -t x1|\
+ head -n 1|\
+ sed 's/ */ /g'|\
+ cut -f2-4 -d ' '|\
+ tr 'A-Z' 'a-z'`;
+ #Find a converted UTF-8 BOM
+ if [ "$bom8" = "57 8b ab" ]
+ then
+ binary_files="$binary_files $file";
+ fi
+ done
+fi
+
+for i in $(pax -f $tar_file 2>/dev/null)
+do
+ case $i in
+ */) ;; # then this entry is a directory
+ *.*) # then this entry has a dot in the filename
+ for j in $binary_suffixes
+ do
+ # We substitute the suffix more than once
+ # to handle files like NormalizationTest-3.2.0.txt
+ suf=${i#*.*}
+ suf=${suf#*.*}
+ suf=${suf#*.*}
+ if [ "$suf" = "$j" ]
+ then
+ binary_files="$binary_files $i"
+ break
+ fi
+ done
+ ;;
+ *) ;; # then this entry does not have a dot in it
+ esac
+done
+
+# now see if a re-extract of binary files is necessary
+if [ ${#binary_files} -eq 0 ]; then
+ echo ""
+ echo "There are no binary files to restore."
+else
+ echo "Restoring binary files ..."
+ echo ""
+ rm $binary_files
+ pax -rvf $tar_file $binary_files
+fi
+echo ""
+echo "$0 has completed extracting ICU from $tar_file."
diff --git a/as_is/os400/convertConfigure.sed b/as_is/os400/convertConfigure.sed
new file mode 100644
index 0000000..d125ea0
--- /dev/null
+++ b/as_is/os400/convertConfigure.sed
@@ -0,0 +1,20 @@
+# Copyright (C) 2006-2006, International Business Machines Corporation
+# and others. All Rights Reserved.
+#
+# Use "test -x" instead of "test -f" most of the time.
+# due to how executables are created in a different file system.
+s/as_executable_p="test -f"/as_executable_p="test -x"/g
+s/test -f "$ac_file"/test -x "$ac_file"/g
+s/test -f $ac_dir\/install-sh/test -x $ac_dir\/install-sh/g
+s/test -f $ac_dir\/install.sh/test -x $ac_dir\/install.sh/g
+s/test -f $ac_dir\/shtool/test -x $ac_dir\/shtool/g
+# Use the more efficient del instead of rm command.
+s/rm[ ]*-rf/del -f/g
+s/rm[ ]*-fr/del -f/g
+s/rm[ ]*-f/del -f/g
+# Borne shell isn't always available on i5/OS
+s/\/bin\/sh/\/usr\/bin\/qsh/g
+# Use -c qpponly instead of -E to enable the preprocessor on the compiler
+s/\$CC -E/\$CC -c -qpponly/g
+# no diff in qsh the equivalent is cmp
+s/ diff / cmp -s /g
\ No newline at end of file
diff --git a/as_is/os400/unpax-icu.sh b/as_is/os400/unpax-icu.sh
new file mode 100755
index 0000000..551748c
--- /dev/null
+++ b/as_is/os400/unpax-icu.sh
@@ -0,0 +1,132 @@
+#!/usr/bin/qsh
+# Copyright (C) 2000-2006, International Business Machines
+# Corporation and others. All Rights Reserved.
+#
+# Authors:
+# Ami Fixler
+# Barry Novinger
+# Steven R. Loomis
+# George Rhoten
+#
+# Shell script to unpax ICU and convert the files to an EBCDIC codepage.
+# After extracting to EBCDIC, binary files are re-extracted without the
+# EBCDIC conversion, thus restoring them to original codepage.
+#
+# Set the following variable to the list of binary file suffixes (extensions)
+
+#binary_suffixes='ico ICO bmp BMP jpg JPG gif GIF brk BRK'
+#ICU specific binary files
+binary_suffixes='brk BRK bin BIN res RES cnv CNV dat DAT icu ICU spp SPP xml XML'
+data_files='icu/source/data/brkitr/* icu/source/data/locales/* icu/source/data/coll/* icu/source/data/rbnf/* icu/source/data/mappings/* icu/source/data/misc/* icu/source/data/translit/* icu/source/data/unidata/* icu/source/test/testdata/*'
+
+usage()
+{
+ echo "Enter archive filename as a parameter: $0 icu-archive.tar"
+}
+# first make sure we at least one arg and it's a file we can read
+if [ $# -eq 0 ]; then
+ usage
+ exit
+fi
+tar_file=$1
+if [ ! -r $tar_file ]; then
+ echo "$tar_file does not exist or cannot be read."
+ usage
+ exit
+fi
+# set up a few variables
+
+echo ""
+echo "Extracting from $tar_file ..."
+echo ""
+
+# determine which directories in the data_files list
+# are included in the provided archive
+for data_dir in $data_files
+do
+ if (pax -f $tar_file $data_dir >/dev/null 2>&1)
+ then
+ ebcdic_data="$ebcdic_data `echo $data_dir`";
+ fi
+done
+
+# extract everything as iso-8859-1 except these directories
+pax -C 819 -rcvf $tar_file $ebcdic_data
+
+# extract files while converting them to EBCDIC
+echo ""
+echo "Extracting files which must be in ibm-37 ..."
+echo ""
+pax -C 37 -rvf $tar_file $ebcdic_data
+
+echo ""
+echo "Determining binary files ..."
+echo ""
+
+for file in `find ./icu \( -name \*.txt -print \)`; do
+ bom8=`head -n 1 $file|\
+ od -t x1|\
+ head -n 1|\
+ sed 's/ */ /g'|\
+ cut -f2-4 -d ' '|\
+ tr 'A-Z' 'a-z'`;
+ #Find a converted UTF-8 BOM
+ if [ "$bom8" = "057 08b 0ab" -o "$bom8" = "57 8b ab" ]
+ then
+ if [ `echo $binary_files1 | wc -w` -lt 250 ]
+ then
+ binary_files1="$binary_files1 `echo $file | cut -d / -f2-`";
+ else
+ binary_files2="$binary_files2 `echo $file | cut -d / -f2-`";
+ fi
+ fi
+done
+
+for i in $(pax -f $tar_file 2>/dev/null)
+do
+ case $i in
+ */)
+# then this entry is a directory
+ ;;
+ *.*)
+# then this entry has a dot in the filename
+ for j in $binary_suffixes
+ do
+ suf=${i#*.*}
+ if [ "$suf" = "$j" ]
+ then
+ binary_files2="$binary_files2 $i"
+ break
+ fi
+ done
+ ;;
+ *)
+# then this entry does not have a dot in it
+ ;;
+ esac
+done
+
+# now see if a re-extract of binary files is necessary
+if [ ${#binary_files1} -eq 0 -a ${#binary_files2} -eq 0 ]; then
+ echo ""
+ echo "There are no binary files to restore."
+else
+ echo "Restoring binary files ..."
+ echo ""
+ rm $binary_files1
+ rm $binary_files2
+ pax -C 819 -rvf $tar_file $binary_files1
+ pax -C 819 -rvf $tar_file $binary_files2
+fi
+
+echo ""
+echo "Generating qsh compatible configure ..."
+echo ""
+
+sed -f convertConfigure.sed icu/source/configure > icu/source/configureTemp
+del -f icu/source/configure
+mv icu/source/configureTemp icu/source/configure
+chmod 755 icu/source/configure
+
+echo ""
+echo "$0 has completed extracting ICU from $tar_file."
diff --git a/debian/.cvsignore b/debian/.cvsignore
new file mode 100644
index 0000000..2fe3e9b
--- /dev/null
+++ b/debian/.cvsignore
@@ -0,0 +1,17 @@
+*.debhelper
+docs
+*files
+*.substvars
+libicu-dev
+*libicu[0-9]*
+icu
+icu-locales
+icu-data
+icu-i18ndata
+tmp
+control
+postinst
+prerm
+icu.postinst
+icu.prerm
+icu-doc
diff --git a/debian/README.Debian.libicu-dev b/debian/README.Debian.libicu-dev
new file mode 100644
index 0000000..32a2fec
--- /dev/null
+++ b/debian/README.Debian.libicu-dev
@@ -0,0 +1,11 @@
+Copyright (C) 2000-2003, International Business Machines
+Corporation and others. All Rights Reserved.
+
+libicu-dev for Debian
+---------------------
+
+The documentation in /usr/share/doc/libicu-dev/docs/ provides a high-level
+overview of ICU. Detailed API documentation is provided by the icu-docs
+package.
+
+ -- Yves Arrouye <yves@debian.org>, Wed, 11 Oct 2000 19:37:57 -0700
diff --git a/debian/changelog b/debian/changelog
new file mode 100644
index 0000000..379ee4b
--- /dev/null
+++ b/debian/changelog
@@ -0,0 +1,155 @@
+icu (2.6.1-1) experimental; urgency=low
+
+ * New upstream version.
+ * Ivo Timmermans:
+ * debian/rules Don't create arch-all packages in the binary-arch
+ target. Closes: #184403
+
+ -- Ivo Timmermans <ivo@debian.org> Thu, 6 Nov 2003 09:03:44 +0100
+
+icu (2.6-1) experimental; urgency=low
+
+ * New upstream version. Closes: #162975
+ * debian/control: New maintainers
+ * Daniel Glassey:
+ * debian/rules Change the optimisations to -O3 and -O to get it to build
+ * debian/rules get the latest config.{sub,guess} from /usr/share/misc
+ so add build-dep on autotools-dev
+ * debian/postinst gencnval is now in {prefix}/bin
+ * Ivo Timmermans:
+ * debian/control Tightened debhelper build dependency
+ * debian/control Update Standards-Version
+
+ -- Daniel Glassey <wdg@debian.org> Wed, 3 Sep 2003 12:39:35 +0200
+
+icu (2.1-1.2) unstable; urgency=low
+
+ * NMU.
+ * Updated source/config.{sub,guess}. Closes: #182697
+
+ -- Ivo Timmermans <ivo@debian.org> Fri, 7 Mar 2003 20:58:23 +0100
+
+icu (2.1-1.1) unstable; urgency=low
+
+ * NMU.
+ * debian/control: Go through G++ ABI transition. Closes: #180124
+ * source/common/unicode/docmain.h: Fix \mainpage and \section tags,
+ so doxygen doesn't get confused any more. Closes: #178344
+ * debian/copyright: Added upstream URL. Closes: #165780
+ *
+
+ -- Ivo Timmermans <ivo@debian.org> Fri, 14 Feb 2003 15:21:56 +0100
+
+icu (2.1-1) unstable; urgency=low
+
+ * ICU 2.1 release.
+ * Changed the icu package description. Closes: 142886
+ * Use -O1 for CXXFLAGS for OS/390. Closes: 143021
+
+ -- Yves Arrouye <yves@debian.org> Mon, 15 Apr 2002 14:03:12 -0700
+
+icu (2.0.2-1) unstable; urgency=low
+
+ * Minor release of ICU with fixes for threading and strTo/FromWCS
+
+ -- Yves Arrouye <yves@debian.org> Tue, 2 Apr 2002 09:06:00 -0800
+
+icu (2.0-2.1pre20020318-1) unstable; urgency=low
+
+ * Use the library number in the development package too.
+ * ICU changed to version 2.1.
+
+ -- Yves Arrouye <yves@debian.org> Tue, 19 Mar 2002 18:38:37 -0800
+
+icu (2.0-2.1pre20020303-1) unstable; urgency=low
+
+ * Fixed a crash in uconv when no argument is passed to -f or -t.
+ * Other upstream changes.
+ * Fresh upload with an up to date orig tar file so that future
+ diffs won't be 6 megabytes long!
+
+ -- Yves Arrouye <yves@debian.org> Sun, 3 Mar 2002 15:31:13 -0800
+
+icu (2.0-2.1pre-1) unstable; urgency=low
+
+ * Prerelease of 2.1 with a working upgraded uconv(1).
+
+ -- Yves Arrouye <yves@debian.org> Fri, 1 Mar 2002 21:51:47 -0800
+
+icu (2.0-3) unstable; urgency=low
+
+ * Renamed doc-base to icu-doc.doc-base. Closes: 127487
+
+ -- Yves Arrouye <yves@debian.org> Fri, 18 Jan 2002 22:33:53 -0800
+
+icu (2.0-2) unstable; urgency=low
+
+ * Fixed a bug in uprv_uca_cloneTempTable(). Closes: 128484
+ * Update Debian bugs status. Closes: 104642
+ * Use the official 2.0 tarball as the original tar.
+ * Added manual pages for every tool.
+
+ -- Yves Arrouye <yves@debian.org> Wed, 16 Jan 2002 20:45:42 -0800
+
+icu (2.0-1) unstable; urgency=low
+
+ * Update to ICU version 2.0.
+
+ -- Yves Arrouye <yves@debian.org> Sat, 10 Nov 2001 21:58:19 -0800
+
+icu (1.8.1-2) unstable; urgency=low
+
+ * Updated copyright file. Closes: 112488
+ * Updated icu-locales description. Closes: 75499
+
+ -- Yves Arrouye <yves@debian.org> Sat, 10 Nov 2001 21:24:58 -0800
+
+icu (1.8.1-1.1) unstable; urgency=low
+
+ * NMU to resolve build failures on ia64 and (hopefully) hppa.
+ * config.{sub|guess} update
+ * source/tools/ctestfw/ctest.c: Add static declaration to global
+ variables local to that module to avoid @gprel relocation errors.
+ Closes: 104642
+
+ -- Yves Arrouye <yves@debian.org> Sat, 10 Nov 2001 21:24:44 -0800
+
+icu (1.8.1-1) unstable; urgency=low
+
+ * Update to ICU version 1.8.1.
+
+ -- root <yves@debian.org> Mon, 21 May 2001 15:27:36 -0700
+
+icu (1.7-1) unstable; urgency=low
+
+ * Update to ICU version 1.7.
+
+ -- Yves Arrouye <yves@debian.org> Tue, 21 Nov 2000 22:54:52 -0800
+
+icu (1.6.0.1-20001113-2) unstable; urgency=low
+
+ * New snapshot with better ISO-2022.
+
+ -- Yves Arrouye <yves@debian.org> Mon, 13 Nov 2000 21:05:00 -0800
+
+icu (1.6.0.1-20001027-1) unstable; urgency=low
+
+ * Move architecture-dependent files into /usr/lib, instead of
+ /usr/share.
+ * Move convrtrs.txt into /etc/icu, make it a conffile, and generate
+ /usr/lib/icu/1.6.0.1/cnvalias.dat from it at postinst time.
+ * Manage a /usr/lib/icu/current symbolic link across installations
+ of the libicuXX packages. The symlink will always point to the
+ highest numbered version of ICU.
+
+ -- Yves Arrouye <yves@debian.org> Fri, 27 Oct 2000 15:40:12 -0700
+
+icu (1.6.0.1-20001017-1) unstable; urgency=low
+
+ * Initial Release.
+
+ -- Yves Arrouye <yves@debian.org> Tue, 24 Oct 2000 16:14:12 -0700
+
+Local variables:
+mode: debian-changelog
+End:
diff --git a/debian/control b/debian/control
new file mode 100644
index 0000000..a183a62
--- /dev/null
+++ b/debian/control
@@ -0,0 +1,90 @@
+Source: icu
+Section: libs
+Priority: optional
+Maintainer: Daniel Glassey <wdg@debian.org>
+Uploaders: Ivo Timmermans <ivo@debian.org>
+Standards-Version: 3.6.0
+Build-Depends: debhelper (>> 3.0), doxygen, autotools-dev
+
+Package: libicu30-dev
+Section: devel
+Architecture: any
+Depends: libicu${major} (= ${Source-Version}), libc6-dev
+Provides: libicu-dev
+Conflicts: libicu-dev
+Suggests: icu-doc
+Description: International Components for Unicode (development files)
+ ICU is a C++ and C library that provides robust and full-featured Unicode
+ and locale support. This package contains the development files for ICU.
+
+Package: icu-doc
+Section: doc
+Architecture: all
+Description: API documentation for ICU classes and functions
+ ICU is a C++ and C library that provides robust and full-featured Unicode
+ and locale support. This package contains HTML files documenting the ICU
+ APIs.
+
+Package: libicu30
+Section: libs
+Architecture: any
+Depends: ${shlibs:Depends}
+Recommends: icu
+Description: International Components for Unicode (libraries)
+ ICU is a C++ and C library that provides robust and full-featured Unicode
+ and locale support. This package contains the runtime libraries for
+ ICU. It does not contain any of the data files needed at runtime and
+ present in the `icu' and `icu-locales` packages.
+
+Package: icu
+Section: libs
+Architecture: any
+Depends: libicu${major} (>= ${Source-Version}), make
+Recommends: icu-locales
+Description: International Components for Unicode (non locale data)
+ ICU is a C++ and C library that provides robust and full-featured Unicode
+ and locale support. The library provides calendar support, conversions
+ for more than 230 character sets, language-sensitive collation, date
+ and time formatting, support for more than 140 locales, message catalogs
+ and resources, message formatting, normalization, number and currency
+ formatting, time zones support, transliteration, word, line and
+ sentence breaking, etc.
+ .
+ This package contains the Unicode character database and derived
+ properties, along with converters and time zones data.
+ It also contains the tools needed to manipulate these data.
+
+Package: icu-locales
+Section: libs
+Architecture: any
+Depends: libicu${major} (>= ${Source-Version})
+Description: Locale data for ICU
+ The locale data are used by ICU to provide localization (l10n) and
+ internationalization (i18n) support to applications using the ICU library.
+ This package also contains break data for various languages, and
+ transliteration data.
+
+Package: icu-data
+Priority: extra
+Section: libs
+Architecture: all
+Depends: icu
+Description: Data for ICU (source files)
+ These data describe the Unicode data (normative and informative), and
+ also all the table-based converters provided in the ICU distribution.
+ .
+ This package contains uncompiled source data. Precompiled data are in the
+ `libicu${major}' package.
+
+Package: icu-i18ndata
+Priority: extra
+Section: libs
+Architecture: all
+Depends: icu
+Description: Locale data for ICU (source files)
+ The locale data are used by ICU to provide localization (l10n) and
+ internationalization (i18n) support to ICU applications. This package
+ also contains break data for various languages, and transliteration data.
+ .
+ This package contains uncompiled source data. Precompiled data are in the
+ `icu-locales' package.
diff --git a/debian/copyright b/debian/copyright
new file mode 100644
index 0000000..eddd3b4
--- /dev/null
+++ b/debian/copyright
@@ -0,0 +1,35 @@
+ICU License - ICU 1.8.1 and later
+
+COPYRIGHT AND PERMISSION NOTICE
+
+Copyright (c) 1995-2001 International Business Machines Corporation and others
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a
+copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, and/or sell copies of the Software, and to permit persons
+to whom the Software is furnished to do so, provided that the above
+copyright notice(s) and this permission notice appear in all copies of
+the Software and that both the above copyright notice(s) and this
+permission notice appear in supporting documentation.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
+OF THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
+HOLDERS INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL
+INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING
+FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
+NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
+WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+Except as contained in this notice, the name of a copyright holder
+shall not be used in advertising or otherwise to promote the sale, use
+or other dealings in this Software without prior written authorization
+of the copyright holder.
+
+--------------------------------------------------------------------------------
+All trademarks and registered trademarks mentioned herein are the property of their respective owners.
+
diff --git a/debian/icu-doc.doc-base b/debian/icu-doc.doc-base
new file mode 100644
index 0000000..9810e67
--- /dev/null
+++ b/debian/icu-doc.doc-base
@@ -0,0 +1,13 @@
+Document: icu-doc
+Title: ICU API Documentation
+Author: IBM Corporation and Others
+Abstract: This manual describes the APIs of the
+ International Components for Unicode C/C++
+ library. It is a useful reference for the
+ ICU programmer.
+Section: Libs
+
+Format: HTML
+Index: /usr/share/doc/icu-doc/html/index.html
+Files: /usr/share/doc/icu-doc/html/*.html
+
diff --git a/debian/icu.conffiles.in b/debian/icu.conffiles.in
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/debian/icu.conffiles.in
diff --git a/debian/icu.postinst.in b/debian/icu.postinst.in
new file mode 100644
index 0000000..fedd331
--- /dev/null
+++ b/debian/icu.postinst.in
@@ -0,0 +1,71 @@
+#! /bin/sh
+# Copyright (c) 2000-2004 International Business Machines
+# Corporation and others. All Rights Reserved.
+# postinst script for foo
+#
+# see: dh_installdeb(1)
+
+set -e
+
+# summary of how this script can be called:
+# * <postinst> `configure' <most-recently-configured-version>
+# * <old-postinst> `abort-upgrade' <new version>
+# * <conflictor's-postinst> `abort-remove' `in-favour' <package>
+# <new-version>
+# * <deconfigured's-postinst> `abort-deconfigure' `in-favour'
+# <failed-install-package> <version> `removing'
+# <conflicting-package> <version>
+# for details, see /usr/share/doc/packaging-manual/
+#
+# quoting from the policy:
+# Any necessary prompting should almost always be confined to the
+# post-installation script, and should be protected with a conditional
+# so that unnecessary prompting doesn't happen if a package's
+# installation fails and the `postinst' is called with `abort-upgrade',
+# `abort-remove' or `abort-deconfigure'.
+
+case "$1" in
+ configure)
+ # Adjust the current ICU link in @libdir@/@PACKAGE@
+
+ prefix=@prefix@
+ exec_prefix=@exec_prefix@
+
+ if [ -d @libdir@/@PACKAGE@ ]
+ then
+ icucurrent=`2>/dev/null ls -dp @libdir@/@PACKAGE@/* | sed -n 's,.*/\([^/]*\)/$,\1,p'| sort -rn | head -1`
+ cd @libdir@/@PACKAGE@
+ rm -f current
+ if test x"$icucurrent" != x
+ then
+ ln -s "$icucurrent" current
+ fi
+
+ # Set ICU_DATA for ease of testing files. It is not necessary to
+ # export it as we are guaranteed that the binaries we invoke will
+ # use the right directory. But we're not taking chances with the
+ # future :)
+
+ ICU_DATA=@libdir@/@PACKAGE@/@VERSION@
+ export ICU_DATA
+
+ fi
+ ;;
+
+ abort-upgrade|abort-remove|abort-deconfigure)
+
+ ;;
+
+ *)
+ echo "postinst called with unknown argument \`$1'" >&2
+ exit 0
+ ;;
+esac
+
+# dh_installdeb will replace this with shell code automatically
+# generated by other debhelper scripts.
+
+#DEBHELPER#
+
+exit 0
+
diff --git a/debian/icu.prerm.in b/debian/icu.prerm.in
new file mode 100644
index 0000000..28d8c01
--- /dev/null
+++ b/debian/icu.prerm.in
@@ -0,0 +1,56 @@
+#! /bin/sh
+# Copyright (c) 2000-2003 International Business Machines
+# Corporation and others. All Rights Reserved.
+# prerm script for foo
+#
+# see: dh_installdeb(1)
+
+set -e
+
+# summary of how this script can be called:
+# * <prerm> `remove'
+# * <old-prerm> `upgrade' <new-version>
+# * <new-prerm> `failed-upgrade' <old-version>
+# * <conflictor's-prerm> `remove' `in-favour' <package> <new-version>
+# * <deconfigured's-prerm> `deconfigure' `in-favour'
+# <package-being-installed> <version> `removing'
+# <conflicting-package> <version>
+# for details, see /usr/share/doc/packaging-manual/
+
+case "$1" in
+ remove|upgrade|deconfigure)
+ # Adjust the current ICU link in @libdir@/@PACKAGE@
+
+ prefix=@prefix@
+ exec_prefix=@exec_prefix@
+
+ if [ -d @libdir@/@PACKAGE@ ]
+ then
+ icucurrent=`2>/dev/null ls -dp @libdir@/@PACKAGE@/* | sed -n 's,.*/\([^/]*\)/$,\1,p'| sort -rn | head -1`
+ cd @libdir@/@PACKAGE@
+ rm -f current
+ if test x"$icucurrent" != x
+ then
+ ln -s "$icucurrent" current
+ fi
+ fi
+
+# install-info --quiet --remove /usr/info/foo.info.gz
+ ;;
+
+ failed-upgrade)
+ ;;
+ *)
+ echo "prerm called with unknown argument \`$1'" >&2
+ exit 0
+ ;;
+esac
+
+# dh_installdeb will replace this with shell code automatically
+# generated by other debhelper scripts.
+
+#DEBHELPER#
+
+exit 0
+
+
diff --git a/debian/libicu.postinst b/debian/libicu.postinst
new file mode 100644
index 0000000..a262d90
--- /dev/null
+++ b/debian/libicu.postinst
@@ -0,0 +1,70 @@
+#! /bin/sh
+# Copyright (c) 2000-2003 International Business Machines
+# Corporation and others. All Rights Reserved.
+# postinst script for foo
+#
+# see: dh_installdeb(1)
+
+set -e
+
+# summary of how this script can be called:
+# * <postinst> `configure' <most-recently-configured-version>
+# * <old-postinst> `abort-upgrade' <new version>
+# * <conflictor's-postinst> `abort-remove' `in-favour' <package>
+# <new-version>
+# * <deconfigured's-postinst> `abort-deconfigure' `in-favour'
+# <failed-install-package> <version> `removing'
+# <conflicting-package> <version>
+# for details, see /usr/share/doc/packaging-manual/
+#
+# quoting from the policy:
+# Any necessary prompting should almost always be confined to the
+# post-installation script, and should be protected with a conditional
+# so that unnecessary prompting doesn't happen if a package's
+# installation fails and the `postinst' is called with `abort-upgrade',
+# `abort-remove' or `abort-deconfigure'.
+
+# Call ldconfig in a way that makes lintian happy.
+
+if [ "$1" = "configure" ]; then ldconfig; fi
+
+# And now do the rest of the configuration
+
+case "$1" in
+ configure)
+
+ # Adjust the current ICU link in /usr/lib/icu
+
+ if [ -d /usr/lib/icu ]
+ then
+
+ icucurrent=`2>/dev/null ls -dp /usr/lib/icu/* | sed -n 's,.*/\([^/]*\)/$,\1,p'| sort -rn | head -1`
+ cd /usr/lib/icu
+ rm -f current
+ if test x"$icucurrent" != x
+ then
+ ln -s "$icucurrent" current
+ ln -sf current/Makefile.inc .
+ fi
+
+ fi
+ ;;
+
+ abort-upgrade|abort-remove|abort-deconfigure)
+
+ ;;
+
+ *)
+ echo "postinst called with unknown argument \`$1'" >&2
+ exit 0
+ ;;
+esac
+
+# dh_installdeb will replace this with shell code automatically
+# generated by other debhelper scripts.
+
+#DEBHELPER#
+
+exit 0
+
+
diff --git a/debian/libicu.prerm.in b/debian/libicu.prerm.in
new file mode 100644
index 0000000..a06ac25
--- /dev/null
+++ b/debian/libicu.prerm.in
@@ -0,0 +1,55 @@
+#! /bin/sh
+# Copyright (c) 2000-2003 International Business Machines
+# Corporation and others. All Rights Reserved.
+# prerm script for foo
+#
+# see: dh_installdeb(1)
+
+set -e
+
+# summary of how this script can be called:
+# * <prerm> `remove'
+# * <old-prerm> `upgrade' <new-version>
+# * <new-prerm> `failed-upgrade' <old-version>
+# * <conflictor's-prerm> `remove' `in-favour' <package> <new-version>
+# * <deconfigured's-prerm> `deconfigure' `in-favour'
+# <package-being-installed> <version> `removing'
+# <conflicting-package> <version>
+# for details, see /usr/share/doc/packaging-manual/
+
+case "$1" in
+ remove|upgrade|deconfigure)
+ # Adjust the current ICU link in @libdir@/@PACKAGE@
+
+ prefix=@prefix@
+ exec_prefix=@exec_prefix@
+
+ if [ -d @libdir@/@PACKAGE@ ]
+ then
+ icucurrent=`2>/dev/null ls -dp @libdir@/@PACKAGE@/* | sed -n 's,.*/\([^/]*\)/$,\1,p'| sort -rn | head -1`
+ cd @libdir@/@PACKAGE@
+ rm -f current
+ if test x"$icucurrent" != x
+ then
+ ln -s "$icucurrent" current
+ fi
+ fi
+
+# install-info --quiet --remove /usr/info/foo.info.gz
+ ;;
+ failed-upgrade)
+ ;;
+ *)
+ echo "prerm called with unknown argument \`$1'" >&2
+ exit 0
+ ;;
+esac
+
+# dh_installdeb will replace this with shell code automatically
+# generated by other debhelper scripts.
+
+#DEBHELPER#
+
+exit 0
+
+
diff --git a/debian/postinst.in b/debian/postinst.in
new file mode 100644
index 0000000..1e7a3f7
--- /dev/null
+++ b/debian/postinst.in
@@ -0,0 +1,63 @@
+#! /bin/sh
+# Copyright (c) 2000-2003 International Business Machines
+# Corporation and others. All Rights Reserved.
+# postinst script for foo
+#
+# see: dh_installdeb(1)
+
+set -e
+
+# summary of how this script can be called:
+# * <postinst> `configure' <most-recently-configured-version>
+# * <old-postinst> `abort-upgrade' <new version>
+# * <conflictor's-postinst> `abort-remove' `in-favour' <package>
+# <new-version>
+# * <deconfigured's-postinst> `abort-deconfigure' `in-favour'
+# <failed-install-package> <version> `removing'
+# <conflicting-package> <version>
+# for details, see /usr/share/doc/packaging-manual/
+#
+# quoting from the policy:
+# Any necessary prompting should almost always be confined to the
+# post-installation script, and should be protected with a conditional
+# so that unnecessary prompting doesn't happen if a package's
+# installation fails and the `postinst' is called with `abort-upgrade',
+# `abort-remove' or `abort-deconfigure'.
+
+case "$1" in
+ configure)
+ # Adjust the current ICU link in @libdir@/@PACKAGE@
+
+ prefix=@prefix@
+ exec_prefix=@exec_prefix@
+
+ if [ -d @libdir@/@PACKAGE@ ]
+ then
+ icucurrent=`2>/dev/null ls -dp @libdir@/@PACKAGE@/* | sed -n 's,.*/\([^/]*\)/$,\1,p'| sort -rn | head -1`
+ cd @libdir@/@PACKAGE@
+ rm -f current
+ if test x"$icucurrent" != x
+ then
+ ln -s "$icucurrent" current
+ fi
+ fi
+ ;;
+
+ abort-upgrade|abort-remove|abort-deconfigure)
+
+ ;;
+
+ *)
+ echo "postinst called with unknown argument \`$1'" >&2
+ exit 0
+ ;;
+esac
+
+# dh_installdeb will replace this with shell code automatically
+# generated by other debhelper scripts.
+
+#DEBHELPER#
+
+exit 0
+
+
diff --git a/debian/prerm.in b/debian/prerm.in
new file mode 100644
index 0000000..a06ac25
--- /dev/null
+++ b/debian/prerm.in
@@ -0,0 +1,55 @@
+#! /bin/sh
+# Copyright (c) 2000-2003 International Business Machines
+# Corporation and others. All Rights Reserved.
+# prerm script for foo
+#
+# see: dh_installdeb(1)
+
+set -e
+
+# summary of how this script can be called:
+# * <prerm> `remove'
+# * <old-prerm> `upgrade' <new-version>
+# * <new-prerm> `failed-upgrade' <old-version>
+# * <conflictor's-prerm> `remove' `in-favour' <package> <new-version>
+# * <deconfigured's-prerm> `deconfigure' `in-favour'
+# <package-being-installed> <version> `removing'
+# <conflicting-package> <version>
+# for details, see /usr/share/doc/packaging-manual/
+
+case "$1" in
+ remove|upgrade|deconfigure)
+ # Adjust the current ICU link in @libdir@/@PACKAGE@
+
+ prefix=@prefix@
+ exec_prefix=@exec_prefix@
+
+ if [ -d @libdir@/@PACKAGE@ ]
+ then
+ icucurrent=`2>/dev/null ls -dp @libdir@/@PACKAGE@/* | sed -n 's,.*/\([^/]*\)/$,\1,p'| sort -rn | head -1`
+ cd @libdir@/@PACKAGE@
+ rm -f current
+ if test x"$icucurrent" != x
+ then
+ ln -s "$icucurrent" current
+ fi
+ fi
+
+# install-info --quiet --remove /usr/info/foo.info.gz
+ ;;
+ failed-upgrade)
+ ;;
+ *)
+ echo "prerm called with unknown argument \`$1'" >&2
+ exit 0
+ ;;
+esac
+
+# dh_installdeb will replace this with shell code automatically
+# generated by other debhelper scripts.
+
+#DEBHELPER#
+
+exit 0
+
+
diff --git a/debian/rules b/debian/rules
new file mode 100755
index 0000000..772b135
--- /dev/null
+++ b/debian/rules
@@ -0,0 +1,256 @@
+#!/usr/bin/make -f
+# Copyright (c) 2000-2004 International Business Machines
+# Corporation and others. All Rights Reserved.
+# ICU debian/rules that uses debhelper.
+
+# The Debian packages for ICU are created and maintained by
+# Yves Arrouye <yves@debian.org>. They are part of Debian GNU/Linux
+# since the Debian woody release.
+
+# Decide whether we want to automatically manage the repackaging of
+# the common data from individual files or not.
+ICU_AUTO_COMMON=NO
+
+# Uncomment this to turn on verbose mode.
+#export DH_VERBOSE=1
+
+# This is the debhelper compatability version to use.
+export DH_COMPAT=2
+#firstdir := $(shell sed -n 's/Package: \(.*\)/\1/p' debian/control | head -1)else
+
+# Where the source for ICU is, where to build
+srcdir = source
+builddir = build
+# How to get to $(srcdir) from $(builddir)
+builddir_relative_topdir = ..
+builddir_relative_srcdir = $(builddir_relative_topdir)/$(srcdir)
+
+# Getting the ICU version numbers, stolen from configure.in (that's okay, I
+# wrote the configure.in part anyway)
+
+version := $(shell sed -n -e 's/^[ ]*\#[ ]*define[ ]*U_ICU_VERSION[ ]*"\([^"]*\)".*/\1/p' $(srcdir)/common/unicode/uversion.h)
+libversion := $(shell echo $(version) | sed -e 's/\.//' -e 's/^\([^.]*\)$$/\1.0/')
+major := $(shell echo $(libversion) | sed 's/\..*//')
+
+# ICU installation directories, w/o the initial slash
+pkgdatadir = usr/share/icu
+icudatadir = $(pkgdatadir)/$(version)
+pkglibdir = usr/lib/icu
+iculibdir = $(pkglibdir)/$(version)
+datasrcdir = usr/share/icu/$(version)/data
+# This is where data needs to be moved
+ifeq ($(ICU_AUTO_COMMON),YES)
+icufildir = $(iculibdir)/files
+else
+icufildir = $(iculibdir)
+endif
+
+# Build flags
+
+CFLAGS = -O3 # -Wall
+ifeq ($(shell uname -m),s390)
+CXXFLAGS = -O1 # -Wall
+else
+CXXFLAGS = -O # -Wall
+endif
+
+INSTALL_PROGRAM = /usr/bin/install
+
+ifneq (,$(findstring debug,$(DEB_BUILD_OPTIONS)))
+CFLAGS += -g
+CXXFLAGS += -g
+endif
+ifneq (,$(findstring nostrip,$(DEB_BUILD_OPTIONS)))
+INSTALL_PROGRAM += -s
+endif
+
+all: build
+
+configure: $(builddir)/configure-stamp
+$(builddir)/configure-stamp:
+ # Add here commands to configure the package.
+ test -d $(builddir) || mkdir $(builddir)
+ cd $(builddir); CFLAGS='$(CFLAGS)' CXXFLAGS='$(CXXFLAGS)' INSTALL_PROGRAM='$(INSTALL_PROGRAM)' $(SHELL) $(builddir_relative_srcdir)/configure --srcdir=$(builddir_relative_srcdir) --prefix=/usr --mandir=/usr/share/man --sysconfdir=/etc --localstatedir=/var --with-data-packaging=files --enable-shared --enable-static --disable-samples
+ touch $@
+
+build: $(builddir)/configure-stamp debian-files $(builddir)/build-stamp
+
+# Build some Debian files
+DEBIAN_FILES=icu.conffiles postinst prerm icu.postinst icu.prerm libicu$(major).postinst README.Debian.libicu$(major)-dev
+
+debian/%: debian/%.in
+ cd $(builddir) \
+ && CONFIG_FILES=$(builddir_relative_topdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
+
+debian/libicu$(major)%: debian/libicu%
+ cp $< $@
+debian/README.Debian.libicu$(major)%: debian/README.Debian.libicu%
+ cp $< $@
+
+debian-files: $(addprefix debian/,$(DEBIAN_FILES))
+
+$(builddir)/build-stamp:
+ dh_testdir
+
+ # Add here commands to compile the package.
+ $(MAKE) -C $(builddir)
+ $(MAKE) -C $(builddir) doc
+
+ touch $@
+
+clean: update-debian-files
+ dh_testdir
+ dh_testroot
+ -test -r /usr/share/misc/config.sub && \
+ cp -f /usr/share/misc/config.sub $(srcdir)/config.sub
+ -test -r /usr/share/misc/config.guess && \
+ cp -f /usr/share/misc/config.guess $(srcdir)/config.guess
+
+ $(RM) $(builddir)/build-stamp $(builddir)/configure-stamp
+
+ # Add here commands to clean up after the build process.
+ -$(MAKE) -C $(builddir) distclean
+ #-$(RM) `find $(builddir)/samples $(builddir)/test -name Makefile -print`
+ -$(RM) `find $(builddir) -name Makefile -print`
+ dh_clean
+ $(RM) $(addprefix debian/,$(DEBIAN_FILES)) debian/control.new
+
+ #if test -d $(builddir) -a $(builddir) != $(srcdir); then rmdir `find $(builddir) -type d -print | sort -r`; fi
+ if test -d $(builddir) -a $(builddir) != $(srcdir); then $(RM) -r $(builddir); fi
+
+install: build
+ dh_testdir
+ dh_testroot
+ dh_clean -k
+ dh_installdirs
+
+ # Add here commands to install the package into debian/tmp
+ $(MAKE) -C $(builddir) install DESTDIR=`pwd`/debian/tmp
+ $(MAKE) -C $(builddir) install-doc DESTDIR=`pwd`/debian/tmp
+
+# Build architecture-independent files here.
+binary-indep: build install
+ #
+ # build icu-doc package by moving files
+ #
+ mv debian/tmp/usr/share/doc/icu debian/tmp/usr/share/doc/icu-doc
+ dh_movefiles -picu-doc \
+ usr/share/doc/icu-doc
+ #
+ # build icu-i18ndata from the source data
+ #
+ for d in locales translit brkitr; do \
+ test -d debian/icu-i18ndata/$(datasrcdir)/$$d || \
+ mkdir -p debian/icu-i18ndata/$(datasrcdir)/$$d; \
+ install -m 644 $(srcdir)/data/$$d/*.* \
+ debian/icu-i18ndata/$(datasrcdir)/$$d; \
+ done
+ #
+ # build icu-data from the source data
+ #
+ for d in mappings unidata misc; do \
+ test -d debian/icu-data/$(datasrcdir)/$$d || \
+ mkdir -p debian/icu-data/$(datasrcdir)/$$d; \
+ install -m 644 $(srcdir)/data/$$d/*.* \
+ debian/icu-data/$(datasrcdir)/$$d; \
+ done
+
+# Build architecture-dependent files here.
+binary-arch: build install
+# dh_testversion
+ dh_testdir
+ dh_testroot
+ #
+ # build libicu${major} package by moving files from icu-dev
+ #
+ $(RM) debian/tmp/usr/lib/libicuctestfw.*
+ dh_movefiles -plibicu$(major) \
+ usr/lib/*.so.*
+ mkdir debian/libicu$(major)/usr/lib/icu
+ #
+ # massage data files
+ #
+# $(RM) debian/tmp/$(iculibdir)/cnvalias.dat
+ifneq ($(iculibdir),$(icufildir))
+ test -d debian/tmp/$(icufildir) || mkdir debian/tmp/$(icufildir)
+ mv debian/tmp/$(iculibdir)/*.* debian/tmp/$(icufildir)
+ mv debian/tmp/$(icufildir)/*msg.dat debian/tmp/$(iculibdir)
+ mv debian/tmp/$(icufildir)/*.inc debian/tmp/$(iculibdir)
+endif
+ #
+ # build icu package by moving files from icu-dev
+ #
+ $(RM) debian/tmp/$(iculibdir)/../Makefile.inc debian/tmp/$(iculibdir)/../current
+ifneq ($(iculibdir),$(icufildir))
+ dh_movefiles -picu \
+ $(iculibdir)/*msg.dat
+endif
+ # The license.html must be installed with ICU's source code.
+ # This includes the headers.
+ dh_movefiles -picu \
+ etc \
+ usr/bin \
+ usr/sbin \
+ $(icudatadir)/license.html \
+ $(iculibdir)/*.inc \
+ $(icufildir)/*.cnv \
+ $(icufildir)/*.dat \
+ usr/share/man
+ #
+ # build icu-locales package by moving files from icu-dev
+ #
+ dh_movefiles -picu-locales \
+ $(icufildir)/*.res \
+ $(icufildir)/*.brk
+ #
+ # move the rest of the development files
+ # in their package
+ #
+ dh_movefiles -a usr
+ #
+ # do a bit of cleanup
+ #
+ $(RM) -r debian/tmp/etc debian/tmp/usr/sbin \
+ debian/tmp/usr/share/man
+ #
+ # continue to prepare packages
+ #
+# dh_installdebconf
+ dh_installdocs -a
+ dh_installexamples -a $(srcdir)/samples/*
+ find debian/libicu$(major)-dev -name CVS -o -name .cvsignore | xargs $(RM) -r
+ dh_installmenu -a
+# dh_installemacsen
+# dh_installpam
+# dh_installinit
+ dh_installcron -a
+ dh_installmanpages -picu
+ dh_installinfo -a
+ # dh_undocumented -picu
+ dh_installchangelogs -a
+ dh_link -a
+ dh_strip -a
+ dh_compress -a
+ dh_fixperms -a
+ # You may want to make some executables suid here.
+ dh_makeshlibs -a
+ dh_installdeb -a
+# dh_perl
+ dh_shlibdeps -a -ldebian/libicu$(major)/usr/lib
+ dh_gencontrol -a -- -Vversion=$(version) -Vmajor=$(major)
+ dh_md5sums -a
+ dh_builddeb -a
+
+# Automatically update changelog and control
+update-debian-files:
+ if [ x"$$NO_AUTO_DCH" = x ]; \
+ then \
+ cvers=`sed -n 's/^icu (\([^)]*\)).*/\1/p' debian/changelog | head -1`; if dpkg --compare-versions $$cvers lt $(version)-1; then \
+ dch -v $(version)-1 "Update to ICU version $(version). (This comment is generated.)"; \
+ sed 's/libicu[0-9][0-9]*/libicu$(major)/g' debian/control >debian/control.new && mv debian/control.new debian/control; \
+ fi; \
+ fi
+
+binary: update-debian-files binary-indep binary-arch
+.PHONY: build clean binary-indep binary-arch binary install debian-files update-changelog
+
diff --git a/license.html b/license.html
new file mode 100644
index 0000000..00d356d
--- /dev/null
+++ b/license.html
@@ -0,0 +1,45 @@
+<html>
+
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=us-ascii"></meta>
+<title>ICU License - ICU 1.8.1 and later</title>
+</head>
+
+<body>
+<h1>ICU License - ICU 1.8.1 and later</h1>
+<pre>
+COPYRIGHT AND PERMISSION NOTICE
+
+Copyright (c) 1995-2005 International Business Machines Corporation and others
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a
+copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, and/or sell copies of the Software, and to permit persons
+to whom the Software is furnished to do so, provided that the above
+copyright notice(s) and this permission notice appear in all copies of
+the Software and that both the above copyright notice(s) and this
+permission notice appear in supporting documentation.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
+OF THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
+HOLDERS INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL
+INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING
+FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
+NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
+WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+Except as contained in this notice, the name of a copyright holder
+shall not be used in advertising or otherwise to promote the sale, use
+or other dealings in this Software without prior written authorization
+of the copyright holder.
+
+--------------------------------------------------------------------------------
+All trademarks and registered trademarks mentioned herein are the property of their respective owners.
+</pre>
+</body>
+</html>
diff --git a/packaging/PACKAGES b/packaging/PACKAGES
new file mode 100644
index 0000000..12b3523
--- /dev/null
+++ b/packaging/PACKAGES
@@ -0,0 +1,159 @@
+Copyright (C) 2000-2003, International Business Machines
+Corporation and others. All Rights Reserved.
+ICU is packaged into a number of small, interdependent packages. This
+file describes what these packages are, what their name should be
+like, and what their contents are. It is useful as a reference and a
+guide when packaging ICU on a new system.
+
++ List of ICU packages.
+
+ICU is distributed as the following packages:
+
+- ICU libraries. This package contains the runtime libraries needed by
+applications that use ICU. All the other packages require this package
+to be installed.
+- ICU. This package contains the converters data, the timezones data,
+and all the ICU tools.
+- ICU locales. This package adds locales and break data.
+- ICU development. This package contains the files necessary to build
+applications that use ICU, i.e. header files, links to shared
+libraries used by the linker, static libraries, etc... It also
+contains sample applications and documentation.
+- ICU docs. This package contains further documentation for ICU,
+including a complete API reference.
+- ICU data. This package contains the source for the compiled data
+contained by the ICU package.
+- ICU international data. This package contains the source for the
+compiled data contained by the ICU locales package.
+
+In this file, we will refer to Autoconf variables as in $(bindir). In
+addition to these, we will use the following variables to denote
+ICU-specific directories or information:
+
+ VERSION ICU's dotted version number, e.g. 1.6.0.1 as of this
+ writing.
+
+ ICUDATADIR The directory where portable ICU data are. This is
+ defined as $(datadir)/icu/$(VERSION).
+ ICULIBDIR The directory where platform-specific ICU data
+ are. This is defined as $(libdir)/icu/$(VERSION).
+ ICUSYSCONFDIR The directory where ICU configuration files are. This
+ is defined as $(sysconfdir)/icu.
+
+When referring to libraries, .so will be used to denote the extension
+of a shared library, and .a to denote the extension of a static
+library. These extensions will actually be different on some platforms.
+
++ Configuration and compilation of ICU
+
+ICU should be configured with the following options:
+
+ --with-data-packaging=files
+ --disable-rpath
+ --enable-shared
+ --enable-static
+ --without-samples
+
+in addition to platform-specific settings (like a specific mandir or
+sysconfdir). Note that the use of --disable-rpath assumes that the
+packaging is made for a standard location, or that the package
+installation/deinstallation will correctly manage the configuration
+of the system's dyanmic loader. This is the right way of doing things.
+
+The configure script invokation should also be done with
+
+ CFLAGS="-O2"
+
+set, as in:
+
+ $ CFLAGS="-O2" ./configure ...
+
+The files packaging mode is chosen because it offers the maximum
+flexibility. Packages can be split easily, and system administrators
+can add converters, aliases, and other resources with little
+effort. Ideally, the ICU build will be modified to allow for distributing a
+libicudata.so with all the converters and locales, but indexes and aliases
+as separate files. But for now, this is the easiest way to get started.
+
++ The ICU libraries package
+
+The ICU libraries package is typically named `libicuXX' where XX is
+the major number of ICU's libraries. This number is ICU's version
+number multiplied by 10 and rounded down to the nearest integer (it is
+also the value of the LIB_VERSION_MAJOR configure substitution
+variable). For example, for ICU 1.6.0.1, it is 16, so the package name
+is `libicu16'. The major version is part of the package name to allow
+for the simultaneous installation of different ICU releases.
+
+This package contains:
+
+- All the shared libraries, and their major number symbolic link, but
+not the .so symbolic link that is only used at link time (this one is
+part of the development package). These are $(libdir)/libicu*.so.* and
+$(libdir)/libustdio.so.* at the time of this writing.
+
++ The ICU package
+
+The ICU package is simply named `icu'. It provides data used by the ICU
+libraries package and commands to create and manipulate that data.
+
+This package contains:
+
+- The Unicode data files (uprops.dat and unames.dat as of this writing).
+- The time zones data files (tz.dat).
+- All the binary data files for converters (.cnv files).
+- All the ICU commands.
+- The manual pages for ICU commands and file formats.
+
++ The ICU locales package
+
+The ICU locales package is named `icu-locales'. It provides data used by
+internationalization support in ICU.
+
+This package contains:
+
+- All the data for locales in ICU (.dat files).
+- All the break data for specific locales (.brk files).
+
++ The ICU development package
+
+The ICU developpment package is named `libicu-dev'. It provides all
+the files necessary to write applications that use ICU, along with
+examples and some documentation.
+
+This package contains:
+
+- The /usr/include/unicode directory which contains all the ICU
+headers.
+- The .so symbolic links used by the linker to link against the
+latest version of the libraries.
+- A sample Makefile fragment that can be included by applications
+using ICU, to faciliate their building, along with a platform-specific
+configuration file included by this fragment.
+- The sample applications from the ICU source tree, in an appropriate
+location for the system that the package is installed on (for example,
+on Debian, in /usr/share/doc/libicu-dev/examples).
+
+This package depends on the ICU libraries package with the exact same
+version, since it provides .so symbolic links to the latest libraries.
+
++ The ICU docs package
+
+The ICU docs package is named `libicu-doc'. It contains the files
+generated by doxygen when the `make doc' command is executed, in a
+location appropriate for the system that the package is installed on.
+
++ The ICU data package
+
+The ICU data package is named `icu-data'. It contains source files for
+the data found in the ICU package. These files are installed in
+$(ICUDATADIR).
+
++ The ICU international data package
+
+The ICU data package is named `icu-i18ndata'. It contains source files for
+the dat founf in the ICU locales package. These files are installed in
+$(ICUDATADIR).
+
+----
+Yves Arrouye <yves@realnames.com>
diff --git a/packaging/README b/packaging/README
new file mode 100644
index 0000000..1bfe85a
--- /dev/null
+++ b/packaging/README
@@ -0,0 +1,13 @@
+Copyright (C) 2000-2003, International Business Machines
+Corporation and others. All Rights Reserved.
+
+This directory contains information, input files and scripts for
+packaging ICU using specific packaging tools. We assume that the
+packager is familiar with the tools and procedures needed to build a
+package for a given packaging method (for example, how to use
+dpkg-buildpackage(1) on Debian GNU/Linux, or rpm(8) on distributions that
+use RPM packages).
+
+Please read the file PACKAGES if you are interested in packaging ICU
+yourself. It describes what the different packages should be, and what
+their contents are.
diff --git a/packaging/debian/README b/packaging/debian/README
new file mode 100644
index 0000000..0388625
--- /dev/null
+++ b/packaging/debian/README
@@ -0,0 +1,5 @@
+// Copyright (c) 2000-2003 International Business Machines
+// Corporation and others. All Rights Reserved.
+The Debian packaging is in the debian directory at the toplevel of ICU's
+distribution.
+
diff --git a/packaging/rpm/icu.spec b/packaging/rpm/icu.spec
new file mode 100644
index 0000000..6a1e63b
--- /dev/null
+++ b/packaging/rpm/icu.spec
@@ -0,0 +1,228 @@
+# Copyright (C) 2000-2005, International Business Machines
+# Corporation and others. All Rights Reserved.
+#
+# RPM specification file for ICU.
+#
+# Neal Probert <nprobert@walid.com> is the current maintainer.
+# Yves Arrouye <yves@realnames.com> is the original author.
+
+# This file can be freely redistributed under the same license as ICU.
+
+Name: icu
+Version: 3.4
+Release: 1
+Requires: libicu34 >= %{version}
+Summary: International Components for Unicode
+Packager: Ian Holsman (CNET Networks) <ianh@cnet.com>
+Copyright: X License
+Group: System Environment/Libraries
+Source: icu-%{version}.tgz
+BuildRoot: /var/tmp/%{name}-%{version}
+%description
+ICU is a set of C and C++ libraries that provides robust and full-featured
+Unicode and locale support. The library provides calendar support, conversions
+for many character sets, language sensitive collation, date
+and time formatting, support for many locales, message catalogs
+and resources, message formatting, normalization, number and currency
+formatting, time zones support, transliteration, word, line and
+sentence breaking, etc.
+
+This package contains the Unicode character database and derived
+properties, along with converters and time zones data.
+
+This package contains the runtime libraries for ICU. It does
+not contain any of the data files needed at runtime and present in the
+`icu' and `icu-locales` packages.
+
+%package -n libicu34
+Summary: International Components for Unicode (libraries)
+Group: Development/Libraries
+%description -n libicu34
+ICU is a set of C and C++ libraries that provides robust and full-featured
+Unicode support. This package contains the runtime libraries for ICU. It does
+not contain any of the data files needed at runtime and present in the
+`icu' and `icu-locales` packages.
+
+%package -n libicu-devel
+Summary: International Components for Unicode (development files)
+Group: Development/Libraries
+Requires: libicu34 = %{version}
+%description -n libicu-devel
+ICU is a set of C and C++ libraries that provides robust and full-featured
+Unicode support. This package contains the development files for ICU.
+
+%package locales
+Summary: Locale data for ICU
+Group: System Environment/Libraries
+Requires: libicu34 >= %{version}
+%description locales
+The locale data are used by ICU to provide localization (l10n),
+internationalization (i18n) and timezone support to ICU applications.
+This package also contains break data for various languages,
+and transliteration data.
+
+%post
+# Adjust the current ICU link in /usr/lib/icu
+
+icucurrent=`2>/dev/null ls -dp /usr/lib/icu/* | sed -n 's,.*/\([^/]*\)/$,\1,p'| sort -rn | head -1`
+cd /usr/lib/icu
+rm -f /usr/lib/icu/current
+if test x"$icucurrent" != x
+then
+ ln -s "$icucurrent" current
+fi
+
+#ICU_DATA=/usr/share/icu/%{version}
+#export ICU_DATA
+
+%preun
+# Adjust the current ICU link in /usr/lib/icu
+
+icucurrent=`2>/dev/null ls -dp /usr/lib/icu/* | sed -n -e '/\/%{version}\//d' -e 's,.*/\([^/]*\)/$,\1,p'| sort -rn | head -1`
+cd /usr/lib/icu
+rm -f /usr/lib/icu/current
+if test x"$icucurrent" != x
+then
+ ln -s "$icucurrent" current
+fi
+
+%post -n libicu34
+ldconfig
+
+# Adjust the current ICU link in /usr/lib/icu
+
+icucurrent=`2>/dev/null ls -dp /usr/lib/icu/* | sed -n 's,.*/\([^/]*\)/$,\1,p'| sort -rn | head -1`
+cd /usr/lib/icu
+rm -f /usr/lib/icu/current
+if test x"$icucurrent" != x
+then
+ ln -s "$icucurrent" current
+fi
+
+%preun -n libicu34
+# Adjust the current ICU link in /usr/lib/icu
+
+icucurrent=`2>/dev/null ls -dp /usr/lib/icu/* | sed -n -e '/\/%{version}\//d' -e 's,.*/\([^/]*\)/$,\1,p'| sort -rn | head -1`
+cd /usr/lib/icu
+rm -f /usr/lib/icu/current
+if test x"$icucurrent" != x
+then
+ ln -s "$icucurrent" current
+fi
+
+%prep
+%setup -q -n icu
+
+%build
+cd source
+chmod a+x ./configure
+CFLAGS="-O3" CXXFLAGS="-O" ./configure --prefix=/usr --sysconfdir=/etc --with-data-packaging=files --enable-shared --enable-static --disable-samples
+echo 'CPPFLAGS += -DICU_DATA_DIR=\"/usr/share/icu/%{version}\"' >> icudefs.mk
+make RPM_OPT_FLAGS="$RPM_OPT_FLAGS"
+
+%install
+rm -rf $RPM_BUILD_ROOT
+cd source
+make install DESTDIR=$RPM_BUILD_ROOT
+
+%files
+%defattr(-,root,root)
+%doc readme.html
+%doc license.html
+/usr/share/icu/%{version}/license.html
+/usr/share/icu/%{version}/icudt34l/*.cnv
+/usr/share/icu/%{version}/icudt34l/*.icu
+/usr/share/icu/%{version}/icudt34l/*.spp
+
+/usr/bin/derb
+/usr/bin/genbrk
+/usr/bin/gencnval
+/usr/bin/genrb
+/usr/bin/icu-config
+/usr/bin/makeconv
+/usr/bin/pkgdata
+/usr/bin/uconv
+
+/usr/sbin/decmn
+/usr/sbin/genccode
+/usr/sbin/gencmn
+/usr/sbin/gensprep
+/usr/sbin/genuca
+/usr/sbin/icuswap
+/usr/share/icu/%{version}/mkinstalldirs
+
+/usr/man/man1/derb.1.*
+/usr/man/man1/gencnval.1.*
+/usr/man/man1/genrb.1.*
+/usr/man/man1/icu-config.1.*
+/usr/man/man1/makeconv.1.*
+/usr/man/man1/pkgdata.1.*
+/usr/man/man1/uconv.1.*
+/usr/man/man8/decmn.8.*
+/usr/man/man8/genccode.8.*
+/usr/man/man8/gencmn.8.*
+/usr/man/man8/gensprep.8.*
+/usr/man/man8/genuca.8.*
+
+%files -n icu-locales
+/usr/share/icu/%{version}/icudt34l/*.brk
+/usr/share/icu/%{version}/icudt34l/*.res
+/usr/share/icu/%{version}/icudt34l/coll/*.res
+/usr/share/icu/%{version}/icudt34l/rbnf/*.res
+/usr/share/icu/%{version}/icudt34l/translit/*.res
+
+%files -n libicu34
+%doc license.html
+/usr/lib/libicui18n.so.34
+/usr/lib/libicui18n.so.34.0
+/usr/lib/libicutu.so.34
+/usr/lib/libicutu.so.34.0
+/usr/lib/libicuuc.so.34
+/usr/lib/libicuuc.so.34.0
+/usr/lib/libicudata.so.34
+/usr/lib/libicudata.so.34.0
+/usr/lib/libicuio.so.34
+/usr/lib/libicuio.so.34.0
+/usr/lib/libiculx.so.34
+/usr/lib/libiculx.so.34.0
+/usr/lib/libicule.so.34
+/usr/lib/libicule.so.34.0
+
+%files -n libicu-devel
+%doc readme.html
+%doc license.html
+/usr/lib/libicui18n.so
+/usr/lib/libsicui18n.a
+/usr/lib/libicuuc.so
+/usr/lib/libsicuuc.a
+/usr/lib/libicutu.so
+/usr/lib/libsicutu.a
+/usr/lib/libicuio.so
+/usr/lib/libsicuio.a
+/usr/lib/libicudata.so
+/usr/lib/libsicudata.a
+/usr/lib/libicule.so
+/usr/lib/libsicule.a
+/usr/lib/libiculx.so
+/usr/lib/libsiculx.a
+/usr/include/unicode/*.h
+/usr/include/layout/*.h
+/usr/lib/icu/%{version}/Makefile.inc
+/usr/lib/icu/Makefile.inc
+/usr/share/icu/%{version}/config
+/usr/share/doc/icu-%{version}/*
+
+%changelog
+* Mon Jun 07 2004 Alexei Dets <adets@idsk.com>
+- update to 3.0
+* Tue Aug 16 2003 Steven Loomis <srl@jtcsv.com>
+- update to 2.6.1 - include license
+* Thu Jun 05 2003 Steven Loomis <srl@jtcsv.com>
+- Update to 2.6
+* Fri Dec 27 2002 Steven Loomis <srl@jtcsv.com>
+- Update to 2.4 spec
+* Fri Sep 27 2002 Steven Loomis <srl@jtcsv.com>
+- minor updates to 2.2 spec. Rpath is off by default, don't pass it as an option.
+* Mon Sep 16 2002 Ian Holsman <ian@holsman.net>
+- update to icu 2.2
+
diff --git a/readme.html b/readme.html
new file mode 100644
index 0000000..019a0a7
--- /dev/null
+++ b/readme.html
@@ -0,0 +1,1797 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en-US">
+<head>
+ <title>ReadMe for ICU</title>
+ <meta name="COPYRIGHT" content=
+ "Copyright (c) 1997-2006 IBM Corporation and others. All Rights Reserved.">
+ <meta name="KEYWORDS" content=
+ "ICU; International Components for Unicode; ICU4C; what's new; readme; read me; introduction; downloads; downloading; building; installation;">
+ <meta name="DESCRIPTION" content=
+ "The introduction to the International Components for Unicode with instructions on building, installation, usage and other information about ICU.">
+ <meta http-equiv="Content-Type" content="text/html; charset=us-ascii">
+<style type="text/css">
+ h1 {border-width: 2px; border-style: solid; text-align: center; width: 100%; font-size: 200%; font-weight: bold}
+ h2 {margin-top: 3em; text-decoration: underline; page-break-before: always}
+ h2.TOC {page-break-before: auto}
+ h3 {margin-top: 2em; text-decoration: underline}
+ h4 {text-decoration: underline}
+ h5 {text-decoration: underline}
+ caption {font-weight: bold; text-align: left}
+ div.indent {margin-left: 2em}
+ ul.TOC {list-style-type: none}
+ samp {margin-left: 1em; border-style: groove; padding: 1em; display: block; background-color: #EEEEEE}
+</style>
+</head>
+
+<body>
+ <h1>International Components for Unicode<br>
+ <abbr title="International Components for Unicode">ICU</abbr> 3.6 ReadMe</h1>
+
+ <p>Version: 2006-Jul-15<br>
+ Copyright © 1997-2006 International Business Machines Corporation and
+ others. All Rights Reserved.</p>
+ <!-- Remember that there is a copyright at the end too -->
+ <hr>
+
+ <h2 class="TOC">Table of Contents</h2>
+
+ <ul class="TOC">
+ <li><a href="#Introduction">Introduction</a></li>
+
+ <li><a href="#GettingStarted">Getting Started</a></li>
+
+ <li><a href="#News">What Is New In This release?</a></li>
+
+ <li><a href="#Download">How To Download the Source Code</a></li>
+
+ <li><a href="#SourceCode">ICU Source Code Organization</a></li>
+
+ <li>
+ <a href="#HowToBuild">How To Build And Install ICU</a>
+
+ <ul class="TOC">
+ <li><a href="#HowToBuildSupported">Supported Platforms</a></li>
+
+ <li><a href="#HowToBuildWindows">Windows</a></li>
+
+ <li><a href="#HowToBuildCygwin">Cygwin</a></li>
+
+ <li><a href="#HowToBuildUNIX">UNIX</a></li>
+
+ <li><a href="#HowToBuildZOS">z/OS (os/390)</a></li>
+
+ <li><a href="#HowToBuildOS400">i5/OS (OS/400 iSeries)</a></li>
+ </ul>
+ </li>
+
+ <li><a href="#HowToPackage">How To Package ICU</a></li>
+
+ <li>
+ <a href="#ImportantNotes">Important Notes About Using ICU</a>
+
+ <ul class="TOC">
+ <li><a href="#ImportantNotesMultithreaded">Using ICU in a Multithreaded
+ Environment</a></li>
+
+ <li><a href="#ImportantNotesWindows">Windows Platform</a></li>
+
+ <li><a href="#ImportantNotesUNIX">UNIX Type Platforms</a></li>
+ </ul>
+ </li>
+
+ <li>
+ <a href="#PlatformDependencies">Platform Dependencies</a>
+
+ <ul class="TOC">
+ <li><a href="#PlatformDependenciesNew">Porting To A New
+ Platform</a></li>
+
+ <li><a href="#PlatformDependenciesImpl">Platform Dependent
+ Implementations</a></li>
+ </ul>
+ </li>
+ </ul>
+ <hr>
+
+ <h2><a name="Introduction" href="#Introduction" id=
+ "Introduction">Introduction</a></h2>
+
+ <p>Today's software market is a global one in which it is desirable to
+ develop and maintain one application (single source/single binary) that
+ supports a wide variety of languages. The International Components for
+ Unicode (ICU) libraries provide robust and full-featured Unicode services on
+ a wide variety of platforms to help this design goal. The ICU libraries
+ provide support for:</p>
+
+ <ul>
+ <li>The latest version of the Unicode standard</li>
+
+ <li>Character set conversions with support for over 200 codepages</li>
+
+ <li>Locale data for more than 230 locales</li>
+
+ <li>Language sensitive text collation (sorting) and searching based on the
+ Unicode Collation Algorithm (=ISO 14651)</li>
+
+ <li>Regular expression matching and Unicode sets</li>
+
+ <li>Transformations for normalization, upper/lowercase, script
+ transliterations (50+ pairs)</li>
+
+ <li>Resource bundles for storing and accessing localized information</li>
+
+ <li>Date/Number/Message formatting and parsing of culture specific
+ input/output formats</li>
+
+ <li>Calendar specific date and time manipulation</li>
+
+ <li>Complex text layout for Arabic, Hebrew, Indic and Thai</li>
+
+ <li>Text boundary analysis for finding characters, word and sentence
+ boundaries</li>
+ </ul>
+
+ <p>ICU has a sister project ICU4J that extends the internationalization
+ capabilities of Java to a level similar to ICU. The ICU C/C++ project is also
+ called ICU4C when a distinction is necessary.</p>
+
+ <h2><a name="GettingStarted" href="#GettingStarted" id=
+ "GettingStarted">Getting started</a></h2>
+
+ <p>This document describes how to build and install ICU on your machine. For
+ other information about ICU please see the following table of links.<br>
+ The ICU homepage also links to related information about writing
+ internationalized software.</p>
+
+ <table border="1" cellpadding="3" width="100%" summary=
+ "These are some useful links regarding ICU and internationalization in general.">
+ <caption>
+ Here are some useful links regarding ICU and internationalization in
+ general.
+ </caption>
+
+ <tr>
+ <td>ICU, ICU4C, ICU4J & ICU4JNI Official Homepage</td>
+
+ <td><a href=
+ "http://www.ibm.com/software/globalization/icu/index.jsp">http://www.ibm.com/software/globalization/icu/index.jsp</a></td>
+ </tr>
+
+ <tr>
+ <td>ICU, ICU4C, ICU4J & ICU4JNI Unofficial Homepage</td>
+
+ <td><a href=
+ "http://icu.sourceforge.net/">http://icu.sourceforge.net/</a></td>
+ </tr>
+
+ <tr>
+ <td>FAQ - Frequently Asked Questions about ICU</td>
+
+ <td><a href=
+ "http://icu.sourceforge.net/userguide/icufaq.html">http://icu.sourceforge.net/userguide/icufaq.html</a></td>
+ </tr>
+
+ <tr>
+ <td>ICU User's Guide</td>
+
+ <td><a href=
+ "http://icu.sourceforge.net/userguide/">http://icu.sourceforge.net/userguide/</a></td>
+ </tr>
+
+ <tr>
+ <td>Download ICU Releases</td>
+
+ <td><a href=
+ "http://www.ibm.com/software/globalization/icu/downloads.jsp">http://www.ibm.com/software/globalization/icu/downloads.jsp</a></td>
+ </tr>
+
+ <tr>
+ <td>API Documentation Online</td>
+
+ <td><a href=
+ "http://icu.sourceforge.net/apiref/index.html">http://icu.sourceforge.net/apiref/index.html</a></td>
+ </tr>
+
+ <tr>
+ <td>Online ICU Demos</td>
+
+ <td><a href=
+ "http://www.ibm.com/software/globalization/icu/chartsdemostools.jsp">http://www.ibm.com/software/globalization/icu/chartsdemostools.jsp</a></td>
+ </tr>
+
+ <tr>
+ <td>Contacts and Bug Reports/Feature Requests</td>
+
+ <td><a href=
+ "http://icu.sourceforge.net/contacts.html">http://icu.sourceforge.net/contacts.html</a></td>
+ </tr>
+ </table>
+
+ <p><strong>Important:</strong> Please make sure you understand the <a href=
+ "license.html">Copyright and License Information</a>.</p>
+
+ <h2><a name="News" href="#News" id="News">What is new in this
+ release?</a></h2>
+
+ <p>The following list concentrates on <em>changes that affect existing
+ applications migrating from previous ICU releases</em>. For more news about
+ this release, see the <a href=
+ "http://www.ibm.com/software/globalization/icu/downloads.jsp">ICU 3.6
+ download page</a>.</p>
+
+ <h3><a name="News_app_packaging" id="News_app_packaging">Changes to
+ packaging resource bundles</a></h3>
+
+ <p>Since ICU 3.0, the old style of packaging was deprecated, and an alternate
+ packaging mode was made available. In this release, this compatibility mode of
+ packaging has been removed from ICU. If you're using the genrb -P or -t options,
+ you are probably using the older compatible mode of data packaging. This
+ compatibility file naming mode was removed for portability and performance reasons.</p>
+
+ <p>Code changes should not be required to use the newer data file naming scheme,
+ but you will need to update your makefile scripts, if you're using the older
+ data file naming scheme. The example of using the new data file naming scheme
+ can be found in <a href="source/samples/ufortune/">the ufortune sample program</a>.</p>
+
+ <table border="1" cellpadding="0" summary=
+ "The following are examples of the file naming schemes.">
+ <caption>
+ The following are examples of the file naming schemes.
+ </caption>
+
+ <tr>
+ <th scope="col">Old File Naming Scheme</th>
+
+ <th scope="col">Current File Naming Scheme</th>
+ </tr>
+
+ <tr>
+ <td>MyApp_root.res</td>
+
+ <td>MyApp/root.res</td>
+ </tr>
+
+ <tr>
+ <td>MyApp_en.res</td>
+
+ <td>MyApp/en.res</td>
+ </tr>
+ </table>
+
+ <h3><a name="News_wchar_t" id="News_wchar_t">Changes to wchar_t type for the
+ Microsoft Visual Studio builds</a></h3>
+
+ <p>Previous versions of ICU built with Microsoft Visual Studio were not built
+ with the /Zc:wchar_t compiler option. ICU now builds with this option turned
+ on by default. This allows the built libraries to be compatible with Visual
+ Studio 2005, and this makes it easier for ICU users to use MFC in their
+ projects, which requires this option to be turned by default. If you do not
+ use the C++ API of ICU, you are not affected by this change.</p>
+
+ <p>If you receive any errors while linking ICU into your project, please make
+ sure that you have set "Treat wchar_t as Built-in Type" to "Yes (/Zc:wchar_t)"
+ in your project files.</p>
+
+ <h3><a name="News_data_package" id="News_data_package">Source download
+ contains .dat package for ICU data</a></h3>
+
+ <p>The ICU4C 3.6 source downloads contain a pre-built .dat package with ICU's
+ data rather than the data source files. This is to simplify the build process
+ for the majority of users and to reduce platform porting issues. If you need
+ the data source files for customization, then please download the ICU source
+ code from <a href=
+ "http://www.ibm.com/software/globalization/icu/repository.jsp">CVS</a>.</p>
+
+ <h2><a name="Download" href="#Download" id="Download">How To Download the
+ Source Code</a></h2>
+
+ <p>There are two ways to download ICU releases:</p>
+
+ <ul>
+ <li><strong>Official Release Snapshot:</strong><br>
+ If you want to use ICU (as opposed to developing it), you should download
+ an official packaged version of the ICU source code. These versions are
+ tested more thoroughly than day-to-day development builds of the system,
+ and they are packaged in zip and tar files for convenient download. These
+ packaged files can be found at <a href=
+ "http://www.ibm.com/software/globalization/icu/downloads.jsp">http://www.ibm.com/software/globalization/icu/downloads.jsp</a>.<br>
+
+ The packaged snapshots are named <strong>icu-nnnn.zip</strong> or
+ <strong>icu-nnnn.tgz</strong>, where nnnn is the version number. The .zip
+ file is used for Windows platforms, while the .tgz file is preferred on
+ most other platforms.<br>
+ Please unzip this file. It will reconstruct the source directory, which
+ includes anonymous CVS control directories (see below).</li>
+
+ <li><strong>CVS Source Repository:</strong><br>
+ If you are interested in developing features, patches, or bug fixes for
+ ICU, you should probably be working with the latest version of the ICU
+ source code. You will need to check the code out of our CVS repository to
+ ensure that you have the most recent version of all of the files. See our
+ <a href="http://www.ibm.com/software/globalization/icu/repository.jsp">CVS
+ page</a> for details.</li>
+ </ul>
+
+ <h2><a name="SourceCode" href="#SourceCode" id="SourceCode">ICU Source Code
+ Organization</a></h2>
+
+ <p>In the descriptions below, <strong><i><ICU></i></strong> is the full
+ path name of the ICU directory (the top level directory from the distribution
+ archives) in your file system. You can also view the <a href=
+ "http://icu.sourceforge.net/userguide/design.html">ICU Architectural
+ Design</a> section of the User's Guide to see which libraries you need for
+ your software product. You need at least the data (<code>[lib]icudt</code>)
+ and the common (<code>[lib]icuuc</code>) libraries in order to use ICU.</p>
+
+ <table border="1" cellpadding="0" width="100%" summary=
+ "The following files describe the code drop.">
+ <caption>
+ The following files describe the code drop.
+ </caption>
+
+ <tr>
+ <th scope="col">File</th>
+
+ <th scope="col">Description</th>
+ </tr>
+
+ <tr>
+ <td>readme.html</td>
+
+ <td>Describes the International Components for Unicode (this file)</td>
+ </tr>
+
+ <tr>
+ <td>license.html</td>
+
+ <td>Contains the text of the ICU license</td>
+ </tr>
+ </table>
+
+ <p><br></p>
+
+ <table border="1" cellpadding="0" width="100%" summary=
+ "The following directories contain source code and data files.">
+ <caption>
+ The following directories contain source code and data files.
+ </caption>
+
+ <tr>
+ <th scope="col">Directory</th>
+
+ <th scope="col">Description</th>
+ </tr>
+
+ <tr>
+ <td><i><ICU></i>/source/<b>common</b>/</td>
+
+ <td>The core Unicode and support functionality, such as resource bundles,
+ character properties, locales, codepage conversion, normalization,
+ Unicode properties, Locale, and UnicodeString.</td>
+ </tr>
+
+ <tr>
+ <td><i><ICU></i>/source/<b>i18n</b>/</td>
+
+ <td>Modules in i18n are generally the more data-driven, that is to say
+ resource bundle driven, components. These deal with higher-level
+ internationalization issues such as formatting, collation, text break
+ analysis, and transliteration.</td>
+ </tr>
+
+ <tr>
+ <td><i><ICU></i>/source/<b>data</b>/</td>
+
+ <td>
+ <p>This directory contains the source data in text format, which is
+ compiled into binary form during the ICU build process. It contains
+ several subdirectories, in which the data files are grouped by
+ function. Note that the build process must be run again after any
+ changes are made to this directory.</p>
+
+ <ul>
+ <li><b>brkitr/</b> Data files for character, word, sentence, title
+ casing and line boundary analysis.</li>
+
+ <li><b>locales/</b> These .txt files contain ICU language and
+ culture-specific localization data. Two special bundles are
+ <b>root</b>, which is the fallback data and parent of other bundles,
+ and <b>index</b>, which contains a list of installed bundles. The
+ makefile <b>resfiles.mk</b> contains the list of resource bundle
+ files.</li>
+
+ <li><b>mappings/</b> Here are the code page converter tables. These
+ .ucm files contain mappings to and from Unicode. These are compiled
+ into .cnv files. <b>convrtrs.txt</b> is the alias mapping table from
+ various converter name formats to ICU internal format and vice versa.
+ It produces cnvalias.icu. The makefiles <b>ucmfiles.mk,
+ ucmcore.mk,</b> and <b>ucmebcdic.mk</b> contain the list of
+ converters to be built.</li>
+
+ <li><b>translit/</b> This directory contains transliterator rules as
+ resource bundles, a makefile <b>trnsfiles.mk</b> containing the list
+ of installed system translitaration files, and as well the special
+ bundle <b>translit_index</b> which lists the system transliterator
+ aliases.</li>
+
+ <li><b>unidata/</b> This directory contains the Unicode data files.
+ Please see <a href=
+ "http://www.unicode.org/">http://www.unicode.org/</a> for more
+ information.</li>
+
+ <li><b>misc/</b> The misc directory contains other data files which
+ did not fit into the above categories. Currently it only contains
+ time zone information, and a name preperation file for <a href=
+ "http://www.ietf.org/rfc/rfc3490.txt">IDNA</a>.</li>
+
+ <li><b>out/</b> This directory contains the assembled memory mapped
+ files.</li>
+
+ <li><b>out/build/</b> This directory contains intermediate (compiled)
+ files, such as .cnv, .res, etc.</li>
+ </ul>
+
+ <p>If you are creating a special ICU build, you can set the ICU_DATA
+ environment variable to the out/ or the out/build/ directories, but
+ this is generally discouraged because most people set it incorrectly.
+ You can view the <a href=
+ "http://icu.sourceforge.net/userguide/icudata.html">ICU Data
+ Management</a> section of the ICU User's Guide for details.</p>
+ </td>
+ </tr>
+
+ <tr>
+ <td><i><ICU></i>/source/test/<b>intltest</b>/</td>
+
+ <td>A test suite including all C++ APIs. For information about running
+ the test suite, see the users' guide.</td>
+ </tr>
+
+ <tr>
+ <td><i><ICU></i>/source/test/<b>cintltst</b>/</td>
+
+ <td>A test suite written in C, including all C APIs. For information
+ about running the test suite, see the users' guide.</td>
+ </tr>
+
+ <tr>
+ <td><i><ICU></i>/source/test/<b>testdata</b>/</td>
+
+ <td>Source text files for data, which are read by the tests. It contains
+ the subdirectories <b>out/build/</b> which is used for intermediate
+ files, and <b>out/</b> which contains <b>testdata.dat.</b></td>
+ </tr>
+
+ <tr>
+ <td><i><ICU></i>/source/<b>tools</b>/</td>
+
+ <td>Tools for generating the data files. Data files are generated by
+ invoking <i><ICU></i>/source/data/build/makedata.bat on Win32 or
+ <i><ICU></i>/source/make on UNIX.</td>
+ </tr>
+
+ <tr>
+ <td><i><ICU></i>/source/<b>samples</b>/</td>
+
+ <td>Various sample programs that use ICU</td>
+ </tr>
+
+ <tr>
+ <td><i><ICU></i>/source/<b>extra</b>/</td>
+
+ <td>Non-supported API additions. Currently, it contains the 'ustdio' file
+ i/o library</td>
+ </tr>
+
+ <tr>
+ <td><i><ICU></i>/source/<b>layout</b>/</td>
+
+ <td>Contains the ICU layout engine (not a rasterizer).</td>
+ </tr>
+
+ <tr>
+ <td><i><ICU></i>/<b>packaging</b>/<br>
+ <i><ICU></i>/<b>debian</b>/</td>
+
+ <td>These directories contain scripts and tools for packaging the final
+ ICU build for various release platforms.</td>
+ </tr>
+
+ <tr>
+ <td><i><ICU></i>/source/<b>config</b>/</td>
+
+ <td>Contains helper makefiles for platform specific build commands. Used
+ by 'configure'.</td>
+ </tr>
+
+ <tr>
+ <td><i><ICU></i>/source/<b>allinone</b>/</td>
+
+ <td>Contains top-level ICU workspace and project files, for instance to
+ build all of ICU under one MSVC project.</td>
+ </tr>
+
+ <tr>
+ <td><i><ICU></i>/<b>include</b>/</td>
+
+ <td>Contains the headers needed for developing software that uses ICU on
+ Windows.</td>
+ </tr>
+
+ <tr>
+ <td><i><ICU></i>/<b>lib</b>/</td>
+
+ <td>Contains the import libraries for linking ICU into your Windows
+ application.</td>
+ </tr>
+
+ <tr>
+ <td><i><ICU></i>/<b>bin</b>/</td>
+
+ <td>Contains the libraries and executables for using ICU on Windows.</td>
+ </tr>
+ </table><!-- end of ICU structure ==================================== -->
+
+ <h2><a name="HowToBuild" href="#HowToBuild" id="HowToBuild">How To Build And
+ Install ICU</a></h2>
+
+ <h3><a name="HowToBuildSupported" href="#HowToBuildSupported" id=
+ "HowToBuildSupported">Supported Platforms</a></h3>
+
+ <table border="1" cellpadding="3" summary=
+ "ICU can be built on many platforms.">
+ <caption>
+ Here is a status of functionality of ICU on several different platforms.
+ </caption>
+
+ <tr>
+ <th scope="col">Operating system</th>
+
+ <th scope="col">Compiler</th>
+
+ <th scope="col">Testing frequency</th>
+ </tr>
+
+ <tr>
+ <td>Windows XP</td>
+
+ <td>Microsoft Visual C++ .NET 2003 (7.1)</td>
+
+ <td>Reference platform</td>
+ </tr>
+
+ <tr>
+ <td>Red Hat Enterprise Linux 4 Update 2</td>
+
+ <td>gcc 3.4.4</td>
+
+ <td>Reference platform</td>
+ </tr>
+
+ <tr>
+ <td>AIX 5.2</td>
+
+ <td>Visual Age C++ 6.0</td>
+
+ <td>Reference platform</td>
+ </tr>
+
+ <tr>
+ <td>Solaris 9 (SunOS 5.9)</td>
+
+ <td>Sun Studio 8 (Sun C++ 5.5)</td>
+
+ <td>Reference platform</td>
+ </tr>
+
+ <tr>
+ <td>HP-UX 11.11</td>
+
+ <td>aCC A.03.50<br>
+ cc B.11.11.08</td>
+
+ <td>Reference platform</td>
+ </tr>
+
+ <tr>
+ <td>Red Hat Enterprise Linux 3 Update 4</td>
+
+ <td>gcc 3.2.3</td>
+
+ <td>Regularly tested</td>
+ </tr>
+
+ <tr>
+ <td>Windows 2000 with Cygwin</td>
+
+ <td>Microsoft Visual C++ .NET 2003 (7.1)</td>
+
+ <td>Regularly tested</td>
+ </tr>
+
+ <tr>
+ <td>Mac OS X (10.4)</td>
+
+ <td>gcc 3.3</td>
+
+ <td>Regularly tested</td>
+ </tr>
+
+ <tr>
+ <td>Solaris 7 (SunOS 5.7)</td>
+
+ <td>Workshop Pro (Forte) CC 6.0</td>
+
+ <td>Regularly tested</td>
+ </tr>
+
+ <tr>
+ <td>Solaris 10</td>
+
+ <td>gcc 4.0.2</td>
+
+ <td>Regularly tested</td>
+ </tr>
+
+ <tr>
+ <td>AIX 5.1.0 L</td>
+
+ <td>Visual Age C++ 5.0</td>
+
+ <td>Regularly tested</td>
+ </tr>
+
+ <tr>
+ <td>SUSE Linux Enterprise Server 9 SP1</td>
+
+ <td>Intel C++ Compiler 9.0</td>
+
+ <td>Regularly tested</td>
+ </tr>
+
+ <tr>
+ <td>SUSE Linux Enterprise Server 9 (PowerPC)</td>
+
+ <td>Visual Age 8.0</td>
+
+ <td>Regularly tested</td>
+ </tr>
+
+ <tr>
+ <td>Windows XP</td>
+
+ <td>Microsoft Visual C++ .NET 2005</td>
+
+ <td>Rarely tested</td>
+ </tr>
+
+ <tr>
+ <td>z/OS 1.7</td>
+
+ <td>cxx 1.7</td>
+
+ <td>Rarely tested</td>
+ </tr>
+
+ <tr>
+ <td>Cygwin</td>
+
+ <td>gcc 3.4.4</td>
+
+ <td>Rarely tested</td>
+ </tr>
+
+ <tr>
+ <td>i5/OS (OS/400 iSeries) V5R3</td>
+
+ <td>iCC</td>
+
+ <td>Rarely tested</td>
+ </tr>
+
+ <tr>
+ <td>Windows 98</td>
+
+ <td>Microsoft Visual C++ 6.0</td>
+
+ <td>Rarely tested</td>
+ </tr>
+
+ <tr>
+ <td>MinGW</td>
+
+ <td>gcc</td>
+
+ <td>Rarely tested</td>
+ </tr>
+
+ <tr>
+ <td>NetBSD, OpenBSD, FreeBSD</td>
+
+ <td>gcc</td>
+
+ <td>Rarely tested</td>
+ </tr>
+
+ <tr>
+ <td>QNX</td>
+
+ <td>gcc</td>
+
+ <td>Rarely tested</td>
+ </tr>
+
+ <tr>
+ <td>BeOS</td>
+
+ <td>gcc</td>
+
+ <td>Rarely tested</td>
+ </tr>
+
+ <tr>
+ <td>SGI/IRIX</td>
+
+ <td>MIPSpro CC</td>
+
+ <td>Rarely tested</td>
+ </tr>
+
+ <tr>
+ <td>Tru64 (OSF)</td>
+
+ <td>Compaq's cxx compiler</td>
+
+ <td>Rarely tested</td>
+ </tr>
+
+ <tr>
+ <td>MP-RAS</td>
+
+ <td>NCR MP-RAS C/C++ Compiler</td>
+
+ <td>Rarely tested</td>
+ </tr>
+ </table>
+
+ <p><br></p>
+
+ <h4>Key to testing frequency</h4>
+
+ <dl>
+ <dt><i>Reference platform</i></dt>
+
+ <dd>ICU will work on these platforms with these compilers</dd>
+
+ <dt><i>Regularly tested</i></dt>
+
+ <dd>ICU should work on these platforms with these compilers</dd>
+
+ <dt><i>Rarely tested</i></dt>
+
+ <dd>ICU has been ported to these platforms but may not have been tested
+ there recently</dd>
+ </dl>
+
+ <h3><a name="HowToBuildWindows" href="#HowToBuildWindows" id=
+ "HowToBuildWindows">How To Build And Install On Windows</a></h3>
+
+ <p>Building International Components for Unicode requires:</p>
+
+ <ul>
+ <li>Microsoft Windows 2000 or above</li>
+
+ <li>Microsoft Visual C++ 2003</li>
+
+ <li><a href="#HowToBuildCygwin">Cygwin</a> is required when other versions
+ of Microsoft Visual C++ and other compilers are used to build ICU.</li>
+ </ul>
+
+ <p>The steps are:</p>
+
+ <ol>
+ <li>Unzip the icu-XXXX.zip file into any convenient location. Using command
+ line zip, type "unzip -a icu-XXXX.zip -d drive:\directory", or just use
+ WinZip.</li>
+
+ <li>Be sure that the ICU binary directory, <i><ICU></i>\bin\, is
+ included in the <strong>PATH</strong> environment variable. The tests will
+ not work without the location of the ICU DLL files in the path.</li>
+
+ <li>Open the "<i><ICU></i>\source\allinone\allinone.sln" workspace
+ file in Microsoft Visual Studio .NET 2003. (This solution includes all the
+ International Components for Unicode libraries, necessary ICU building
+ tools, and the test suite projects). Please see the <a href=
+ "#HowToBuildWindowsCommandLine">command line note below</a> if you want to
+ build from the command line instead.</li>
+
+ <li>Set the active configuration to "Debug" or "Release" (See <a href=
+ "#HowToBuildWindowsConfig">Windows configuration note</a> below).</li>
+
+ <li>Choose the "Build" menu and select "Rebuild Solution". If you want to
+ build the Debug and Release at the same time, see the <a href=
+ "#HowToBuildWindowsBatch">batch configuration note</a> below.</li>
+
+ <li>Run the C++ test suite, "intltest". To do this: set the active startup
+ project to "intltest", and press Ctrl+F5 to run it. Make sure that it
+ passes without any errors.</li>
+
+ <li>Run the C test suite, "cintltst". To do this: set the active startup
+ project to "cintltst", and press Ctrl+F5 to run it. Make sure that it
+ passes without any errors.</li>
+
+ <li>Run the I/O test suite, "iotest". To do this: set the active startup
+ project to "iotest", and press Ctrl+F5 to run it. Make sure that it passes
+ without any errors.</li>
+
+ <li>You are now able to develop applications with ICU by using the
+ libraries and tools in <i><ICU></i>\bin\. The headers are in
+ <i><ICU></i>\include\ and the link libraries are in
+ <i><ICU></i>\lib\. To install the ICU runtime on a machine, or ship
+ it with your application, copy the needed components from
+ <i><ICU></i>\bin\ to a location on the system PATH or to your
+ application directory.</li>
+ </ol>
+
+ <p><a name="HowToBuildWindowsCommandLine" id=
+ "HowToBuildWindowsCommandLine"><strong>Using MSDEV At The Command Line
+ Note:</strong></a> You can build ICU from the command line. Assuming that you
+ have properly installed Microsoft Visual C++ to support command line
+ execution, you can run the following command, 'devenv.com
+ <i><ICU></i>\source\allinone\allinone.sln /build Release'. You can also
+ use Cygwin with this compiler to build ICU, and you can refer to the <a href=
+ "#HowToBuildCygwin">How To Build And Install On Windows with Cygwin</a>
+ section for more details.</p>
+
+ <p><a name="HowToBuildWindowsConfig" id=
+ "HowToBuildWindowsConfig"><strong>Setting Active Configuration
+ Note:</strong></a> To set the active configuration, two different
+ possibilities are:</p>
+
+ <ul>
+ <li>Choose "Build" menu, select "Configuration Manager...", and select
+ "Release" or "Debug" for the Active Configuration Solution.</li>
+
+ <li>Another way is to select the desired build configuration from "Solution
+ Configurations" dropdown menu from the standard toolbar. It will say
+ "Release" or "Debug" in the dropdown list.</li>
+ </ul>
+
+ <p><a name="HowToBuildWindowsBatch" id="HowToBuildWindowsBatch"><strong>Batch
+ Configuration Note:</strong></a> If you want to build the Debug and Release
+ configurations at the same time, choose "Build" menu, and select "Batch
+ Build...". Click the "Select All" button, and then click the "Rebuild"
+ button.</p>
+
+ <h3><a name="HowToBuildCygwin" href="#HowToBuildCygwin" id=
+ "HowToBuildCygwin">How To Build And Install On Windows with Cygwin</a></h3>
+
+ <p>Building International Components for Unicode with this configuration
+ requires:</p>
+
+ <ul>
+ <li>Microsoft NT 4.0 or above, or Windows 98 or above</li>
+
+ <li>Microsoft Visual C++ 6.0 or above (when gcc isn't used).</li>
+
+ <li>Cygwin with the following installed:
+
+ <ul>
+ <li>bash</li>
+
+ <li>GNU make</li>
+
+ <li>man (if you plan to look at the man pages)</li>
+ </ul>
+ </li>
+ </ul>
+
+ <p>There are two ways you can build ICU with Cygwin. You can build with gcc
+ or Microsoft Visual C++. If you use gcc, the resulting libraries and tools
+ will depend on the Cygwin environment. If you use Microsoft Visual C++, the
+ resulting libraries and tools do not depend on Cygwin and can be more easily
+ distributed to other Windows computers (the generated man pages and shell
+ scripts still need Cygwin). To build with gcc, please follow the "<a href=
+ "#HowToBuildUNIX">How To Build And Install On UNIX</a>" instructions, while
+ you are inside a Cygwin bash shell. To build with Microsoft Visual C++,
+ please use the following instructions:</p>
+
+ <ol>
+ <li>Start the Windows "Command Prompt" window. This is different from the
+ gcc build, which requires the Cygwin Bash command prompt. The Microsoft
+ Visual C++ compiler will not work with a bash command prompt.</li>
+
+ <li>If the computer isn't set up to use Visual C++ from the command line,
+ you need to run VCVARS32.BAT (for example: "<tt>C:\Program Files\Microsoft
+ Visual Studio\VC98\Bin\VCVARS32.BAT</tt>").</li>
+
+ <li>Unzip the icu-XXXX.zip file into any convenient location. Using command
+ line zip, type "unzip -a icu-XXXX.zip -d drive:\directory", or just use
+ WinZip.</li>
+
+ <li>Change directory to "icu/source", which is where you unzipped ICU.</li>
+
+ <li>Run "<tt>bash <a href="source/runConfigureICU">./runConfigureICU</a>
+ Cygwin/MSVC</tt>" (See <a href="#HowToWindowsConfigureICU">Windows
+ configuration note</a> and non-functional configure options below).</li>
+
+ <li>Type <tt>"make"</tt> to compile the libraries and all the data files.
+ This make command should be GNU make.</li>
+
+ <li>Optionally, type <tt>"make check"</tt> to run the test suite, which
+ checks for ICU's functionality integrity (See <a href=
+ "#HowToTestWithoutGmake">testing note</a> below).</li>
+
+ <li>Type <tt>"make install"</tt> to install ICU. If you used the --prefix=
+ option on configure or runConfigureICU, ICU will be installed to the
+ directory you specified. (See <a href="#HowToInstallICU">installation
+ note</a> below).</li>
+ </ol>
+
+ <p><a name="HowToWindowsConfigureICU" id=
+ "HowToWindowsConfigureICU"><strong>Configuring ICU on Windows
+ NOTE:</strong></a> In addition to the Unix <a href=
+ "#HowToConfigureICU">configuration note</a> the following configure options
+ currently do not work on Windows with Microsoft's compiler. Some options can
+ work by manually editing <tt>icu/source/common/unicode/pwin32.h</tt>, but
+ manually editing the files is not recommended.</p>
+
+ <ul>
+ <li><tt>--disable-renaming</tt></li>
+
+ <li><tt>--disable-threading</tt></li>
+
+ <li><tt>--disable-tracing</tt></li>
+
+ <li><tt>--enable-64bit-libs</tt></li>
+
+ <li><tt>--enable-rpath</tt></li>
+
+ <li><tt>--with-iostream</tt></li>
+
+ <li><tt>--enable-static</tt> (Requires that U_STATIC_IMPLEMENTATION be
+ defined in user code that links against ICU's static libraries.)</li>
+
+ <li><tt>--with-data-packaging=files</tt> (The pkgdata tool currently does
+ not work in this mode. Manual packaging is required to use this mode.)</li>
+ </ul>
+
+ <h3><a name="HowToBuildUNIX" href="#HowToBuildUNIX" id="HowToBuildUNIX">How
+ To Build And Install On UNIX</a></h3>
+
+ <p>Building International Components for Unicode on UNIX requires:</p>
+
+ <ul>
+ <li>A C++ compiler installed on the target machine (for example: gcc, CC,
+ xlC_r, aCC, cxx, etc...).</li>
+
+ <li>An ANSI C compiler installed on the target machine (for example:
+ cc).</li>
+
+ <li>A recent version of GNU make (3.77+).</li>
+
+ <li>For a list of z/OS tools please view the <a href="#HowToBuildZOS">z/OS
+ build section</a> of this document for further details.</li>
+ </ul>
+
+ <p>Here are the steps to build ICU:</p>
+
+ <ol>
+ <li>Decompress the icu-<i>X</i>.<i>Y</i>.tgz (or
+ icu-<i>X</i>.<i>Y</i>.tar.gz) file. For example, <tt>"gunzip -d <
+ icu-<i>X</i>.<i>Y</i>.tgz | tar xvf -"</tt></li>
+
+ <li>Change directory to the "icu/source".</li>
+
+ <li>Run <tt>"chmod +x runConfigureICU configure install-sh"</tt> because
+ these files may have the wrong permissions.</li>
+
+ <li>Run the <tt><a href="source/runConfigureICU">runConfigureICU</a></tt>
+ script for your platform. (See <a href="#HowToConfigureICU">configuration
+ note</a> below).</li>
+
+ <li>Type <tt>"gmake"</tt> (or "make" if GNU make is the default make on
+ your platform) to compile the libraries and all the data files. The proper
+ name of the GNU make command is printed at the end of the configuration
+ run, as in "You must use gmake to compile ICU".</li>
+
+ <li>Optionally, type <tt>"gmake check"</tt> to run the test suite, which
+ checks for ICU's functionality integrity (See <a href=
+ "#HowToTestWithoutGmake">testing note</a> below).</li>
+
+ <li>Type <tt>"gmake install"</tt> to install ICU. If you used the --prefix=
+ option on configure or runConfigureICU, ICU will be installed to the
+ directory you specified. (See <a href="#HowToInstallICU">installation
+ note</a> below).</li>
+ </ol>
+
+ <p><a name="HowToConfigureICU" id="HowToConfigureICU"><strong>Configuring ICU
+ NOTE:</strong></a> Type <tt>"./runConfigureICU --help"</tt> for help on how
+ to run it and a list of supported platforms. You may also want to type
+ <tt>"./configure --help"</tt> to print the available configure options that
+ you may want to give runConfigureICU. If you are not using the
+ runConfigureICU script, or your platform is not supported by the script, you
+ may need to set your CC, CXX, CFLAGS and CXXFLAGS environment variables, and
+ type <tt>"./configure"</tt>. Some of the more frequently used options to
+ configure are --disable-64bit-libs to create 32-bit libraries, and --srcdir
+ to do out of source builds (build the libraries in the current location).
+ HP-UX user's, please see this <a href="#ImportantNotesHPUX">note regarding
+ HP-UX multithreaded build issues</a> with newer compilers. Solaris user's,
+ please see this <a href="#ImportantNotesSolaris">note regarding Solaris
+ multithreaded build issues</a>.</p>
+
+ <p><a name="HowToTestWithoutGmake" id="HowToTestWithoutGmake"><strong>Running
+ The Tests From The Command Line NOTE:</strong></a> You may have to set
+ certain variables if you with to run test programs individually, that is
+ apart from "gmake check". The environment variable <strong>ICU_DATA</strong>
+ can be set to the full pathname of the data directory to indicate where the
+ locale data files and conversion mapping tables are when you are not using
+ the shared library (e.g. by using the .dat archive or the individual data
+ files). The trailing "/" is required after the directory name (e.g.
+ "$Root/source/data/out/" will work, but the value "$Root/source/data/out" is
+ not acceptable). You do not need to set <strong>ICU_DATA</strong> if the
+ complete shared data library is in your library path.</p>
+
+ <p><a name="HowToInstallICU" id="HowToInstallICU"><strong>Installing ICU
+ NOTE:</strong></a> Some platforms use package management tools to control the
+ installation and uninstallation of files on the system, as well as the
+ integrity of the system configuration. You may want to check if ICU can be
+ packaged for your package management tools by looking into the "packaging"
+ directory. (Please note that if you are using a snapshot of ICU from CVS, it
+ is probable that the packaging scripts or related files are not up to date
+ with the contents of ICU at this time, so use them with caution).</p>
+
+ <h3><a name="HowToBuildZOS" href="#HowToBuildZOS" id="HowToBuildZOS">How To
+ Build And Install On z/OS (OS/390)</a></h3>
+
+ <p>You can install ICU on z/OS or OS/390 (the previous name of z/OS), but IBM
+ tests only the z/OS installation. These platforms commonly are called "MVS".
+ You install ICU in a z/OS UNIX system services file system such as HFS or
+ zFS. On this platform, it is important that you understand a few details:</p>
+
+ <ul>
+ <li>APAR PQ58392 may be needed by z/OS 1.2 or 1.3 in order to get some ICU
+ number formatting functions to work properly. The APAR affects C and C++
+ code.</li>
+
+ <li>The makedep executable that is used with the z/OS ICU build process is
+ not shipped with ICU. It is available at the <a href=
+ "http://www.ibm.com/servers/eserver/zseries/zos/unix/redbook/">z/OS UNIX -
+ Tools and Toys</a> site. The PATH environment variable should be updated to
+ contain the location of this executable prior to build. Alternatively,
+ makedep may be moved into an existing PATH directory.</li>
+
+ <li>The gnu utilities gmake and gzip/gunzip are needed and can be obtained
+ for z/OS from <a href=
+ "http://www.ibm.com/servers/eserver/zseries/zos/unix/redbook/">z/OS UNIX -
+ Tools and Toys</a>.</li>
+
+ <li>Since the default make on z/OS is not gmake, the pkgdata tool requires
+ that the "make" command is aliased to your installed version of gmake. You
+ may also need to set $MAKE equal to the fully qualified path of GNU make.
+ GNU make is available with the "z/OS UNIX - Tools and Toys" that was
+ mentioned above. ICU requires the same GNU make as described in the UNIX
+ build instructions.</li>
+
+ <li>Since USS does not support using the mmap() function over NFS, it is
+ recommended that you build ICU on a local filesystem. Once ICU has been
+ built, you should not have this problem while using ICU when the data
+ library has been built as a shared library, which is this is the default
+ setting.</li>
+
+ <li>Encoding considerations: The source code assumes that it is compiled
+ with codepage ibm-1047 (to be exact, the UNIX System Services variant of
+ it). The pax command converts all of the source code files from ASCII to
+ codepage ibm-1047 (USS) EBCDIC. However, some files are binary files and
+ must not be converted, or must be converted back to their original state.
+ You can use the <a href="as_is/os390/unpax-icu.sh">unpax-icu.sh</a> script
+ to do this for you automatically. It will unpackage the tar file and
+ convert all the necessary files for you automatically.</li>
+
+ <li>z/OS supports both native S/390 hexadecimal floating point and (with
+ OS/390 2.6 and later) IEEE 754 binary floating point. This is a compile
+ time option. Applications built with IEEE should use ICU DLLs that are
+ built with IEEE (and vice versa). The environment variable IEEE390=0 will
+ cause the z/OS version of ICU to be built without IEEE floating point
+ support and use the native hexadecimal floating point. By default ICU is
+ built with IEEE 754 support. Native floating point support is sufficient
+ for codepage conversion, resource bundle and UnicodeString operations, but
+ the Format APIs require IEEE binary floating point.</li>
+
+ <li>
+ <p>z/OS introduced the concept of Extra Performance Linkage (XPLINK) to
+ bring performance improvement opportunities to call-intensive C and C++
+ applications such as ICU. XPLINK is enabled on a DLL-by-DLL basis, so if
+ you are considering using XPLINK in your application that uses ICU, you
+ should consider building the XPLINK-enabled version of ICU. You need to
+ set ICU's environment variable <code>OS390_XPLINK=1</code> prior to
+ invoking the make process to produce binaries that are enabled for
+ XPLINK.</p>
+
+ <p>Note: XPLINK, which is enabled for z/OS 1.2 and later, requires the
+ PTF PQ69418 to build XPLINK enabled binaries.</p>
+ </li>
+
+ <li>Currently in ICU 3.0, there is an issue with building on z/OS without
+ XPLINK and with the C++ iostream. By default, the iostream library on z/OS
+ is XPLINK enabled. If you are not building an XPLINK enabled version of
+ ICU, you should use the <code>--with-iostream=old</code> configure option
+ when using runConfigureICU. This will prevent applications that use the
+ icuio library from crashing.</li>
+
+ <li>
+ <p>When you build ICU on a system such as z/OS 1.2, the binaries that
+ result can run on that level of the operating system and later, such as
+ z/OS 1.3 and z/OS 1.4. It's possible that you may have a z/OS 1.4 system,
+ but you may need to deliver binaries on z/OS 1.2 and above. z/OS gives
+ you this ability by targeting the complier and linker to run at the older
+ level, thereby producing the desired binaries.</p>
+
+ <p>To set the compiler and LE environment to OS/390 2.10, specify the
+ following, "<code>./runConfigureICU OS390V2R10</code>"</p>
+
+ <p>To set the compiler and LE environment to z/OS 1.2 specify the
+ following, "<code>./runConfigureICU zOSV1R2</code>"</p>
+ </li>
+
+ <li>The rest of the instructions for building and testing ICU on z/OS with
+ UNIX System Services are the same as the <a href="#HowToBuildUNIX">How To
+ Build And Install On UNIX</a> section.</li>
+ </ul>
+
+ <h4>z/OS (Batch/PDS) support outside the UNIX system services
+ environment</h4>
+
+ <p>By default, ICU builds its libraries into the UNIX file system (HFS). In
+ addition, there is a z/OS specific environment variable (OS390BATCH) to build
+ some libraries into the z/OS native file system. This is useful, for example,
+ when your application is externalized via Job Control Language (JCL).</p>
+
+ <p>The OS390BATCH environment variable enables non-UNIX support including the
+ batch environment. When OS390BATCH is set, the libicuuc<i>XX</i>.dll,
+ libicudt<i>XX</i>e.dll, and libicudt<i>XX</i>e_stub.dll binaries are built
+ into data sets (the native file system). Turning on OS390BATCH does not turn
+ off the normal z/OS UNIX build. This means that the z/OS UNIX (HFS) DLLs will
+ always be created.</p>
+
+ <p>Two additional environment variables indicate the names of the z/OS data
+ sets to use. The LOADMOD environment variable identifies the name of the data
+ set that contains the dynamic link libraries (DLLs) and the LOADEXP
+ environment variable identifies the name of the data set that contains the
+ side decks, which are normally the files with the .x suffix in the UNIX file
+ system.</p>
+
+ <p>A data set is roughly equivalent to a UNIX or Windows file. For most kinds
+ of data sets the operating system maintains record boundaries. UNIX and
+ Windows files are byte streams. Two kinds of data sets are PDS and PDSE. Each
+ data set of these two types contains a directory. It is like a UNIX
+ directory. Each "file" is called a "member". Each member name is limited to
+ eight bytes, normally EBCDIC.</p>
+
+ <p>Here is an example of some environment variables that you can set prior to
+ building ICU:</p>
+ <pre>
+<samp>OS390BATCH=1
+LOADMOD=<i>USER</i>.ICU.LOAD
+LOADEXP=<i>USER</i>.ICU.EXP</samp>
+</pre>
+
+ <p>The PDS member names for the DLL file names are as follows:</p>
+ <pre>
+<samp>IXMI<i>XX</i>IN --> libicui18n<i>XX</i>.dll
+IXMI<i>XX</i>UC --> libicuuc<i>XX</i>.dll
+IXMI<i>XX</i>DA --> libicudt<i>XX</i>e.dll
+IXMI<i>XX</i>D1 --> libicudt<i>XX</i>e_stub.dll <i>(Only when OS390_STUBDATA=1)</i></samp>
+</pre>
+
+ <p>You should point the LOADMOD environment variable at a partitioned data
+ set extended (PDSE) and point the LOADEXP environment variable at a
+ partitioned data set (PDS). The PDSE can be allocated with the following
+ attributes:</p>
+ <pre>
+<samp>Data Set Name . . . : <i>USER</i>.ICU.LOAD
+Management class. . : <i>**None**</i>
+Storage class . . . : <i>BASE</i>
+Volume serial . . . : <i>TSO007</i>
+Device type . . . . : <i>3390</i>
+Data class. . . . . : LOAD
+Organization . . . : PO
+Record format . . . : U
+Record length . . . : 0
+Block size . . . . : 32760
+1st extent cylinders: 1
+Secondary cylinders : 5
+Data set name type : LIBRARY</samp>
+</pre>
+
+ <p>The PDS can be allocated with the following attributes:</p>
+ <pre>
+<samp>Data Set Name . . . : <i>USER</i>.ICU.EXP
+Management class. . : <i>**None**</i>
+Storage class . . . : <i>BASE</i>
+Volume serial . . . : <i>TSO007</i>
+Device type . . . . : <i>3390</i>
+Data class. . . . . : <i>**None**</i>
+Organization . . . : PO
+Record format . . . : FB
+Record length . . . : 80
+Block size . . . . : <i>3200</i>
+1st extent cylinders: 3
+Secondary cylinders : 3
+Data set name type : PDS</samp>
+</pre>
+
+ <h3><a name="HowToBuildOS400" href="#HowToBuildOS400" id=
+ "HowToBuildOS400">How To Build And Install On i5/OS (OS/400 iSeries)</a></h3>
+
+ <p>Before you start building ICU, ICU requires the following:</p>
+
+ <ul>
+ <li>QSHELL interpreter installed (install base option 30, operating system)
+ <!--li>QShell Utilities, PRPQ 5799-XEH (not required for V4R5)</li--></li>
+
+ <li>ILE C/C++ Compiler for iSeries, LPP 5722-WDS</li>
+
+ <li>The latest GNU facilities (You can get the GNU facilities for i5/OS
+ from <a href=
+ "http://www.ibm.com/servers/enable/site/porting/iseries/overview/gnu_utilities.html">
+ http://www.ibm.com/servers/enable/site/porting/iseries/overview/gnu_utilities.html</a>).
+ Older versions may not work properly.</li>
+ </ul>
+
+ <p>The following describes how to setup and build ICU. For background
+ information, you should look at the <a href="#HowToBuildUNIX">UNIX build
+ instructions</a>.</p>
+
+ <ol>
+ <li>Create i5/OS target library. This library will be the target for the
+ resulting modules, programs and service programs. You will specify this
+ library on the OUTPUTDIR environment variable in step 2.
+ <pre>
+<samp>CRTLIB LIB(<i>libraryname</i>)</samp>
+</pre>
+ </li>
+
+ <li>Set up the following environment variables in your build process (use
+ the <i>libraryname</i> from the previous step). The <i>libraryname</i>
+ identifies target i5/OS library for *module, *pgm and *srvpgm objects.
+ <pre>
+<samp>ADDENVVAR ENVVAR(CC) VALUE('/usr/bin/icc')
+ADDENVVAR ENVVAR(CXX) VALUE('/usr/bin/icc')
+ADDENVVAR ENVVAR(MAKE) VALUE('/usr/bin/gmake')
+ADDENVVAR ENVVAR(OUTPUTDIR) VALUE('<i>libraryname</i>')</samp>
+</pre>
+ </li>
+
+ <li>Run <tt>'CHGJOB CCSID(37)'</tt></li>
+
+ <li>Run <tt>'QSH'</tt></li>
+
+ <li>Run gunzip on the ICU source code compressed tar archive
+ (icu-<i>X</i>.<i>Y</i>.tgz).</li>
+
+ <li>Run unpax-icu.sh on the tar file generated from the previous step.</li>
+
+ <li>Change your current directory to icu/source.</li>
+
+ <li>Run <tt>'export CFLAGS=-O4 CXXFLAGS=-O4'</tt> to optimize your build of
+ ICU. If the build fails, rerun these build steps without this step before
+ asking the icu-support mailing list for help.</li>
+
+ <li>Run <tt>'./configure'</tt></li>
+
+ <li>Run <tt>'gmake'</tt> to build ICU.</li>
+
+ <li>Run <tt>'gmake check'</tt> to build the tests.</li>
+
+ <li>The "utility/MultithreadTest" test in intltest may have failed during
+ <tt>'gmake check'</tt>. In order to make this test pass, please use
+ <tt>'gmake check QIBM_MULTI_THREADED=Y'</tt> after you built the tests with
+ <tt>'gmake check'</tt> from the previous step. You can look at the <a href=
+ "http://publib.boulder.ibm.com/iseries/v5r1/ic2924/index.htm?info/apis/concept4.htm">
+ iSeries Information Center</a> for more details.</li>
+ </ol><!-- end build environment -->
+
+ <h2><a name="HowToPackage" href="#HowToPackage" id="HowToPackage">How To
+ Package ICU</a></h2>
+
+ <p>There are many ways that a person can package ICU with their software
+ products. Usually only the libraries need to be considered for packaging.</p>
+
+ <p>On UNIX, you should use "<tt>gmake install</tt>" to make it easier to
+ develop and package ICU. The bin, lib and include directories are needed to
+ develop applications that use ICU. These directories will be created relative
+ to the "<tt>--prefix=</tt><i>dir</i>" configure option (See the <a href=
+ "#HowToBuildUNIX">UNIX build instructions</a>). When ICU is built on Windows,
+ a similar directory structure is built.</p>
+
+ <p>When changes have been made to the standard ICU distribution, it is
+ recommended that at least one of the following guidelines be followed for
+ special packaging.</p>
+
+ <ol>
+ <li>Add a suffix name to the library names. This can be done with the
+ --with-library-suffix configure option.</li>
+
+ <li>The installation script should install the ICU libraries into the
+ application's directory.</li>
+ </ol>
+
+ <p>Following these guidelines prevents other applications that use a standard
+ ICU distribution from conflicting with any libraries that you need. On
+ operating systems that do not have a standard C++ ABI (name mangling) for
+ compilers, it is recommended to do this special packaging anyway. More
+ details on customizing ICU are available in the <a href=
+ "http://icu.sourceforge.net/userguide/">User's Guide</a>. The <a href=
+ "#SourceCode">ICU Source Code Organization</a> section of this readme.html
+ gives a more complete description of the libraries.</p>
+
+ <table border="1" cellpadding="3" summary=
+ "ICU has several libraries for you to use.">
+ <caption>
+ Here is an example of libraries that are frequently packaged.
+ </caption>
+
+ <tr>
+ <th scope="col">Library Name</th>
+
+ <th scope="col">Windows Filename</th>
+
+ <th scope="col">Linux Filename</th>
+
+ <th scope="col">Comment</th>
+ </tr>
+
+ <tr>
+ <td>Data Library</td>
+
+ <td>icudt<i>XY</i>l.dll</td>
+
+ <td>libicudata.so.<i>XY</i>.<i>Z</i></td>
+
+ <td>Data required by the Common and I18n libraries. There are many ways
+ to package and <a href=
+ "http://icu.sourceforge.net/userguide/icudata.html">customize this
+ data</a>, but by default this is all you need.</td>
+ </tr>
+
+ <tr>
+ <td>Common Library</td>
+
+ <td>icuuc<i>XY</i>.dll</td>
+
+ <td>libicuuc.so.<i>XY</i>.<i>Z</i></td>
+
+ <td>Base library required by all other ICU libraries.</td>
+ </tr>
+
+ <tr>
+ <td>Internationalization (i18n) Library</td>
+
+ <td>icuin<i>XY</i>.dll</td>
+
+ <td>libicui18n.so.<i>XY</i>.<i>Z</i></td>
+
+ <td>A library that contains many locale based internationalization (i18n)
+ functions.</td>
+ </tr>
+
+ <tr>
+ <td>Layout Engine</td>
+
+ <td>icule<i>XY</i>.dll</td>
+
+ <td>libicule.so.<i>XY</i>.<i>Z</i></td>
+
+ <td>An optional engine for doing font layout.</td>
+ </tr>
+
+ <tr>
+ <td>Layout Extensions Engine</td>
+
+ <td>iculx<i>XY</i>.dll</td>
+
+ <td>libiculx.so.<i>XY</i>.<i>Z</i></td>
+
+ <td>An optional engine for doing font layout that uses parts of ICU.</td>
+ </tr>
+
+ <tr>
+ <td>ICU I/O (Unicode stdio) Library</td>
+
+ <td>icuio<i>XY</i>.dll</td>
+
+ <td>libicuio.so.<i>XY</i>.<i>Z</i></td>
+
+ <td>An optional library that provides a stdio like API with Unicode
+ support.</td>
+ </tr>
+
+ <tr>
+ <td>Tool Utility Library</td>
+
+ <td>icutu<i>XY</i>.dll</td>
+
+ <td>libicutu.so.<i>XY</i>.<i>Z</i></td>
+
+ <td>An internal library that contains internal APIs that are only used by
+ ICU's tools. If you do not use ICU's tools, you do not need this
+ library.</td>
+ </tr>
+ </table>
+
+ <p>Normally only the above ICU libraries need to be considered for packaging.
+ The versionless symbolic links to these libraries are only needed for easier
+ development. The <i>X</i>, <i>Y</i> and <i>Z</i> parts of the name are the
+ version numbers of ICU. For example, ICU 2.0.2 would have the name
+ libicuuc.so.20.2 for the common library. The exact format of the library
+ names can vary between platforms due to how each platform can handles library
+ versioning.</p>
+
+ <h2><a name="ImportantNotes" href="#ImportantNotes" id=
+ "ImportantNotes">Important Notes About Using ICU</a></h2>
+
+ <h3><a name="ImportantNotesMultithreaded" href="#ImportantNotesMultithreaded"
+ id="ImportantNotesMultithreaded">Using ICU in a Multithreaded
+ Environment</a></h3>
+
+ <p>Some versions of ICU require calling the <code>u_init()</code> function
+ from <code>uclean.h</code> to ensure that ICU is initialized properly. In
+ those ICU versions, <code>u_init()</code> must be called before ICU is used
+ from multiple threads. There is no harm in calling <code>u_init()</code> in a
+ single-threaded application, on a single-CPU machine, or in other cases where
+ <code>u_init()</code> is not required.</p>
+
+ <p>In addition to ensuring thread safety, <code>u_init()</code> also attempts
+ to load at least one ICU data file. Assuming that all data files are packaged
+ together (or are in the same folder in files mode), a failure code from
+ <code>u_init()</code> usually means that the data cannot be found. In this
+ case, the data may not be installed properly, or the application may have
+ failed to call <code>udata_setCommonData()</code> or
+ <code>u_setDataDirectory()</code> which specify to ICU where it can find its
+ data.</p>
+
+ <p>Since <code>u_init()</code> will load only one or two data files, it
+ cannot guarantee that all of the data that an application needs is available.
+ It cannot check for all data files because the set of files is customizable,
+ and some ICU services work without loading any data at all. An application
+ should always check for error codes when opening ICU service objects (using
+ <code>ucnv_open()</code>, <code>ucol_open()</code>, C++ constructors,
+ etc.).</p>
+
+ <h4>ICU 3.4 and later</h4>
+
+ <p>ICU 3.4 self-initializes properly for multi-threaded use. It achieves this
+ without performance penalty by hardcoding the core Unicode properties data,
+ at the cost of some flexibility. (For details see Jitterbug 4497.)</p>
+
+ <p><code>u_init()</code> can be used to check for data loading. It tries to
+ load the converter alias table (<code>cnvalias.icu</code>).</p>
+
+ <h4>ICU 2.6..3.2</h4>
+
+ <p>These ICU versions require a call to <code>u_init()</code> before
+ multi-threaded use. The services that are directly affected are those that
+ don't have a service object and need to be fast: normalization and character
+ properties.</p>
+
+ <p><code>u_init()</code> loads and initializes the data files for
+ normalization and character properties (<code>unorm.icu</code> and
+ <code>uprops.icu</code>) and can therefore also be used to check for data
+ loading.</p>
+
+ <h4>ICU 2.4 and earlier</h4>
+
+ <p>ICU 2.4 and earlier versions were not prepared for multithreaded use on
+ multi-CPU platforms where the CPUs implement weak memory coherency. These
+ CPUs include: Power4, Power5, Alpha, Itanium. <code>u_init()</code> was not
+ defined yet.</p>
+
+ <h4><a name="ImportantNotesHPUX" href="#ImportantNotesHPUX" id=
+ "ImportantNotesHPUX">Using ICU in a Multithreaded Environment on
+ HP-UX</a></h4>
+
+ <p>If you are building ICU with a newer aCC compiler and you are planning on
+ using the older <iostream.h> instead of the newer <iostream>, you
+ will need to use a special configure flag before building ICU. By default,
+ the aCC <a href="http://docs.hp.com/en/1405/options.htm#optioncap-AA">
+ -AA</a> flag is used on HP-UX when the compiler supports that option in order
+ to make ICU thread safe with RogueWave and other libraries using the 2.0
+ Standard C++ library. Your applications that use ICU will also need to use
+ the <a href="http://docs.hp.com/en/1405/options.htm#optioncap-AA">
+ -AA</a> compiler flag. To turn off this behavior in ICU, you will need to use
+ the --with-iostream= old configure option when you first use
+ runConfigureICU.</p>
+
+ <h4><a name="ImportantNotesSolaris" href="#ImportantNotesSolaris" id=
+ "ImportantNotesSolaris">Using ICU in a Multithreaded Environment on
+ Solaris</a></h4>
+
+ <h5>ICU's tests may hang on Solaris 8 and Earlier</h5>
+
+ <p>ICU's tests use <code>usleep()</code>, which is multithread unsafe on
+ versions of Solaris before version 9. This does not mean that ICU is not
+ thread safe because only ICU's test code uses <code>usleep()</code>. The
+ <code>sleep()</code> and <code>nanosleep()</code> functions could be used in
+ ICU's multithreaded tests, but <code>sleep()</code> and
+ <code>nanosleep()</code> are not a stable API between versions of Solaris.
+ Solaris 9 fixes usleep so that it is multithread safe.</p>
+
+ <p>This hanging behavior tends to appear on multi-CPU machines. Single CPU
+ Solaris 8 machines do not seem to show this behavior.</p>
+
+ <p>In a future version of ICU, we hope to find a portable solution to this
+ problem that will work between the modern versions of Solaris.</p>
+
+ <h5>Solaris Deadlock Issues in Solaris 8 (2.8) and Earlier</h5>
+
+ <p>Solaris 8, and earlier, has outstanding thread deadlocking issues that
+ <strong>may</strong> be problematic for applications using either native, or
+ POSIX, threading on these platforms. Sun states that Solaris 9 <strong>does
+ not</strong> have the deadlock problems. Deadlocks <strong>may</strong> occur
+ either during initialization of the Solaris threading library, or at any
+ other time.</p>
+
+ <p>Sun Microsystems has provided a Sun Alert Notification regarding the
+ issue. Users <strong>should</strong> consider applying the latest OS patches
+ to their Solaris installations in order to help avoid deadlock. Further
+ information regarding the issue, and links to applicable patches, may be
+ found at:</p>
+
+ <p>[1] "<i>Applications Linked to libthread May Hang</i>", Sun Alert
+ Notification, Sun Microsystems, Inc., 04-Sep-2002<br>
+ <a href=
+ "http://sunsolve.sun.com/search/document.do?assetkey=1-26-46867">
+ http://sunsolve.sun.com/search/document.do?assetkey=1-26-46867</a></p>
+
+ <p>Sun is <strong>not</strong> providing patches for Solaris 6 (2.6), or
+ earlier.</p>
+
+ <p>Sun states that by applying the patch users will avoid the deadlock
+ issues. However, with all applicable patches applied, deadlock
+ <strong>may</strong> still be seen, as demonstrated by the ICU Mutex unit
+ tests. The unit test will hang indefinitely. No bug exists in ICU. However, a
+ latent bug still exists in Solaris, which Sun Microsystems has yet to
+ resolve. In order to avoid this, users are <strong>suggested</strong> to
+ modify their LD_LIBRARY_PATH according to the guidelines specified by Sun
+ Microsystems in the Sun Alert Notification.</p>
+
+ <h5>Linking on Solaris</h5>
+
+ <p>In order to avoid synchronization and threading issues, developers are
+ <strong>suggested</strong> to strictly follow the compiling and linking
+ guidelines for multithreaded applications, specified in the following
+ document from Sun Microsystems. Most notably, pay strict attention to the
+ following statements from Sun:</p>
+
+ <blockquote>
+ <p>To use libthread, specify -lthread before -lc on the ld command line, or
+ last on the cc command line.</p>
+
+ <p>To use libpthread, specify -lpthread before -lc on the ld command line,
+ or last on the cc command line.</p>
+ </blockquote>
+
+ <p>Failure to do this may cause spurious lock conflicts, recursive mutex
+ failure, and deadlock.</p>
+
+ <p>[2] "<i>Solaris Multithreaded Programming Guide, Compiling and
+ Debugging</i>", Sun Microsystems, Inc., Apr 2004<br>
+ <a href=
+ "http://docs.sun.com/db/doc/806-6867/6jfpgdcob?a=view">http://docs.sun.com/db/doc/806-6867/6jfpgdcob?a=view</a></p>
+
+ <h3><a name="ImportantNotesWindows" href="#ImportantNotesWindows" id=
+ "ImportantNotesWindows">Windows Platform</a></h3>
+
+ <p>If you are building on the Win32 platform, it is important that you
+ understand a few of the following build details.</p>
+
+ <h4>DLL directories and the PATH setting</h4>
+
+ <p>As delivered, the International Components for Unicode build as several
+ DLLs, which are placed in the "<i><ICU></i>\bin" directory. You must
+ add this directory to the PATH environment variable in your system, or any
+ executables you build will not be able to access International Components for
+ Unicode libraries. Alternatively, you can copy the DLL files into a directory
+ already in your PATH, but we do not recommend this. You can wind up with
+ multiple copies of the DLL and wind up using the wrong one.</p>
+
+ <h4><a name="ImportantNotesWindowsPath" id=
+ "ImportantNotesWindowsPath">Changing your PATH</a></h4>
+
+ <ul>
+ <li><strong>Windows 2000/XP</strong>: Use the System Icon in the Control
+ Panel. Pick the "Advanced" tab. Select the "Environment Variables..."
+ button. Select the variable PATH in the lower box, and select the lower
+ "Edit..." button. In the "Variable Value" box, append the string
+ ";<i><ICU></i>\bin" to the end of the path string. If there is
+ nothing there, just type in "<i><ICU></i>\bin". Click the Set button,
+ then the OK button.</li>
+
+ <li><strong>Windows 95/98/ME</strong>: Edit the autoexec.bat, and add the
+ following line to the end of file, "SET
+ PATH=%PATH%;<i><ICU></i>\bin"</li>
+ </ul>
+
+ <p>Note: When packaging a Windows application for distribution and
+ installation on user systems, copies of the ICU DLLs should be included with
+ the application, and installed for exclusive use by the application. This is
+ the only way to insure that your application is running with the same version
+ of ICU, built with exactly the same options, that you developed and tested
+ with. Refer to Microsoft's guidelines on the usage of DLLs, or search for the
+ phrase "DLL hell" on <a href=
+ "http://msdn.microsoft.com/">msdn.microsoft.com</a>.</p>
+
+ <h3><a name="ImportantNotesUNIX" href="#ImportantNotesUNIX" id=
+ "ImportantNotesUNIX">UNIX Type Platform</a></h3>
+
+ <p>If you are building on a UNIX platform, and if you are installing ICU in a
+ non-standard location, you may need to add the location of your ICU libraries
+ to your <strong>LD_LIBRARY_PATH</strong> or <strong>LIBPATH</strong>
+ environment variable (or the equivalent runtime library path environment
+ variable for your system). The ICU libraries may not link or load properly
+ without doing this.</p>
+
+ <p>Note that if you do not want to have to set this variable, you may instead
+ use the --enable-rpath option at configuration time. This option will
+ instruct the linker to always look for the libraries where they are
+ installed. You will need to use the appropriate linker options when linking
+ your own applications and libraries against ICU, too. Please refer to your
+ system's linker manual for information about runtime paths. The use of rpath
+ also means that when building a new version of ICU you should not have an
+ older version installed in the same place as the new version's installation
+ directory, as the older libraries will used during the build, instead of the
+ new ones, likely leading to an incorrectly build ICU. This is the proper
+ behavior of rpath.</p>
+
+ <h2><a name="PlatformDependencies" href="#PlatformDependencies" id=
+ "PlatformDependencies">Platform Dependencies</a></h2>
+
+ <h3><a name="PlatformDependenciesNew" href="#PlatformDependenciesNew" id=
+ "PlatformDependenciesNew">Porting To A New Platform</a></h3>
+
+ <p>If you are using ICU's Makefiles to build ICU on a new platform, there are
+ a few places where you will need to add or modify some files. If you need
+ more help, you can always ask the <a href=
+ "http://icu.sourceforge.net/contacts.html">icu-support mailing list</a>. Once
+ you have finished porting ICU to a new platform, it is recommended that you
+ contribute your changes back to ICU via the icu-support mailing list. This
+ will make it easier for everyone to benefit from your work.</p>
+
+ <h4>Data For a New Platform</h4>
+
+ <p>For some people, it may not be necessary for completely build ICU. Most of
+ the makefiles and build targets are for tools that are used for building
+ ICU's data, and an application's data (when an application uses ICU resource
+ bundles for its data).</p>
+
+ <p>Data files can be built on a different platform when both platforms share
+ the same endianness and the same charset family. This assertion does not
+ include platform dependent DLLs/shared/static libraries. For details see the
+ User Guide <a href="http://icu.sourceforge.net/userguide/icudata.html">ICU
+ Data</a> chapter.</p>
+
+ <p>ICU 2.8 removes the requirement that ICU be completely built in the native
+ operating environment. It adds the icuswap tool which can be run on any
+ platform to turn binary ICU data files from any one of the three formats into
+ any one of the other data formats. This allows a application to use ICU data
+ built anywhere to be used for any other target platform.</p>
+
+ <p><strong>WARNING!</strong> Building ICU without running the tests is not
+ recommended. The tests verify that ICU is safe to use. It is recommended that
+ you try to completely port and test ICU before using the libraries for your
+ own application.</p>
+
+ <h4>Adapting Makefiles For a New Platform</h4>
+
+ <p>Try to follow the build steps from the <a href="#HowToBuildUNIX">UNIX</a>
+ build instructions. If the configure script fails, then you will need to
+ modify some files. Here are the usual steps for porting to a new
+ platform:<br></p>
+
+ <ol>
+ <li>Create an mh file in icu/source/config/. You can use mh-linux or a
+ similar mh file as your base configuration.</li>
+
+ <li>Modify icu/source/aclocal.m4 to recognize your platform's mh file.</li>
+
+ <li>Modify icu/source/configure.in to properly set your <b>platform</b> C
+ Macro define.</li>
+
+ <li>Run <a href="http://www.gnu.org/software/autoconf/">autoconf</a> in
+ icu/source/ without any options. The autoconf tool is standard on most
+ Linux systems.</li>
+
+ <li>If you have any optimization options that you want to normally use, you
+ can modify icu/source/runConfigureICU to specify those options for your
+ platform.</li>
+
+ <li>Build and test ICU on your platform. It is very important that you run
+ the tests. If you don't run the tests, there is no guarentee that you have
+ properly ported ICU.</li>
+ </ol>
+
+ <h3><a name="PlatformDependenciesImpl" href="#PlatformDependenciesImpl" id=
+ "PlatformDependenciesImpl">Platform Dependent Implementations</a></h3>
+
+ <p>The platform dependencies have been mostly isolated into the following
+ files in the common library. This information can be useful if you are
+ porting ICU to a new platform.</p>
+
+ <ul>
+ <li>
+ <strong>unicode/platform.h.in</strong> (autoconf'ed platforms)<br>
+ <strong>unicode/p<i>XXXX</i>.h</strong> (others: pwin32.h, pmacos.h, ..):
+ Platform-dependent typedefs and defines:<br>
+ <br>
+
+ <ul>
+ <li>XP_CPLUSPLUS for C++ only.</li>
+
+ <li>Generic types like UBool, int8_t, int16_t, int32_t, int64_t,
+ uint64_t etc.</li>
+
+ <li>U_EXPORT and U_IMPORT for specifying dynamic library import and
+ export</li>
+
+ <li><iostream> usability</li>
+ </ul><br>
+ </li>
+
+ <li>
+ <strong>unicode/putil.h, putil.c</strong>: platform-dependent
+ implementations of various functions that are platform dependent:<br>
+ <br>
+
+ <ul>
+ <li>uprv_isNaN, uprv_isInfinite, uprv_getNaN and uprv_getInfinity for
+ handling special floating point values.</li>
+
+ <li>uprv_tzset, uprv_timezone, uprv_tzname and time for getting
+ platform specific time and time zone information.</li>
+
+ <li>u_getDataDirectory for getting the default data directory.</li>
+
+ <li>uprv_getDefaultLocaleID for getting the default locale
+ setting.</li>
+
+ <li>uprv_getDefaultCodepage for getting the default codepage
+ encoding.</li>
+ </ul><br>
+ </li>
+
+ <li>
+ <strong>umutex.h, umutex.c</strong>: Code for doing synchronization in
+ multithreaded applications. If you wish to use International Components
+ for Unicode in a multithreaded application, you must provide a
+ synchronization primitive that the classes can use to protect their
+ global data against simultaneous modifications. See Users' guide for more
+ information.<br>
+ <br>
+
+ <ul>
+ <li>We supply sample implementations for Windows, Sun Solaris, Linux,
+ AIX, HP-UX, BSD, Mac OS X, z/OS and many others.</li>
+ </ul><br>
+ </li>
+
+ <li><strong>umapfile.h, umapfile.c</strong>: functions for mapping or
+ otherwise reading or loading files into memory. All access by ICU to data
+ from files makes use of these functions.<br>
+ <br></li>
+
+ <li>Using platform specific #ifdef macros are highly discouraged outside of
+ the scope of these files. When the source code gets updated in the future,
+ these #ifdef's can cause testing problems for your platform.</li>
+ </ul>
+ <hr>
+
+ <p>Copyright © 1997-2006 International Business Machines Corporation and
+ others. All Rights Reserved.<br>
+ IBM Globalization Center of Competency - San José<br>
+ 5600 Cottle Road<br>
+ San José, CA 95193<br>
+ USA</p>
+</body>
+</html>
diff --git a/source/.cvsignore b/source/.cvsignore
new file mode 100644
index 0000000..a5c8e2d
--- /dev/null
+++ b/source/.cvsignore
@@ -0,0 +1,9 @@
+config.log
+config.cache
+config.status
+Makefile
+icudefs.mk
+README
+bin
+lib
+Doxyfile
\ No newline at end of file
diff --git a/source/Doxyfile.in b/source/Doxyfile.in
new file mode 100644
index 0000000..0c3eeb8
--- /dev/null
+++ b/source/Doxyfile.in
@@ -0,0 +1,224 @@
+# Doxyfile 1.3.7
+# ********************************************************************
+# * COPYRIGHT:
+# * Copyright (c) 2004-2006, International Business Machines Corporation
+# * and others. All Rights Reserved.
+# ********************************************************************
+
+#---------------------------------------------------------------------------
+# Project related configuration options
+#---------------------------------------------------------------------------
+PROJECT_NAME = "ICU @VERSION@"
+PROJECT_NUMBER =
+OUTPUT_DIRECTORY = doc
+CREATE_SUBDIRS = NO
+OUTPUT_LANGUAGE = English
+USE_WINDOWS_ENCODING = YES
+BRIEF_MEMBER_DESC = YES
+REPEAT_BRIEF = YES
+ABBREVIATE_BRIEF =
+ALWAYS_DETAILED_SEC = NO
+INLINE_INHERITED_MEMB = NO
+FULL_PATH_NAMES = NO
+STRIP_FROM_PATH =
+STRIP_FROM_INC_PATH =
+SHORT_NAMES = NO
+JAVADOC_AUTOBRIEF = YES
+MULTILINE_CPP_IS_BRIEF = NO
+DETAILS_AT_TOP = NO
+INHERIT_DOCS = YES
+DISTRIBUTE_GROUP_DOC = NO
+TAB_SIZE = 8
+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
+#---------------------------------------------------------------------------
+# Build related configuration options
+#---------------------------------------------------------------------------
+EXTRACT_ALL = NO
+EXTRACT_PRIVATE = NO
+EXTRACT_STATIC = NO
+EXTRACT_LOCAL_CLASSES = YES
+EXTRACT_LOCAL_METHODS = NO
+HIDE_UNDOC_MEMBERS = NO
+HIDE_UNDOC_CLASSES = NO
+HIDE_FRIEND_COMPOUNDS = NO
+HIDE_IN_BODY_DOCS = NO
+INTERNAL_DOCS = YES
+CASE_SENSE_NAMES = YES
+HIDE_SCOPE_NAMES = NO
+SHOW_INCLUDE_FILES = YES
+INLINE_INFO = YES
+SORT_MEMBER_DOCS = YES
+SORT_BRIEF_DOCS = NO
+SORT_BY_SCOPE_NAME = NO
+GENERATE_TODOLIST = YES
+GENERATE_TESTLIST = YES
+GENERATE_BUGLIST = YES
+GENERATE_DEPRECATEDLIST= YES
+ENABLED_SECTIONS =
+MAX_INITIALIZER_LINES = 30
+SHOW_USED_FILES = YES
+#---------------------------------------------------------------------------
+# configuration options related to warning and progress messages
+#---------------------------------------------------------------------------
+QUIET = NO
+WARNINGS = YES
+WARN_IF_UNDOCUMENTED = YES
+WARN_IF_DOC_ERROR = YES
+WARN_FORMAT = "$file:$line: $text"
+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/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 @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 =
+EXAMPLE_PATTERNS =
+EXAMPLE_RECURSIVE = NO
+IMAGE_PATH =
+INPUT_FILTER =
+FILTER_SOURCE_FILES = NO
+#---------------------------------------------------------------------------
+# configuration options related to source browsing
+#---------------------------------------------------------------------------
+SOURCE_BROWSER = YES
+INLINE_SOURCES = NO
+STRIP_CODE_COMMENTS = YES
+REFERENCED_BY_RELATION = YES
+REFERENCES_RELATION = YES
+VERBATIM_HEADERS = YES
+#---------------------------------------------------------------------------
+# configuration options related to the alphabetical class index
+#---------------------------------------------------------------------------
+ALPHABETICAL_INDEX = YES
+COLS_IN_ALPHA_INDEX = 5
+IGNORE_PREFIX =
+#---------------------------------------------------------------------------
+# configuration options related to the HTML output
+#---------------------------------------------------------------------------
+GENERATE_HTML = YES
+HTML_OUTPUT = html
+HTML_FILE_EXTENSION = .html
+HTML_HEADER =
+HTML_FOOTER =
+HTML_STYLESHEET =
+HTML_ALIGN_MEMBERS = YES
+GENERATE_HTMLHELP = NO
+CHM_FILE =
+HHC_LOCATION =
+GENERATE_CHI = NO
+BINARY_TOC = NO
+TOC_EXPAND = NO
+DISABLE_INDEX = NO
+ENUM_VALUES_PER_LINE = 4
+GENERATE_TREEVIEW = NO
+TREEVIEW_WIDTH = 250
+#---------------------------------------------------------------------------
+# configuration options related to the LaTeX output
+#---------------------------------------------------------------------------
+GENERATE_LATEX = NO
+LATEX_OUTPUT = latex
+LATEX_CMD_NAME = latex
+MAKEINDEX_CMD_NAME = makeindex
+COMPACT_LATEX = NO
+PAPER_TYPE = a4wide
+EXTRA_PACKAGES =
+LATEX_HEADER =
+PDF_HYPERLINKS = NO
+USE_PDFLATEX = NO
+LATEX_BATCHMODE = NO
+LATEX_HIDE_INDICES = NO
+#---------------------------------------------------------------------------
+# configuration options related to the RTF output
+#---------------------------------------------------------------------------
+GENERATE_RTF = NO
+RTF_OUTPUT = rtf
+COMPACT_RTF = NO
+RTF_HYPERLINKS = NO
+RTF_STYLESHEET_FILE =
+RTF_EXTENSIONS_FILE =
+#---------------------------------------------------------------------------
+# configuration options related to the man page output
+#---------------------------------------------------------------------------
+GENERATE_MAN = NO
+MAN_OUTPUT = man
+MAN_EXTENSION = .3
+MAN_LINKS = NO
+#---------------------------------------------------------------------------
+# configuration options related to the XML output
+#---------------------------------------------------------------------------
+GENERATE_XML = NO
+XML_OUTPUT = xml
+XML_SCHEMA =
+XML_DTD =
+XML_PROGRAMLISTING = YES
+#---------------------------------------------------------------------------
+# configuration options for the AutoGen Definitions output
+#---------------------------------------------------------------------------
+GENERATE_AUTOGEN_DEF = NO
+#---------------------------------------------------------------------------
+# configuration options related to the Perl module output
+#---------------------------------------------------------------------------
+GENERATE_PERLMOD = NO
+PERLMOD_LATEX = YES
+PERLMOD_PRETTY = YES
+PERLMOD_MAKEVAR_PREFIX =
+#---------------------------------------------------------------------------
+# Configuration options related to the preprocessor
+#---------------------------------------------------------------------------
+ENABLE_PREPROCESSING = YES
+MACRO_EXPANSION = NO
+EXPAND_ONLY_PREDEF = NO
+SEARCH_INCLUDES = YES
+INCLUDE_PATH =
+INCLUDE_FILE_PATTERNS =
+PREDEFINED =
+EXPAND_AS_DEFINED =
+SKIP_FUNCTION_MACROS = YES
+#---------------------------------------------------------------------------
+# Configuration::additions related to external references
+#---------------------------------------------------------------------------
+TAGFILES =
+GENERATE_TAGFILE =
+ALLEXTERNALS = NO
+EXTERNAL_GROUPS = YES
+PERL_PATH = /usr/bin/perl
+#---------------------------------------------------------------------------
+# Configuration options related to the dot tool
+#---------------------------------------------------------------------------
+CLASS_DIAGRAMS = YES
+HIDE_UNDOC_RELATIONS = YES
+HAVE_DOT = NO
+CLASS_GRAPH = YES
+COLLABORATION_GRAPH = YES
+UML_LOOK = NO
+TEMPLATE_RELATIONS = NO
+INCLUDE_GRAPH = YES
+INCLUDED_BY_GRAPH = YES
+CALL_GRAPH = NO
+GRAPHICAL_HIERARCHY = YES
+DOT_IMAGE_FORMAT = png
+DOT_PATH =
+DOTFILE_DIRS =
+MAX_DOT_GRAPH_WIDTH = 1024
+MAX_DOT_GRAPH_HEIGHT = 1024
+MAX_DOT_GRAPH_DEPTH = 0
+GENERATE_LEGEND = YES
+DOT_CLEANUP = YES
+#---------------------------------------------------------------------------
+# Configuration::additions related to the search engine
+#---------------------------------------------------------------------------
+SEARCHENGINE = YES
diff --git a/source/Makefile.in b/source/Makefile.in
new file mode 100644
index 0000000..1d957db
--- /dev/null
+++ b/source/Makefile.in
@@ -0,0 +1,205 @@
+#******************************************************************************
+#
+# Copyright (C) 1998-2006, International Business Machines
+# Corporation and others. All Rights Reserved.
+#
+#******************************************************************************
+## Top-level Makefile.in for ICU
+## Stephen F. Booth
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+
+top_builddir = .
+
+include $(top_builddir)/icudefs.mk
+
+docdir = $(datadir)/doc
+docsubdir = $(PACKAGE)$(ICULIBDASHSUFFIX)/html
+
+##
+
+## Build directory information
+subdir = .
+
+#AUTOCONF = @AUTOCONF@
+
+## Optional directory setup
+@LAYOUT_TRUE@LAYOUT = layout layoutex
+@ICUIO_TRUE@ICUIO = io
+@EXTRAS_TRUE@EXTRA = extra
+@TESTS_TRUE@TEST = test
+@SAMPLES_TRUE@SAMPLE = samples
+
+DOXYGEN = @DOXYGEN@
+
+## Files to remove for 'make clean'
+CLEANFILES = *~
+
+## Files built (autoconfed) and installed
+INSTALLED_BUILT_FILES = $(top_builddir)/config/Makefile.inc $(top_builddir)/config/icu-config @platform_make_fragment@ $(EXTRA_DATA:%=$(DESTDIR)$(pkglibdir)/%)
+
+## Files built (autoconfed) but not installed
+LOCAL_BUILT_FILES = icudefs.mk
+
+DOCDIRS = common i18n
+SUBDIRS = stubdata common i18n $(LAYOUT) tools data $(ICUIO) $(EXTRA) $(SAMPLE) $(TEST)
+
+SECTION = 1
+
+MANX_FILES = config/icu-config.$(SECTION)
+
+ALL_MAN_FILES = $(MANX_FILES)
+
+## Extra files to install [nothing at present]
+EXTRA_DATA =
+
+## List of phony targets
+.PHONY : all all-local all-recursive install install-local install-udata install-udata-files install-udata-dlls \
+install-recursive clean clean-local clean-recursive distclean \
+distclean-local distclean-recursive doc dist dist-local dist-recursive \
+check check-local check-recursive clean-recursive-with-twist install-icu \
+doc install-doc
+
+## Clear suffix list
+.SUFFIXES :
+
+## List of standard targets
+all: all-local all-recursive
+install: install-recursive install-local
+clean: clean-recursive-with-twist clean-local
+distclean : distclean-recursive distclean-local
+dist: dist-recursive dist-local
+check: all check-recursive check-local
+check-recursive: all
+
+ifeq ($(DOXYGEN),)
+doc:
+ @echo you need Doxygen to generate documentation. Doxygen can be found on the Web
+ @echo at http://www.doxygen.org/
+else
+doc: doc/html/index.html
+
+doc/html/index.html: Doxyfile $(wildcard ./common/unicode/platform.h $(srcdir)/common/unicode/*.h $(srcdir)/i18n/unicode/*.h $(srcdir)/layout/unicode/*.h $(srcdir)/io/unicode/*.h)
+ $(DOXYGEN)
+
+Doxyfile: $(srcdir)/Doxyfile.in
+ CONFIG_FILES=$@ CONFIG_HEADERS= $(SHELL) ./config.status
+endif
+
+LOCAL_SUBDIRS = $(SUBDIRS)
+CLEAN_FIRST_SUBDIRS = tools
+
+$(LIBDIR) $(BINDIR):
+ -$(MKINSTALLDIRS) $@
+
+## Recursive targets
+all-recursive install-recursive clean-recursive distclean-recursive dist-recursive check-recursive: $(LIBDIR) $(BINDIR)
+ @dot_seen=no; \
+ target=`echo $@ | sed s/-recursive//`; \
+ list='$(LOCAL_SUBDIRS)'; for subdir in $$list; do \
+ echo "$(MAKE)[$(MAKELEVEL)]: Making \`$$target' in \`$$subdir'"; \
+ if test "$$subdir" = "."; then \
+ dot_seen=yes; \
+ local_target="$$target-local"; \
+ else \
+ local_target="$$target"; \
+ fi; \
+ (cd $$subdir && $(MAKE) RECURSIVE=YES $$local_target) || exit; \
+ done; \
+ if test "$$dot_seen" = "no"; then \
+ $(MAKE) "$$target-local" || exit; \
+ fi
+
+clean-recursive-with-twist:
+ $(MAKE) clean-recursive LOCAL_SUBDIRS='$(CLEAN_FIRST_SUBDIRS) $(filter-out $(CLEAN_FIRST_SUBDIRS),$(LOCAL_SUBDIRS))'
+
+all-local: $(srcdir)/configure $(LOCAL_BUILT_FILES) $(INSTALLED_BUILT_FILES)
+
+install-local: install-icu install-manx
+
+install-icu: $(INSTALLED_BUILT_FILES)
+ @$(MKINSTALLDIRS) $(DESTDIR)$(pkgdatadir)/config
+ @$(MKINSTALLDIRS) $(DESTDIR)$(pkglibdir)
+ @$(MKINSTALLDIRS) $(DESTDIR)$(bindir)
+ @$(MKINSTALLDIRS) $(DESTDIR)$(sbindir)
+ $(INSTALL_DATA) @platform_make_fragment@ $(DESTDIR)$(pkgdatadir)/config/@platform_make_fragment_name@
+ $(INSTALL_SCRIPT) $(top_srcdir)/mkinstalldirs $(DESTDIR)$(pkgdatadir)/mkinstalldirs
+ $(INSTALL_DATA) $(top_srcdir)/../license.html $(DESTDIR)$(pkgdatadir)/license.html
+ $(INSTALL_SCRIPT) $(top_builddir)/config/icu-config $(DESTDIR)$(bindir)/icu-config
+ $(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 Makefile.inc
+
+ifeq ($(DOXYGEN),)
+install-doc:
+else
+install-doc: doc
+ $(RM) -r $(DESTDIR)$(docdir)/$(docsubdir)
+ $(MKINSTALLDIRS) $(DESTDIR)$(docdir)/$(docsubdir)
+ $(INSTALL_DATA) doc/html/* $(DESTDIR)$(docdir)/$(docsubdir)
+endif
+
+$(DESTDIR)$(pkglibdir)/%: $(top_srcdir)/../data/%
+ $(INSTALL_DATA) $< $@
+
+dist-local:
+
+clean-local:
+ test -z "$(CLEANFILES)" || $(RMV) $(CLEANFILES)
+ $(RMV) Doxyfile doc
+
+distclean-local: clean-local
+ $(RMV) Makefile config/Makefile icudefs.mk
+ $(RMV) $(top_builddir)/config/Makefile.inc $(top_builddir)/config/icu-config
+ $(RMV) config.cache config.log config.status
+
+check-local:
+
+#$(srcdir)/configure : $(srcdir)/configure.in $(top_srcdir)/aclocal.m4
+# cd $(srcdir) && $(AUTOCONF)
+
+icudefs.mk: $(srcdir)/icudefs.mk.in $(top_builddir)/config.status
+ cd $(top_builddir) \
+ && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
+
+Makefile: $(srcdir)/Makefile.in icudefs.mk $(top_builddir)/config.status
+ cd $(top_builddir) \
+ && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
+
+$(top_builddir)/config/Makefile.inc: $(srcdir)/config/Makefile.inc.in $(top_builddir)/config.status
+ cd $(top_builddir) \
+ && CONFIG_FILES=$@ CONFIG_HEADERS= $(SHELL) ./config.status
+
+$(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
+ @echo
+ @echo "*** config.status has become stale ***"
+ @echo " 'configure' and/or 'uversion.h' have changed, please"
+ @echo " do 'runConfigureICU' (or 'configure') again, as per"
+ @echo " the readme.html."
+ @echo
+ @echo
+ exit 1
+
+
+install-manx: $(MANX_FILES)
+ $(MKINSTALLDIRS) $(DESTDIR)$(mandir)/man$(SECTION)
+ $(INSTALL_DATA) $? $(DESTDIR)$(mandir)/man$(SECTION)
+
+config/%.$(SECTION): $(srcdir)/config/%.$(SECTION).in
+ cd $(top_builddir) \
+ && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
+
diff --git a/source/acconfig.h b/source/acconfig.h
new file mode 100644
index 0000000..76fed55
--- /dev/null
+++ b/source/acconfig.h
@@ -0,0 +1,29 @@
+/* Copyright (c) 1999-2000, International Business Machines Corporation and
+ others. All Rights Reserved. */
+/* Define to signed char if not in <sys/types.h> */
+#undef int8_t
+
+/* Define to unsigned char if not in <sys/types.h> */
+#undef uint8_t
+
+/* Define to signed short if not in <sys/types.h> */
+#undef int16_t
+
+/* Define to unsigned short if not in <sys/types.h> */
+#undef uint16_t
+
+/* Define to signed long if not in <sys/types.h> */
+#undef int32_t
+
+/* Define to unsigned long if not in <sys/types.h> */
+#undef uint32_t
+
+/* Define to signed char if not in <sys/types.h> */
+#undef bool_t
+
+/* Define if your system has <wchar.h> */
+#undef HAVE_WCHAR_H
+
+/* Define to the size of wchar_t */
+#undef SIZEOF_WCHAR_T
+
diff --git a/source/aclocal.m4 b/source/aclocal.m4
new file mode 100644
index 0000000..fa0ab64
--- /dev/null
+++ b/source/aclocal.m4
@@ -0,0 +1,373 @@
+dnl aclocal.m4 for ICU
+dnl Copyright (c) 1999-2006, International Business Machines Corporation and
+dnl others. All Rights Reserved.
+dnl Stephen F. Booth
+
+dnl @TOP@
+
+dnl ICU_CHECK_MH_FRAG
+AC_DEFUN(ICU_CHECK_MH_FRAG, [
+ AC_CACHE_CHECK(
+ [which Makefile fragment to use],
+ [icu_cv_host_frag],
+ [
+case "${host}" in
+*-*-solaris*)
+ 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
+ icu_cv_host_frag=mh-alpha-linux-cc
+ fi ;;
+powerpc*-*-linux*)
+ if test "$GCC" = yes; then
+ icu_cv_host_frag=mh-linux
+ else
+ icu_cv_host_frag=mh-linux-va
+ fi ;;
+*-*-linux*) icu_cv_host_frag=mh-linux ;;
+*-*-cygwin)
+ if test "$GCC" = yes; then
+ icu_cv_host_frag=mh-cygwin
+ else
+ icu_cv_host_frag=mh-cygwin-msvc
+ fi ;;
+*-*-mingw32)
+ if test "$GCC" = yes; then
+ icu_cv_host_frag=mh-mingw
+ else
+ icu_cv_host_frag=mh-cygwin-msvc
+ fi ;;
+*-*-*bsd*|*-*-dragonfly*) icu_cv_host_frag=mh-bsd-gcc ;;
+*-*-aix*)
+ if test "$GCC" = yes; then
+ icu_cv_host_frag=mh-aix-gcc
+ else
+ if test -n "`$CXX --help 2>&1 | grep 'IBM C and C++ Compilers$'`"; then
+ icu_cv_host_frag=mh-aix
+ else
+ icu_cv_host_frag=mh-aix-va
+ fi
+ fi ;;
+*-*-hpux*)
+ if test "$GCC" = yes; then
+ icu_cv_host_frag=mh-hpux-gcc
+ else
+ case "$CXX" in
+ *aCC) icu_cv_host_frag=mh-hpux-acc ;;
+ *CC) icu_cv_host_frag=mh-hpux-cc ;;
+ esac
+ fi ;;
+*-*ibm-openedition*|*-*-os390*) icu_cv_host_frag=mh-os390 ;;
+*-*-os400*) icu_cv_host_frag=mh-os400 ;;
+*-apple-rhapsody*) icu_cv_host_frag=mh-darwin ;;
+*-apple-darwin*) icu_cv_host_frag=mh-darwin ;;
+*-*-beos) icu_cv_host_frag=mh-beos ;;
+*-*-irix*) icu_cv_host_frag=mh-irix ;;
+*-dec-osf*) icu_cv_host_frag=mh-alpha-osf ;;
+*-*-nto*) icu_cv_host_frag=mh-qnx ;;
+*-ncr-*) icu_cv_host_frag=mh-mpras ;;
+*) icu_cv_host_frag=mh-unknown ;;
+esac
+ ]
+ )
+])
+
+dnl ICU_CONDITIONAL - similar example taken from Automake 1.4
+AC_DEFUN(ICU_CONDITIONAL,
+[AC_SUBST($1_TRUE)
+if $2; then
+ $1_TRUE=
+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.
+
+AC_DEFUN(AC_SEARCH_LIBS_FIRST,
+[AC_PREREQ([2.13])
+AC_CACHE_CHECK([for library containing $1], [ac_cv_search_$1],
+[ac_func_search_save_LIBS="$LIBS"
+ac_cv_search_$1="no"
+for i in $2; do
+LIBS="-l$i $5 $ac_func_search_save_LIBS"
+AC_TRY_LINK_FUNC([$1],
+[ac_cv_search_$1="-l$i"
+break])
+done
+if test "$ac_cv_search_$1" = "no"; then
+AC_TRY_LINK_FUNC([$1], [ac_cv_search_$1="none required"])
+fi
+LIBS="$ac_func_search_save_LIBS"])
+if test "$ac_cv_search_$1" != "no"; then
+ test "$ac_cv_search_$1" = "none required" || LIBS="$ac_cv_search_$1 $LIBS"
+ $3
+else :
+ $4
+fi])
+
+dnl Check if we can build and use 64-bit libraries
+AC_DEFUN(AC_CHECK_64BIT_LIBS,
+[
+ AC_ARG_ENABLE(64bit-libs,
+ [ --enable-64bit-libs build 64-bit libraries [default=yes]],
+ [ENABLE_64BIT_LIBS=${enableval}],
+ [ENABLE_64BIT_LIBS=yes]
+ )
+ dnl These results can't be cached because is sets compiler flags.
+ AC_MSG_CHECKING([for 64-bit executable support])
+ if test "$ENABLE_64BIT_LIBS" != no; then
+ case "${host}" in
+ *-*-solaris*)
+ SPARCV9=`isainfo -n 2>&1 | grep sparcv9`
+ if test "$GCC" = yes; then
+ # We could add a check for -m64 depending on the gcc version.
+ ENABLE_64BIT_LIBS=no
+ else
+ SOL64=`$CXX -xarch=v9 2>&1 && $CC -xarch=v9 2>&1 | grep -v usage:`
+ if test -z "$SOL64" && test -n "$SPARCV9"; then
+ CFLAGS="${CFLAGS} -xtarget=ultra -xarch=v9"
+ CXXFLAGS="${CXXFLAGS} -xtarget=ultra -xarch=v9"
+ LDFLAGS="${LDFLAGS} -xtarget=ultra -xarch=v9"
+ ENABLE_64BIT_LIBS=yes
+ else
+ ENABLE_64BIT_LIBS=no
+ fi
+ fi
+ ;;
+ ia64-*-linux*)
+ if test "$GCC" = yes; then
+ # gcc compiler support
+ 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
+ # check for ecc/ecpc compiler support
+ if test -n "`$CXX --help 2>&1 && $CC --help 2>&1 | grep -v Intel`"; then
+ if test -n "`$CXX --help 2>&1 && $CC --help 2>&1 | grep -v Itanium`"; then
+ ENABLE_64BIT_LIBS=yes
+ else
+ ENABLE_64BIT_LIBS=no
+ fi
+ else
+ # unknown
+ ENABLE_64BIT_LIBS=no
+ fi
+ fi
+ ;;
+ x86_64-*-linux*)
+ 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
+ # unknown
+ 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.
+ # Maybe the flag "-maix64" could be used with gcc?
+ OLD_CFLAGS="${CFLAGS}"
+ OLD_CXXFLAGS="${CXXFLAGS}"
+ OLD_LDFLAGS="${LDFLAGS}"
+ CFLAGS="${CFLAGS} -q64"
+ CXXFLAGS="${CXXFLAGS} -q64"
+ LDFLAGS="${LDFLAGS} -q64"
+ 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}"
+ else
+ case "${host}" in
+ *-*-aix*)
+ ARFLAGS="${ARFLAGS} -X64"
+ esac
+ fi
+ fi
+ ;;
+ *-*-hpux*)
+ dnl First we try the newer +DD64, if that doesn't work,
+ dnl try other options.
+
+ OLD_CFLAGS="${CFLAGS}"
+ OLD_CXXFLAGS="${CXXFLAGS}"
+ CFLAGS="${CFLAGS} +DD64"
+ CXXFLAGS="${CXXFLAGS} +DD64"
+ 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}"
+ CFLAGS="${CFLAGS} +DA2.0W"
+ CXXFLAGS="${CXXFLAGS} +DA2.0W"
+ 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}"
+ 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)
+])
+
+dnl Strict compilation options.
+AC_DEFUN(AC_CHECK_STRICT_COMPILE,
+[
+ AC_MSG_CHECKING([whether strict compiling is on])
+ AC_ARG_ENABLE(strict,[ --enable-strict compile with strict compiler options [default=no]], [
+ if test "$enableval" = no
+ then
+ ac_use_strict_options=no
+ else
+ ac_use_strict_options=yes
+ fi
+ ], [ac_use_strict_options=no])
+ AC_MSG_RESULT($ac_use_strict_options)
+
+ 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 -Wno-long-long"
+ case "${host}" in
+ *-*-solaris*)
+ CFLAGS="$CFLAGS -D__STDC__=0";;
+ esac
+ else
+ case "${host}" in
+ *-*-cygwin)
+ if test "`$CC /help 2>&1 | head -c9`" = "Microsoft"
+ then
+ CFLAGS="$CFLAGS /W4"
+ fi
+ esac
+ fi
+ if test "$GXX" = yes
+ then
+ CXXFLAGS="$CXXFLAGS -W -Wall -ansi -pedantic -Wpointer-arith -Wwrite-strings -Wno-long-long"
+ case "${host}" in
+ *-*-solaris*)
+ CXXFLAGS="$CXXFLAGS -D__STDC__=0";;
+ esac
+ else
+ case "${host}" in
+ *-*-cygwin)
+ if test "`$CXX /help 2>&1 | head -c9`" = "Microsoft"
+ then
+ CXXFLAGS="$CXXFLAGS /W4"
+ fi
+ esac
+ fi
+ fi
+])
+
+dnl Define a sizeof checking macro that is a bit better than autoconf's
+dnl builtin (and heavily based on it, of course). The new macro is
+dnl AC_DO_CHECK_SIZEOF(TYPE [, CROSS_SIZE [, INCLUDES])
+AC_DEFUN(AC_DO_CHECK_SIZEOF,
+[changequote(<<, >>)dnl
+dnl The name to #define.
+define(<<AC_TYPE_NAME>>, translit(sizeof_$1, [a-z *], [A-Z_P]))dnl
+dnl The cache variable name.
+define(<<AC_CV_NAME>>, translit(ac_cv_sizeof_$1, [ *], [_p]))dnl
+changequote([, ])dnl
+AC_MSG_CHECKING(size of $1)
+AC_CACHE_VAL(AC_CV_NAME,
+[AC_TRY_RUN($3
+[#include <stdio.h>
+main()
+{
+ FILE *f=fopen("conftestval", "w");
+ if (!f) exit(1);
+ fprintf(f, "%d\n", sizeof($1));
+ exit(0);
+}], AC_CV_NAME=`cat conftestval`, AC_CV_NAME=0, ifelse([$2], , , AC_CV_NAME=$2))])dnl
+AC_MSG_RESULT($AC_CV_NAME)
+AC_DEFINE_UNQUOTED(AC_TYPE_NAME, $AC_CV_NAME)
+undefine([AC_TYPE_NAME])dnl
+undefine([AC_CV_NAME])dnl
+])
+
diff --git a/source/allinone/.cvsignore b/source/allinone/.cvsignore
new file mode 100644
index 0000000..4899cad
--- /dev/null
+++ b/source/allinone/.cvsignore
@@ -0,0 +1,3 @@
+*.ncb
+*.opt
+*.suo
\ No newline at end of file
diff --git a/source/allinone/allinone.sln b/source/allinone/allinone.sln
new file mode 100644
index 0000000..835178e
--- /dev/null
+++ b/source/allinone/allinone.sln
@@ -0,0 +1,383 @@
+Microsoft Visual Studio Solution File, Format Version 8.00
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "cintltst", "..\test\cintltst\cintltst.vcproj", "{3D1246AE-1B32-479B-BECA-AEFA97BE2321}"
+ ProjectSection(ProjectDependencies) = postProject
+ {0178B127-6269-407D-B112-93877BB62776} = {0178B127-6269-407D-B112-93877BB62776}
+ {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}") = "common", "..\common\common.vcproj", "{73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D}"
+ ProjectSection(ProjectDependencies) = postProject
+ {203EC78A-0531-43F0-A636-285439BDE025} = {203EC78A-0531-43F0-A636-285439BDE025}
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ctestfw", "..\tools\ctestfw\ctestfw.vcproj", "{ECA6B435-B4FA-4F9F-BF95-F451D078FC47}"
+ 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}") = "derb", "..\tools\genrb\derb.vcproj", "{D3065ADB-8820-4CC7-9B6C-9510833961A3}"
+ 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}") = "genbrk", "..\tools\genbrk\genbrk.vcproj", "{C2BE5000-7501-4E87-9724-B8D82494FAE6}"
+ 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}") = "genccode", "..\tools\genccode\genccode.vcproj", "{FDD3C4F2-9805-44EB-9A77-BC1C1C95B547}"
+ 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}") = "gencmn", "..\tools\gencmn\gencmn.vcproj", "{A8D36F8D-09E6-4174-91C3-7BEAA9C3F04F}"
+ 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}") = "gencnval", "..\tools\gencnval\gencnval.vcproj", "{8B41752B-5A52-41E4-B7E0-07921C0CC6BF}"
+ 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}") = "gennames", "..\tools\gennames\gennames.vcproj", "{F5281B04-A9E0-4680-BBA8-1D7F7D115458}"
+ 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}") = "gennorm", "..\tools\gennorm\gennorm.vcproj", "{F5213103-6CBE-46E6-B4CC-2570B6837D86}"
+ 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}") = "genpname", "..\tools\genpname\genpname.vcproj", "{DBC0AF0B-B9FF-4B23-905B-4D4CDC2A91CB}"
+ 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}") = "genprops", "..\tools\genprops\genprops.vcproj", "{6F744648-D15F-478A-90C6-58E353B5DDB3}"
+ 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}") = "genrb", "..\tools\genrb\genrb.vcproj", "{97521D06-EC47-45D4-8BD0-9E16B3F93B2A}"
+ ProjectSection(ProjectDependencies) = postProject
+ {0178B127-6269-407D-B112-93877BB62776} = {0178B127-6269-407D-B112-93877BB62776}
+ {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}") = "gentest", "..\tools\gentest\gentest.vcproj", "{77C78066-746F-4EA6-B3FE-B8C8A4A97891}"
+ 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}") = "genuca", "..\tools\genuca\genuca.vcproj", "{86829694-A375-4C58-B4EA-96EF514E3225}"
+ ProjectSection(ProjectDependencies) = postProject
+ {0178B127-6269-407D-B112-93877BB62776} = {0178B127-6269-407D-B112-93877BB62776}
+ {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}") = "i18n", "..\i18n\i18n.vcproj", "{0178B127-6269-407D-B112-93877BB62776}"
+ ProjectSection(ProjectDependencies) = postProject
+ {73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D} = {73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D}
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "intltest", "..\test\intltest\intltest.vcproj", "{73632960-B3A6-464D-83A3-4B43365F19B8}"
+ ProjectSection(ProjectDependencies) = postProject
+ {0178B127-6269-407D-B112-93877BB62776} = {0178B127-6269-407D-B112-93877BB62776}
+ {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}") = "layout", "..\layout\layout.vcproj", "{C920062A-0647-4553-A3B2-37C58065664B}"
+ ProjectSection(ProjectDependencies) = postProject
+ {73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D} = {73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D}
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "layoutex", "..\layoutex\layoutex.vcproj", "{37FC2C7F-1904-4811-8955-2F478830EAD1}"
+ ProjectSection(ProjectDependencies) = postProject
+ {C920062A-0647-4553-A3B2-37C58065664B} = {C920062A-0647-4553-A3B2-37C58065664B}
+ {73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D} = {73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D}
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "makeconv", "..\tools\makeconv\makeconv.vcproj", "{F5AD9738-1A3D-4906-B9C4-A7D9CE33DC2C}"
+ 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}") = "makedata", "..\data\makedata.vcproj", "{D9DF7F2F-93B7-4810-B5CD-96F4F33C079B}"
+ ProjectSection(ProjectDependencies) = postProject
+ {C2BE5000-7501-4E87-9724-B8D82494FAE6} = {C2BE5000-7501-4E87-9724-B8D82494FAE6}
+ {F5213103-6CBE-46E6-B4CC-2570B6837D86} = {F5213103-6CBE-46E6-B4CC-2570B6837D86}
+ {F5281B04-A9E0-4680-BBA8-1D7F7D115458} = {F5281B04-A9E0-4680-BBA8-1D7F7D115458}
+ {97521D06-EC47-45D4-8BD0-9E16B3F93B2A} = {97521D06-EC47-45D4-8BD0-9E16B3F93B2A}
+ {DBC0AF0B-B9FF-4B23-905B-4D4CDC2A91CB} = {DBC0AF0B-B9FF-4B23-905B-4D4CDC2A91CB}
+ {0178B127-6269-407D-B112-93877BB62776} = {0178B127-6269-407D-B112-93877BB62776}
+ {8B41752B-5A52-41E4-B7E0-07921C0CC6BF} = {8B41752B-5A52-41E4-B7E0-07921C0CC6BF}
+ {6B231032-3CB5-4EED-9210-810D666A23A0} = {6B231032-3CB5-4EED-9210-810D666A23A0}
+ {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
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "pkgdata", "..\tools\pkgdata\pkgdata.vcproj", "{4C8454FE-81D3-4CA3-9927-29BA96F03DAC}"
+ ProjectSection(ProjectDependencies) = postProject
+ {6B231032-3CB5-4EED-9210-810D666A23A0} = {6B231032-3CB5-4EED-9210-810D666A23A0}
+ {73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D} = {73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D}
+ {A8D36F8D-09E6-4174-91C3-7BEAA9C3F04F} = {A8D36F8D-09E6-4174-91C3-7BEAA9C3F04F}
+ {FDD3C4F2-9805-44EB-9A77-BC1C1C95B547} = {FDD3C4F2-9805-44EB-9A77-BC1C1C95B547}
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "stubdata", "..\stubdata\stubdata.vcproj", "{203EC78A-0531-43F0-A636-285439BDE025}"
+ ProjectSection(ProjectDependencies) = postProject
+ EndProjectSection
+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
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "uconv", "..\extra\uconv\uconv.vcproj", "{DBA4088D-F6F9-4F8F-8820-082A4765C16C}"
+ ProjectSection(ProjectDependencies) = postProject
+ {97521D06-EC47-45D4-8BD0-9E16B3F93B2A} = {97521D06-EC47-45D4-8BD0-9E16B3F93B2A}
+ {0178B127-6269-407D-B112-93877BB62776} = {0178B127-6269-407D-B112-93877BB62776}
+ {73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D} = {73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D}
+ {4C8454FE-81D3-4CA3-9927-29BA96F03DAC} = {4C8454FE-81D3-4CA3-9927-29BA96F03DAC}
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "io", "..\io\io.vcproj", "{C2B04507-2521-4801-BF0D-5FD79D6D518C}"
+ 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
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "gensprep", "..\tools\gensprep\gensprep.vcproj", "{631C23CE-6C1D-4875-88F0-85E0A42B36EA}"
+ 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}"
+ 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}") = "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
+ {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}") = "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}
+ EndProjectSection
+EndProject
+Global
+ GlobalSection(SolutionConfiguration) = preSolution
+ Debug = Debug
+ Release = Release
+ EndGlobalSection
+ GlobalSection(ProjectConfiguration) = postSolution
+ {3D1246AE-1B32-479B-BECA-AEFA97BE2321}.Debug.ActiveCfg = Debug|Win32
+ {3D1246AE-1B32-479B-BECA-AEFA97BE2321}.Debug.Build.0 = Debug|Win32
+ {3D1246AE-1B32-479B-BECA-AEFA97BE2321}.Release.ActiveCfg = Release|Win32
+ {3D1246AE-1B32-479B-BECA-AEFA97BE2321}.Release.Build.0 = Release|Win32
+ {73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D}.Debug.ActiveCfg = Debug|Win32
+ {73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D}.Debug.Build.0 = Debug|Win32
+ {73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D}.Release.ActiveCfg = Release|Win32
+ {73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D}.Release.Build.0 = Release|Win32
+ {ECA6B435-B4FA-4F9F-BF95-F451D078FC47}.Debug.ActiveCfg = Debug|Win32
+ {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
+ {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
+ {D3065ADB-8820-4CC7-9B6C-9510833961A3}.Release.Build.0 = Release|Win32
+ {C2BE5000-7501-4E87-9724-B8D82494FAE6}.Debug.ActiveCfg = Debug|Win32
+ {C2BE5000-7501-4E87-9724-B8D82494FAE6}.Debug.Build.0 = Debug|Win32
+ {C2BE5000-7501-4E87-9724-B8D82494FAE6}.Release.ActiveCfg = Release|Win32
+ {C2BE5000-7501-4E87-9724-B8D82494FAE6}.Release.Build.0 = Release|Win32
+ {FDD3C4F2-9805-44EB-9A77-BC1C1C95B547}.Debug.ActiveCfg = Debug|Win32
+ {FDD3C4F2-9805-44EB-9A77-BC1C1C95B547}.Debug.Build.0 = Debug|Win32
+ {FDD3C4F2-9805-44EB-9A77-BC1C1C95B547}.Release.ActiveCfg = Release|Win32
+ {FDD3C4F2-9805-44EB-9A77-BC1C1C95B547}.Release.Build.0 = Release|Win32
+ {A8D36F8D-09E6-4174-91C3-7BEAA9C3F04F}.Debug.ActiveCfg = Debug|Win32
+ {A8D36F8D-09E6-4174-91C3-7BEAA9C3F04F}.Debug.Build.0 = Debug|Win32
+ {A8D36F8D-09E6-4174-91C3-7BEAA9C3F04F}.Release.ActiveCfg = Release|Win32
+ {A8D36F8D-09E6-4174-91C3-7BEAA9C3F04F}.Release.Build.0 = Release|Win32
+ {8B41752B-5A52-41E4-B7E0-07921C0CC6BF}.Debug.ActiveCfg = Debug|Win32
+ {8B41752B-5A52-41E4-B7E0-07921C0CC6BF}.Debug.Build.0 = Debug|Win32
+ {8B41752B-5A52-41E4-B7E0-07921C0CC6BF}.Release.ActiveCfg = Release|Win32
+ {8B41752B-5A52-41E4-B7E0-07921C0CC6BF}.Release.Build.0 = Release|Win32
+ {F5281B04-A9E0-4680-BBA8-1D7F7D115458}.Debug.ActiveCfg = Debug|Win32
+ {F5281B04-A9E0-4680-BBA8-1D7F7D115458}.Debug.Build.0 = Debug|Win32
+ {F5281B04-A9E0-4680-BBA8-1D7F7D115458}.Release.ActiveCfg = Release|Win32
+ {F5281B04-A9E0-4680-BBA8-1D7F7D115458}.Release.Build.0 = Release|Win32
+ {F5213103-6CBE-46E6-B4CC-2570B6837D86}.Debug.ActiveCfg = Debug|Win32
+ {F5213103-6CBE-46E6-B4CC-2570B6837D86}.Debug.Build.0 = Debug|Win32
+ {F5213103-6CBE-46E6-B4CC-2570B6837D86}.Release.ActiveCfg = Release|Win32
+ {F5213103-6CBE-46E6-B4CC-2570B6837D86}.Release.Build.0 = Release|Win32
+ {DBC0AF0B-B9FF-4B23-905B-4D4CDC2A91CB}.Debug.ActiveCfg = Debug|Win32
+ {DBC0AF0B-B9FF-4B23-905B-4D4CDC2A91CB}.Debug.Build.0 = Debug|Win32
+ {DBC0AF0B-B9FF-4B23-905B-4D4CDC2A91CB}.Release.ActiveCfg = Release|Win32
+ {DBC0AF0B-B9FF-4B23-905B-4D4CDC2A91CB}.Release.Build.0 = Release|Win32
+ {6F744648-D15F-478A-90C6-58E353B5DDB3}.Debug.ActiveCfg = Debug|Win32
+ {6F744648-D15F-478A-90C6-58E353B5DDB3}.Debug.Build.0 = Debug|Win32
+ {6F744648-D15F-478A-90C6-58E353B5DDB3}.Release.ActiveCfg = Release|Win32
+ {6F744648-D15F-478A-90C6-58E353B5DDB3}.Release.Build.0 = Release|Win32
+ {97521D06-EC47-45D4-8BD0-9E16B3F93B2A}.Debug.ActiveCfg = Debug|Win32
+ {97521D06-EC47-45D4-8BD0-9E16B3F93B2A}.Debug.Build.0 = Debug|Win32
+ {97521D06-EC47-45D4-8BD0-9E16B3F93B2A}.Release.ActiveCfg = Release|Win32
+ {97521D06-EC47-45D4-8BD0-9E16B3F93B2A}.Release.Build.0 = Release|Win32
+ {77C78066-746F-4EA6-B3FE-B8C8A4A97891}.Debug.ActiveCfg = Debug|Win32
+ {77C78066-746F-4EA6-B3FE-B8C8A4A97891}.Debug.Build.0 = Debug|Win32
+ {77C78066-746F-4EA6-B3FE-B8C8A4A97891}.Release.ActiveCfg = Release|Win32
+ {77C78066-746F-4EA6-B3FE-B8C8A4A97891}.Release.Build.0 = Release|Win32
+ {86829694-A375-4C58-B4EA-96EF514E3225}.Debug.ActiveCfg = Debug|Win32
+ {86829694-A375-4C58-B4EA-96EF514E3225}.Debug.Build.0 = Debug|Win32
+ {86829694-A375-4C58-B4EA-96EF514E3225}.Release.ActiveCfg = Release|Win32
+ {86829694-A375-4C58-B4EA-96EF514E3225}.Release.Build.0 = Release|Win32
+ {0178B127-6269-407D-B112-93877BB62776}.Debug.ActiveCfg = Debug|Win32
+ {0178B127-6269-407D-B112-93877BB62776}.Debug.Build.0 = Debug|Win32
+ {0178B127-6269-407D-B112-93877BB62776}.Release.ActiveCfg = Release|Win32
+ {0178B127-6269-407D-B112-93877BB62776}.Release.Build.0 = Release|Win32
+ {73632960-B3A6-464D-83A3-4B43365F19B8}.Debug.ActiveCfg = Debug|Win32
+ {73632960-B3A6-464D-83A3-4B43365F19B8}.Debug.Build.0 = Debug|Win32
+ {73632960-B3A6-464D-83A3-4B43365F19B8}.Release.ActiveCfg = Release|Win32
+ {73632960-B3A6-464D-83A3-4B43365F19B8}.Release.Build.0 = Release|Win32
+ {C920062A-0647-4553-A3B2-37C58065664B}.Debug.ActiveCfg = Debug|Win32
+ {C920062A-0647-4553-A3B2-37C58065664B}.Debug.Build.0 = Debug|Win32
+ {C920062A-0647-4553-A3B2-37C58065664B}.Release.ActiveCfg = Release|Win32
+ {C920062A-0647-4553-A3B2-37C58065664B}.Release.Build.0 = Release|Win32
+ {37FC2C7F-1904-4811-8955-2F478830EAD1}.Debug.ActiveCfg = Debug|Win32
+ {37FC2C7F-1904-4811-8955-2F478830EAD1}.Debug.Build.0 = Debug|Win32
+ {37FC2C7F-1904-4811-8955-2F478830EAD1}.Release.ActiveCfg = Release|Win32
+ {37FC2C7F-1904-4811-8955-2F478830EAD1}.Release.Build.0 = Release|Win32
+ {F5AD9738-1A3D-4906-B9C4-A7D9CE33DC2C}.Debug.ActiveCfg = Debug|Win32
+ {F5AD9738-1A3D-4906-B9C4-A7D9CE33DC2C}.Debug.Build.0 = Debug|Win32
+ {F5AD9738-1A3D-4906-B9C4-A7D9CE33DC2C}.Release.ActiveCfg = Release|Win32
+ {F5AD9738-1A3D-4906-B9C4-A7D9CE33DC2C}.Release.Build.0 = Release|Win32
+ {D9DF7F2F-93B7-4810-B5CD-96F4F33C079B}.Debug.ActiveCfg = Debug|Win32
+ {D9DF7F2F-93B7-4810-B5CD-96F4F33C079B}.Debug.Build.0 = Debug|Win32
+ {D9DF7F2F-93B7-4810-B5CD-96F4F33C079B}.Release.ActiveCfg = Release|Win32
+ {D9DF7F2F-93B7-4810-B5CD-96F4F33C079B}.Release.Build.0 = Release|Win32
+ {4C8454FE-81D3-4CA3-9927-29BA96F03DAC}.Debug.ActiveCfg = Debug|Win32
+ {4C8454FE-81D3-4CA3-9927-29BA96F03DAC}.Debug.Build.0 = Debug|Win32
+ {4C8454FE-81D3-4CA3-9927-29BA96F03DAC}.Release.ActiveCfg = Release|Win32
+ {4C8454FE-81D3-4CA3-9927-29BA96F03DAC}.Release.Build.0 = Release|Win32
+ {203EC78A-0531-43F0-A636-285439BDE025}.Debug.ActiveCfg = Debug|Win32
+ {203EC78A-0531-43F0-A636-285439BDE025}.Debug.Build.0 = Debug|Win32
+ {203EC78A-0531-43F0-A636-285439BDE025}.Release.ActiveCfg = Release|Win32
+ {203EC78A-0531-43F0-A636-285439BDE025}.Release.Build.0 = Release|Win32
+ {6B231032-3CB5-4EED-9210-810D666A23A0}.Debug.ActiveCfg = Debug|Win32
+ {6B231032-3CB5-4EED-9210-810D666A23A0}.Debug.Build.0 = Debug|Win32
+ {6B231032-3CB5-4EED-9210-810D666A23A0}.Release.ActiveCfg = Release|Win32
+ {6B231032-3CB5-4EED-9210-810D666A23A0}.Release.Build.0 = Release|Win32
+ {DBA4088D-F6F9-4F8F-8820-082A4765C16C}.Debug.ActiveCfg = Debug|Win32
+ {DBA4088D-F6F9-4F8F-8820-082A4765C16C}.Debug.Build.0 = Debug|Win32
+ {DBA4088D-F6F9-4F8F-8820-082A4765C16C}.Release.ActiveCfg = Release|Win32
+ {DBA4088D-F6F9-4F8F-8820-082A4765C16C}.Release.Build.0 = Release|Win32
+ {C2B04507-2521-4801-BF0D-5FD79D6D518C}.Debug.ActiveCfg = Debug|Win32
+ {C2B04507-2521-4801-BF0D-5FD79D6D518C}.Debug.Build.0 = Debug|Win32
+ {C2B04507-2521-4801-BF0D-5FD79D6D518C}.Release.ActiveCfg = Release|Win32
+ {C2B04507-2521-4801-BF0D-5FD79D6D518C}.Release.Build.0 = Release|Win32
+ {631C23CE-6C1D-4875-88F0-85E0A42B36EA}.Debug.ActiveCfg = Debug|Win32
+ {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
+ {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
+ GlobalSection(ExtensibilityAddIns) = postSolution
+ EndGlobalSection
+EndGlobal
diff --git a/source/common/.cvsignore b/source/common/.cvsignore
new file mode 100644
index 0000000..97c71fc
--- /dev/null
+++ b/source/common/.cvsignore
@@ -0,0 +1,10 @@
+*.d
+libicu*.*
+Debug
+Release
+Makefile
+svchook.mk
+icucfg.h
+*.ao
+*.o
+*.plg
diff --git a/source/common/Makefile.in b/source/common/Makefile.in
new file mode 100644
index 0000000..666373c
--- /dev/null
+++ b/source/common/Makefile.in
@@ -0,0 +1,200 @@
+#******************************************************************************
+#
+# Copyright (C) 1999-2006, International Business Machines
+# Corporation and others. All Rights Reserved.
+#
+#******************************************************************************
+## Makefile.in for ICU - icuuc.so
+## Stephen F. Booth
+
+## Source directory information
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+
+top_builddir = ..
+
+## All the flags and other definitions are included here.
+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) $(SVC_HOOK_INC)
+
+## Target information
+
+TARGET_STUBNAME=$(COMMON_STUBNAME)
+
+ifneq ($(ENABLE_STATIC),)
+TARGET = $(LIBDIR)/$(LIBSICU)$(TARGET_STUBNAME)$(ICULIBSUFFIX).$(A)
+endif
+
+ifneq ($(ENABLE_SHARED),)
+SO_TARGET = $(LIBDIR)/$(LIBICU)$(TARGET_STUBNAME)$(ICULIBSUFFIX).$(SO)
+ALL_SO_TARGETS = $(SO_TARGET) $(MIDDLE_SO_TARGET) $(FINAL_SO_TARGET) $(SHARED_OBJECT)
+
+ifeq ($(ENABLE_SO_VERSION_DATA),1)
+SO_VERSION_DATA = common.res
+endif
+
+ifeq ($(OS390BATCH),1)
+BATCH_TARGET = $(BATCH_COMMON_TARGET)
+BATCH_LIBS = $(BATCH_LIBICUDT) -lm
+endif # OS390BATCH
+
+endif # ENABLE_SHARED
+
+ALL_TARGETS = $(TARGET) $(ALL_SO_TARGETS) $(BATCH_TARGET)
+
+DYNAMICCPPFLAGS = $(SHAREDLIBCPPFLAGS)
+DYNAMICCFLAGS = $(SHAREDLIBCFLAGS)
+DYNAMICCXXFLAGS = $(SHAREDLIBCXXFLAGS)
+
+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 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 \
+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_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 \
+serv.o servnotf.o servls.o servlk.o servlkf.o servrbf.o servslkf.o \
+uidna.o usprep.o punycode.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)
+
+-include Makefile.local
+
+-include $(SVC_HOOK_INC)
+
+
+## List of phony targets
+.PHONY : all all-local install install-local clean clean-local \
+distclean distclean-local install-library install-headers dist \
+dist-local check check-local
+
+## Clear suffix list
+.SUFFIXES :
+
+## List of standard targets
+all: all-local
+install: install-local
+clean: clean-local
+distclean : distclean-local
+dist: dist-local
+check: all check-local
+
+all-local: $(ALL_TARGETS) unicode/platform.h
+
+install-local: install-headers install-library
+
+install-library: all-local
+ $(MKINSTALLDIRS) $(DESTDIR)$(libdir)
+ifneq ($(ENABLE_STATIC),)
+ $(INSTALL-L) $(TARGET) $(DESTDIR)$(libdir)
+endif
+ifneq ($(ENABLE_SHARED),)
+ $(INSTALL-L) $(FINAL_SO_TARGET) $(DESTDIR)$(libdir)
+ifneq ($(FINAL_SO_TARGET),$(SO_TARGET))
+ cd $(DESTDIR)$(libdir) && $(RM) $(notdir $(SO_TARGET)) && ln -s $(notdir $(FINAL_SO_TARGET)) $(notdir $(SO_TARGET))
+ifneq ($(FINAL_SO_TARGET),$(MIDDLE_SO_TARGET))
+ cd $(DESTDIR)$(libdir) && $(RM) $(notdir $(MIDDLE_SO_TARGET)) && ln -s $(notdir $(FINAL_SO_TARGET)) $(notdir $(MIDDLE_SO_TARGET))
+endif
+endif
+endif
+ifneq ($(IMPORT_LIB_EXT),)
+ $(INSTALL-L) $(FINAL_IMPORT_LIB) $(DESTDIR)$(libdir)
+ifneq ($(IMPORT_LIB),$(FINAL_IMPORT_LIB))
+ cd $(DESTDIR)$(libdir) && $(RM) $(notdir $(IMPORT_LIB)) && ln -s $(notdir $(FINAL_IMPORT_LIB)) $(notdir $(IMPORT_LIB))
+endif
+ifneq ($(MIDDLE_IMPORT_LIB),$(FINAL_IMPORT_LIB))
+ cd $(DESTDIR)$(libdir) && $(RM) $(notdir $(MIDDLE_IMPORT_LIB)) && ln -s $(notdir $(FINAL_IMPORT_LIB)) $(notdir $(MIDDLE_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 \
+ echo "$(INSTALL_DATA) $$file $(DESTDIR)$(includedir)/unicode"; \
+ $(INSTALL_DATA) $$file $(DESTDIR)$(includedir)/unicode || exit; \
+ done
+
+dist-local:
+
+clean-local:
+ test -z "$(CLEANFILES)" || $(RMV) $(CLEANFILES)
+ $(RMV) $(OBJECTS) $(STATIC_OBJECTS) $(ALL_TARGETS) $(SO_VERSION_DATA)
+
+distclean-local: clean-local
+ $(RMV) Makefile icucfg.h unicode/platform.h $(SVC_HOOK_INC)
+
+check-local:
+
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status $(SVC_HOOK_INC)
+ cd $(top_builddir) \
+ && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
+
+unicode/platform.h: $(srcdir)/unicode/platform.h.in $(top_builddir)/config.status
+ cd $(top_builddir) \
+ && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
+
+ifneq ($(ENABLE_STATIC),)
+$(TARGET): $(TARGET)($(STATIC_OBJECTS))
+ $(RANLIB) $@
+endif
+
+ifneq ($(ENABLE_SHARED),)
+$(SHARED_OBJECT): $(OBJECTS) $(SO_VERSION_DATA)
+ $(SHLIB.cc) $(LD_SONAME) $(OUTOPT)$@ $^ $(LIBS)
+
+ifeq ($(OS390BATCH),1)
+$(BATCH_TARGET):$(OBJECTS)
+ $(SHLIB.cc) $(LD_SONAME) $(OUTOPT)$@ $^ $(BATCH_LIBS)
+endif # OS390BATCH
+endif # ENABLE_SHARED
+
+ifeq (,$(MAKECMDGOALS))
+-include $(DEPS)
+else
+ifneq ($(patsubst %clean,,$(MAKECMDGOALS)),)
+-include $(DEPS)
+endif
+endif
+
diff --git a/source/common/brkeng.cpp b/source/common/brkeng.cpp
new file mode 100644
index 0000000..577a401
--- /dev/null
+++ b/source/common/brkeng.cpp
@@ -0,0 +1,230 @@
+/**
+ *******************************************************************************
+ * 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 "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;
+ UErrorCode status = U_ZERO_ERROR;
+ umtx_lock(NULL);
+ needsInit = (UBool)(fEngines == NULL);
+ umtx_unlock(NULL);
+
+ if (needsInit) {
+ UStack *engines = new UStack(_deleteEngine, NULL, status);
+ if (U_SUCCESS(status) && engines == NULL) {
+ status = U_MEMORY_ALLOCATION_ERROR;
+ }
+ // TODO: add locale parameter, check "dictionaries" in locale
+ // TODO: generalize once we can figure out how to parameterize engines
+ // instead of having different subclasses. Right now it needs to check
+ // for the key of each particular subclass.
+
+ // 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, "Thai", 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;
+ }
+ const ThaiBreakEngine *thai = new ThaiBreakEngine(dict, status);
+ if (thai == NULL) {
+ delete dict;
+ if (U_SUCCESS(status)) {
+ status = U_MEMORY_ALLOCATION_ERROR;
+ }
+ }
+ if (U_SUCCESS(status)) {
+ engines->push((void *)thai, status);
+ }
+ else {
+ delete thai;
+ }
+ }
+ umtx_lock(NULL);
+ if (fEngines == NULL) {
+ fEngines = engines;
+ engines = NULL;
+ }
+ umtx_unlock(NULL);
+ delete engines;
+ }
+
+ if (fEngines == NULL) {
+ return NULL;
+ }
+ int32_t i = fEngines->size();
+ const LanguageBreakEngine *lbe = NULL;
+ while (--i >= 0) {
+ lbe = (const LanguageBreakEngine *)(fEngines->elementAt(i));
+ if (lbe != NULL && lbe->handles(c, breakType)) {
+ break;
+ }
+ lbe = NULL;
+ }
+ return lbe;
+}
+
+U_NAMESPACE_END
+
+#endif /* #if !UCONFIG_NO_BREAK_ITERATION */
diff --git a/source/common/brkeng.h b/source/common/brkeng.h
new file mode 100644
index 0000000..afc70dc
--- /dev/null
+++ b/source/common/brkeng.h
@@ -0,0 +1,265 @@
+/**
+ *******************************************************************************
+ * 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"
+
+U_NAMESPACE_BEGIN
+
+class UnicodeSet;
+class UStack;
+
+/*******************************************************************
+ * LanguageBreakEngine
+ */
+
+/**
+ * <p>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.</p>
+ *
+ * <p>LanguageBreakEngines should normally be implemented so as to
+ * be shared between threads without locking.</p>
+ */
+class LanguageBreakEngine : public UMemory {
+ public:
+
+ /**
+ * <p>Default constructor.</p>
+ *
+ */
+ LanguageBreakEngine();
+
+ /**
+ * <p>Virtual destructor.</p>
+ */
+ virtual ~LanguageBreakEngine();
+
+ /**
+ * <p>Indicate whether this engine handles a particular character for
+ * a particular kind of break.</p>
+ *
+ * @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;
+
+ /**
+ * <p>Find any breaks within a run in the supplied text.</p>
+ *
+ * @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
+ */
+
+/**
+ * <p>LanguageBreakFactorys find and return a LanguageBreakEngine
+ * that can determine breaks for characters in a specific set, if
+ * such an object can be found.</p>
+ *
+ * <p>If a LanguageBreakFactory is to be shared between threads,
+ * appropriate synchronization must be used; there is none internal
+ * to the factory.</p>
+ *
+ * <p>A LanguageBreakEngine returned by a LanguageBreakFactory can
+ * normally be shared between threads without synchronization, unless
+ * the specific subclass of LanguageBreakFactory indicates otherwise.</p>
+ *
+ * <p>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.</p>
+ */
+class LanguageBreakFactory : public UMemory {
+ public:
+
+ /**
+ * <p>Default constructor.</p>
+ *
+ */
+ LanguageBreakFactory();
+
+ /**
+ * <p>Virtual destructor.</p>
+ */
+ virtual ~LanguageBreakFactory();
+
+ /**
+ * <p>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.</p>
+ *
+ * @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
+ */
+
+/**
+ * <p>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.</p>
+ *
+ * <p>UnhandledEngines may not be shared between threads without
+ * external synchronization.</p>
+ */
+
+class UnhandledEngine : public LanguageBreakEngine {
+ private:
+
+ /**
+ * The sets of characters handled, for each break type
+ * @internal
+ */
+
+ UnicodeSet *fHandled[4];
+
+ public:
+
+ /**
+ * <p>Default constructor.</p>
+ *
+ */
+ UnhandledEngine(UErrorCode &status);
+
+ /**
+ * <p>Virtual destructor.</p>
+ */
+ virtual ~UnhandledEngine();
+
+ /**
+ * <p>Indicate whether this engine handles a particular character for
+ * a particular kind of break.</p>
+ *
+ * @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;
+
+ /**
+ * <p>Find any breaks within a run in the supplied text.</p>
+ *
+ * @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;
+
+ /**
+ * <p>Tell the engine to handle a particular character and break type.</p>
+ *
+ * @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
+ */
+
+/**
+ * <p>ICULanguageBreakFactory is the default LanguageBreakFactory for
+ * ICU. It creates dictionary-based LanguageBreakEngines from dictionary
+ * data in the ICU data file.</p>
+ */
+class ICULanguageBreakFactory : public LanguageBreakFactory {
+ private:
+
+ /**
+ * The stack of break engines created by this factory
+ * @internal
+ */
+
+ UStack *fEngines;
+
+ public:
+
+ /**
+ * <p>Standard constructor.</p>
+ *
+ */
+ ICULanguageBreakFactory(UErrorCode &status);
+
+ /**
+ * <p>Virtual destructor.</p>
+ */
+ virtual ~ICULanguageBreakFactory();
+
+ /**
+ * <p>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.</p>
+ *
+ * @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);
+
+};
+
+U_NAMESPACE_END
+
+ /* BRKENG_H */
+#endif
diff --git a/source/common/brkiter.cpp b/source/common/brkiter.cpp
new file mode 100644
index 0000000..256095b
--- /dev/null
+++ b/source/common/brkiter.cpp
@@ -0,0 +1,455 @@
+/*
+*******************************************************************************
+* Copyright (C) 1997-2006, International Business Machines Corporation and *
+* others. All Rights Reserved. *
+*******************************************************************************
+*
+* File TXTBDRY.CPP
+*
+* Modification History:
+*
+* Date Name Description
+* 02/18/97 aliu Converted from OpenClass. Added DONE.
+* 01/13/2000 helena Added UErrorCode parameter to createXXXInstance methods.
+*****************************************************************************************
+*/
+
+// *****************************************************************************
+// This file was generated from the java source file BreakIterator.java
+// *****************************************************************************
+
+#include "unicode/utypes.h"
+
+#if !UCONFIG_NO_BREAK_ITERATION
+
+#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 "servloc.h"
+#include "locbased.h"
+#include "uresimp.h"
+#include "uassert.h"
+#include "ubrkimpl.h"
+
+// *****************************************************************************
+// class BreakIterator
+// This class implements methods for finding the location of boundaries in text.
+// Instances of BreakIterator maintain a current position and scan over text
+// returning the index of characters where boundaries occur.
+// *****************************************************************************
+
+U_NAMESPACE_BEGIN
+
+// -------------------------------------
+
+BreakIterator*
+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;
+ UResourceBundle brkNameStack;
+ UResourceBundle *brkRules = &brkRulesStack;
+ UResourceBundle *brkName = &brkNameStack;
+ RuleBasedBreakIterator *result = NULL;
+
+ if (U_FAILURE(status))
+ return NULL;
+
+ ures_initStackObject(brkRules);
+ ures_initStackObject(brkName);
+
+ // Get the locale
+ 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)) {
+ brkRules = ures_getByKeyWithFallback(b, "boundaries", brkRules, &status);
+ // Get the string object naming the rules file
+ brkName = ures_getByKeyWithFallback(brkRules, type, brkName, &status);
+ // Get the actual string
+ brkfname = ures_getString(brkName, &size, &status);
+ U_ASSERT((size_t)size<sizeof(fnbuff));
+ if ((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]));
+
+ 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(U_ICUDATA_BRKITR, ext, fnbuff, &status);
+ if (U_FAILURE(status)) {
+ ures_close(b);
+ return NULL;
+ }
+
+ // Create a RuleBasedBreakIterator
+ result = new RuleBasedBreakIterator(file, status);
+
+ // 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);
+
+ if (U_FAILURE(status) && result != NULL) { // Sometimes redundant check, but simple
+ delete result;
+ return NULL;
+ }
+
+ if (result == NULL) {
+ udata_close(file);
+ if (U_SUCCESS(status)) {
+ status = U_MEMORY_ALLOCATION_ERROR;
+ }
+ }
+
+ return result;
+}
+
+// Creates a break iterator for word breaks.
+BreakIterator* U_EXPORT2
+BreakIterator::createWordInstance(const Locale& key, UErrorCode& status)
+{
+ return createInstance(key, UBRK_WORD, status);
+}
+
+// -------------------------------------
+
+// Creates a break iterator for line breaks.
+BreakIterator* U_EXPORT2
+BreakIterator::createLineInstance(const Locale& key, UErrorCode& status)
+{
+ return createInstance(key, UBRK_LINE, status);
+}
+
+// -------------------------------------
+
+// Creates a break iterator for character breaks.
+BreakIterator* U_EXPORT2
+BreakIterator::createCharacterInstance(const Locale& key, UErrorCode& status)
+{
+ return createInstance(key, UBRK_CHARACTER, status);
+}
+
+// -------------------------------------
+
+// Creates a break iterator for sentence breaks.
+BreakIterator* U_EXPORT2
+BreakIterator::createSentenceInstance(const Locale& key, UErrorCode& status)
+{
+ return createInstance(key, UBRK_SENTENCE, status);
+}
+
+// -------------------------------------
+
+// Creates a break iterator for title casing breaks.
+BreakIterator* U_EXPORT2
+BreakIterator::createTitleInstance(const Locale& key, UErrorCode& status)
+{
+ return createInstance(key, UBRK_TITLE, status);
+}
+
+// -------------------------------------
+
+// Gets all the available locales that has localized text boundary data.
+const Locale* U_EXPORT2
+BreakIterator::getAvailableLocales(int32_t& count)
+{
+ return Locale::getAvailableLocales(count);
+}
+
+// -------------------------------------
+// Gets the objectLocale display name in the default locale language.
+UnicodeString& U_EXPORT2
+BreakIterator::getDisplayName(const Locale& objectLocale,
+ UnicodeString& name)
+{
+ return objectLocale.getDisplayName(name);
+}
+
+// -------------------------------------
+// Gets the objectLocale display name in the displayLocale language.
+UnicodeString& U_EXPORT2
+BreakIterator::getDisplayName(const Locale& objectLocale,
+ const Locale& displayLocale,
+ UnicodeString& name)
+{
+ return objectLocale.getDisplayName(displayLocale, name);
+}
+
+// ------------------------------------------
+//
+// Default constructor and destructor
+//
+//-------------------------------------------
+
+BreakIterator::BreakIterator()
+{
+ fBufferClone = FALSE;
+ *validLocale = *actualLocale = 0;
+}
+
+BreakIterator::~BreakIterator()
+{
+}
+
+// ------------------------------------------
+//
+// Registration
+//
+//-------------------------------------------
+#if !UCONFIG_NO_SERVICE
+
+static ICULocaleService* gService = NULL;
+
+// -------------------------------------
+
+class ICUBreakIteratorFactory : public ICUResourceBundleFactory {
+protected:
+ virtual UObject* handleCreate(const Locale& loc, int32_t kind, const ICUService* /*service*/, UErrorCode& status) const {
+ return BreakIterator::makeInstance(loc, kind, status);
+ }
+};
+
+// -------------------------------------
+
+class ICUBreakIteratorService : public ICULocaleService {
+public:
+ ICUBreakIteratorService()
+ : ICULocaleService(UNICODE_STRING("Break Iterator", 14))
+ {
+ UErrorCode status = U_ZERO_ERROR;
+ registerFactory(new ICUBreakIteratorFactory(), status);
+ }
+
+ virtual UObject* cloneInstance(UObject* instance) const {
+ return ((BreakIterator*)instance)->clone();
+ }
+
+ virtual UObject* handleDefault(const ICUServiceKey& key, UnicodeString* /*actualID*/, UErrorCode& status) const {
+ LocaleKey& lkey = (LocaleKey&)key;
+ int32_t kind = lkey.kind();
+ Locale loc;
+ lkey.currentLocale(loc);
+ return BreakIterator::makeInstance(loc, kind, status);
+ }
+
+ virtual UBool isDefault() const {
+ return countFactories() == 1;
+ }
+};
+
+// -------------------------------------
+
+U_NAMESPACE_END
+
+// defined in ucln_cmn.h
+
+/**
+ * Release all static memory held by breakiterator.
+ */
+U_CDECL_BEGIN
+static UBool U_CALLCONV breakiterator_cleanup(void) {
+#if !UCONFIG_NO_SERVICE
+ if (gService) {
+ delete gService;
+ gService = NULL;
+ }
+#endif
+ return TRUE;
+}
+U_CDECL_END
+U_NAMESPACE_BEGIN
+
+static ICULocaleService*
+getService(void)
+{
+ UBool needsInit;
+ umtx_lock(NULL);
+ needsInit = (UBool)(gService == NULL);
+ umtx_unlock(NULL);
+
+ if (needsInit) {
+ ICULocaleService *tService = new ICUBreakIteratorService();
+ umtx_lock(NULL);
+ if (gService == NULL) {
+ gService = tService;
+ tService = NULL;
+ ucln_common_registerCleanup(UCLN_COMMON_BREAKITERATOR, breakiterator_cleanup);
+ }
+ umtx_unlock(NULL);
+ delete tService;
+ }
+ return gService;
+}
+
+// -------------------------------------
+
+static UBool
+hasService(void)
+{
+ Mutex mutex;
+ return gService != NULL;
+}
+
+// -------------------------------------
+
+URegistryKey U_EXPORT2
+BreakIterator::registerInstance(BreakIterator* toAdopt, const Locale& locale, UBreakIteratorType kind, UErrorCode& status)
+{
+ return getService()->registerInstance(toAdopt, locale, kind, status);
+}
+
+// -------------------------------------
+
+UBool U_EXPORT2
+BreakIterator::unregister(URegistryKey key, UErrorCode& status)
+{
+ if (U_SUCCESS(status)) {
+ if (hasService()) {
+ return gService->unregister(key, status);
+ }
+ status = U_ILLEGAL_ARGUMENT_ERROR;
+ }
+ return FALSE;
+}
+
+// -------------------------------------
+
+StringEnumeration* U_EXPORT2
+BreakIterator::getAvailableLocales(void)
+{
+ return getService()->getAvailableLocales();
+}
+#endif /* UCONFIG_NO_SERVICE */
+
+// -------------------------------------
+
+BreakIterator*
+BreakIterator::createInstance(const Locale& loc, int32_t kind, UErrorCode& status)
+{
+ if (U_FAILURE(status)) {
+ return NULL;
+ }
+
+ u_init(&status);
+#if !UCONFIG_NO_SERVICE
+ if (hasService()) {
+ 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
+ // will be populated, but if the handleDefault path is taken
+ // (because nothing is registered that can handle the
+ // requested locale) then the actualLoc comes back empty. In
+ // that case, the returned object already has its actual/valid
+ // locale data populated (by makeInstance, which is what
+ // handleDefault calls), so we don't touch it. YES, A COMMENT
+ // THIS LONG is a sign of bad code -- so the action item is to
+ // revisit this in ICU 3.0 and clean it up/fix it/remove it.
+ if (U_SUCCESS(status) && (result != NULL) && *actualLoc.getName() != 0) {
+ U_LOCALE_BASED(locBased, *result);
+ locBased.setLocaleIDs(actualLoc.getName(), actualLoc.getName());
+ }
+ return result;
+ }
+ else
+#endif
+ {
+ return makeInstance(loc, kind, status);
+ }
+}
+
+// -------------------------------------
+
+BreakIterator*
+BreakIterator::makeInstance(const Locale& loc, int32_t kind, UErrorCode& status)
+{
+
+ if (U_FAILURE(status)) {
+ return NULL;
+ }
+
+ BreakIterator *result = NULL;
+ switch (kind) {
+ case UBRK_CHARACTER:
+ result = BreakIterator::buildInstance(loc, "grapheme", kind, status);
+ break;
+ case UBRK_WORD:
+ result = BreakIterator::buildInstance(loc, "word", kind, status);
+ break;
+ case UBRK_LINE:
+ result = BreakIterator::buildInstance(loc, "line", kind, status);
+ break;
+ case UBRK_SENTENCE:
+ result = BreakIterator::buildInstance(loc, "sentence", kind, status);
+ break;
+ case UBRK_TITLE:
+ result = BreakIterator::buildInstance(loc, "title", kind, status);
+ break;
+ default:
+ status = U_ILLEGAL_ARGUMENT_ERROR;
+ }
+
+ if (U_FAILURE(status)) {
+ return NULL;
+ }
+
+ return result;
+}
+
+Locale
+BreakIterator::getLocale(ULocDataLocaleType type, UErrorCode& status) const {
+ U_LOCALE_BASED(locBased, *this);
+ return locBased.getLocale(type, status);
+}
+
+const char *
+BreakIterator::getLocaleID(ULocDataLocaleType type, UErrorCode& status) const {
+ U_LOCALE_BASED(locBased, *this);
+ return locBased.getLocaleID(type, status);
+}
+
+U_NAMESPACE_END
+
+#endif /* #if !UCONFIG_NO_BREAK_ITERATION */
+
+//eof
diff --git a/source/common/caniter.cpp b/source/common/caniter.cpp
new file mode 100644
index 0000000..04d48ba
--- /dev/null
+++ b/source/common/caniter.cpp
@@ -0,0 +1,611 @@
+/*
+ *****************************************************************************
+ * Copyright (C) 1996-2006, International Business Machines Corporation and *
+ * others. All Rights Reserved. *
+ *****************************************************************************
+ */
+
+#include "unicode/utypes.h"
+
+#if !UCONFIG_NO_NORMALIZATION
+
+#include "unicode/uset.h"
+#include "unicode/ustring.h"
+#include "hash.h"
+#include "unormimp.h"
+#include "unicode/caniter.h"
+#include "unicode/normlzr.h"
+#include "unicode/uchar.h"
+#include "cmemory.h"
+
+/**
+ * This class allows one to iterate through all the strings that are canonically equivalent to a given
+ * string. For example, here are some sample results:
+Results for: {LATIN CAPITAL LETTER A WITH RING ABOVE}{LATIN SMALL LETTER D}{COMBINING DOT ABOVE}{COMBINING CEDILLA}
+1: \u0041\u030A\u0064\u0307\u0327
+ = {LATIN CAPITAL LETTER A}{COMBINING RING ABOVE}{LATIN SMALL LETTER D}{COMBINING DOT ABOVE}{COMBINING CEDILLA}
+2: \u0041\u030A\u0064\u0327\u0307
+ = {LATIN CAPITAL LETTER A}{COMBINING RING ABOVE}{LATIN SMALL LETTER D}{COMBINING CEDILLA}{COMBINING DOT ABOVE}
+3: \u0041\u030A\u1E0B\u0327
+ = {LATIN CAPITAL LETTER A}{COMBINING RING ABOVE}{LATIN SMALL LETTER D WITH DOT ABOVE}{COMBINING CEDILLA}
+4: \u0041\u030A\u1E11\u0307
+ = {LATIN CAPITAL LETTER A}{COMBINING RING ABOVE}{LATIN SMALL LETTER D WITH CEDILLA}{COMBINING DOT ABOVE}
+5: \u00C5\u0064\u0307\u0327
+ = {LATIN CAPITAL LETTER A WITH RING ABOVE}{LATIN SMALL LETTER D}{COMBINING DOT ABOVE}{COMBINING CEDILLA}
+6: \u00C5\u0064\u0327\u0307
+ = {LATIN CAPITAL LETTER A WITH RING ABOVE}{LATIN SMALL LETTER D}{COMBINING CEDILLA}{COMBINING DOT ABOVE}
+7: \u00C5\u1E0B\u0327
+ = {LATIN CAPITAL LETTER A WITH RING ABOVE}{LATIN SMALL LETTER D WITH DOT ABOVE}{COMBINING CEDILLA}
+8: \u00C5\u1E11\u0307
+ = {LATIN CAPITAL LETTER A WITH RING ABOVE}{LATIN SMALL LETTER D WITH CEDILLA}{COMBINING DOT ABOVE}
+9: \u212B\u0064\u0307\u0327
+ = {ANGSTROM SIGN}{LATIN SMALL LETTER D}{COMBINING DOT ABOVE}{COMBINING CEDILLA}
+10: \u212B\u0064\u0327\u0307
+ = {ANGSTROM SIGN}{LATIN SMALL LETTER D}{COMBINING CEDILLA}{COMBINING DOT ABOVE}
+11: \u212B\u1E0B\u0327
+ = {ANGSTROM SIGN}{LATIN SMALL LETTER D WITH DOT ABOVE}{COMBINING CEDILLA}
+12: \u212B\u1E11\u0307
+ = {ANGSTROM SIGN}{LATIN SMALL LETTER D WITH CEDILLA}{COMBINING DOT ABOVE}
+ *<br>Note: the code is intended for use with small strings, and is not suitable for larger ones,
+ * since it has not been optimized for that situation.
+ *@author M. Davis
+ *@draft
+ */
+
+// public
+
+U_NAMESPACE_BEGIN
+
+// TODO: add boilerplate methods.
+
+UOBJECT_DEFINE_RTTI_IMPLEMENTATION(CanonicalIterator)
+
+/**
+ *@param source string to get results for
+ */
+CanonicalIterator::CanonicalIterator(const UnicodeString &sourceStr, UErrorCode &status) :
+ pieces(NULL),
+ pieces_length(0),
+ pieces_lengths(NULL),
+ current(NULL),
+ current_length(0)
+{
+ if(U_SUCCESS(status)) {
+ setSource(sourceStr, status);
+ }
+}
+
+CanonicalIterator::~CanonicalIterator() {
+ cleanPieces();
+}
+
+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;
+ pieces_length = 0;
+ }
+ if(pieces_lengths != NULL) {
+ uprv_free(pieces_lengths);
+ pieces_lengths = NULL;
+ }
+ if(current != NULL) {
+ uprv_free(current);
+ current = NULL;
+ current_length = 0;
+ }
+}
+
+/**
+ *@return gets the source: NOTE: it is the NFD form of source
+ */
+UnicodeString CanonicalIterator::getSource() {
+ return source;
+}
+
+/**
+ * Resets the iterator so that one can start again from the beginning.
+ */
+void CanonicalIterator::reset() {
+ done = FALSE;
+ for (int i = 0; i < current_length; ++i) {
+ current[i] = 0;
+ }
+}
+
+/**
+ *@return the next string that is canonically equivalent. The value null is returned when
+ * the iteration is done.
+ */
+UnicodeString CanonicalIterator::next() {
+ int32_t i = 0;
+
+ if (done) {
+ buffer.setToBogus();
+ return buffer;
+ }
+
+ // delete old contents
+ buffer.remove();
+
+ // construct return value
+
+ for (i = 0; i < pieces_length; ++i) {
+ buffer.append(pieces[i][current[i]]);
+ }
+ //String result = buffer.toString(); // not needed
+
+ // find next value for next time
+
+ for (i = current_length - 1; ; --i) {
+ if (i < 0) {
+ done = TRUE;
+ break;
+ }
+ current[i]++;
+ if (current[i] < pieces_lengths[i]) break; // got sequence
+ current[i] = 0;
+ }
+ return buffer;
+}
+
+/**
+ *@param set the source string to iterate against. This allows the same iterator to be used
+ * 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;
+ }
+ done = FALSE;
+
+ cleanPieces();
+
+ // catch degenerate case
+ if (newSource.length() == 0) {
+ pieces = (UnicodeString **)uprv_malloc(sizeof(UnicodeString *));
+ pieces_lengths = (int32_t*)uprv_malloc(1 * sizeof(int32_t));
+ pieces_length = 1;
+ current = (int32_t*)uprv_malloc(1 * sizeof(int32_t));
+ current_length = 1;
+ if (pieces == NULL || pieces_lengths == NULL || current == NULL) {
+ status = U_MEMORY_ALLOCATION_ERROR;
+ goto CleanPartialInitialization;
+ }
+ current[0] = 0;
+ pieces[0] = new UnicodeString[1];
+ pieces_lengths[0] = 1;
+ if (pieces[0] == 0) {
+ status = U_MEMORY_ALLOCATION_ERROR;
+ goto CleanPartialInitialization;
+ }
+ return;
+ }
+
+
+ list = new UnicodeString[source.length()];
+ if (list == 0) {
+ status = U_MEMORY_ALLOCATION_ERROR;
+ goto CleanPartialInitialization;
+ }
+
+ // i should initialy be the number of code units at the
+ // start of the string
+ i = UTF16_CHAR_LENGTH(source.char32At(0));
+ //int32_t i = 1;
+ // find the segments
+ // This code iterates through the source string and
+ // extracts segments that end up on a codepoint that
+ // doesn't start any decompositions. (Analysis is done
+ // on the NFD form - see above).
+ for (; i < source.length(); i += UTF16_CHAR_LENGTH(cp)) {
+ cp = source.char32At(i);
+ if (unorm_isCanonSafeStart(cp)) {
+ source.extract(start, i-start, list[list_length++]); // add up to i
+ start = i;
+ }
+ }
+ source.extract(start, i-start, list[list_length++]); // add last one
+
+
+ // allocate the arrays, and find the strings that are CE to each segment
+ pieces = (UnicodeString **)uprv_malloc(list_length * sizeof(UnicodeString *));
+ pieces_length = list_length;
+ pieces_lengths = (int32_t*)uprv_malloc(list_length * sizeof(int32_t));
+ current = (int32_t*)uprv_malloc(list_length * sizeof(int32_t));
+ current_length = list_length;
+ if (pieces == NULL || pieces_lengths == NULL || current == NULL) {
+ status = U_MEMORY_ALLOCATION_ERROR;
+ goto CleanPartialInitialization;
+ }
+
+ for (i = 0; i < current_length; i++) {
+ current[i] = 0;
+ }
+ // for each segment, get all the combinations that can produce
+ // it after NFD normalization
+ for (i = 0; i < pieces_length; ++i) {
+ //if (PROGRESS) printf("SEGMENT\n");
+ pieces[i] = getEquivalents(list[i], pieces_lengths[i], status);
+ }
+
+ delete[] list;
+ return;
+// Common section to cleanup all local variables and reset object variables.
+CleanPartialInitialization:
+ if (list != NULL) {
+ delete[] list;
+ }
+ cleanPieces();
+}
+
+/**
+ * Dumb recursive implementation of permutation.
+ * TODO: optimize
+ * @param source the string to find permutations for
+ * @return the results in a set.
+ */
+void U_EXPORT2 CanonicalIterator::permute(UnicodeString &source, UBool skipZeros, Hashtable *result, UErrorCode &status) {
+ if(U_FAILURE(status)) {
+ return;
+ }
+ //if (PROGRESS) printf("Permute: %s\n", UToS(Tr(source)));
+ int32_t i = 0;
+
+ // optimization:
+ // 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;
+ }
+
+ // otherwise iterate through the string, and recursively permute all the other characters
+ UChar32 cp;
+ Hashtable subpermute(status);
+ if(U_FAILURE(status)) {
+ return;
+ }
+ subpermute.setValueDeleter(uhash_deleteUnicodeString);
+
+ for (i = 0; i < source.length(); i += UTF16_CHAR_LENGTH(cp)) {
+ cp = source.char32At(i);
+ const UHashElement *ne = NULL;
+ int32_t el = -1;
+ UnicodeString subPermuteString = source;
+
+ // optimization:
+ // if the character is canonical combining class zero,
+ // don't permute it
+ if (skipZeros && i != 0 && u_getCombiningClass(cp) == 0) {
+ //System.out.println("Skipping " + Utility.hex(UTF16.valueOf(source, i)));
+ continue;
+ }
+
+ 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);
+ /* Test for buffer overflows */
+ if(U_FAILURE(status)) {
+ 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);
+ 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;
+ 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);
+ }
+ }
+ //return result;
+}
+
+// privates
+
+// 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) {
+ Hashtable result(status);
+ Hashtable permutations(status);
+ Hashtable basic(status);
+ if (U_FAILURE(status)) {
+ return 0;
+ }
+ result.setValueDeleter(uhash_deleteUnicodeString);
+ permutations.setValueDeleter(uhash_deleteUnicodeString);
+ basic.setValueDeleter(uhash_deleteUnicodeString);
+
+ UChar USeg[256];
+ int32_t segLen = segment.extract(USeg, 256, 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.
+
+ const UHashElement *ne = NULL;
+ int32_t el = -1;
+ //Iterator it = basic.iterator();
+ 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);
+ const UHashElement *ne2 = NULL;
+ int32_t el2 = -1;
+ //Iterator it2 = permutations.iterator();
+ ne2 = permutations.nextElement(el2);
+ //while (it2.hasNext())
+ while (ne2 != NULL) {
+ //String possible = (String) it2.next();
+ //UnicodeString *possible = new UnicodeString(*((UnicodeString *)(ne2->value.pointer)));
+ UnicodeString possible(*((UnicodeString *)(ne2->value.pointer)));
+ UnicodeString attempt;
+ Normalizer::normalize(possible, UNORM_NFD, 0, attempt, status);
+
+ // TODO: check if operator == is semanticaly the same as attempt.equals(segment)
+ 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);
+ } else {
+ //if (PROGRESS) printf("-Skipping Permutation: %s\n", UToS(Tr(*possible)));
+ }
+
+ ne2 = permutations.nextElement(el2);
+ }
+ ne = basic.nextElement(el);
+ }
+
+ /* Test for buffer overflows */
+ if(U_FAILURE(status)) {
+ 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];
+ 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);
+ while(ne != NULL) {
+ finalResult[result_len++] = *((UnicodeString *)(ne->value.pointer));
+ ne = result.nextElement(el);
+ }
+
+
+ return finalResult;
+}
+
+Hashtable *CanonicalIterator::getEquivalents2(Hashtable *fillinResult, const UChar *segment, int32_t segLen, UErrorCode &status) {
+
+ if (U_FAILURE(status)) {
+ return NULL;
+ }
+
+ //if (PROGRESS) printf("Adding: %s\n", UToS(Tr(segment)));
+
+ UnicodeString toPut(segment, segLen);
+
+ fillinResult->put(toPut, new UnicodeString(toPut), status);
+
+ USerializedSet starts;
+
+ // cycle through all the characters
+ UChar32 cp, end = 0;
+ int32_t i = 0, j;
+ for (i = 0; i < segLen; i += UTF16_CHAR_LENGTH(cp)) {
+ // 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;
+ }
+ // if so, see which decompositions match
+ for(j = 0, cp = end+1; cp <= end || uset_getSerializedRange(&starts, j++, &cp, &end); ++cp) {
+ 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;
+
+ int32_t el = -1;
+ 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;
+ return NULL;
+ }
+ *toAdd += item;
+ fillinResult->put(*toAdd, toAdd, status);
+
+ //if (PROGRESS) printf("Adding: %s\n", UToS(Tr(*toAdd)));
+
+ ne = remainder.nextElement(el);
+ }
+ }
+ }
+
+ /* Test for buffer overflows */
+ if(U_FAILURE(status)) {
+ return NULL;
+ }
+ return fillinResult;
+}
+
+/**
+ * See if the decomposition of cp2 is at segment starting at segmentPos
+ * (with canonical rearrangment!)
+ * If so, take the remainder, and return the equivalents
+ */
+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];
+
+ int32_t inputLen = 0, decompLen;
+ UChar stackBuffer[4];
+ const UChar *decomp;
+
+ U16_APPEND_UNSAFE(temp, inputLen, comp);
+ decomp = unorm_getCanonicalDecomposition(comp, stackBuffer, &decompLen);
+ if(decomp == NULL) {
+ /* copy temp */
+ stackBuffer[0] = temp[0];
+ if(inputLen > 1) {
+ stackBuffer[1] = temp[1];
+ }
+ decomp = stackBuffer;
+ decompLen = inputLen;
+ }
+
+ UChar *buff = temp+inputLen;
+
+ // See if it matches the start of segment (at segmentPos)
+ UBool ok = FALSE;
+ UChar32 cp;
+ int32_t decompPos = 0;
+ UChar32 decompCp;
+ UTF_NEXT_CHAR(decomp, decompPos, decompLen, decompCp);
+
+ int32_t i;
+ UBool overflow = FALSE;
+
+ i = segmentPos;
+ while(i < segLen) {
+ UTF_NEXT_CHAR(segment, i, segLen, cp);
+
+ if (cp == decompCp) { // if equal, eat another cp from decomp
+
+ //if (PROGRESS) printf(" matches: %s\n", UToS(Tr(UnicodeString(cp))));
+
+ if (decompPos == decompLen) { // done, have all decomp characters!
+ //u_strcat(buff+bufLen, segment+i);
+ uprv_memcpy(buff+bufLen, segment+i, (segLen-i)*sizeof(UChar));
+ bufLen+=segLen-i;
+
+ ok = TRUE;
+ break;
+ }
+ UTF_NEXT_CHAR(decomp, decompPos, decompLen, decompCp);
+ } else {
+ //if (PROGRESS) printf(" buffer: %s\n", UToS(Tr(UnicodeString(cp))));
+
+ // brute force approach
+
+ U16_APPEND(buff, bufLen, bufSize, cp, overflow);
+
+ if(overflow) {
+ /*
+ * ### TODO handle buffer overflow
+ * The buffer is large, but an overflow may still happen with
+ * unusual input (many combining marks?).
+ * Reallocate buffer and continue.
+ * markus 20020929
+ */
+
+ overflow = FALSE;
+ }
+
+ /* TODO: optimize
+ // since we know that the classes are monotonically increasing, after zero
+ // e.g. 0 5 7 9 0 3
+ // we can do an optimization
+ // there are only a few cases that work: zero, less, same, greater
+ // if both classes are the same, we fail
+ // if the decomp class < the segment class, we fail
+
+ segClass = getClass(cp);
+ if (decompClass <= segClass) return null;
+ */
+ }
+ }
+ if (!ok)
+ return NULL; // we failed, characters left over
+
+ //if (PROGRESS) printf("Matches\n");
+
+ if (bufLen == 0) {
+ fillinResult->put(UnicodeString(), new UnicodeString(), status);
+ return fillinResult; // succeed, but no remainder
+ }
+
+ // brute force approach
+ // check to make sure result is canonically equivalent
+ int32_t tempLen = inputLen + bufLen;
+
+ UChar trial[bufSize];
+ unorm_decompose(trial, bufSize, temp, tempLen, FALSE, 0, &status);
+
+ if(U_FAILURE(status)
+ || uprv_memcmp(segment+segmentPos, trial, (segLen - segmentPos)*sizeof(UChar)) != 0)
+ {
+ return NULL;
+ }
+
+ return getEquivalents2(fillinResult, buff, bufLen, status);
+}
+
+U_NAMESPACE_END
+
+#endif /* #if !UCONFIG_NO_NORMALIZATION */
diff --git a/source/common/chariter.cpp b/source/common/chariter.cpp
new file mode 100644
index 0000000..a598bd6
--- /dev/null
+++ b/source/common/chariter.cpp
@@ -0,0 +1,96 @@
+/*
+**********************************************************************
+* Copyright (C) 1999-2004, International Business Machines
+* Corporation and others. All Rights Reserved.
+**********************************************************************
+*/
+
+#include "unicode/chariter.h"
+
+U_NAMESPACE_BEGIN
+
+ForwardCharacterIterator::~ForwardCharacterIterator() {}
+ForwardCharacterIterator::ForwardCharacterIterator()
+: UObject()
+{}
+ForwardCharacterIterator::ForwardCharacterIterator(const ForwardCharacterIterator &other)
+: UObject(other)
+{}
+
+
+CharacterIterator::CharacterIterator()
+: textLength(0), pos(0), begin(0), end(0) {
+}
+
+CharacterIterator::CharacterIterator(int32_t length)
+: textLength(length), pos(0), begin(0), end(length) {
+ if(textLength < 0) {
+ textLength = end = 0;
+ }
+}
+
+CharacterIterator::CharacterIterator(int32_t length, int32_t position)
+: textLength(length), pos(position), begin(0), end(length) {
+ if(textLength < 0) {
+ textLength = end = 0;
+ }
+ if(pos < 0) {
+ pos = 0;
+ } else if(pos > end) {
+ pos = end;
+ }
+}
+
+CharacterIterator::CharacterIterator(int32_t length, int32_t textBegin, int32_t textEnd, int32_t position)
+: textLength(length), pos(position), begin(textBegin), end(textEnd) {
+ if(textLength < 0) {
+ textLength = 0;
+ }
+ if(begin < 0) {
+ begin = 0;
+ } else if(begin > textLength) {
+ begin = textLength;
+ }
+ if(end < begin) {
+ end = begin;
+ } else if(end > textLength) {
+ end = textLength;
+ }
+ if(pos < begin) {
+ pos = begin;
+ } else if(pos > end) {
+ pos = end;
+ }
+}
+
+CharacterIterator::CharacterIterator(const CharacterIterator &that) :
+ForwardCharacterIterator(that),
+textLength(that.textLength), pos(that.pos), begin(that.begin), end(that.end)
+{
+}
+
+CharacterIterator &
+CharacterIterator::operator=(const CharacterIterator &that) {
+ ForwardCharacterIterator::operator=(that);
+ textLength = that.textLength;
+ pos = that.pos;
+ begin = that.begin;
+ end = that.end;
+ return *this;
+}
+
+// implementing first[32]PostInc() directly in a subclass should be faster
+// but these implementations make subclassing a little easier
+UChar
+CharacterIterator::firstPostInc(void) {
+ setToStart();
+ return nextPostInc();
+}
+
+UChar32
+CharacterIterator::first32PostInc(void) {
+ setToStart();
+ return next32PostInc();
+}
+
+U_NAMESPACE_END
diff --git a/source/common/charstr.h b/source/common/charstr.h
new file mode 100644
index 0000000..3bb11cb
--- /dev/null
+++ b/source/common/charstr.h
@@ -0,0 +1,88 @@
+/*
+**********************************************************************
+* Copyright (c) 2001-2004, International Business Machines
+* Corporation and others. All Rights Reserved.
+**********************************************************************
+* Date Name Description
+* 11/19/2001 aliu Creation.
+**********************************************************************
+*/
+
+#ifndef CHARSTRING_H
+#define CHARSTRING_H
+
+#include "unicode/utypes.h"
+#include "unicode/uobject.h"
+#include "unicode/unistr.h"
+#include "cmemory.h"
+
+//--------------------------------------------------------------------
+// class CharString
+//
+// This is a tiny wrapper class that is used internally to make a
+// UnicodeString look like a const char*. It can be allocated on the
+// stack. It only creates a heap buffer if it needs to.
+//--------------------------------------------------------------------
+
+U_NAMESPACE_BEGIN
+
+class U_COMMON_API CharString : public UMemory {
+public:
+
+#if !UCONFIG_NO_CONVERSION
+ // Constructor
+ // @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);
+#endif
+
+ inline CharString(const UnicodeString& str);
+ inline ~CharString();
+ inline operator const char*() const { return ptr; }
+
+private:
+ char buf[128];
+ char* ptr;
+
+ CharString(const CharString &other); // forbid copying of this class
+ CharString &operator=(const CharString &other); // forbid copying of this class
+};
+
+#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;
+ len = str.extract(0, 0x7FFFFFFF, buf ,sizeof(buf)-1, codepage);
+ if (len >= (int32_t)(sizeof(buf)-1)) {
+ ptr = (char *)uprv_malloc(len+1);
+ str.extract(0, 0x7FFFFFFF, ptr, len+1, codepage);
+ }
+}*/
+
+#endif
+
+inline CharString::CharString(const UnicodeString& str) {
+ int32_t len;
+ ptr = buf;
+ len = str.extract(0, 0x7FFFFFFF, buf, (int32_t)(sizeof(buf)-1), US_INV);
+ if (len >= (int32_t)(sizeof(buf)-1)) {
+ ptr = (char *)uprv_malloc(len+1);
+ str.extract(0, 0x7FFFFFFF, ptr, len+1, US_INV);
+ }
+}
+
+inline CharString::~CharString() {
+ if (ptr != buf) {
+ uprv_free(ptr);
+ }
+}
+
+U_NAMESPACE_END
+
+#endif
+//eof
diff --git a/source/common/cmemory.c b/source/common/cmemory.c
new file mode 100644
index 0000000..0f93f36
--- /dev/null
+++ b/source/common/cmemory.c
@@ -0,0 +1,124 @@
+/*
+******************************************************************************
+*
+* Copyright (C) 2002-2003, International Business Machines
+* Corporation and others. All Rights Reserved.
+*
+******************************************************************************
+*
+* File cmemory.c ICU Heap allocation.
+* All ICU heap allocation, both for C and C++ new of ICU
+* class types, comes through these functions.
+*
+* If you have a need to replace ICU allocation, this is the
+* place to do it.
+*
+* Note that uprv_malloc(0) returns a non-NULL pointer, and
+* that a subsequent free of that pointer value is a NOP.
+*
+******************************************************************************
+*/
+#include "unicode/uclean.h"
+#include "cmemory.h"
+#include <stdlib.h>
+
+/* uprv_malloc(0) returns a pointer to this read-only data. */
+static const int32_t zeroMem[] = {0, 0, 0, 0, 0, 0};
+
+/* Function Pointers for user-supplied heap functions */
+static const void *pContext;
+static UMemAllocFn *pAlloc;
+static UMemReallocFn *pRealloc;
+static UMemFreeFn *pFree;
+
+/* Flag indicating whether any heap allocations have happened.
+ * Used to prevent changing out the heap functions after allocations have been made */
+static UBool gHeapInUse;
+
+U_CAPI void * U_EXPORT2
+uprv_malloc(size_t s) {
+ if (s > 0) {
+ gHeapInUse = TRUE;
+ if (pAlloc) {
+ return (*pAlloc)(pContext, s);
+ } else {
+ return malloc(s);
+ }
+ } else {
+ return (void *)zeroMem;
+ }
+}
+
+U_CAPI void * U_EXPORT2
+uprv_realloc(void * buffer, size_t size) {
+ if (buffer == zeroMem) {
+ return uprv_malloc(size);
+ } else if (size == 0) {
+ if (pFree) {
+ (*pFree)(pContext, buffer);
+ } else {
+ free(buffer);
+ }
+ return (void *)zeroMem;
+ } else {
+ gHeapInUse = TRUE;
+ if (pRealloc) {
+ return (*pRealloc)(pContext, buffer, size);
+ } else {
+ return realloc(buffer, size);
+ }
+ }
+}
+
+U_CAPI void U_EXPORT2
+uprv_free(void *buffer) {
+ if (buffer != zeroMem) {
+ if (pFree) {
+ (*pFree)(pContext, buffer);
+ } else {
+ free(buffer);
+ }
+ }
+}
+
+U_CAPI void U_EXPORT2
+u_setMemoryFunctions(const void *context, UMemAllocFn *a, UMemReallocFn *r, UMemFreeFn *f, UErrorCode *status)
+{
+ if (U_FAILURE(*status)) {
+ return;
+ }
+ if (a==NULL || r==NULL || f==NULL) {
+ *status = U_ILLEGAL_ARGUMENT_ERROR;
+ return;
+ }
+ if (gHeapInUse) {
+ *status = U_INVALID_STATE_ERROR;
+ return;
+ }
+ pContext = context;
+ pAlloc = a;
+ pRealloc = r;
+ pFree = f;
+}
+
+
+U_CFUNC UBool cmemory_cleanup(void) {
+ pContext = NULL;
+ pAlloc = NULL;
+ pRealloc = NULL;
+ pFree = NULL;
+ gHeapInUse = FALSE;
+ return TRUE;
+}
+
+
+/*
+ * gHeapInUse
+ * Return True if ICU has allocated any memory.
+ * Used by u_SetMutexFunctions() and similar to verify that ICU has not
+ * been used, that it is in a pristine initial state.
+ */
+U_CFUNC UBool cmemory_inUse() {
+ return gHeapInUse;
+}
+
diff --git a/source/common/cmemory.h b/source/common/cmemory.h
new file mode 100644
index 0000000..da65d7c
--- /dev/null
+++ b/source/common/cmemory.h
@@ -0,0 +1,82 @@
+/*
+******************************************************************************
+*
+* Copyright (C) 1997-2003, International Business Machines
+* Corporation and others. All Rights Reserved.
+*
+******************************************************************************
+*
+* File CMEMORY.H
+*
+* Contains stdlib.h/string.h memory functions
+*
+* @author Bertrand A. Damiba
+*
+* Modification History:
+*
+* Date Name Description
+* 6/20/98 Bertrand Created.
+* 05/03/99 stephen Changed from functions to macros.
+*
+******************************************************************************
+*/
+
+#ifndef CMEMORY_H
+#define CMEMORY_H
+
+#include "unicode/utypes.h"
+#include <string.h>
+
+
+#define uprv_memcpy(dst, src, size) U_STANDARD_CPP_NAMESPACE memcpy(dst, src, size)
+#define uprv_memmove(dst, src, size) U_STANDARD_CPP_NAMESPACE memmove(dst, src, size)
+#define uprv_memset(buffer, mark, size) U_STANDARD_CPP_NAMESPACE memset(buffer, mark, size)
+#define uprv_memcmp(buffer1, buffer2, size) U_STANDARD_CPP_NAMESPACE memcmp(buffer1, buffer2,size)
+
+U_CAPI void * U_EXPORT2
+uprv_malloc(size_t s);
+
+U_CAPI void * U_EXPORT2
+uprv_realloc(void *mem, size_t size);
+
+U_CAPI void U_EXPORT2
+uprv_free(void *mem);
+
+/**
+ * This should align the memory properly on any machine.
+ * This is very useful for the safeClone functions.
+ */
+typedef union {
+ long t1;
+ double t2;
+ void *t3;
+} UAlignedMemory;
+
+/**
+ * Get the amount of bytes that a pointer is off by from
+ * the previous aligned pointer
+ */
+#define U_ALIGNMENT_OFFSET(ptr) (((size_t)ptr) & (sizeof(UAlignedMemory) - 1))
+
+/**
+ * Get the amount of bytes to add to a pointer
+ * in order to get the next aligned address
+ */
+#define U_ALIGNMENT_OFFSET_UP(ptr) (sizeof(UAlignedMemory) - U_ALIGNMENT_OFFSET(ptr))
+
+/**
+ * Indicate whether the ICU allocation functions have been used.
+ * This is used to determine whether ICU is in an initial, unused state.
+ */
+U_CFUNC UBool
+cmemory_inUse(void);
+
+/**
+ * Heap clean up function, called from u_cleanup()
+ * Clears any user heap functions from u_setMemoryFunctions()
+ * Does NOT deallocate any remaining allocated memory.
+ */
+U_CFUNC UBool
+cmemory_cleanup(void);
+
+#endif
diff --git a/source/common/common.rc b/source/common/common.rc
new file mode 100644
index 0000000..331e542
--- /dev/null
+++ b/source/common/common.rc
@@ -0,0 +1,108 @@
+// 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-2005 International Business Machines
+// Corporation and others. All Rights Reserved.
+//
+#include "msvcres.h"
+
+#define APSTUDIO_READONLY_SYMBOLS
+/////////////////////////////////////////////////////////////////////////////
+//
+// Generated from the TEXTINCLUDE 2 resource.
+//
+#include <winresrc.h>
+/////////////////////////////////////////////////////////////////////////////
+#undef APSTUDIO_READONLY_SYMBOLS
+
+/////////////////////////////////////////////////////////////////////////////
+//
+
+LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
+#pragma code_page(1252)
+
+#ifdef APSTUDIO_INVOKED
+/////////////////////////////////////////////////////////////////////////////
+//
+// TEXTINCLUDE
+//
+
+1 TEXTINCLUDE
+BEGIN
+ "msvcres.h\0"
+END
+
+2 TEXTINCLUDE
+BEGIN
+ "#include <winresrc.h>\0"
+END
+
+3 TEXTINCLUDE
+BEGIN
+ "\r\n"
+ "\0"
+END
+
+#endif // APSTUDIO_INVOKED
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Version
+//
+#define STR(s) #s
+#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
+ FILEFLAGSMASK 0x3fL
+#ifdef _DEBUG
+ FILEFLAGS 0x1L
+#else
+ FILEFLAGS 0x0L
+#endif
+ FILEOS VOS__WINDOWS32
+ FILETYPE VFT_DLL
+ FILESUBTYPE 0x0L
+BEGIN
+ BLOCK "StringFileInfo"
+ BEGIN
+ BLOCK "00000000"
+ BEGIN
+ 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 "LegalCopyright", U_COPYRIGHT_STRING "\0"
+#ifdef _DEBUG
+ VALUE "OriginalFilename", "icuuc" U_ICU_VERSION_SHORT "d.dll\0")
+#else
+ VALUE "OriginalFilename", "icuuc" U_ICU_VERSION_SHORT ".dll\0")
+#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 "SpecialBuild", "\0"
+ END
+ END
+ BLOCK "VarFileInfo"
+ BEGIN
+ VALUE "Translation", 0x000, 0000
+ END
+END
+
+/////////////////////////////////////////////////////////////////////////////
+
+
+
+#ifndef APSTUDIO_INVOKED
+/////////////////////////////////////////////////////////////////////////////
+//
+// Generated from the TEXTINCLUDE 3 resource.
+//
+
+
+/////////////////////////////////////////////////////////////////////////////
+#endif // not APSTUDIO_INVOKED
+
diff --git a/source/common/common.vcproj b/source/common/common.vcproj
new file mode 100644
index 0000000..a30a33c
--- /dev/null
+++ b/source/common/common.vcproj
@@ -0,0 +1,2098 @@
+<?xml version="1.0" encoding="Windows-1252"?>
+<VisualStudioProject
+ ProjectType="Visual C++"
+ Version="7.10"
+ Name="common"
+ ProjectGUID="{F0C3266C-B49D-4097-BDBD-EEB592017672}"
+ SccProjectName=""
+ SccLocalPath="">
+ <Platforms>
+ <Platform
+ Name="Win32"/>
+ </Platforms>
+ <Configurations>
+ <Configuration
+ Name="Release|Win32"
+ OutputDirectory=".\..\..\lib"
+ IntermediateDirectory=".\Release"
+ ConfigurationType="2"
+ UseOfMFC="0"
+ ATLMinimizesCRunTimeLibraryUsage="FALSE"
+ CharacterSet="2">
+ <Tool
+ Name="VCCLCompilerTool"
+ ImproveFloatingPointConsistency="TRUE"
+ PreprocessorDefinitions="WIN32;NDEBUG;U_COMMON_IMPLEMENTATION"
+ StringPooling="TRUE"
+ RuntimeLibrary="2"
+ EnableFunctionLevelLinking="TRUE"
+ DisableLanguageExtensions="TRUE"
+ TreatWChar_tAsBuiltInType="TRUE"
+ PrecompiledHeaderFile=".\Release/common.pch"
+ AssemblerListingLocation=".\Release/"
+ ObjectFile=".\Release/"
+ ProgramDataBaseFileName=".\Release/"
+ BrowseInformation="1"
+ WarningLevel="3"
+ SuppressStartupBanner="TRUE"/>
+ <Tool
+ Name="VCCustomBuildTool"/>
+ <Tool
+ Name="VCLinkerTool"
+ OutputFile="..\..\bin\icuuc36.dll"
+ LinkIncremental="1"
+ SuppressStartupBanner="TRUE"
+ ProgramDatabaseFile=".\..\..\lib\icuuc36.pdb"
+ EnableCOMDATFolding="2"
+ BaseAddress="0x4a800000"
+ ImportLibrary="..\..\lib\icuuc.lib"/>
+ <Tool
+ Name="VCMIDLTool"
+ PreprocessorDefinitions="NDEBUG"
+ MkTypLibCompatible="TRUE"
+ SuppressStartupBanner="TRUE"
+ TargetEnvironment="1"
+ TypeLibraryName=".\..\..\lib\icuuc.tlb"/>
+ <Tool
+ Name="VCPostBuildEventTool"/>
+ <Tool
+ Name="VCPreBuildEventTool"/>
+ <Tool
+ Name="VCPreLinkEventTool"/>
+ <Tool
+ Name="VCResourceCompilerTool"
+ PreprocessorDefinitions="NDEBUG"
+ Culture="1033"/>
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"/>
+ <Tool
+ Name="VCXMLDataGeneratorTool"/>
+ <Tool
+ Name="VCWebDeploymentTool"/>
+ <Tool
+ Name="VCManagedWrapperGeneratorTool"/>
+ <Tool
+ Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
+ </Configuration>
+ <Configuration
+ Name="Debug|Win32"
+ OutputDirectory=".\..\..\lib"
+ IntermediateDirectory=".\Debug"
+ ConfigurationType="2"
+ UseOfMFC="0"
+ ATLMinimizesCRunTimeLibraryUsage="FALSE"
+ CharacterSet="2">
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ ImproveFloatingPointConsistency="TRUE"
+ PreprocessorDefinitions="WIN32;_DEBUG;U_COMMON_IMPLEMENTATION;RBBI_DEBUG"
+ BasicRuntimeChecks="3"
+ RuntimeLibrary="3"
+ BufferSecurityCheck="TRUE"
+ DisableLanguageExtensions="TRUE"
+ TreatWChar_tAsBuiltInType="TRUE"
+ PrecompiledHeaderFile=".\Debug/common.pch"
+ AssemblerListingLocation=".\Debug/"
+ ObjectFile=".\Debug/"
+ ProgramDataBaseFileName=".\Debug/"
+ BrowseInformation="1"
+ WarningLevel="3"
+ SuppressStartupBanner="TRUE"
+ DebugInformationFormat="4"/>
+ <Tool
+ Name="VCCustomBuildTool"/>
+ <Tool
+ Name="VCLinkerTool"
+ OutputFile="..\..\bin\icuuc36d.dll"
+ LinkIncremental="2"
+ SuppressStartupBanner="TRUE"
+ GenerateDebugInformation="TRUE"
+ ProgramDatabaseFile=".\..\..\lib\icuuc36d.pdb"
+ BaseAddress="0x4a800000"
+ ImportLibrary="..\..\lib\icuucd.lib"/>
+ <Tool
+ Name="VCMIDLTool"
+ PreprocessorDefinitions="_DEBUG"
+ MkTypLibCompatible="TRUE"
+ SuppressStartupBanner="TRUE"
+ TargetEnvironment="1"
+ TypeLibraryName=".\..\..\lib\icuucd.tlb"/>
+ <Tool
+ Name="VCPostBuildEventTool"/>
+ <Tool
+ Name="VCPreBuildEventTool"/>
+ <Tool
+ Name="VCPreLinkEventTool"/>
+ <Tool
+ Name="VCResourceCompilerTool"
+ PreprocessorDefinitions="_DEBUG"
+ Culture="1033"/>
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"/>
+ <Tool
+ Name="VCXMLDataGeneratorTool"/>
+ <Tool
+ Name="VCWebDeploymentTool"/>
+ <Tool
+ Name="VCManagedWrapperGeneratorTool"/>
+ <Tool
+ Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
+ </Configuration>
+ </Configurations>
+ <References>
+ </References>
+ <Files>
+ <Filter
+ Name="bidi"
+ Filter="">
+ <File
+ RelativePath=".\ubidi.c">
+ </File>
+ <File
+ RelativePath=".\unicode\ubidi.h">
+ <FileConfiguration
+ Name="Release|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ CommandLine="copy "$(InputPath)" ..\..\include\unicode
+"
+ Outputs="..\..\include\unicode\$(InputFileName)"/>
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Debug|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ CommandLine="copy "$(InputPath)" ..\..\include\unicode
+"
+ Outputs="..\..\include\unicode\$(InputFileName)"/>
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath=".\ubidi_props.c">
+ </File>
+ <File
+ RelativePath=".\ubidi_props.h">
+ </File>
+ <File
+ RelativePath=".\ubidiimp.h">
+ </File>
+ <File
+ RelativePath=".\ubidiln.c">
+ </File>
+ <File
+ RelativePath=".\ubidiwrt.c">
+ </File>
+ <File
+ RelativePath=".\ushape.c">
+ </File>
+ <File
+ RelativePath=".\unicode\ushape.h">
+ <FileConfiguration
+ Name="Release|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ CommandLine="copy "$(InputPath)" ..\..\include\unicode
+"
+ Outputs="..\..\include\unicode\$(InputFileName)"/>
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Debug|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ CommandLine="copy "$(InputPath)" ..\..\include\unicode
+"
+ Outputs="..\..\include\unicode\$(InputFileName)"/>
+ </FileConfiguration>
+ </File>
+ </Filter>
+ <Filter
+ Name="break iteration"
+ Filter="">
+ <File
+ RelativePath=".\brkeng.cpp">
+ </File>
+ <File
+ RelativePath=".\brkeng.h">
+ </File>
+ <File
+ RelativePath=".\brkiter.cpp">
+ </File>
+ <File
+ RelativePath=".\unicode\brkiter.h">
+ <FileConfiguration
+ Name="Release|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ CommandLine="copy "$(InputPath)" ..\..\include\unicode
+"
+ Outputs="..\..\include\unicode\$(InputFileName)"/>
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Debug|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ CommandLine="copy "$(InputPath)" ..\..\include\unicode
+"
+ Outputs="..\..\include\unicode\$(InputFileName)"/>
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath=".\unicode\dbbi.h">
+ <FileConfiguration
+ Name="Release|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ CommandLine="copy "$(InputPath)" ..\..\include\unicode
+"
+ Outputs="..\..\include\unicode\$(InputFileName)"/>
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Debug|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ CommandLine="copy "$(InputPath)" ..\..\include\unicode
+"
+ Outputs="..\..\include\unicode\$(InputFileName)"/>
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath=".\dictbe.cpp">
+ </File>
+ <File
+ RelativePath=".\dictbe.h">
+ </File>
+ <File
+ RelativePath=".\rbbi.cpp">
+ </File>
+ <File
+ RelativePath=".\unicode\rbbi.h">
+ <FileConfiguration
+ Name="Release|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ CommandLine="copy "$(InputPath)" ..\..\include\unicode
+"
+ Outputs="..\..\include\unicode\$(InputFileName)"/>
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Debug|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ CommandLine="copy "$(InputPath)" ..\..\include\unicode
+"
+ Outputs="..\..\include\unicode\$(InputFileName)"/>
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath=".\rbbidata.cpp">
+ </File>
+ <File
+ RelativePath=".\rbbidata.h">
+ </File>
+ <File
+ RelativePath=".\rbbinode.cpp">
+ </File>
+ <File
+ RelativePath=".\rbbinode.h">
+ </File>
+ <File
+ RelativePath=".\rbbirb.cpp">
+ </File>
+ <File
+ RelativePath=".\rbbirb.h">
+ </File>
+ <File
+ RelativePath=".\rbbirpt.h">
+ </File>
+ <File
+ RelativePath=".\rbbiscan.cpp">
+ </File>
+ <File
+ RelativePath=".\rbbiscan.h">
+ </File>
+ <File
+ RelativePath=".\rbbisetb.cpp">
+ </File>
+ <File
+ RelativePath=".\rbbisetb.h">
+ </File>
+ <File
+ RelativePath=".\rbbistbl.cpp">
+ </File>
+ <File
+ RelativePath=".\rbbitblb.cpp">
+ </File>
+ <File
+ RelativePath=".\rbbitblb.h">
+ </File>
+ <File
+ RelativePath=".\triedict.cpp">
+ </File>
+ <File
+ RelativePath=".\triedict.h">
+ </File>
+ <File
+ RelativePath=".\ubrk.cpp">
+ </File>
+ <File
+ RelativePath=".\unicode\ubrk.h">
+ <FileConfiguration
+ Name="Release|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ CommandLine="copy "$(InputPath)" ..\..\include\unicode
+"
+ Outputs="..\..\include\unicode\$(InputFileName)"/>
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Debug|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ CommandLine="copy "$(InputPath)" ..\..\include\unicode
+"
+ Outputs="..\..\include\unicode\$(InputFileName)"/>
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath=".\ubrkimpl.h">
+ </File>
+ </Filter>
+ <Filter
+ Name="collation"
+ Filter="">
+ <File
+ RelativePath=".\ucol_swp.c">
+ <FileConfiguration
+ Name="Release|Win32">
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories="..\i18n"/>
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Debug|Win32">
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories="..\i18n"/>
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath=".\ucol_swp.h">
+ </File>
+ </Filter>
+ <Filter
+ Name="collections"
+ Filter="">
+ <File
+ RelativePath=".\hash.h">
+ </File>
+ <File
+ RelativePath=".\unicode\strenum.h">
+ <FileConfiguration
+ Name="Release|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ CommandLine="copy "$(InputPath)" ..\..\include\unicode
+"
+ Outputs="..\..\include\unicode\$(InputFileName)"/>
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Debug|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ CommandLine="copy "$(InputPath)" ..\..\include\unicode
+"
+ Outputs="..\..\include\unicode\$(InputFileName)"/>
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath=".\uarrsort.c">
+ </File>
+ <File
+ RelativePath=".\uarrsort.h">
+ </File>
+ <File
+ RelativePath=".\uenum.c">
+ </File>
+ <File
+ RelativePath=".\unicode\uenum.h">
+ <FileConfiguration
+ Name="Release|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ CommandLine="copy "$(InputPath)" ..\..\include\unicode
+"
+ Outputs="..\..\include\unicode\$(InputFileName)"/>
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Debug|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ CommandLine="copy "$(InputPath)" ..\..\include\unicode
+"
+ Outputs="..\..\include\unicode\$(InputFileName)"/>
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath=".\uenumimp.h">
+ </File>
+ <File
+ RelativePath=".\uhash.c">
+ </File>
+ <File
+ RelativePath=".\uhash.h">
+ </File>
+ <File
+ RelativePath=".\uhash_us.cpp">
+ </File>
+ <File
+ RelativePath=".\ustack.cpp">
+ </File>
+ <File
+ RelativePath=".\ustrenum.cpp">
+ </File>
+ <File
+ RelativePath=".\ustrenum.h">
+ </File>
+ <File
+ RelativePath=".\utrie.c">
+ </File>
+ <File
+ RelativePath=".\utrie.h">
+ </File>
+ <File
+ RelativePath=".\uvector.cpp">
+ </File>
+ <File
+ RelativePath=".\uvector.h">
+ </File>
+ <File
+ RelativePath=".\uvectr32.cpp">
+ </File>
+ <File
+ RelativePath=".\uvectr32.h">
+ </File>
+ </Filter>
+ <Filter
+ Name="configuration"
+ Filter="">
+ <File
+ RelativePath=".\common.rc">
+ </File>
+ <File
+ RelativePath=".\cpputils.h">
+ </File>
+ <File
+ RelativePath=".\unicode\docmain.h">
+ <FileConfiguration
+ Name="Release|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ CommandLine="copy "$(InputPath)" ..\..\include\unicode
+"
+ Outputs="..\..\include\unicode\$(InputFileName)"/>
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Debug|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ CommandLine="copy "$(InputPath)" ..\..\include\unicode
+"
+ Outputs="..\..\include\unicode\$(InputFileName)"/>
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath=".\locmap.c">
+ </File>
+ <File
+ RelativePath=".\locmap.h">
+ </File>
+ <File
+ RelativePath=".\mutex.h">
+ </File>
+ <File
+ RelativePath=".\putil.c">
+ <FileConfiguration
+ Name="Release|Win32">
+ <Tool
+ Name="VCCLCompilerTool"
+ DisableLanguageExtensions="FALSE"/>
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Debug|Win32">
+ <Tool
+ Name="VCCLCompilerTool"
+ DisableLanguageExtensions="FALSE"/>
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath=".\unicode\putil.h">
+ <FileConfiguration
+ Name="Release|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ CommandLine="copy "$(InputPath)" ..\..\include\unicode
+"
+ Outputs="..\..\include\unicode\$(InputFileName)"/>
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Debug|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ CommandLine="copy "$(InputPath)" ..\..\include\unicode
+"
+ Outputs="..\..\include\unicode\$(InputFileName)"/>
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath=".\putilimp.h">
+ </File>
+ <File
+ RelativePath=".\unicode\pwin32.h">
+ <FileConfiguration
+ Name="Release|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ CommandLine="copy "$(InputPath)" ..\..\include\unicode
+"
+ Outputs="..\..\include\unicode\$(InputFileName)"/>
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Debug|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ CommandLine="copy "$(InputPath)" ..\..\include\unicode
+"
+ Outputs="..\..\include\unicode\$(InputFileName)"/>
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath=".\uassert.h">
+ </File>
+ <File
+ RelativePath=".\unicode\uconfig.h">
+ <FileConfiguration
+ Name="Release|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ CommandLine="copy "$(InputPath)" ..\..\include\unicode
+"
+ Outputs="..\..\include\unicode\$(InputFileName)"/>
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Debug|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ CommandLine="copy "$(InputPath)" ..\..\include\unicode
+"
+ Outputs="..\..\include\unicode\$(InputFileName)"/>
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath=".\unicode\udeprctd.h">
+ <FileConfiguration
+ Name="Release|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ CommandLine="copy "$(InputPath)" ..\..\include\unicode
+"
+ Outputs="..\..\include\unicode\$(InputFileName)"/>
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Debug|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ CommandLine="copy "$(InputPath)" ..\..\include\unicode
+"
+ Outputs="..\..\include\unicode\$(InputFileName)"/>
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath=".\unicode\udraft.h">
+ <FileConfiguration
+ Name="Release|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ CommandLine="copy "$(InputPath)" ..\..\include\unicode
+"
+ Outputs="..\..\include\unicode\$(InputFileName)"/>
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Debug|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ CommandLine="copy "$(InputPath)" ..\..\include\unicode
+"
+ Outputs="..\..\include\unicode\$(InputFileName)"/>
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath=".\unicode\uintrnal.h">
+ <FileConfiguration
+ Name="Release|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ CommandLine="copy "$(InputPath)" ..\..\include\unicode
+"
+ Outputs="..\..\include\unicode\$(InputFileName)"/>
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Debug|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ CommandLine="copy "$(InputPath)" ..\..\include\unicode
+"
+ Outputs="..\..\include\unicode\$(InputFileName)"/>
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath=".\unicode\umachine.h">
+ <FileConfiguration
+ Name="Release|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ CommandLine="copy "$(InputPath)" ..\..\include\unicode
+"
+ Outputs="..\..\include\unicode\$(InputFileName)"/>
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Debug|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ CommandLine="copy "$(InputPath)" ..\..\include\unicode
+"
+ Outputs="..\..\include\unicode\$(InputFileName)"/>
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath=".\umath.c">
+ </File>
+ <File
+ RelativePath=".\umutex.c">
+ <FileConfiguration
+ Name="Release|Win32">
+ <Tool
+ Name="VCCLCompilerTool"
+ DisableLanguageExtensions="FALSE"/>
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Debug|Win32">
+ <Tool
+ Name="VCCLCompilerTool"
+ DisableLanguageExtensions="FALSE"/>
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath=".\umutex.h">
+ </File>
+ <File
+ RelativePath=".\unicode\uobslete.h">
+ <FileConfiguration
+ Name="Release|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ CommandLine="copy "$(InputPath)" ..\..\include\unicode
+"
+ Outputs="..\..\include\unicode\$(InputFileName)"/>
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Debug|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ CommandLine="copy "$(InputPath)" ..\..\include\unicode
+"
+ Outputs="..\..\include\unicode\$(InputFileName)"/>
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath=".\unicode\urename.h">
+ <FileConfiguration
+ Name="Release|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ CommandLine="copy "$(InputPath)" ..\..\include\unicode
+"
+ Outputs="..\..\include\unicode\$(InputFileName)"/>
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Debug|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ CommandLine="copy "$(InputPath)" ..\..\include\unicode
+"
+ Outputs="..\..\include\unicode\$(InputFileName)"/>
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath=".\unicode\usystem.h">
+ <FileConfiguration
+ Name="Release|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ CommandLine="copy "$(InputPath)" ..\..\include\unicode
+"
+ Outputs="..\..\include\unicode\$(InputFileName)"/>
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Debug|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ CommandLine="copy "$(InputPath)" ..\..\include\unicode
+"
+ Outputs="..\..\include\unicode\$(InputFileName)"/>
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath=".\utrace.c">
+ </File>
+ <File
+ RelativePath=".\unicode\utrace.h">
+ <FileConfiguration
+ Name="Release|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ CommandLine="copy "$(InputPath)" ..\..\include\unicode
+"
+ Outputs="..\..\include\unicode\$(InputFileName)"/>
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Debug|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ CommandLine="copy "$(InputPath)" ..\..\include\unicode
+"
+ Outputs="..\..\include\unicode\$(InputFileName)"/>
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath=".\utracimp.h">
+ </File>
+ <File
+ RelativePath=".\utypes.c">
+ </File>
+ <File
+ RelativePath=".\unicode\utypes.h">
+ <FileConfiguration
+ Name="Release|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ CommandLine="copy "$(InputPath)" ..\..\include\unicode
+"
+ Outputs="..\..\include\unicode\$(InputFileName)"/>
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Debug|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ CommandLine="copy "$(InputPath)" ..\..\include\unicode
+"
+ Outputs="..\..\include\unicode\$(InputFileName)"/>
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath=".\unicode\uversion.h">
+ <FileConfiguration
+ Name="Release|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ CommandLine="copy "$(InputPath)" ..\..\include\unicode
+"
+ Outputs="..\..\include\unicode\$(InputFileName)"/>
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Debug|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ CommandLine="copy "$(InputPath)" ..\..\include\unicode
+"
+ Outputs="..\..\include\unicode\$(InputFileName)"/>
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath=".\wintz.c">
+ <FileConfiguration
+ Name="Release|Win32">
+ <Tool
+ Name="VCCLCompilerTool"
+ DisableLanguageExtensions="FALSE"/>
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Debug|Win32">
+ <Tool
+ Name="VCCLCompilerTool"
+ DisableLanguageExtensions="FALSE"/>
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath=".\wintz.h">
+ </File>
+ </Filter>
+ <Filter
+ Name="conversion"
+ Filter="">
+ <File
+ RelativePath=".\ucnv.c">
+ </File>
+ <File
+ RelativePath=".\unicode\ucnv.h">
+ <FileConfiguration
+ Name="Release|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ CommandLine="copy "$(InputPath)" ..\..\include\unicode
+"
+ Outputs="..\..\include\unicode\$(InputFileName)"/>
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Debug|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ CommandLine="copy "$(InputPath)" ..\..\include\unicode
+"
+ Outputs="..\..\include\unicode\$(InputFileName)"/>
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath=".\ucnv2022.c">
+ </File>
+ <File
+ RelativePath=".\ucnv_bld.c">
+ </File>
+ <File
+ RelativePath=".\ucnv_bld.h">
+ </File>
+ <File
+ RelativePath=".\ucnv_cb.c">
+ </File>
+ <File
+ RelativePath=".\unicode\ucnv_cb.h">
+ <FileConfiguration
+ Name="Release|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ CommandLine="copy "$(InputPath)" ..\..\include\unicode
+"
+ Outputs="..\..\include\unicode\$(InputFileName)"/>
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Debug|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ CommandLine="copy "$(InputPath)" ..\..\include\unicode
+"
+ Outputs="..\..\include\unicode\$(InputFileName)"/>
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath=".\ucnv_cnv.c">
+ </File>
+ <File
+ RelativePath=".\ucnv_cnv.h">
+ </File>
+ <File
+ RelativePath=".\ucnv_err.c">
+ </File>
+ <File
+ RelativePath=".\unicode\ucnv_err.h">
+ <FileConfiguration
+ Name="Release|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ CommandLine="copy "$(InputPath)" ..\..\include\unicode
+"
+ Outputs="..\..\include\unicode\$(InputFileName)"/>
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Debug|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ CommandLine="copy "$(InputPath)" ..\..\include\unicode
+"
+ Outputs="..\..\include\unicode\$(InputFileName)"/>
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath=".\ucnv_ext.c">
+ </File>
+ <File
+ RelativePath=".\ucnv_ext.h">
+ </File>
+ <File
+ RelativePath=".\ucnv_imp.h">
+ </File>
+ <File
+ RelativePath=".\ucnv_io.c">
+ </File>
+ <File
+ RelativePath=".\ucnv_io.h">
+ </File>
+ <File
+ RelativePath=".\ucnv_lmb.c">
+ </File>
+ <File
+ RelativePath=".\ucnv_set.c">
+ </File>
+ <File
+ RelativePath=".\ucnv_u16.c">
+ </File>
+ <File
+ RelativePath=".\ucnv_u32.c">
+ </File>
+ <File
+ RelativePath=".\ucnv_u7.c">
+ </File>
+ <File
+ RelativePath=".\ucnv_u8.c">
+ </File>
+ <File
+ RelativePath=".\ucnvbocu.c">
+ </File>
+ <File
+ RelativePath=".\ucnvdisp.c">
+ </File>
+ <File
+ RelativePath=".\ucnvhz.c">
+ </File>
+ <File
+ RelativePath=".\ucnvisci.c">
+ </File>
+ <File
+ RelativePath=".\ucnvlat1.c">
+ </File>
+ <File
+ RelativePath=".\ucnvmbcs.c">
+ </File>
+ <File
+ RelativePath=".\ucnvmbcs.h">
+ </File>
+ <File
+ RelativePath=".\ucnvscsu.c">
+ </File>
+ </Filter>
+ <Filter
+ Name="data & memory"
+ Filter="">
+ <File
+ RelativePath=".\cmemory.c">
+ </File>
+ <File
+ RelativePath=".\cmemory.h">
+ </File>
+ <File
+ RelativePath=".\unicode\uclean.h">
+ <FileConfiguration
+ Name="Release|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ CommandLine="copy "$(InputPath)" ..\..\include\unicode
+"
+ Outputs="..\..\include\unicode\$(InputFileName)"/>
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Debug|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ CommandLine="copy "$(InputPath)" ..\..\include\unicode
+"
+ Outputs="..\..\include\unicode\$(InputFileName)"/>
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath=".\ucln.h">
+ </File>
+ <File
+ RelativePath=".\ucln_cmn.c">
+ </File>
+ <File
+ RelativePath=".\ucln_cmn.h">
+ </File>
+ <File
+ RelativePath=".\ucmndata.c">
+ </File>
+ <File
+ RelativePath=".\ucmndata.h">
+ </File>
+ <File
+ RelativePath=".\udata.c">
+ </File>
+ <File
+ RelativePath=".\unicode\udata.h">
+ <FileConfiguration
+ Name="Release|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ CommandLine="copy "$(InputPath)" ..\..\include\unicode
+"
+ Outputs="..\..\include\unicode\$(InputFileName)"/>
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Debug|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ CommandLine="copy "$(InputPath)" ..\..\include\unicode
+"
+ Outputs="..\..\include\unicode\$(InputFileName)"/>
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath=".\udatamem.c">
+ </File>
+ <File
+ RelativePath=".\udatamem.h">
+ </File>
+ <File
+ RelativePath=".\udataswp.c">
+ </File>
+ <File
+ RelativePath=".\udataswp.h">
+ </File>
+ <File
+ RelativePath=".\uinit.c">
+ </File>
+ <File
+ RelativePath=".\umapfile.c">
+ <FileConfiguration
+ Name="Release|Win32">
+ <Tool
+ Name="VCCLCompilerTool"
+ DisableLanguageExtensions="FALSE"/>
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Debug|Win32">
+ <Tool
+ Name="VCCLCompilerTool"
+ DisableLanguageExtensions="FALSE"/>
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath=".\umapfile.h">
+ </File>
+ <File
+ RelativePath=".\uobject.cpp">
+ </File>
+ <File
+ RelativePath=".\unicode\uobject.h">
+ <FileConfiguration
+ Name="Release|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ CommandLine="copy "$(InputPath)" ..\..\include\unicode
+"
+ Outputs="..\..\include\unicode\$(InputFileName)"/>
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Debug|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ CommandLine="copy "$(InputPath)" ..\..\include\unicode
+"
+ Outputs="..\..\include\unicode\$(InputFileName)"/>
+ </FileConfiguration>
+ </File>
+ </Filter>
+ <Filter
+ Name="formatting"
+ Filter="">
+ <File
+ RelativePath=".\unicode\parseerr.h">
+ <FileConfiguration
+ Name="Release|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ CommandLine="copy "$(InputPath)" ..\..\include\unicode
+"
+ Outputs="..\..\include\unicode\$(InputFileName)"/>
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Debug|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ CommandLine="copy "$(InputPath)" ..\..\include\unicode
+"
+ Outputs="..\..\include\unicode\$(InputFileName)"/>
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath=".\parsepos.cpp">
+ </File>
+ <File
+ RelativePath=".\unicode\parsepos.h">
+ <FileConfiguration
+ Name="Release|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ CommandLine="copy "$(InputPath)" ..\..\include\unicode
+"
+ Outputs="..\..\include\unicode\$(InputFileName)"/>
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Debug|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ CommandLine="copy "$(InputPath)" ..\..\include\unicode
+"
+ Outputs="..\..\include\unicode\$(InputFileName)"/>
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath=".\unicode\umisc.h">
+ <FileConfiguration
+ Name="Release|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ CommandLine="copy "$(InputPath)" ..\..\include\unicode
+"
+ Outputs="..\..\include\unicode\$(InputFileName)"/>
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Debug|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ CommandLine="copy "$(InputPath)" ..\..\include\unicode
+"
+ Outputs="..\..\include\unicode\$(InputFileName)"/>
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath=".\ustrfmt.c">
+ </File>
+ <File
+ RelativePath=".\ustrfmt.h">
+ </File>
+ <File
+ RelativePath=".\util.cpp">
+ </File>
+ <File
+ RelativePath=".\util.h">
+ </File>
+ <File
+ RelativePath=".\util_props.cpp">
+ </File>
+ </Filter>
+ <Filter
+ Name="idna"
+ Filter="*.c,*.h">
+ <File
+ RelativePath=".\punycode.c">
+ </File>
+ <File
+ RelativePath=".\punycode.h">
+ </File>
+ <File
+ RelativePath=".\uidna.cpp">
+ </File>
+ <File
+ RelativePath=".\unicode\uidna.h">
+ <FileConfiguration
+ Name="Release|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ CommandLine="copy "$(InputPath)" ..\..\include\unicode
+"
+ Outputs="..\..\include\unicode\$(InputFileName)"/>
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Debug|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ CommandLine="copy "$(InputPath)" ..\..\include\unicode
+"
+ Outputs="..\..\include\unicode\$(InputFileName)"/>
+ </FileConfiguration>
+ </File>
+ </Filter>
+ <Filter
+ Name="locales & resources"
+ Filter="">
+ <File
+ RelativePath=".\locbased.cpp">
+ </File>
+ <File
+ RelativePath=".\locbased.h">
+ </File>
+ <File
+ RelativePath=".\locid.cpp">
+ </File>
+ <File
+ RelativePath=".\unicode\locid.h">
+ <FileConfiguration
+ Name="Release|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ CommandLine="copy "$(InputPath)" ..\..\include\unicode
+"
+ Outputs="..\..\include\unicode\$(InputFileName)"/>
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Debug|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ CommandLine="copy "$(InputPath)" ..\..\include\unicode
+"
+ Outputs="..\..\include\unicode\$(InputFileName)"/>
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath=".\locutil.cpp">
+ </File>
+ <File
+ RelativePath=".\locutil.h">
+ </File>
+ <File
+ RelativePath=".\resbund.cpp">
+ </File>
+ <File
+ RelativePath=".\unicode\resbund.h">
+ <FileConfiguration
+ Name="Release|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ CommandLine="copy "$(InputPath)" ..\..\include\unicode
+"
+ Outputs="..\..\include\unicode\$(InputFileName)"/>
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Debug|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ CommandLine="copy "$(InputPath)" ..\..\include\unicode
+"
+ Outputs="..\..\include\unicode\$(InputFileName)"/>
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath=".\resbund_cnv.cpp">
+ </File>
+ <File
+ RelativePath=".\ucat.c">
+ </File>
+ <File
+ RelativePath=".\unicode\ucat.h">
+ <FileConfiguration
+ Name="Release|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ CommandLine="copy "$(InputPath)" ..\..\include\unicode
+"
+ Outputs="..\..\include\unicode\$(InputFileName)"/>
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Debug|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ CommandLine="copy "$(InputPath)" ..\..\include\unicode
+"
+ Outputs="..\..\include\unicode\$(InputFileName)"/>
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath=".\uloc.c">
+ </File>
+ <File
+ RelativePath=".\unicode\uloc.h">
+ <FileConfiguration
+ Name="Release|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ CommandLine="copy "$(InputPath)" ..\..\include\unicode
+"
+ Outputs="..\..\include\unicode\$(InputFileName)"/>
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Debug|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ CommandLine="copy "$(InputPath)" ..\..\include\unicode
+"
+ Outputs="..\..\include\unicode\$(InputFileName)"/>
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath=".\ulocimp.h">
+ </File>
+ <File
+ RelativePath=".\unicode\ures.h">
+ <FileConfiguration
+ Name="Release|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ CommandLine="copy "$(InputPath)" ..\..\include\unicode
+"
+ Outputs="..\..\include\unicode\$(InputFileName)"/>
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Debug|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ CommandLine="copy "$(InputPath)" ..\..\include\unicode
+"
+ Outputs="..\..\include\unicode\$(InputFileName)"/>
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath=".\ures_cnv.c">
+ </File>
+ <File
+ RelativePath=".\uresbund.c">
+ </File>
+ <File
+ RelativePath=".\uresdata.c">
+ </File>
+ <File
+ RelativePath=".\uresdata.h">
+ </File>
+ <File
+ RelativePath=".\uresimp.h">
+ </File>
+ </Filter>
+ <Filter
+ Name="normalization"
+ Filter="">
+ <File
+ RelativePath=".\caniter.cpp">
+ </File>
+ <File
+ RelativePath=".\unicode\caniter.h">
+ <FileConfiguration
+ Name="Release|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ CommandLine="copy "$(InputPath)" ..\..\include\unicode
+"
+ Outputs="..\..\include\unicode\$(InputFileName)"/>
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Debug|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ CommandLine="copy "$(InputPath)" ..\..\include\unicode
+"
+ Outputs="..\..\include\unicode\$(InputFileName)"/>
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath=".\normlzr.cpp">
+ </File>
+ <File
+ RelativePath=".\unicode\normlzr.h">
+ <FileConfiguration
+ Name="Release|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ CommandLine="copy "$(InputPath)" ..\..\include\unicode
+"
+ Outputs="..\..\include\unicode\$(InputFileName)"/>
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Debug|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ CommandLine="copy "$(InputPath)" ..\..\include\unicode
+"
+ Outputs="..\..\include\unicode\$(InputFileName)"/>
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath=".\unorm.cpp">
+ </File>
+ <File
+ RelativePath=".\unicode\unorm.h">
+ <FileConfiguration
+ Name="Release|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ CommandLine="copy "$(InputPath)" ..\..\include\unicode
+"
+ Outputs="..\..\include\unicode\$(InputFileName)"/>
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Debug|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ CommandLine="copy "$(InputPath)" ..\..\include\unicode
+"
+ Outputs="..\..\include\unicode\$(InputFileName)"/>
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath=".\unorm_it.c">
+ </File>
+ <File
+ RelativePath=".\unorm_it.h">
+ </File>
+ <File
+ RelativePath=".\unormcmp.cpp">
+ </File>
+ <File
+ RelativePath=".\unormimp.h">
+ </File>
+ </Filter>
+ <Filter
+ Name="properties & sets"
+ Filter="">
+ <File
+ RelativePath=".\propname.cpp">
+ </File>
+ <File
+ RelativePath=".\propname.h">
+ </File>
+ <File
+ RelativePath=".\ruleiter.cpp">
+ </File>
+ <File
+ RelativePath=".\ruleiter.h">
+ </File>
+ <File
+ RelativePath=".\unicode\symtable.h">
+ <FileConfiguration
+ Name="Release|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ CommandLine="copy "$(InputPath)" ..\..\include\unicode
+"
+ Outputs="..\..\include\unicode\$(InputFileName)"/>
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Debug|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ CommandLine="copy "$(InputPath)" ..\..\include\unicode
+"
+ Outputs="..\..\include\unicode\$(InputFileName)"/>
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath=".\ucase.c">
+ </File>
+ <File
+ RelativePath=".\ucase.h">
+ </File>
+ <File
+ RelativePath=".\uchar.c">
+ </File>
+ <File
+ RelativePath=".\unicode\uchar.h">
+ <FileConfiguration
+ Name="Release|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ CommandLine="copy "$(InputPath)" ..\..\include\unicode
+"
+ Outputs="..\..\include\unicode\$(InputFileName)"/>
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Debug|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ CommandLine="copy "$(InputPath)" ..\..\include\unicode
+"
+ Outputs="..\..\include\unicode\$(InputFileName)"/>
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath=".\unames.c">
+ </File>
+ <File
+ RelativePath=".\unifilt.cpp">
+ </File>
+ <File
+ RelativePath=".\unicode\unifilt.h">
+ <FileConfiguration
+ Name="Release|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ CommandLine="copy "$(InputPath)" ..\..\include\unicode
+"
+ Outputs="..\..\include\unicode\$(InputFileName)"/>
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Debug|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ CommandLine="copy "$(InputPath)" ..\..\include\unicode
+"
+ Outputs="..\..\include\unicode\$(InputFileName)"/>
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath=".\unifunct.cpp">
+ </File>
+ <File
+ RelativePath=".\unicode\unifunct.h">
+ <FileConfiguration
+ Name="Release|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ CommandLine="copy "$(InputPath)" ..\..\include\unicode
+"
+ Outputs="..\..\include\unicode\$(InputFileName)"/>
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Debug|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ CommandLine="copy "$(InputPath)" ..\..\include\unicode
+"
+ Outputs="..\..\include\unicode\$(InputFileName)"/>
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath=".\unicode\unimatch.h">
+ <FileConfiguration
+ Name="Release|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ CommandLine="copy "$(InputPath)" ..\..\include\unicode
+"
+ Outputs="..\..\include\unicode\$(InputFileName)"/>
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Debug|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ CommandLine="copy "$(InputPath)" ..\..\include\unicode
+"
+ Outputs="..\..\include\unicode\$(InputFileName)"/>
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath=".\uniset.cpp">
+ </File>
+ <File
+ RelativePath=".\unicode\uniset.h">
+ <FileConfiguration
+ Name="Release|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ CommandLine="copy "$(InputPath)" ..\..\include\unicode
+"
+ Outputs="..\..\include\unicode\$(InputFileName)"/>
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Debug|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ CommandLine="copy "$(InputPath)" ..\..\include\unicode
+"
+ Outputs="..\..\include\unicode\$(InputFileName)"/>
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath=".\uniset_props.cpp">
+ </File>
+ <File
+ RelativePath=".\uprops.c">
+ </File>
+ <File
+ RelativePath=".\uprops.h">
+ </File>
+ <File
+ RelativePath=".\usc_impl.c">
+ </File>
+ <File
+ RelativePath=".\usc_impl.h">
+ </File>
+ <File
+ RelativePath=".\uscript.c">
+ </File>
+ <File
+ RelativePath=".\unicode\uscript.h">
+ <FileConfiguration
+ Name="Release|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ CommandLine="copy "$(InputPath)" ..\..\include\unicode
+"
+ Outputs="..\..\include\unicode\$(InputFileName)"/>
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Debug|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ CommandLine="copy "$(InputPath)" ..\..\include\unicode
+"
+ Outputs="..\..\include\unicode\$(InputFileName)"/>
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath=".\uset.cpp">
+ </File>
+ <File
+ RelativePath=".\unicode\uset.h">
+ <FileConfiguration
+ Name="Release|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ CommandLine="copy "$(InputPath)" ..\..\include\unicode
+"
+ Outputs="..\..\include\unicode\$(InputFileName)"/>
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Debug|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ CommandLine="copy "$(InputPath)" ..\..\include\unicode
+"
+ Outputs="..\..\include\unicode\$(InputFileName)"/>
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath=".\uset_imp.h">
+ </File>
+ <File
+ RelativePath=".\uset_props.cpp">
+ </File>
+ <File
+ RelativePath=".\usetiter.cpp">
+ </File>
+ <File
+ RelativePath=".\unicode\usetiter.h">
+ <FileConfiguration
+ Name="Release|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ CommandLine="copy "$(InputPath)" ..\..\include\unicode
+"
+ Outputs="..\..\include\unicode\$(InputFileName)"/>
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Debug|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ CommandLine="copy "$(InputPath)" ..\..\include\unicode
+"
+ Outputs="..\..\include\unicode\$(InputFileName)"/>
+ </FileConfiguration>
+ </File>
+ </Filter>
+ <Filter
+ Name="registration"
+ Filter="">
+ <File
+ RelativePath=".\serv.cpp">
+ </File>
+ <File
+ RelativePath=".\serv.h">
+ </File>
+ <File
+ RelativePath=".\servlk.cpp">
+ </File>
+ <File
+ RelativePath=".\servlkf.cpp">
+ </File>
+ <File
+ RelativePath=".\servloc.h">
+ </File>
+ <File
+ RelativePath=".\servls.cpp">
+ </File>
+ <File
+ RelativePath=".\servnotf.cpp">
+ </File>
+ <File
+ RelativePath=".\servnotf.h">
+ </File>
+ <File
+ RelativePath=".\servrbf.cpp">
+ </File>
+ <File
+ RelativePath=".\servslkf.cpp">
+ </File>
+ </Filter>
+ <Filter
+ Name="sprep"
+ Filter="">
+ <File
+ RelativePath=".\sprpimpl.h">
+ </File>
+ <File
+ RelativePath=".\usprep.cpp">
+ </File>
+ <File
+ RelativePath=".\unicode\usprep.h">
+ <FileConfiguration
+ Name="Release|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ CommandLine="copy "$(InputPath)" ..\..\include\unicode
+"
+ Outputs="..\..\include\unicode\$(InputFileName)"/>
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Debug|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ CommandLine="copy "$(InputPath)" ..\..\include\unicode
+"
+ Outputs="..\..\include\unicode\$(InputFileName)"/>
+ </FileConfiguration>
+ </File>
+ </Filter>
+ <Filter
+ Name="strings"
+ Filter="">
+ <File
+ RelativePath=".\chariter.cpp">
+ </File>
+ <File
+ RelativePath=".\unicode\chariter.h">
+ <FileConfiguration
+ Name="Release|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ CommandLine="copy "$(InputPath)" ..\..\include\unicode
+"
+ Outputs="..\..\include\unicode\$(InputFileName)"/>
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Debug|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ CommandLine="copy "$(InputPath)" ..\..\include\unicode
+"
+ Outputs="..\..\include\unicode\$(InputFileName)"/>
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath=".\charstr.h">
+ </File>
+ <File
+ RelativePath=".\cstring.c">
+ </File>
+ <File
+ RelativePath=".\cstring.h">
+ </File>
+ <File
+ RelativePath=".\cwchar.c">
+ </File>
+ <File
+ RelativePath=".\cwchar.h">
+ </File>
+ <File
+ RelativePath=".\unicode\rep.h">
+ <FileConfiguration
+ Name="Release|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ CommandLine="copy "$(InputPath)" ..\..\include\unicode
+"
+ Outputs="..\..\include\unicode\$(InputFileName)"/>
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Debug|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ CommandLine="copy "$(InputPath)" ..\..\include\unicode
+"
+ Outputs="..\..\include\unicode\$(InputFileName)"/>
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath=".\schriter.cpp">
+ </File>
+ <File
+ RelativePath=".\unicode\schriter.h">
+ <FileConfiguration
+ Name="Release|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ CommandLine="copy "$(InputPath)" ..\..\include\unicode
+"
+ Outputs="..\..\include\unicode\$(InputFileName)"/>
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Debug|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ CommandLine="copy "$(InputPath)" ..\..\include\unicode
+"
+ Outputs="..\..\include\unicode\$(InputFileName)"/>
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath=".\ucasemap.c">
+ </File>
+ <File
+ RelativePath=".\unicode\ucasemap.h">
+ <FileConfiguration
+ Name="Release|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ CommandLine="copy "$(InputPath)" ..\..\include\unicode
+"
+ Outputs="..\..\include\unicode\$(InputFileName)"/>
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Debug|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ CommandLine="copy "$(InputPath)" ..\..\include\unicode
+"
+ Outputs="..\..\include\unicode\$(InputFileName)"/>
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath=".\uchriter.cpp">
+ </File>
+ <File
+ RelativePath=".\unicode\uchriter.h">
+ <FileConfiguration
+ Name="Release|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ CommandLine="copy "$(InputPath)" ..\..\include\unicode
+"
+ Outputs="..\..\include\unicode\$(InputFileName)"/>
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Debug|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ CommandLine="copy "$(InputPath)" ..\..\include\unicode
+"
+ Outputs="..\..\include\unicode\$(InputFileName)"/>
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath=".\uinvchar.c">
+ </File>
+ <File
+ RelativePath=".\uinvchar.h">
+ </File>
+ <File
+ RelativePath=".\uiter.cpp">
+ </File>
+ <File
+ RelativePath=".\unicode\uiter.h">
+ <FileConfiguration
+ Name="Release|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ CommandLine="copy "$(InputPath)" ..\..\include\unicode
+"
+ Outputs="..\..\include\unicode\$(InputFileName)"/>
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Debug|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ CommandLine="copy "$(InputPath)" ..\..\include\unicode
+"
+ Outputs="..\..\include\unicode\$(InputFileName)"/>
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath=".\unistr.cpp">
+ </File>
+ <File
+ RelativePath=".\unicode\unistr.h">
+ <FileConfiguration
+ Name="Release|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ CommandLine="copy "$(InputPath)" ..\..\include\unicode
+"
+ Outputs="..\..\include\unicode\$(InputFileName)"/>
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Debug|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ CommandLine="copy "$(InputPath)" ..\..\include\unicode
+"
+ Outputs="..\..\include\unicode\$(InputFileName)"/>
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath=".\unistr_case.cpp">
+ </File>
+ <File
+ RelativePath=".\unistr_cnv.cpp">
+ </File>
+ <File
+ RelativePath=".\unistr_props.cpp">
+ </File>
+ <File
+ RelativePath=".\unicode\urep.h">
+ <FileConfiguration
+ Name="Release|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ CommandLine="copy "$(InputPath)" ..\..\include\unicode
+"
+ Outputs="..\..\include\unicode\$(InputFileName)"/>
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Debug|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ CommandLine="copy "$(InputPath)" ..\..\include\unicode
+"
+ Outputs="..\..\include\unicode\$(InputFileName)"/>
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath=".\ustr_cnv.c">
+ </File>
+ <File
+ RelativePath=".\ustr_cnv.h">
+ </File>
+ <File
+ RelativePath=".\ustr_imp.h">
+ </File>
+ <File
+ RelativePath=".\ustr_wcs.c">
+ </File>
+ <File
+ RelativePath=".\ustrcase.c">
+ </File>
+ <File
+ RelativePath=".\ustring.c">
+ </File>
+ <File
+ RelativePath=".\unicode\ustring.h">
+ <FileConfiguration
+ Name="Release|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ CommandLine="copy "$(InputPath)" ..\..\include\unicode
+"
+ Outputs="..\..\include\unicode\$(InputFileName)"/>
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Debug|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ CommandLine="copy "$(InputPath)" ..\..\include\unicode
+"
+ Outputs="..\..\include\unicode\$(InputFileName)"/>
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath=".\ustrtrns.c">
+ </File>
+ <File
+ RelativePath=".\utext.cpp">
+ </File>
+ <File
+ RelativePath=".\unicode\utext.h">
+ <FileConfiguration
+ Name="Release|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ CommandLine="copy "$(InputPath)" ..\..\include\unicode
+"
+ Outputs="..\..\include\unicode\$(InputFileName)"/>
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Debug|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ CommandLine="copy "$(InputPath)" ..\..\include\unicode
+"
+ Outputs="..\..\include\unicode\$(InputFileName)"/>
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath=".\unicode\utf.h">
+ <FileConfiguration
+ Name="Release|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ CommandLine="copy "$(InputPath)" ..\..\include\unicode
+"
+ Outputs="..\..\include\unicode\$(InputFileName)"/>
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Debug|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ CommandLine="copy "$(InputPath)" ..\..\include\unicode
+"
+ Outputs="..\..\include\unicode\$(InputFileName)"/>
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath=".\unicode\utf16.h">
+ <FileConfiguration
+ Name="Release|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ CommandLine="copy "$(InputPath)" ..\..\include\unicode
+"
+ Outputs="..\..\include\unicode\$(InputFileName)"/>
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Debug|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ CommandLine="copy "$(InputPath)" ..\..\include\unicode
+"
+ Outputs="..\..\include\unicode\$(InputFileName)"/>
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath=".\unicode\utf32.h">
+ <FileConfiguration
+ Name="Release|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ CommandLine="copy "$(InputPath)" ..\..\include\unicode
+"
+ Outputs="..\..\include\unicode\$(InputFileName)"/>
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Debug|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ CommandLine="copy "$(InputPath)" ..\..\include\unicode
+"
+ Outputs="..\..\include\unicode\$(InputFileName)"/>
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath=".\unicode\utf8.h">
+ <FileConfiguration
+ Name="Release|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ CommandLine="copy "$(InputPath)" ..\..\include\unicode
+"
+ Outputs="..\..\include\unicode\$(InputFileName)"/>
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Debug|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ CommandLine="copy "$(InputPath)" ..\..\include\unicode
+"
+ Outputs="..\..\include\unicode\$(InputFileName)"/>
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath=".\utf_impl.c">
+ </File>
+ <File
+ RelativePath=".\unicode\utf_old.h">
+ <FileConfiguration
+ Name="Release|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ CommandLine="copy "$(InputPath)" ..\..\include\unicode
+"
+ Outputs="..\..\include\unicode\$(InputFileName)"/>
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Debug|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ CommandLine="copy "$(InputPath)" ..\..\include\unicode
+"
+ Outputs="..\..\include\unicode\$(InputFileName)"/>
+ </FileConfiguration>
+ </File>
+ </Filter>
+ </Files>
+ <Globals>
+ </Globals>
+</VisualStudioProject>
\ No newline at end of file
diff --git a/source/common/cpputils.h b/source/common/cpputils.h
new file mode 100644
index 0000000..c1b439c
--- /dev/null
+++ b/source/common/cpputils.h
@@ -0,0 +1,84 @@
+/*
+******************************************************************************
+*
+* Copyright (C) 1997-2006, International Business Machines
+* Corporation and others. All Rights Reserved.
+*
+******************************************************************************
+* file name: cpputils.h
+* encoding: US-ASCII
+* tab size: 8 (not used)
+* indentation:4
+*/
+
+#ifndef CPPUTILS_H
+#define CPPUTILS_H
+
+#include "unicode/utypes.h"
+#include "unicode/unistr.h"
+#include "cmemory.h"
+
+/*==========================================================================*/
+/* Array copy utility functions */
+/*==========================================================================*/
+
+static
+inline void uprv_arrayCopy(const double* src, double* dst, int32_t count)
+{ uprv_memcpy(dst, src, (size_t)(count * sizeof(*src))); }
+
+static
+inline void uprv_arrayCopy(const double* src, int32_t srcStart,
+ double* dst, int32_t dstStart, int32_t count)
+{ uprv_memcpy(dst+dstStart, src+srcStart, (size_t)(count * sizeof(*src))); }
+
+static
+inline void uprv_arrayCopy(const int8_t* src, int8_t* dst, int32_t count)
+ { uprv_memcpy(dst, src, (size_t)(count * sizeof(*src))); }
+
+static
+inline void uprv_arrayCopy(const int8_t* src, int32_t srcStart,
+ int8_t* dst, int32_t dstStart, int32_t count)
+{ uprv_memcpy(dst+dstStart, src+srcStart, (size_t)(count * sizeof(*src))); }
+
+static
+inline void uprv_arrayCopy(const int16_t* src, int16_t* dst, int32_t count)
+{ uprv_memcpy(dst, src, (size_t)(count * sizeof(*src))); }
+
+static
+inline void uprv_arrayCopy(const int16_t* src, int32_t srcStart,
+ int16_t* dst, int32_t dstStart, int32_t count)
+{ uprv_memcpy(dst+dstStart, src+srcStart, (size_t)(count * sizeof(*src))); }
+
+static
+inline void uprv_arrayCopy(const int32_t* src, int32_t* dst, int32_t count)
+{ uprv_memcpy(dst, src, (size_t)(count * sizeof(*src))); }
+
+static
+inline void uprv_arrayCopy(const int32_t* src, int32_t srcStart,
+ int32_t* dst, int32_t dstStart, int32_t count)
+{ uprv_memcpy(dst+dstStart, src+srcStart, (size_t)(count * sizeof(*src))); }
+
+static
+inline void
+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/source/common/cstring.c b/source/common/cstring.c
new file mode 100644
index 0000000..a5b2c6b
--- /dev/null
+++ b/source/common/cstring.c
@@ -0,0 +1,328 @@
+/*
+******************************************************************************
+*
+* Copyright (C) 1997-2003, International Business Machines
+* Corporation and others. All Rights Reserved.
+*
+******************************************************************************
+*
+* File CSTRING.C
+*
+* @author Helena Shih
+*
+* Modification History:
+*
+* Date Name Description
+* 6/18/98 hshih Created
+* 09/08/98 stephen Added include for ctype, for Mac Port
+* 11/15/99 helena Integrated S/390 IEEE changes.
+******************************************************************************
+*/
+
+
+
+#include <stdlib.h>
+#include <stdio.h>
+#include "unicode/utypes.h"
+#include "cmemory.h"
+#include "cstring.h"
+#include "uassert.h"
+
+/*
+ * We hardcode case conversion for invariant characters to match our expectation
+ * and the compiler execution charset.
+ * This prevents problems on systems
+ * - with non-default casing behavior, like Turkish system locales where
+ * tolower('I') maps to dotless i and toupper('i') maps to dotted I
+ * - where there are no lowercase Latin characters at all, or using different
+ * codes (some old EBCDIC codepages)
+ *
+ * This works because the compiler usually runs on a platform where the execution
+ * charset includes all of the invariant characters at their expected
+ * code positions, so that the char * string literals in ICU code match
+ * the char literals here.
+ *
+ * Note that the set of lowercase Latin letters is discontiguous in EBCDIC
+ * and the set of uppercase Latin letters is discontiguous as well.
+ */
+
+U_CAPI char U_EXPORT2
+uprv_toupper(char c) {
+#if U_CHARSET_FAMILY==U_EBCDIC_FAMILY
+ if(('a'<=c && c<='i') || ('j'<=c && c<='r') || ('s'<=c && c<='z')) {
+ c=(char)(c+('A'-'a'));
+ }
+#else
+ if('a'<=c && c<='z') {
+ c=(char)(c+('A'-'a'));
+ }
+#endif
+ return c;
+}
+
+
+#if 0
+/*
+ * Commented out because cstring.h defines uprv_tolower() to be
+ * the same as either uprv_asciitolower() or uprv_ebcdictolower()
+ * to reduce the amount of code to cover with tests.
+ *
+ * Note that this uprv_tolower() definition is likely to work for most
+ * charset families, not just ASCII and EBCDIC, because its #else branch
+ * is written generically.
+ */
+U_CAPI char U_EXPORT2
+uprv_tolower(char c) {
+#if U_CHARSET_FAMILY==U_EBCDIC_FAMILY
+ if(('A'<=c && c<='I') || ('J'<=c && c<='R') || ('S'<=c && c<='Z')) {
+ c=(char)(c+('a'-'A'));
+ }
+#else
+ if('A'<=c && c<='Z') {
+ c=(char)(c+('a'-'A'));
+ }
+#endif
+ return c;
+}
+#endif
+
+U_CAPI char U_EXPORT2
+uprv_asciitolower(char c) {
+ if(0x41<=c && c<=0x5a) {
+ c=(char)(c+0x20);
+ }
+ return c;
+}
+
+U_CAPI char U_EXPORT2
+uprv_ebcdictolower(char c) {
+ if( (0xc1<=(uint8_t)c && (uint8_t)c<=0xc9) ||
+ (0xd1<=(uint8_t)c && (uint8_t)c<=0xd9) ||
+ (0xe2<=(uint8_t)c && (uint8_t)c<=0xe9)
+ ) {
+ c=(char)(c-0x40);
+ }
+ return c;
+}
+
+
+U_CAPI char* U_EXPORT2
+T_CString_toLowerCase(char* str)
+{
+ char* origPtr = str;
+
+ if (str) {
+ do
+ *str = (char)uprv_tolower(*str);
+ while (*(str++));
+ }
+
+ return origPtr;
+}
+
+U_CAPI char* U_EXPORT2
+T_CString_toUpperCase(char* str)
+{
+ char* origPtr = str;
+
+ if (str) {
+ do
+ *str = (char)uprv_toupper(*str);
+ while (*(str++));
+ }
+
+ return origPtr;
+}
+
+/*
+ * Takes a int32_t and fills in a char* string with that number "radix"-based.
+ * Does not handle negative values (makes an empty string for them).
+ * Writes at most 12 chars ("-2147483647" plus NUL).
+ * Returns the length of the string (not including the NUL).
+ */
+U_CAPI int32_t U_EXPORT2
+T_CString_integerToString(char* buffer, int32_t v, int32_t radix)
+{
+ char tbuf[30];
+ int32_t tbx = sizeof(tbuf);
+ uint8_t digit;
+ int32_t length = 0;
+ uint32_t uval;
+
+ U_ASSERT(radix>=2 && radix<=16);
+ uval = (uint32_t) v;
+ if(v<0 && radix == 10) {
+ /* Only in base 10 do we conside numbers to be signed. */
+ uval = (uint32_t)(-v);
+ buffer[length++] = '-';
+ }
+
+ tbx = sizeof(tbuf)-1;
+ tbuf[tbx] = 0; /* We are generating the digits backwards. Null term the end. */
+ do {
+ digit = (uint8_t)(uval % radix);
+ tbuf[--tbx] = (char)(T_CString_itosOffset(digit));
+ uval = uval / radix;
+ } while (uval != 0);
+
+ /* copy converted number into user buffer */
+ uprv_strcpy(buffer+length, tbuf+tbx);
+ length += sizeof(tbuf) - tbx -1;
+ return length;
+}
+
+
+
+/*
+ * Takes a int64_t and fills in a char* string with that number "radix"-based.
+ * Writes at most 21: chars ("-9223372036854775807" plus NUL).
+ * Returns the length of the string, not including the terminating NULL.
+ */
+U_CAPI int32_t U_EXPORT2
+T_CString_int64ToString(char* buffer, int64_t v, uint32_t radix)
+{
+ char tbuf[30];
+ int32_t tbx = sizeof(tbuf);
+ uint8_t digit;
+ int32_t length = 0;
+ uint64_t uval;
+
+ U_ASSERT(radix>=2 && radix<=16);
+ uval = (uint64_t) v;
+ if(v<0 && radix == 10) {
+ /* Only in base 10 do we conside numbers to be signed. */
+ uval = (uint64_t)(-v);
+ buffer[length++] = '-';
+ }
+
+ tbx = sizeof(tbuf)-1;
+ tbuf[tbx] = 0; /* We are generating the digits backwards. Null term the end. */
+ do {
+ digit = (uint8_t)(uval % radix);
+ tbuf[--tbx] = (char)(T_CString_itosOffset(digit));
+ uval = uval / radix;
+ } while (uval != 0);
+
+ /* copy converted number into user buffer */
+ uprv_strcpy(buffer+length, tbuf+tbx);
+ length += sizeof(tbuf) - tbx -1;
+ return length;
+}
+
+
+U_CAPI int32_t U_EXPORT2
+T_CString_stringToInteger(const char *integerString, int32_t radix)
+{
+ char *end;
+ return uprv_strtoul(integerString, &end, radix);
+
+}
+
+U_CAPI int U_EXPORT2
+T_CString_stricmp(const char *str1, const char *str2) {
+ if(str1==NULL) {
+ if(str2==NULL) {
+ return 0;
+ } else {
+ return -1;
+ }
+ } else if(str2==NULL) {
+ return 1;
+ } else {
+ /* compare non-NULL strings lexically with lowercase */
+ int rc;
+ unsigned char c1, c2;
+
+ for(;;) {
+ c1=(unsigned char)*str1;
+ c2=(unsigned char)*str2;
+ if(c1==0) {
+ if(c2==0) {
+ return 0;
+ } else {
+ return -1;
+ }
+ } else if(c2==0) {
+ return 1;
+ } else {
+ /* compare non-zero characters with lowercase */
+ rc=(int)(unsigned char)uprv_tolower(c1)-(int)(unsigned char)uprv_tolower(c2);
+ if(rc!=0) {
+ return rc;
+ }
+ }
+ ++str1;
+ ++str2;
+ }
+ }
+}
+
+U_CAPI int U_EXPORT2
+T_CString_strnicmp(const char *str1, const char *str2, uint32_t n) {
+ if(str1==NULL) {
+ if(str2==NULL) {
+ return 0;
+ } else {
+ return -1;
+ }
+ } else if(str2==NULL) {
+ return 1;
+ } else {
+ /* compare non-NULL strings lexically with lowercase */
+ int rc;
+ unsigned char c1, c2;
+
+ for(; n--;) {
+ c1=(unsigned char)*str1;
+ c2=(unsigned char)*str2;
+ if(c1==0) {
+ if(c2==0) {
+ return 0;
+ } else {
+ return -1;
+ }
+ } else if(c2==0) {
+ return 1;
+ } else {
+ /* compare non-zero characters with lowercase */
+ rc=(int)(unsigned char)uprv_tolower(c1)-(int)(unsigned char)uprv_tolower(c2);
+ if(rc!=0) {
+ return rc;
+ }
+ }
+ ++str1;
+ ++str2;
+ }
+ }
+
+ return 0;
+}
+
+U_CAPI char* U_EXPORT2
+uprv_strdup(const char *src) {
+ size_t len = uprv_strlen(src) + 1;
+ char *dup = (char *) uprv_malloc(len);
+
+ if (dup) {
+ uprv_memcpy(dup, src, len);
+ }
+
+ return dup;
+}
+
+U_CAPI char* U_EXPORT2
+uprv_strndup(const char *src, int32_t n) {
+ char *dup;
+
+ if(n < 0) {
+ dup = uprv_strdup(src);
+ } else {
+ dup = (char*)uprv_malloc(n+1);
+ if (dup) {
+ uprv_memcpy(dup, src, n);
+ dup[n] = 0;
+ }
+ }
+
+ return dup;
+}
diff --git a/source/common/cstring.h b/source/common/cstring.h
new file mode 100644
index 0000000..6d2fd0e
--- /dev/null
+++ b/source/common/cstring.h
@@ -0,0 +1,120 @@
+/*
+******************************************************************************
+*
+* Copyright (C) 1997-2005, International Business Machines
+* Corporation and others. All Rights Reserved.
+*
+******************************************************************************
+*
+* File CSTRING.H
+*
+* Contains CString interface
+*
+* @author Helena Shih
+*
+* Modification History:
+*
+* Date Name Description
+* 6/17/98 hshih Created.
+* 05/03/99 stephen Changed from functions to macros.
+* 06/14/99 stephen Added icu_strncat, icu_strncmp, icu_tolower
+*
+******************************************************************************
+*/
+
+#ifndef CSTRING_H
+#define CSTRING_H 1
+
+#include "unicode/utypes.h"
+#include <string.h>
+#include <stdlib.h>
+#include <ctype.h>
+
+#define uprv_strcpy(dst, src) U_STANDARD_CPP_NAMESPACE strcpy(dst, src)
+#define uprv_strncpy(dst, src, size) U_STANDARD_CPP_NAMESPACE strncpy(dst, src, size)
+#define uprv_strlen(str) U_STANDARD_CPP_NAMESPACE strlen(str)
+#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
+#define uprv_strncmp(s1, s2, n) U_STANDARD_CPP_NAMESPACE strncmp(s1, s2, n)
+#define uprv_strcat(dst, src) U_STANDARD_CPP_NAMESPACE strcat(dst, src)
+#define uprv_strncat(dst, src, n) U_STANDARD_CPP_NAMESPACE strncat(dst, src, n)
+#define uprv_strchr(s, c) U_STANDARD_CPP_NAMESPACE strchr(s, c)
+#define uprv_strstr(s, c) U_STANDARD_CPP_NAMESPACE strstr(s, c)
+#define uprv_strrchr(s, c) U_STANDARD_CPP_NAMESPACE strrchr(s, c)
+
+U_CAPI char U_EXPORT2
+uprv_toupper(char c);
+
+
+U_CAPI char U_EXPORT2
+uprv_asciitolower(char c);
+
+U_CAPI char U_EXPORT2
+uprv_ebcdictolower(char c);
+
+#if U_CHARSET_FAMILY==U_ASCII_FAMILY
+# define uprv_tolower uprv_asciitolower
+#elif U_CHARSET_FAMILY==U_EBCDIC_FAMILY
+# define uprv_tolower uprv_ebcdictolower
+#else
+# error U_CHARSET_FAMILY is not valid
+#endif
+
+#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 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)
+# else
+# 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)
+# endif
+#elif defined(POSIX)
+# define uprv_stricmp(str1, str2) U_STANDARD_CPP_NAMESPACE strcasecmp(str1, str2)
+# define uprv_strnicmp(str1, str2, n) U_STANDARD_CPP_NAMESPACE strncasecmp(str1, str2, n)
+#else
+# define uprv_stricmp(str1, str2) T_CString_stricmp(str1, str2)
+# define uprv_strnicmp(str1, str2, n) T_CString_strnicmp(str1, str2, n)
+#endif
+
+/* Conversion from a digit to the character with radix base from 2-19 */
+/* May need to use U_UPPER_ORDINAL*/
+#define T_CString_itosOffset(a) ((a)<=9?('0'+(a)):('A'+(a)-10))
+
+U_CAPI char* U_EXPORT2
+uprv_strdup(const char *src);
+
+/**
+ * uprv_malloc n+1 bytes, and copy n bytes from src into the new string.
+ * Terminate with a null at offset n. If n is -1, works like uprv_strdup
+ * @param src
+ * @param n length of the input string, not including null.
+ * @return new string (owned by caller, use uprv_free to free).
+ * @internal
+ */
+U_CAPI char* U_EXPORT2
+uprv_strndup(const char *src, int32_t n);
+
+U_CAPI char* U_EXPORT2
+T_CString_toLowerCase(char* str);
+
+U_CAPI char* U_EXPORT2
+T_CString_toUpperCase(char* str);
+
+U_CAPI int32_t U_EXPORT2
+T_CString_integerToString(char *buffer, int32_t n, int32_t radix);
+
+U_CAPI int32_t U_EXPORT2
+T_CString_int64ToString(char *buffer, int64_t n, uint32_t radix);
+
+U_CAPI int32_t U_EXPORT2
+T_CString_stringToInteger(const char *integerString, int32_t radix);
+
+U_CAPI int U_EXPORT2
+T_CString_stricmp(const char *str1, const char *str2);
+
+U_CAPI int U_EXPORT2
+T_CString_strnicmp(const char *str1, const char *str2, uint32_t n);
+
+#endif /* ! CSTRING_H */
diff --git a/source/common/cwchar.c b/source/common/cwchar.c
new file mode 100644
index 0000000..78bb8c5
--- /dev/null
+++ b/source/common/cwchar.c
@@ -0,0 +1,53 @@
+/*
+******************************************************************************
+*
+* Copyright (C) 2001, International Business Machines
+* Corporation and others. All Rights Reserved.
+*
+******************************************************************************
+* file name: cwchar.c
+* encoding: US-ASCII
+* tab size: 8 (not used)
+* indentation:4
+*
+* created on: 2001may25
+* created by: Markus W. Scherer
+*/
+
+#include "unicode/utypes.h"
+
+#if !U_HAVE_WCSCPY
+
+#include "cwchar.h"
+
+U_CAPI wchar_t *uprv_wcscat(wchar_t *dst, const wchar_t *src) {
+ wchar_t *start=dst;
+ while(*dst!=0) {
+ ++dst;
+ }
+ while((*dst=*src)!=0) {
+ ++dst;
+ ++src;
+ }
+ return start;
+}
+
+U_CAPI wchar_t *uprv_wcscpy(wchar_t *dst, const wchar_t *src) {
+ wchar_t *start=dst;
+ while((*dst=*src)!=0) {
+ ++dst;
+ ++src;
+ }
+ return start;
+}
+
+U_CAPI size_t uprv_wcslen(const wchar_t *src) {
+ const wchar_t *start=src;
+ while(*src!=0) {
+ ++src;
+ }
+ return src-start;
+}
+
+#endif
+
diff --git a/source/common/cwchar.h b/source/common/cwchar.h
new file mode 100644
index 0000000..2ab36c0
--- /dev/null
+++ b/source/common/cwchar.h
@@ -0,0 +1,56 @@
+/*
+******************************************************************************
+*
+* Copyright (C) 2001, International Business Machines
+* Corporation and others. All Rights Reserved.
+*
+******************************************************************************
+* file name: cwchar.h
+* encoding: US-ASCII
+* tab size: 8 (not used)
+* indentation:4
+*
+* created on: 2001may25
+* created by: Markus W. Scherer
+*
+* This file contains ICU-internal definitions of wchar_t operations.
+* These definitions were moved here from cstring.h so that fewer
+* ICU implementation files include wchar.h.
+*/
+
+#ifndef __CWCHAR_H__
+#define __CWCHAR_H__
+
+#include <string.h>
+#include <stdlib.h>
+#include "unicode/utypes.h"
+
+/* Do this after utypes.h so that we have U_HAVE_WCHAR_H . */
+#if U_HAVE_WCHAR_H
+# include <wchar.h>
+#endif
+
+/*===========================================================================*/
+/* Wide-character functions */
+/*===========================================================================*/
+
+/* The following are not available on all systems, defined in wchar.h or string.h. */
+#if U_HAVE_WCSCPY
+# define uprv_wcscpy wcscpy
+# define uprv_wcscat wcscat
+# define uprv_wcslen wcslen
+#else
+U_CAPI wchar_t* U_EXPORT2
+uprv_wcscpy(wchar_t *dst, const wchar_t *src);
+U_CAPI wchar_t* U_EXPORT2
+uprv_wcscat(wchar_t *dst, const wchar_t *src);
+U_CAPI size_t U_EXPORT2
+uprv_wcslen(const wchar_t *src);
+#endif
+
+/* The following are part of the ANSI C standard, defined in stdlib.h . */
+#define uprv_wcstombs(mbstr, wcstr, count) U_STANDARD_CPP_NAMESPACE wcstombs(mbstr, wcstr, count)
+#define uprv_mbstowcs(wcstr, mbstr, count) U_STANDARD_CPP_NAMESPACE mbstowcs(wcstr, mbstr, count)
+
+
+#endif
diff --git a/source/common/dictbe.cpp b/source/common/dictbe.cpp
new file mode 100644
index 0000000..ac774f7
--- /dev/null
+++ b/source/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<<UBRK_WORD) | (1<<UBRK_LINE)),
+ fDictionary(adoptDictionary)
+{
+ fThaiWordSet.applyPattern(UNICODE_STRING_SIMPLE("[[:Thai:]&[:LineBreak=SA:]]"), status);
+ if (U_SUCCESS(status)) {
+ setCharacters(fThaiWordSet);
+ }
+ fMarkSet.applyPattern(UNICODE_STRING_SIMPLE("[[:Thai:]&[:LineBreak=SA:]&[:M:]]"), status);
+ fEndWordSet = fThaiWordSet;
+ fEndWordSet.remove(0x0E31); // MAI HAN-AKAT
+ fEndWordSet.remove(0x0E40, 0x0E44); // SARA E through SARA AI MAIMALAI
+ fBeginWordSet.add(0x0E01, 0x0E2E); // KO KAI through HO NOKHUK
+ fBeginWordSet.add(0x0E40, 0x0E44); // SARA E through SARA AI MAIMALAI
+ fSuffixSet.add(THAI_PAIYANNOI);
+ fSuffixSet.add(THAI_MAIYAMOK);
+}
+
+ThaiBreakEngine::~ThaiBreakEngine() {
+ delete fDictionary;
+}
+
+int32_t
+ThaiBreakEngine::divideUpDictionaryRange( UText *text,
+ int32_t rangeStart,
+ int32_t rangeEnd,
+ UStack &foundBreaks ) const {
+ if ((rangeEnd - rangeStart) < THAI_MIN_WORD_SPAN) {
+ return 0; // Not enough characters for two words
+ }
+
+ uint32_t wordsFound = 0;
+ int32_t wordLength;
+ int32_t current;
+ UErrorCode status = U_ZERO_ERROR;
+ PossibleWord words[THAI_LOOKAHEAD];
+ UChar32 uc;
+
+ utext_setNativeIndex(text, rangeStart);
+
+ while (U_SUCCESS(status) && (current = (int32_t)utext_getNativeIndex(text)) < rangeEnd) {
+ wordLength = 0;
+
+ // Look for candidate words at the current position
+ int candidates = words[wordsFound%THAI_LOOKAHEAD].candidates(text, fDictionary, rangeEnd);
+
+ // If we found exactly one, use that
+ if (candidates == 1) {
+ wordLength = words[wordsFound%THAI_LOOKAHEAD].acceptMarked(text);
+ wordsFound += 1;
+ }
+
+ // If there was more than one, see which one can take us forward the most words
+ else if (candidates > 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/source/common/dictbe.h b/source/common/dictbe.h
new file mode 100644
index 0000000..80a52f5
--- /dev/null
+++ b/source/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
+ */
+
+/**
+ * <p>DictionaryBreakEngine is a kind of LanguageBreakEngine that uses a
+ * dictionary to determine language-specific breaks.</p>
+ *
+ * <p>After it is constructed a DictionaryBreakEngine may be shared between
+ * threads without synchronization.</p>
+ */
+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;
+
+ /**
+ * <p>Default constructor.</p>
+ *
+ */
+ DictionaryBreakEngine();
+
+ public:
+
+ /**
+ * <p>Constructor setting the break types handled.</p>
+ *
+ * @param breakTypes A bitmap of types handled by the engine.
+ */
+ DictionaryBreakEngine( uint32_t breakTypes );
+
+ /**
+ * <p>Virtual destructor.</p>
+ */
+ virtual ~DictionaryBreakEngine();
+
+ /**
+ * <p>Indicate whether this engine handles a particular character for
+ * a particular kind of break.</p>
+ *
+ * @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;
+
+ /**
+ * <p>Find any breaks within a run in the supplied text.</p>
+ *
+ * @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:
+
+ /**
+ * <p>Set the character set handled by this engine.</p>
+ *
+ * @param set A UnicodeSet of the set of characters handled by the engine
+ */
+ virtual void setCharacters( UnicodeSet &set );
+
+ /**
+ * <p>Set the break types handled by this engine.</p>
+ *
+ * @param breakTypes A bitmap of types handled by the engine.
+ */
+// virtual void setBreakTypes( uint32_t breakTypes );
+
+ /**
+ * <p>Divide up a range of known dictionary characters.</p>
+ *
+ * @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
+ */
+
+/**
+ * <p>ThaiBreakEngine is a kind of DictionaryBreakEngine that uses a
+ * TrieWordDictionary and heuristics to determine Thai-specific breaks.</p>
+ *
+ * <p>After it is constructed a ThaiBreakEngine may be shared between
+ * threads without synchronization.</p>
+ */
+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:
+
+ /**
+ * <p>Default constructor.</p>
+ *
+ * @param adoptDictionary A TrieWordDictionary to adopt. Deleted when the
+ * engine is deleted.
+ */
+ ThaiBreakEngine(const TrieWordDictionary *adoptDictionary, UErrorCode &status);
+
+ /**
+ * <p>Virtual destructor.</p>
+ */
+ virtual ~ThaiBreakEngine();
+
+ protected:
+ /**
+ * <p>Divide up a range of known dictionary characters.</p>
+ *
+ * @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/source/common/hash.h b/source/common/hash.h
new file mode 100644
index 0000000..375499b
--- /dev/null
+++ b/source/common/hash.h
@@ -0,0 +1,207 @@
+/*
+******************************************************************************
+* Copyright (C) 1997-2006, International Business Machines
+* Corporation and others. All Rights Reserved.
+******************************************************************************
+* Date Name Description
+* 03/28/00 aliu Creation.
+******************************************************************************
+*/
+
+#ifndef HASH_H
+#define HASH_H
+
+#include "unicode/unistr.h"
+#include "unicode/uobject.h"
+#include "uhash.h"
+
+U_NAMESPACE_BEGIN
+
+/**
+ * Hashtable is a thin C++ wrapper around UHashtable, a general-purpose void*
+ * hashtable implemented in C. Hashtable is designed to be idiomatic and
+ * easy-to-use in C++.
+ *
+ * Hashtable is an INTERNAL CLASS.
+ */
+class U_COMMON_API Hashtable : public UMemory {
+ UHashtable* hash;
+ UHashtable hashObj;
+
+ inline void init(UHashFunction *keyHash, UKeyComparator *keyComp, UValueComparator *valueComp, UErrorCode& status);
+
+public:
+ /**
+ * Construct a hashtable
+ * @param ignoreKeyCase If true, keys are case insensitive.
+ * @param status Error code
+ */
+ 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
+ */
+ Hashtable(UErrorCode& status);
+
+ /**
+ * Construct a hashtable, _disregarding any error_. Use this constructor
+ * with caution.
+ */
+ Hashtable();
+
+ /**
+ * Non-virtual destructor; make this virtual if Hashtable is subclassed
+ * in the future.
+ */
+ ~Hashtable();
+
+ UObjectDeleter *setValueDeleter(UObjectDeleter *fn);
+
+ int32_t count() const;
+
+ void* put(const UnicodeString& key, void* value, UErrorCode& status);
+
+ int32_t puti(const UnicodeString& key, int32_t value, UErrorCode& status);
+
+ void* get(const UnicodeString& key) const;
+
+ int32_t geti(const UnicodeString& key) const;
+
+ void* remove(const UnicodeString& key);
+
+ int32_t removei(const UnicodeString& key);
+
+ void removeAll(void);
+
+ 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
+};
+
+/*********************************************************************
+ * Implementation
+ ********************************************************************/
+
+inline void Hashtable::init(UHashFunction *keyHash, UKeyComparator *keyComp,
+ UValueComparator *valueComp, UErrorCode& status) {
+ if (U_FAILURE(status)) {
+ return;
+ }
+ 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)
+{
+ init(ignoreKeyCase ? uhash_hashCaselessUnicodeString
+ : uhash_hashUnicodeString,
+ ignoreKeyCase ? uhash_compareCaselessUnicodeString
+ : uhash_compareUnicodeString,
+ NULL,
+ status);
+}
+
+inline Hashtable::Hashtable(UErrorCode& status)
+ : hash(0)
+{
+ init(uhash_hashUnicodeString, uhash_compareUnicodeString, NULL, status);
+}
+
+inline Hashtable::Hashtable()
+ : hash(0)
+{
+ UErrorCode status = U_ZERO_ERROR;
+ init(uhash_hashUnicodeString, uhash_compareUnicodeString, NULL, status);
+}
+
+inline Hashtable::~Hashtable() {
+ if (hash != NULL) {
+ uhash_close(hash);
+ }
+}
+
+inline UObjectDeleter *Hashtable::setValueDeleter(UObjectDeleter *fn) {
+ return uhash_setValueDeleter(hash, fn);
+}
+
+inline int32_t Hashtable::count() const {
+ return uhash_count(hash);
+}
+
+inline void* Hashtable::put(const UnicodeString& key, void* value, UErrorCode& status) {
+ return uhash_put(hash, new UnicodeString(key), value, &status);
+}
+
+inline int32_t Hashtable::puti(const UnicodeString& key, int32_t value, UErrorCode& status) {
+ return uhash_puti(hash, new UnicodeString(key), value, &status);
+}
+
+inline void* Hashtable::get(const UnicodeString& key) const {
+ return uhash_get(hash, &key);
+}
+
+inline int32_t Hashtable::geti(const UnicodeString& key) const {
+ return uhash_geti(hash, &key);
+}
+
+inline void* Hashtable::remove(const UnicodeString& key) {
+ return uhash_remove(hash, &key);
+}
+
+inline int32_t Hashtable::removei(const UnicodeString& key) {
+ return uhash_removei(hash, &key);
+}
+
+inline const UHashElement* Hashtable::find(const UnicodeString& key) const {
+ return uhash_find(hash, &key);
+}
+
+inline const UHashElement* Hashtable::nextElement(int32_t& pos) const {
+ return uhash_nextElement(hash, &pos);
+}
+
+inline void Hashtable::removeAll(void) {
+ 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/source/common/icucfg.h.in b/source/common/icucfg.h.in
new file mode 100644
index 0000000..98fc0ff
--- /dev/null
+++ b/source/common/icucfg.h.in
@@ -0,0 +1,61 @@
+/* common/icucfg.h.in. Generated automatically from configure.in by autoheader. */
+
+/* Define if you have the ANSI C header files. */
+#undef STDC_HEADERS
+
+/* Define if your processor stores words with the most significant
+ byte first (like Motorola and SPARC, unlike Intel and VAX). */
+#undef WORDS_BIGENDIAN
+
+/* Copyright (c) 1999-2000, International Business Machines Corporation and
+ others. All Rights Reserved. */
+/* Define to signed char if not in <sys/types.h> */
+#undef int8_t
+
+/* Define to unsigned char if not in <sys/types.h> */
+#undef uint8_t
+
+/* Define to signed short if not in <sys/types.h> */
+#undef int16_t
+
+/* Define to unsigned short if not in <sys/types.h> */
+#undef uint16_t
+
+/* Define to signed long if not in <sys/types.h> */
+#undef int32_t
+
+/* Define to unsigned long if not in <sys/types.h> */
+#undef uint32_t
+
+/* Define to signed char if not in <sys/types.h> */
+#undef bool_t
+
+/* Define if your system has <wchar.h> */
+#undef HAVE_WCHAR_H
+
+/* Define to the size of wchar_t */
+#undef SIZEOF_WCHAR_T
+
+/* Define if you have the <inttypes.h> header file. */
+#undef HAVE_INTTYPES_H
+
+/* Define if you have the cma library (-lcma). */
+#undef HAVE_LIBCMA
+
+/* Define if you have the dl library (-ldl). */
+#undef HAVE_LIBDL
+
+/* Define if you have the dld library (-ldld). */
+#undef HAVE_LIBDLD
+
+/* Define if you have the m library (-lm). */
+#undef HAVE_LIBM
+
+/* Define if you have the pthread library (-lpthread). */
+#undef HAVE_LIBPTHREAD
+
+/* Define if you have the pthreads library (-lpthreads). */
+#undef HAVE_LIBPTHREADS
+
+/* Define if you have the wcs library (-lwcs). */
+#undef HAVE_LIBWCS
diff --git a/source/common/localsvc.h b/source/common/localsvc.h
new file mode 100644
index 0000000..67e5a84
--- /dev/null
+++ b/source/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/source/common/locbased.cpp b/source/common/locbased.cpp
new file mode 100644
index 0000000..e96b9f7
--- /dev/null
+++ b/source/common/locbased.cpp
@@ -0,0 +1,46 @@
+/*
+**********************************************************************
+* Copyright (c) 2004, International Business Machines
+* Corporation and others. All Rights Reserved.
+**********************************************************************
+* Author: Alan Liu
+* Created: January 16 2004
+* Since: ICU 2.8
+**********************************************************************
+*/
+#include "locbased.h"
+#include "cstring.h"
+
+U_NAMESPACE_BEGIN
+
+Locale LocaleBased::getLocale(ULocDataLocaleType type, UErrorCode& status) const {
+ const char* id = getLocaleID(type, status);
+ return Locale((id != 0) ? id : "");
+}
+
+const char* LocaleBased::getLocaleID(ULocDataLocaleType type, UErrorCode& status) const {
+ if (U_FAILURE(status)) {
+ return NULL;
+ }
+
+ switch(type) {
+ case ULOC_VALID_LOCALE:
+ return valid;
+ case ULOC_ACTUAL_LOCALE:
+ return actual;
+ default:
+ status = U_ILLEGAL_ARGUMENT_ERROR;
+ return NULL;
+ }
+}
+
+void LocaleBased::setLocaleIDs(const char* validID, const char* actualID) {
+ if (validID != 0) {
+ uprv_strcpy(valid, validID);
+ }
+ if (actualID != 0) {
+ uprv_strcpy(actual, actualID);
+ }
+}
+
+U_NAMESPACE_END
diff --git a/source/common/locbased.h b/source/common/locbased.h
new file mode 100644
index 0000000..366b151
--- /dev/null
+++ b/source/common/locbased.h
@@ -0,0 +1,97 @@
+/*
+**********************************************************************
+* Copyright (c) 2004, International Business Machines
+* Corporation and others. All Rights Reserved.
+**********************************************************************
+* Author: Alan Liu
+* Created: January 16 2004
+* Since: ICU 2.8
+**********************************************************************
+*/
+#ifndef LOCBASED_H
+#define LOCBASED_H
+
+#include "unicode/locid.h"
+#include "unicode/uobject.h"
+
+/**
+ * Macro to declare a locale LocaleBased wrapper object for the given
+ * object, which must have two members named `validLocale' and
+ * `actualLocale'.
+ */
+#define U_LOCALE_BASED(varname, objname) \
+ LocaleBased varname((objname).validLocale, (objname).actualLocale);
+
+U_NAMESPACE_BEGIN
+
+/**
+ * A utility class that unifies the implementation of getLocale() by
+ * various ICU services. This class is likely to be removed in the
+ * ICU 3.0 time frame in favor of an integrated approach with the
+ * services framework.
+ * @since ICU 2.8
+ */
+class U_COMMON_API LocaleBased : public UMemory {
+
+ public:
+
+ /**
+ * Construct a LocaleBased wrapper around the two pointers. These
+ * will be aliased for the lifetime of this object.
+ */
+ inline LocaleBased(char* validAlias, char* actualAlias);
+
+ /**
+ * Construct a LocaleBased wrapper around the two const pointers.
+ * These will be aliased for the lifetime of this object.
+ */
+ inline LocaleBased(const char* validAlias, const char* actualAlias);
+
+ /**
+ * Return locale meta-data for the service object wrapped by this
+ * object. Either the valid or the actual locale may be
+ * retrieved.
+ * @param type either ULOC_VALID_LOCALE or ULOC_ACTUAL_LOCALE
+ * @param status input-output error code
+ * @return the indicated locale
+ */
+ Locale getLocale(ULocDataLocaleType type, UErrorCode& status) const;
+
+ /**
+ * Return the locale ID for the service object wrapped by this
+ * object. Either the valid or the actual locale may be
+ * retrieved.
+ * @param type either ULOC_VALID_LOCALE or ULOC_ACTUAL_LOCALE
+ * @param status input-output error code
+ * @return the indicated locale ID
+ */
+ const char* getLocaleID(ULocDataLocaleType type, UErrorCode& status) const;
+
+ /**
+ * Set the locale meta-data for the service object wrapped by this
+ * object. If either parameter is zero, it is ignored.
+ * @param valid the ID of the valid locale
+ * @param actual the ID of the actual locale
+ */
+ void setLocaleIDs(const char* valid, const char* actual);
+
+ private:
+
+ char* valid;
+
+ char* actual;
+};
+
+inline LocaleBased::LocaleBased(char* validAlias, char* actualAlias) :
+ valid(validAlias), actual(actualAlias) {
+}
+
+inline LocaleBased::LocaleBased(const char* validAlias,
+ const char* actualAlias) :
+ // ugh: cast away const
+ valid((char*)validAlias), actual((char*)actualAlias) {
+}
+
+U_NAMESPACE_END
+
+#endif
diff --git a/source/common/locid.cpp b/source/common/locid.cpp
new file mode 100644
index 0000000..cb8d59e
--- /dev/null
+++ b/source/common/locid.cpp
@@ -0,0 +1,1301 @@
+/*
+ **********************************************************************
+ * Copyright (C) 1997-2006, International Business Machines
+ * Corporation and others. All Rights Reserved.
+ **********************************************************************
+*
+* File locid.cpp
+*
+* Created by: Richard Gillam
+*
+* Modification History:
+*
+* Date Name Description
+* 02/11/97 aliu Changed gLocPath to fgDataDirectory and added
+* methods to get and set it.
+* 04/02/97 aliu Made operator!= inline; fixed return value
+* of getName().
+* 04/15/97 aliu Cleanup for AIX/Win32.
+* 04/24/97 aliu Numerous changes per code review.
+* 08/18/98 stephen Changed getDisplayName()
+* Added SIMPLIFIED_CHINESE, TRADITIONAL_CHINESE
+* Added getISOCountries(), getISOLanguages(),
+* getLanguagesForCountry()
+* 03/16/99 bertrand rehaul.
+* 07/21/99 stephen Added U_CFUNC setDefault
+* 11/09/99 weiv Added const char * getName() const;
+* 04/12/00 srl removing unicodestring api's and cached hash code
+* 08/10/01 grhoten Change the static Locales to accessor functions
+******************************************************************************
+*/
+
+
+#include "unicode/locid.h"
+#include "unicode/uloc.h"
+#include "umutex.h"
+#include "uassert.h"
+#include "cmemory.h"
+#include "cstring.h"
+#include "uhash.h"
+#include "ucln_cmn.h"
+
+#define LENGTHOF(array) (int32_t)(sizeof(array)/sizeof((array)[0]))
+
+static Locale* availableLocaleList = NULL;
+static int32_t availableLocaleListCount;
+typedef enum ELocalePos {
+ eENGLISH,
+ eFRENCH,
+ eGERMAN,
+ eITALIAN,
+ eJAPANESE,
+ eKOREAN,
+ eCHINESE,
+
+ eFRANCE,
+ eGERMANY,
+ eITALY,
+ eJAPAN,
+ eKOREA,
+ eCHINA, /* Alias for PRC */
+ eTAIWAN,
+ eUK,
+ eUS,
+ eCANADA,
+ eCANADA_FRENCH,
+
+
+ //eDEFAULT,
+ eMAX_LOCALES
+} ELocalePos;
+
+U_CFUNC int32_t locale_getKeywords(const char *localeID,
+ char prev,
+ char *keywords, int32_t keywordCapacity,
+ char *values, int32_t valuesCapacity, int32_t *valLen,
+ UBool valuesToo,
+ UErrorCode *status);
+
+static Locale *gLocaleCache = NULL;
+static const Locale *gDefaultLocale = NULL;
+static UHashtable *gDefaultLocalesHashT = NULL;
+
+U_CDECL_BEGIN
+//
+// Deleter function for Locales owned by the default Locale hash table/
+//
+static void U_CALLCONV
+deleteLocale(void *obj) {
+ delete (Locale *) obj;
+}
+
+static UBool U_CALLCONV locale_cleanup(void)
+{
+ U_NAMESPACE_USE
+
+ if (availableLocaleList) {
+ delete []availableLocaleList;
+ availableLocaleList = NULL;
+ }
+ availableLocaleListCount = 0;
+
+ if (gLocaleCache) {
+ delete [] gLocaleCache;
+ gLocaleCache = NULL;
+ }
+
+ if (gDefaultLocalesHashT) {
+ uhash_close(gDefaultLocalesHashT); // Automatically deletes all elements, using deleter func.
+ gDefaultLocalesHashT = NULL;
+ }
+ gDefaultLocale = NULL;
+
+ return TRUE;
+}
+U_CDECL_END
+
+U_NAMESPACE_BEGIN
+UOBJECT_DEFINE_RTTI_IMPLEMENTATION(Locale)
+
+//
+// locale_set_default_internal.
+//
+void locale_set_default_internal(const char *id)
+{
+ U_NAMESPACE_USE
+ UErrorCode status = U_ZERO_ERROR;
+ UBool canonicalize = FALSE;
+
+ // If given a NULL string for the locale id, grab the default
+ // name from the system.
+ // (Different from most other locale APIs, where a null name means use
+ // the current ICU default locale.)
+ if (id == NULL) {
+ umtx_lock(NULL);
+ id = uprv_getDefaultLocaleID();
+ umtx_unlock(NULL);
+ canonicalize = TRUE; // always canonicalize host ID
+ }
+
+ // put the locale id into a canonical form,
+ // in preparation for looking up this locale in the hash table of
+ // already-created locale objects.
+ //
+ status = U_ZERO_ERROR;
+ char localeNameBuf[512];
+
+ if (canonicalize) {
+ uloc_canonicalize(id, localeNameBuf, sizeof(localeNameBuf)-1, &status);
+ } else {
+ uloc_getName(id, localeNameBuf, sizeof(localeNameBuf)-1, &status);
+ }
+ localeNameBuf[sizeof(localeNameBuf)-1] = 0; // Force null termination in event of
+ // a long name filling the buffer.
+ // (long names are truncated.)
+
+ // Lazy creation of the hash table itself, if needed.
+ //
+ umtx_lock(NULL);
+ UBool hashTableNeedsInit = (gDefaultLocalesHashT == NULL);
+ umtx_unlock(NULL);
+ if (hashTableNeedsInit) {
+ status = U_ZERO_ERROR;
+ UHashtable *tHashTable = uhash_open(uhash_hashChars, uhash_compareChars, NULL, &status);
+ if (U_FAILURE(status)) {
+ return;
+ }
+ uhash_setValueDeleter(tHashTable, deleteLocale);
+ umtx_lock(NULL);
+ if (gDefaultLocalesHashT == NULL) {
+ gDefaultLocalesHashT = tHashTable;
+ ucln_common_registerCleanup(UCLN_COMMON_LOCALE, locale_cleanup);
+ umtx_unlock(NULL);
+ } else {
+ umtx_unlock(NULL);
+ uhash_close(tHashTable);
+ }
+ }
+
+ // Hash table lookup, key is the locale full name
+ umtx_lock(NULL);
+ Locale *newDefault = (Locale *)uhash_get(gDefaultLocalesHashT, localeNameBuf);
+ if (newDefault != NULL) {
+ // We have the requested locale in the hash table already.
+ // Just set it as default. Inside the mutex lock, for those troublesome processors.
+ gDefaultLocale = newDefault;
+ umtx_unlock(NULL);
+ } else {
+ umtx_unlock(NULL);
+ // We haven't seen this locale id before.
+ // Create a new Locale object for it.
+ newDefault = new Locale(Locale::eBOGUS);
+ if (newDefault == NULL) {
+ // No way to report errors from here.
+ return;
+ }
+ newDefault->init(localeNameBuf, FALSE);
+
+ // Add newly created Locale to the hash table of default Locales
+ const char *key = newDefault->getName();
+ U_ASSERT(uprv_strcmp(key, localeNameBuf) == 0);
+ umtx_lock(NULL);
+ const Locale *hashTableVal = (const Locale *)uhash_get(gDefaultLocalesHashT, key);
+ if (hashTableVal == NULL) {
+ uhash_put(gDefaultLocalesHashT, (void *)key, newDefault, &status);
+ gDefaultLocale = newDefault;
+ umtx_unlock(NULL);
+ // ignore errors from hash table insert. (Couldn't do anything anyway)
+ // We can still set the default Locale,
+ // it just wont be cached, and will eventually leak.
+ } else {
+ // Some other thread raced us through here, and got the new Locale
+ // into the hash table before us. Use that one.
+ gDefaultLocale = hashTableVal; // Assignment to gDefaultLocale must happen inside mutex
+ umtx_unlock(NULL);
+ delete newDefault;
+ }
+ }
+}
+U_NAMESPACE_END
+
+
+/* sfb 07/21/99 */
+U_CFUNC void
+locale_set_default(const char *id)
+{
+ U_NAMESPACE_USE
+ locale_set_default_internal(id);
+}
+/* end */
+
+U_CFUNC const char *
+locale_get_default(void)
+{
+ U_NAMESPACE_USE
+
+ return Locale::getDefault().getName();
+}
+
+
+U_NAMESPACE_BEGIN
+
+/*Character separating the posix id fields*/
+// '_'
+// In the platform codepage.
+#define SEP_CHAR '_'
+
+Locale::~Locale()
+{
+ /*if fullName is on the heap, we free it*/
+ if (fullName != fullNameBuffer)
+ {
+ uprv_free(fullName);
+ fullName = NULL;
+ }
+ if (baseName && baseName != baseNameBuffer) {
+ uprv_free(baseName);
+ baseName = NULL;
+ }
+}
+
+Locale::Locale()
+ : UObject(), fullName(fullNameBuffer), baseName(NULL)
+{
+ init(NULL, FALSE);
+}
+
+/*
+ * Internal constructor to allow construction of a locale object with
+ * NO side effects. (Default constructor tries to get
+ * the default locale.)
+ */
+Locale::Locale(Locale::ELocaleType)
+ : UObject(), fullName(fullNameBuffer), baseName(NULL)
+{
+ setToBogus();
+}
+
+
+Locale::Locale( const char * newLanguage,
+ const char * newCountry,
+ const char * newVariant,
+ const char * newKeywords)
+ : UObject(), fullName(fullNameBuffer), baseName(NULL)
+{
+ if( (newLanguage==NULL) && (newCountry == NULL) && (newVariant == NULL) )
+ {
+ init(NULL, FALSE); /* shortcut */
+ }
+ else
+ {
+ char togo_stack[ULOC_FULLNAME_CAPACITY];
+ char *togo;
+ char *togo_heap = NULL;
+ int32_t size = 0;
+ int32_t lsize = 0;
+ int32_t csize = 0;
+ int32_t vsize = 0;
+ int32_t ksize = 0;
+ char *p;
+
+ // Calculate the size of the resulting string.
+
+ // Language
+ if ( newLanguage != NULL )
+ {
+ lsize = (int32_t)uprv_strlen(newLanguage);
+ size = lsize;
+ }
+
+ // _Country
+ if ( newCountry != NULL )
+ {
+ csize = (int32_t)uprv_strlen(newCountry);
+ size += csize;
+ }
+
+ // _Variant
+ if ( newVariant != NULL )
+ {
+ // remove leading _'s
+ while(newVariant[0] == SEP_CHAR)
+ {
+ newVariant++;
+ }
+
+ // remove trailing _'s
+ vsize = (int32_t)uprv_strlen(newVariant);
+ while( (vsize>1) && (newVariant[vsize-1] == SEP_CHAR) )
+ {
+ vsize--;
+ }
+ }
+
+ if( vsize > 0 )
+ {
+ size += vsize;
+ }
+
+ // Separator rules:
+ if ( vsize > 0 )
+ {
+ size += 2; // at least: __v
+ }
+ else if ( csize > 0 )
+ {
+ size += 1; // at least: _v
+ }
+
+ if ( newKeywords != NULL)
+ {
+ ksize = (int32_t)uprv_strlen(newKeywords);
+ size += ksize + 1;
+ }
+
+
+ // NOW we have the full locale string..
+
+ /*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)
+ {
+ togo_heap = (char *)uprv_malloc(sizeof(char)*(size+1));
+ togo = togo_heap;
+ }
+ else
+ {
+ togo = togo_stack;
+ }
+
+ togo[0] = 0;
+
+ // Now, copy it back.
+ p = togo;
+ if ( lsize != 0 )
+ {
+ uprv_strcpy(p, newLanguage);
+ p += lsize;
+ }
+
+ if ( ( vsize != 0 ) || (csize != 0) ) // at least: __v
+ { // ^
+ *p++ = SEP_CHAR;
+ }
+
+ if ( csize != 0 )
+ {
+ uprv_strcpy(p, newCountry);
+ p += csize;
+ }
+
+ if ( vsize != 0)
+ {
+ *p++ = SEP_CHAR; // at least: __v
+
+ uprv_strncpy(p, newVariant, vsize); // Must use strncpy because
+ p += vsize; // of trimming (above).
+ *p = 0; // terminate
+ }
+
+ if ( ksize != 0)
+ {
+ if (uprv_strchr(newKeywords, '=')) {
+ *p++ = '@'; /* keyword parsing */
+ }
+ else {
+ *p++ = '_'; /* Variant parsing with a script */
+ if ( vsize == 0) {
+ *p++ = '_'; /* No country found */
+ }
+ }
+ uprv_strcpy(p, newKeywords);
+ p += ksize;
+ }
+
+ // Parse it, because for example 'language' might really be a complete
+ // string.
+ init(togo, FALSE);
+
+ if (togo_heap) {
+ uprv_free(togo_heap);
+ }
+ }
+}
+
+Locale::Locale(const Locale &other)
+ : UObject(other), fullName(fullNameBuffer), baseName(NULL)
+{
+ *this = other;
+}
+
+Locale &Locale::operator=(const Locale &other)
+{
+ if (this == &other) {
+ return *this;
+ }
+
+ if (&other == NULL) {
+ this->setToBogus();
+ return *this;
+ }
+
+ /* Free our current storage */
+ if(fullName != fullNameBuffer) {
+ uprv_free(fullName);
+ fullName = fullNameBuffer;
+ }
+
+ /* Allocate the full name if necessary */
+ if(other.fullName != other.fullNameBuffer) {
+ fullName = (char *)uprv_malloc(sizeof(char)*(uprv_strlen(other.fullName)+1));
+ }
+ /* Copy the full name */
+ uprv_strcpy(fullName, other.fullName);
+
+ /* baseName is the cached result of getBaseName. if 'other' has a
+ baseName and it fits in baseNameBuffer, then copy it. otherwise set
+ it to NULL, and let the user lazy-create it (in getBaseName) if they
+ want it. */
+ if(baseName && baseName != baseNameBuffer) {
+ uprv_free(baseName);
+ }
+ baseName = NULL;
+
+ if(other.baseName == other.baseNameBuffer) {
+ uprv_strcpy(baseNameBuffer, other.baseNameBuffer);
+ baseName = baseNameBuffer;
+ }
+
+ /* Copy the language and country fields */
+ uprv_strcpy(language, other.language);
+ uprv_strcpy(script, other.script);
+ uprv_strcpy(country, other.country);
+
+ /* The variantBegin is an offset into fullName, just copy it */
+ variantBegin = other.variantBegin;
+ fIsBogus = other.fIsBogus;
+ return *this;
+}
+
+Locale *
+Locale::clone() const {
+ return new Locale(*this);
+}
+
+UBool
+Locale::operator==( const Locale& other) const
+{
+ return (uprv_strcmp(other.fullName, fullName) == 0);
+}
+
+/*This function initializes a Locale from a C locale ID*/
+Locale& Locale::init(const char* localeID, UBool canonicalize)
+{
+ fIsBogus = FALSE;
+ /* Free our current storage */
+ if(fullName != fullNameBuffer) {
+ uprv_free(fullName);
+ fullName = fullNameBuffer;
+ }
+
+ if(baseName && baseName != baseNameBuffer) {
+ uprv_free(baseName);
+ baseName = NULL;
+ }
+
+ // not a loop:
+ // just an easy way to have a common error-exit
+ // without goto and without another function
+ do {
+ char *separator;
+ char *field[5] = {0};
+ int32_t fieldLen[5] = {0};
+ int32_t fieldIdx;
+ int32_t variantField;
+ int32_t length;
+ UErrorCode err;
+
+ if(localeID == NULL) {
+ // not an error, just set the default locale
+ return *this = getDefault();
+ }
+
+ /* preset all fields to empty */
+ language[0] = script[0] = country[0] = 0;
+
+ // "canonicalize" the locale ID to ICU/Java format
+ err = U_ZERO_ERROR;
+ length = canonicalize ?
+ uloc_canonicalize(localeID, fullName, sizeof(fullNameBuffer), &err) :
+ uloc_getName(localeID, fullName, sizeof(fullNameBuffer), &err);
+
+ if(err == U_BUFFER_OVERFLOW_ERROR || length >= (int32_t)sizeof(fullNameBuffer)) {
+ /*Go to heap for the fullName if necessary*/
+ fullName = (char *)uprv_malloc(sizeof(char)*(length + 1));
+ if(fullName == 0) {
+ fullName = fullNameBuffer;
+ break; // error: out of memory
+ }
+ err = U_ZERO_ERROR;
+ length = canonicalize ?
+ uloc_canonicalize(localeID, fullName, length+1, &err) :
+ uloc_getName(localeID, fullName, length+1, &err);
+ }
+ if(U_FAILURE(err) || err == U_STRING_NOT_TERMINATED_WARNING) {
+ /* should never occur */
+ break;
+ }
+
+ variantBegin = length;
+
+ /* after uloc_getName/canonicalize() we know that only '_' are separators */
+ separator = field[0] = fullName;
+ 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] = (int32_t)(separator - field[fieldIdx-1]);
+ fieldIdx++;
+ }
+ // variant may contain @foo or .foo POSIX cruft; remove it
+ separator = uprv_strchr(field[fieldIdx-1], '@');
+ char* sep2 = uprv_strchr(field[fieldIdx-1], '.');
+ if (separator!=NULL || sep2!=NULL) {
+ if (separator==NULL || (sep2!=NULL && separator > sep2)) {
+ separator = sep2;
+ }
+ fieldLen[fieldIdx-1] = (int32_t)(separator - field[fieldIdx-1]);
+ } else {
+ fieldLen[fieldIdx-1] = length - (int32_t)(field[fieldIdx-1] - fullName);
+ }
+
+ if (fieldLen[0] >= (int32_t)(sizeof(language))
+ || (fieldLen[1] == 4 && fieldLen[2] >= (int32_t)(sizeof(country)))
+ || (fieldLen[1] != 4 && fieldLen[1] >= (int32_t)(sizeof(country))))
+ {
+ break; // error: one of the fields is too long
+ }
+
+ variantField = 2; /* Usually the 2nd one, except when a script is used. */
+ if (fieldLen[0] > 0) {
+ /* We have a language */
+ uprv_memcpy(language, fullName, fieldLen[0]);
+ language[fieldLen[0]] = 0;
+ }
+ if (fieldLen[1] == 4) {
+ /* We have at least a script */
+ uprv_memcpy(script, field[1], fieldLen[1]);
+ script[fieldLen[1]] = 0;
+ variantField = 3;
+ if (fieldLen[2] > 0) {
+ /* We have a country */
+ uprv_memcpy(country, field[2], fieldLen[2]);
+ country[fieldLen[2]] = 0;
+ }
+ }
+ else if (fieldLen[1] > 0) {
+ /* We have a country and no script */
+ uprv_memcpy(country, field[1], fieldLen[1]);
+ country[fieldLen[1]] = 0;
+ }
+ if (variantField > 0 && fieldLen[variantField] > 0) {
+ /* We have a variant */
+ variantBegin = (int32_t)(field[variantField] - fullName);
+ }
+
+ // successful end of init()
+ return *this;
+ } while(0); /*loop doesn't iterate*/
+
+ // when an error occurs, then set this object to "bogus" (there is no UErrorCode here)
+ setToBogus();
+
+ return *this;
+}
+
+int32_t
+Locale::hashCode() const
+{
+ UHashTok hashKey;
+ hashKey.pointer = fullName;
+ return uhash_hashChars(hashKey);
+}
+
+void
+Locale::setToBogus() {
+ /* Free our current storage */
+ if(fullName != fullNameBuffer) {
+ uprv_free(fullName);
+ fullName = fullNameBuffer;
+ }
+ *fullNameBuffer = 0;
+ *language = 0;
+ *script = 0;
+ *country = 0;
+ fIsBogus = TRUE;
+}
+
+const Locale& U_EXPORT2
+Locale::getDefault()
+{
+ const Locale *retLocale;
+ umtx_lock(NULL);
+ retLocale = gDefaultLocale;
+ umtx_unlock(NULL);
+ if (retLocale == NULL) {
+ locale_set_default_internal(NULL);
+ umtx_lock(NULL);
+ // Need a mutex in case some other thread set a new
+ // default inbetween when we set and when we get the new default. For
+ // processors with weak memory coherency, we might not otherwise see all
+ // of the newly created new default locale.
+ retLocale = gDefaultLocale;
+ umtx_unlock(NULL);
+ }
+ return *retLocale;
+}
+
+
+
+void U_EXPORT2
+Locale::setDefault( const Locale& newLocale,
+ UErrorCode& status)
+{
+ if (U_FAILURE(status)) {
+ return;
+ }
+
+ /* Set the default from the full name string of the supplied locale.
+ * This is a convenient way to access the default locale caching mechanisms.
+ */
+ const char *localeID = newLocale.getName();
+ locale_set_default_internal(localeID);
+}
+
+Locale U_EXPORT2
+Locale::createFromName (const char *name)
+{
+ if (name) {
+ Locale l("");
+ l.init(name, FALSE);
+ return l;
+ }
+ else {
+ return getDefault();
+ }
+}
+
+Locale U_EXPORT2
+Locale::createCanonical(const char* name) {
+ Locale loc("");
+ loc.init(name, TRUE);
+ return loc;
+}
+
+const char *
+Locale::getISO3Language() const
+{
+ return uloc_getISO3Language(fullName);
+}
+
+
+const char *
+Locale::getISO3Country() const
+{
+ return uloc_getISO3Country(fullName);
+}
+
+/**
+ * Return the LCID value as specified in the "LocaleID" resource for this
+ * locale. The LocaleID must be expressed as a hexadecimal number, from
+ * one to four digits. If the LocaleID resource is not present, or is
+ * in an incorrect format, 0 is returned. The LocaleID is for use in
+ * Windows (it is an LCID), but is available on all platforms.
+ */
+uint32_t
+Locale::getLCID() const
+{
+ return uloc_getLCID(fullName);
+}
+
+UnicodeString&
+Locale::getDisplayLanguage(UnicodeString& dispLang) const
+{
+ return this->getDisplayLanguage(getDefault(), dispLang);
+}
+
+/*We cannot make any assumptions on the size of the output display strings
+* Yet, since we are calling through to a C API, we need to set limits on
+* buffer size. For all the following getDisplay functions we first attempt
+* to fill up a stack allocated buffer. If it is to small we heap allocated
+* the exact buffer we need copy it to the UnicodeString and delete it*/
+
+UnicodeString&
+Locale::getDisplayLanguage(const Locale &displayLocale,
+ UnicodeString &result) const {
+ UChar *buffer;
+ UErrorCode errorCode=U_ZERO_ERROR;
+ int32_t length;
+
+ buffer=result.getBuffer(ULOC_FULLNAME_CAPACITY);
+ if(buffer==0) {
+ result.truncate(0);
+ return result;
+ }
+
+ length=uloc_getDisplayLanguage(fullName, displayLocale.fullName,
+ buffer, result.getCapacity(),
+ &errorCode);
+ result.releaseBuffer(U_SUCCESS(errorCode) ? length : 0);
+
+ if(errorCode==U_BUFFER_OVERFLOW_ERROR) {
+ buffer=result.getBuffer(length);
+ if(buffer==0) {
+ result.truncate(0);
+ return result;
+ }
+ errorCode=U_ZERO_ERROR;
+ length=uloc_getDisplayLanguage(fullName, displayLocale.fullName,
+ buffer, result.getCapacity(),
+ &errorCode);
+ result.releaseBuffer(U_SUCCESS(errorCode) ? length : 0);
+ }
+
+ return result;
+}
+
+UnicodeString&
+Locale::getDisplayScript(UnicodeString& dispScript) const
+{
+ return this->getDisplayScript(getDefault(), dispScript);
+}
+
+UnicodeString&
+Locale::getDisplayScript(const Locale &displayLocale,
+ UnicodeString &result) const {
+ UChar *buffer;
+ UErrorCode errorCode=U_ZERO_ERROR;
+ int32_t length;
+
+ buffer=result.getBuffer(ULOC_FULLNAME_CAPACITY);
+ if(buffer==0) {
+ result.truncate(0);
+ return result;
+ }
+
+ length=uloc_getDisplayScript(fullName, displayLocale.fullName,
+ buffer, result.getCapacity(),
+ &errorCode);
+ result.releaseBuffer(U_SUCCESS(errorCode) ? length : 0);
+
+ if(errorCode==U_BUFFER_OVERFLOW_ERROR) {
+ buffer=result.getBuffer(length);
+ if(buffer==0) {
+ result.truncate(0);
+ return result;
+ }
+ errorCode=U_ZERO_ERROR;
+ length=uloc_getDisplayScript(fullName, displayLocale.fullName,
+ buffer, result.getCapacity(),
+ &errorCode);
+ result.releaseBuffer(U_SUCCESS(errorCode) ? length : 0);
+ }
+
+ return result;
+}
+
+UnicodeString&
+Locale::getDisplayCountry(UnicodeString& dispCntry) const
+{
+ return this->getDisplayCountry(getDefault(), dispCntry);
+}
+
+UnicodeString&
+Locale::getDisplayCountry(const Locale &displayLocale,
+ UnicodeString &result) const {
+ UChar *buffer;
+ UErrorCode errorCode=U_ZERO_ERROR;
+ int32_t length;
+
+ buffer=result.getBuffer(ULOC_FULLNAME_CAPACITY);
+ if(buffer==0) {
+ result.truncate(0);
+ return result;
+ }
+
+ length=uloc_getDisplayCountry(fullName, displayLocale.fullName,
+ buffer, result.getCapacity(),
+ &errorCode);
+ result.releaseBuffer(U_SUCCESS(errorCode) ? length : 0);
+
+ if(errorCode==U_BUFFER_OVERFLOW_ERROR) {
+ buffer=result.getBuffer(length);
+ if(buffer==0) {
+ result.truncate(0);
+ return result;
+ }
+ errorCode=U_ZERO_ERROR;
+ length=uloc_getDisplayCountry(fullName, displayLocale.fullName,
+ buffer, result.getCapacity(),
+ &errorCode);
+ result.releaseBuffer(U_SUCCESS(errorCode) ? length : 0);
+ }
+
+ return result;
+}
+
+UnicodeString&
+Locale::getDisplayVariant(UnicodeString& dispVar) const
+{
+ return this->getDisplayVariant(getDefault(), dispVar);
+}
+
+UnicodeString&
+Locale::getDisplayVariant(const Locale &displayLocale,
+ UnicodeString &result) const {
+ UChar *buffer;
+ UErrorCode errorCode=U_ZERO_ERROR;
+ int32_t length;
+
+ buffer=result.getBuffer(ULOC_FULLNAME_CAPACITY);
+ if(buffer==0) {
+ result.truncate(0);
+ return result;
+ }
+
+ length=uloc_getDisplayVariant(fullName, displayLocale.fullName,
+ buffer, result.getCapacity(),
+ &errorCode);
+ result.releaseBuffer(U_SUCCESS(errorCode) ? length : 0);
+
+ if(errorCode==U_BUFFER_OVERFLOW_ERROR) {
+ buffer=result.getBuffer(length);
+ if(buffer==0) {
+ result.truncate(0);
+ return result;
+ }
+ errorCode=U_ZERO_ERROR;
+ length=uloc_getDisplayVariant(fullName, displayLocale.fullName,
+ buffer, result.getCapacity(),
+ &errorCode);
+ result.releaseBuffer(U_SUCCESS(errorCode) ? length : 0);
+ }
+
+ return result;
+}
+
+UnicodeString&
+Locale::getDisplayName( UnicodeString& name ) const
+{
+ return this->getDisplayName(getDefault(), name);
+}
+
+UnicodeString&
+Locale::getDisplayName(const Locale &displayLocale,
+ UnicodeString &result) const {
+ UChar *buffer;
+ UErrorCode errorCode=U_ZERO_ERROR;
+ int32_t length;
+
+ buffer=result.getBuffer(ULOC_FULLNAME_CAPACITY);
+ if(buffer==0) {
+ result.truncate(0);
+ return result;
+ }
+
+ length=uloc_getDisplayName(fullName, displayLocale.fullName,
+ buffer, result.getCapacity(),
+ &errorCode);
+ result.releaseBuffer(U_SUCCESS(errorCode) ? length : 0);
+
+ if(errorCode==U_BUFFER_OVERFLOW_ERROR) {
+ buffer=result.getBuffer(length);
+ if(buffer==0) {
+ result.truncate(0);
+ return result;
+ }
+ errorCode=U_ZERO_ERROR;
+ length=uloc_getDisplayName(fullName, displayLocale.fullName,
+ buffer, result.getCapacity(),
+ &errorCode);
+ result.releaseBuffer(U_SUCCESS(errorCode) ? length : 0);
+ }
+
+ return result;
+}
+const Locale* U_EXPORT2
+Locale::getAvailableLocales(int32_t& count)
+{
+ // for now, there is a hardcoded list, so just walk through that list and set it up.
+ umtx_lock(NULL);
+ UBool needInit = availableLocaleList == 0;
+ umtx_unlock(NULL);
+
+ if (needInit) {
+ int32_t locCount = uloc_countAvailable();
+ Locale *newLocaleList = 0;
+ if(locCount) {
+ newLocaleList = new Locale[locCount];
+ }
+ if (newLocaleList == NULL) {
+ count = 0;
+ return NULL;
+ }
+
+ count = locCount;
+
+ while(--locCount >= 0) {
+ newLocaleList[locCount].setFromPOSIXID(uloc_getAvailable(locCount));
+ }
+
+ umtx_lock(NULL);
+ if(availableLocaleList == 0) {
+ availableLocaleListCount = count;
+ availableLocaleList = newLocaleList;
+ newLocaleList = NULL;
+ ucln_common_registerCleanup(UCLN_COMMON_LOCALE, locale_cleanup);
+ }
+ umtx_unlock(NULL);
+ delete []newLocaleList;
+ }
+ count = availableLocaleListCount;
+ return availableLocaleList;
+}
+
+const char* const* U_EXPORT2 Locale::getISOCountries()
+{
+ return uloc_getISOCountries();
+}
+
+const char* const* U_EXPORT2 Locale::getISOLanguages()
+{
+ return uloc_getISOLanguages();
+}
+
+// Set the locale's data based on a posix id.
+void Locale::setFromPOSIXID(const char *posixID)
+{
+ init(posixID, TRUE);
+}
+
+const Locale & U_EXPORT2
+Locale::getEnglish(void)
+{
+ return getLocale(eENGLISH);
+}
+
+const Locale & U_EXPORT2
+Locale::getFrench(void)
+{
+ return getLocale(eFRENCH);
+}
+
+const Locale & U_EXPORT2
+Locale::getGerman(void)
+{
+ return getLocale(eGERMAN);
+}
+
+const Locale & U_EXPORT2
+Locale::getItalian(void)
+{
+ return getLocale(eITALIAN);
+}
+
+const Locale & U_EXPORT2
+Locale::getJapanese(void)
+{
+ return getLocale(eJAPANESE);
+}
+
+const Locale & U_EXPORT2
+Locale::getKorean(void)
+{
+ return getLocale(eKOREAN);
+}
+
+const Locale & U_EXPORT2
+Locale::getChinese(void)
+{
+ return getLocale(eCHINESE);
+}
+
+const Locale & U_EXPORT2
+Locale::getSimplifiedChinese(void)
+{
+ return getLocale(eCHINA);
+}
+
+const Locale & U_EXPORT2
+Locale::getTraditionalChinese(void)
+{
+ return getLocale(eTAIWAN);
+}
+
+
+const Locale & U_EXPORT2
+Locale::getFrance(void)
+{
+ return getLocale(eFRANCE);
+}
+
+const Locale & U_EXPORT2
+Locale::getGermany(void)
+{
+ return getLocale(eGERMANY);
+}
+
+const Locale & U_EXPORT2
+Locale::getItaly(void)
+{
+ return getLocale(eITALY);
+}
+
+const Locale & U_EXPORT2
+Locale::getJapan(void)
+{
+ return getLocale(eJAPAN);
+}
+
+const Locale & U_EXPORT2
+Locale::getKorea(void)
+{
+ return getLocale(eKOREA);
+}
+
+const Locale & U_EXPORT2
+Locale::getChina(void)
+{
+ return getLocale(eCHINA);
+}
+
+const Locale & U_EXPORT2
+Locale::getPRC(void)
+{
+ return getLocale(eCHINA);
+}
+
+const Locale & U_EXPORT2
+Locale::getTaiwan(void)
+{
+ return getLocale(eTAIWAN);
+}
+
+const Locale & U_EXPORT2
+Locale::getUK(void)
+{
+ return getLocale(eUK);
+}
+
+const Locale & U_EXPORT2
+Locale::getUS(void)
+{
+ return getLocale(eUS);
+}
+
+const Locale & U_EXPORT2
+Locale::getCanada(void)
+{
+ return getLocale(eCANADA);
+}
+
+const Locale & U_EXPORT2
+Locale::getCanadaFrench(void)
+{
+ return getLocale(eCANADA_FRENCH);
+}
+
+const Locale &
+Locale::getLocale(int locid)
+{
+ Locale *localeCache = getLocaleCache();
+ 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]; /*operating on NULL*/
+}
+
+/*
+This function is defined this way in order to get around static
+initialization and static destruction.
+ */
+Locale *
+Locale::getLocaleCache(void)
+{
+ umtx_lock(NULL);
+ UBool needInit = (gLocaleCache == NULL);
+ umtx_unlock(NULL);
+
+ if (needInit) {
+ Locale *tLocaleCache = new Locale[(int)eMAX_LOCALES];
+ if (tLocaleCache == NULL) {
+ return NULL;
+ }
+ tLocaleCache[eENGLISH] = Locale("en");
+ tLocaleCache[eFRENCH] = Locale("fr");
+ tLocaleCache[eGERMAN] = Locale("de");
+ tLocaleCache[eITALIAN] = Locale("it");
+ tLocaleCache[eJAPANESE] = Locale("ja");
+ tLocaleCache[eKOREAN] = Locale("ko");
+ tLocaleCache[eCHINESE] = Locale("zh");
+ tLocaleCache[eFRANCE] = Locale("fr", "FR");
+ tLocaleCache[eGERMANY] = Locale("de", "DE");
+ tLocaleCache[eITALY] = Locale("it", "IT");
+ tLocaleCache[eJAPAN] = Locale("ja", "JP");
+ tLocaleCache[eKOREA] = Locale("ko", "KR");
+ tLocaleCache[eCHINA] = Locale("zh", "CN");
+ tLocaleCache[eTAIWAN] = Locale("zh", "TW");
+ tLocaleCache[eUK] = Locale("en", "GB");
+ tLocaleCache[eUS] = Locale("en", "US");
+ tLocaleCache[eCANADA] = Locale("en", "CA");
+ tLocaleCache[eCANADA_FRENCH] = Locale("fr", "CA");
+
+ umtx_lock(NULL);
+ if (gLocaleCache == NULL) {
+ gLocaleCache = tLocaleCache;
+ tLocaleCache = NULL;
+ ucln_common_registerCleanup(UCLN_COMMON_LOCALE, locale_cleanup);
+ }
+ umtx_unlock(NULL);
+ if (tLocaleCache) {
+ delete [] tLocaleCache; // Fancy array delete will destruct each member.
+ }
+ }
+ return gLocaleCache;
+}
+
+class KeywordEnumeration : public StringEnumeration {
+private:
+ char *keywords;
+ char *current;
+ int32_t length;
+ UnicodeString currUSKey;
+ static const char fgClassID;/* Warning this is used beyond the typical RTTI usage. */
+
+public:
+ static UClassID U_EXPORT2 getStaticClassID(void) { return (UClassID)&fgClassID; }
+ virtual UClassID getDynamicClassID(void) const { return getStaticClassID(); }
+public:
+ KeywordEnumeration(const char *keys, int32_t keywordLen, int32_t currentIndex, UErrorCode &status)
+ : keywords((char *)&fgClassID), current((char *)&fgClassID), length(0) {
+ if(U_SUCCESS(status) && keywordLen != 0) {
+ if(keys == NULL || keywordLen < 0) {
+ status = U_ILLEGAL_ARGUMENT_ERROR;
+ } else {
+ keywords = (char *)uprv_malloc(keywordLen+1);
+ if (keywords == NULL) {
+ status = U_MEMORY_ALLOCATION_ERROR;
+ }
+ else {
+ uprv_memcpy(keywords, keys, keywordLen);
+ keywords[keywordLen] = 0;
+ current = keywords + currentIndex;
+ length = keywordLen;
+ }
+ }
+ }
+ }
+
+ virtual ~KeywordEnumeration() {
+ uprv_free(keywords);
+ }
+
+ virtual StringEnumeration * clone() const
+ {
+ UErrorCode status = U_ZERO_ERROR;
+ return new KeywordEnumeration(keywords, length, (int32_t)(current - keywords), status);
+ }
+
+ virtual int32_t count(UErrorCode &/*status*/) const {
+ char *kw = keywords;
+ int32_t result = 0;
+ while(*kw) {
+ result++;
+ kw += uprv_strlen(kw)+1;
+ }
+ return result;
+ }
+
+ virtual const char* next(int32_t* resultLength, UErrorCode& status) {
+ const char* result;
+ int32_t len;
+ if(U_SUCCESS(status) && *current != 0) {
+ result = current;
+ len = (int32_t)uprv_strlen(current);
+ current += len+1;
+ if(resultLength != NULL) {
+ *resultLength = len;
+ }
+ } else {
+ if(resultLength != NULL) {
+ *resultLength = 0;
+ }
+ result = NULL;
+ }
+ return result;
+ }
+
+ virtual const UnicodeString* snext(UErrorCode& status) {
+ int32_t resultLength = 0;
+ const char *s = next(&resultLength, status);
+ return setChars(s, resultLength, status);
+ }
+
+ virtual void reset(UErrorCode& /*status*/) {
+ current = keywords;
+ }
+};
+
+const char KeywordEnumeration::fgClassID = '\0';
+
+StringEnumeration *
+Locale::createKeywords(UErrorCode &status) const
+{
+ char keywords[256];
+ int32_t keywordCapacity = 256;
+ StringEnumeration *result = NULL;
+
+ const char* variantStart = uprv_strchr(fullName, '@');
+ const char* assignment = uprv_strchr(fullName, '=');
+ if(variantStart) {
+ if(assignment > variantStart) {
+ int32_t keyLen = locale_getKeywords(variantStart+1, '@', keywords, keywordCapacity, NULL, 0, NULL, FALSE, &status);
+ if(keyLen) {
+ result = new KeywordEnumeration(keywords, keyLen, 0, status);
+ }
+ } else {
+ status = U_INVALID_FORMAT_ERROR;
+ }
+ }
+ return result;
+}
+
+int32_t
+Locale::getKeywordValue(const char* keywordName, char *buffer, int32_t bufLen, UErrorCode &status) const
+{
+ return uloc_getKeywordValue(fullName, keywordName, buffer, bufLen, &status);
+}
+
+const char *
+Locale::getBaseName() const
+{
+ // lazy init
+ UErrorCode status = U_ZERO_ERROR;
+ // semantically const
+ if(baseName == 0) {
+ ((Locale *)this)->baseName = ((Locale *)this)->baseNameBuffer;
+ int32_t baseNameSize = uloc_getBaseName(fullName, baseName, ULOC_FULLNAME_CAPACITY, &status);
+ if(baseNameSize >= ULOC_FULLNAME_CAPACITY) {
+ ((Locale *)this)->baseName = (char *)uprv_malloc(sizeof(char) * baseNameSize + 1);
+ uloc_getBaseName(fullName, baseName, baseNameSize+1, &status);
+ }
+ baseName[baseNameSize] = 0;
+ }
+ return baseName;
+}
+
+
+//eof
+U_NAMESPACE_END
diff --git a/source/common/locmap.c b/source/common/locmap.c
new file mode 100644
index 0000000..802c6c3
--- /dev/null
+++ b/source/common/locmap.c
@@ -0,0 +1,893 @@
+/*
+ **********************************************************************
+ * Copyright (C) 1996-2006, International Business Machines
+ * Corporation and others. All Rights Reserved.
+ **********************************************************************
+ *
+ * Provides functionality for mapping between
+ * LCID and Posix IDs or ICU locale to codepage
+ *
+ * Note: All classes and code in this file are
+ * intended for internal use only.
+ *
+ * Methods of interest:
+ * unsigned long convertToLCID(const char*);
+ * const char* convertToPosix(unsigned long);
+ *
+ * Kathleen Wilson, 4/30/96
+ *
+ * Date Name Description
+ * 3/11/97 aliu Fixed off-by-one bug in assignment operator. Added
+ * setId() method and safety check against
+ * MAX_ID_LENGTH.
+ * 04/23/99 stephen Added C wrapper for convertToPosix.
+ * 09/18/00 george Removed the memory leaks.
+ * 08/23/01 george Convert to C
+ */
+
+#include "locmap.h"
+#include "cstring.h"
+
+/*
+ * Note:
+ * The mapping from Win32 locale ID numbers to POSIX locale strings should
+ * be the faster one.
+ *
+ * Many LCID values come from winnt.h
+ * Some also come from http://www.microsoft.com/globaldev/reference/lcid-all.mspx
+ */
+
+/*
+////////////////////////////////////////////////
+//
+// Internal Classes for LCID <--> POSIX Mapping
+//
+/////////////////////////////////////////////////
+*/
+
+typedef struct ILcidPosixElement
+{
+ const uint32_t hostID;
+ const char * const posixID;
+} ILcidPosixElement;
+
+typedef struct ILcidPosixMap
+{
+ const uint32_t numRegions;
+ const struct ILcidPosixElement* const regionMaps;
+} ILcidPosixMap;
+
+
+/*
+/////////////////////////////////////////////////
+//
+// Easy macros to make the LCID <--> POSIX Mapping
+//
+/////////////////////////////////////////////////
+*/
+
+/*
+ The standard one language/one country mapping for LCID.
+ The first element must be the language, and the following
+ elements are the language with the country.
+ */
+#define ILCID_POSIX_ELEMENT_ARRAY(hostID, languageID, posixID) \
+static const ILcidPosixElement languageID[] = { \
+ {LANGUAGE_LCID(hostID), #languageID}, /* parent locale */ \
+ {hostID, #posixID}, \
+};
+
+/*
+ Create the map for the posixID. This macro supposes that the language string
+ name is the same as the global variable name, and that the first element
+ in the ILcidPosixElement is just the language.
+ */
+#define ILCID_POSIX_MAP(_posixID) \
+ {sizeof(_posixID)/sizeof(ILcidPosixElement), _posixID}
+
+/*
+////////////////////////////////////////////
+//
+// Create the table of LCID to POSIX Mapping
+// None of it should be dynamically created.
+//
+// Keep static locale variables inside the function so that
+// it can be created properly during static init.
+//
+////////////////////////////////////////////
+*/
+
+ILCID_POSIX_ELEMENT_ARRAY(0x0436, af, af_ZA)
+
+static const ILcidPosixElement ar[] = {
+ {0x01, "ar"},
+ {0x3801, "ar_AE"},
+ {0x3c01, "ar_BH"},
+ {0x1401, "ar_DZ"},
+ {0x0c01, "ar_EG"},
+ {0x0801, "ar_IQ"},
+ {0x2c01, "ar_JO"},
+ {0x3401, "ar_KW"},
+ {0x3001, "ar_LB"},
+ {0x1001, "ar_LY"},
+ {0x1801, "ar_MA"},
+ {0x2001, "ar_OM"},
+ {0x4001, "ar_QA"},
+ {0x0401, "ar_SA"},
+ {0x2801, "ar_SY"},
+ {0x1c01, "ar_TN"},
+ {0x2401, "ar_YE"}
+};
+
+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_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[] = {
+ {0x45, "bn"},
+ {0x0845, "bn_BD"},
+ {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 */
+static const ILcidPosixElement cs_CZ[] = {
+ {0x05, "cs"},
+ {0x0405, "cs_CZ"},
+};
+
+ILCID_POSIX_ELEMENT_ARRAY(0x0452, cy, cy_GB)
+ILCID_POSIX_ELEMENT_ARRAY(0x0406, da, da_DK)
+
+static const ILcidPosixElement de[] = {
+ {0x07, "de"},
+ {0x0c07, "de_AT"},
+ {0x0807, "de_CH"},
+ {0x0407, "de_DE"},
+ {0x1407, "de_LI"},
+ {0x1007, "de_LU"},
+ {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)
+ILCID_POSIX_ELEMENT_ARRAY(0x0408, el, el_GR)
+
+static const ILcidPosixElement en[] = {
+ {0x09, "en"},
+ {0x0c09, "en_AU"},
+ {0x2809, "en_BZ"},
+ {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 */
+ {0x2409, "en_VI"}, /* Virgin Islands AKA Caribbean Islands (en_CB). */
+ {0x1c09, "en_ZA"},
+ {0x3009, "en_ZW"},
+ {0x0409, "en_AS"}, /* Alias for en_US. Leave last. */
+ {0x0409, "en_GU"}, /* Alias for en_US. Leave last. */
+ {0x0409, "en_MH"}, /* Alias for en_US. Leave last. */
+ {0x0409, "en_MP"}, /* Alias for en_US. Leave last. */
+ {0x0409, "en_UM"} /* Alias for en_US. Leave last. */
+};
+
+static const ILcidPosixElement en_US_POSIX[] = {
+ {0x007f, "en_US_POSIX"} /* duplicate for roundtripping */
+};
+
+static const ILcidPosixElement es[] = {
+ {0x0a, "es"},
+ {0x2c0a, "es_AR"},
+ {0x400a, "es_BO"},
+ {0x340a, "es_CL"},
+ {0x240a, "es_CO"},
+ {0x140a, "es_CR"},
+ {0x1c0a, "es_DO"},
+ {0x300a, "es_EC"},
+ {0x0c0a, "es_ES"}, /*Modern sort.*/
+ {0x100a, "es_GT"},
+ {0x480a, "es_HN"},
+ {0x080a, "es_MX"},
+ {0x4c0a, "es_NI"},
+ {0x180a, "es_PA"},
+ {0x280a, "es_PE"},
+ {0x500a, "es_PR"},
+ {0x3c0a, "es_PY"},
+ {0x440a, "es_SV"},
+ {0x540a, "es_US"},
+ {0x380a, "es_UY"},
+ {0x200a, "es_VE"},
+ {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)
+
+/* 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[] = {
+ {0x0c, "fr"},
+ {0x080c, "fr_BE"},
+ {0x0c0c, "fr_CA"},
+ {0x240c, "fr_CD"},
+ {0x100c, "fr_CH"},
+ {0x300c, "fr_CI"},
+ {0x2c0c, "fr_CM"},
+ {0x040c, "fr_FR"},
+ {0x3c0c, "fr_HT"},
+ {0x140c, "fr_LU"},
+ {0x380c, "fr_MA"},
+ {0x180c, "fr_MC"},
+ {0x340c, "fr_ML"},
+ {0x200c, "fr_RE"},
+ {0x280c, "fr_SN"}
+};
+
+ILCID_POSIX_ELEMENT_ARRAY(0x0462, fy, fy_NL)
+
+/* This LCID is really two different locales.*/
+static const ILcidPosixElement ga[] = {
+ {0x3c, "ga"},
+ {0x3c, "gd"},
+ {0x083c, "ga_IE"}, /* Gaelic (Ireland) */
+ {0x043c, "gd_GB"} /* Gaelic (Scotland) */
+};
+
+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(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)
+
+/* 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*/
+ {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. */
+ {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"} /* 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[] = {
+ {0x10, "it"},
+ {0x0810, "it_CH"},
+ {0x0410, "it_IT"}
+};
+
+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)
+
+static const ILcidPosixElement ko[] = {
+ {0x12, "ko"},
+ {0x0812, "ko_KP"},
+ {0x0412, "ko_KR"}
+};
+
+ILCID_POSIX_ELEMENT_ARRAY(0x0457, kok, kok_IN)
+ILCID_POSIX_ELEMENT_ARRAY(0x0471, kr, kr_NG)
+
+static const ILcidPosixElement ks[] = { /* We could add PK and CN too */
+ {0x60, "ks"},
+ {0x0860, "ks_IN"}, /* Documentation doesn't mention script */
+ {0x0460, "ks_Arab_IN"}
+};
+
+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)
+
+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[] = {
+ {0x3e, "ms"},
+ {0x083e, "ms_BN"}, /* Brunei Darussalam*/
+ {0x043e, "ms_MY"} /* Malaysia*/
+};
+
+ILCID_POSIX_ELEMENT_ARRAY(0x043a, mt, mt_MT)
+ILCID_POSIX_ELEMENT_ARRAY(0x0455, my, my_MM)
+
+static const ILcidPosixElement ne[] = {
+ {0x61, "ne"},
+ {0x0861, "ne_IN"}, /* India*/
+ {0x0461, "ne_NP"} /* Nepal*/
+};
+
+static const ILcidPosixElement nl[] = {
+ {0x13, "nl"},
+ {0x0813, "nl_BE"},
+ {0x0413, "nl_NL"}
+};
+
+/* The "no" locale split into nb and nn. By default in ICU, "no" is nb.*/
+static const ILcidPosixElement no[] = {
+ {0x14, "nb"}, /* really nb */
+ {0x0414, "nb_NO"}, /* really nb_NO. Keep first in the 414 list. */
+ {0x0414, "no"}, /* really nb_NO */
+ {0x0414, "no_NO"}, /* really nb_NO */
+ {0x0814, "nn_NO"}, /* really nn_NO. Keep first in the 814 list. */
+ {0x0814, "nn"}, /* It's 0x14 or 0x814, pick one to make the test program happy. */
+ {0x0814, "no_NO_NY"}/* really nn_NO */
+};
+
+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*/
+static const ILcidPosixElement or_IN[] = {
+ {0x48, "or"},
+ {0x0448, "or_IN"},
+};
+
+static const ILcidPosixElement pa[] = {
+ {0x46, "pa"},
+ {0x0446, "pa_IN"},
+ {0x0846, "pa_PK"}
+};
+
+ILCID_POSIX_ELEMENT_ARRAY(0x0415, pl, pl_PL)
+ILCID_POSIX_ELEMENT_ARRAY(0x0463, ps, ps_AF)
+
+static const ILcidPosixElement pt[] = {
+ {0x16, "pt"},
+ {0x0416, "pt_BR"},
+ {0x0816, "pt_PT"}
+};
+
+static const ILcidPosixElement qu[] = {
+ {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[] = {
+ {0x00, "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"},
+ {0x0459, "sd_IN"},
+ {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)
+ILCID_POSIX_ELEMENT_ARRAY(0x0477, so, so_ET) /* TODO: Verify the country */
+ILCID_POSIX_ELEMENT_ARRAY(0x041c, sq, sq_AL)
+
+static const ILcidPosixElement sv[] = {
+ {0x1d, "sv"},
+ {0x081d, "sv_FI"},
+ {0x041d, "sv_SE"}
+};
+
+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[] = {
+ {0x73, "ti"},
+ {0x0873, "ti_ER"},
+ {0x0473, "ti_ET"}
+};
+
+ILCID_POSIX_ELEMENT_ARRAY(0x0442, tk, tk_TM)
+ILCID_POSIX_ELEMENT_ARRAY(0x0432, tn, tn_BW)
+ILCID_POSIX_ELEMENT_ARRAY(0x041f, tr, tr_TR)
+ILCID_POSIX_ELEMENT_ARRAY(0x0444, tt, tt_RU)
+ILCID_POSIX_ELEMENT_ARRAY(0x0480, ug, ug_CN)
+ILCID_POSIX_ELEMENT_ARRAY(0x0422, uk, uk_UA)
+
+static const ILcidPosixElement ur[] = {
+ {0x20, "ur"},
+ {0x0820, "ur_IN"},
+ {0x0420, "ur_PK"}
+};
+
+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"} /* Latin based */
+};
+
+ILCID_POSIX_ELEMENT_ARRAY(0x0433, ve, ve_ZA) /* TODO: Verify the country */
+ILCID_POSIX_ELEMENT_ARRAY(0x042a, vi, vi_VN)
+
+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"},
+ {0x1404, "zh_Hant_MO"},
+ {0x1404, "zh_MO"},
+ {0x1004, "zh_Hans_SG"},
+ {0x1004, "zh_SG"},
+ {0x0404, "zh_Hant_TW"},
+ {0x0404, "zh_Hant"},
+ {0x0404, "zh_TW"},
+ {0x30404,"zh_Hant_TW"}, /* Bopomofo order */
+ {0x30404,"zh_TW"}, /* Bopomofo order */
+ {0x20404,"zh_Hant_TW@collation=stroke"},
+ {0x20404,"zh_TW@collation=stroke"},
+ {0x20804,"zh_Hans_CN@collation=stroke"},
+ {0x20804,"zh_CN@collation=stroke"}
+};
+
+ILCID_POSIX_ELEMENT_ARRAY(0x0435, zu, zu_ZA)
+
+/* This must be static and grouped by LCID. */
+
+/* non-existent ISO-639-2 codes */
+/*
+0x466 Edo
+0x467 Fulfulde - Nigeria
+0x486 K'iche - Guatemala
+0x430 Sutu
+*/
+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 */
+ ILCID_POSIX_MAP(de), /* de German 0x07 */
+ ILCID_POSIX_MAP(dv), /* dv Divehi 0x65 */
+ ILCID_POSIX_MAP(el), /* el Greek 0x08 */
+ ILCID_POSIX_MAP(en), /* en English 0x09 */
+ ILCID_POSIX_MAP(en_US_POSIX), /* invariant 0x7f */
+ 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 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 */
+ ILCID_POSIX_MAP(he), /* he Hebrew (formerly iw) 0x0d */
+ ILCID_POSIX_MAP(hi), /* hi Hindi 0x39 */
+ ILCID_POSIX_MAP(hr), /* * Croatian and others 0x1a */
+ ILCID_POSIX_MAP(hu), /* hu Hungarian 0x0e */
+ 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 */
+ ILCID_POSIX_MAP(iw), /* iw Hebrew 0x0d */
+ 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 */
+ ILCID_POSIX_MAP(kok), /* kok Konkani 0x57 */
+ 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 */
+ ILCID_POSIX_MAP(lv), /* lv Latvian, Lettish 0x26 */
+ ILCID_POSIX_MAP(mi), /* mi Maori 0x81 */
+ ILCID_POSIX_MAP(mk), /* mk Macedonian 0x2f */
+ 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 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 */
+ ILCID_POSIX_MAP(sl), /* sl Slovenian 0x24 */
+ ILCID_POSIX_MAP(so), /* so Somali 0x77 */
+ ILCID_POSIX_MAP(sq), /* sq Albanian 0x1c */
+/* ILCID_POSIX_MAP(sr), // sr Serbian 0x1a */
+ ILCID_POSIX_MAP(sv), /* sv Swedish 0x1d */
+ ILCID_POSIX_MAP(sw), /* sw Swahili 0x41 */
+ 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(tn), /* tn Tswana 0x32 */
+ ILCID_POSIX_MAP(tr), /* tr Turkish 0x1f */
+ ILCID_POSIX_MAP(tt), /* tt Tatar 0x44 */
+ ILCID_POSIX_MAP(ug), /* ug Uighur 0x80 */
+ ILCID_POSIX_MAP(uk), /* uk Ukrainian 0x22 */
+ ILCID_POSIX_MAP(ur), /* ur Urdu 0x20 */
+ 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 */
+ ILCID_POSIX_MAP(zu), /* zu Zulu 0x35 */
+};
+
+static const uint32_t gLocaleCount = sizeof(gPosixIDmap)/sizeof(ILcidPosixMap);
+
+/**
+ * Do not call this function. It is called by hostID.
+ * The function is not private because this struct must stay as a C struct,
+ * and this is an internal class.
+ */
+static int32_t
+idCmp(const char* id1, const char* id2)
+{
+ int32_t diffIdx = 0;
+ while (*id1 == *id2 && *id1 != 0) {
+ diffIdx++;
+ id1++;
+ id2++;
+ }
+ return diffIdx;
+}
+
+/**
+ * Searches for a Windows LCID
+ *
+ * @param posixid the Posix style locale id.
+ * @param status gets set to U_ILLEGAL_ARGUMENT_ERROR when the Posix ID has
+ * no equivalent Windows LCID.
+ * @return the LCID
+ */
+static uint32_t
+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);
+ uint32_t idx;
+
+ for (idx = 0; idx < this_0->numRegions; idx++ ) {
+ int32_t sameChars = idCmp(posixID, this_0->regionMaps[idx].posixID);
+ if (sameChars > bestIdxDiff && this_0->regionMaps[idx].posixID[sameChars] == 0) {
+ if (posixIDlen == sameChars) {
+ /* Exact match */
+ return this_0->regionMaps[idx].hostID;
+ }
+ bestIdxDiff = sameChars;
+ bestIdx = idx;
+ }
+ }
+ /* 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;
+ }
+
+ /*no match found */
+ *status = U_ILLEGAL_ARGUMENT_ERROR;
+ return this_0->regionMaps->hostID;
+}
+
+static const char*
+getPosixID(const ILcidPosixMap *this_0, uint32_t hostID)
+{
+ uint32_t i;
+ for (i = 0; i <= this_0->numRegions; i++)
+ {
+ if (this_0->regionMaps[i].hostID == hostID)
+ {
+ return this_0->regionMaps[i].posixID;
+ }
+ }
+
+ /* If you get here, then no matching region was found,
+ so return the language id with the wild card region. */
+ return this_0->regionMaps[0].posixID;
+}
+
+/*
+//////////////////////////////////////
+//
+// LCID --> POSIX
+//
+/////////////////////////////////////
+*/
+
+U_CAPI const char *
+uprv_convertToPosix(uint32_t hostid, UErrorCode* status)
+{
+ uint16_t langID = LANGUAGE_LCID(hostid);
+ uint32_t index;
+
+ for (index = 0; index < gLocaleCount; index++)
+ {
+ if (langID == gPosixIDmap[index].regionMaps->hostID)
+ {
+ return getPosixID(&gPosixIDmap[index], hostid);
+ }
+ }
+
+ /* no match found */
+ *status = U_ILLEGAL_ARGUMENT_ERROR;
+ return NULL;
+}
+
+/*
+//////////////////////////////////////
+//
+// POSIX --> LCID
+// This should only be called from uloc_getLCID.
+// The locale ID must be in canonical form.
+// langID is separate so that this file doesn't depend on the uloc_* API.
+//
+/////////////////////////////////////
+*/
+
+U_CAPI uint32_t
+uprv_convertToLCID(const char *langID, const char* posixID, UErrorCode* status)
+{
+
+ uint32_t low = 0;
+ uint32_t high = gLocaleCount;
+ uint32_t mid = high;
+ uint32_t oldmid = 0;
+ int32_t compVal;
+
+ uint32_t value = 0;
+ uint32_t fallbackValue = (uint32_t)-1;
+ UErrorCode myStatus;
+ uint32_t idx;
+
+ /* Check for incomplete id. */
+ if (!langID || !posixID || uprv_strlen(langID) < 2 || uprv_strlen(posixID) < 2) {
+ return 0;
+ }
+
+ /*Binary search for the map entry for normal cases */
+
+ while (high > low) /*binary search*/{
+
+ mid = (high+low) >> 1; /*Finds median*/
+
+ if (mid == oldmid)
+ break;
+
+ compVal = uprv_strcmp(langID, gPosixIDmap[mid].regionMaps->posixID);
+ if (compVal < 0){
+ high = mid;
+ }
+ else if (compVal > 0){
+ low = mid;
+ }
+ else /*we found it*/{
+ return getHostID(&gPosixIDmap[mid], posixID, status);
+ }
+ oldmid = mid;
+ }
+
+ /*
+ * Sometimes we can't do a binary search on posixID because some LCIDs
+ * go to different locales. We hit one of those special cases.
+ */
+ for (idx = 0; idx < gLocaleCount; idx++ ) {
+ myStatus = U_ZERO_ERROR;
+ value = getHostID(&gPosixIDmap[idx], posixID, &myStatus);
+ if (myStatus == U_ZERO_ERROR) {
+ return value;
+ }
+ else if (myStatus == U_USING_FALLBACK_WARNING) {
+ fallbackValue = value;
+ }
+ }
+
+ if (fallbackValue != (uint32_t)-1) {
+ *status = U_USING_FALLBACK_WARNING;
+ return fallbackValue;
+ }
+
+ /* no match found */
+ *status = U_ILLEGAL_ARGUMENT_ERROR;
+ return 0; /* return international (root) */
+}
+
diff --git a/source/common/locmap.h b/source/common/locmap.h
new file mode 100644
index 0000000..7db0607
--- /dev/null
+++ b/source/common/locmap.h
@@ -0,0 +1,37 @@
+/*
+******************************************************************************
+*
+* Copyright (C) 1996-2004, International Business Machines
+* Corporation and others. All Rights Reserved.
+*
+******************************************************************************
+*
+* File locmap.h : Locale Mapping Classes
+*
+*
+* Created by: Helena Shih
+*
+* Modification History:
+*
+* Date Name Description
+* 3/11/97 aliu Added setId().
+* 4/20/99 Madhu Added T_convertToPosix()
+* 09/18/00 george Removed the memory leaks.
+* 08/23/01 george Convert to C
+*============================================================================
+*/
+
+#ifndef LOCMAP_H
+#define LOCMAP_H
+
+#include "unicode/utypes.h"
+
+#define LANGUAGE_LCID(hostID) (uint16_t)(0x03FF & hostID)
+
+U_CAPI const char *uprv_convertToPosix(uint32_t hostid, UErrorCode* status);
+
+/* Don't call this function directly. Use uloc_getLCID instead. */
+U_CAPI uint32_t uprv_convertToLCID(const char *langID, const char* posixID, UErrorCode* status);
+
+#endif /* LOCMAP_H */
+
diff --git a/source/common/locutil.cpp b/source/common/locutil.cpp
new file mode 100644
index 0000000..777403d
--- /dev/null
+++ b/source/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/source/common/locutil.h b/source/common/locutil.h
new file mode 100644
index 0000000..cf64e34
--- /dev/null
+++ b/source/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/source/common/msvcres.h b/source/common/msvcres.h
new file mode 100644
index 0000000..cad2fe6
--- /dev/null
+++ b/source/common/msvcres.h
@@ -0,0 +1,20 @@
+//{{NO_DEPENDENCIES}}
+// Copyright (c) 2003-2005 International Business Machines
+// Corporation and others. All Rights Reserved.
+//
+// Used by common.rc and other .rc files.
+//Do not edit with Microsoft Developer Studio because it will modify this
+//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/source/common/mutex.h b/source/common/mutex.h
new file mode 100644
index 0000000..26aefbf
--- /dev/null
+++ b/source/common/mutex.h
@@ -0,0 +1,85 @@
+/*
+******************************************************************************
+*
+* Copyright (C) 1997-2003, International Business Machines
+* Corporation and others. All Rights Reserved.
+*
+******************************************************************************
+*/
+//----------------------------------------------------------------------------
+// File: mutex.h
+//
+// Lightweight C++ wrapper for umtx_ C mutex functions
+//
+// Author: Alan Liu 1/31/97
+// History:
+// 06/04/97 helena Updated setImplementation as per feedback from 5/21 drop.
+// 04/07/1999 srl refocused as a thin wrapper
+//
+//----------------------------------------------------------------------------
+#ifndef MUTEX_H
+#define MUTEX_H
+
+#include "unicode/utypes.h"
+#include "unicode/uobject.h"
+#include "umutex.h"
+
+U_NAMESPACE_BEGIN
+
+//----------------------------------------------------------------------------
+// Code within that accesses shared static or global data should
+// should instantiate a Mutex object while doing so. You should make your own
+// private mutex where possible.
+
+// For example:
+//
+// UMTX myMutex;
+//
+// int InitializeMyMutex()
+// {
+// umtx_init( &myMutex );
+// return 0;
+// }
+//
+// static int initializeMyMutex = InitializeMyMutex();
+//
+// void Function(int arg1, int arg2)
+// {
+// static Object* foo; // Shared read-write object
+// Mutex mutex(&myMutex); // or no args for the global lock
+// foo->Method();
+// // When 'mutex' goes out of scope and gets destroyed here, the lock is released
+// }
+//
+// Note: Do NOT use the form 'Mutex mutex();' as that merely forward-declares a function
+// returning a Mutex. This is a common mistake which silently slips through the
+// compiler!!
+//
+
+class U_COMMON_API Mutex : public UMemory {
+public:
+ inline Mutex(UMTX *mutex = NULL);
+ inline ~Mutex();
+
+private:
+ UMTX *fMutex;
+
+ Mutex(const Mutex &other); // forbid copying of this class
+ Mutex &operator=(const Mutex &other); // forbid copying of this class
+};
+
+inline Mutex::Mutex(UMTX *mutex)
+ : fMutex(mutex)
+{
+ umtx_lock(fMutex);
+}
+
+inline Mutex::~Mutex()
+{
+ umtx_unlock(fMutex);
+}
+
+U_NAMESPACE_END
+
+#endif //_MUTEX_
+//eof
diff --git a/source/common/normlzr.cpp b/source/common/normlzr.cpp
new file mode 100644
index 0000000..909bd30
--- /dev/null
+++ b/source/common/normlzr.cpp
@@ -0,0 +1,611 @@
+/*
+ *************************************************************************
+ * COPYRIGHT:
+ * Copyright (c) 1996-2005, International Business Machines Corporation and
+ * others. All Rights Reserved.
+ *************************************************************************
+ */
+
+#include "unicode/utypes.h"
+
+#if !UCONFIG_NO_NORMALIZATION
+
+#include "unicode/unistr.h"
+#include "unicode/chariter.h"
+#include "unicode/schriter.h"
+#include "unicode/uchriter.h"
+#include "unicode/uiter.h"
+#include "unicode/normlzr.h"
+#include "cmemory.h"
+#include "unormimp.h"
+
+U_NAMESPACE_BEGIN
+
+UOBJECT_DEFINE_RTTI_IMPLEMENTATION(Normalizer)
+
+//-------------------------------------------------------------------------
+// Constructors and other boilerplate
+//-------------------------------------------------------------------------
+
+Normalizer::Normalizer(const UnicodeString& str, UNormalizationMode mode) :
+ UObject(), fUMode(mode), fOptions(0),
+ currentIndex(0), nextIndex(0),
+ buffer(), bufferPos(0)
+{
+ init(new StringCharacterIterator(str));
+}
+
+Normalizer::Normalizer(const UChar *str, int32_t length, UNormalizationMode mode) :
+ UObject(), fUMode(mode), fOptions(0),
+ currentIndex(0), nextIndex(0),
+ buffer(), bufferPos(0)
+{
+ init(new UCharCharacterIterator(str, length));
+}
+
+Normalizer::Normalizer(const CharacterIterator& iter, UNormalizationMode mode) :
+ UObject(), fUMode(mode), fOptions(0),
+ currentIndex(0), nextIndex(0),
+ buffer(), bufferPos(0)
+{
+ init(iter.clone());
+}
+
+Normalizer::Normalizer(const Normalizer ©) :
+ UObject(copy), fUMode(copy.fUMode), fOptions(copy.fOptions),
+ currentIndex(copy.currentIndex), nextIndex(copy.nextIndex),
+ buffer(copy.buffer), bufferPos(copy.bufferPos)
+{
+ init(((CharacterIterator *)(copy.text->context))->clone());
+}
+
+static const UChar _NUL=0;
+
+void
+Normalizer::init(CharacterIterator *iter) {
+ UErrorCode errorCode=U_ZERO_ERROR;
+
+ text=(UCharIterator *)uprv_malloc(sizeof(UCharIterator));
+ if(text!=NULL) {
+ if(unorm_haveData(&errorCode)) {
+ uiter_setCharacterIterator(text, iter);
+ } else {
+ delete iter;
+ uiter_setCharacterIterator(text, new UCharCharacterIterator(&_NUL, 0));
+ }
+ } else {
+ delete iter;
+ }
+}
+
+Normalizer::~Normalizer()
+{
+ if(text!=NULL) {
+ delete (CharacterIterator *)text->context;
+ uprv_free(text);
+ }
+}
+
+Normalizer*
+Normalizer::clone() const
+{
+ if(this!=0) {
+ return new Normalizer(*this);
+ } else {
+ return 0;
+ }
+}
+
+/**
+ * Generates a hash code for this iterator.
+ */
+int32_t Normalizer::hashCode() const
+{
+ return ((CharacterIterator *)(text->context))->hashCode() + fUMode + fOptions + buffer.hashCode() + bufferPos + currentIndex + nextIndex;
+}
+
+UBool Normalizer::operator==(const Normalizer& that) const
+{
+ return
+ this==&that ||
+ fUMode==that.fUMode &&
+ fOptions==that.fOptions &&
+ *((CharacterIterator *)(text->context))==*((CharacterIterator *)(that.text->context)) &&
+ buffer==that.buffer &&
+ bufferPos==that.bufferPos &&
+ nextIndex==that.nextIndex;
+}
+
+//-------------------------------------------------------------------------
+// Static utility methods
+//-------------------------------------------------------------------------
+
+void U_EXPORT2
+Normalizer::normalize(const UnicodeString& source,
+ UNormalizationMode mode, int32_t options,
+ UnicodeString& result,
+ UErrorCode &status) {
+ if(source.isBogus() || U_FAILURE(status)) {
+ result.setToBogus();
+ if(U_SUCCESS(status)) {
+ status=U_ILLEGAL_ARGUMENT_ERROR;
+ }
+ } else {
+ UnicodeString localDest;
+ UnicodeString *dest;
+
+ if(&source!=&result) {
+ dest=&result;
+ } else {
+ // the source and result strings are the same object, use a temporary one
+ dest=&localDest;
+ }
+
+ UChar *buffer=dest->getBuffer(source.length());
+ int32_t length=unorm_internalNormalize(buffer, dest->getCapacity(),
+ source.getBuffer(), source.length(),
+ mode, options,
+ &status);
+ dest->releaseBuffer(U_SUCCESS(status) ? length : 0);
+ if(status==U_BUFFER_OVERFLOW_ERROR) {
+ status=U_ZERO_ERROR;
+ buffer=dest->getBuffer(length);
+ length=unorm_internalNormalize(buffer, dest->getCapacity(),
+ source.getBuffer(), source.length(),
+ mode, options,
+ &status);
+ dest->releaseBuffer(U_SUCCESS(status) ? length : 0);
+ }
+
+ if(dest==&localDest) {
+ result=*dest;
+ }
+ if(U_FAILURE(status)) {
+ result.setToBogus();
+ }
+ }
+}
+
+void U_EXPORT2
+Normalizer::compose(const UnicodeString& source,
+ UBool compat, int32_t options,
+ UnicodeString& result,
+ UErrorCode &status) {
+ if(source.isBogus() || U_FAILURE(status)) {
+ result.setToBogus();
+ if(U_SUCCESS(status)) {
+ status=U_ILLEGAL_ARGUMENT_ERROR;
+ }
+ } else {
+ UnicodeString localDest;
+ UnicodeString *dest;
+
+ if(&source!=&result) {
+ dest=&result;
+ } else {
+ // the source and result strings are the same object, use a temporary one
+ dest=&localDest;
+ }
+
+ UChar *buffer=dest->getBuffer(source.length());
+ int32_t length=unorm_compose(buffer, dest->getCapacity(),
+ source.getBuffer(), source.length(),
+ compat, options,
+ &status);
+ dest->releaseBuffer(U_SUCCESS(status) ? length : 0);
+ if(status==U_BUFFER_OVERFLOW_ERROR) {
+ status=U_ZERO_ERROR;
+ buffer=dest->getBuffer(length);
+ length=unorm_compose(buffer, dest->getCapacity(),
+ source.getBuffer(), source.length(),
+ compat, options,
+ &status);
+ dest->releaseBuffer(U_SUCCESS(status) ? length : 0);
+ }
+
+ if(dest==&localDest) {
+ result=*dest;
+ }
+ if(U_FAILURE(status)) {
+ result.setToBogus();
+ }
+ }
+}
+
+void U_EXPORT2
+Normalizer::decompose(const UnicodeString& source,
+ UBool compat, int32_t options,
+ UnicodeString& result,
+ UErrorCode &status) {
+ if(source.isBogus() || U_FAILURE(status)) {
+ result.setToBogus();
+ if(U_SUCCESS(status)) {
+ status=U_ILLEGAL_ARGUMENT_ERROR;
+ }
+ } else {
+ UnicodeString localDest;
+ UnicodeString *dest;
+
+ if(&source!=&result) {
+ dest=&result;
+ } else {
+ // the source and result strings are the same object, use a temporary one
+ dest=&localDest;
+ }
+
+ UChar *buffer=dest->getBuffer(source.length());
+ int32_t length=unorm_decompose(buffer, dest->getCapacity(),
+ source.getBuffer(), source.length(),
+ compat, options,
+ &status);
+ dest->releaseBuffer(U_SUCCESS(status) ? length : 0);
+ if(status==U_BUFFER_OVERFLOW_ERROR) {
+ status=U_ZERO_ERROR;
+ buffer=dest->getBuffer(length);
+ length=unorm_decompose(buffer, dest->getCapacity(),
+ source.getBuffer(), source.length(),
+ compat, options,
+ &status);
+ dest->releaseBuffer(U_SUCCESS(status) ? length : 0);
+ }
+
+ if(dest==&localDest) {
+ result=*dest;
+ }
+ if(U_FAILURE(status)) {
+ result.setToBogus();
+ }
+ }
+}
+
+UnicodeString & U_EXPORT2
+Normalizer::concatenate(UnicodeString &left, UnicodeString &right,
+ UnicodeString &result,
+ UNormalizationMode mode, int32_t options,
+ UErrorCode &errorCode) {
+ if(left.isBogus() || right.isBogus() || U_FAILURE(errorCode)) {
+ result.setToBogus();
+ if(U_SUCCESS(errorCode)) {
+ errorCode=U_ILLEGAL_ARGUMENT_ERROR;
+ }
+ } else {
+ UnicodeString localDest;
+ UnicodeString *dest;
+
+ if(&left!=&result && &right!=&result) {
+ dest=&result;
+ } else {
+ // the source and result strings are the same object, use a temporary one
+ dest=&localDest;
+ }
+
+ UChar *buffer=dest->getBuffer(left.length()+right.length());
+ int32_t length=unorm_concatenate(left.getBuffer(), left.length(),
+ right.getBuffer(), right.length(),
+ buffer, dest->getCapacity(),
+ mode, options,
+ &errorCode);
+ dest->releaseBuffer(U_SUCCESS(errorCode) ? length : 0);
+ if(errorCode==U_BUFFER_OVERFLOW_ERROR) {
+ errorCode=U_ZERO_ERROR;
+ buffer=dest->getBuffer(length);
+ int32_t length=unorm_concatenate(left.getBuffer(), left.length(),
+ right.getBuffer(), right.length(),
+ buffer, dest->getCapacity(),
+ mode, options,
+ &errorCode);
+ dest->releaseBuffer(U_SUCCESS(errorCode) ? length : 0);
+ }
+
+ if(dest==&localDest) {
+ result=*dest;
+ }
+ if(U_FAILURE(errorCode)) {
+ result.setToBogus();
+ }
+ }
+ return result;
+}
+
+//-------------------------------------------------------------------------
+// Iteration API
+//-------------------------------------------------------------------------
+
+/**
+ * Return the current character in the normalized text.
+ */
+UChar32 Normalizer::current() {
+ if(bufferPos<buffer.length() || nextNormalize()) {
+ return buffer.char32At(bufferPos);
+ } else {
+ return DONE;
+ }
+}
+
+/**
+ * Return the next character in the normalized text and advance
+ * the iteration position by one. If the end
+ * of the text has already been reached, {@link #DONE} is returned.
+ */
+UChar32 Normalizer::next() {
+ if(bufferPos<buffer.length() || nextNormalize()) {
+ UChar32 c=buffer.char32At(bufferPos);
+ bufferPos+=UTF_CHAR_LENGTH(c);
+ return c;
+ } else {
+ return DONE;
+ }
+}
+
+/**
+ * Return the previous character in the normalized text and decrement
+ * the iteration position by one. If the beginning
+ * of the text has already been reached, {@link #DONE} is returned.
+ */
+UChar32 Normalizer::previous() {
+ if(bufferPos>0 || previousNormalize()) {
+ UChar32 c=buffer.char32At(bufferPos-1);
+ bufferPos-=UTF_CHAR_LENGTH(c);
+ return c;
+ } else {
+ return DONE;
+ }
+}
+
+void Normalizer::reset() {
+ currentIndex=nextIndex=text->move(text, 0, UITER_START);
+ clearBuffer();
+}
+
+void
+Normalizer::setIndexOnly(int32_t index) {
+ currentIndex=nextIndex=text->move(text, index, UITER_ZERO); // validates index
+ clearBuffer();
+}
+
+/**
+ * Return the first character in the normalized text-> This resets
+ * the <tt>Normalizer's</tt> position to the beginning of the text->
+ */
+UChar32 Normalizer::first() {
+ reset();
+ return next();
+}
+
+/**
+ * Return the last character in the normalized text-> This resets
+ * the <tt>Normalizer's</tt> position to be just before the
+ * the input text corresponding to that normalized character.
+ */
+UChar32 Normalizer::last() {
+ currentIndex=nextIndex=text->move(text, 0, UITER_LIMIT);
+ clearBuffer();
+ return previous();
+}
+
+/**
+ * Retrieve the current iteration position in the input text that is
+ * being normalized. This method is useful in applications such as
+ * searching, where you need to be able to determine the position in
+ * the input text that corresponds to a given normalized output character.
+ * <p>
+ * <b>Note:</b> This method sets the position in the <em>input</em>, while
+ * {@link #next} and {@link #previous} iterate through characters in the
+ * <em>output</em>. This means that there is not necessarily a one-to-one
+ * correspondence between characters returned by <tt>next</tt> and
+ * <tt>previous</tt> and the indices passed to and returned from
+ * <tt>setIndex</tt> and {@link #getIndex}.
+ *
+ */
+int32_t Normalizer::getIndex() const {
+ if(bufferPos<buffer.length()) {
+ return currentIndex;
+ } else {
+ return nextIndex;
+ }
+}
+
+/**
+ * Retrieve the index of the start of the input text-> This is the begin index
+ * of the <tt>CharacterIterator</tt> or the start (i.e. 0) of the <tt>String</tt>
+ * over which this <tt>Normalizer</tt> is iterating
+ */
+int32_t Normalizer::startIndex() const {
+ return text->getIndex(text, UITER_START);
+}
+
+/**
+ * Retrieve the index of the end of the input text-> This is the end index
+ * of the <tt>CharacterIterator</tt> or the length of the <tt>String</tt>
+ * over which this <tt>Normalizer</tt> is iterating
+ */
+int32_t Normalizer::endIndex() const {
+ return text->getIndex(text, UITER_LIMIT);
+}
+
+//-------------------------------------------------------------------------
+// Property access methods
+//-------------------------------------------------------------------------
+
+void
+Normalizer::setMode(UNormalizationMode newMode)
+{
+ fUMode = newMode;
+}
+
+UNormalizationMode
+Normalizer::getUMode() const
+{
+ return fUMode;
+}
+
+void
+Normalizer::setOption(int32_t option,
+ UBool value)
+{
+ if (value) {
+ fOptions |= option;
+ } else {
+ fOptions &= (~option);
+ }
+}
+
+UBool
+Normalizer::getOption(int32_t option) const
+{
+ return (fOptions & option) != 0;
+}
+
+/**
+ * Set the input text over which this <tt>Normalizer</tt> will iterate.
+ * The iteration position is set to the beginning of the input text->
+ */
+void
+Normalizer::setText(const UnicodeString& newText,
+ UErrorCode &status)
+{
+ if (U_FAILURE(status)) {
+ return;
+ }
+ CharacterIterator *newIter = new StringCharacterIterator(newText);
+ if (newIter == NULL) {
+ status = U_MEMORY_ALLOCATION_ERROR;
+ return;
+ }
+ delete (CharacterIterator *)(text->context);
+ text->context = newIter;
+ reset();
+}
+
+/**
+ * Set the input text over which this <tt>Normalizer</tt> will iterate.
+ * The iteration position is set to the beginning of the string.
+ */
+void
+Normalizer::setText(const CharacterIterator& newText,
+ UErrorCode &status)
+{
+ if (U_FAILURE(status)) {
+ return;
+ }
+ CharacterIterator *newIter = newText.clone();
+ if (newIter == NULL) {
+ status = U_MEMORY_ALLOCATION_ERROR;
+ return;
+ }
+ delete (CharacterIterator *)(text->context);
+ text->context = newIter;
+ reset();
+}
+
+void
+Normalizer::setText(const UChar* newText,
+ int32_t length,
+ UErrorCode &status)
+{
+ if (U_FAILURE(status)) {
+ return;
+ }
+ CharacterIterator *newIter = new UCharCharacterIterator(newText, length);
+ if (newIter == NULL) {
+ status = U_MEMORY_ALLOCATION_ERROR;
+ return;
+ }
+ delete (CharacterIterator *)(text->context);
+ text->context = newIter;
+ reset();
+}
+
+/**
+ * Copies the text under iteration into the UnicodeString referred to by "result".
+ * @param result Receives a copy of the text under iteration.
+ */
+void
+Normalizer::getText(UnicodeString& result)
+{
+ ((CharacterIterator *)(text->context))->getText(result);
+}
+
+//-------------------------------------------------------------------------
+// Private utility methods
+//-------------------------------------------------------------------------
+
+void Normalizer::clearBuffer() {
+ buffer.remove();
+ bufferPos=0;
+}
+
+UBool
+Normalizer::nextNormalize() {
+ UChar *p;
+ int32_t length;
+ UErrorCode errorCode;
+
+ clearBuffer();
+ currentIndex=nextIndex;
+ text->move(text, nextIndex, UITER_ZERO);
+ if(!text->hasNext(text)) {
+ return FALSE;
+ }
+
+ errorCode=U_ZERO_ERROR;
+ p=buffer.getBuffer(-1);
+ length=unorm_next(text, p, buffer.getCapacity(),
+ fUMode, fOptions,
+ TRUE, 0,
+ &errorCode);
+ buffer.releaseBuffer(U_SUCCESS(errorCode) ? length : 0);
+ if(errorCode==U_BUFFER_OVERFLOW_ERROR) {
+ errorCode=U_ZERO_ERROR;
+ text->move(text, nextIndex, UITER_ZERO);
+ p=buffer.getBuffer(length);
+ length=unorm_next(text, p, buffer.getCapacity(),
+ fUMode, fOptions,
+ TRUE, 0,
+ &errorCode);
+ buffer.releaseBuffer(U_SUCCESS(errorCode) ? length : 0);
+ }
+
+ nextIndex=text->getIndex(text, UITER_CURRENT);
+ return U_SUCCESS(errorCode) && !buffer.isEmpty();
+}
+
+UBool
+Normalizer::previousNormalize() {
+ UChar *p;
+ int32_t length;
+ UErrorCode errorCode;
+
+ clearBuffer();
+ nextIndex=currentIndex;
+ text->move(text, currentIndex, UITER_ZERO);
+ if(!text->hasPrevious(text)) {
+ return FALSE;
+ }
+
+ errorCode=U_ZERO_ERROR;
+ p=buffer.getBuffer(-1);
+ length=unorm_previous(text, p, buffer.getCapacity(),
+ fUMode, fOptions,
+ TRUE, 0,
+ &errorCode);
+ buffer.releaseBuffer(U_SUCCESS(errorCode) ? length : 0);
+ if(errorCode==U_BUFFER_OVERFLOW_ERROR) {
+ errorCode=U_ZERO_ERROR;
+ text->move(text, currentIndex, UITER_ZERO);
+ p=buffer.getBuffer(length);
+ length=unorm_previous(text, p, buffer.getCapacity(),
+ fUMode, fOptions,
+ TRUE, 0,
+ &errorCode);
+ buffer.releaseBuffer(U_SUCCESS(errorCode) ? length : 0);
+ }
+
+ bufferPos=buffer.length();
+ currentIndex=text->getIndex(text, UITER_CURRENT);
+ return U_SUCCESS(errorCode) && !buffer.isEmpty();
+}
+
+U_NAMESPACE_END
+
+#endif /* #if !UCONFIG_NO_NORMALIZATION */
diff --git a/source/common/parsepos.cpp b/source/common/parsepos.cpp
new file mode 100644
index 0000000..26f8820
--- /dev/null
+++ b/source/common/parsepos.cpp
@@ -0,0 +1,21 @@
+/*
+**********************************************************************
+* Copyright (C) 2003-2003, International Business Machines
+* Corporation and others. All Rights Reserved.
+**********************************************************************
+*/
+
+#include "unicode/parsepos.h"
+
+U_NAMESPACE_BEGIN
+
+UOBJECT_DEFINE_RTTI_IMPLEMENTATION(ParsePosition)
+
+ParsePosition::~ParsePosition() {}
+
+ParsePosition *
+ParsePosition::clone() const {
+ return new ParsePosition(*this);
+}
+
+U_NAMESPACE_END
diff --git a/source/common/propname.cpp b/source/common/propname.cpp
new file mode 100644
index 0000000..95d7e9b
--- /dev/null
+++ b/source/common/propname.cpp
@@ -0,0 +1,757 @@
+/*
+**********************************************************************
+* Copyright (c) 2002-2005, International Business Machines
+* Corporation and others. All Rights Reserved.
+**********************************************************************
+* Author: Alan Liu
+* Created: October 30 2002
+* Since: ICU 2.4
+**********************************************************************
+*/
+#include "propname.h"
+#include "unicode/uchar.h"
+#include "unicode/udata.h"
+#include "umutex.h"
+#include "cmemory.h"
+#include "cstring.h"
+#include "ucln_cmn.h"
+#include "uarrsort.h"
+
+U_CDECL_BEGIN
+
+/**
+ * Get the next non-ignorable ASCII character from a property name
+ * and lowercases it.
+ * @return ((advance count for the name)<<8)|character
+ */
+static inline int32_t
+getASCIIPropertyNameChar(const char *name) {
+ int32_t i;
+ char c;
+
+ /* Ignore delimiters '-', '_', and ASCII White_Space */
+ for(i=0;
+ (c=name[i++])==0x2d || c==0x5f ||
+ c==0x20 || (0x09<=c && c<=0x0d);
+ ) {}
+
+ if(c!=0) {
+ return (i<<8)|(uint8_t)uprv_asciitolower((char)c);
+ } else {
+ return i<<8;
+ }
+}
+
+/**
+ * Get the next non-ignorable EBCDIC character from a property name
+ * and lowercases it.
+ * @return ((advance count for the name)<<8)|character
+ */
+static inline int32_t
+getEBCDICPropertyNameChar(const char *name) {
+ int32_t i;
+ char c;
+
+ /* Ignore delimiters '-', '_', and EBCDIC White_Space */
+ for(i=0;
+ (c=name[i++])==0x60 || c==0x6d ||
+ c==0x40 || c==0x05 || c==0x15 || c==0x25 || c==0x0b || c==0x0c || c==0x0d;
+ ) {}
+
+ if(c!=0) {
+ return (i<<8)|(uint8_t)uprv_ebcdictolower((char)c);
+ } else {
+ return i<<8;
+ }
+}
+
+/**
+ * Unicode property names and property value names are compared "loosely".
+ *
+ * UCD.html 4.0.1 says:
+ * For all property names, property value names, and for property values for
+ * Enumerated, Binary, or Catalog properties, use the following
+ * loose matching rule:
+ *
+ * LM3. Ignore case, whitespace, underscore ('_'), and hyphens.
+ *
+ * This function does just that, for (char *) name strings.
+ * It is almost identical to ucnv_compareNames() but also ignores
+ * C0 White_Space characters (U+0009..U+000d, and U+0085 on EBCDIC).
+ *
+ * @internal
+ */
+
+U_CAPI int32_t U_EXPORT2
+uprv_compareASCIIPropertyNames(const char *name1, const char *name2) {
+ int32_t rc, r1, r2;
+
+ for(;;) {
+ r1=getASCIIPropertyNameChar(name1);
+ r2=getASCIIPropertyNameChar(name2);
+
+ /* If we reach the ends of both strings then they match */
+ if(((r1|r2)&0xff)==0) {
+ return 0;
+ }
+
+ /* Compare the lowercased characters */
+ if(r1!=r2) {
+ rc=(r1&0xff)-(r2&0xff);
+ if(rc!=0) {
+ return rc;
+ }
+ }
+
+ name1+=r1>>8;
+ name2+=r2>>8;
+ }
+}
+
+U_CAPI int32_t U_EXPORT2
+uprv_compareEBCDICPropertyNames(const char *name1, const char *name2) {
+ int32_t rc, r1, r2;
+
+ for(;;) {
+ r1=getEBCDICPropertyNameChar(name1);
+ r2=getEBCDICPropertyNameChar(name2);
+
+ /* If we reach the ends of both strings then they match */
+ if(((r1|r2)&0xff)==0) {
+ return 0;
+ }
+
+ /* Compare the lowercased characters */
+ if(r1!=r2) {
+ rc=(r1&0xff)-(r2&0xff);
+ if(rc!=0) {
+ return rc;
+ }
+ }
+
+ name1+=r1>>8;
+ name2+=r2>>8;
+ }
+}
+
+U_CDECL_END
+
+U_NAMESPACE_BEGIN
+
+//----------------------------------------------------------------------
+// PropertyAliases implementation
+
+const char*
+PropertyAliases::chooseNameInGroup(Offset offset,
+ UPropertyNameChoice choice) const {
+ int32_t c = choice;
+ if (!offset || c < 0) {
+ return NULL;
+ }
+ const Offset* p = (const Offset*) getPointer(offset);
+ while (c-- > 0) {
+ if (*p++ < 0) return NULL;
+ }
+ Offset a = *p;
+ if (a < 0) a = -a;
+ return (const char*) getPointerNull(a);
+}
+
+const ValueMap*
+PropertyAliases::getValueMap(EnumValue prop) const {
+ NonContiguousEnumToOffset* e2o = (NonContiguousEnumToOffset*) getPointer(enumToValue_offset);
+ Offset a = e2o->getOffset(prop);
+ return (const ValueMap*) (a ? getPointerNull(a) : NULL);
+}
+
+inline const char*
+PropertyAliases::getPropertyName(EnumValue prop,
+ UPropertyNameChoice choice) const {
+ NonContiguousEnumToOffset* e2n = (NonContiguousEnumToOffset*) getPointer(enumToName_offset);
+ return chooseNameInGroup(e2n->getOffset(prop), choice);
+}
+
+inline EnumValue
+PropertyAliases::getPropertyEnum(const char* alias) const {
+ NameToEnum* n2e = (NameToEnum*) getPointer(nameToEnum_offset);
+ return n2e->getEnum(alias, *this);
+}
+
+inline const char*
+PropertyAliases::getPropertyValueName(EnumValue prop,
+ EnumValue value,
+ UPropertyNameChoice choice) const {
+ const ValueMap* vm = getValueMap(prop);
+ if (!vm) return NULL;
+ Offset a;
+ if (vm->enumToName_offset) {
+ a = ((EnumToOffset*) getPointer(vm->enumToName_offset))->
+ getOffset(value);
+ } else {
+ a = ((NonContiguousEnumToOffset*) getPointer(vm->ncEnumToName_offset))->
+ getOffset(value);
+ }
+ return chooseNameInGroup(a, choice);
+}
+
+inline EnumValue
+PropertyAliases::getPropertyValueEnum(EnumValue prop,
+ const char* alias) const {
+ const ValueMap* vm = getValueMap(prop);
+ if (!vm) return UCHAR_INVALID_CODE;
+ NameToEnum* n2e = (NameToEnum*) getPointer(vm->nameToEnum_offset);
+ return n2e->getEnum(alias, *this);
+}
+
+U_NAMESPACE_END
+
+//----------------------------------------------------------------------
+// UDataMemory structures
+
+static const PropertyAliases* PNAME = NULL;
+static UDataMemory* UDATA = NULL;
+
+//----------------------------------------------------------------------
+// UDataMemory loading/unloading
+
+/**
+ * udata callback to verify the zone data.
+ */
+U_CDECL_BEGIN
+static UBool U_CALLCONV
+isPNameAcceptable(void* /*context*/,
+ const char* /*type*/, const char* /*name*/,
+ const UDataInfo* info) {
+ return
+ info->size >= sizeof(UDataInfo) &&
+ info->isBigEndian == U_IS_BIG_ENDIAN &&
+ info->charsetFamily == U_CHARSET_FAMILY &&
+ info->dataFormat[0] == PNAME_SIG_0 &&
+ info->dataFormat[1] == PNAME_SIG_1 &&
+ info->dataFormat[2] == PNAME_SIG_2 &&
+ info->dataFormat[3] == PNAME_SIG_3 &&
+ info->formatVersion[0] == PNAME_FORMAT_VERSION;
+}
+
+static UBool U_CALLCONV pname_cleanup(void) {
+ if (UDATA) {
+ udata_close(UDATA);
+ UDATA = NULL;
+ }
+ PNAME = NULL;
+ return TRUE;
+}
+U_CDECL_END
+
+/**
+ * Load the property names data. Caller should check that data is
+ * not loaded BEFORE calling this function. Returns TRUE if the load
+ * succeeds.
+ */
+static UBool _load() {
+ UErrorCode ec = U_ZERO_ERROR;
+ UDataMemory* data =
+ udata_openChoice(0, PNAME_DATA_TYPE, PNAME_DATA_NAME,
+ isPNameAcceptable, 0, &ec);
+ if (U_SUCCESS(ec)) {
+ umtx_lock(NULL);
+ if (UDATA == NULL) {
+ UDATA = data;
+ PNAME = (const PropertyAliases*) udata_getMemory(UDATA);
+ ucln_common_registerCleanup(UCLN_COMMON_PNAME, pname_cleanup);
+ data = NULL;
+ }
+ umtx_unlock(NULL);
+ }
+ if (data) {
+ udata_close(data);
+ }
+ return PNAME!=NULL;
+}
+
+/**
+ * Inline function that expands to code that does a lazy load of the
+ * property names data. If the data is already loaded, avoids an
+ * unnecessary function call. If the data is not loaded, call _load()
+ * to load it, and return TRUE if the load succeeds.
+ */
+static inline UBool load() {
+ UBool f;
+ UMTX_CHECK(NULL, (PNAME!=NULL), f);
+ return f || _load();
+}
+
+//----------------------------------------------------------------------
+// Public API implementation
+
+// The C API is just a thin wrapper. Each function obtains a pointer
+// to the singleton Pro